Apparence
Bibliothèque Postes
La bibliothèque de postes d'un encadrant (/postes, Bibliothèque ▸ Postes) : un catalogue de modèles d'horaires réutilisables pour bâtir les roulements.
Prérequis communs : make seed-demo, puis make seed-postes — qui donne au compte de démonstration une bibliothèque couvrant les cinq catégories.
Ce qui distingue cet écran des autres référentiels
Un poste n'est pas partagé. Il appartient au compte qui l'a créé, comme une liste de favoris personnelle — là où les établissements ou les types de contrat sont communs à toute l'association. Deux conséquences à vérifier, parce qu'aucune n'est visible sur un seul écran :
- personne ne voit la bibliothèque d'un autre,
is_staffcompris ; - il n'y a pas de portée par établissement : un encadrant qui construit des roulements sur plusieurs établissements garde une seule bibliothèque.
Le Code (JM, AM, JS, NS, CP) n'est pas saisi : il découle de la catégorie. Rien à taper, rien qui puisse entrer en collision.
1. Lire la bibliothèque et filtrer par catégorie
Tickets : APAJH-114 · Rôle : encadrant (compte de démonstration) · Prérequis : make seed-postes
Ouvrez Bibliothèque ▸ Postes.
✅ Résultat attendu : un tableau à six colonnes — Code, Libellé, Horaires, Pause, Durée nette, et les actions de ligne. Dix postes — deux par catégorie — dont les deux du matin portent tous deux le code JM.
Cliquez sur la puce de catégorie Matin, puis sur Tous.
✅ Résultat attendu : la liste se réduit aux seuls postes du matin, puis revient complète.
Créez un onzième poste (scénario 2), puis descendez en bas du tableau — la pagination ne se déclenche qu'au-delà de dix.
✅ Résultat attendu : dix lignes par page, la mention Page 1 sur N, et Page précédente désactivée sur la première page comme Page suivante sur la dernière.
2. Créer un poste de nuit
Tickets : APAJH-114 · Rôle : encadrant · Prérequis : aucun
C'est le scénario qui compte : un poste de nuit franchit minuit, et la maquette d'origine avait oublié la catégorie « Nuit » dans son formulaire alors que sa propre bibliothèque affichait déjà un poste NS. L'omission n'a pas été reproduite.
Créer un poste → catégorie Nuit, début 21:00, fin 07:00.
✅ Résultat attendu : l'encart de synthèse affiche Temps travaillé 10h00 — avant même d'enregistrer, et surtout pas une durée négative.
Enregistrer.
✅ Résultat attendu : une nouvelle ligne Nuit, code NS, durée nette 10h00.
Rouvrez le formulaire et donnez à un poste la même heure de début et de fin.
✅ Résultat attendu : refus avec « L'heure de fin doit différer de l'heure de début. » Un horaire qui franchit minuit reste, lui, parfaitement légitime.
3. Éditer, dupliquer, supprimer
Tickets : APAJH-114 · Rôle : encadrant · Prérequis : make seed-postes
Sur la ligne Matin, Éditer, passez la catégorie à Soir, puis Enregistrer.
✅ Résultat attendu : la ligne devient Soir et son code passe de JM à JS. Le nombre de lignes ne change pas.
Dupliquer un poste.
✅ Résultat attendu : le panneau s'intitule Créer un poste — c'est bien une création — et il arrive pré-rempli avec la catégorie et les horaires du poste d'origine. Après Enregistrer, l'original est toujours là, à côté de son doublon.
Supprimer le poste, puis Annuler dans la confirmation.
✅ Résultat attendu : rien n'est supprimé. Confirmer, en revanche, retire la ligne.
4. Vérifier le cloisonnement entre bibliothèques
Tickets : APAJH-114 · Rôle : deux comptes différents, dont un is_staff · Prérequis : make seed-postes sur le compte de démonstration
Aucun test end-to-end ne couvre ce scénario — les specs tournent sur un seul compte — et c'est pourtant la règle centrale du domaine.
Connectez-vous avec un autre compte que celui qui a joué
make seed-postes, et ouvrez Bibliothèque ▸ Postes.✅ Résultat attendu : une bibliothèque vide. Les postes de l'autre compte n'apparaissent pas.
Recommencez avec un compte
is_staff(par exemple depuis le back-office).✅ Résultat attendu : vide également. Le statut
is_staffest le droit d'écriture sur les référentiels partagés ; il ne donne aucune vue sur la bibliothèque personnelle d'autrui.
Couverture automatique : e2e/postes.spec.ts couvre la liste, le filtre, la pagination, la création d'un poste de nuit, l'édition, la duplication, la suppression avec confirmation, et le tableau sur mobile. Côté serveur, backend/tests/test_postes.py couvre le calcul de la durée nette, le franchissement de minuit et le cloisonnement par compte — c'est-à-dire la moitié serveur du scénario 4.
Points d'attention
- Le code n'est jamais saisi. S'il ne correspond pas à la catégorie, le défaut est dans la table de correspondance, pas dans la saisie.
- La maquette se contredit sur ces codes : sa bibliothèque affiche
AMpour Après-midi, son gestionnaire d'enregistrement en dériveAP. Ce sont les codes affichés qui font foi. - Les tests end-to-end tournent sans backend : ils prouvent que l'interface se comporte comme l'API le lui annonce, pas que l'API applique le cloisonnement. Les deux volets sont à vérifier — le scénario 4 est là pour ça.