Astreinte : une ligne en cours de saisie survit à l'auto-enregistrement

Un début sans fin (ou l'inverse) était effacé par la sauvegarde
automatique pendant la frappe. La ligne est désormais conservée,
réaffichée, et ignorée des calculs (décompte, repos) tant que la paire
n'est pas complète. Le bloc dépliant reste ouvert pendant tout le cycle
HTMX (restauration aussi après le settle).

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
This commit is contained in:
Jacquin Antoine
2026-09-10 16:47:43 +02:00
parent f6fef650a7
commit e95d1e2092
3 changed files with 93 additions and 2 deletions

View File

@ -873,14 +873,17 @@ def save_pointage(
p_by_date = {p["date"]: p for p in raw}
# Les événements d'astreinte ne sont affichés (donc postés) que les jours
# qualifiés (astreinte ou lendemain) ; ailleurs on conserve ceux déjà saisis
# au lieu de les écraser à vide. Les paires début/fin invalides sont ignorées.
# au lieu de les écraser à vide. Une ligne en cours de saisie (début sans
# fin, ou l'inverse) est conservée telle quelle : l'auto-enregistrement ne
# doit pas effacer une saisie à moitié tapée — les calculs (décompte, repos)
# ignorent les événements incomplets tant que la paire n'est pas complète.
if jour_astreinte_qualifie(date, set(load_astreintes_effectives(user_id))):
events = []
# Les descriptions sont optionnelles : sans elles (POST programmatique),
# zip s'arrêterait à la liste la plus courte et perdrait les événements.
for i, (deb, fin) in enumerate(zip(astreinte_debut, astreinte_fin)):
deb, fin = clean(deb), clean(fin)
if deb and fin:
if deb or fin:
desc = astreinte_desc[i] if i < len(astreinte_desc) else ""
events.append({"debut": deb, "fin": fin,
"desc": (desc or "").strip()[:200] or None})