Process Validation multi-niveaux
Ce workflow n'existe pas dans l'API standard. Il est exposé par la gateway Client A qui orchestre la validation métier avant de redescendre vers les services partagés. En dehors de Client A, aucune de ces mutations n'est disponible.
Cette fiche décrit le process complet de validation hiérarchique à deux niveaux. Typiquement utilisé quand un payload (demande, mouvement de fonds, changement de périmètre...) doit être revu par un manager, puis contre-validé par la direction, avant d'être poussé au pipeline aval.
Cas d'usage guide : une demande de reclassification budgétaire saisie par un chef de projet, relue par son manager (N1), puis contre-signée par le directeur métier (N2) avant que le mouvement ne soit comptabilisé.
Vue d'ensemble
┌─────────┐ submit ┌──────────────┐ approveN1 ┌──────────────┐ approveN2 ┌─────────┐
│ auteur │ ───────▶ │ N1 pending │ ─────────▶ │ N2 pending │ ─────────▶ │ DONE │
└─────────┘ └──────┬───────┘ └──────┬───────┘ └─────────┘
│ │
│ reject │ reject
▼ ▼
┌──────────────────────────────────┐
│ REJECTED │
└──────────────────────────────────┘
Règles métier à retenir :
- Un payload
submitsans validation N1 au bout de 5 jours remonte une alerte (subscriptionreviewStateChanged). - Un
rejectà N1 renvoie l'auteur en édition ; à N2, le payload est définitivement clos. - Les approbations sont idempotentes : un second appel avec le même
reviewIdretourne la review dans son état courant sans la muter.
Étape 1 — Soumettre pour revue
L'auteur finalise son payload côté UI puis déclenche la soumission.
L'événement crée une review rattachée au payload et la positionne en
PENDING_N1.
Champs de la réponse
id: identifiant de la review (distinct du payload). À conserver pour les étapes suivantes.state:PENDING_N1à ce stade.level:1tant que N1 n'a pas statué.
Côté UI, basculer immédiatement le payload en lecture seule dès que la
mutation réussit — toute édition doit repasser par un reject → edit → submit.
Étape 2 — Revue niveau 1 (manager)
Le manager reçoit une notification (push, mail, ou subscription GraphQL). Il peut approuver ou refuser ; dans les deux cas, un commentaire peut accompagner la décision pour tracer le "pourquoi".
Pièges courants
- Appelé par un non-manager → erreur
FORBIDDEN. Vérifier la matrice d'habilitations côté front avant d'afficher le bouton Valider. - State ≠ PENDING_N1 → erreur
INVALID_STATE. Ne jamais parier sur l'état côté UI, toujours le relire depuis la subscription.
Étape 3 — Revue niveau 2 (direction)
Contre-validation par la direction métier. C'est le point de non-retour : à partir d'ici, le payload sera effectivement appliqué en aval.
Étape 4 — Suivi temps réel
Plutôt que de poller, abonnez l'écran à reviewStateChanged : chaque
transition émet un événement pour rafraîchir la liste des reviews en attente.
subscription ReviewFeed($reviewId: ID!) {
reviewStateChanged(reviewId: $reviewId) {
id state level by at
}
}
Pour un dashboard manager listant toutes les reviews assignées à un user,
remplacer $reviewId par un filtre sur $assigneeId si la gateway l'expose.
Scénario complet dans l'IDE
Voir aussi
- Hub API — signatures et types dépliés inline pour chaque mutation de ce workflow
- Process Utilisateurs — matrice d'habilitations Client A consommée par ce process