Antoine 0b47e4a625 Corrige le rendu de la page mot de passe, masque la nav si non connecté,
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).
2026-07-17 22:16:48 +02:00

pointeuse-optimisator

Saisie des horaires de travail avec calcul en temps réel de l'heure de sortie optimale pour finir la semaine à exactement 0h d'heures supplémentaires.

Interface principale


Démarrage rapide

Avant le premier lancement, copie et adapte le fichier de config (voir Configuration plus bas) :

cp data/config.example.json data/config.json

Pour surcharger compose.yml localement (ports, variables d'env, volumes...) sans modifier le fichier versionné, crée un compose.override.yml — il est chargé automatiquement par docker compose et déjà ignoré par git.


Principe

La semaine cible est 39h (7h48 / jour). Les directives imposent des plages de présence minimum :

Demi-journée Plage minimale
Matin 09:00 → 12:00
Après-midi 14:00 → 17:00

L'outil calcule — sans arrondi — l'heure précise à laquelle partir chaque jour pour que le total de la semaine tombe pile sur 39h00.


Ce que tu vois dans le tableau

Colonne Ce qu'elle dit
Travaillé Heures effectivement saisies ce jour
Δ jour Écart par rapport aux 7h48 dus (affiché dès qu'une heure est enregistrée)
Δ sem. Solde cumulé depuis lundi — visible uniquement quand la journée est complète et sans jour manquant
Fin cible L'heure de sortie aprem pour finir la semaine à 0h sup

Les plages qui ne respectent pas les minimums sont signalées en rouge dès la saisie.


Lancement

docker compose up -d

Ouvre http://localhost:8000.

Les données (pointages, congés, comptes) sont stockées dans data/ et ignorées par git.
Seul data/config.example.json est versionné.


Configuration

data/config.json (voir data/config.example.json) :

{
  "heures_jour": 7.8,
  "log_level": "DEBUG",
  "allowed_email_domain": "exemple.fr",
  "mail_from": "no-reply@exemple.fr",
  "smtp": {
    "host": "smtp.exemple.fr",
    "port": 587,
    "user": "no-reply@exemple.fr",
    "password": "change-moi",
    "use_tls": true
  }
}
  • heures_jour7.8 = 7h48 = 39h ÷ 5 jours. Modifier cette valeur recentre tous les calculs.
  • log_levelDEBUG, INFO, WARNING ou ERROR. Contrôle la verbosité des logs (docker logs).
  • allowed_email_domain — seules les adresses de ce domaine peuvent se connecter.
  • mail_from — adresse expéditrice des emails de connexion.
  • smtp — serveur relais utilisé pour l'envoi (host, port, identifiants, TLS).

Congés

Trois boutons par ligne : MA (matin), AM (après-midi), J (journée entière).
Ils réduisent les heures dues et recalculent la Fin cible pour les jours restants.


Stack

FastAPI · HTMX · Jinja2 · fichiers JSON · Docker

Description
No description provided
Readme 834 KiB
Languages
Python 58.6%
HTML 41.3%