""" Kiem tra so NV ENROLL THUC TE tren thiet bi Hikvision. So sanh voi bang employees trong DB. Chay: python check_device_employees.py CHU Y: - Lenh nay goi /UserInfo/Search len device -> ton 2-5 POST (tuy so NV). - Tuan thu R1: KHONG sync lien tuc, doi xong moi chay tiep. """ import os, sys, io, sqlite3 try: sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') except Exception: pass sys.path.insert(0, os.path.dirname(__file__)) from hikvision import HikvisionDevice, DB_PATH def main(): print('=' * 60) print('CHECK: So NV thuc te tren thiet bi vs. bang employees trong DB') print('=' * 60) dev = HikvisionDevice() ok, msg = dev.test_connection() if not ok: print(f'[!] Khong ket noi duoc: {msg}') return 1 print(f'[+] Connected: {msg}') print('\n[1/2] Fetch employee list tu device...') dev_emps = dev.fetch_employees() if dev_emps is None: print('[!] Fetch fail') return 1 print(f' Device: {len(dev_emps)} NV') print('\n[2/2] So sanh voi DB...') conn = sqlite3.connect(DB_PATH) c = conn.cursor() c.execute('SELECT employee_no, name FROM employees') db_emps = {r[0]: r[1] for r in c.fetchall()} c.execute('SELECT DISTINCT employee_no FROM attendance WHERE employee_no != ""') db_active = {r[0] for r in c.fetchall()} conn.close() dev_set = {e['employee_no'] for e in dev_emps} db_set = set(db_emps.keys()) print(f' DB.employees: {len(db_set)} NV') print(f' DB.attendance (distinct): {len(db_active)} NV') in_dev_not_db = dev_set - db_set in_db_not_dev = db_set - dev_set have_emp_not_attend = dev_set & db_set - db_active print('\n=== KET QUA ===') print(f'NV tren device NHUNG khong co trong DB.employees: {len(in_dev_not_db)}') for eno in sorted(in_dev_not_db, key=lambda x: int(x) if x.isdigit() else 9999): name = next((e['name'] for e in dev_emps if e['employee_no']==eno), '') print(f' + {eno!r:6s} {name}') print(f'\nNV trong DB.employees NHUNG khong co tren device: {len(in_db_not_dev)}') for eno in sorted(in_db_not_dev, key=lambda x: int(x) if x.isdigit() else 9999): print(f' - {eno!r:6s} {db_emps[eno]!r}') print(f'\nNV co tren ca 2 NHUNG chua quet lan nao (attendance rong): {len(have_emp_not_attend)}') for eno in sorted(have_emp_not_attend, key=lambda x: int(x) if x.isdigit() else 9999): print(f' ? {eno!r:6s} {db_emps[eno]!r}') print() print(f'Sessions used: {dev.session_count}, POSTs: {dev.total_posts}') return 0 if __name__ == '__main__': sys.exit(main())