Ajoute les astreintes : saisie de la fin de dernière activité, retour au bureau décalé de 11h de repos
Un nouveau bouton AS marque un jour d'astreinte. Ce jour et son lendemain,
une saisie « Fin activité » enregistre l'heure de fin de la dernière
intervention hors horaires (elle peut être le matin si la nuit a dépassé
minuit). L'app en déduit l'heure de retour au bureau (fin + 11h de repos
consécutif) et retire du décompte de la semaine toute la présence avant
cette heure : heures dues réduites, présence pointée avant le retour non
comptée, préconisations Fin cible démarrées à l'heure de retour sans
avertissement de retard, demi-journée entièrement en repos considérée
comme remplie. Les exports .ods gagnent les colonnes Astreinte et Retour,
et les stats n'ont plus les retards liés au repos.
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
This commit is contained in:
@ -146,6 +146,40 @@ def save_conges(conges: list[dict], user_id: str = ""):
|
||||
)
|
||||
|
||||
|
||||
# ── Astreintes ────────────────────────────────────────────────────────────────
|
||||
|
||||
def _astreintes_file(user_id: str) -> Path:
|
||||
return _user_root(user_id) / "astreintes.json"
|
||||
|
||||
|
||||
def load_astreintes(user_id: str = "") -> list[str]:
|
||||
"""Dates marquées comme jours d'astreinte (triées, dédupliquées)."""
|
||||
f = _astreintes_file(user_id)
|
||||
if not f.exists():
|
||||
return []
|
||||
try:
|
||||
dates = json.loads(f.read_text())
|
||||
except json.JSONDecodeError:
|
||||
return []
|
||||
return sorted(set(d for d in dates if isinstance(d, str)))
|
||||
|
||||
|
||||
def save_astreintes(dates: list[str], user_id: str = ""):
|
||||
_ensure_user_dirs(user_id)
|
||||
_astreintes_file(user_id).write_text(
|
||||
json.dumps(sorted(set(dates)), indent=2, ensure_ascii=False)
|
||||
)
|
||||
|
||||
|
||||
def toggle_astreinte(date: str, user_id: str = ""):
|
||||
dates = load_astreintes(user_id)
|
||||
if date in dates:
|
||||
dates.remove(date)
|
||||
else:
|
||||
dates.append(date)
|
||||
save_astreintes(dates, user_id)
|
||||
|
||||
|
||||
# ── Auth (email + password) ────────────────────────────────────────────────────
|
||||
|
||||
def _auth_file(user_id: str) -> Path:
|
||||
|
||||
Reference in New Issue
Block a user