[ERP-64] Page Consultation client (lecture seule + Modifier / Archiver) #49

Merged
tristan merged 2 commits from feature/ERP-64-page-consultation-client into develop 2026-06-03 09:57:15 +00:00
Owner

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é.

## 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é.
tristan added the type/featfrontM1-Client labels 2026-06-03 09:36:18 +00:00
tristan added 1 commit 2026-06-03 09:36:18 +00:00
feat(front) : page consultation client + archivage
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m4s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m13s
52603971a0
Ecran de consultation client en lecture seule (route /clients/[id], ERP-64) :
- composable useClient(id) : chargement du detail (embed contacts/adresses/ribs),
  archivage/restauration (PATCH isArchived seul, refetch complet, 409 RG-1.23 propage)
- formulaire principal + 8 onglets readonly (navigation libre), onglet Comptabilite
  visible uniquement avec accounting.view
- boutons Modifier (manage OU accounting.manage), Archiver/Restaurer (archive)
- libelles categories/sites/referentiels lus depuis l'embed (role-independant,
  /categories et /sites etant en 403 pour les roles metier)
- ClientAddressBlock : affichage readonly de la ville et de la rue corrige
tristan added 1 commit 2026-06-03 09:56:19 +00:00
style(front) : boutons Modifier/Archiver en secondary + espacement aligne sur le repertoire
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m0s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m20s
034c4ce43a
Page consultation client : Modifier et Archiver passent en variante secondary,
ecart porte a gap-12 (48px) pour matcher Ajouter / Filtres du repertoire.
tristan merged commit 6fee9f6bd6 into develop 2026-06-03 09:57:15 +00:00
tristan deleted branch feature/ERP-64-page-consultation-client 2026-06-03 09:57:16 +00:00
Sign in to join this conversation.