Absences
Une absence dit qu'une personne ne travaillait pas un jour donné : un congé, un arrêt maladie, ou autre chose. Elle sert à juger les heures d'une semaine : 28 heures sur une semaine avec un jour de congé, ce n'est pas un manque.
Une ligne par jour
Le manager enregistre une période (du lundi 5 au vendredi 9), mais l'API garde une ligne par jour dans la table absences. Les écrans regroupent ensuite les jours qui se suivent.
Pourquoi une ligne par jour ? Les autres règles raisonnent par jour : une semaine validée bloque des jours, l'objectif de la semaine baisse par jour d'absence. Supprimer un seul jour d'une période devient aussi une simple suppression de ligne.
| Champ | Contenu |
|---|---|
date | le jour |
kind | leave (congé), sick (maladie) ou other |
recorded_by_id, recorded_by_name | le manager qui l'a enregistrée (le nom est une copie, qui survit à la suppression de son compte) |
Jamais de motif
L'API ne garde que le type, jamais la raison d'une absence. Une donnée médicale n'a rien à faire dans un outil de pointage : c'est une protection des employés que le sujet demande.
Les règles
| Règle | Erreur |
|---|---|
| Seuls les jours de semaine (lundi au vendredi) de la période sont enregistrés | 422 no_weekday si la période n'en a aucun |
| La fin n'est pas avant le début | 422 before_start |
| Une période fait 31 jours au plus : une erreur de saisie (une année au lieu d'une semaine) reste limitée | 422 too_long (max: 31) |
| Un jour n'a qu'une absence par personne | index unique absences_user_id_date_index |
| Enregistrer : les managers de la personne, ou le GM, jamais soi (comme les heures) | 403 |
| Aucun jour de la période dans une semaine validée | 409 week_validated |
Tout ou rien : si un seul jour de la période est refusé (déjà absent, semaine validée), aucun n'est enregistré. Toute la période est écrite dans une seule transaction.
Ce qu'une absence change
- L'objectif de la semaine baisse de 7 heures par jour d'absence (35 heures pour une semaine complète) : c'est le tableau de bord qui en tient compte.
- Une absence n'est pas du temps travaillé : elle ne compte jamais dans les heures supplémentaires.
- La personne reçoit une notification (cloche et e-mail).
Les routes
| Route | Effet |
|---|---|
GET /api/users/:id/absences?start=…&end=… | les absences d'une personne (période facultative) |
POST /api/users/:id/absences | enregistrer une période : {"absence": {"start_date", "end_date", "kind"}} |
DELETE /api/absences/:id | supprimer un jour |
Fichiers : lib/timemanager/absences.ex et lib/timemanager/absences/absence.ex.