Jacquin Antoine c1a2f38044 Convertit les endpoints de présence en POST (anti CSRF trivial)
GET /presence/{token}/arrivee et /depart modifiaient l'état (save_presence,
append_log) : c'est anti-pattern REST, CSRF-trivial via <img src="..."> si
le token fuite, et le token se retrouvait dans les logs reverse-proxy,
l'historique navigateur et les referrers.

Les deux routes passent en POST. C'est un breaking change pour les clients
Tasker actuels, mais Tasker supporte HTTP POST nativement et la doc
docs/notifications.md est mise à jour (Tasker : HTTP Request méthode POST ;
script NetworkManager : curl -X POST).

Les tests existants qui utilisaient client.get(...) sur ces routes passent
en client.post(...). Un nouveau test vérifie que le GET renvoie désormais
405 Method Not Allowed et que le POST continue de fonctionner.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-07-20 00:32:50 +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

Ces horaires sont réglables par utilisateur depuis la page Réglages de l'app (voir Configuration).

Quand un écart apparaît, l'outil ne le reporte pas d'un coup sur la fin de la journée en cours : il répartit le manque à parts égales sur toutes les demi-journées restantes de la semaine (matin et après-midi, aujourd'hui compris), pour un rattrapage progressif et confortable plutôt qu'un rush le soir même. Si le rythme normal suffit déjà à rentrer dans les clous, aucune préconisation n'est affichée.


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 Préconisation de sortie M (matin) et/ou A (après-midi) pour cette demi-journée — vide si le rythme normal suffit

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

Le bandeau au-dessus du tableau ajoute, quand il reste du retard à rattraper, une ligne Reste à faire : le total encore dû, le nombre de demi-journées restantes, et la part supplémentaire moyenne à ajouter sur chacune.


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).

Les rappels ntfy (topic, serveur, plage horaire) et les plages horaires (bornes de présence obligatoire matin/après-midi, voir Principe, et heure de reprise par défaut de l'après-midi) se règlent par utilisateur depuis la page Réglages de l'app, pas dans config.json. Modifier ses plages change, pour ce compte uniquement, les avertissements de saisie, les stats de conformité et les préconisations de rattrapage.


Tests

docker compose run --rm pointeuse pytest -v

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 les préconisations Fin cible pour les demi-journées restantes.


Stack

FastAPI · HTMX · Jinja2 · fichiers JSON · Docker

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