feat(technique) : sous-ressources Contacts / Adresses / RIBs (ERP-135) #94

Closed
matthieu wants to merge 1 commits from feature/ERP-135-sous-ressources-provider into feature/ERP-134-provider-processor-cloisonnement-site
Owner

Stackée sur ERP-134 (cible = sa branche, pas develop).

Expose les sous-collections du prestataire en #[ApiResource] : POST sur le parent (/providers/{id}/{contacts,addresses,ribs}) + GET/PATCH/DELETE unitaires (/provider_{contacts,addresses,ribs}/{id}). Édition complète par onglet (pas de POST-only, RETEX M1/M2).

Processors dédiés

  • ProviderContactProcessor : rattachement parent (404 si absent), normalisation RG-3.11 (nom/prénom Title Case, téléphones chiffres, email lowercase), RG-3.04 (≥ 1 champ parmi prénom/nom/téléphone/email — miroir du CHECK chk_provider_contact_name → 422 sur firstName). DELETE libre (RG-3.12 front-driven).
  • ProviderAddressProcessor : rattachement parent + cloisonnement d'écriture des sites (§ 2.13 / RG-3.05 : site hors user_site d'un user non-bypass → 422 sur sites). RG-3.05/3.06/3.09 via contraintes entité.
  • ProviderRibProcessor : RG-3.08 (DELETE du dernier RIB sous LCR → 409), gating renforcé accounting.manage.

Sécurité

Contacts/Adresses = technique.providers.manage ; RIB = technique.providers.accounting.manage.

Tests

ProviderSubResourceApiTest — 19 cas (CRUD chaque sous-ressource, 403 selon permission, 409 dernier RIB LCR, 422 cloisonnement site adresse). Helpers addContact/addRib/paymentType ajoutés à AbstractProviderApiTestCase.

  • make test → OK (631 tests, 2917 assertions)
  • make php-cs-fixer-allow-risky → 0 fix

Aucune migration (réutilise les tables provider_contact/address/rib d'ERP-133).

Ticket : Lesstime #135 (ERP-135).

Stackée sur ERP-134 (cible = sa branche, pas develop). Expose les sous-collections du prestataire en `#[ApiResource]` : POST sur le parent (`/providers/{id}/{contacts,addresses,ribs}`) + GET/PATCH/DELETE unitaires (`/provider_{contacts,addresses,ribs}/{id}`). Édition complète par onglet (pas de POST-only, RETEX M1/M2). ## Processors dédiés - **ProviderContactProcessor** : rattachement parent (404 si absent), normalisation RG-3.11 (nom/prénom Title Case, téléphones chiffres, email lowercase), RG-3.04 (≥ 1 champ parmi prénom/nom/téléphone/email — miroir du CHECK `chk_provider_contact_name` → 422 sur `firstName`). DELETE libre (RG-3.12 front-driven). - **ProviderAddressProcessor** : rattachement parent + cloisonnement d'écriture des sites (§ 2.13 / RG-3.05 : site hors `user_site` d'un user non-bypass → 422 sur `sites`). RG-3.05/3.06/3.09 via contraintes entité. - **ProviderRibProcessor** : RG-3.08 (DELETE du dernier RIB sous LCR → 409), gating renforcé `accounting.manage`. ## Sécurité Contacts/Adresses = `technique.providers.manage` ; RIB = `technique.providers.accounting.manage`. ## Tests `ProviderSubResourceApiTest` — 19 cas (CRUD chaque sous-ressource, 403 selon permission, 409 dernier RIB LCR, 422 cloisonnement site adresse). Helpers `addContact`/`addRib`/`paymentType` ajoutés à `AbstractProviderApiTestCase`. - `make test` → OK (631 tests, 2917 assertions) - `make php-cs-fixer-allow-risky` → 0 fix Aucune migration (réutilise les tables `provider_contact/address/rib` d'ERP-133). Ticket : Lesstime #135 (ERP-135).
matthieu added 1 commit 2026-06-12 09:34:04 +00:00
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.
matthieu added the backM3-Prestatairetype/feat labels 2026-06-12 09:34:28 +00:00
Author
Owner

Consolidée dans #100 : toute la pile M3-Prestataire (ERP-134 à ERP-139) a été rebasée sur develop et regroupée dans la MR #100 (mergeable, tests verts). Cette MR intermédiaire est fermée pour ne garder qu'une seule MR ouverte. Les commits de ce ticket restent présents dans #100.

Consolidée dans #100 : toute la pile M3-Prestataire (ERP-134 à ERP-139) a été rebasée sur develop et regroupée dans la MR #100 (mergeable, tests verts). Cette MR intermédiaire est fermée pour ne garder qu'une seule MR ouverte. Les commits de ce ticket restent présents dans #100.
matthieu closed this pull request 2026-06-12 14:37:10 +00:00

Pull request closed

Sign in to join this conversation.