# Checklists métier par type d’opération (enso-front) ## Principe Les types d’opération catalogués (`folders.operation_type` = slug : `cession`, `age`, …) peuvent avoir une **checklist embarquée** : fichier JSON sous `enso/enso-front/src/lib/operationChecklists/data/.json`, enregistré dans **`registry.ts`**, textes UI sous **`case.operationChecklist..*`** dans les catalogues i18n (`messages.fr.ts` / `messages.en.ts`), et affichage via **`CaseOperationChecklistCard`** sur la fiche dossier. **Il n’existe pas d’endpoint docv** pour ces listes : elles sont versionnées dans le dépôt avec le front, comme les traductions. ## Parcours utilisateur | Étape | Composant / module | Règle | |--------|----------------------|--------| | Page société, onglet Dossiers | `CompanyCasesTabsContent` | Dialogue **Nouveau dossier** : sélection du type (`OPERATION_TYPE_SLUGS`). Si le titre est encore vide et que **`suggestedFolderTitleMessagePath(slug)`** renvoie une clé i18n, le titre est prérempli (ex. cession). | | Fiche dossier (`CaseDetail`) | `CaseDetailBody` | Rend **`CaseOperationChecklistCard`** avec le **`Case`** courant. La carte appelle **`operationChecklistBundleForCase(caseItem)`** ; si `null`, rien n’est affiché. | ## Conditions d’affichage de la carte checklist 1. **`folder_purpose === client_operation`** (dossier d’opération réel, pas ligne démo `dp_structure_demo`). 2. **`operation_type`** doit être un **slug** reconnu par **`isOperationTypeSlug`** (valeurs dans `lib/domain/operationTypes.ts`). Un type saisi comme **Autre** (texte libre) ne correspond à aucune checklist embarquée. 3. Le slug doit avoir une entrée dans **`REGISTRY`** (`registry.ts`). Les libellés de la checklist (titres de sections, items) proviennent du **JSON** ; la **légende** DF/NA/DM/CO et les textes d’en-tête de carte viennent du **JSON** (légende) et des clés i18n (`title`, `description`, etc.). ## Fichier JSON (`OperationChecklistData`) | Champ | Rôle | |--------|------| | **`meta.sourceFile`** | Nom du fichier source (Excel), affiché dans la ligne « Fichier source ». | | **`meta.sheet`** | Feuille Excel utilisée pour l’export. | | **`meta.legend`** | Texte de légende (souvent une ligne commençant par `DF :`). | | **`meta.operationTypeSlug`** | Optionnel ; rappel documentaire du slug (l’UI utilise le slug déduit du dossier). | | **`blocks`** | Liste ordonnée de blocs `section`, `subsection` ou `item` (`ref` + `label` pour les items). | ## Module `lib/operationChecklists/` | Export (`index.ts`) | Usage | |---------------------|--------| | Types `OperationChecklistBlock`, `OperationChecklistData` | Contrat du JSON. | | `operationChecklistBundleForCase` | Résolution checklist + slug pour un `Case`. | | `operationChecklistSlugs` | Liste des slugs ayant un fichier dans le registre (inspection / outils). | | `OPERATION_FOLDER_SUGGESTED_TITLE_I18N`, `suggestedFolderTitleMessagePath` | Carte slug → clé **`MessagePath`** pour le titre proposé à la création du dossier. | ## Ajouter une checklist pour un nouveau type 1. **Excel** (ou autre source) : préparer une feuille avec la même convention que la checklist cession (colonne A : numéro de section / sous-section / item, B : libellé ; légende en ligne commençant par `DF :`). 2. **Export JSON** : ```bash python3 -m venv .venv .venv/bin/pip install openpyxl .venv/bin/python3 tools/export_operation_checklist.py \ --input docs/.xlsx \ --sheet \ --output enso/enso-front/src/lib/operationChecklists/data/.json \ --operation-type-slug ``` Le slug doit exister dans **`OPERATION_TYPE_SLUGS`** (`lib/domain/operationTypes.ts`). 3. **Registre** : dans `enso/enso-front/src/lib/operationChecklists/registry.ts`, importer le JSON et ajouter une ligne dans **`REGISTRY`** (même clé que le slug). 4. **i18n** : ajouter **`case.operationChecklist.`** avec au minimum `title`, `description`, `sourceLine`, `legendTitle`, et si besoin **`suggestedTitle`** pour le dialogue « Nouveau dossier » (paramètre **`{{companyName}}`**). Référence catalogue : [I18N_ENSO_FRONT.md](I18N_ENSO_FRONT.md). 5. **Titre suggéré (optionnel)** : ajouter une entrée dans **`OPERATION_FOLDER_SUGGESTED_TITLE_I18N`** (`suggestedFolderTitles.ts`) : slug → clé **`MessagePath`** (souvent `case.operationChecklist..suggestedTitle`). Le dialogue « Nouveau dossier » appelle **`suggestedFolderTitleMessagePath`** ; pas de branche par slug dans **`CompanyCasesTabsContent`**. ## Fichiers clés | Fichier | Rôle | |---------|------| | `lib/operationChecklists/types.ts` | Types `OperationChecklistBlock`, `OperationChecklistData` | | `lib/operationChecklists/registry.ts` | `REGISTRY`, `operationChecklistBundleForCase`, `operationChecklistSlugs` | | `lib/operationChecklists/suggestedFolderTitles.ts` | `OPERATION_FOLDER_SUGGESTED_TITLE_I18N`, `suggestedFolderTitleMessagePath` | | `lib/operationChecklists/index.ts` | Ré-exports publics | | `lib/operationChecklists/data/*.json` | Données par slug | | `screens/case/CaseOperationChecklistCard.tsx` | Carte réutilisable | | `tools/export_operation_checklist.py` | Export Excel → JSON | ## Limite fonctionnelle actuelle La checklist est **consultative** : pas de persistance des coches DF/NA/DM/CO ni synchronisation avec **`user_pending_documents`** ou les pièces du dossier. L’évolution cible (workflow documentaire) est décrite côté spec zone 18 ([SPEC_18_operation.md](specs/SPEC_18_operation.md) §6). ## Référence cession Détail métier et fichier source Excel : [CHECKLIST_CESSION_JURIDIQUE_SOCIAL_FISCAL.md](CHECKLIST_CESSION_JURIDIQUE_SOCIAL_FISCAL.md).