Coeur API du repertoire prestataires (M3), jumeau du M2 fournisseurs :
- ProviderProvider : liste paginee (Paginator ORM), filtres
search/categoryCode/siteId/includeArchived, tri companyName ASC,
exclusion archives + soft-deletes (RG-3.16). Cloisonnement par site
pilote par l'utilisateur (RG-3.17 / § 2.13) : liste restreinte au
currentSite avant pagination (totalItems = perimetre), detail hors
perimetre -> 404, bypass via sites.bypass_scope.
- ProviderProcessor : normalisation companyName (RG-3.11), POST formulaire
principal (companyName + categories + sites), PATCH partiels par groupe
en mode strict (RG-3.15, 403 sur tout le payload), archivage
(RG-3.13/3.14), 409 doublon de nom (RG-3.10), garde d'ecriture cloisonnee
des sites (RG-3.03/3.17, 422 sur sites pour les users sites.read_ref).
- ProviderReadGroupContextBuilder : gating comptabilite par AJOUT du groupe
provider:read:accounting si accounting.view (jamais par retrait).
- ProviderFieldNormalizer : miroir SupplierFieldNormalizer.
- ApiResource cable (provider + processor) sur l'entite Provider.
Tests : ProviderApiTest, ProviderListTest, ProviderRbacGatingTest,
ProviderSiteScopeTest (26 tests). Suite complete verte (612 tests).
Cree tout le schema BDD M3 du prestataire (jumeau du M2 fournisseur), sous
le namespace racine DoctrineMigrations (FK cross-module user/category/site +
referentiels comptables M1) :
- provider : company_name + bloc Comptabilite (siren/account_number/n_tva +
FK tva_mode/payment_delay/payment_type/bank ON DELETE RESTRICT) +
is_archived/archived_at/deleted_at + Timestampable/Blamable. Pas d onglet
Information (contrairement a supplier).
- M2M formulaire principal : provider_category (RG-3.09), provider_site
(sites du prestataire, RG-3.03 — nouveau vs supplier, + idx_provider_site_site).
- Sous-collections : provider_contact (CHECK chk_provider_contact_name :
>=1 champ parmi first_name/last_name/phone_primary/email), provider_address
(sans address_type/bennes/triage), provider_rib.
- Jointures adresse : provider_address_site (RG-3.05), provider_address_contact,
provider_address_category.
- Index partiel unique uq_provider_company_name_active (LOWER(company_name)
WHERE non archive/non supprime — RG-3.10) + index FK.
- COMMENT ON COLUMN/TABLE inline sur toutes les colonnes (regle n°12).
CategoryType PRESTATAIRE non re-seede (deja cree par ERP-131). Catalogue
ColumnCommentsCatalog et ligne dbal:run-sql differes au ticket entites (ERP-133),
comme supplier : tant que les entites Provider* n existent pas, schema:update du
setup test droppe ces tables non mappees et app:apply-column-comments planterait.