Muestra que dias se fichara y cuales no (festivo, vacaciones, override o
ausencia de Google Calendar), con el saldo acumulado al final.
Para los dias futuros no se inventa una hora exacta: el instante se sortea esa
madrugada y la costumbre deriva de un dia al siguiente, asi que se muestra el
RANGO en que caera cada fichaje, que si es exacto. Para hoy se muestra el plan
real con su estado.
De paso, nombres de dia en castellano en /hoy y /proximos: dependian del locale
del sistema y salian en ingles.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Pasa de un cron ciego a un servicio en segundo plano. El killswitch lo exige:
para poder cancelar un fichaje pendiente desde el movil tiene que haber un
proceso escuchando durante la espera.
- daemon: bucle propio que duerme exactamente hasta el siguiente evento, con
precision de decimas. No usa JobQueue de PTB porque APScheduler 3.6 importa
pkg_resources, que ya no existe en Python 3.13; ademas asi no se añade una
dependencia. Recupera fichajes perdidos si el equipo estuvo apagado.
- bot: /hoy /saldo /plan /fichar /desfichar /off /on /pausa /reanudar /log.
Los comandos se registran con setMyCommands para que salgan en el menu del
chat. Solo atiende al chat_id configurado.
- killswitch: aviso 12 min antes con teclado inline (cancelar / +15 min /
fichar ya).
- Google Calendar queda solo para ausencias personales; festivos y vacaciones
salen del calendario de Timenet.
- deploy/autoficher.service: unidad de usuario endurecida (ProtectSystem
strict, escritura solo en el propio directorio), Restart=always.
- requirements: python-telegram-bot >= 22. La 20.5 tiene un bug de __slots__
en Updater que rompe el polling en Python 3.13.
- .gitignore: data/, *.db, .env, __pycache__ en cualquier nivel.
tools/test_daemon.py cubre con reloj simulado y sin red: plan, aviso previo,
fichaje a su hora, killswitch, retraso de 15 min, pausa, recuperacion tras
apagon, fallo de red y dia no laborable. 19 comprobaciones.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>