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"]