Skip to content

[V2 Repeq] Étape 4 — Récap, publication intégrée, transmission #3296

@Viczei

Description

@Viczei

Contexte

Implémente l'étape 4 du funnel repeq : récap + publication + transmission. Sections <h3> (N°39), liens "Modifier" explicites (N°40), 1 seul bouton primaire "Transmettre" (N°14bis), date/modalités de publication intégrées au récap (N°16), date pré-remplie à aujourd'hui (décision design 2). Issue parent #3287. Dépend de #TICKET_ROUTER, #TICKET_STEP2, #TICKET_STEP3.

Le gating "submitted + deadline dépassée → lecture seule / redirect" doit utiliser la deadline dédiée repeq repeqModificationDeadline (cf. #3288 pour la colonne DB et #3289 pour le helper getRepeqModificationDeadline), pas la deadline rémunération.

Fichiers impactés

  • packages/app/src/app/representation-equilibree/etape/[step]/page.tsx (modification — passer modificationDeadline: repeqModificationDeadline à la page client via shouldRedirectSubmittedToRecap)
  • packages/app/src/modules/representation-equilibree/steps/Step4Review.tsx (création)
  • packages/app/src/modules/representation-equilibree/shared/ReviewSection.tsx (création — une section de récap avec titre, lien "Modifier X" explicite, <dl>)
  • packages/app/src/modules/representation-equilibree/steps/__tests__/Step4Review.test.tsx (création)
  • packages/app/src/modules/representation-equilibree/StepPageClient.tsx (modification)
  • packages/app/src/modules/representation-equilibree/index.ts (modification — exports)

Changement attendu

  1. ReviewSection : composant réutilisable
    • Props : { title: string, editHref: string, editLabel: string, children: ReactNode }.
    • Rend <section><div class="fr-grid-row fr-grid-row--middle"><h3>{title}</h3><a href={editHref}>{editLabel}</a></div>{children}</section>.
    • editLabel doit être contextualisé ("Modifier la période de référence", "Modifier les écarts des cadres dirigeants", etc.) — N°40.
  2. Step4Review (client component) :
    • Reçoit { declaration: RepeqDeclarationFull } (full data depuis getOrCreate).
    • 4 sections :
      • Période de référence (lien vers /etape/1).
      • Cadres dirigeants (lien vers /etape/2) — affiche soit les % (cas calculable), soit le libellé du motif choisi.
      • Instances dirigeantes (lien vers /etape/3) — idem.
      • Publication : saisie intégrée (pas d'exergue redondante, N°16) — 3 champs éditables via useZodForm + updatePublicationSchema :
        • <input type="date" name="publishDate"> avec hint "Pré-remplie à la date du jour. Vous pouvez la modifier.", defaultValue= date du jour (ISO).
        • Radio hasWebsite: "yes" | "no".
        • Si yes : <input type="url" name="publishUrl">.
        • Si no : <textarea name="publishModalities">.
    • fr-alert--info rappelant les obligations CSE + publication.
    • <div className="fr-btns-group fr-btns-group--inline-md"> avec UN SEUL fr-btn primaire "Transmettre la déclaration" + un fr-btn--secondary "Précédent" (href /etape/3). Aucun autre bouton primaire sur la page (N°14bis).
    • À la soumission :
      1. Appelle api.representationEquilibree.updateStep4.useMutation pour persister la publication.
      2. Puis api.representationEquilibree.submit.useMutation.
      3. En succès, router.push(\/representation-equilibree/transmise/${declarationYear}`)`.
  3. Gating server-side : dans src/app/representation-equilibree/etape/[step]/page.tsx, utilise shouldRedirectSubmittedToRecap({ ..., modificationDeadline: getRepeqModificationDeadline(campaignDeadlines, declaration.year) }) (helper du ticket [V2 Repeq] Domain: constantes, helpers année/deadline, règle d'assujettissement #3289, lit la colonne du ticket [V2 Repeq] DB: table representation_equilibree_declarations + schéma Drizzle #3288). Si une déclaration est submitted et que la deadline repeq est dépassée, redirect vers la page de consultation /representation-equilibree/{siren}/{year} (pattern cohérent avec la rémunération).
  4. Hiérarchie headings : page = <h1> (dans layout) → <h2> "Vérifier votre déclaration" (dans Step4Review) → <h3> pour chaque section (N°39, pas de saut).
  5. Tests Step4Review.test.tsx :
    • Rendu : présence des 4 sections avec leurs liens "Modifier X" explicites.
    • Un seul bouton primaire.
    • Cas calculable cadres : affichage "30 % femmes / 70 % hommes".
    • Cas non calculable : affichage du libellé du motif.
    • Soumission avec hasWebsite: true + URL valide → mutations appelées dans l'ordre + navigation.
    • Soumission avec hasWebsite: false + modalités vides → erreur Zod affichée.
  6. StepPageClient : branche <Step4Review declaration={...} /> à case 4:.

Scénarios de test

  • S9 — Rendu récap avec publication intégrée + 1 seul primaire + headings <h3> pour les sections.
  • S10 (partiel) — La soumission réussie déclenche la redirection vers /transmise/[year].
  • S11 / S12 (partiel) — Le gating côté page utilise repeqModificationDeadline : submitted + deadline future → récap accessible, submitted + deadline passée → redirect /consultation.
  • RGAA N°40 — test unitaire : chaque lien "Modifier X" a un texte explicite (pas "Modifier" seul).
  • RGAA N°14bis — test unitaire : 1 seul fr-btn non secondaire sur la page.

Références visuelles

Desktop
Étape 4 Récap & transmission desktop

Mobile
Étape 4 Récap & transmission mobile

Annexe pipeline (lecture locale par code-dev / design-validator) :

  • /tmp/egapro-mocks/epic-3287/screenshots/step-4-recap-desktop.png
  • /tmp/egapro-mocks/epic-3287/screenshots/step-4-recap-mobile.png

Critères d'acceptation

  • 4 sections <h3> avec liens "Modifier X" explicites vers les bonnes étapes
  • Publication (date + radio + URL/modalités) intégrée au récap, pas d'exergue séparée
  • 1 seul bouton primaire "Transmettre la déclaration"
  • Date de publication pré-remplie à la date du jour
  • Gating server-side : utilise getRepeqModificationDeadline(campaignDeadlines, year) (pas de date hardcodée, pas de réutilisation de decl1ModificationDeadline)
  • Toutes les fr-alert présentes sur la page récap ont un fr-alert__title conforme DSFR (RGAA N°33)
  • Tests unitaires verts (≥ 5 cas)
  • pnpm typecheck + pnpm lint:check + pnpm format:check + pnpm test verts
  • RGAA (rgaa-auditor) — N°14bis, N°16, N°39, N°40 résolus
  • Validation visuelle (design-validator) PASS sur step-4-recap-*.png

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    Status

    To Do

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions