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
This commit is contained in:
Jacquin Antoine
2026-09-11 14:04:37 +02:00
parent c0ed99de9d
commit 45b450c1ca
5 changed files with 275 additions and 36 deletions

View File

@ -33,17 +33,33 @@ La semaine cible est **39h** (7h48 / jour). Les directives imposent des plages d
Ces horaires sont réglables par utilisateur depuis la page **Réglages** de l'app (voir
[Configuration](#configuration)).
Le matin n'est **jamais** touché : sa durée nominale est fixe, et si elle ne rentre pas
avant la pause déjeuner, le surplus est reporté sur l'après-midi du même jour. Quand un
écart hebdomadaire apparaît, il est **réparti uniquement sur les heures de départ du
soir** des demi-journées restantes (répartition égale, recalculée à chaque fois qu'un
départ atteint sa limite) :
- un **retard** repousse les départs — d'abord dans la marge de confort `depart_vise`,
puis au-delà si besoin (jusqu'à minuit) ;
- une **avance** avance les départs, mais jamais en dessous du minimum de présence de
l'après-midi.
Le moteur de préconisations vise un **solde à 0 en fin de semaine** : l'écart entre
heures dues et heures déjà travaillées (temps écoulé des demi-journées en cours déduit)
est réparti à parts égales sur les demi-journées restantes. Les règles, dans l'ordre :
Si le rythme normal suffit déjà à rentrer dans les clous, aucune préconisation n'est affichée.
1. **Créneaux** : chaque demi-journée non pointée (entrée + sortie) et non congéfiée
reste à planifier, y compris les jours passés — la saisie après coup est admise.
2. **Le matin n'est jamais ajusté** par l'écart hebdomadaire : arrivée à l'heure visée
(`arrivee_visee`, au plus tôt l'heure de retour après repos d'astreinte), sortie au
nominal plafonné à la pause de midi. Le nominal matin qui ne tient pas avant la
pause **bascule sur l'après-midi du même jour** (s'il est encore ouvert).
3. **Retard** — trois leviers en cascade : repousser les **départs du soir** (d'abord
dans la marge du départ visé `depart_vise`, puis jusqu'à minuit) ; sinon avancer
les **arrivées du matin** (jamais avant le début de présence matin) ; sinon avancer
les **retours de midi** (jamais avant la fin de présence matin, ni avant la sortie
du matin pointée, ni avant l'heure qu'il est).
4. **Avance** — cascade miroir : avancer les **départs du soir** (jamais sous la fin de
présence après-midi) ; sinon retarder les **arrivées du matin** (jamais après le
début de présence matin) ; sinon retarder les **retours de midi** (jamais après le
début de présence après-midi — la pause s'allonge d'autant).
5. **Journée en cours** : une demi-journée commencée (entrée pointée sans sortie) se
planifie depuis son heure d'entrée, son temps déjà écoulé est réintégré au plan ;
s'il atteint ou dépasse le nominal du créneau (**créneau saturé**, ex. sortie de
midi oubliée), la cible devient « sortir maintenant » et l'écart se reporte sur les
autres créneaux — jamais de double comptage du temps déjà fait.
6. Une entrée déjà pointée n'est jamais déplacée, et aucune cible du jour courant ne
recommande une heure déjà passée. Ce qui ne tient dans aucune plage reste visible
dans les compteurs « reste à faire » / avance.
---