Au lieu de reporter tout le manque horaire sur la sortie du jour courant, le calcul distribue désormais le retard à parts égales sur chaque demi-journée non traitée (aujourd'hui et jours à venir), avec un plafond de sécurité si le rattrapage dépasse minuit. La table affiche une cible par demi-journée (matin/après-midi) et le bandeau de soldes indique le reste à faire et le nombre de demi-journées restantes.
pointeuse-optimisator
Saisie des horaires de travail avec calcul en temps réel de l'heure de sortie optimale pour finir la semaine à exactement 0h d'heures supplémentaires.
Démarrage rapide
Avant le premier lancement, copie et adapte le fichier de config (voir Configuration plus bas) :
cp data/config.example.json data/config.json
Pour surcharger compose.yml localement (ports, variables d'env, volumes...) sans
modifier le fichier versionné, crée un compose.override.yml — il est chargé
automatiquement par docker compose et déjà ignoré par git.
Principe
La semaine cible est 39h (7h48 / jour). Les directives imposent des plages de présence minimum :
| Demi-journée | Plage minimale |
|---|---|
| Matin | 09:00 → 12:00 |
| Après-midi | 14:00 → 17:00 |
Ces horaires sont configurables (voir Configuration).
L'outil calcule — sans arrondi — l'heure précise à laquelle partir chaque jour pour que le total de la semaine tombe pile sur 39h00.
Ce que tu vois dans le tableau
| Colonne | Ce qu'elle dit |
|---|---|
| Travaillé | Heures effectivement saisies ce jour |
| Δ jour | Écart par rapport aux 7h48 dus (affiché dès qu'une heure est enregistrée) |
| Δ sem. | Solde cumulé depuis lundi — visible uniquement quand la journée est complète et sans jour manquant |
| Fin cible | L'heure de sortie aprem pour finir la semaine à 0h sup |
Les plages qui ne respectent pas les minimums sont signalées en rouge dès la saisie.
Lancement
docker compose up -d
Ouvre http://localhost:8000.
Les données (pointages, congés, comptes) sont stockées dans data/ et ignorées par git.
Seul data/config.example.json est versionné.
Configuration
data/config.json (voir data/config.example.json) :
{
"heures_jour": 7.8,
"log_level": "DEBUG",
"allowed_email_domain": "exemple.fr",
"mail_from": "no-reply@exemple.fr",
"smtp": {
"host": "smtp.exemple.fr",
"port": 587,
"user": "no-reply@exemple.fr",
"password": "change-moi",
"use_tls": true
},
"plages": {
"matin_debut": "09:00",
"matin_fin": "12:00",
"aprem_debut": "14:00",
"aprem_fin": "17:00",
"pause_dejeuner_fin": "13:30"
}
}
heures_jour—7.8= 7h48 = 39h ÷ 5 jours. Modifier cette valeur recentre tous les calculs.log_level—DEBUG,INFO,WARNINGouERROR. Contrôle la verbosité des logs (docker logs).allowed_email_domain— seules les adresses de ce domaine peuvent se connecter.mail_from— adresse expéditrice des emails de connexion.smtp— serveur relais utilisé pour l'envoi (host, port, identifiants, TLS).plages— bornes de présence obligatoire matin/après-midi (voir Principe) et heure de reprise par défaut de l'après-midi (pause_dejeuner_fin) tant que l'entrée aprem n'est pas encore saisie. Modifier ces valeurs change à la fois les avertissements de saisie, les stats de conformité et le calcul de l'heure de sortie optimale.
Les rappels ntfy (topic, serveur, plage horaire) se règlent par utilisateur depuis la page Réglages de l'app,
pas dans config.json.
Tests
docker compose run --rm pointeuse pytest -v
Congés
Trois boutons par ligne : MA (matin), AM (après-midi), J (journée entière).
Ils réduisent les heures dues et recalculent la Fin cible pour les jours restants.
Stack
FastAPI · HTMX · Jinja2 · fichiers JSON · Docker
