Décompte les heures d'astreinte par tranches de 15 min dans des compteurs pondérés séparés

La saisie astreinte devient une liste d'événements (début, fin, description,
nombre illimité, fin antérieure au début = intervention à cheval sur minuit).
Ces heures ne comptent jamais dans la semaine : elles sont décomptées à part
par pas de 15 minutes, toute tranche entamée comptant en totalité, et rangées
dans des compteurs selon le jour et l'heure (Nuit ×1,5, Journée semaine ×1,
Samedi ×1,5, Dimanche/férié ×2 ; jours fériés français calculés
automatiquement, règles ajustables dans config.json via astreinte_facteurs).
Le détail par événement et les totaux pondérés s'affichent sous le bandeau de
la semaine, et les exports .ods gagnent les colonnes Astreinte brute et
pondérée. Le retour au bureau (fin du dernier événement + 11h de repos) est
désormais dérivé des événements.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
This commit is contained in:
Jacquin Antoine
2026-09-08 22:26:47 +02:00
parent 065d73e15c
commit c208a17eec
11 changed files with 695 additions and 118 deletions

View File

@ -182,17 +182,15 @@ demi-journées restantes.
## Astreinte & repos de 11h
Le bouton **AS** marque un jour d'astreinte. Ce jour et son lendemain (la nuit qui
suit), une ligne de saisie supplémentaire apparaît sous l'après-midi :
suit), une liste d'événements apparaît sous l'après-midi : autant de lignes que
nécessaire (**+ intervention**), chacune avec un **début**, une **fin** et une
description libre. Une fin antérieure au début (fin < début) désigne une
intervention à cheval sur minuit.
- **Fin activité** : l'heure de fin de la **dernière activité** hors horaires de
travail. Elle peut tomber le matin (intervention ayant dépassé minuit) : saisie
sur le jour d'astreinte, une fin matinale (ex: 06:00) désigne la fin de sa nuit ;
saisie sur le lendemain, une fin matinale désigne la nuit de la veille.
L'app en déduit l'heure de retour au bureau : **fin + 11h de repos consécutif**
(exigées par période de 24h), affichée sous le champ (« retour ≥ 13:00 »). Fin
23:30 → retour 10:30 le lendemain ; fin 02:00 → retour 13:00 ; fin 06:00 → retour
17:00. Un repos qui se termine avant l'ouverture ne contraint rien.
L'app en déduit l'heure de retour au bureau : **fin du dernier événement + 11h de
repos consécutif** (exigées par période de 24h), affichée sous la liste (« retour
≥ 13:00 »). Fin 23:30 → retour 10:30 le lendemain ; fin 02:00 → retour 13:00 le
jour même. Un repos qui se termine avant l'ouverture ne contraint rien.
À partir de cette heure de retour, tout ce qui la précède sur la journée quitte le
décompte de la semaine :
@ -204,9 +202,25 @@ décompte de la semaine :
décalée d'autant, sans avertissement de retard) ;
- une demi-journée entièrement couverte par le repos est considérée comme remplie.
La fin d'activité ne s'applique que les jours qualifiés (astreinte ou lendemain) :
partout ailleurs elle est ignorée. Les colonnes **Astreinte** (fin saisie) et
**Retour** (calculé) apparaissent dans les exports `.ods`.
Les heures d'astreinte ne comptent **jamais** dans les heures de semaine : elles
sont décomptées à part, par pas de 15 minutes (toute tranche entamée compte en
totalité), dans des compteurs pondérés selon le jour et l'heure. Sous le bandeau
de la semaine s'affiche le détail par événement, les totaux par compteur et le
total pondéré.
Par défaut : **Nuit** (20:00→08:00, tous types de jours) ×1,5 ; **Journée** (semaine
Lun-Ven, 08:00→20:00) ×1 ; **Samedi** (08:00→20:00) ×1,5 ; **Dimanche / férié**
(08:00→20:00) ×2. Les jours fériés français (fixes + Pâques, Ascension, Pentecôte)
sont calculés automatiquement.
Ces règles sont ajustables dans `data/config.json`, clé `astreinte_facteurs` :
chaque règle porte un `nom`, les `jours` concernés (`semaine`, `sam`, `dim`,
`ferie`), un `debut`, une `fin` et un `facteur`. Une tranche qui ne correspond à
aucune règle est rangée dans « Autre » avec un facteur ×1.
Les événements ne s'appliquent que les jours qualifiés (astreinte ou lendemain) :
partout ailleurs ils sont ignorés. Les colonnes **Astreinte** (brut), **Astreinte
pondérée** et **Retour** (calculé) apparaissent dans les exports `.ods`.
---