# Skill: Quy trình Audit định kỳ **Áp dụng các Rule:** R4.4, R4.6 Dự án có **2 loại audit** — phải chạy cả hai. ## 1. Audit CODE (`audit.py`) Kiểm tra code có tuân thủ rule không. ``` python audit.py ``` - Output: `logs/audit_.txt` - Pass criteria: 100% PASS. Nếu có FAIL → sửa code trước khi deploy. ## 2. Audit DỮ LIỆU (`audit_data.py`) Kiểm tra DB có dữ liệu bất thường không. **Quan trọng — bị bỏ sót ở phiên bản trước.** ``` python audit_data.py ``` Sẽ kiểm tra: - Gap ngày (so với Mon-Sat; CN nghỉ bỏ qua) - Records thiếu `employee_no` / `employee_name` - Orphan `employee_no` (có trong attendance, không có trong employees) - NV không bao giờ xuất hiện trong attendance (có thể đã nghỉ hoặc data mất) - Records có `status = 'undefined'` (lỗi mapping) - Ngày Mon-Sat có < 3 records (suspicious) - Sync log gần đây có lỗi không Output: `logs/data_audit_.txt` ## Tần suất | Audit | Tần suất | Khi nào bắt buộc | |---|---|---| | Code | Mỗi commit | Trước mỗi PR / merge | | Data | Hằng ngày 23:00 | Sau mỗi sync khoảng lớn | ## Tự động Tạo Windows Task Scheduler: - Trigger: Daily 23:00 - Action: `python D:\Du_an_Cham_cong\audit_data.py` - Output → `logs/data_audit_*.txt` ## Hành động khi FAIL | FAIL | Nguyên nhân khả dĩ | Hành động | |---|---|---| | Gap ngày Mon-Sat | Sync bị bỏ qua / thiết bị off | Re-sync ngày đó (Skill sync_safely) | | employee_name rỗng > 0 | JOIN bị thiếu khi xuất | Sửa export, áp R3.7 | | Orphan employee_no | NV bị xoá khỏi thiết bị | Cập nhật bảng employees từ device | | `status='undefined'` | Mapping CSV import lỗi | Sửa import script, áp R3.6 | | Sync log 'error' liên tiếp | Thiết bị lock / mạng | Skill incident_lock |