Apparence
Bibliothèque ▸ Trames — assistant de planification
Le bouton Enregistrer et créer un planning de l'éditeur de trame ouvre un assistant en trois étapes (Trame / Date / Salariés) qui rattache la trame enregistrée à des salariés réels, datés.
Prérequis communs : make seed-demo, make seed-postes puis make seed-trames. Ce chapitre suppose en plus un service et des salariés déjà affectés à ce service — voir chaque scénario pour les seeds précises.
1. « Enregistrer et créer un planning » ouvre l'assistant sur l'étape Date
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo, make seed-postes puis make seed-trames
Ouvrez Bibliothèque ▸ Trames, cliquez sur Éditer sur une trame, puis sur Enregistrer et créer un planning.
✅ Résultat attendu : l'assistant s'ouvre en pleine page sur l'étape Date, avec l'aperçu du cycle de la trame et la Reconduction tacite décochée par défaut.
Couverture automatique : e2e/planning-wizard.spec.ts → « « Enregistrer et créer un planning » ouvre le wizard sur l'étape Date ».
2. L'équipe par défaut pré-remplit la liste des salariés, non cochés
Tickets : APAJH-119 · Rôle : Admin · Prérequis : un service dont l'établissement correspond au périmètre du compte connecté, avec des salariés déjà affectés dessus
Depuis l'étape Date, cliquez sur Suivant ›.
✅ Résultat attendu : l'étape Salariés affiche le filtre Équipe déjà positionné sur les services du périmètre du compte (résumé « équipe +N » plutôt qu'une étiquette par équipe), et la liste des salariés qui y sont affectés — aucun coché : planifier quelqu'un reste toujours un choix délibéré, jamais un effet de bord du filtre présélectionné.
Couverture automatique : e2e/planning-wizard.spec.ts → « l'équipe par défaut pré-remplit le roster, non coché ».
3. Cocher ou décocher une équipe met à jour la liste immédiatement
Tickets : APAJH-119 · Rôle : Admin · Prérequis : comme le scénario 2, avec au moins deux services dans le périmètre
À l'étape Salariés, cochez un salarié affiché, puis décochez une des équipes du filtre Équipe.
✅ Résultat attendu : les salariés de l'équipe décochée disparaissent de la liste, sauf celui déjà coché — un salarié sélectionné ne disparaît jamais d'un changement de filtre.
Couverture automatique : e2e/planning-wizard.spec.ts → « cocher un établissement met à jour la liste en direct ».
4. Équipes et recherche libre restent dans le périmètre du rôle
Tickets : APAJH-119 · APAJH-288 · Rôle : Manager n1 restreint à quelques établissements · Prérequis : comme le scénario 2, plus un salarié du périmètre affecté à aucune équipe du filtre, un salarié hors du périmètre, et une équipe d'un établissement hors du périmètre
À l'étape Salariés, ouvrez le filtre Équipe.
✅ Résultat attendu : il ne propose que les équipes des établissements du périmètre du rôle — jamais celle de l'établissement hors périmètre, même si le compte y a une fiche salarié.
Saisissez le nom du salarié du périmètre dans Ajouter un salarié, puis cochez sa case dans la liste qui s'affiche.
✅ Résultat attendu : le salarié apparaît dans la liste, et reste coché même une fois la recherche effacée.
Saisissez le nom du salarié hors du périmètre.
✅ Résultat attendu : « Aucun résultat » — la recherche ne sort pas du périmètre du rôle.
Couverture automatique : e2e/planning-wizard.spec.ts → « ajouter un salarié par recherche l'intègre au roster » et « les équipes et les salariés hors du périmètre du manager n'apparaissent jamais ».
5. Une recherche sans correspondance l'indique clairement
Tickets : APAJH-119 · Rôle : Admin · Prérequis : comme le scénario 2
À l'étape Salariés, saisissez dans Ajouter un salarié un texte qui ne correspond à personne.
✅ Résultat attendu : la liste affiche « Aucun résultat » — sans ce message, une recherche sans nouveauté (par exemple sur quelqu'un déjà coché) paraît identique à un champ qui ne répond pas.
Couverture automatique : e2e/planning-wizard.spec.ts → « chercher un nom qui ne correspond à personne affiche « Aucun résultat » » et « la recherche de salarié fonctionne aussi par nom d'utilisateur ».
6. Valider envoie une planification par salarié coché
Tickets : APAJH-119 · Rôle : Admin · Prérequis : comme le scénario 2
À l'étape Salariés, cochez un salarié de la liste.
Cliquez sur ✓ Valider et intégrer au planning.
✅ Résultat attendu : l'assistant se referme, la bibliothèque de trames réaffiche ses cartes, et un message confirme le nombre de salariés planifiés — un seul, celui coché.
Couverture automatique : e2e/planning-wizard.spec.ts → « valider envoie une affectation par salarié coché et revient à la bibliothèque ».
7. La liste des salariés est paginée au-delà de 10
Tickets : APAJH-119 · Rôle : Admin · Prérequis : un service du périmètre avec plus de 10 salariés affectés
À l'étape Salariés, observez la liste puis passez à la page suivante.
✅ Résultat attendu : 10 salariés par page au maximum, avec un « Page X sur N » et une pagination fonctionnelle.
Couverture automatique : e2e/planning-wizard.spec.ts → « la pagination limite le roster à 10 salariés et tourne les pages ».
8. « ‹ Retour » referme l'assistant sans rien planifier
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo, make seed-postes puis make seed-trames
Ouvrez l'assistant, puis cliquez sur ‹ Retour en haut de l'écran, sans valider.
✅ Résultat attendu : retour à la bibliothèque de trames, sans message de confirmation ni salarié planifié — la trame reste enregistrée telle quelle.
Couverture automatique : e2e/planning-wizard.spec.ts → « « ‹ Retour » referme le wizard sans planifier personne ».
9. Consulter l'assistant sur téléphone
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo, make seed-postes puis make seed-trames
En 390 × 844, ouvrez l'assistant depuis l'éditeur de trame.
✅ Résultat attendu : l'assistant défile dans son cadre ; la page elle-même ne déborde pas.
Couverture automatique : e2e/planning-wizard.spec.ts → « mobile : le wizard défile au lieu de déborder de la page ».
10. Planifier quelqu'un déjà planifié sur la période affiche une alerte
Tickets : APAJH-119 · Rôle : Admin · Prérequis : comme le scénario 6, avec un salarié déjà planifié pour tout ou partie de la période choisie ici (par exemple planifié une première fois via le scénario 6 lui-même)
À l'étape Salariés, cochez un salarié déjà planifié sur une période qui chevauche celle de cet assistant — même un seul jour en commun suffit.
Cliquez sur ✓ Valider et intégrer au planning.
✅ Résultat attendu : avant tout envoi, une alerte de confirmation liste le salarié, la période et la trame déjà planifiées, ainsi que qui les a appliquées. Annuler referme l'alerte sans rien envoyer, le wizard reste ouvert tel quel.
Recommencez et confirmez avec Planifier malgré tout.
✅ Résultat attendu : l'affectation part comme au scénario 6 — elle remplace l'ancienne planification sur les seuls jours qu'elles ont en commun (voir Planification).
Couverture automatique : e2e/planning-wizard.spec.ts → « un chevauchement de planning affiche une alerte avant de valider » et « confirmer malgré le chevauchement envoie tout de même l'affectation ».
11. « Travaille les jours fériés » se règle salarié par salarié
Tickets : APAJH-288 · Rôle : Admin · Prérequis : comme le scénario 6, avec une trame qui planifie un poste sur un jour de la semaine où tombe un jour férié de la période choisie (par exemple le 25/12)
À l'étape Salariés, regardez la case Travaille les jours fériés de chaque ligne.
✅ Résultat attendu : elle est décochée pour tous les salariés.
Cochez deux salariés, puis la case Travaille les jours fériés du second seulement, et cliquez sur ✓ Valider et intégrer au planning.
✅ Résultat attendu : les deux planifications partent, comme au scénario 6.
Ouvrez Activité ▸ Planning sur la semaine du jour férié.
✅ Résultat attendu : le premier salarié n'a aucun poste ce jour-là — un repos prévu par la trame reste affiché — alors que le second a le poste de sa trame. Un poste posé à la main sur ce férié (« Affecter un poste ») s'affiche quand même pour le premier.
Couverture automatique : e2e/planning-wizard.spec.ts → « les jours fériés se règlent par salarié, décochés par défaut » (et sa variante mobile) ; la résolution du calendrier est couverte par backend/tests/test_planning_calendar.py.
12. Deux versions d'une trame sur deux périodes successives
Tickets : APAJH-294 · Rôle : Admin · Prérequis : une trame et un salarié qui n'est planifié sur aucune
Planifiez le salarié sur la trame du 01/01 au 01/06 (scénario 6).
Rouvrez la trame avec Éditer, changez un poste, puis cliquez sur Enregistrer et créer un planning, et planifiez le même salarié du 02/06 au 31/12.
✅ Résultat attendu : aucune alerte de chevauchement. Dans Activité ▸ Planning, le salarié suit l'ancien contenu jusqu'au 01/06 et le nouveau à partir du 02/06 ; la bibliothèque ne montre qu'une trame.
Rouvrez la trame, cliquez sur Enregistrer sans rien changer.
✅ Résultat attendu : rien ne bouge dans le planning.
Planifiez de nouveau le salarié, sur une autre trame, à partir du 01/06.
✅ Résultat attendu : l'alerte de chevauchement s'affiche ; une fois confirmée, le salarié garde sa première trame jusqu'au 31/05 et suit la nouvelle à partir du 01/06.
Couverture automatique : backend/tests/test_planning_calendar.py, backend/tests/test_planning.py et backend/tests/trames/test_trames_library.py (versions, découpage des périodes, enregistrement sans changement).
13. Planifier un début à moins d'un mois le signale
Tickets : APAJH-181 · Rôle : Manager n1 · Prérequis : une trame et un salarié sous convention collective (pas un agent polyvalent)
Planifiez le salarié sur la trame en commençant dans deux semaines, puis cliquez sur Valider et intégrer au planning.
✅ Résultat attendu : le planning est créé, et la confirmation ajoute « Attention, 1 alerte à vérifier » (ou plus, si la trame en déclenche d'autres). Elle reste affichée 5 secondes.
Planifiez un autre salarié en commençant dans un mois ou plus.
✅ Résultat attendu : pas d'alerte due au délai.
La programmation de la modulation se communique un mois avant son entrée en vigueur (accord de branche 1/4/1999, art. 11.4 — R-K05/AL-L04), compté en 30 jours. L'application ne modélise pas la communication du planning : planifier la trame en est l'acte le plus proche. Une planification qui commence aujourd'hui est signalée ; un contrat hors convention collective n'a pas de modulation et ne l'est pas.
Couverture automatique : backend/tests/test_planning.py (bornes des 30 jours, contrat couvrant la trame sans alerte).
14. Une reconduction tacite reprend après un remplacement
Tickets : APAJH-326 · Rôle : Admin · Prérequis : deux trames d'une semaine aux postes différents, et un salarié en CDI planifié sur aucune
Planifiez le salarié sur la première trame à partir d'un lundi à venir, avec Reconduction tacite activée.
✅ Résultat attendu : le champ Nombre de tours disparaît, le planning est créé.
Planifiez le même salarié sur la seconde trame à partir du lundi suivant, 3 tours, sans reconduction tacite, et confirmez l'alerte de chevauchement avec Planifier malgré tout.
Ouvrez Activité ▸ Planning et avancez semaine par semaine.
✅ Résultat attendu : la première trame la première semaine, la seconde les trois suivantes — jusqu'au dimanche de la troisième inclus — puis la première trame de nouveau à partir du lundi, et toujours un an plus tard.
Couverture automatique : backend/tests/test_planning_calendar.py et backend/tests/test_planning.py (reprise après une planification bornée), et e2e/planning-wizard.spec.ts → « la reconduction tacite planifie sans date de fin », « trois tours finissent le dimanche du dernier tour » et « la date de début proposée est aujourd'hui en heure de Paris, même après minuit ».
Points d'attention
- L'étape Trame ne s'affiche jamais au démarrage. La trame vient d'être enregistrée par l'écran qui ouvre l'assistant ; l'étape n'est atteignable qu'en revenant en arrière dans le sélecteur d'étapes.
- Le résultat se voit jour par jour sur l'écran calendrier. Cet assistant écrit des planifications (« qui, sur quelle trame, depuis quand ») ; Planning manager les résout en journées. C'est même l'inverse qui est vrai pour une nouvelle fiche sans cycle. La cohorte de développement est déjà planifiée sur les deux années ; utiliser une fiche de recette supplémentaire pour vérifier une première affectation.
- Éditer le contenu d'une trame déjà planifiée en crée une version. Les planifications existantes gardent l'ancienne, dates comprises ; la bibliothèque ne montre que la nouvelle. Voir Planification.
- L'alerte de chevauchement (scénario 10) est un contrôle de l'application, pas une règle serveur. Le serveur continue de remplacer silencieusement (voir Planification) : c'est l'assistant qui vérifie, avant l'envoi, si la période chevauche une planification déjà connue du salarié coché — passée, en cours ou future, peu importe.
- Le périmètre est celui du rôle, et rien d'autre (APAJH-288). Le filtre Équipe et la recherche Ajouter un salarié lisent les équipes et les salariés du périmètre côté serveur (
?scope=perimeter), comme Bibliothèque ▸ Équipes. Les lieux de travail du compte n'y sont plus ajoutés : ils réduisaient un rôle sans établissement (toute l'association) à ses seules équipes. Un renfort venu d'un autre établissement se place depuis l'écran planning (« Poste à pourvoir »).