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:
@ -4,7 +4,7 @@ import secrets
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
from calcul import DEFAULT_PLAGES
|
||||
from calcul import DEFAULT_PLAGES, DEFAULT_FACTEURS_ASTREINTE
|
||||
|
||||
DATA_DIR = Path("/data")
|
||||
CONFIG_FILE = DATA_DIR / "config.json"
|
||||
@ -24,6 +24,7 @@ DEFAULT_CONFIG = {
|
||||
"use_tls": True,
|
||||
},
|
||||
"plages": dict(DEFAULT_PLAGES),
|
||||
"astreinte_facteurs": list(DEFAULT_FACTEURS_ASTREINTE),
|
||||
}
|
||||
|
||||
# ── User path helpers ──────────────────────────────────────────────────────────
|
||||
@ -180,6 +181,15 @@ def toggle_astreinte(date: str, user_id: str = ""):
|
||||
save_astreintes(dates, user_id)
|
||||
|
||||
|
||||
def load_facteurs_astreinte() -> list[dict]:
|
||||
"""Règles globales de comptage des heures d'astreinte (type de jour × fenêtre
|
||||
horaire × facteur) ; défauts cohérents si absentes ou invalides dans la config."""
|
||||
facteurs = load_config().get("astreinte_facteurs")
|
||||
if facteurs and isinstance(facteurs, list) and all(isinstance(f, dict) for f in facteurs):
|
||||
return facteurs
|
||||
return DEFAULT_FACTEURS_ASTREINTE
|
||||
|
||||
|
||||
# ── Auth (email + password) ────────────────────────────────────────────────────
|
||||
|
||||
def _auth_file(user_id: str) -> Path:
|
||||
|
||||
Reference in New Issue
Block a user