Cada sección [zk.<nombre>] es un reloj. Los punches de todos los relojes
se agregan a un único payload compartido (all_new).
Cada sección [odoo.<nombre>] es una instancia destino. Con una sola instancia
se ejecuta en línea; con dos o más se usa ThreadPoolExecutor, un worker por
instancia.
La sección legacy [odoo] sin sufijo se lee con el nombre default.
Si un reloj falla al conectar, se registra el error y la corrida continúa
con los demás dispositivos.
Una excepción dentro de sync_to_odoo() se registra pero no aborta las
demás instancias: cada Odoo falla y reintenta de forma independiente.
Al arrancar: una corrida inmediata, luego BackgroundScheduler cada
interval_minutes.
El hilo principal bloquea en stop_event.wait(), sin consumir CPU.
Señales de parada: SIGINT (Ctrl+C), SIGTERM (kill) y SIGBREAK (lo envía
NSSM al detener el servicio en Windows). Todas ejecutan
scheduler.shutdown(wait=False) y liberan el hilo principal.