La cible matin ne dépasse plus jamais matin_fin, garantissant la pause de
midi ; le nominal qui déborde bascule sur l'après-midi du même jour.
Ajoute deux réglages optionnels par utilisateur (arrivée visée le matin,
départ visé le soir) qui orientent la répartition du rattrapage en deux
passes : d'abord dans le cadre visé, puis au-delà si nécessaire.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Trois corrections sur les préconisations :
- Une demi-journée en cours (entrée pointée sans sortie, aujourd'hui) était
comptée deux fois — temps écoulé dans le travaillé ET nominal complet comme
capacité restante — ce qui faisait disparaître le rattrapage pendant la
journée et produisait des cibles en manque du temps déjà écoulé. Le temps
écoulé est réintégré au besoin planifié.
- La cible matin est plafonnée à la reprise de l'après-midi ; un créneau
saturé reporte son surplus sur les créneaux encore ouverts (waterfill)
au lieu d'afficher une sortie matin absurde.
- Une semaine entièrement pointée mais en déficit affiche désormais un
bandeau "Semaine terminée avec -X de manque" au lieu de rien.
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 <input type="time"> de la
page Réglages (largeur trop juste pour le texte + l'icône native).
Chaque compte a désormais son propre data/users/<user>/plages.json, réglable
depuis une nouvelle carte "Plages horaires" sur /settings (avec validation
HH:MM et ordre matin < aprem). Le calcul, les stats de conformité et les
avertissements de saisie lisent la config de l'utilisateur courant au lieu
du plages global. La valeur globale de data/config.json reste lue comme
valeur de repli tant qu'un utilisateur n'a rien personnalisé.
Documente le nouveau comportement (répartition sur les demi-journées restantes
plutôt que report en fin de journée) et la ligne "Reste à faire" du bandeau.
Au lieu de reporter tout le manque horaire sur la sortie du jour courant, le calcul
distribue désormais le retard à parts égales sur chaque demi-journée non traitée
(aujourd'hui et jours à venir), avec un plafond de sécurité si le rattrapage dépasse
minuit. La table affiche une cible par demi-journée (matin/après-midi) et le bandeau
de soldes indique le reste à faire et le nombre de demi-journées restantes.
classement, ajoute une suite de tests pytest
- calcul.py: matin_debut/fin, aprem_debut/fin et pause_dejeuner_fin sont
paramétrables via config.json > plages (moteur de calcul de l'heure de
sortie optimale inclus, pas seulement l'affichage). Défauts identiques
à l'ancien comportement, validé par la suite de tests.
- stats.py: les seuils de conformité utilisent la même config.
- main.py/templates: warn de saisie et suffixes de cible dynamiques.
- Rappels ntfy: serveur, topic et plage horaire (rappel_debut_h/fin_h)
configurables par utilisateur depuis /settings, plus en dur dans le code.
- Page classement supprimée (pas de compétition entre utilisateurs).
- Nouvelle suite pytest (app/tests/), à lancer via
`docker compose run --rm pointeuse pytest -v`.
réduit le score spam des emails, et rend le niveau de log configurable
- Les styles .login-* étaient définis uniquement dans login.html, donc
set_password.html s'affichait sans aucun style. Déplacé dans base.html.
- La nav affichait les liens même sans session active.
- mail.py ajoute Message-ID/Date et encode en quoted-printable (au lieu
de base64) pour réduire le score spam (MISSING_MID, MISSING_DATE,
MIME_BASE64_TEXT).
- log_level devient une directive de config.json plutôt qu'une variable
d'environnement.
- README: section démarrage rapide (copie de config.example.json,
compose.override.yml pour les surcharges locales).
Niveau configurable via LOG_LEVEL (défaut DEBUG). Les erreurs de config
JSON invalide remontent maintenant un message clair (fichier + position)
au lieu d'un JSONDecodeError brut.
Ajoute le bloc "smtp" (host, port, identifiants, TLS) dans config.json,
plus fiable et plus simple à opérer qu'une livraison directe au MX du
destinataire. data/config.json n'est plus versionné (secrets), remplacé
par data/config.example.json.
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>
- Auth cookie simple (SSO-ready) : login/logout, redirection si non authentifié
- Données isolées par utilisateur dans /data/users/{user_id}/
- Migration automatique des données legacy au premier login
- Page classement avec podium et tableau comparatif (score, précision zéro, conformité)
- Nav mise à jour : Classement, affichage utilisateur courant, déconnexion
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Nouvelle page /stats avec histogrammes de distribution par créneau
horaire (entrée/sortie matin et après-midi)
- Camemberts animés de conformité aux directives (≤09:00, ≥12:00,
≤14:00, ≥17:00) globale, par slot et par période (mois, sem. N-1)
- Onglets Tout / 1 an / 3 mois / 1 mois : filtrage côté client avec
recalcul μ, σ, n et conformité en temps réel
- Graphique des soldes hebdomadaires (barres animées, toutes semaines
sur l'axe X en rotation -45°, semaines partielles distinctes)
- Clic sur un graphique → modal plein écran avec axe X détaillé (15 min)
- Légende σ / n / directive / moyenne sur chaque histogramme
- Journées incomplètes exclues des stats ; heures dues retirées du solde
- Lien "Statistiques" dans la nav
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
data/config.json versionné pour qu'un clone fraîche soit directement
exploitable. Seuls data/pointages/ et data/conges.json restent ignorés.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Nouvelles colonnes : Δ sem. (solde cumulé semaine) et Fin cible (heure de
sortie aprem optimale pour 0h suppl. en fin de semaine)
- Δ sem. n'est affiché que quand la journée est complète et la chaîne de jours
ininterrompue (pas de saut de jour non saisi)
- Fin cible disparaît quand la journée est validée (passée/complète)
- Delta = "—" pour les jours non travaillés (futur ou congé jour)
- Indicateur warn (fond rouge) sur matin/aprem si horaires < minimum
(matin 09:00→12:00, aprem 14:00→17:00) ; mise à jour live via JS
- Suppression du solde global (3 cartes au lieu de 4)
- Tableau sans largeurs fixes + container 1100 px pour éviter scroll
horizontal sur écrans normaux ; touch-scroll conservé sur mobile
- Base reste 39h/semaine (7h48/jour)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
App web de suivi des heures de travail (FastAPI + HTMX + JSON plats).
- Saisie inline par semaine avec bouton ✓ par ligne
- Congés MA/AM/J avec coloration cellule et mise à jour live via OOB HTMX
- Import fichier ODS badgeuse
- Solde semaine et solde global recalculés à la volée
- Design "ledger" écru, DM Mono, zéro border-radius
- Déploiement Docker sur port 8000
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>