etouch docs
Guides

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_RETOUCH a CLIENT_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_REVIEW et CLIENT_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_RETOUCH pour un nouveau round de retouche. Les medias rejetes doivent avoir des annotations/commentaires pour guider la correction.
    • Tous approuves : passage a DONE
  • Transition vers : DONE ou IN_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_RETOUCHCLIENT_VALIDATIONIN_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!
}