Commit Graph

2 Commits

Author SHA1 Message Date
tristan 4d20583e1b fix(commercial) : conserver le RIB au changement de type de reglement hors-LCR (ERP-121)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m14s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m38s
Le passage d'un tiers de LCR vers virement (ou autre) supprimait ses RIB en base
via le front (DELETE differe). Le RIB est une coordonnee bancaire du tiers,
decouplee du mode de reglement : on le conserve desormais pour un eventuel retour
en LCR.

Clients ET fournisseurs (new.vue / [id]/edit.vue) :
- onPaymentTypeChange ne marque plus les RIB existants pour suppression et ne vide
  plus la saisie ; les RIB sont seulement masques (visibleRibs) et reapparaissent
  tels quels au retour LCR.
- submitAccounting ne (re)soumet les RIB que sous LCR ; seules les suppressions
  EXPLICITES (corbeille d'un bloc) restent en DELETE.

Consultation ([id]/index.vue) : RIB dormants totalement masques hors-LCR, via le
helper pur type-safe paymentTypeCodeOf (clientConsultation / supplierConsultation)
+ tests Vitest.

Aucune modification back (RG LCR -> >=1 RIB deja correcte, rien n'interdit un RIB
sur un tiers non-LCR) ni migration.
2026-06-11 12:00:37 +02:00
tristan 6fee9f6bd6 [ERP-64] Page Consultation client (lecture seule + Modifier / Archiver) (#49)
Auto Tag Develop / tag (push) Successful in 9s
## ERP-64 — Page Consultation client (lecture seule)

Route **`/clients/[id]`** : consultation client en lecture seule, porte vers Modification + actions Archiver / Restaurer.

### Périmètre (front uniquement)
- **`useClient(id)`** : charge le détail (embed contacts / adresses / ribs), `archive()` / `restore()` via `PATCH { isArchived }` **seul**, puis **refetch complet** (la réponse du PATCH ne porte pas l'embed). Le **409** de conflit d'homonyme à la restauration (RG-1.23) est propagé → toast dédié.
- **Page** : formulaire principal + **8 onglets** readonly en **navigation libre** (4 actifs + 4 placeholders). Onglet **Comptabilité** visible **uniquement avec `accounting.view`**.
- **Boutons** : **Modifier** si `manage` OU `accounting.manage` ; **Archiver** si `archive` et client actif ; **Restaurer** si `archive` et client archivé.
- Téléphones affichés formatés `XX XX XX XX XX`.
- Réutilise `ClientContactBlock` / `ClientAddressBlock` / `TabPlaceholderBlank` (ERP-63) en mode `readonly`.

### Libellés issus de l'embed (role-independant)
`GET /api/categories` et `/api/sites` renvoient **403 pour les rôles métier non-admin**. La page lit donc tous les libellés (catégories, sites, référentiels comptables) **directement dans le payload embarqué** — affichage correct pour tous les rôles, sans dépendre d'un `GET` de référentiel.

### Correctifs `ClientAddressBlock` (lecture seule)
- la **ville** courante est toujours présente dans les options (sinon `MalioSelect` n'affiche rien) ;
- la **rue** s'affiche en champ texte readonly (`MalioInputAutocomplete` ne réaffiche pas sa valeur liée).

### Pas de changement back
L'embed `GET /api/clients/{id}` (contacts/adresses/ribs + sites + codes catégories, gating `accounting.view`, 409 restauration) **était déjà livré par ERP-62 (#44)** — vérifié sur l'API réelle et couvert par `ClientApiTest::testGetDetailEmbedsSubCollections`, `ClientReadGroupContextBuilderTest`, `ClientArchiveTest::testRestoreConflictReturns409`.

### Tests
- Vitest : **+29 tests** (mapping payload→brouillons, options embed, permissions, archive/restore/409). Suite complète **158 OK**.
- `nuxi typecheck` : 0 erreur sur les fichiers ajoutés.
- Golden path navigateur (admin + commerciale) : readonly complet, onglet Compta + RIBs selon `accounting.view`, boutons selon rôle, bascule Archiver ↔ Restaurer.

### ⚠️ À investiguer (hors périmètre)
Le 403 sur `/categories` et `/sites` impacte aussi `useClientReferentials.loadCommon()` (un `Promise.all` qui rejette en entier) → potentiellement le **formulaire de création ERP-63 cassé pour la Commerciale** (impossible de choisir catégories/sites). À confirmer dans un ticket dédié.

Reviewed-on: #49
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
2026-06-03 09:57:14 +00:00