test(commercial) : cover RG-1.01..1.29 except role-gated (M1) + polish stack #38

Merged
malio merged 7 commits from feature/ERP-60-tests-phpunit-rg-clients into develop 2026-06-01 19:46:41 +00:00
Owner

Dernier wagon de la stack back M1. ERP-60 = polish stack + couverture de tests PHPUnit NON dépendante des rôles métier (cf. spec § 7 / § 8.1).

Phase 0 — polish stack (déjà mergé dans les branches basses via rebase)

  • ERP-59 : route sidebar /clients (au lieu de /commercial/clients), cohérente avec /suppliers.
  • One-liner pagination Client abandonné : pagination_client_enabled: true est déjà le défaut global → ?pagination=false marche déjà sur /api/clients (décision P7).

Phase 1 — tests (combler les trous, zéro duplication)

8 nouvelles suites couvrant les RG non encore testées par ERP-55/56/57/58 :

  • ClientFormulaireMainTest — RG-1.02 (téléphone secondaire, max 2).
  • ClientAddressTest — RG-1.06/07/08 + RG-1.11 (CHECK BDD prospect/billing).
  • ClientUniquenessTest — RG-1.15/1.17 (Q4 : SIREN/email NON uniques).
  • ClientArchiveTestRG-1.23 : 409 restauration en conflit (gap P1).
  • ClientAuditTest — RG-1.27 (created* figés / updatedBy modificateur) + iban/bic présents dans le diff audité.
  • ClientMigrationTest — index partiel unique uq_client_company_name_active (1 seul) ; pas d'index siren/email.
  • ClientSecurityTest — 401 anonyme + 403 sans commercial.clients.view.
  • ClientPatchStrictTest — RG-1.28 (403 strict mix de groupes, fonctionnel).

Cahier de test complet (mapping de TOUTES les RG → test) : docs/specs/M1-clients/cahier-test-back-M1.md.

Délégué à ERP-74 (#493)

Matrice RBAC différenciée (bureau/compta/commerciale/usine) + RG-1.04 fonctionnel — exigent les rôles métier seedés après le merge de la stack.

Gaps documentés (cahier)

  • RG-1.29 validation écriture (catégorie type sur adresse → 422) non implémentée back (hors § 8.1, ticket test-only).
  • Violations CHECK adresse → rejet (≥400) sans mapping fin 422 (amélioration possible).

Vérifs

make db-reset && make php-cs-fixer-allow-risky && make test421 tests OK, 1386 assertions, 0 risky. Nouveaux tests : 17, 71 assertions.

Dernier wagon de la stack back M1. ERP-60 = polish stack + couverture de tests PHPUnit NON dépendante des rôles métier (cf. spec § 7 / § 8.1). ## Phase 0 — polish stack (déjà mergé dans les branches basses via rebase) - ERP-59 : route sidebar `/clients` (au lieu de `/commercial/clients`), cohérente avec `/suppliers`. - One-liner pagination Client abandonné : `pagination_client_enabled: true` est déjà le défaut global → `?pagination=false` marche déjà sur `/api/clients` (décision P7). ## Phase 1 — tests (combler les trous, zéro duplication) 8 nouvelles suites couvrant les RG non encore testées par ERP-55/56/57/58 : - `ClientFormulaireMainTest` — RG-1.02 (téléphone secondaire, max 2). - `ClientAddressTest` — RG-1.06/07/08 + RG-1.11 (CHECK BDD prospect/billing). - `ClientUniquenessTest` — RG-1.15/1.17 (Q4 : SIREN/email NON uniques). - `ClientArchiveTest` — **RG-1.23 : 409 restauration en conflit (gap P1)**. - `ClientAuditTest` — RG-1.27 (created* figés / updatedBy modificateur) + iban/bic présents dans le diff audité. - `ClientMigrationTest` — index partiel unique `uq_client_company_name_active` (1 seul) ; pas d'index siren/email. - `ClientSecurityTest` — 401 anonyme + 403 sans `commercial.clients.view`. - `ClientPatchStrictTest` — RG-1.28 (403 strict mix de groupes, fonctionnel). Cahier de test complet (mapping de TOUTES les RG → test) : `docs/specs/M1-clients/cahier-test-back-M1.md`. ## Délégué à ERP-74 (#493) Matrice RBAC différenciée (bureau/compta/commerciale/usine) + RG-1.04 fonctionnel — exigent les rôles métier seedés après le merge de la stack. ## Gaps documentés (cahier) - RG-1.29 validation écriture (catégorie type sur adresse → 422) non implémentée back (hors § 8.1, ticket test-only). - Violations CHECK adresse → rejet (≥400) sans mapping fin 422 (amélioration possible). ## Vérifs `make db-reset && make php-cs-fixer-allow-risky && make test` → **421 tests OK, 1386 assertions, 0 risky**. Nouveaux tests : 17, 71 assertions.
matthieu added the backtype/test labels 2026-06-01 15:19:40 +00:00
malio changed target branch from feature/ERP-58-export-xlsx-clients to develop 2026-06-01 19:28:39 +00:00
matthieu force-pushed feature/ERP-60-tests-phpunit-rg-clients from 027e80cc4b to a048be1cf7 2026-06-01 19:36:16 +00:00 Compare
matthieu added 7 commits 2026-06-01 19:45:32 +00:00
Ajoute CommercialModule::permissions() (5 codes commercial.clients.* :
view, manage, accounting.view, accounting.manage, archive) — alignes sur
les is_granted deja references par ERP-55 (Client ApiResource, ClientProcessor,
ClientReadGroupContextBuilder).

Synchronise les 3 sources RBAC (regle ABSOLUE n8) : item sidebar
"Repertoire clients" (commercial.clients.view), persona user-full dans
personas.ts et SeedE2ECommand.php, cle i18n sidebar.commercial.clients.

Les roles metier Bureau/Compta/Commerciale/Usine sont seedes par ERP-74 :
les 5 permissions sont mappees ici sur le seul persona technique user-full
en attendant, sans creer de nouveau persona (regle n7).
Expose TvaMode, PaymentDelay, PaymentType et Bank en lecture seule
(GetCollection + Get), security commercial.clients.view au niveau
operations + ressource. Aucune ecriture declaree -> POST/PATCH/DELETE
renvoient 405.

Tri par defaut position ASC puis label ASC (spec M1 § 4.7). Pagination
serveur conservee (ERP-72) avec paginationClientEnabled pour activer
l'echappatoire ?pagination=false (alimenter un select sans pagination).

Endpoints : GET /api/tva_modes, /api/payment_delays, /api/payment_types,
/api/banks. Tests fonctionnels : 200 + seed, tri position/label,
405 ecritures, 403 sans permission, 401 anonyme, pagination toggle.
Expose les sous-ressources Contacts / Adresses / RIB du repertoire clients
(M1, spec § 4.5) :

- 3 Processors dedies (ClientContactProcessor, ClientAddressProcessor,
  ClientRibProcessor) : normalisation serveur reutilisant ClientFieldNormalizer
  (RG-1.19 capitalize, RG-1.20 telephones chiffres, RG-1.21 emails/billingEmail
  lowercase) + regles metier.
- Operations API Platform :
  - POST /api/clients/{id}/contacts|addresses, PATCH/DELETE /api/client_contacts|addresses/{id}
    (security commercial.clients.manage)
  - POST /api/clients/{id}/ribs, PATCH/DELETE /api/client_ribs/{id}
    (security commercial.clients.accounting.manage)
  - GET item par sous-ressource (lecture unitaire) ; pas de GET collection
    autonome (lecture via le parent, non concernee par la pagination ERP-72).
- Regles de gestion :
  - RG-1.13 : DELETE du dernier RIB d'un client en reglement LCR -> 409.
  - RG-1.14 : DELETE du dernier contact d'un client -> 409 (completude front au M1).
  - RG-1.05 : prenom OU nom du contact obligatoire -> 422.
- Validations deja portees par l'entite et desormais exercees : Assert\Count(min:1)
  sur ClientAddress.sites (RG-1.10), Assert\Regex code postal (RG-1.09),
  Assert\Iban / Assert\Bic sur ClientRib.
- SiteReferenceDenormalizer : resout les IRIs /api/sites vers SiteInterface
  (meme pattern que CategoryReferenceDenormalizer, sans import cross-module).
- Ajout de symfony/intl, requis par Assert\Bic.

Tests : ClientSubResourceApiTest (13 cas) couvrant CRUD, normalisation,
RG-1.13/1.14, gating 403 sur client_ribs sans accounting.manage. Suite back
complete au vert (383 tests).
test(commercial) : cover RG-1.01..1.29 except role-gated (M1)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m52s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m10s
1c0ebceaf9
matthieu force-pushed feature/ERP-60-tests-phpunit-rg-clients from a048be1cf7 to 1c0ebceaf9 2026-06-01 19:45:32 +00:00 Compare
malio merged commit 120058049c into develop 2026-06-01 19:46:41 +00:00
malio deleted branch feature/ERP-60-tests-phpunit-rg-clients 2026-06-01 19:46:43 +00:00
matthieu added the M1-Client label 2026-06-01 21:15:01 +00:00
Sign in to join this conversation.