# Skill: Đồng bộ dữ liệu AN TOÀN từ Hikvision **Áp dụng các Rule:** R1.* (tất cả), R7.1, R7.2, R8.1 ## Trước khi sync 1. **Kiểm tra giờ cao điểm (R1.11)** - 07:00-09:00 (đầu ca) và 17:00-19:00 (cuối ca) là giờ thiết bị bận quét realtime. - Sync trong các khung này có nguy cơ làm chậm hoặc lock thiết bị. - Nếu bắt buộc → user xác nhận, đồng bộ 1 ngày một lần, không sync khoảng lớn. 2. **Backup DB (R8.1)** ``` python -c "import shutil,os,time; shutil.copy('data/attendance.db', f'data/backups/attendance_{time.strftime(\"%Y%m%d_%H%M\")}.db')" ``` 3. **Kiểm tra lock trước sync (R1.4)** - Code đã tự gọi `test_connection()` đầu mỗi sync (`hikvision.py:266`). - Nếu trả về `LOCKED Ns` → **DỪNG**. KHÔNG retry tự động. ## Trong khi sync - Code tự enforce 18 POST/session, cooldown 9s (R1.1, R1.2). - Theo dõi log realtime: ``` Get-Content -Wait logs/app.log ``` - Nếu thấy `[RULE R1.5] Got 401` → thiết bị bắt đầu lock → dừng ngay, **không** chạy lại. ## Sau khi sync 1. Kiểm tra `sync_log` table: phải có 1 dòng `status='ok'` mới. 2. So sánh `records_added` với expected: - 1 ngày bình thường: 5-50 records (tuỳ NV). - Nếu 0 và không phải Chủ Nhật → kiểm tra audit_data.py. 3. Verify số sessions dùng: - 1 ngày → 1-2 sessions. - 7 ngày → ≤ 5 sessions. - Nếu nhiều hơn → có vấn đề performance. ## Khoảng sync > 7 ngày (R7.1) - Xác nhận với user trước khi chạy. - Chạy theo từng tuần, KHÔNG nhồi 1 lần 30 ngày. - Pseudo-code: ```python for start in date_chunks(date_from, date_to, weeks=1): end = start + 6 days sync_date_range(start, end) time.sleep(60) # cool-down giữa các tuần (R1.8) ``` ## Cấm tuyệt đối - Bypass `_safe_post()` của `HikvisionDevice`. - Chạy nhiều process sync song song (R7.2 — file lock `data/.sync.lock`). - Sửa `MAX_POSTS_PER_SESSION = 18` thành số lớn hơn. - Xoá session_count để "reset" — không giải quyết lock. - Retry tự động khi đã nhận 401 (R1.5).