From 436f923148f72e065ee16131c60f5fd6a4adb205 Mon Sep 17 00:00:00 2001 From: Antoine Date: Fri, 17 Jul 2026 23:21:55 +0200 Subject: [PATCH] =?UTF-8?q?Corrige=20le=20d=C3=A9compte=20des=20demi-journ?= =?UTF-8?q?=C3=A9es=20restantes=20et=20le=20rendu=20des=20champs=20horaire?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Une demi-journée passée non renseignée était exclue à tort du calcul de rattrapage (l'appli permet de saisir ses heures après coup, un jour passé vide n'est pas une perte définitive) : une semaine entièrement vide affichait "reste à faire ... sur 2 demi-journées" au lieu de 10. Corrige aussi le chevauchement de l'icône d'horloge sur les champs de la page Réglages (largeur trop juste pour le texte + l'icône native). --- app/calcul.py | 6 +++--- app/templates/settings.html | 18 +++++++++++++----- app/tests/test_calcul.py | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/app/calcul.py b/app/calcul.py index cfd680a..7777666 100644 --- a/app/calcul.py +++ b/app/calcul.py @@ -123,12 +123,12 @@ def compute_week(pointages: list[dict], conges: list[dict], heures_jour_min: int jour["cible_matin"] = None jour["cible_aprem"] = None - today = datetime.today().strftime("%Y-%m-%d") restant = total_du - total_travaille slots = [] # (jour, "matin"|"aprem", nominal_min) for jour in jours: - if jour["date"] < today: - continue # jour passé : impossible d'y rattraper quoi que ce soit + # Un jour passé non renseigné n'est pas exclu : cette appli permet de saisir + # ses heures après coup, donc une demi-journée vide reste "à faire" quelle + # que soit sa date. cg = jour["conge"] du = jour["du_min"] if du == 0: diff --git a/app/templates/settings.html b/app/templates/settings.html index 7c02396..fbfaa10 100644 --- a/app/templates/settings.html +++ b/app/templates/settings.html @@ -25,18 +25,18 @@
- + - +
- + - +
- +
@@ -167,5 +167,13 @@ .settings-range { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; } .settings-range-input { width: 70px; text-align: center; } .settings-range-sep { font-size: 12px; color: var(--muted); font-family: var(--mono); } +.time-range-input { + width: 128px; + text-align: left; + padding-right: .4rem; +} +.time-range-input::-webkit-calendar-picker-indicator { + margin-left: .5rem; +} {% endblock %} diff --git a/app/tests/test_calcul.py b/app/tests/test_calcul.py index da3ed76..6a231b7 100644 --- a/app/tests/test_calcul.py +++ b/app/tests/test_calcul.py @@ -115,6 +115,23 @@ def test_compute_week_cible_repartie_sur_seule_demi_journee_restante(freeze_toda assert vendredi["cible_aprem"] == "18:18" +def test_compute_week_semaine_totalement_vide_compte_les_10_demi_journees(freeze_today): + """Régression : une semaine entièrement vide (rien saisi, y compris les jours déjà + passés) doit compter 10 demi-journées restantes, pas seulement celles à partir + d'aujourd'hui. Cette appli permet de saisir ses heures après coup — un jour passé + non renseigné reste "à faire", il n'est pas un manque définitivement perdu.""" + dates = ["2026-07-13", "2026-07-14", "2026-07-15", "2026-07-16", "2026-07-17"] + pointages = [_pointage(d) for d in dates] + + result = compute_week(pointages, [], HEURES_JOUR_MIN) + assert result["slots_restants"] == 10 + assert result["reste_min"] == HEURES_JOUR_MIN * 5 + # Rien n'est encore en retard puisque rien n'a encore été renseigné : le rythme + # normal (à répartir librement sur les 10 demi-journées) suffit, pas de cible imposée. + assert result["extra_min"] == 0 + assert all(j["cible_matin"] is None and j["cible_aprem"] is None for j in result["jours"]) + + def test_compute_week_jour_futur_non_entame_recoit_une_cible_repartie(freeze_today): """Un jour futur non entamé fait maintenant partie de la répartition (spread sur la semaine).""" dates_completes = ["2026-07-13", "2026-07-14", "2026-07-15", "2026-07-16"]