# Skill: Xử lý vấn đề chất lượng dữ liệu **Áp dụng các Rule:** R3.6, R3.7, R3.9, R3.10, R4.4 ## Tổng quan trạng thái hiện tại (snapshot 2026-06-17) | Vấn đề | Số lượng | Cách xử | |---|---|---| | `employee_name` rỗng trong attendance | 3223/3223 (100%) | JOIN với employees khi xuất (R3.7) | | `status = 'undefined'` | 3223/3223 | Sửa import script + re-sync raw status | | `employee_no` rỗng | 60 records | Flag suspicious, KHÔNG xoá | | Orphan `employee_no=68` | 7 records | Cập nhật employees từ device | | NV trong `employees` không có attendance | 41/76 | Verify có còn làm việc không | | Gap ngày Mon-Sat | 10 ngày (đa số lễ/Tết) | Verify, sync lại nếu cần | ## Quy trình xử lý ### 1. `employee_name` rỗng → JOIN khi đọc **KHÔNG** UPDATE attendance — vi phạm R3.2 (không sửa dữ liệu cũ). Thay vào đó: - Cập nhật `get_attendance()` trong `hikvision.py` để LEFT JOIN employees. - Power Query M-code cũng JOIN (xem `skills/excel_powerquery.md`). ### 2. `status = 'undefined'` → fix mapping CSV import đã ghi 'undefined' → cần sửa script import / mapping. - Mở `hikvision.py:237-238` xem `status_map` đúng key chưa. - Re-sync 1 ngày mới để verify status thực có lưu đúng. ### 3. Records thiếu `employee_no` (60 records) Đây là **dữ liệu hợp lệ từ thiết bị** — có thể là: - Quét không nhận (vân tay/khuôn mặt fail) → device vẫn log event nhưng không có employeeNo. - Người lạ thử quét. **Không xoá** (R3.2, R3.9). Thay vào đó: - Flag bằng query view: `WHERE employee_no = ''` → đưa vào báo cáo riêng. - Báo cáo định kỳ cho HR/Security. ### 4. NV không có attendance (41/76) Chạy: ```sql SELECT e.employee_no, e.name FROM employees e LEFT JOIN (SELECT DISTINCT employee_no FROM attendance) a USING(employee_no) WHERE a.employee_no IS NULL; ``` - Đối chiếu với HR: NV đã nghỉ → archive (KHÔNG xoá), thêm cột `active=0`. - NV còn làm mà không có attendance → kiểm tra thiết bị có nhận diện không. ### 5. Gap ngày Mon-Sat 10 ngày gap không phải CN: - 2025-09-01, 02 (Lễ Quốc khánh) - 2026-01-30 (Tết âm) - 2026-02-16 → 21 (Tết âm) - 2026-05-01 (Lễ Lao động) → Đúng ngày nghỉ Lễ. Nếu có gap mới phát sinh không phải lễ → re-sync. ## Phòng ngừa cho dữ liệu mới (kể từ giờ) - Sync trực tiếp từ device (qua `HikvisionDevice.fetch_day`) thay vì import CSV. - `fetch_day` đã map status đúng và lấy `name` thật → sẽ KHÔNG có 'undefined' hay name rỗng. - Audit_data.py chạy sau mỗi sync để alert sớm.