Apparence
Annualisation
Le relevé présente le planning de l'année et le Solde annuel prévisionnel : heures reconstituées à date + heures prévues restantes − réserve de congés + corrections RH − objectif annuel. Sur ordinateur, le relevé présente une grille : jours en lignes, douze mois en colonnes, théorique et réalisé, absences, fériés et synthèses mensuelles. Sur téléphone, la grille est masquée, côté manager comme dans Mon espace : le bandeau, l'année, l'état du relevé et le récapitulatif restent affichés. Les intérimaires et les agents polyvalents, dont le contrat n'est jamais annualisé, ne figurent pas dans la liste.
Jeu de développement sur deux années
La population de référence inclut Camille Annualisation (annualization.demo, mot de passe initial demo1234), CDI annualisé de 35 h au FAM, avec l'IME comme lieu secondaire. Avec --reference-date 2026-10-07, les deux années 2025 et 2026 sont couvertes. Les droits paie synthétiques définitifs fournissent 30 jours de CP en base ouvrable ; les fériés et les acquisitions alimentent le calcul réel de l'objectif annuel. Aucun objectif ni solde d'annualisation n'est inscrit artificiellement.
Pour chaque année passée jusqu'à juin, le mercredi de la semaine sans férié la plus proche du 10 juin porte 8 h déclarées pour 7 h prévues, et le jeudi 6 h pour 7 h prévues : les écarts sont +1 h puis −1 h. Maladie et absence non rémunérée, congés accordés et demandes en attente permettent de vérifier les autres composantes. Les anomalies hebdomadaires sont des modulations distinctes et participent aussi au calcul annuel. Le solde dépend de la date de consultation, des droits paie, des absences et des modifications faites pendant la recette.
seed_all écrit les sources ; prepare_demo_calculations produit acquisitions, mouvements et soldes. Un replay conserve les corrections locales et les décisions. Le reset explicite décrit dans les prérequis les efface.
1. Ouvrir un relevé depuis la liste
Tickets : APAJH-61, APAJH-81
Rôle : manager ou RH. Préparation : deux salariés dans des établissements et équipes différents, avec contrats, planning et soldes annuels ouverts.
Ouvrez Compteurs ▸ Annualisation dans l'espace Manager.
Vérifiez les mêmes colonnes que dans Utilisateurs : avatar, identité, fonction, établissement, équipe, contrat, ETP, ancienneté et annualisation. Recherchez un nom puis utilisez Filtrer par établissement.
✅ La recherche conserve une largeur permettant de saisir et lire un nom. Les filtres restent séparés et passent à la ligne lorsque la place manque, sur téléphone, tablette et ordinateur. Effacer la recherche vide la recherche ; Réinitialiser enlève aussi les filtres. Le nombre de résultats est affiché. La page ne propose ni filtre équipe, ni tuiles, ni création de salarié.
Choisissez l'année et cliquez sur la ligne. Revenez par ‹ Annualisation, puis ouvrez la ligne au clavier avec Entrée ou Espace.
✅ La liste conserve uniquement les salariés correspondant aux filtres. Le relevé affiche le nom choisi, l'année et la date d'arrêté. Son seuil et son solde prévisionnel correspondent à ceux de la fiche salarié, onglet Compteurs. Le retour conserve l'année dans l'adresse. Les en-têtes permettent le tri.
Rejouez sur téléphone.
✅ Les commandes restent accessibles. Le relevé ne présente pas la grille (scénario 17). La page entière ne déborde pas.
2. Vérifier les jours et les synthèses
Tickets : APAJH-61, APAJH-81
Rôle : manager ou RH. Préparation : une année bissextile, un repos défini dans une trame, une journée sans planification, un férié et une absence validée.
Ouvrez le relevé et repérez le 29 février, puis le 31 avril.
Comparez les journées de travail, de repos, sans planification et d'absence.
Ouvrez Récapitulatif mensuel, puis consultez Récap global et Compteurs.
✅ Le 29 février existe, le 31 avril reste vide. Un repos porte R ; une absence de planification porte —. Le numéro d'un jour férié est entouré d'une pastille turquoise. Les samedis et dimanches portent un fond discret et leur initiale est renforcée. Un férié tombant le week-end conserve sa pastille. Un zéro porte aussi — dans la grille et le récapitulatif mensuel. Le réalisé provisoire porte une étoile : —* pour zéro heure estimée. Les heures déclarées ne la portent pas. Si des heures sont travaillées, RÉ affiche leur valeur ; une bordure ambre signale l'absence et son motif apparaît au survol. Sans temps travaillé, RÉ affiche le code du congé ou de l'absence (y compris ABR et ABNR). Une absence future sans réalisé conserve son code. Les montants de compteurs proviennent de l'API dans leur unité réelle.
✅ Les douze mois reprennent les calendriers compacts de la maquette manager : colonnes J / TH / RÉ, numéro et initiale du jour, théorique clair, réalisé turquoise pâle et bordure ambre sur le réalisé en cas d'absence. Les mois sont séparés par des espaces. Aucune ligne de détail n'est ajoutée sous TH/RÉ.
3. Valider, corriger et annuler une absence
Tickets : APAJH-61, APAJH-81
Rôle : RH. Préparation : salarié annualisé à 35 h, trois journées consécutives de 7 h, absence non rémunérée, seuil initial connu.
Validez l'absence avant son début et consultez le relevé.
✅ Les trois journées affichent immédiatement l'absence. Le solde prévisionnel reste inchangé ; le seuil initial reste inchangé.
Dans l'environnement de test daté, avancez successivement au premier, deuxième puis troisième jour. Consultez le relevé après chaque avance.
✅ Les ABNR à date progressent de 7 h, puis 14 h, puis 21 h, et entrent dans le reconstitué. Les heures positives et négatives progressent ensemble, sans créer de déficit au planning. Les heures rémunérées excluent les ABNR. La consultation rattrape les échéances même si la tâche nocturne n'a pas tourné.
Corrigez la période, puis annulez ou refusez l'absence depuis le service métier.
✅ Seules les contributions remplacées sont compensées. L'annulation ou le refus enlève l'impact entier. Une répétition identique n'ajoute aucun mouvement. La validation, les mouvements et la reprise sont dans une même transaction : une erreur annule ensemble toutes les écritures.
Rejouez avec une absence rémunérée, une demi-journée et une absence horaire.
✅ ABR et ABNR reconstituent les créneaux prévus couverts, pauses non payées déduites. Une journée de 8 h vaut 8 h ; une demi-journée en vaut la moitié, 4 h, et laisse 4 h de travail provisoire — la première moitié du temps travaillé pour un matin, la dernière pour un après-midi, où que tombe midi (APAJH-289). Une absence horaire retient l'intersection avec les créneaux. Un poste de nuit reste rattaché à son jour de départ. Sans planning couvert, aucune heure d'absence n'est inventée. Les compteurs de congés gardent leur propre décompte.
4. Vérifier la fraîcheur sans rechargement manuel
Tickets : APAJH-61, APAJH-81
Rôle : manager ou RH.
Consultez un relevé puis revenez à la liste.
Modifiez une absence ou une correction autorisée par l'API.
Revenez au relevé, puis à l'onglet Compteurs de la fiche, dans les 30 secondes.
Rejouez en changeant d'onglet navigateur puis en revenant au premier plan.
✅ Chaque consultation et retour au premier plan relit les données. Le solde visible correspond à l'écriture terminée. Aucun clic de recalcul ni rechargement manuel n'est nécessaire. Un écran laissé ouvert dans une autre session ne reçoit pas de rafraîchissement périodique.
5. Consulter son relevé personnel et les états incomplets
Tickets : APAJH-61, APAJH-81
Rôle : salarié.
Ouvrez Annualisation depuis Mon espace ▸ Mes compteurs.
✅ Le relevé appartient au compte connecté. Aucun sélecteur de salarié ni lien vers la liste manager ne permet de choisir autrui. L'API refuse également la lecture d'un autre dossier au salarié sans rôle d'annuaire.
Rejouez avec un compte sans dossier, un contrat non annualisé, une année sans calendrier de fériés et une année dont le seuil n'a pas encore été initialisé.
✅ Chaque état porte un message distinct. Un seuil absent s'affiche —, jamais comme un zéro calculé. La lecture ne crée aucun seuil.
Simulez une réponse retardée puis une erreur réseau.
✅ Le chargement et l'erreur sont annoncés distinctement. Aucune donnée manquante n'est présentée comme un solde nul.
6. Reprendre des données existantes
Tickets : APAJH-61, APAJH-81
Rôle : administrateur. Préparation : absence déjà présente, correction RH journalisée, contrat et planning affectant le même exercice.
Corrigez le contrat dans le formulaire imbriqué du compte, puis une modulation et ses créneaux. Modifiez ensuite l'effet d'un type d'absence, y compris Sans effet.
✅ La reprise intervient après l'enregistrement des formulaires complets. L'objectif automatique suit le contrat ; l'objectif RH et les corrections restent conservés. Une modulation seule ne modifie jamais l'objectif.
Exécutez deux fois
python manage.py reconcile_annualization --employee <id> --year <année>dans le conteneur backend.✅ La première exécution reprend les contributions anciennes et les montants manuels. La seconde n'ajoute aucune révision si les contributions sont identiques. Un solde ouvert tardivement reprend les sources déjà présentes.
Couverture automatique : backend/tests/test_annualization_report.py, backend/tests/test_annualization_updates.py, backend/tests/test_annualization_admin.py, backend/tests/test_annualization_projection.py et backend/tests/test_counter_integration.py contrôlent le calcul, les transactions, les permissions, les reprises et la concurrence MySQL. e2e/annualisation.spec.ts contrôle la navigation et la présentation desktop/mobile avec réponses API simulées. Ces tests navigateur complètent les tests serveur ; ils ne remplacent pas la vérification d'intégration sur les données de recette.
7. Identifier le dossier du compte connecté
Tickets : APAJH-82 · Rôle : salarié ou RH.
Critères d'acceptation du ticket
- Les deux portails utilisent les mêmes API de relevé et de compteurs.
- Le compte connecté reçoit son identifiant de dossier, distinct de son identifiant de compte.
- Un salarié ne peut ni lire les compteurs d'autrui ni modifier les siens.
Connectez-vous avec un compte dont les identifiants de compte et de dossier diffèrent.
Consultez la réponse de Votre profil (
GET /api/auth/me/) dans les outils réseau.✅
employee_iddésigne uniquement votre dossier. Pour un compte sans dossier, sa valeur estnull. Un rôle RH ne change pas ce rattachement personnel.
Couverture automatique : backend/tests/test_auth.py, backend/tests/test_annualization_report.py et backend/tests/test_counters.py.
8. Consulter son annualisation sur téléphone et ordinateur
Tickets : APAJH-83 · Rôle : salarié ou RH dans Mon espace.
Critères d'acceptation du ticket
- Sur téléphone, le récapitulatif et les compteurs s'affichent ; la grille est masquée (APAJH-269).
- Sur ordinateur, la grille commune précède le récapitulatif.
- Les valeurs proviennent intégralement des API partagées et restent en lecture seule.
Ouvrez Mon espace ▸ Mes compteurs ▸ Annualisation sur téléphone.
Consultez Récap global, sa date d'arrêté et Mes compteurs en dessous.
✅ Les heures à effectuer, effectives, rémunérées, non payées et le solde correspondent au relevé API. La grille reste consultable sur téléphone. Les heures majorées et le nombre annuel de jours travaillés ne sont pas affichés. La grille n'est pas affichée sur téléphone.
Cliquez sur le bouton portant l'année, changez l'Année dans la fenêtre qui s'ouvre, puis ouvrez la même adresse sur ordinateur.
✅ Le récapitulatif et les compteurs portent sur l'année sélectionnée. La grille apparaît sur ordinateur. L'année reste dans l'adresse et survit au rechargement. Un accès direct conserve la navigation Mon espace.
✅ Sur grand écran, l'annualisation occupe toute la largeur disponible dans la zone de contenu, sans colonne centrale limitée en largeur.
Rejouez avec un compte RH.
✅ Le dossier consulté reste celui du RH connecté. Aucun sélecteur de salarié, formulaire ou commande de modification n'apparaît. Les données de l'annuaire ne sont pas chargées.
Couverture automatique : e2e/personal-counters.spec.ts → « consultation personnelle ».
9. Distinguer un relevé incomplet d'un échec de chargement
Tickets : APAJH-83 · Rôle : salarié.
Consultez une année sans calendrier de fériés, sans seuil initialisé, puis un contrat non annualisé.
✅ Chaque situation affiche son propre message. Le seuil et le solde absents portent —. Les autres compteurs restent consultables.
Simulez une erreur réseau sur le relevé, puis rétablissez la réponse.
Cliquez sur Réessayer le relevé.
✅ L'erreur du relevé ne masque pas les compteurs chargés. Le bouton relance la lecture et le récapitulatif réapparaît sans rechargement de la page.
Couverture automatique : e2e/personal-counters.spec.ts → « relevé personnel » et « erreur du relevé indépendante des compteurs et reprise ».
10. Distinguer projection annuelle et écart au planning
Tickets : APAJH-61, APAJH-81, APAJH-83 · Rôle : manager, RH ou salarié.
Sur des données anonymisées, planifiez 1 678 h pour un objectif RH de 1 477 h, avec des droits restant à poser nuls pour isoler l'écart au planning. Renseignez +5 h d'écart en mai, +4 h en juillet et −15 h en décembre.
✅ Au 10 septembre, la projection vaut +210 h et l'écart cumulé +9 h. Les réalisés de décembre sont exclus. En fin d'année, 1 672 h reconstituées donnent −6 h d'écart au planning et +195 h de solde annuel prévisionnel. Les synthèses mensuelles séparent Écart au planning et Écart cumulé. Le Solde annuel prévisionnel figure dans Récap global.
Déclarez un CP, CT ou ANC futur sur une journée prévue de 8 h, puis annulez-le.
✅ Sans réserve disponible, la projection diminue de 8 h, puis retrouve sa valeur initiale. Le seuil reste inchangé. Le congé ne réintroduit aucune heure dans le reconstitué. La même règle s'applique à un congé passé ou partiel.
Déclarez 4 h réalisées sur la partie travaillée d'une journée avec 5 h d'ABR. Rejouez avec une absence entière.
✅ L'absence partielle conserve les 4 h déclarées : 9 h reconstituées. L'absence entière produit zéro réalisé. Sans déclaration, seule la partie travaillée restante est estimée et marquée provisoire.
Ajoutez une correction RH et comparez les deux annuaires, la fiche salarié, le relevé manager, le relevé personnel et Mes compteurs, sur ordinateur et téléphone.
✅ La projection est identique dans tous les affichages du même exercice. L'objectif, le reconstitué à date, le prévu restant, la réserve et les corrections expliquent le résultat. Une valeur absente reste —. La projection dépend du planning renseigné et ne crédite automatiquement aucune heure supplémentaire.
Reprenez un solde déjà consolidé aujourd'hui dont le total annuel planifié est absent, puis rejouez deux réconciliations.
✅ Le total est calculé dès la première consultation. L'objectif RH et les corrections RH restent intacts ; la date de consolidation n'est pas remise à zéro. La seconde réconciliation n'ajoute aucune écriture.
Couverture automatique : backend/tests/test_annualization_projection.py, e2e/annualisation.spec.ts, e2e/personal-counters.spec.ts, e2e/utilisateurs.spec.ts et e2e/fiche-salarie.spec.ts.
11. Déplier le récapitulatif mensuel et lire les zéros
Tickets : APAJH-61, APAJH-81 · Rôle : manager, RH ou salarié.
Ouvrez un relevé manager ou Mon annualisation sur ordinateur. Descendez sous les journées de la grille.
✅ Récapitulatif mensuel est fermé par défaut. La grille des journées reste affichée. Un zéro est représenté par —, une estimation à zéro par —*.
Cliquez sur Récapitulatif mensuel, puis refermez-le au clavier avec Espace. Ouvrez-le à nouveau avec Entrée.
✅ Les synthèses se déplient et se replient ensemble. Les valeurs restent alignées sur les mois, dans la zone de défilement de la grille, sans débordement de la page. La ligne Solde annuel prévisionnel est absente de ces synthèses. Le montant reste visible dans Récap global, sans modification de son calcul.
Couverture automatique : e2e/annualisation.spec.ts → « récapitulatif mensuel repliable et zéros lisibles » et « le salarié ouvre uniquement son relevé personnel » pour la grille personnelle sur ordinateur. Les scénarios « repère les week-ends et les fériés » et « grille compacte de la maquette » vérifient les repères, l'alignement des synthèses sous les mois et le défilement sur ordinateur et écran large. Les libellés mensuels abrégés conservent leur intitulé complet au survol et pour les lecteurs d'écran.
12. Vérifier l'objectif individuel et les congés restant à poser
Tickets : APAJH-61, APAJH-81 · Rôle : manager, RH ou salarié.
Préparez un contrat annualisé de 35 h couvrant 2026, hors forfait jours, avec un droit CA définitif importé à zéro et des CT à zéro. Dans Récap global, cliquez sur la loupe à côté d'Objectif annuel pour ouvrir Calcul de l'objectif annuel.
✅ Avec Effectuée dans l’association, l'objectif vaut 1 757 h : 261 jours du lundi au vendredi × 7 − 11 fériés × 7 + 7 h de solidarité. Le détail affiche les dates des fériés, y compris ceux du week-end. Modifier la trame ne change pas l'objectif.
Importez un droit CA définitif de 30 jours et renseignez le total annuel RH des CT à 18 jours.
✅ L'objectif devient 1 477 h : 1 757 − 175 − 105. Le détail indique Droit définitif paie pour les CA et Total annuel RH pour les CT. Sans congé pris ni posé, la réserve vaut 280 h. Les CA, ancienneté comprise, sont convertis sur six jours par semaine. Les crédits CT automatiques ultérieurs ne s'ajoutent pas au total RH dans la prévision.
Testez une entrée le 10 septembre 2026, à 35 h, avec un droit CA définitif importé à zéro pour 2026 et des CT à zéro. Planifiez 567 h jusqu'au 31 décembre. Laissez la solidarité Non renseignée.
✅ Le détail affiche 113 jours sur 365 : 81 jours du lundi au vendredi et trois fériés : 546 h d'objectif, aucune réserve et +21 h de projection. Les CP acquis et les CT de T4 destinés à 2027 ne réduisent pas l'objectif 2026.
Sur un dossier avec 6 CP restant à poser, déclarez une semaine complète comptant 6 jours ouvrables pour cinq journées prévues de 7 h. Annulez-la.
✅ La pose retire 35 h du planning et libère 35 h de réserve ; la projection reste identique. L'annulation rétablit ces montants. Une journée isolée suit ses heures planifiées, qui peuvent différer des heures réservées par jour. Après la fin de la période, aucune réserve de congés ne subsiste.
Modifiez successivement le temps contractuel, un avenant, un férié, le droit CA par import paie et un total annuel RH CT. Modifiez aussi l'ancienneté entreprise sans nouvel import. Réconciliez deux fois.
✅ L'objectif automatique est actualisé. Les contrats simultanés s'additionnent, les années bissextiles utilisent 366 jours. Les objectifs fixés par les RH et les corrections restent conservés. La seconde réconciliation n'ajoute aucune écriture. Une modification d'ancienneté seule ne recalcule pas le droit CA. Une reprise ambiguë affiche un message de vérification RH.
Comparez les trois API, les deux annuaires, la fiche salarié et les portails. Ouvrez la loupe avec Entrée ou Espace, sur ordinateur et téléphone. Fermez la fenêtre avec Échap, puis avec le bouton Fermer.
✅ L'objectif, son origine, le détail, la réserve et la projection concordent. Le détail s'ouvre dans une popup centrée, défilable sur petit écran. La fermeture rend le focus à la loupe. L'accordéon mensuel reste disponible et aucune ligne mensuelle de projection n'est réintroduite. Le salarié ne peut pas modifier ces données.
Dans la fiche salarié, corrigez les heures RH avec un objectif absent, puis avec un objectif de 543,95 h, sur ordinateur et téléphone.
✅ L'objectif absent reste vide après enregistrement. Les valeurs au centième sont acceptées sans arrondi forcé à la demi-heure.
Couverture automatique : backend/tests/test_annualization_targets.py, backend/tests/test_annualization_target_migration.py, e2e/annualisation.spec.ts → « détail du contrat et réserve » et « nouvel entrant sans droits utilisables ». Le scénario « une référence absente reste vide lors d'une correction » dans e2e/fiche-salarie.spec.ts couvre la saisie RH.
13. Repérer le salarié et changer d'année depuis le tableau
Tickets : APAJH-61, APAJH-81 · Rôle : manager ou RH.
Ouvrez le relevé d'un salarié sur ordinateur, puis sur téléphone.
✅ Le bandeau turquoise en tête présente ses initiales, son nom, sa fonction, son ETP et son établissement. Les trois indicateurs affichent les congés annuels restants, le solde prévisionnel du relevé et l'ancienneté. Sur téléphone, les indicateurs passent sous l'identité sans faire déborder la page.
Cliquez sur le bouton compact portant l'année, dans la carte du tableau, au-dessus de la légende sur ordinateur. Rejouez son ouverture avec Entrée.
Changez d'année avec les flèches ou le champ Année, puis fermez avec Échap.
✅ Les congés annuels, le solde du bandeau, la grille (sur ordinateur) et le récapitulatif correspondent à l'année choisie. Le bouton reste accessible pendant le chargement et en cas d'erreur du relevé. Le retour ‹ Annualisation conserve l'année. L'accordéon mensuel et la loupe du calcul restent disponibles.
Couverture automatique : e2e/annualisation.spec.ts → « bandeau salarié et année compacte », sur ordinateur et téléphone, et « changer d'année après une erreur de chargement ».
14. Déclarer la solidarité et vérifier les fériés de la période
Tickets : APAJH-61, APAJH-81 · Rôle : RH puis manager et salarié.
Dans Fiche salarié → Compteurs, sélectionnez l'année et cliquez sur Éditer. Modifiez Journée de solidarité puis enregistrez.
✅ Le défaut est Non renseignée, avec un message explicite et zéro heure ajoutée. Non effectuée et Déjà effectuée ailleurs ajoutent également zéro heure. Effectuée dans l’association ajoute 7 h à 35 h ou 3,5 h à 17,5 h, sans proratisation supplémentaire pour une entrée en cours d'année.
Passez à une autre année, revenez et annulez une modification non enregistrée. Consultez la même fiche avec un rôle manager, puis le relevé salarié.
✅ Le statut enregistré appartient à l'année choisie. Manager et salarié lisent le calcul mais ne peuvent pas modifier la solidarité. L'objectif automatique reste automatique ; un objectif RH reste conservé. Aucun réalisé, compteur de congés ou correction d'heures n'est créé par le statut.
Vérifiez le cas du 1er mars au 31 décembre 2023 à 35 h, avec solidarité effectuée dans l'association et 49 h de droits CT : 218 × 7 − 10 × 7 + 7 − 49.
✅ L'objectif vaut 1 414 h. Une entrée le 10 septembre 2026 à 35 h sans congés utilisables donne 546 h sans solidarité, 553 h avec solidarité. Les fériés aux dates d'entrée et sortie sont inclus ; ceux des interruptions entre contrats sont exclus. Leur valeur suit les avenants.
Sur ordinateur et téléphone, ouvrez la loupe avec le clavier et vérifiez les périodes, les dates des fériés et la solidarité. Testez un calendrier absent.
✅ Les trois API et les récapitulatifs présentent le même calcul. La popup défile sans débordement et conserve la fermeture par Échap. Un calendrier absent donne un message et aucun objectif automatique chiffré. Une seconde consolidation ne modifie pas les écritures. Les années de fériés utilisées par un solde sont conservées lors de la synchronisation historique.
Couverture automatique : backend/tests/test_annualization_calendar.py, e2e/annualisation.spec.ts et e2e/fiche-salarie.spec.ts → « solidarité annuelle », « solidarité reste en lecture seule » et « détail du contrat et réserve ».
15. Comparer la trame aux modifications du planning
Rôles : manager et salarié · Prérequis : une trame affectée avec une journée de 7 h et un repos hebdomadaire, un relevé annuel initialisé.
Modifiez une journée de 7 h en une journée de 9 h, puis ouvrez le relevé.
✅ TH conserve 7 et RÉ affiche 9*. Un fin cadre violet pastel entoure les deux valeurs, sans entourer le numéro du jour. Un changement à durée identique ou portant seulement sur le lieu conserve ce repère « Planning modifié ».
Rejouez sur une date future, puis annulez la modification.
✅ Les 9 h provisoires apparaissent immédiatement ; la projection augmente de 2 h, sans augmenter les heures acquises ni l'écart cumulé. À la date de la journée, l'écart est acquis une seule fois. L'annulation rétablit la projection et retire le cadre. Une journée future sans modification garde son affichage habituel.
Posez un congé couvrant une journée travaillée et le repos hebdomadaire.
✅ Le congé reste pris en compte dans le théorique selon son motif. Son code apparaît dans RÉ lorsqu'il couvre la journée entière, au survol sinon, mais pas sur le repos hebdomadaire, qui reste R. Une journée non comptée par la convention ou fériée ne porte pas le code non plus. RÉ affiche les heures lorsqu'il y a du temps travaillé, sinon le code du congé ou de l'absence. Aucune ligne de détail n'apparaît sous la case. Le cadre violet de modulation peut coexister avec la bordure ambre d'absence.
Comparez les relevés manager et salarié, les compteurs et les annuaires, puis vérifiez la grille sur ordinateur.
✅ Le solde annuel prévisionnel est identique partout ; les valeurs TH/RÉ, l'encadré violet et la légende restent lisibles sans débordement de la page.
Couverture automatique : backend/tests/test_annualization_modulations.py, backend/tests/test_annualization_projection.py et e2e/annualisation.spec.ts → « trame et modification future ». La PR reste en brouillon jusqu'à confirmation de la réussite de cette recette humaine.
16. Déduire le droit CA final importé sans acquisition locale
Tickets : APAJH-66, APAJH-282 · Rôle : salarié et gestionnaire.
Importer un droit final de 34 jours, ancienneté comprise, pour un salarié à 35 h. Ouvrir Calcul de l'objectif annuel sur bureau et mobile.
✅ La ligne Congés annuels déduit 198,33 h sur six jours par semaine. Aucun ANC séparé ni simulation locale CA/ANC ne participe au calcul.
Ajouter une acquisition
accruingdestinée à l'année suivante, puis consulter une période close dont l'objectif était enregistré avant la reprise.✅ Le cumul suivant ne change pas l'objectif courant. L'objectif historique est conservé, sans recalcul ni condition sur une année de bascule.
Retirer le droit final dans les données de recette, sans modifier les heures.
✅ L'objectif automatique est indisponible et la cause est affichée. Les heures et les consommations restent conservées.
Couverture automatique : backend/tests/test_annualization_targets.py, backend/tests/test_payroll_leave_migration.py et e2e/annualisation.spec.ts.
17. Réserver le relevé aux contrats annualisables et la grille à l'ordinateur
Tickets : APAJH-269 · Rôle : manager ou RH, puis salarié.
Préparation : dans un même établissement, un salarié en CDI annualisé, un intérimaire (contrat Intérim) et un agent polyvalent (contrat Agent polyvalent).
Ouvrez Compteurs ▸ Annualisation dans l'espace Manager, sans filtre, puis filtrez sur l'établissement.
✅ Le salarié en CDI est listé. L'intérimaire et l'agent polyvalent ne le sont pas, et le nombre de salariés affiché ne les compte pas. Ils restent visibles dans Utilisateurs. Le type lu est celui du contrat présenté dans la colonne Contrat.
Sur téléphone, ouvrez le relevé du salarié en CDI, puis Mon espace ▸ Mes compteurs ▸ Annualisation avec un compte salarié.
✅ Le tableau des douze mois et sa légende ne sont pas affichés. Le bandeau, le bouton de l'année, la date d'arrêté, l'état du relevé et Récap global restent affichés ; la page ne déborde pas. Dans Mon espace, aucun cadre vide ne remplace la grille.
Toujours sur téléphone, ouvrez le relevé d'un salarié qui a des compteurs ouverts au nom long, comme Heures supplémentaires ou heures en sus du planning.
✅ Les cartes Compteurs et Récap global tiennent dans la largeur de l'écran : aucune ne dépasse à droite, rien n'est coupé par le bord. Un nom de compteur trop long pour la ligne se termine par « … » ; ses chiffres restent lisibles en dessous.
Élargissez la fenêtre à 768 px ou plus, ou rejouez sur ordinateur.
✅ La grille et sa légende réapparaissent, sans rechargement.
Couverture automatique : e2e/annualisation.spec.ts → « la grille est masquée sur téléphone » (qui mesure aussi les cartes avec un compteur au nom long : les deux côté manager, Récap global côté salarié) et « liste, relevé et fraîcheur », e2e/personal-counters.spec.ts → « consultation personnelle ».
18. Le filtre établissement se limite au périmètre
Tickets : APAJH-298 · Rôle : Manager n1 restreint à quelques établissements.
Préparation : des salariés annualisés dans un établissement du périmètre et dans un établissement hors périmètre.
Ouvrez Compteurs ▸ Annualisation dans l'espace Manager, puis le filtre Filtrer par établissement.
✅ Seuls les établissements du périmètre sont proposés, comme dans Utilisateurs. Les salariés de l'établissement hors périmètre ne sont pas listés, et la colonne Établissement ne nomme que ceux du périmètre.
Couverture automatique : e2e/annualisation.spec.ts → « APAJH-298 — le filtre établissement se limite au périmètre ».