Matthieu
9a0da4de63
feat(technique) : sous-ressources Contacts / Adresses / RIBs (ERP-135)
...
Expose les sous-collections du prestataire en #[ApiResource] (POST sur le
parent + PATCH/DELETE/GET unitaires), edition complete par onglet (pas de
POST-only, RETEX M1/M2) :
- ProviderContact : POST /providers/{id}/contacts, PATCH/DELETE
/provider_contacts/{id} (security technique.providers.manage).
ProviderContactProcessor : normalisation RG-3.11 (nom/prenom Title Case,
telephones chiffres, email lowercase) + RG-3.04 (au moins un champ parmi
prenom/nom/telephone/email, miroir du CHECK chk_provider_contact_name -> 422).
- ProviderAddress : POST /providers/{id}/addresses, PATCH/DELETE
/provider_addresses/{id} (security technique.providers.manage).
ProviderAddressProcessor : rattachement parent + cloisonnement d'ecriture des
sites de l'adresse (RG-3.05 / § 2.13 : site hors user_site -> 422 sur sites).
- ProviderRib : POST /providers/{id}/ribs, PATCH/DELETE /provider_ribs/{id}
(security technique.providers.accounting.manage). ProviderRibProcessor :
RG-3.08 (DELETE du dernier RIB sous LCR -> 409).
Tests : ProviderSubResourceApiTest (19 cas) — CRUD chaque sous-ressource, 403
selon permission (Contacts/Adresses=manage, RIB=accounting.manage), 409 dernier
RIB LCR, 422 cloisonnement site adresse. Helpers addContact/addRib/paymentType
ajoutes a AbstractProviderApiTestCase.
2026-06-12 11:32:08 +02:00
Matthieu
0ca1fb159a
feat(technique) : ProviderProvider + ProviderProcessor + cloisonnement site (ERP-134)
...
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).
2026-06-12 11:03:19 +02:00
Matthieu
58474404b4
feat(technique) : entités + repositories Provider* (ERP-133)
...
- 4 entités Provider / ProviderContact / ProviderAddress / ProviderRib
(#[Auditable] + Timestampable/Blamable), miroir Supplier* amputé de
l'onglet Information et augmenté de provider.sites (M2M direct, RG-3.03).
- Contrat de sérialisation à 3 maillons (groupes liste/détail, getter
isArchived + SerializedName) ; référentiels comptables consommés en
relation ORM partagée, Site/Category via contrats Shared.
- DoctrineProviderRepository : createListQueryBuilder (filtres + tri) +
hydratation anti-N+1 categories puis sites (relation directe) en requêtes
IN bornées séparées.
- Mapping ORM du module Technique (doctrine.yaml), catalogue COMMENT des
tables provider*, index partiel uq_provider_company_name_active
(test-db-setup), libellés audit i18n technique_*, whitelist Length du CP
ProviderAddress.
ApiResource posé en squelette : ProviderProvider / ProviderProcessor
(hydratation effective, gating accounting, cloisonnement site, normalisation,
409, RG-3.07/3.08) relèvent d'ERP-134.
2026-06-12 10:31:33 +02:00
Matthieu
6ceef62056
feat(technique) : module Technique + taxonomie categories prestataires
...
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m13s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m27s
Cree le nouveau module Technique (pole distinct du Commercial) prerequis du
M3 repertoire prestataires :
- TechniqueModule (ID=technique, REQUIRED=false) + 5 permissions RBAC
technique.providers.* (view / manage / accounting.view / accounting.manage
/ archive), declarees pour app:sync-permissions.
- Activation dans config/modules.php + layer front frontend/modules/technique/.
- Seed taxonomie : nouveau CategoryType PRESTATAIRE + 3 categories
(Maintenance industrielle, Nettoyage, Transport) via migration idempotente
(ON CONFLICT / NOT EXISTS, jonction M2M category_category_type) ET fixtures
CategoryType/Category (survivent au purger db-reset).
- Tests : structure du module (5 permissions figees) + filtre
GET /api/categories?typeCode=PRESTATAIRE.
Inclut la spec back/front M3 et le RETEX M1.
2026-06-12 09:23:08 +02:00