feat(commercial) : SupplierProvider + SupplierProcessor + gating compta (ERP-87) #66

Merged
malio merged 1 commits from feature/ERP-87-provider-processor-m2 into develop 2026-06-08 07:29:51 +00:00
Owner

ERP-87 — Provider + Processor du répertoire fournisseurs (M2)

Étape 3/7 du pipeline M2. Dépend de #86, bloque #88/#91/#92. Jumelle du M1 (Client*).

Livré

  • SupplierProvider : liste paginée (Paginator ORM), exclusion archivés + soft-deletes par défaut, filtres includeArchived/categoryCode/siteId/search, échappatoire ?pagination=false, item 404 si soft-delete (RG-2.17).
  • SupplierProcessor : normalisation companyName, archivage isArchived/archivedAt (RG-2.14/2.15), gating fin accounting/manage en mode strict (403 sur tout payload hors-permission, RG-2.16), 409 doublon companyName + conflit de restauration (RG-2.11).
  • SupplierReadGroupContextBuilder : ajoute supplier:read:accounting au contexte de lecture si accounting.view → gating compta + RIB par omission de clé (parade bug #4 M1). Un Provider ne pouvant pas influencer les groupes de sérialisation, c'est le point d'extension idiomatique (miroir de ClientReadGroupContextBuilder).
  • SupplierFieldNormalizer : normalisation serveur (RG-2.12).
  • Supplier : ajout #[ApiResource] (GetCollection/Get/Post/Patch) wirant Provider/Processor.

Décision d'archi

La spec décrit « le Provider retire le groupe accounting » — techniquement impossible (le Provider ne touche pas les groupes de sérialisation). Implémenté via décorateur SerializerContextBuilder (mirror M1), résultat fonctionnel identique (clé absente sans permission).

Hors périmètre (ticket suivant #5)

Validators métier : RG-2.03 (complétude Information Commerciale), RG-2.07 (Virement→banque), RG-2.08 (LCR→RIB), RG-2.10 (catégorie type FOURNISSEUR). Le Processor est structuré pour les accueillir.

À noter

Les permissions commercial.suppliers.* (référencées par les security) ne sont pas encore déclarées — ticket RBAC #7. Sans elles, is_granted renvoie false (pas d'erreur de compilation).

Vérifs

  • make test : 483/483 vert
  • make php-cs-fixer-allow-risky : appliqué
## ERP-87 — Provider + Processor du répertoire fournisseurs (M2) Étape 3/7 du pipeline M2. Dépend de #86, bloque #88/#91/#92. Jumelle du M1 (Client*). ### Livré - **SupplierProvider** : liste paginée (Paginator ORM), exclusion archivés + soft-deletes par défaut, filtres `includeArchived`/`categoryCode`/`siteId`/`search`, échappatoire `?pagination=false`, item 404 si soft-delete (RG-2.17). - **SupplierProcessor** : normalisation `companyName`, archivage `isArchived`/`archivedAt` (RG-2.14/2.15), gating fin accounting/manage en **mode strict** (403 sur tout payload hors-permission, RG-2.16), 409 doublon `companyName` + conflit de restauration (RG-2.11). - **SupplierReadGroupContextBuilder** : ajoute `supplier:read:accounting` au contexte de lecture si `accounting.view` → gating compta + RIB **par omission de clé** (parade bug #4 M1). Un Provider ne pouvant pas influencer les groupes de sérialisation, c'est le point d'extension idiomatique (miroir de `ClientReadGroupContextBuilder`). - **SupplierFieldNormalizer** : normalisation serveur (RG-2.12). - **Supplier** : ajout `#[ApiResource]` (GetCollection/Get/Post/Patch) wirant Provider/Processor. ### Décision d'archi La spec décrit « le Provider retire le groupe accounting » — techniquement impossible (le Provider ne touche pas les groupes de sérialisation). Implémenté via décorateur `SerializerContextBuilder` (mirror M1), résultat fonctionnel identique (clé absente sans permission). ### Hors périmètre (ticket suivant #5) Validators métier : RG-2.03 (complétude Information Commerciale), RG-2.07 (Virement→banque), RG-2.08 (LCR→RIB), RG-2.10 (catégorie type FOURNISSEUR). Le Processor est structuré pour les accueillir. ### À noter Les permissions `commercial.suppliers.*` (référencées par les `security`) ne sont pas encore déclarées — ticket RBAC #7. Sans elles, `is_granted` renvoie `false` (pas d'erreur de compilation). ### Vérifs - `make test` : 483/483 vert - `make php-cs-fixer-allow-risky` : appliqué
matthieu added the backM2-Fournisseurtype/feat labels 2026-06-05 09:28:42 +00:00
malio changed target branch from feature/ERP-86-entites-repos-m2 to develop 2026-06-08 07:18:33 +00:00
matthieu added 1 commit 2026-06-08 07:26:20 +00:00
feat(commercial) : SupplierProvider + SupplierProcessor + gating compta (ERP-87)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Failing after 1m38s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m7s
b6dc54d179
Branche les operations API du repertoire fournisseurs (M2), jumelles du M1 :

- SupplierProvider : liste paginee (Paginator ORM), exclusion archives +
  soft-deletes par defaut, filtres includeArchived/categoryCode/siteId/search,
  echappatoire ?pagination=false, item 404 si soft-delete (RG-2.17).
- SupplierProcessor : normalisation companyName, archivage isArchived/archivedAt
  (RG-2.14/2.15), gating fin accounting/manage en mode strict (403 sur tout le
  payload hors-permission, RG-2.16), 409 doublon companyName + conflit de
  restauration (RG-2.11).
- SupplierReadGroupContextBuilder : ajoute supplier:read:accounting au contexte
  de lecture si accounting.view (gating compta + RIB par omission de cle). Un
  Provider ne peut pas influencer les groupes de serialisation : c'est le point
  d'extension idiomatique, miroir de ClientReadGroupContextBuilder.
- SupplierFieldNormalizer : normalisation serveur (RG-2.12).
- Supplier : ajout #[ApiResource] (GetCollection/Get/Post/Patch) wirant
  Provider/Processor.

Validators metier (RG-2.03/2.07/2.08/2.10) = ticket suivant.
make test vert (483/483), php-cs-fixer applique.
matthieu force-pushed feature/ERP-87-provider-processor-m2 from 3838473876 to b6dc54d179 2026-06-08 07:26:20 +00:00 Compare
malio merged commit e77c6378d3 into develop 2026-06-08 07:29:51 +00:00
malio deleted branch feature/ERP-87-provider-processor-m2 2026-06-08 07:29:51 +00:00
Sign in to join this conversation.