tristan
e986980d68
feat(commercial) : filtres répertoire clients via drawer (recherche, catégories, sites, archivés)
...
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m47s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m3s
Front :
- Bouton « Filtres » (à droite d'Ajouter) ouvrant un drawer accordion (façon
audit-log) : Recherche, Catégories (multi), Sites (multi), Statut (archivés).
État brouillon → appliqué, 100 % local. Compteur de filtres actifs sur le bouton.
- Suppression du toggle « Voir les archivés » (remplacé par le bool du drawer).
- Export et liste partagent les mêmes filtres.
- useClientsRepository redevient un simple wrapper de usePaginatedList.
Back (contrat liste partagé liste + export) :
- createListQueryBuilder : categoryCodes[] (OR), siteIds[] (clients ayant ≥1
adresse sur le site), archivedOnly (archives seules, prioritaire sur
includeArchived). search inchangé.
- ClientProvider + ClientExportController lisent les nouveaux params (valeur
unique ou liste ?key[]=). Tests fonctionnels (catégories multi, site, archivés).
2026-06-02 14:49:21 +02:00
tristan
9ca9cb1d42
feat(front) : page répertoire clients + datatable
...
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m47s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m15s
- Page /clients (route à plat) : MalioDataTable 6 colonnes (contact, téléphone
formaté, codes catégories, badges sites), toggle « Voir les archivés » (état
local), boutons Ajouter (manage) / Exporter (view, download xlsx), clic ligne
vers le détail, empty state.
- Composable useClientsRepository (wrapper de usePaginatedList) + util
formatPhoneFR + clé i18n showArchived.
- Contrat back : la liste client:read expose désormais les codes catégories
(category:read) et les sites agrégés des adresses (site:read + Client::getSites) ;
jointures anti N+1 dans createListQueryBuilder. Tests back + front.
2026-06-02 11:17:22 +02:00
matthieu
00bd02858c
[ERP-78] Refonte taxonomie Catégories : type unique CLIENT + Category.code + RG-1.03/1.29 par code ( #42 )
...
Auto Tag Develop / tag (push) Successful in 8s
Refonte de la taxonomie Catégories (décision produit 01/06) : le modèle est inversé.
## Modèle
- **UN SEUL `category_type` : CLIENT**. `Distributeur` / `Courtier` / `Secteur` / `Autre` (+ catégories métier) deviennent des `Category` rattachées à CLIENT.
- Filtrage métier sur un **`code` stable porté par `Category`** (NOT NULL, unique partiel `uq_category_code`), slug MAJUSCULE auto-généré du nom (`CategoryCodeGenerator`), figé à la création, exposé en **lecture seule**.
## Contenu
- **M0** : `Category.code` (entité + migration corrective `Version20260602100000` au namespace racine + `COMMENT ON COLUMN` + catalogue + ligne `test-db-setup`). Retrofit `Version20260528120000` rendu conscient des colonnes.
- **Seed** : type unique CLIENT, catégories codées (`Distributeur→DISTRIBUTEUR`, etc.), anciens types supprimés. Fixtures `CategoryType`/`Category`/`Client` alignées.
- **RG-1.03** : `ClientProcessor::hasCategoryCode` — un distributor/broker doit porter la `Category` de code `DISTRIBUTEUR`/`COURTIER`. Filtre liste/export `categoryType` → `categoryCode`.
- **RG-1.29** : `ClientAddress::validateCategoryCodes` — denylist des codes `DISTRIBUTEUR`/`COURTIER` sur une adresse (toute autre catégorie autorisée).
- **Specs** M0/M1 (back + front) amendées.
## Tests
`make php-cs-fixer-allow-risky` OK ; `make db-reset` OK (type unique CLIENT + 11 catégories codées, idempotent) ; `make test` **443 vert**. Ajouts : RG-1.03 courtier, génération/unicité/lecture-seule du code (`CategoryCodeTest`).
## Coordination
- #76 (#500 ) : RG-1.29 réécrite ici sur le nouveau modèle ; #76 ne garde que le gap 2 (mapping CHECK adresse → 422), indépendant de la taxonomie.
- ERP-68 (#486 ) : fixtures démo (déjà mergées via #41 ) adaptées ici au type unique CLIENT + codes.
- Front #480–483 : selects Catégorie / distributeur / courtier basés sur le `code` (`?categoryCode=`), plus le type.
Décisions actées avec le PO : `code` NOT NULL auto-généré (slug) ; périmètre complet (réécriture RG + fixtures déjà mergées).
---------
Co-authored-by: Matthieu <contact@malio.fr >
Reviewed-on: #42
Co-authored-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr >
Co-committed-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr >
2026-06-02 08:00:42 +00:00
matthieu
0c9b563cae
[ERP-55] ClientProvider + ClientProcessor + RG métier (M1) — stackée sur ERP-54 ( #31 )
...
Auto Tag Develop / tag (push) Successful in 9s
**MR stackée sur ERP-54** — cible = `feature/ERP-54-creer-entites-client-m1` (PAS `develop`). Tristan validera le stack en fin de chaîne.
Branche l'API REST du répertoire clients (M1) sur l'entité `Client` d'ERP-54.
## Périmètre
- **ClientProvider** : liste paginée (Paginator ORM aligné ERP-72, `?pagination=false`), exclusion archives+soft-delete par défaut (RG-1.24), `?includeArchived=true` (RG-1.25), tri `companyName ASC` (RG-1.26), filtres `?search` (fuzzy) + `?categoryType`, détail 404 si soft-deleted + embarque contacts/adresses/ribs.
- **ClientProcessor** : normalisation (RG-1.18→1.21), 409 doublon nom (RG-1.16) + 409 restauration (RG-1.23), gating par onglet `accounting.manage`/`archive` + mode strict 403 (RG-1.28), archivage exclusif + `archivedAt` (RG-1.22), RG-1.01 / RG-1.03 (mutex + type catégorie) / RG-1.12 / RG-1.13 / RG-1.04.
- **ClientReadGroupContextBuilder** : ajout conditionnel du groupe `client:read:accounting` selon `commercial.clients.accounting.view`.
- **CategoryReferenceDenormalizer** : résout les IRI catégorie vers `Category` (dénormalisation impossible sur l'interface sinon).
- **Contrats Shared** : `CategoryInterface::getCategoryTypeCode()`, `BusinessRoleAwareInterface` + `BusinessRoles::COMMERCIALE`.
## Coordination stack
- Permissions `commercial.clients.*` **référencées** ici, déclarées en **ERP-59** (tests RBAC en **ERP-60**).
- Rôle métier `commerciale` seedé par **ERP-74** (RG-1.04 dormante d'ici là).
- Config globale pagination (itemsPerPage client / max 50) portée par **ERP-72**.
- Référentiels comptables (PaymentType/Bank/...) exposés en **ERP-56** → RG-1.12/1.13 testées en unitaire ici (pas d'IRI référentiel disponible avant ERP-56).
## Tests
31 tests Commercial (intégration admin sur les RG métier + unitaires sur le gating / RG-1.04 / RG-1.12 / RG-1.13 / context builder). Suite complète verte (343 tests). Règle n°1 respectée (aucun import inter-modules dans Commercial).
---------
Co-authored-by: tristan <tristan@yuno.malio.fr >
Co-authored-by: Matthieu <contact@malio.fr >
Co-authored-by: Matthieu <mtholot19@gmail.com >
Reviewed-on: #31
Co-authored-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr >
Co-committed-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr >
2026-06-01 19:28:04 +00:00