Apparence
Tableau de bord manager
Le tableau de bord /tableau-de-bord rassemble les évènements, l’astreinte personnelle et les éléments à traiter dans le périmètre du compte connecté.
Tickets : APAJH-89, APAJH-90, APAJH-323.
Prérequis communs : un compte manager, deux établissements avec des salariés, des évènements et une fiche salarié associée au manager. Pour les décisions, préparez une absence En attente au back-office : la déclaration du manager pour un autre salarié valide immédiatement l’absence et ne crée pas une demande à traiter.
1. Retrouver son accueil et son identité
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1
Connectez-vous et ouvrez Tableau de bord.
Vérifiez Bonjour suivi de votre prénom.
Copiez l’adresse
/tableau-de-bord, ouvrez-la dans un nouvel onglet et rechargez.✅ Résultat attendu : l’accueil manager et son identité restent affichés.
Couverture automatique : e2e/dashboard.spec.ts → « accès direct et rechargement conservent le dashboard et l’identité réelle ».
2. Consulter les évènements de la période
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1
Prévoyez un évènement en cours, un évènement terminé et un évènement au dernier jour de la période de 30 jours, aujourd’hui inclus.
Ouvrez Évènements à venir.
Comparez le compteur et le nombre d’évènements du panneau.
Ouvrez un évènement puis rechargez l’agenda. Revenez et utilisez Voir tous les évènements.
✅ Résultat attendu : les évènements encore en cours et ceux à venir sont classés chronologiquement ; les évènements terminés sont exclus. Chaque entrée indique son titre, ses dates, ses horaires ou Journée entière, son lieu, son responsable et le nombre de participants. Le lien retrouve le bon évènement et son mois dans l’agenda.
Couverture automatique : tests/test_dashboard.py ; e2e/dashboard.spec.ts → « le panneau évènements concorde avec le compteur et mène au bon agenda ».
3. Retrouver sa période complète d’astreinte
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1
Prévoyez une astreinte en cours et une autre à venir pour le manager connecté.
Ouvrez Prochaine astreinte.
Consultez les dates et horaires de début et de fin ainsi que les établissements couverts.
Ouvrez Voir les astreintes. Rejouez sur un téléphone de 320 pixels de largeur.
✅ Résultat attendu : l’astreinte en cours est prioritaire. À son terme exact, la suivante prend sa place. La période reste complète, même au-delà de 30 jours. Aucun poste, repos ou temps théorique n’est présenté comme un détail d’astreinte. Le lien ouvre le module Astreintes. Le focus revient à la tuile à la fermeture.
Couverture automatique : tests/test_dashboard.py ; e2e/dashboard.spec.ts → « l’astreinte présente sa période complète sans temps théorique — 1440 px », « l’astreinte présente sa période complète sans temps théorique — 320 px ».
4. Filtrer les éléments à traiter
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1
Préparez une absence en attente et un salarié en contrat actif sans matricule.
Dans À traiter, sélectionnez Absence et Forte.
Passez l’urgence à Information, puis la catégorie à Synchronisation.
Sélectionnez Modification, puis Permutation.
✅ Résultat attendu : les deux filtres se combinent. Chaque ligne indique une catégorie, un intitulé, le salarié et son établissement, une période ou date métier, et Information accompagné d’un pictogramme pour ces deux sources. Modification liste les demandes de modification en attente (scénario 16) ou annonce qu’aucun résultat ne correspond ; Permutation, non construite, indique son indisponibilité. Aucun seuil de couverture n’attribue artificiellement Bloquant ou Forte.
Couverture automatique : e2e/dashboard.spec.ts → « les filtres se combinent, les catégories absentes ne simulent pas de résultat ».
5. Consulter un dossier sans matricule paie
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1
Préparez un salarié sans matricule avec un contrat actif, un intérimaire sans matricule, un contrat futur et un contrat terminé.
Dans À traiter, ouvrez Matricule paie à renseigner.
Consultez Situation actuelle, Action attendue et Impact connu.
Cliquez sur Ouvrir la fiche.
✅ Résultat attendu : seul le salarié en contrat actif hors intérim apparaît. Le panneau retrouve sa fiche. L’absence de matricule n’est pas présentée comme un échec d’import CEGI.
Couverture automatique : tests/test_dashboard.py ; e2e/dashboard.spec.ts → « un dossier sans matricule ouvre sa fiche et n’est pas présenté comme un import échoué ».
6. Décider une demande réelle
Tickets : APAJH-89, APAJH-90, APAJH-273 · Rôle : Manager n1 habilité à décider
Ouvrez Demandes en attente, puis cliquez sur la ligne de la demande.
Vérifiez l’identité, l’établissement, les dates et l’impact connu de l’absence.
Validez la demande. Avec une seconde demande, choisissez Refuser, renseignez un commentaire puis Confirmer le refus.
✅ Résultat attendu : une décision acceptée ferme le panneau et actualise les compteurs et la liste. Une déclaration déjà validée n’y figure pas.
Sur un congé accordé dont le salarié a demandé l’annulation (scénario 26 d’Absences), retrouvez la demande dans À traiter.
✅ Résultat attendu : elle est comptée dans Demandes en attente et listée « Demande d’annulation — Congés annuels », pastille « Annulation » dans le panneau de la tuile. Un clic ouvre « Annulation à arbitrer », avec « Accorder l’annulation » et « Refuser ».
Couverture automatique : tests/absences/test_absences_workflow.py, tests/test_dashboard.py ; e2e/dashboard.spec.ts → « le compteur et la liste sont actualisés seulement après une décision réussie », « un refus conserve le motif après erreur puis retire la demande », « APAJH-273 — une annulation demandée est à traiter et s’arbitre d’ici — 1440 px », « … — 390 px ».
7. Conserver le contexte en cas d’erreur ou de concurrence
Tickets : APAJH-89, APAJH-90 · Rôle : deux managers habilités
Ouvrez la même demande dans deux sessions.
Décidez dans la première, puis tentez une décision dans la seconde.
Sur une autre demande, interrompez la connexion lors de la décision, puis rétablissez-la et réessayez.
✅ Résultat attendu : la demande déjà traitée affiche son état actuel sans seconde décision. Une erreur conserve le panneau et le motif saisi, affiche un message et permet de réessayer ; elle n’affiche jamais une réussite.
Couverture automatique : tests/absences/test_absences_workflow.py ; e2e/dashboard.spec.ts → « une décision concurrente recharge l’état et ne propose pas une seconde décision », scénarios d’erreur de validation et de refus.
8. Distinguer chargement, vide, indisponibilité et erreur
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1
Ouvrez le dashboard avec un réseau lent, puis sans éléments à traiter.
Sur une liste remplie, appliquez un filtre sans correspondance.
Rendez un seul bloc injoignable et consultez les autres.
Rétablissez le service et utilisez Réessayer sur le bloc concerné.
✅ Résultat attendu : Chargement, absence d’éléments, absence de résultat filtré, indisponibilité fonctionnelle et erreur sont distincts. Une panne ne bloque pas les autres blocs. Aucun historique d’import ne produit une date fictive.
Couverture automatique : e2e/dashboard.spec.ts → scénarios « les sources vides… », « le chargement et une panne… », « une source à traiter en panne… ».
9. Contrôler les droits et le périmètre
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1, DA, Service Paie, Salarié
Connectez-vous avec un manager restreint au premier établissement.
Vérifiez l’absence des dossiers et demandes du second établissement ; les évènements transversaux restent visibles comme dans l’agenda.
Avec un DA, ouvrez une demande en lecture seule.
Avec Service Paie, consultez la tuile Demandes en attente.
Avec un salarié, ouvrez directement
/tableau-de-bord.✅ Résultat attendu : le DA lit sans décider ; Service Paie voit Indisponible, pas un faux zéro ; le salarié revient à son espace. Les API refusent les mêmes accès et l’astreinte détaillée reste personnelle.
Couverture automatique : tests/test_dashboard.py, tests/absences/test_absences_workflow.py ; e2e/dashboard.spec.ts → scénarios de droits.
10. Utiliser le dashboard sur téléphone et au clavier
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1
Ouvrez et rechargez le dashboard en 320 puis 390 pixels de largeur.
Ouvrez chaque panneau. Naviguez avec Tab et Maj+Tab ; fermez avec Échap ou Fermer.
Validez une demande puis vérifiez la position du focus.
Ouvrez le menu et basculez entre Mon espace et Manager.
✅ Résultat attendu : le manager conserve son écran, sans défilement horizontal. Le focus entre dans le panneau, y reste durant la navigation et revient au déclencheur à la fermeture, ou au titre À traiter si la ligne a disparu après traitement. Le menu permet une bascule explicite d’espace.
Couverture automatique : e2e/dashboard.spec.ts → « mobile 320 px… », « mobile 390 px… », scénarios de décisions.
11. Lire le dernier fichier paie importé
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1
Préparez plusieurs fichiers traités lors d’un même passage d’import, dont deux réussites dans le périmètre du manager.
Ajoutez une tentative rejetée plus récente et une réussite hors périmètre.
Consultez le dashboard, puis un périmètre sans historique de réussite.
✅ Résultat attendu : la date de fin du dernier fichier réussi dans le périmètre est affichée en heure de Paris. Elle ne représente pas la fin d’un passage complet. Sans historique, un message explicite remplace la date.
Couverture automatique : tests/test_dashboard.py ; e2e/dashboard.spec.ts → scénarios d’identité et d’absence d’historique.
12. Parcourir la liste défilante et le menu d’urgence
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1 · Prérequis : au moins vingt éléments à traiter
Ouvrez le dashboard sur ordinateur puis sur un téléphone de 320 pixels de largeur.
Vérifiez les trois tuiles vert foncé et le bloc blanc À traiter.
Ouvrez Toutes urgences au clavier et sélectionnez Information.
Choisissez Synchronisation, puis faites défiler la liste jusqu’au dernier dossier.
Ouvrez son détail avec Entrée et fermez avec Échap.
Ouvrez Demandes en attente et parcourez la liste jusqu’à la dernière demande.
✅ Résultat attendu : les filtres restent au-dessus de la liste défilante. Chaque ligne présente un pictogramme, son contexte, sa période, le badge Information. La ligne entière ouvre le détail au clic ou avec Entrée, sans bouton supplémentaire. Le menu affiche les quatre urgences avec un repère visuel et un libellé. Le dernier élément reste accessible au clavier, le focus revient au déclencheur et aucun défilement horizontal n’apparaît. L’en-tête du panneau reste visible pendant son défilement.
Couverture automatique : e2e/dashboard.spec.ts → « présentation 1440 px : liste défilante et menu d’urgence au clavier », « présentation 320 px : liste défilante et menu d’urgence au clavier ». La comparaison visuelle avec la maquette reste à rejouer à la main.
13. Retrouver les alertes du planning et combiner leurs filtres
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1
Préparez dans le périmètre du manager un cumul hebdomadaire supérieur à 44 h (35 h pour un salarié hors CCN-66 sur toute la semaine), un repos inférieur à 11 h et une amplitude supérieure à 13 h sur les 30 jours à venir, aujourd’hui inclus. Conservez également une demande d’absence et un dossier sans matricule. Ces seuils sont ceux du moteur du planning.
Ouvrez Tableau de bord, puis À traiter.
Sélectionnez Planning et Forte, puis Absence en gardant Forte.
Rejouez sur un écran de 320 px.
✅ Résultat attendu : les alertes concordent avec Planning sur la même période. Bloquant précède Forte, puis Information ; les dates sont croissantes dans chaque niveau. Chaque badge comprend un libellé et un pictogramme. Planning et Forte montrent le repos et l’amplitude. Absence et Forte affichent Aucun résultat pour ces filtres. Le compteur des demandes reste réservé aux absences en attente de décision — demandes et, depuis APAJH-273, annulations demandées (recette des absences, scénario 26). Aucun salarié hors périmètre ni doublon entre équipes n’apparaît.
Couverture automatique : tests/test_dashboard.py ; e2e/dashboard-alerts.spec.ts → « alertes 1440 px : priorités, filtres combinés et panneau accessible », « alertes 320 px : priorités, filtres combinés et panneau accessible ».
14. Ouvrir le bon planning et vérifier la correction
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1
Ouvrez une alerte de planning au clavier et consultez le salarié, son établissement, la date et l’anomalie constatée.
Fermez le panneau avec Échap, puis rouvrez-le et choisissez Voir au planning.
Essayez une correction refusée par l’API et revenez au dashboard.
Enregistrez ensuite une correction qui supprime l’anomalie et revenez au dashboard.
✅ Résultat attendu : Échap rend le focus à la ligne. Le lien ouvre la semaine et le salarié concernés. L’échec conserve l’alerte ; la correction réussie actualise la liste et la retire si le calcul ne la produit plus. La seule ouverture du planning ne résout rien. Le panneau reste utilisable sur mobile.
Couverture automatique : tests/test_dashboard.py ; e2e/dashboard-alerts.spec.ts → « le retour du planning actualise les alertes selon la correction refusée », « le retour du planning actualise les alertes selon la correction enregistrée ».
15. Conserver les autres sources lorsque les alertes sont indisponibles
Tickets : APAJH-89, APAJH-90 · Rôle : Manager n1
Retardez la réponse des alertes de planning, puis faites-la échouer.
Consultez les demandes et les dossiers paie pendant cette panne.
Rétablissez le service et choisissez Réessayer — les alertes de planning.
✅ Résultat attendu : le chargement et l’erreur sont distincts, les autres sources restent consultables et aucune liste vide globale n’est annoncée. Réessayer restaure les alertes. La mention des trois familles disponibles reste visible ; les règles absentes du référentiel ne sont ni simulées ni comptées.
Couverture automatique : e2e/dashboard-alerts.spec.ts → « une panne des alertes conserve les demandes et permet de réessayer ».
16. Trancher une demande de modification de journée
Tickets : APAJH-323 · Rôle : Manager n1 habilité à décider
Avec un salarié du premier établissement, déposez une demande de modification d’un jour à venir (scénario 5 de Demandes de modification), et gardez une demande d’absence en attente.
Connectez-vous en Manager n1 et ouvrez le tableau de bord.
Ouvrez la tuile Demandes en attente, puis fermez-la.
Dans À traiter, sélectionnez la catégorie Modification et ouvrez la ligne.
Choisissez Refuser, renseignez un motif puis Confirmer le refus.
✅ Résultat attendu : la tuile compte les deux demandes, et son panneau les liste l’une sous « Absence », l’autre sous « Modification ». Sous Modification, la ligne s’intitule « Demande de modification — » suivi du motif, porte le jour demandé et ouvre « Demande à arbitrer » sur la journée actuelle et la journée demandée. Le refus ferme le panneau, retire la ligne et décompte la tuile. Une demande d’un salarié du second établissement n’apparaît pas. Sur téléphone, le panneau tient dans la largeur de l’écran.
Toujours en Manager n1 rattaché au premier établissement, déposez vous-même une demande de modification depuis « Mon espace », puis revenez au tableau de bord.
✅ Résultat attendu : votre propre demande n’apparaît ni dans À traiter ni dans la tuile : vous ne pouvez pas la trancher. Elle apparaît chez un autre décideur de l’établissement.
Couverture automatique : tests/test_dashboard.py ; e2e/dashboard.spec.ts → « APAJH-323 — une demande de modification est à traiter et se tranche d’ici — 1440 px », « … — 390 px ».