Apparence
Planning manager
Le planning d'équipe (/planning, Activité ▸ Planning), vue Général : une ligne par salarié, une colonne par jour.
À lire avant de commencer
Ce chapitre se joue en deux modes, et chaque scénario dit lequel.
L'écran lit la base : c'est son comportement par défaut, et il ne demande aucune manipulation. Mais la base ne sait pas encore produire tout ce que l'écran sait afficher — il n'existe ni absence, ni journée coupée, ni astreinte, ni plafond hebdomadaire dépassé dans les données que les seeds écrivent. Ces situations-là se vérifient sur un jeu de démonstration embarqué dans l'application, qui est aussi celui que les tests automatiques exercent.
D'où le partage :
- les scénarios 1 à 11 se jouent en mode démonstration. Ils vérifient ce que l'écran affiche, et chacun dit en tête ce que la base ne sait pas encore produire à sa place ;
- les scénarios 12 à 14 se jouent sur les données réelles. Ils vérifient que l'écran lit et écrit vraiment la base — ce que la démonstration, par construction, ne peut pas montrer : elle ne connaît ni rôle, ni périmètre.
Un seul bouton enregistre, et c'est l'Enregistrer du formulaire Modifier le poste. Tout le reste se lit. Deux comportements à connaître, sans quoi vous ouvrirez des anomalies pour rien :
- « Publier le planning » et les formats d'export sont grisés ;
- les autres — « Déclarer une absence », l'affectation d'un poste à pourvoir, les trois actions du bouton + — gardent leur aspect normal. Le clic ne fait rien, et une infobulle au survol affiche « Disponible avec l'API planning. »
Prérequis communs à tout le chapitre : make seed-demo pour se connecter, make seed-workforce et make seed-establishments pour l'effectif et les services, make seed-postes puis make seed-trames pour la bibliothèque et la trame. En une commande : make seed-all, sur une base fraîche.
Scénarios en mode démonstration
Les données de démonstration ne s'affichent pas toutes seules : il faut les activer, et c'est une manipulation sur le serveur. Si vous n'avez pas accès à la machine, demandez-la à un développeur avant de commencer. La commande à lui donner :
bash
# dans .env : VITE_ENABLE_MOCK=true
docker compose up -d --force-recreate frontendRechargez ensuite la page avec Ctrl + Maj + R (Cmd + Maj + R sur Mac) : un simple F5 ne suffit pas. Remettez VITE_ENABLE_MOCK=false avant de passer aux scénarios 12 et 13.
Dans ce mode, rien de ce que vous voyez ne vient de la base — et l'Enregistrer de « Modifier le poste », lui, y écrit quand même : la grille ne bougera donc pas sous vos yeux. C'est pour cela que l'enregistrement a son scénario ailleurs, sur données réelles.
1. Lire une semaine de planning
Tickets : APAJH-240 · APAJH-113 · Rôle : encadrant · Prérequis : mode démonstration activé
Ce que la base ne sait pas encore produire : les astreintes du bandeau (aucun seed n'en crée — elles se saisissent au back-office, Planning ▸ Astreintes) et la journée coupée, qu'une trame ne sait pas exprimer.
Ouvrez Activité ▸ Planning.
✅ Résultat attendu : la première colonne s'intitule Utilisateurs, puis viennent les sept jours de la semaine, et la dernière colonne à droite s'intitule Total.
Faites défiler la grille vers la droite.
✅ Résultat attendu : la colonne des noms reste visible. La colonne Total, elle, défile avec le reste.
Regardez les bandeaux — les lignes pleine largeur qui coupent la grille pour annoncer une unité.
✅ Résultat attendu : Unité Soin annonce ses astreintes avec le numéro à appeler et « 7 utilisateurs ». Unité Éducative en annonce 7 également — une personne appartient aux deux équipes, et compte donc dans les deux (scénario 11).
Regardez les blocs colorés dans les cases.
✅ Résultat attendu : chaque bloc porte ses horaires, l'établissement et la durée. Un liseré vertical coloré le borde à gauche : c'est la couleur de l'établissement. Certains jours portent deux blocs empilés — une journée coupée.
Repérez la colonne du jour et celles du week-end.
✅ Résultat attendu : la colonne d'aujourd'hui est teintée en vert clair, et son en-tête est souligné d'un trait vert. Samedi et dimanche prennent un fond bleuté.
Cliquez sur le bandeau Unité Soin.
✅ Résultat attendu : les lignes de l'unité disparaissent et le chevron pivote. L'autre unité ne bouge pas. Un second clic rouvre.
Cliquez la flèche › pour passer à la semaine suivante, puis survolez l'en-tête de la colonne du jeudi — en démonstration, c'est le jour férié de la semaine affichée.
✅ Résultat attendu : la colonne du jeudi est grisée exactement comme un samedi, en-tête compris, et l'infobulle de l'en-tête nomme le férié (« Ascension »). La teinte ne dit pas que personne ne travaille : les blocs présents restent affichés. Sur les données réelles, ce sont les fériés du référentiel (section Jours fériés du back-office) qui se grisent ainsi — donc rien à voir la plupart des semaines.
Couverture automatique : e2e/planning.spec.ts vérifie la structure des colonnes, le pli et le dépli d'un bandeau, la journée coupée, le grisé du férié, et le fait que la grille défile dans sa boîte. Le reste est à regarder.
2. Changer de période et passer à la vue mois
Tickets : APAJH-240 · Rôle : encadrant · Prérequis : mode démonstration activé
Ce que la base ne sait pas encore produire : le code d'absence (CA) de la vue mois. Ni une trame ni une modulation ne produisent une absence ; seuls les codes de repos (R, RH) s'observent sur données réelles.
Cliquez la flèche › à droite du titre de la semaine, puis le bouton Aujourd'hui.
✅ Résultat attendu : le titre change de semaine, puis revient exactement à celle de départ. Chaque semaine est peuplée, quelle que soit la date.
Basculez sur Mois.
✅ Résultat attendu : autant de colonnes que le mois a de jours. Les cases rétrécissent : une journée travaillée n'affiche plus que l'heure de début et celle de fin, l'une sous l'autre ; une absence ou un repos affiche son code (
CA,R…). La dernière colonne s'intitule Cumul et non Total.
Couverture automatique : e2e/planning.spec.ts vérifie le va-et-vient entre périodes et le passage en vue mois.
3. Restreindre l'effectif affiché
Tickets : APAJH-240 · Rôle : encadrant · Prérequis : mode démonstration activé
La barre d'outils propose deux filtres, et rien d'autre : établissement et équipe. Il n'y a pas de champ de recherche sur cet écran.
Dans le filtre établissement, choisissez Siège social.
✅ Résultat attendu : seule la ligne de Claire Boyer reste, la seule personne rattachée à ce site. L'effectif annoncé sur son bandeau ne change pas — il continue d'annoncer « 7 utilisateurs » : il décrit l'équipe, pas l'écran.
Ajoutez le filtre équipe sur Unité Soin, où personne n'est rattaché à ce site.
✅ Résultat attendu : la grille disparaît et affiche « Aucun salarié ne correspond aux filtres. » Choisissez bien une paire vide : les deux filtres se cumulent, et une personne peut appartenir à deux équipes (scénario 11), si bien qu'une unité qui semble étrangère à un établissement peut tout de même y compter quelqu'un.
Couverture automatique : e2e/planning.spec.ts vérifie les deux filtres pris séparément. La combinaison qui vide la grille est à jouer à la main.
4. Ouvrir le panneau d'un salarié, puis celui d'un poste
Tickets : APAJH-240 · Rôle : encadrant · Prérequis : mode démonstration activé, make seed-workforce
Ce que la base ne sait pas encore produire : l'encart ASTREINTE DE LA SEMAINE de l'étape 2 (rien n'en crée) et le jour d'absence de l'étape 4. Un jour de repos, lui, s'observe sur données réelles.
Cliquez sur le nom Émilie Chen.
✅ Résultat attendu : un panneau s'ouvre à droite, titré UTILISATEUR SÉLECTIONNÉ. Il affiche son identité, IDE · 100%, son téléphone, son établissement principal, ses heures de la semaine sur 35h et son annualisation.
Elle est d'astreinte : regardez l'encart ASTREINTE DE LA SEMAINE.
✅ Résultat attendu : « Début : vendredi à 19h » et « Fin : 07h ». Le jour n'est pas répété sur la fin, l'astreinte ne durant qu'une nuit.
Cliquez Voir la fiche.
✅ Résultat attendu : la fiche s'ouvre sur Émilie Chen.
Revenez, puis cliquez sur un bloc coloré dans une case.
✅ Résultat attendu : le panneau bascule sur DÉTAIL DU POSTE — horaires, durée, pause, établissement. Aucune information du panneau précédent ne subsiste. Une journée d'absence ou de repos affiche un statut à la place des horaires.
Couverture automatique : e2e/planning.spec.ts vérifie les deux panneaux, le passage de l'un à l'autre et le jour d'absence.
5. Modifier un poste
Tickets : APAJH-240 · Rôle : encadrant · Prérequis : mode démonstration activé
Ce scénario vérifie la saisie. L'enregistrement, lui, a le sien : scénario 12.
Cliquez un bloc coloré, puis Modifier le poste au bas du panneau.
✅ Résultat attendu : le panneau garde sa place et change de contenu — un titre Modifier le poste, un lien Retour en haut, et un encart POSTE ACTUEL rappelant l'horaire théorique du jour et sa durée. La pastille de l'horaire porte la couleur du bloc cliqué.
Ouvrez Motif.
✅ Résultat attendu : trois choix — Remplacement, Demande personnelle, Urgence. « Demande personnelle » est déjà sélectionné.
Tapez trois lettres dans Rechercher un poste…, puis choisissez une entrée.
✅ Résultat attendu : chaque suggestion porte la couleur de son poste. Le choix ouvre le bloc Entrer un poste manuellement et y recopie les horaires — rien ne change en coulisse. Le pavé de comparaison apparaît : heures théoriques, heures demandées, écart compteur (vert au-dessus, rouge en dessous).
Choisissez un poste de nuit (21:00 → 07:00).
✅ Résultat attendu : il est compté 10h, pas une durée négative. Une mention « Pause par défaut 20 min » apparaît sous les créneaux au-delà de six heures.
Cliquez Ajouter un créneau et saisissez un second couple d'heures.
✅ Résultat attendu : les deux créneaux s'additionnent dans Heures demandées, et l'écart suit. Le bouton − retire une ligne ; il n'apparaît pas tant qu'il n'en reste qu'une.
Parcourez le bas du formulaire.
✅ Résultat attendu : Établissement / Service est positionné sur le site du jour, puis trois options à cocher — Télétravail, Hors établissement, Inclus temps de trajet — et un Commentaire.
Cliquez Retour, puis rouvrez Modifier le poste.
✅ Résultat attendu : le panneau revient sur DÉTAIL DU POSTE, à l'endroit d'où vous êtes parti — et au retour dans le formulaire, votre saisie est toujours là : motif, créneaux, options, commentaire. Annuler, lui, ferme le panneau et abandonne la saisie : le formulaire d'une autre case s'ouvre vide.
Couverture automatique : e2e/planning.spec.ts vérifie l'ouverture du formulaire, le retour au détail sans perte de la saisie, le remplissage des créneaux par la bibliothèque et le cumul de plusieurs créneaux.
6. Affecter un salarié sur un poste à pourvoir
Tickets : APAJH-240 · Rôle : encadrant · Prérequis : mode démonstration activé
Ce scénario vérifie la limite de la livraison : le parcours va jusqu'au bout, l'enregistrement n'existe pas.
Chaque unité se termine par une ligne Poste à pourvoir. Cliquez dessus.
✅ Résultat attendu : un panneau Ajouter un poste s'ouvre à droite, avec une carte rappelant l'unité et son établissement — « Unité Soin · FAM Les Cigales ».
Tapez trois lettres dans Rechercher un salarié…, puis choisissez un nom.
✅ Résultat attendu : la liste des suggestions s'ouvre à la largeur exacte du champ, réduite aux noms correspondants. Le nom choisi remplit le champ, avec une croix pour l'effacer.
Survolez Enregistrer, puis cliquez.
✅ Résultat attendu : l'infobulle affiche « Disponible avec l'API planning. » Le clic ne fait rien : le panneau reste ouvert, et la ligne Poste à pourvoir est inchangée dans la grille. Annuler ferme le panneau.
Couverture automatique : e2e/planning.spec.ts vérifie l'ouverture du panneau, la recherche d'un salarié et la fermeture.
7. Lire la légende et les alertes
Tickets : APAJH-240 · Rôle : encadrant · Prérequis : mode démonstration activé
Ce que la base ne sait pas encore produire : le total supérieur à 44h de l'étape 3. La trame seedée tourne autour de 38h par semaine, donc le plafond hebdomadaire n'y est jamais franchi. Le panneau Alertes, lui, se remplit sur données réelles — voir le scénario 13.
Cliquez Légende.
✅ Résultat attendu : onze pastilles nommées — Matin, Après-midi, Soir, Journée, Nuit, Évènement, Absence / Congé, Repos, Demande en attente, Poste modifié, Alerte — puis la ligne des pictogrammes qu'une case peut porter.
Ouvrez le panneau Alertes.
✅ Résultat attendu : les infractions à la CCN-66 de la période, classées par gravité, chacune nommant le salarié, la date et le motif. Le point rouge du bouton et la pastille Alerte de la légende sont de la même couleur.
Cherchez un total supérieur à 44h dans la colonne Total.
✅ Résultat attendu : il s'affiche en rouge. En vue Mois, aucun total n'est signalé : un cumul mensuel ne se compare pas à un plafond hebdomadaire.
Couverture automatique : e2e/planning.spec.ts vérifie la légende, le panneau d'alertes et le total au-delà de 44h.
8. Vérifier ce qui n'est pas branché
Tickets : APAJH-240 · Rôle : encadrant · Prérequis : mode démonstration activé
Regardez le haut de la barre d'outils.
✅ Résultat attendu : Publier le planning est grisé. Aucune mention de sauvegarde n'apparaît à côté : la maquette en affiche une, elle a été retirée parce qu'elle annonçait un enregistrement qui n'a pas lieu.
Ouvrez le menu Exporter.
✅ Résultat attendu : le menu s'ouvre et propose Excel et PDF, tous deux grisés.
Cliquez le bouton + flottant, en bas à droite.
✅ Résultat attendu : il se transforme en croix sans se déplacer, et ouvre un menu de trois actions — Déclarer une absence, Modifier un poste, Créer un planning. Chacune garde son aspect normal ; le clic ne fait rien et l'infobulle affiche « Disponible avec l'API planning. » Échap referme.
Couverture automatique : e2e/planning.spec.ts vérifie l'ouverture des deux menus. L'aspect des boutons est à regarder.
9. Constater que l'écran n'existe pas sur mobile
Tickets : APAJH-240 · Rôle : encadrant · Prérequis : viewport 390 × 844
C'est le comportement voulu, pas un défaut : aucun écran manager n'est conçu pour un téléphone. La réponse mobile sera l'écran « Mon planning » du portail salarié, qui n'est pas livré.
Ouvrez l'application en 390 × 844.
✅ Résultat attendu : la navigation bascule sur Mon espace, et l'entrée Activité ▸ Planning n'apparaît plus.
Saisissez directement l'adresse
/planning.✅ Résultat attendu : la grille ne s'affiche pas, et la page ne déborde pas horizontalement.
Couverture automatique : e2e/planning.spec.ts vérifie qu'en 390 px le portail n'expose pas le planning et que la page ne déborde pas.
10. Vérifier que deux postes de même nom ne se confondent pas
Tickets : APAJH-240 · Rôle : encadrant · Prérequis : mode démonstration activé
Deux postes différents peuvent porter le même code : il se déduit de la catégorie, si bien que tous les postes du matin s'appellent JM. Ce scénario vérifie que la grille les distingue quand même — c'est-à-dire qu'elle affiche les horaires du poste réellement affecté, et non ceux de son homonyme.
Ce que la base ne sait pas encore produire : la collision elle-même. Elle compte pourtant bien quatre postes par code — un par compte encadrant — mais aucune trame seedée n'en amène deux dans la même période. Reproduire ce scénario sur données réelles demanderait de fabriquer la donnée exprès : deux postes de même catégorie, d'horaires différents, dans deux bibliothèques, employés par deux salariés affichés à l'écran.
Ouvrez Activité ▸ Planning et repérez la ligne Émilie Chen.
✅ Résultat attendu : elle travaille trois matinées dans la semaine, dont deux de 07:00 à 14:30 et une de 07:30 à 15:30. Les trois cases n'affichent pas les mêmes horaires.
Cliquez la case de 07:00–14:30, notez le panneau, fermez-le avec Échap, puis cliquez celle de 07:30–15:30.
✅ Résultat attendu : les deux panneaux s'intitulent Matin, et tout le reste diffère — 7h contre 7h30 de durée, une pause à 11:00–11:30 contre 11:30–12:00.
Regardez la colonne Total de sa ligne.
✅ Résultat attendu : 35h30, c'est-à-dire deux matinées à 7h, une à 7h30 et deux soirées à 7h. Un total de 35h signalerait que les deux matinées ont été comptées au même horaire.
Ouvrez Modifier le poste depuis l'une de ces cases, puis tapez « Matin » dans le champ Poste.
✅ Résultat attendu : la liste propose les deux matinées séparément — « JM · Matin · 07:00–14:30 » et « JM · Matin · 07:30–15:30 ».
Couverture automatique : e2e/planning.spec.ts vérifie les horaires des trois matinées et le total de la ligne. Les panneaux et la liste des postes sont à regarder.
11. Voir un salarié dans deux équipes
Tickets : APAJH-243 · Rôle : encadrant · Prérequis : mode démonstration activé
Un salarié peut appartenir à plusieurs équipes. Sa ligne apparaît alors sous chacune d'elles, et c'est la même ligne, répétée : mêmes journées, même total. Ce scénario vérifie cette duplication, et qu'elle ne se confond pas avec un doublon.
Ce que la base ne sait pas encore produire : l'appartenance double elle-même. seed_workforce nomme une équipe par membre de la cohorte, donc aucun salarié seedé n'est dans deux. Le reproduire sur données réelles demande d'en ajouter une seconde à quelqu'un au back-office — la fiche du salarié y porte un bloc Affectations. Le périmètre du lecteur, lui, se vérifie au scénario 14.
Ouvrez Activité ▸ Planning et parcourez les deux bandeaux, Unité Soin et Unité Éducative.
✅ Résultat attendu : Isabelle Aubert a une ligne sous chacun des deux bandeaux. Son nom apparaît donc deux fois à l'écran.
Comparez ses deux lignes case par case, puis leur colonne Total.
✅ Résultat attendu : les deux lignes sont identiques — mêmes postes aux mêmes jours, même total. Ce n'est pas une personne comptée deux fois, c'est la même ligne montrée dans les deux équipes auxquelles elle appartient.
Regardez l'effectif annoncé par chaque bandeau.
✅ Résultat attendu : 7 utilisateurs de part et d'autre. Elle compte dans les deux équipes, parce qu'elle est dans les deux.
Ouvrez Filtrer par équipe et cochez Unité Soin seule.
✅ Résultat attendu : il ne reste qu'une de ses deux lignes, et le bandeau Unité Éducative a disparu en entier.
Décochez le filtre, puis cliquez le bandeau Unité Soin pour le replier.
✅ Résultat attendu : seul ce bandeau se replie. La ligne d'Isabelle Aubert reste visible sous Unité Éducative — le pli porte sur le bandeau, pas sur la personne.
Cliquez son nom dans l'une des deux lignes, puis Voir la fiche.
✅ Résultat attendu : la fiche ouverte est la sienne, la même depuis l'une ou l'autre ligne. Les deux lignes désignent une seule personne.
Couverture automatique : e2e/planning.spec.ts vérifie les deux lignes, leurs cellules et leur total identiques, et qu'un filtre sur une équipe n'en laisse qu'une. Le pli, l'effectif et la fiche sont à regarder.
Scénarios sur données réelles
Aucune manipulation à demander : lire la base est le comportement par défaut de l'écran. Si vous venez de jouer les scénarios précédents, remettez VITE_ENABLE_MOCK=false et rechargez avec Ctrl + Maj + R.
Prérequis communs à cette section, en plus des seeds du chapitre : une planification, car aucun seed n'en crée. Jouez le scénario 6 du chapitre Planification — « Valider envoie une planification par salarié coché » — sur la trame Roulement standard, en le paramétrant ainsi :
- un seul salarié coché, dont vous notez le nom ;
- à l'étape Date, début au lundi de la semaine en cours ;
- Semaine de départ : 1 sur la ligne du salarié.
Tant qu'aucune planification n'existe, l'écran n'est ni en erreur ni vide : il dessine toutes les lignes du périmètre, avec des cases vides. C'est le comportement attendu, pas une anomalie.
12. Enregistrer la modulation d'une journée, et la voir changer la case
Tickets : APAJH-240 · Rôle : encadrant · Prérequis : ceux de la section — une planification sur Roulement standard, semaine 1, à partir du lundi de la semaine en cours
C'est la seule écriture de cet écran. Une modulation ne détruit pas la trame : elle prend le dessus sur la journée qu'elle nomme, et rien d'autre.
Ouvrez Activité ▸ Planning et repérez la ligne du salarié que vous avez planifié.
✅ Résultat attendu : sa semaine suit le cycle de la trame — Matin (07:00–14:30) lundi, Après-midi (14:00–21:30) mardi, Soir (16:00–23:30) mercredi, Nuit (22:00–06:00) jeudi, Matin vendredi, puis
Rsamedi etRHdimanche. La colonne Total affiche 38h.Cliquez le bloc du vendredi, puis Modifier le poste. Sans rien saisir, survolez Enregistrer.
✅ Résultat attendu : le bouton est grisé et inactif, et l'infobulle affiche « Saisissez au moins un créneau complet. » Il ne s'agit pas d'un bouton inerte : il n'y a simplement rien à enregistrer.
Ouvrez Entrer un poste manuellement, saisissez 08:00 → 12:00, choisissez le motif Urgence, puis cliquez Enregistrer.
✅ Résultat attendu : le bouton se grise le temps de l'envoi, le panneau se ferme, et un bandeau vert « Poste enregistré » apparaît en bas de l'écran puis disparaît de lui-même.
Regardez la case du vendredi et la colonne Total.
✅ Résultat attendu : la case a changé — elle affiche maintenant 08:00–12:00 au lieu de 07:00–14:30. Elle garde le libellé Matin et la couleur du poste sous-jacent : une modulation qui ne choisit aucun poste emprunte l'identité de la journée qu'elle remplace. Le Total de la ligne tombe de 38h à 34h30.
Rouvrez la même case, portez le créneau à 08:00 → 14:00, puis Enregistrer.
✅ Résultat attendu : l'enregistrement passe — il corrige la modulation existante au lieu d'en créer une seconde. La case affiche 08:00–14:00 et le total remonte à 36h30. Aucun message d'erreur : c'est la différence avec le mode démonstration, où la grille ignore la modulation déjà en base et où un second envoi se heurte à l'unicité.
Ouvrez le back-office (
/admin), puis Planning ▸ Modulations de poste.✅ Résultat attendu : une seule ligne pour ce salarié, à la date du vendredi, motif Urgence, colonne Créneaux à 1. Ouvrez-la : le créneau 08:00–14:00 y est, et le poste de trame d'origine n'a pas bougé — supprimez la modulation et la case reprend ses 07:00–14:30.
Couverture automatique : e2e/planning.spec.ts vérifie la charge utile envoyée (créneaux, motif, identifiant d'établissement), la création contre la correction, le bouton inerte pendant l'envoi, la fermeture du panneau au succès et l'affichage d'un refus du serveur — le tout par interception, sans serveur. Ce qui reste à regarder ici est précisément ce qu'elle ne peut pas voir : l'aller-retour réel, la case qui change et le total qui suit.
13. Lire une semaine planifiée, et l'alerte que la trame produit
Tickets : APAJH-240 · Rôle : encadrant · Prérequis : ceux de la section
Ce scénario vérifie que la grille lit vraiment la base — les journées, les bandeaux et les alertes conventionnelles, toutes calculées par le serveur.
Ouvrez Activité ▸ Planning sans filtre.
✅ Résultat attendu : un bandeau par service de votre périmètre, chacun annonçant son établissement et son effectif. Seule la ligne du salarié planifié porte des blocs ; les autres lignes du périmètre sont présentes et leurs cases sont vides.
Cliquez le bloc du jeudi (la nuit).
✅ Résultat attendu : le panneau DÉTAIL DU POSTE affiche 22:00–06:00 et 8h — une nuit qui franchit minuit est comptée en positif, pas en durée négative.
Ouvrez le panneau Alertes.
✅ Résultat attendu : une alerte de gravité avertissement sur le vendredi, nommant le salarié : « Repos quotidien 1h < 11h (CCN-66) ». Elle est calculée par le serveur, pas par l'écran : la trame enchaîne une nuit qui finit à 06:00 sur un matin qui commence à 07:00.
Basculez sur Mois, puis revenez sur Semaine.
✅ Résultat attendu : la vue mois montre les mêmes journées en réduit — heure de début et heure de fin l'une sous l'autre,
RetRHpour les repos — et la dernière colonne s'intitule Cumul. Le retour en semaine retrouve la grille de départ.
Couverture automatique : aucune. Les tests end-to-end tournent sur le jeu de démonstration ; ce scénario est le seul passage qui exerce l'endpoint de période de bout en bout, et il est entièrement à jouer à la main.
14. Restreindre le périmètre de l'encadrant à ses établissements
Tickets : APAJH-243 · Rôle : encadrant, plus un accès au back-office pour préparer le rôle · Prérequis : ceux de la section
Ce que l'écran affiche dépend du périmètre du lecteur : les services de ses établissements, et eux seuls. Ce périmètre est donné par ses rôles d'encadrement — un rôle « Salarié », que chaque compte possède et qui ne porte jamais d'établissement, n'ouvre plus rien.
Ouvrez Activité ▸ Planning sans filtre. Notez la liste des bandeaux et l'établissement annoncé par l'un d'eux, disons É1.
✅ Résultat attendu : les services de toute l'association sont là. Le compte ne porte aucun rôle d'encadrement restreint : « vide = toute l'association ».
Ouvrez le back-office (
/admin), puis Rôles ▸ Rôles. Ouvrez la ligne du rôle Manager n1 de votre compte et renseignez Établissements avec É1 seul. Enregistrez. Ne touchez pas au rôle « Salarié » du même compte.✅ Résultat attendu : le rôle est enregistré avec un établissement.
Revenez sur Activité ▸ Planning et rechargez avec Ctrl + Maj + R.
✅ Résultat attendu : il ne reste que les bandeaux des services rattachés à É1 ; ceux des autres établissements ont disparu, et avec eux leurs lignes de salariés. Le rôle « Salarié » du compte, sans établissement, n'élargit rien : c'est précisément ce que ce ticket corrige — il ouvrait auparavant toute l'association et le périmètre du rôle Manager restait sans effet.
Retournez sur le rôle et ajoutez un second établissement, É2. Rechargez l'écran.
✅ Résultat attendu : les bandeaux des deux établissements sont là. Un service transverse, rattaché à la fois à É1 et à É2, apparaît une seule fois : un établissement partagé suffit à le rendre visible, il ne le dédouble pas.
Videz la liste Établissements du rôle, enregistrez, puis rechargez.
✅ Résultat attendu : tous les bandeaux sont revenus. Un rôle d'encadrement sans établissement vaut pour toute l'association — c'est la convention du modèle, et elle ne change pas.
Couverture automatique : backend/tests/test_roles.py et backend/tests/test_planning_calendar.py clouent la règle côté serveur, y compris le cas à quatre établissements du ticket. Rien côté end-to-end : le jeu de démonstration ne connaît ni compte, ni rôle, donc le périmètre ne s'observe qu'ici.
Ce que cette livraison ne couvre pas
Repris de la maquette et non livré. Ne l'ouvrez pas en anomalie :
- les écritures autres que la modulation d'une journée : publier, enregistrer une affectation, déclarer une absence ;
- l'export Excel / PDF ;
- la sélection multiple de cases, le choix d'une couleur par case, la bande d'évènements, l'ajout et la suppression de lignes ;
- les pictogrammes de case (télétravail, remplacement, transport) et les états de case (« demande en attente », « poste modifié ») : la légende les annonce, la grille ne les produit pas — une journée modulée ne se distingue pas à l'œil d'une journée de trame ;
- les absences (CA, MAL, RC…) et un repos décidé hors trame : ni la trame ni la modulation ne savent en produire, donc ils ne s'observent qu'en mode démonstration ;
- la ligne de couverture en pied de grille et les jours fériés grisés : ils ne sont pas non plus dans la maquette ;
- les vues Absences et Planning réalisé, ainsi que Mon planning et Mon équipe de l'espace salarié.