Validation d'un Cycle
Un cycle passe par 1 à 4 niveaux de validation avant exécution. Le nombre de niveaux se règle par cycle ; chaque niveau est validé à son tour, et un rejet renvoie le cycle en préparation.
brouillon ──► soumettre ──► en_attente ──► valider (niveau 1 … N) ──► valide
│
└──► rejeter (motif) ──► rejete
Les cycles des projets archivés (données historiques PRSSB) ne passent pas par la validation.
Endpoints
| Endpoint | Méthode | Permission | Description |
|---|---|---|---|
/api/cycles/{id}/config-validation | PUT | transferts.cycles_edit | Nombre de niveaux requis (1 à 4) |
/api/cycles/{id}/soumettre | POST | transferts.cycles_view | Soumettre pour validation |
/api/cycles/{id}/valider | POST | transferts.cycles_validate | Valider le niveau suivant |
/api/cycles/{id}/rejeter | POST | transferts.cycles_validate | Rejeter (motif obligatoire) |
/api/cycles/{id}/validation-status | GET | transferts.cycles_view | État de validation et historique |
/api/cycles/{id}/validate | POST | transferts.cycles_validate | Validation simple (sans circuit multi-niveaux) |
Tous ces endpoints vérifient en plus que le cycle est dans le périmètre de l'utilisateur (403 sinon).
PUT /api/cycles/{id}/config-validation
{ "niveauxRequis": 2 }
Refusé (400) pendant une validation en cours ou si la valeur sort de 1 à 4.
POST /api/cycles/{id}/soumettre
{ "commentaire": "Liste vérifiée, prête pour validation" }
Réponse :
{ "success": true, "message": "Cycle soumis pour validation", "data": { "…": "état de validation" } }
Erreur 400 : Cycle déjà soumis pour validation.
POST /api/cycles/{id}/valider
{ "commentaire": "Validé par le RAF" }
Valide le niveau suivant. Le message indique le niveau atteint (Validation niveau 1 effectuée) ou la fin du circuit. Refusé si le cycle est déjà entièrement validé ou si son programme est clôturé ou terminé.
POST /api/cycles/{id}/rejeter
{ "motif": "Montants incohérents avec la grille" }
motif (ou commentaire) est obligatoire : sans lui, 400 Le motif du rejet est requis. Le cycle doit être soumis (400 Cycle non soumis pour validation sinon).
GET /api/cycles/{id}/validation-status
{
"success": true,
"data": {
"id": "770e8400-e29b-41d4-a716-446655440003",
"code": "TRF-2026-003",
"nom": "Transfert janvier 2026",
"statut": "preparation",
"validation": {
"soumisPourValidation": true,
"dateSoumission": "2026-01-12T10:00:00+00:00",
"statutValidation": "en_attente",
"niveauActuel": 1,
"niveauActuelNom": "RAF",
"niveauxRequis": 2,
"prochainNiveau": 2,
"estComplet": false,
"dateValidation": null,
"commentaire": "Validé par le RAF",
"historique": [
{ "niveau": 0, "action": "soumission", "utilisateur": "…", "date": "…", "commentaire": "…" }
]
}
}
}