--- # === IDENTITÉ === module: M0 nom: "Gestion des catégories" ecran: gestion-categories owner_spec: Matthieu backup_spec: Tristan version: V0 date_redaction: 2026-05-22 # === LIENS === maquette_figma: null # pas de Figma — UI admin standard regles_metier: [RG-1.01, RG-1.02, RG-1.03, RG-1.04, RG-1.05, RG-1.06, RG-1.07, RG-1.08, RG-1.09, RG-1.10, RG-1.11, RG-1.12, RG-1.13] roles: [Admin, Bureau, Compta, Commerciale, Usine] lien_spec_back: ./spec-back.md # === VALIDATION CLIENT #1 === client_validation_1: statut: validee # V0 client validée le 22/05/2026 date: 2026-05-22 canal: ecrit valide_par: "Matthieu (CP MALIO) — validation implicite, périmètre projet" resume: "Module 0 — Gestion des catégories. Page admin (datatable + drawer). 2 champs (Nom + Type), 3 actions (Ajouter / Consulter / Modifier). Admin only." trace_archivee: "uploads/c4ebb6b4-M0categories.docx (V0 d'origine .docx) — restitué ci-dessous en Markdown." # === LIEN LESSTIME === lesstime_taskgroup_id: 22 lesstime_project_id: 6 # ERP / Starseed statut_global: en_dev # tickets créés en backlog Lesstime le 2026-05-26 --- # Module 0 — Gestion des catégories (V0 front) > **Origine** : spec front V0 livrée le 22/05/2026 (`c4ebb6b4-M0categories.docx` + `f665acfb-M0categoriesV0.pdf`). Restitution Markdown fidèle pour intégration au workflow MALIO. Le contenu original n'est pas modifié — toute reformulation et précision (en particulier côté back) vit dans [`spec-back.md`](./spec-back.md). ## But Permettre à un administrateur Starseed de gérer un référentiel de **catégories** depuis l'interface admin du logiciel. Ces catégories seront utilisées plus tard pour classifier les tiers (clients, fournisseurs, prestataires). ## Accès - **Depuis** : menu principal → **Administration** → entrée « Gestion des catégories » - **Rôles autorisés** : **Admin uniquement** (Bureau / Compta / Commerciale / Usine n'ont **aucun** accès, ni lecture ni écriture). ## Navigation L'écran est la page d'entrée du Module **Administration**. Titre de la page : « **Gestion des catégories** ». - Affichage principal : un **datatable** listant toutes les catégories existantes. - **Clic sur une ligne** → ouverture d'un **drawer** latéral en mode **consultation / modification** (cf. § Action « Consulter »). - **Bouton « + Ajouter »** (en haut à droite du datatable) → ouverture d'un **drawer** en mode **création** (cf. § Action « Ajouter »). - Pas d'onglet, pas de pagination explicite (volumétrie cible faible). ## Actions | Action | Déclencheur | Comportement | |---|---|---| | **Ajouter** | Clic sur le bouton « + Ajouter » | Ouvre le drawer en mode création, formulaire vide. Validation → POST → la catégorie apparaît dans le datatable. | | **Consulter** | Clic sur une ligne du datatable | Ouvre le drawer avec les champs pré-remplis en lecture (et passage en édition si l'utilisateur modifie un champ). | | **Modifier** | Modification d'un champ dans le drawer ouvert en consultation | Validation → PATCH → la ligne du datatable se met à jour. | > **Note V0** : la **suppression** n'était pas mentionnée dans la V0 client. Côté workflow MALIO, suite à la revue back (cf. `spec-back.md` § Q3), un soft delete est ajouté (corbeille logique). L'UI peut intégrer ce point lors d'une V1 — au M0 le bouton « Supprimer » n'est pas obligatoire, mais doit être facilement ajoutable. ## Formulaire — Champs Le formulaire (drawer) contient **2 champs**, tous deux obligatoires : | Champ | Type | Obligatoire | Contenu / valeur par défaut | Règle | |---|---|---|---|---| | **Nom** | Texte libre | **Oui** | vide à la création | Pas de règle métier détaillée en V0. Détails côté back : RG-1.02 / RG-1.03 / RG-1.04 (obligatoire, trim, longueur 2–120). | | **Type de catégorie** | Select | **Oui** | vide à la création | Le contenu du Select n'était pas précisé en V0. Décision back : entité de référence `CategoryType` séparée (RG-1.05 / RG-1.06). Le référentiel sera alimenté plus tard (cf. HP-1 dans `spec-back.md`). | > **Note V0** : la V0 ne précisait ni si le `Type de catégorie` est un enum hardcodé ni si c'est une autre entité. Décision tranchée côté back avant découpe en tickets : **entité de référence** (`category_types`), table créée vide au M0. ## Permissions par rôle | Rôle | Vue (`GET`) | Création (`POST`) | Édition (`PATCH`) | Suppression (`DELETE`) | |---|---|---|---|---| | **Admin** | ✅ | ✅ | ✅ | ✅ (soft delete — ajout post-V0) | | Bureau | ❌ | ❌ | ❌ | ❌ | | Compta | ❌ | ❌ | ❌ | ❌ | | Commerciale | ❌ | ❌ | ❌ | ❌ | | Usine | ❌ | ❌ | ❌ | ❌ | → Les rôles non-Admin ne voient **pas** l'entrée de menu et reçoivent **403** sur toute requête vers les endpoints `/api/categories/*` (cf. RG-1.01 dans `spec-back.md`). ## Composants UI à utiliser (Starseed / `@malio/layer-ui`) - **Datatable** : `` (avec colonnes `Nom` + `Type` + actions, tri par défaut sur Nom). - **Drawer** : drawer latéral standard `@malio/layer-ui` (à confirmer côté front avec le composant exact). - **Input texte** : `` pour le champ Nom. - **Select** : `` pour le champ Type de catégorie, alimenté par `GET /api/category_types`. - **Bouton** : `` (« + Ajouter », « Enregistrer », « Annuler »). - **Toasts succès / erreur** : standards via `useApi()`. ## Points laissés ouverts par la V0 (résolus côté back) | # | Zone d'ombre V0 | Résolution (cf. `spec-back.md`) | |---|---|---| | 1 | Suppression non mentionnée | **Soft delete** ajouté (RG-1.12 + RG-1.13). UI peut ajouter le bouton plus tard. | | 2 | Unicité du nom non précisée | **Unicité sur `(name, type)` case-insensitive**, parmi non-soft-deleted (RG-1.07). | | 3 | Nature du `Type de catégorie` (enum vs entité) | **Entité de référence** `CategoryType` (table vide au M0, créée par migration). | | 4 | Volumétrie & pagination | **300 max** → pagination front (``), pas de pagination serveur. Tri serveur `name ASC` par défaut. | | 5 | Audit / traçabilité | Pattern `#[Auditable]` Starseed standard. Trace dans la table `audit_log` (qui / quoi / quand / diff). **Pas** de colonnes `created_by` / `updated_by` sur l'entité (cohérent avec User / Role dans Starseed). Historique consultable via `/api/audit-log?entityType=Category&entityId={id}`. | | 6 | Référencement par d'autres entités | **Aucune FK entrante au M0.** Les modules Tiers (M-Clients / M-Fournisseurs / M-Prestas) ajouteront leur propre `category_id` plus tard. | --- ## 📦 Tickets Lesstime générés **TaskGroup Lesstime** : `#22 — M0 — Gestion des catégories` (projet `ERP / Starseed`, projectId=6) > Détail complet, table des tickets et action manuelle dans Lesstime → voir [`spec-back.md § Tickets Lesstime générés`](./spec-back.md#-tickets-lesstime-générés).