Projette les cibles en temps réel et corrige le fuseau horaire

Calcule les heures travaillées et cibles d'entrée/sortie même quand une
demi-journée est en cours (pas encore de pointage de sortie), au lieu
d'attendre la fin de journée. Ajoute un endpoint /refresh pour
rafraîchir l'affichage sans repointer. Désambiguïse les libellés de
semaine sur plusieurs années et force TZ=Europe/Paris dans le conteneur.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Antoine
2026-07-16 14:12:03 +02:00
parent b6e0fcd925
commit 761a86986a
8 changed files with 400 additions and 24 deletions

View File

@ -5,6 +5,11 @@ from datetime import datetime, timedelta, date as _date
from models import load_week_pointages, load_conges, list_all_weeks, load_config
from calcul import hhmm_to_minutes, minutes_to_hhmm, heures_travaillees, heures_dues
MOIS_FR = [
"janvier", "février", "mars", "avril", "mai", "juin",
"juillet", "août", "septembre", "octobre", "novembre", "décembre",
]
def _week_dates(year: int, week: int) -> list[str]:
first = datetime.strptime(f"{year}-W{week:02d}-1", "%G-W%V-%u").date()
@ -134,13 +139,18 @@ def compute_all_stats(user_id: str = "") -> dict:
weekly_balances.append({
"year": year, "week": week,
"label": f"S{week:02d}",
"date": dates[0],
"delta_min": week_delta,
"delta": minutes_to_hhmm(week_delta),
"partial": week_has_incomplete,
})
# Suffix the label with a 2-digit year when weeks span more than one year,
# otherwise "S24" is ambiguous between e.g. 2024 and 2026.
spans_multiple_years = len({b["year"] for b in weekly_balances}) > 1
for b in weekly_balances:
b["label"] = f"S{b['week']:02d}'{b['year'] % 100:02d}" if spans_multiple_years else f"S{b['week']:02d}"
time_stats = {}
for slot, pairs in slot_pairs.items():
if len(pairs) < 2:
@ -182,7 +192,7 @@ def compute_all_stats(user_id: str = "") -> dict:
"comp_globale": comp_globale,
"comp_mois": comp_mois,
"comp_sem_n1": comp_sem_n1,
"mois_label": today.strftime("%B %Y"),
"mois_label": f"{MOIS_FR[today.month - 1].capitalize()} {today.year}",
"prev_week_label": f"S{prev_iso.week:02d} / {prev_iso.year}",
"today": today.strftime("%Y-%m-%d"),
}