[docs] M1 — Répertoire clients : specs front + back #23

Merged
malio merged 6 commits from feature/M1-spec-clients into develop 2026-05-29 09:58:32 +00:00
Owner

Contexte

Spécifications front + back du Module 1 — Répertoire clients (premier module métier Tiers, extension du module Commercial existant).

Origine : V0 client .docx du 22/05/2026 (M1-reportoire-clients.docx) + maquette Figma https://www.figma.com/design/jRYgT0T9c03VsEbjGhCwwS/Composants---Design-System?node-id=1132-31898.

Pattern de rédaction : strictement aligné sur docs/specs/M0-categories/ (spec-front léger + spec-back très détaillé).

Contenu

  • docs/specs/M1-clients/spec-front.md (289 lignes) — V0 client, structure UI, composants Malio, permissions par rôle, règles de formatage
  • docs/specs/M1-clients/spec-back.md (1056 lignes) — décisions archi, modèle données, migration SQL Postgres, API REST, RBAC matrice complète, 27 RG numérotées, tests à automatiser, 16 HP, liens & dépendances

Décisions structurantes (validées avec Tristan le 28/05/2026)

  • Module : extension de Commercial/ (pas nouveau module)
  • Catégories Client : M2M client_category + seed CategoryType (DISTRIBUTEUR, COURTIER, SECTEUR, AUTRE)
  • Distributeur / Courtier : 2 FK auto-référentes nullables sur client + contrainte CHECK mutex
  • Workflow création : sauvegarde incrémentale par onglet (POST formulaire principal → PATCH par onglet)
  • Onglets « À venir » (Transport / Statistiques / Rapports / Échanges) : placeholders blancs (frames vides, pas de message texte)
  • Archive vs delete : flag is_archived exposé au M1, colonne deleted_at préparée mais non exposée (HP M2)
  • API adresse : api-adresse.data.gouv.fr (BAN), appel direct front via useAddressAutocomplete()
  • Unicité métier : SIREN + companyName + email (indexes partiels Postgres, ignorent archivés et soft-deletés)
  • Téléphones : 2 colonnes plates phone_primary + phone_secondary
  • Export : XLSX uniquement (controller custom avec priority: 1)
  • Compta = lecture seule ⚠ s'écarte du tableau du .docx (ligne « Compta = Ajout/Modification Comptabilité uniquement » invalidée) — documenté en HP-M2-10

Seed M1 (référentiels comptables)

Référentiel Valeurs
tva_mode FRANCE_VENTES, EXPORT_VENTES, INTRACOM_VENTES
payment_delay J15, J30, A_RECEPTION
payment_type VIREMENT, LCR, NON_SOUMISE, CHEQUE
bank SG, CIC, CA (Société Générale / CIC / Crédit Agricole)
category_type (extension M0) DISTRIBUTEUR, COURTIER, SECTEUR, AUTRE

RG ajoutées au-delà du .docx

  • RG-1.14 : ≥ 1 bloc Contact valide obligatoire (renforcement Tristan)
  • RG-1.15/16/17 : unicités SIREN / nom / email
  • RG-1.18 : companyName UPPERCASE serveur
  • RG-1.19 : firstName / lastName Capitalize serveur
  • RG-1.20 : téléphones chiffres seuls en BDD, formatage XX XX XX XX XX au front
  • RG-1.21 : emails lowercase serveur
  • RG-1.22/23 : archivage / restauration + conflit unicité à la restauration

Permissions RBAC (à synchroniser dans les 3 miroirs au moment du dev)

Permission Admin Bureau Compta Commerciale Usine
commercial.clients.view
commercial.clients.manage
commercial.clients.accounting.view
commercial.clients.accounting.manage
commercial.clients.archive

Prochaines étapes (hors MR)

  1. Revue / validation des specs par Matthieu
  2. Création du TaskGroup Lesstime M1 — Répertoire clients (projet ERP / Starseed, projectId=6)
  3. Découpage en ~14 tickets (ordre indicatif listé en bas du spec-back.md)

Reviewer suggéré

Matthieu (CP MALIO).

Cible

develop.

## Contexte Spécifications front + back du **Module 1 — Répertoire clients** (premier module métier Tiers, extension du module `Commercial` existant). Origine : V0 client `.docx` du 22/05/2026 (`M1-reportoire-clients.docx`) + maquette Figma `https://www.figma.com/design/jRYgT0T9c03VsEbjGhCwwS/Composants---Design-System?node-id=1132-31898`. Pattern de rédaction : strictement aligné sur `docs/specs/M0-categories/` (spec-front léger + spec-back très détaillé). ## Contenu - `docs/specs/M1-clients/spec-front.md` (289 lignes) — V0 client, structure UI, composants Malio, permissions par rôle, règles de formatage - `docs/specs/M1-clients/spec-back.md` (1056 lignes) — décisions archi, modèle données, migration SQL Postgres, API REST, RBAC matrice complète, 27 RG numérotées, tests à automatiser, 16 HP, liens & dépendances ## Décisions structurantes (validées avec Tristan le 28/05/2026) - **Module** : extension de `Commercial/` (pas nouveau module) - **Catégories Client** : M2M `client_category` + seed `CategoryType` (`DISTRIBUTEUR`, `COURTIER`, `SECTEUR`, `AUTRE`) - **Distributeur / Courtier** : 2 FK auto-référentes nullables sur `client` + contrainte CHECK mutex - **Workflow création** : sauvegarde incrémentale par onglet (POST formulaire principal → PATCH par onglet) - **Onglets « À venir »** (Transport / Statistiques / Rapports / Échanges) : placeholders blancs (frames vides, pas de message texte) - **Archive vs delete** : flag `is_archived` exposé au M1, colonne `deleted_at` préparée mais non exposée (HP M2) - **API adresse** : api-adresse.data.gouv.fr (BAN), appel direct front via `useAddressAutocomplete()` - **Unicité métier** : SIREN + `companyName` + email (indexes partiels Postgres, ignorent archivés et soft-deletés) - **Téléphones** : 2 colonnes plates `phone_primary` + `phone_secondary` - **Export** : XLSX uniquement (controller custom avec `priority: 1`) - **Compta = lecture seule** ⚠ s'écarte du tableau du `.docx` (ligne « Compta = Ajout/Modification Comptabilité uniquement » invalidée) — documenté en HP-M2-10 ## Seed M1 (référentiels comptables) | Référentiel | Valeurs | |---|---| | `tva_mode` | `FRANCE_VENTES`, `EXPORT_VENTES`, `INTRACOM_VENTES` | | `payment_delay` | `J15`, `J30`, `A_RECEPTION` | | `payment_type` | `VIREMENT`, `LCR`, `NON_SOUMISE`, `CHEQUE` | | `bank` | `SG`, `CIC`, `CA` (Société Générale / CIC / Crédit Agricole) | | `category_type` (extension M0) | `DISTRIBUTEUR`, `COURTIER`, `SECTEUR`, `AUTRE` | ## RG ajoutées au-delà du `.docx` - **RG-1.14** : ≥ 1 bloc Contact valide obligatoire (renforcement Tristan) - **RG-1.15/16/17** : unicités SIREN / nom / email - **RG-1.18** : `companyName` UPPERCASE serveur - **RG-1.19** : `firstName` / `lastName` Capitalize serveur - **RG-1.20** : téléphones chiffres seuls en BDD, formatage `XX XX XX XX XX` au front - **RG-1.21** : emails lowercase serveur - **RG-1.22/23** : archivage / restauration + conflit unicité à la restauration ## Permissions RBAC (à synchroniser dans les 3 miroirs au moment du dev) | Permission | Admin | Bureau | Compta | Commerciale | Usine | |---|---|---|---|---|---| | `commercial.clients.view` | ✅ | ✅ | ✅ | ✅ | ❌ | | `commercial.clients.manage` | ✅ | ✅ | ❌ | ✅ | ❌ | | `commercial.clients.accounting.view` | ✅ | ❌ | ✅ | ❌ | ❌ | | `commercial.clients.accounting.manage` | ✅ | ❌ | ❌ | ❌ | ❌ | | `commercial.clients.archive` | ✅ | ❌ | ❌ | ❌ | ❌ | ## Prochaines étapes (hors MR) 1. Revue / validation des specs par Matthieu 2. Création du **TaskGroup Lesstime** `M1 — Répertoire clients` (projet `ERP / Starseed`, projectId=6) 3. Découpage en ~14 tickets (ordre indicatif listé en bas du `spec-back.md`) ## Reviewer suggéré Matthieu (CP MALIO). ## Cible `develop`.
matthieu added 1 commit 2026-05-28 13:20:19 +00:00
docs(commercial) : add M1 répertoire clients specs (front + back)
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m1s
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Has been cancelled
d62629f754
matthieu added 2 commits 2026-05-28 13:39:39 +00:00
fix(ci) : recreer l'index partiel uq_category_name_type_active apres schema:update
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m21s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m4s
df8ea4d0f0
doctrine:schema:update --force drop l'index unique partiel cree par la
migration M0 Catalog (LOWER(name), category_type_id) WHERE deleted_at IS NULL :
Doctrine ORM ne sait pas exprimer les index fonctionnels partiels via les
mappings, donc le voit comme orphelin.

Resultat : en CI les tests CategoryUniqueTest::testDuplicateName* attendent
un 409 (collision) et recoivent 201 — l'index unique n'existant plus, le
doublon passe.

Aligne le step CI sur la cible makefile test-db-setup qui recreait deja
l'index manuellement apres schema:update.
tristan reviewed 2026-05-29 07:30:47 +00:00
@@ -0,0 +122,4 @@
Pattern Starseed standard :
- `#[Auditable]` sur `Client`, `ClientContact`, `ClientAddress`, `ClientRib`
- `#[AuditIgnore]` sur les champs sensibles : `ClientRib.iban`, `ClientRib.bic`
Owner

Pas d'auditIgnore sur cette partie. L'audit est accessible que par les admin et on va avoir besoin de ces infos.

Pas d'auditIgnore sur cette partie. L'audit est accessible que par les admin et on va avoir besoin de ces infos.
tristan reviewed 2026-05-29 07:42:40 +00:00
@@ -0,0 +864,4 @@
- `ClientAddress` : `#[Auditable]`
- `ClientRib` :
- `#[Auditable]` sur l'entité
- `#[AuditIgnore]` sur `iban` et `bic` (RGPD / sécurité)
Owner

Comme vu plus haut, on laisse auditable ces champs

Comme vu plus haut, on laisse auditable ces champs
tristan reviewed 2026-05-29 07:51:23 +00:00
@@ -0,0 +46,4 @@
|---|---|---|---|
| **Admin** | ✅ Tout | ✅ Tout | ✅ |
| **Bureau** | ✅ Tout | ✅ Tout sauf onglet Comptabilité | ❌ |
| **Compta** | ✅ Tout | ❌ (lecture seule) | ❌ |
Owner

Le rôle compta peux modifier l'onglet compta.

Le rôle compta peux modifier l'onglet compta.
tristan reviewed 2026-05-29 07:51:59 +00:00
@@ -0,0 +270,4 @@
|---|---|---|
| 1 | Catégorie en multi-select non clarifiée (1 ou n par client) | **M2M `client_category`** validée. CategoryType seedé avec `DISTRIBUTEUR`, `COURTIER`, `SECTEUR`, `AUTRE` (HP-3 du M0 levé). |
| 2 | Distributeur / Courtier : liste de quoi ? | **Auto-référence Client** via 2 FK nullables `distributor_id` et `broker_id` (cf. RG-1.03). Une seule des deux est remplie à la fois. |
| 3 | Onglet « Comptabilité » : qui édite ? | **Admin uniquement au M1.** Compta lecture seule (décision validée par Tristan 28/05). Bureau / Commerciale ne voient pas l'onglet. |
Owner

Le rôle compta peut éditer l'onglet.

Le rôle compta peut éditer l'onglet.
matthieu added 1 commit 2026-05-29 08:09:18 +00:00
docs(commercial) : address Tristan and Matthieu MR review feedback on M1 specs
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m26s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 59s
2c5fef2074
- Compta peut éditer l'onglet Comptabilité (accounting.manage) — aligné docx

- Retirer #[AuditIgnore] sur ClientRib.iban/bic (admin-only suffit)

- Ajouter RG-1.28 (PATCH strict mix groupes -> 403)

- Ajouter RG-1.29 (filtre catégorie ClientAddress = SECTEUR + AUTRE)

- HP-M2-10 / HP-M2-12 supprimés (Compta édition nominal)
matthieu added 1 commit 2026-05-29 09:57:48 +00:00
docs(commercial) : Q4 unicité limitée au nom de société + fix onglet compta
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Has been cancelled
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Has been cancelled
9618974b70
malio added 1 commit 2026-05-29 09:58:21 +00:00
Merge branch 'develop' into feature/M1-spec-clients
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m26s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m9s
e138f26606
malio merged commit 2866fb8865 into develop 2026-05-29 09:58:32 +00:00
malio deleted branch feature/M1-spec-clients 2026-05-29 09:58:33 +00:00
Sign in to join this conversation.