Workflow projet
Machine a etats du workflow projet etouch - etapes, permissions et regles de validation
Les projets etouch suivent une machine a etats stricte definie dans packages/shared/src/workflow/states.ts.
Diagramme des etats
STUDIO_REVIEW → CLIENT_REVIEW → SELECTION_CONFIRMATION → IN_RETOUCH → CLIENT_VALIDATION → DONE → ARCHIVED
↓
IN_RETOUCH (si rejets)Permissions par role
Studio (STUDIO_ADMIN, STUDIO_USER)
- Creer le projet
- Uploader les images de base
- Uploader les images retouchees
- Editer le projet (date, etc.)
- Assigner un retoucheur
- Assigner une guideline
- Annoter, commenter une image
- Valider toutes les etapes
Retoucheur (RETOUCH_ADMIN, RETOUCH_USER)
- Commenter, annoter une image
- Uploader des images retouchees
- Passer de
IN_RETOUCHaCLIENT_VALIDATION
Client (CLIENT_ADMIN, CLIENT_USER)
- Selectionner les images a l'etape
CLIENT_REVIEW - Valider ou rejeter les images a
CLIENT_VALIDATION - Annoter, commenter une image
- Valider les etapes
CLIENT_REVIEWetCLIENT_VALIDATION
Detail des etapes
1. Studio Review
Objectif : Upload et revue initiale des images.
- Le studio uploade les images du shooting
- Une fois l'upload termine, le passage a l'etape suivante est possible
- Transition vers :
CLIENT_REVIEW
2. Client Review
Objectif : Le client selectionne les photos a retoucher.
- Des qu'un media est uploade, le passage a l'etape suivante est possible
- Actions disponibles :
- Marquer un media comme prioritaire
- Demander une retouche "high-end" pour un media
- Annoter/commenter les medias pour donner du feedback
- Transition vers :
SELECTION_CONFIRMATION
3. Selection Confirmation
Objectif : Confirmer la selection et preparer la retouche.
- Conditions requises :
- Au moins un retoucheur assigne
- Au moins une guideline assignee
- Transition vers :
IN_RETOUCH
4. In Retouch
Objectif : Les retoucheurs travaillent sur les medias selectionnes.
- Les retoucheurs uploadent les versions retouchees
- Le matching se fait par SKU et variante entre les originaux et les retouches
- Condition de sortie : Tous les medias selectionnes ont une version retouchee
- Transition vers :
CLIENT_VALIDATION
5. Client Validation
Objectif : Le client valide ou rejete chaque media retouche.
- Tous les medias doivent etre valides ou rejetes
- Actions disponibles :
- Annoter et commenter les images pour decrire le feedback
- Demander une retouche "high-end"
- Deux scenarios possibles :
- Au moins un rejet : retour a
IN_RETOUCHpour un nouveau round de retouche. Les medias rejetes doivent avoir des annotations/commentaires pour guider la correction. - Tous approuves : passage a
DONE
- Au moins un rejet : retour a
- Transition vers :
DONEouIN_RETOUCH(nouveau round)
6. Done
Objectif : Projet termine, telechargement disponible.
- Les clients peuvent telecharger les medias finaux
- Transition vers :
ARCHIVED
7. Archived
Objectif : Projet archive apres completion.
- Le projet peut etre desarchive si necessaire via
unarchiveProject
Gestion des guidelines
- Table permettant d'assigner une ou plusieurs guidelines a un projet
- Compatibilite affichee entre l'extension alias de la guideline et les medias uploades (ex: une guideline avec alias "BACK" est compatible si un media a l'alias "BACK")
Gestion des retoucheurs
- Un ou plusieurs retoucheurs peuvent etre assignes a un projet
- Avec plusieurs retoucheurs, le studio peut distribuer les SKUs entre les retoucheurs
Rounds de retouche
Chaque cycle IN_RETOUCH → CLIENT_VALIDATION → IN_RETOUCH incremente le roundNumber du projet. Cela permet de tracer :
- Le nombre d'iterations de retouche
- Les versions de retouche par round
- L'historique complet des feedbacks
Implementation technique
Machine a etats
Les transitions sont validees dans packages/shared/src/workflow/states.ts :
// Exemple de validation
const VALID_TRANSITIONS: Record<ProjectWorkflowState, ProjectWorkflowState[]> = {
STUDIO_REVIEW: ['CLIENT_REVIEW'],
CLIENT_REVIEW: ['SELECTION_CONFIRMATION'],
SELECTION_CONFIRMATION: ['IN_RETOUCH'],
IN_RETOUCH: ['CLIENT_VALIDATION'],
CLIENT_VALIDATION: ['DONE', 'IN_RETOUCH'],
DONE: ['ARCHIVED'],
ARCHIVED: [],
};Mutation de transition
mutation TransitionProject($input: TransitionProjectInput!) {
transitionProject(input: $input) {
id
workflowState
}
}Input :
input TransitionProjectInput {
id: ID!
toState: ProjectWorkflowState!
message: String
force: Boolean # Admin override
}Evenements workflow
Chaque transition cree un WorkflowEvent pour l'audit trail :
type WorkflowEvent {
id: ID!
fromState: ProjectWorkflowState
toState: ProjectWorkflowState!
message: String
metadata: JSON
createdAt: DateTime!
actor: User!
}