Files
pointeuse-optimisator/README.md
Antoine c2d7d0e3ac Rend les plages horaires et les rappels ntfy configurables, supprime le
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`.
2026-07-17 22:40:55 +02:00

125 lines
3.6 KiB
Markdown

# 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](docs/screenshot.png)
---
## Démarrage rapide
Avant le premier lancement, copie et adapte le fichier de config (voir
[Configuration](#configuration) plus bas) :
```bash
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 configurables (voir [Configuration](#configuration)).
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
```bash
docker compose up -d
```
Ouvre [http://localhost:8000](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`) :
```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
},
"plages": {
"matin_debut": "09:00",
"matin_fin": "12:00",
"aprem_debut": "14:00",
"aprem_fin": "17:00",
"pause_dejeuner_fin": "13:30"
}
}
```
- `heures_jour``7.8` = 7h48 = 39h ÷ 5 jours. Modifier cette valeur recentre tous les calculs.
- `log_level``DEBUG`, `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).
- `plages` — bornes de présence obligatoire matin/après-midi (voir [Principe](#principe)) et heure de reprise
par défaut de l'après-midi (`pause_dejeuner_fin`) tant que l'entrée aprem n'est pas encore saisie. Modifier
ces valeurs change à la fois les avertissements de saisie, les stats de conformité et le calcul de l'heure
de sortie optimale.
Les rappels ntfy (topic, serveur, plage horaire) se règlent par utilisateur depuis la page **Réglages** de l'app,
pas dans `config.json`.
---
## Tests
```bash
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 la **Fin cible** pour les jours restants.
---
## Stack
`FastAPI` · `HTMX` · `Jinja2` · fichiers JSON · `Docker`