Apparence
Astreintes
Le module Activité ▸ Astreinte permet aux encadrants et RH de collaborer sur les astreintes de toute l'association. Le Service Paie consulte sans modifier. L'éligibilité d'un salarié provient de son contrat et ne lui ouvre pas ce module.
1. Consulter et filtrer les salariés concernés
Tickets : APAJH-104 · Rôle : Manager n1 · Prérequis : un salarié avec un contrat actuel ou futur autorisant l'astreinte, rattaché à plusieurs équipes.
Critères d'acceptation du ticket
- Une ligne par salarié, filtres établissement et équipe, recherche par nom et nombre de résultats.
- Un salarié éligible sans période affiche Aucune et —.
- Le téléphone professionnel prime sur le personnel ; à défaut, —.
Ouvrez Activité ▸ Astreinte.
Sélectionnez plusieurs établissements et équipes, puis recherchez un nom.
Gardez une équipe sélectionnée, puis choisissez un établissement auquel elle n'est pas rattachée. Recommencez avec une équipe commune à plusieurs établissements.
Décochez tous les établissements, puis sélectionnez un établissement sans équipe.
✅ Le salarié n'apparaît qu'une fois. Les choix d'un filtre se combinent par OU et les catégories par ET. Le nombre correspond aux résultats affichés. La liste des équipes suit les établissements sélectionnés. Seules les équipes devenues incompatibles sont retirées du filtre ; une équipe partagée reste proposée une seule fois. Sans filtre établissement, toutes les équipes sont proposées. Si aucune équipe n'est disponible, le sélecteur désactivé l'indique explicitement.
Couverture automatique : e2e/astreintes.spec.ts → « consulte les salariés sans doublon et transmet recherche et filtres » et « adapte les équipes aux établissements et retire seulement les filtres incompatibles », sur bureau et mobile ; tests/test_on_call.py vérifie la sélection réelle côté serveur, les rattachements et les droits directs.
2. Préparer plusieurs changements et supprimer la dernière période
Tickets : APAJH-105 · APAJH-107 · Rôle : Manager n1 · Prérequis : un contrat éligible couvrant les dates choisies.
Critères d'acceptation du ticket
- Ajouter, corriger et retirer plusieurs périodes avant un enregistrement commun.
- Annuler abandonne la saisie et la dernière période peut être supprimée.
Ouvrez un salarié au clavier avec Entrée ou en cliquant sur sa ligne.
Ajoutez une période, choisissez un jour ou une plage, les heures et les établissements couverts.
Modifiez une autre période, puis cliquez sur Annuler et rouvrez le panneau.
Retirez toutes les périodes et cliquez sur Enregistrer.
✅ Annuler n'enregistre rien. Enregistrer supprime aussi la dernière période et affiche une confirmation après la réponse du serveur.
Couverture automatique : e2e/astreintes.spec.ts → « annuler abandonne la saisie et la dernière période peut être supprimée » et « enregistre plusieurs lignes ensemble et conserve une saisie refusée », sur bureau et petit écran. Le scénario « le panneau utilise toute la largeur d’un petit téléphone sans couper les champs » vérifie aussi une largeur de 360 px avec un nom d'établissement long.
3. Refuser les erreurs sans perdre la saisie
Tickets : APAJH-105 · APAJH-107 · Rôle : RH n1 · Prérequis : un salarié avec une période enregistrée et un contrat éligible borné.
Critères d'acceptation du ticket
- Une ligne incomplète, une couverture contractuelle interrompue ou un chevauchement bloque tout l'enregistrement.
- Des contrats successifs sans interruption et des périodes adjacentes sont acceptés.
Corrigez une ligne existante puis ajoutez une ligne sans date.
Cliquez sur Enregistrer, complétez la ligne et créez un chevauchement.
Recommencez avec une nuit dépassant la fin du contrat.
✅ Les erreurs apparaissent sur les lignes ; les modifications restent dans le formulaire et aucune partie du lot n'est enregistrée.
Une période du vendredi au lundi, 19 h–7 h, couvre sans interruption du vendredi à 19 h au lundi à 7 h. Sur un seul jour, une fin inférieure ou égale au début désigne le lendemain. Les calculs utilisent Europe/Paris, y compris lorsque la nuit traverse un changement d'heure. Les bornes inexistantes ou ambiguës sont refusées.
Couverture automatique : e2e/astreintes.spec.ts → « enregistre plusieurs lignes ensemble et conserve une saisie refusée » ; tests/test_on_call.py couvre les règles temporelles et l'absence d'écriture partielle.
4. Conserver l'historique et les droits du Service Paie
Tickets : APAJH-104 · APAJH-107 · Rôle : Service Paie · Prérequis : un salarié dont l'éligibilité a été retirée après l'enregistrement d'astreintes.
Critères d'acceptation du ticket
- L'historique reste consultable ; les périodes terminées ne comptent pas dans Prochaine.
- Service Paie n'a aucune commande d'écriture, y compris par appel API direct.
Ouvrez le salarié signalé Non éligible actuellement.
Consultez En cours / À venir et Historique.
✅ Les périodes restent visibles sans commande d'édition. Si toutes sont terminées, le tableau indique Aucune et —.
Couverture automatique : e2e/astreintes.spec.ts → « le Service Paie consulte un historique non éligible sans commande d’écriture » ; tests/test_on_call.py vérifie les refus serveur et la conservation des périodes inchangées.
5. Détecter une modification concurrente
Tickets : APAJH-105 · APAJH-107 · Rôle : deux encadrants · Prérequis : le même panneau ouvert dans deux sessions.
Critères d'acceptation du ticket
- Un enregistrement concurrent ne provoque ni écrasement silencieux ni chevauchement.
Enregistrez un changement dans la première session.
Essayez d'enregistrer depuis la seconde session restée ouverte.
✅ Le serveur refuse la version périmée. La seconde saisie reste visible ; le bouton Abandonner la saisie et recharger récupère explicitement la version serveur.
Couverture automatique : e2e/astreintes.spec.ts → « un conflit conserve le formulaire et demande un rechargement explicite » ; tests/test_on_call.py exécute des transactions concurrentes sur MySQL et les parcours du back-office.
6. Collaborer entre établissements et ouvrir temporairement le périmètre manager
Tickets : APAJH-104 · APAJH-105 · Rôle : Manager n1 · Prérequis : deux établissements A et B et un manager rattaché habituellement à A.
Critères d'acceptation retenus lors du cadrage
- Les encadrants consultent et gèrent les astreintes des salariés de leur périmètre (scénario 8) ; une période peut couvrir un établissement hors de ce périmètre.
- Une période peut couvrir plusieurs établissements hors rattachements habituels.
- Un manager conserve ses droits habituels et obtient le périmètre des sites couverts pendant l'astreinte.
Planifiez ce manager sur B, sans changer ses rattachements habituels.
Consultez le planning avant, pendant et après la période effective.
✅ Pendant l'astreinte, B rejoint son périmètre manager. L'extension disparaît à la fin ou après suppression. Un salarié non-manager n'obtient pas de rôle manager.
Couverture automatique : tests/test_on_call.py. Le menu mobile reste celui du salarié ; e2e/astreintes.spec.ts vérifie l'accès direct responsive et l'absence d'entrée manager dans le menu mobile.
7. Créer une astreinte puis modifier et enregistrer ses horaires
Tickets : APAJH-104 · APAJH-105 · APAJH-107 · Rôle : RH n1 · Prérequis : un salarié avec un contrat autorisant l'astreinte sur les dates choisies.
Critères d'acceptation du complément de parcours
- Le clic sur le salarié ouvre ses périodes, sur ordinateur et mobile, sans bouton de création sur la page ni libellé Modifier.
- Ajouter une astreinte prépare une nouvelle période dans le panneau du salarié.
- Enregistrer conserve les créations et corrections après réouverture.
Ouvrez Astreinte, recherchez le salarié et cliquez sur sa ligne.
Cliquez sur Ajouter une astreinte. Une nouvelle ligne apparaît avec les horaires 19:00–07:00.
Renseignez la date et les Établissements couverts, puis cliquez sur Enregistrer en bas du panneau.
Fermez le panneau avec Annuler après la confirmation, puis cliquez de nouveau sur le salarié.
Corrigez les horaires, cliquez sur Enregistrer, fermez puis rouvrez le salarié.
✅ Les horaires enregistrés sont conservés. Les périodes déjà présentes restent visibles lors d'une création ; Annuler avant l'enregistrement abandonne la nouvelle ligne et les corrections.
Si aucun salarié n'est éligible, la page invite à activer l'option sur un contrat. Service Paie ouvre le même salarié en consultation seule, sans commande d'ajout ni d'enregistrement. Le téléphone professionnel est affiché en priorité, puis le personnel à défaut ; sans numéro, —.
Couverture automatique : e2e/astreintes.spec.ts → « un clic sur le salarié permet de créer puis de corriger et enregistrer une astreinte », sur ordinateur et petit écran.
8. L'écran Astreintes ne propose que le périmètre du rôle
Tickets : APAJH-298 · Rôle : RH n1 (ou Admin, Manager n1) dont le rôle est rattaché à quelques établissements seulement · Prérequis : make seed-all, un salarié pouvant être d'astreinte dans ce périmètre, et un autre dans un établissement hors périmètre
Ouvrez Astreintes, puis le filtre établissement.
✅ Résultat attendu : seuls les établissements rattachés au rôle sont proposés, et la liste ne montre que les salariés de ce périmètre pouvant être d'astreinte (contrat éligible actuel ou futur, ou astreinte déjà enregistrée).
Choisissez un établissement, puis ouvrez le filtre équipe, et tapez un nom dans Rechercher un salarié….
✅ Résultat attendu : sans sélection, toutes les équipes du périmètre sont proposées ; elles suivent ensuite l'établissement choisi. La liste et la recherche ne gardent que les salariés pouvant être d'astreinte que les deux filtres laissent — un établissement coché garde ceux qui y travaillent, y sont payés ou affectés à l'une de ses équipes (les établissements affichés sous leur nom), une équipe cochée ceux qui y sont affectés —, jamais celui de l'établissement hors périmètre.
Depuis un compte rattaché à l'autre établissement, enregistrez une astreinte de ce second salarié couvrant un établissement du premier périmètre, puis revenez au premier compte.
✅ Résultat attendu : le second salarié apparaît désormais dans la liste : il couvre l'un de vos établissements.
Couverture automatique : backend/tests/test_on_call.py → test_the_directory_keeps_to_the_perimeter_but_shows_who_covers_it et les filtres d'équipe bornés au périmètre.
9. Refuser une 27ᵉ semaine d'astreinte sur 12 mois
Tickets : APAJH-181 · Rôle : Manager n1 · Prérequis : un salarié qui a déjà des astreintes sur 26 semaines distinctes dans une même période de 12 mois (à saisir en une fois sur l'écran, ou dans le back-office).
Critères d'acceptation
- Une astreinte qui ferait passer le salarié à plus de 26 semaines distinctes sur 12 mois glissants est refusée.
- Une astreinte ajoutée dans une semaine déjà comptée, ou à plus de 12 mois des autres, s'enregistre normalement.
Ouvrez le salarié, cliquez sur Ajouter une astreinte et choisissez une date dans une semaine où il n'a pas encore d'astreinte, dans la même période de 12 mois.
Renseignez les Établissements couverts et cliquez sur Enregistrer.
✅ L'erreur « Le plafond conventionnel de 26 semaines d'astreinte sur 12 mois est dépassé. » apparaît sur la nouvelle ligne, qui reste dans le formulaire sans être enregistrée.
Déplacez la date dans une semaine où il a déjà une astreinte et enregistrez de nouveau.
✅ L'astreinte est enregistrée.
Le plafond vient de l'accord de branche 22/4/2005 (art. 4) et de la CCN-66 (annexe 6, art. 16) — R-J07/AL-I01. Une semaine compte dès qu'une astreinte la touche : une nuit du dimanche au lundi compte dans les deux semaines. Le référentiel réserve ce plafond aux organisations possibles avec seulement deux salariés ; l'application ne connaît pas cette notion et l'applique à tous. Le back-office n'applique pas ce plafond : c'est là qu'une direction traite les exceptions.
Couverture automatique : tests/test_on_call.py couvre la borne des 26 semaines, les 12 mois glissants et la nuit à cheval sur deux semaines. L'affichage d'une erreur sur la ligne refusée est celui de « enregistre plusieurs lignes ensemble et conserve une saisie refusée » (e2e/astreintes.spec.ts).
10. Signaler une astreinte posée sur une absence du salarié
Tickets : APAJH-181 · Rôle : Manager n1 · Prérequis : un salarié pouvant être d'astreinte, avec une absence validée (par exemple des congés payés) et une demande d'absence en attente à venir.
Critères d'acceptation
- Créer ou modifier une astreinte qui tombe sur un jour d'absence du salarié l'enregistre, et un avertissement le signale.
- Une demande d'absence en attente est signalée aussi, nommée comme telle ; une absence refusée ou annulée ne l'est pas.
- Seules les astreintes que l'enregistrement crée ou modifie sont signalées.
Ouvrez le salarié, ajoutez une astreinte sur un jour de son absence validée et cliquez sur Enregistrer.
✅ « Astreintes enregistrées. » s'affiche, et un avertissement ambre dans le panneau nomme l'astreinte, le motif et les dates de l'absence.
Ajoutez une autre astreinte, hors de toute absence, et enregistrez.
✅ L'astreinte est enregistrée sans avertissement : celle de l'étape 1, inchangée, n'est pas signalée de nouveau.
Déplacez cette seconde astreinte sur le jour de la demande en attente et enregistrez.
✅ L'avertissement parle d'une « demande d'absence en attente ».
Les astreintes sont interdites pendant les congés et les jours RTT (accord de branche 22/4/2005, art. 4 al. 3 — R-J08/AL-I04). Le référentiel prévoit un blocage ; à la demande du métier, l'application avertit sans refuser, pour toute absence, quel que soit le motif. Une astreinte compte chaque jour qu'elle touche : une nuit qui finit le matin d'un jour d'absence est signalée. Le back-office affiche le même avertissement après l'enregistrement.
Couverture automatique : e2e/astreintes.spec.ts → « enregistre une astreinte posée sur une absence et le signale », sur ordinateur et petit écran ; tests/test_on_call.py couvre l'absence validée, la demande en attente, les absences refusées ou annulées et la nuit qui finit sur un jour d'absence.
11. Signaler une astreinte posée sur un repos hebdomadaire
Tickets : APAJH-181 · Rôle : Manager n1 · Prérequis : un salarié pouvant être d'astreinte, planifié sur une trame dont un jour est marqué Repos hebdomadaire (RH)
Critères d'acceptation
- Créer ou modifier une astreinte qui touche le repos hebdomadaire du salarié l'enregistre, et un avertissement le signale.
- Un jour marqué seulement Repos (R), ou un repos hebdomadaire remplacé par une modulation ou une absence, n'est pas signalé.
Ouvrez le salarié et ajoutez une astreinte la veille de son repos hebdomadaire, de 19:00 à 07:00, puis cliquez sur Enregistrer.
✅ « Astreintes enregistrées. » s'affiche, avec un avertissement ambre : « L'astreinte du … chevauche un repos hebdomadaire du salarié (…) — vérifiez la compatibilité. »
Ajoutez une astreinte un jour de simple Repos, ou un jour travaillé, et enregistrez.
✅ Pas d'avertissement pour cette astreinte.
Le référentiel demande de vérifier qu'une astreinte posée sur un repos hebdomadaire reste compatible avec lui (R-C03/AL-I05) : c'est une alerte, pas un refus. Le repos hebdomadaire est le jour que le planning résout comme tel — une modulation ou une absence posée dessus le remplace. Le back-office affiche le même avertissement.
Couverture automatique : tests/test_on_call.py couvre le repos hebdomadaire, le simple repos et la modulation posée sur le repos hebdomadaire. L'affichage de l'avertissement est celui du scénario 10 (e2e/astreintes.spec.ts).