Saltar a contenido

Control de Asistencia (ZKTeco F22 → Odoo)

Servicio que sincroniza las marcaciones del reloj biométrico ZKTeco F22 hacia el modelo hr.attendance de Odoo.

Campo Valor
Propósito Empujar las marcaciones de entrada/salida del reloj biométrico a Odoo, sin captura manual.
Tipo Oficina
Repo bavilasx/sync-f22
Stack Python 3.10+ · pyzk · APScheduler · XML-RPC
Ejecución Servicio de Windows (NSSM) en la PC de oficina con acceso a la red del reloj
Programación Cada interval_minutes (default 5 min)
Hardware ZKTeco F22 en LAN, puerto TCP 4370
Entornos y URLs Sin URL propia. El destino lo define cada sección [odoo.<n>] de config.ini
Owner / líder técnico por definir
Integra con Odoo (modelo zk.attendance.import), reloj ZKTeco F22
Estado Activo

Visión general

El servicio corre en segundo plano y, cada N minutos, descarga las marcaciones del día desde uno o varios relojes ZKTeco, determina la entrada y la salida de cada empleado y las envía por XML-RPC a una o varias instancias de Odoo en paralelo.

Cada corrida descarga desde la medianoche del día actual, no desde el watermark. Así se recalcula la jornada con el cuadro completo del día, porque la entrada y la salida normalmente llegan en corridas distintas. El watermark solo se conserva como registro del último punch procesado.

Para que un empleado sea reconocido, su ficha en hr.employee debe tener el campo zk_user_id poblado.

Contenido de esta sección

Nuances / notas

  • La fuente de verdad es el código. El README.md del repo describe un pipeline anterior (split_into_sessions, dedupe_seconds, session_gap_min) que ya no existe en sync.py. La lógica vigente es group_by_day() con exit_hour, documentada en Reglas de negocio.
  • El repo vive en una cuenta personal (bavilasx), no en la organización Legalys-Panama. Conviene migrarlo.
  • Toda la configuración se lee al arrancar: cambiar config.ini exige reiniciar el servicio.
  • El reloj no tiene IP fija. Al reiniciarse toma otra IP por DHCP y el servicio pierde la conexión hasta que se corrige a mano. La reserva DHCP está pendiente — ver Troubleshooting.