feat(front) : page Ajouter un fournisseur (/suppliers/new) + workflow par onglets (ERP-94) #83

Merged
tristan merged 7 commits from feature/ERP-94-suppliers-new into develop 2026-06-11 07:14:53 +00:00
Owner

ERP-94 (etape front 7/7 du M2). Stack sur #97 (base = feature/ERP-97-suppliers-i18n-sidebar, elle-meme sur #93) pour un diff isole. A recibler sur develop une fois #93 (MR #81) et #97 (MR #82) mergees.

Page « Ajouter un fournisseur » — replique a l'identique le fonctionnement de l'ecran Client (workflow inline par onglets, blocs reutilisables, validation 422 inline ERP-101), avec les specificites M2.

Architecture (miroir Client)

  • Workflow par onglets inline dans suppliers/new.vue (comme clients/new.vue — il n'existe pas de useClientForm monolithique). Helpers paralleles : useSupplierReferentials, useSupplierFormErrors, supplierFormRules, supplierEdit (payloads), types/supplierForm.
  • Blocs SupplierContactBlock / SupplierAddressBlock (miroir des blocs Client).
  • POST /suppliers puis PATCH partiels par onglet (mode strict, groupes de serialisation). Sous-ressources : /suppliers/{id}/contacts|addresses|ribs.
  • Validation ERP-101 : 422 violations[].propertyPath mappees inline par champ (useFormErrors / mapViolationsToRecord), { toast: false }, bouton Valider toujours actif.

Specificites M2 (vs M1)

  • Formulaire principal sans contact inline (ERP-106) : Entreprise + Categorie (type FOURNISSEUR, ?typeCode=FOURNISSEUR).
  • Adresse : radio exclusif Prospect/Depart/Rendu (addressType enum, RG-2.09), champs Bennes (stepper) + Prestation de triage, pas d'email de facturation.
  • Information : champ Volume previsionnel (8e champ).
  • Compta (Admin+Compta) : banque si VIREMENT (RG-2.07), RIB si LCR (RG-2.08) ; RIB sous-ressource gardee par accounting.manage.

Tests (mirroir strategie Client)

  • make nuxt-test : 338 passed (specs ajoutees : supplierFormRules, supplierEdit, useSupplierReferentials, SupplierContactBlock, SupplierAddressBlock).
  • ESLint propre ; nuxi typecheck (lance en container) : 0 erreur.
  • Golden path navigateur valide end-to-end : POST /suppliers OK, companyName normalise UPPERCASE (RG-2.12), gating des onglets (Information actif, Contacts deverrouille).

Note de revue

~30 WARN Duplicated imports au typecheck : les helpers Supplier exportent les memes noms generiques que leurs equivalents Client (buildMainPayload, omitEmptyRequired, RefOption...), tous deux auto-importes par Nuxt. Sans impact runtime : tous les consommateurs utilisent des imports explicites (qui priment). Consequence directe du miroir 1:1 ; une factorisation des generiques dans shared/ pourrait etre un suivi.

ERP-94 (etape front 7/7 du M2). **Stack sur #97** (base = `feature/ERP-97-suppliers-i18n-sidebar`, elle-meme sur #93) pour un diff isole. A recibler sur `develop` une fois #93 (MR #81) et #97 (MR #82) mergees. Page « Ajouter un fournisseur » — **replique a l'identique le fonctionnement de l'ecran Client** (workflow inline par onglets, blocs reutilisables, validation 422 inline ERP-101), avec les specificites M2. ## Architecture (miroir Client) - Workflow par onglets **inline dans `suppliers/new.vue`** (comme `clients/new.vue` — il n'existe pas de `useClientForm` monolithique). Helpers paralleles : `useSupplierReferentials`, `useSupplierFormErrors`, `supplierFormRules`, `supplierEdit` (payloads), `types/supplierForm`. - Blocs `SupplierContactBlock` / `SupplierAddressBlock` (miroir des blocs Client). - POST `/suppliers` puis PATCH partiels par onglet (mode strict, groupes de serialisation). Sous-ressources : `/suppliers/{id}/contacts|addresses|ribs`. - Validation ERP-101 : 422 `violations[].propertyPath` mappees inline par champ (`useFormErrors` / `mapViolationsToRecord`), `{ toast: false }`, bouton Valider toujours actif. ## Specificites M2 (vs M1) - Formulaire principal **sans contact inline** (ERP-106) : Entreprise + Categorie (type FOURNISSEUR, `?typeCode=FOURNISSEUR`). - Adresse : **radio exclusif** Prospect/Depart/Rendu (`addressType` enum, RG-2.09), champs **Bennes** (stepper) + **Prestation de triage**, **pas d'email de facturation**. - Information : champ **Volume previsionnel** (8e champ). - Compta (Admin+Compta) : banque si VIREMENT (RG-2.07), RIB si LCR (RG-2.08) ; RIB sous-ressource gardee par `accounting.manage`. ## Tests (mirroir strategie Client) - `make nuxt-test` : 338 passed (specs ajoutees : supplierFormRules, supplierEdit, useSupplierReferentials, SupplierContactBlock, SupplierAddressBlock). - ESLint propre ; `nuxi typecheck` (lance en container) : **0 erreur**. - Golden path navigateur valide end-to-end : POST /suppliers OK, companyName normalise UPPERCASE (RG-2.12), gating des onglets (Information actif, Contacts deverrouille). ## Note de revue ~30 `WARN Duplicated imports` au typecheck : les helpers Supplier exportent les memes noms generiques que leurs equivalents Client (`buildMainPayload`, `omitEmptyRequired`, `RefOption`...), tous deux auto-importes par Nuxt. **Sans impact runtime** : tous les consommateurs utilisent des imports explicites (qui priment). Consequence directe du miroir 1:1 ; une factorisation des generiques dans `shared/` pourrait etre un suivi.
tristan added the frontM2-Fournisseurtype/feat labels 2026-06-09 20:38:05 +00:00
tristan changed target branch from feature/ERP-97-suppliers-i18n-sidebar to develop 2026-06-11 07:08:05 +00:00
tristan added 6 commits 2026-06-11 07:08:05 +00:00
tristan added 1 commit 2026-06-11 07:12:11 +00:00
Merge remote-tracking branch 'origin/develop' into feature/ERP-94-suppliers-new
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m22s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m26s
db281a4b32
# Conflicts:
#	frontend/i18n/locales/fr.json
tristan merged commit d6790dd37d into develop 2026-06-11 07:14:53 +00:00
tristan deleted branch feature/ERP-94-suppliers-new 2026-06-11 07:14:55 +00:00
Sign in to join this conversation.