Về trang chủ

Tài liệu Kỹ thuật

Hệ thống Chấm công - Các trường hợp xử lý

Hệ thống Chấm công - Tài liệu Kỹ thuật


Tổng quan


Hệ thống xử lý file Excel chấm công và tạo báo cáo chi tiết với nhiều trường hợp xử lý phức tạp.

Các trường hợp xử lý khi tạo báo cáo


1. XỬ LÝ ĐI TRỄ (LATE ARRIVALS)


1.1 Trễ dưới 20 phút


1.2 Trễ trên 20 phút


1.3 Trễ quá 2 tiếng


2. XỬ LÝ TĂNG CA (OVERTIME)


2.1 Tăng ca buổi sáng


2.2 Tăng ca buổi chiều


2.3 Ngưỡng ra sớm


2.4 Trừ thời gian trễ khỏi tăng ca ⭐


3. XỬ LÝ NGHỈ PHÉP (DAYS OFF)


3.1 Nghỉ hoàn toàn


3.2 Nửa ngày


3.3 Đi trễ quá 2 tiếng


4. XỬ LÝ CHỦ NHẬT (SUNDAY LOGIC)


4.1 Logic phân ca chủ nhật



  $weeksDiff = floor($daysDiff / 7);
$shouldBeStartTeam = ($weeksDiff % 2 === 0);

4.2 Nghỉ chủ nhật khi phải làm



  • Điều kiện: Phải làm nhưng không có check-in/check-out
  • Xử lý: sundayOff = true, tăng sundayOffDays
  • Hiển thị: "Nghỉ CN" (màu đỏ)
  • Ghi chú: Không tính vào ngày nghỉ thường

4.3 Làm chủ nhật khi không phải lịch



  • Điều kiện: Không phải làm nhưng có check-in/check-out
  • Xử lý: sundayWork = true, tăng sundayWorkDays
  • Hiển thị: "Làm CN" (màu xanh)

5. XỬ LÝ THỜI GIAN LÀM VIỆC


5.1 Giờ làm việc chuẩn



  • Vào: 6:00
  • Ra: 18:00
  • Ngưỡng ra sớm: 15:00

5.2 Các trường hợp đặc biệt



  • Ra trước 15:00: Nửa ngày
  • Ra 15:00-18:00: Đủ giờ (không tăng ca, không trừ)
  • Ra sau 18:00: Tăng ca

6. XỬ LÝ HIỂN THỊ BÁO CÁO


6.1 Tổng hợp thống kê



  • Tổng tăng ca: Hiển thị giờ/phút thông minh
  • Trễ < 20 phút: Số lần
  • Trễ > 20 phút: Số lần
  • Ngày nghỉ: Số ngày (bao gồm nửa ngày)
  • Nghỉ chủ nhật: Số ngày trốn ca
  • Làm chủ nhật: Số ngày làm thêm

6.2 Chi tiết từng ngày



  • Giờ vào/ra: Hiển thị chính xác
  • Trạng thái: Trễ, tăng ca, nghỉ, chủ nhật
  • Màu sắc: Phân biệt các trạng thái
  • Chủ nhật: Highlight đặc biệt

7. CÁC TRƯỜNG HỢP ĐẶC BIỆT


7.1 Xử lý dữ liệu không đầy đủ



  • Thiếu cả vào/ra: Nghỉ hoàn toàn
  • Thiếu 1 trong 2: Nửa ngày
  • Vẫn tính tăng ca: Nếu có dữ liệu thời gian

7.2 Xử lý ngày tháng



  • Tự động trích xuất: Từ file Excel
  • Fallback: Tháng hiện tại nếu không trích xuất được
  • Hỗ trợ format: DD/MM/YYYY, YYYY-MM-DD, tháng/năm

7.3 Xử lý team



  • Phân chia: Theo file phân ca
  • Logic xen kẽ: Chủ nhật theo team
  • Hiển thị: Badge team trên báo cáo

TỔNG KẾT TÍNH LƯƠNG



Dựa trên dữ liệu chấm công, hệ thống tính toán các chỉ số sau để phục vụ tính lương:

Bảng tổng hợp các chỉ số



Chỉ sốĐơn vịCách tínhGhi chú
Tăng caphútVào trước 6:00 + Ra sau 18:00, trừ thời gian trễovertime – dùng nhân với hệ số tăng ca
Trễ dưới 20 phútlầnTrễ 4–20 phút so với 6:00lateUnder20 – có thể trừ phạt nhẹ
Trễ trên 20 phútlầnTrễ > 20 phút so với 6:00lateOver20 – có thể trừ phạt nặng hơn
Ngày nghỉngàyNghỉ full = 1, Nửa ngày = 0.5daysOff – trừ vào lương theo quy định
Nghỉ chủ nhậtngàyPhải làm CN nhưng không làmsundayOffDays – trốn ca, xử lý riêng
Làm chủ nhậtngàyKhông phải lịch nhưng vẫn làmsundayWorkDays – có thể tính thêm lương

Công thức tham khảo tính lương


Lương thực lĩnh = Lương cơ bản
+ (Tăng ca phút / 60 × Hệ số tăng ca × Đơn giá giờ)
- (Trễ dưới 20 × Phạt 1 lần)
- (Trễ trên 20 × Phạt 1 lần)
- (Ngày nghỉ × Lương 1 ngày)
- (Nghỉ CN × Phạt trốn ca)
+ (Làm CN × Hệ số CN × Đơn giá)


*Lưu ý: Hệ số, đơn giá và quy định phạt cần áp dụng theo nội quy công ty.*

Giờ làm việc chuẩn (tham chiếu)





---

Cấu trúc dữ liệu


Employee Object


[
'name' => 'Tên nhân viên',
'team' => 'team1|team2|null',
'overtime' => 120, // phút
'lateUnder20' => 3, // số lần
'lateOver20' => 1, // số lần
'daysOff' => 2.5, // số ngày
'sundayOffDays' => 1, // số ngày
'sundayWorkDays' => 2, // số ngày
'notes' => 'Ghi chú chi tiết',
'details' => [...] // chi tiết từng ngày
]

Day Detail Object


[
'date' => '15/06/2024',
'lateUnder20' => 15, // phút trễ
'lateOver20' => 0,
'overtime' => 60, // phút tăng ca
'off' => 'full|half|', // trạng thái nghỉ
'checkIn' => '06:15',
'checkOut' => '17:30',
'isSunday' => false,
'sundayOff' => false,
'sundayWork' => false
]

Các hàm quan trọng


processData($filePath, $teamFilePath, $startTeam)


generateReport($data)


getSundayTeam($date, $team1, $team2, $startTeam, $firstDataDate)


parseTime($timeStr)


Lưu ý quan trọng



1. Trừ thời gian trễ khỏi tăng ca: Đây là logic quan trọng để tránh tính trùng
2. Logic chủ nhật: Phức tạp, cần hiểu rõ team và tuần
3. Xử lý dữ liệu thiếu: Linh hoạt, vẫn tính được tăng ca
4. Hiển thị thông minh: Tự động ẩn giá trị 0, format giờ/phút
5. Bảo mật: Validate file Excel, CSRF protection, sanitize filename

Cài đặt và sử dụng



1. Upload file chấm công (Excel)
2. Upload file phân ca (Excel)
3. Chọn team bắt đầu
4. Xem báo cáo chi tiết
5. In hoặc xuất PDF

Công nghệ sử dụng