Commit Graph

12 Commits

Author SHA1 Message Date
45b450c1ca Préconisations d'horaire : cascade d'avance et correctif de double comptage
Une avance que les départs du soir ne peuvent pas écouler (plancher de
présence) s'écoule désormais en cascade miroir du rattrapage : arrivées
du matin retardées, puis retours de midi, toujours bornés par les plages
de présence.

Une demi-journée en cours qui dépasse son nominal (ex. sortie de midi
oubliée) comptait son temps écoulé deux fois : suivre les cibles
sur-livrait jusqu'à 1h45 par semaine. Le créneau saturé propose
maintenant « sortir maintenant » et l'écart se reporte sur les autres
créneaux ; plus de retard fantôme affiché.

Le README liste désormais l'ensemble des règles de préconisation.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-11 14:04:37 +02:00
c0ed99de9d Rattrapage hebdomadaire : arrivées et retours de midi en secours des départs
Pour tenir les heures de la semaine, les préconisations n'ajustaient que
les départs du soir : un retard trop gros était déclaré rattrapage
impossible dès minuit atteint. Deux leviers s'enchaînent désormais :
avancer les arrivées du matin (jamais avant le début de la présence
matin, le retour de repos, ni l'heure actuelle), puis les retours de midi
(jamais avant la fin de la présence matin, ou la sortie réelle du matin).
Les entrées déjà pointées restent intactes ; l'aide des Réglages
documente la cascade.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-10 17:18:54 +02:00
3162968bfb Empêche la cible de proposer un départ déjà passé quand la semaine est en avance
La répartition de l'avance sur les départs du soir ne vérifiait que le
plancher aprem_fin, pas l'heure actuelle : sur une demi-journée en cours,
elle pouvait recommander de partir à une heure déjà écoulée.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 17:22:41 +02:00
205d14416a Merge remote-tracking branch 'origin/main'
# Conflicts:
#	app/calcul.py
2026-08-06 17:18:00 +02:00
b9a75fffea Répartit avance/retard sur les départs du soir, plus jamais sur le matin
Le rattrapage hebdomadaire ne portait que sur le retard et pouvait
s'étaler sur le matin quand il avait de la marge. Objectif demandé :
pouvoir planifier les horaires à l'avance pour arriver à 0 en fin de
semaine, en ajustant uniquement les heures de départ du soir - dans
un sens (retard) comme dans l'autre (avance, plafonnée par aprem_fin).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 17:12:33 +02:00
ef30820c39 Propose systématiquement les horaires du matin et de l'après-midi
La colonne Cible affichait un horaire seulement pour les demi-journées
avec du rattrapage à faire ; les demi-journées au rythme normal
n'affichaient rien. Désormais chaque demi-journée restante (matin et
après-midi) propose sa plage entrée → sortie, qu'il y ait du retard ou
non, pour donner un planning complet à l'utilisateur.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-07-19 23:37:17 +02:00
27bcd7a0b4 Affiche l'heure d'arrivée en plus du départ dans les préconisations
La colonne "Cible" (anciennement "Fin cible") montre désormais une plage
complète entrée → sortie pour chaque demi-journée à rattraper, au lieu
d'une heure de départ seule. Moins ambigu pour l'utilisateur qui sait
aussi quand arriver.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-07-19 23:25:16 +02:00
d3c991f8d6 Respecte la pause déjeuner dans les préconisations et ajoute les heures visées
La cible matin ne dépasse plus jamais matin_fin, garantissant la pause de
midi ; le nominal qui déborde bascule sur l'après-midi du même jour.
Ajoute deux réglages optionnels par utilisateur (arrivée visée le matin,
départ visé le soir) qui orientent la répartition du rattrapage en deux
passes : d'abord dans le cadre visé, puis au-delà si nécessaire.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 11:57:46 +02:00
12666e73f4 Corrige le double comptage des demi-journées en cours et plafonne les cibles matin
Trois corrections sur les préconisations :
- Une demi-journée en cours (entrée pointée sans sortie, aujourd'hui) était
  comptée deux fois — temps écoulé dans le travaillé ET nominal complet comme
  capacité restante — ce qui faisait disparaître le rattrapage pendant la
  journée et produisait des cibles en manque du temps déjà écoulé. Le temps
  écoulé est réintégré au besoin planifié.
- La cible matin est plafonnée à la reprise de l'après-midi ; un créneau
  saturé reporte son surplus sur les créneaux encore ouverts (waterfill)
  au lieu d'afficher une sortie matin absurde.
- Une semaine entièrement pointée mais en déficit affiche désormais un
  bandeau "Semaine terminée avec -X de manque" au lieu de rien.
2026-07-17 23:33:01 +02:00
436f923148 Corrige le décompte des demi-journées restantes et le rendu des champs horaires
Une demi-journée passée non renseignée était exclue à tort du calcul de
rattrapage (l'appli permet de saisir ses heures après coup, un jour passé
vide n'est pas une perte définitive) : une semaine entièrement vide affichait
"reste à faire ... sur 2 demi-journées" au lieu de 10. Corrige aussi le
chevauchement de l'icône d'horloge sur les champs <input type="time"> de la
page Réglages (largeur trop juste pour le texte + l'icône native).
2026-07-17 23:21:55 +02:00
e6b5173018 Répartit les préconisations de rattrapage sur les demi-journées restantes de la semaine
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.
2026-07-17 23:02:07 +02:00
c2d7d0e3ac Rend les plages horaires et les rappels ntfy configurables, supprime le
classement, ajoute une suite de tests pytest

- calcul.py: matin_debut/fin, aprem_debut/fin et pause_dejeuner_fin sont
  paramétrables via config.json > plages (moteur de calcul de l'heure de
  sortie optimale inclus, pas seulement l'affichage). Défauts identiques
  à l'ancien comportement, validé par la suite de tests.
- stats.py: les seuils de conformité utilisent la même config.
- main.py/templates: warn de saisie et suffixes de cible dynamiques.
- Rappels ntfy: serveur, topic et plage horaire (rappel_debut_h/fin_h)
  configurables par utilisateur depuis /settings, plus en dur dans le code.
- Page classement supprimée (pas de compétition entre utilisateurs).
- Nouvelle suite pytest (app/tests/), à lancer via
  `docker compose run --rm pointeuse pytest -v`.
2026-07-17 22:40:55 +02:00