# M1 · Ticket 2/3 (Frontend) — Retirer le bloc contact principal des écrans Client ## 1. Objectif Retirer le **bloc « contact principal »** (Nom, Prénom, Téléphone, Téléphone 2, Email) des trois écrans Client — **création**, **consultation**, **modification** — ainsi que des types, mappeurs, validations et clés i18n associés. La saisie des contacts se fait désormais uniquement dans l'**onglet « Contacts »** (composant `ClientContactBlock`, déjà en place et inchangé). Dépend du **ticket 1/3 (back)** : l'API ne renvoie/n'accepte plus ces 5 champs sur `client`. Contexte : voir `README.md` du dossier `refonte-contact`. ## 2. Périmètre ### IN — fichiers `frontend/modules/commercial/` | Fichier | Action | |---|---| | `pages/clients/new.vue` | Supprimer le bloc principal Nom/Prénom/Téléphones/Email (~l.27-63), l'état `main.firstName/lastName/email`, `mainPhones` (~l.445-459), la fonction `prefillFirstContact()` (~l.658-665) et son appel, le mapping payload POST `phonePrimary/phoneSecondary` (~l.513-524). Adapter `isMainValid` (~l.479-493) : la validation principale ne porte plus que sur `companyName` (+ relation/catégories selon RG existantes). L'onglet **Contacts** devient le point de saisie des coordonnées ; garantir au moins un `ClientContactBlock` vide au départ. | | `pages/clients/[id]/edit.vue` | Supprimer les 5 champs du bloc principal (~l.32-73). `mapMainDraft()` et `buildMainPayload()` ne portent plus ces champs. L'onglet Contacts reste éditable. | | `pages/clients/[id]/index.vue` | Supprimer l'affichage lecture seule des 5 champs du bloc principal (~l.49-104, partie contact). Conserver l'onglet Contacts (lecture seule). | | `types/clientForm.ts` | `MainFormDraft` : retirer `firstName`, `lastName`, `email`, `phonePrimary`, `phoneSecondary`, `hasSecondaryPhone`. Garder `ContactFormDraft` (inchangé). | | `types/clientConsultation.ts` | `ClientDetail` : retirer `firstName/lastName/phonePrimary/phoneSecondary/email` (les commentaires « Contact principal »). Garder `ContactRead`. | | `utils/clientEdit.ts` | `mapMainDraft()` et `buildMainPayload()` : retirer les 5 champs. Garder `buildContactPayload()`. | | `utils/clientConsultation.ts` | Retirer toute lecture des 5 champs inline du client (garder `mapContactToDraft`, `contactOptionsOf`). | | `i18n/locales/fr.json` | Retirer `commercial.clients.form.main.firstName/lastName/email/phonePrimary/phoneSecondary/addPhone`. **Conserver** tout le bloc `commercial.clients.form.contact.*`. Vérifier qu'aucune autre vue ne référence les clés retirées. | | `**/__tests__/*.spec.ts` | Mettre à jour `clientFormRules.spec.ts`, `clientEdit.spec.ts`, `clientConsultation.spec.ts` (cf. § 4). | ### OUT - `ClientContactBlock.vue`, l'onglet Contacts, `useClient`, la liste/répertoire (`pages/clients/index.vue` — ses colonnes n'affichent déjà pas le contact inline) : **inchangés**. - Le back → ticket 1/3. Les specs → ticket 3/3. ## 3. Comportement attendu après modification - **Création** : le formulaire principal demande l'entreprise (et relation/catégories selon l'existant), plus de Nom/Prénom/Téléphone/Email inline. L'utilisateur renseigne les coordonnées dans l'onglet **Contacts**. La création reste valide tant qu'il y a `companyName` **et** ≥ 1 bloc Contact valide (Nom OU Prénom) — RG-1.05/RG-1.14 inchangées. - **Consultation** : plus de bloc contact principal ; l'onglet Contacts affiche les contacts. - **Modification** : idem ; le PATCH du groupe `client:write:main` n'envoie plus les 5 champs. ## 4. Tests Vitest à mettre à jour - `clientFormRules.spec.ts` : la validité du « principal » ne dépend plus de firstName/email/phone ; conserver `isContactNamed()` (RG-1.05) sur les blocs Contacts. - `clientEdit.spec.ts` : `buildMainPayload()` ne contient plus les 5 champs ; `mapMainDraft()` non plus. - `clientConsultation.spec.ts` : retirer les assertions sur les 5 champs inline. ## 5. Tips & rappels projet - `useApi()` obligatoire (jamais `$fetch`/`ofetch`). Composants `Malio*` obligatoires. - État de tableau jamais dans l'URL (règle inchangée). - Les valeurs sont **normalisées côté serveur** (Capitalize / chiffres / lowercase) : le front envoie la saisie et réaffiche la valeur renvoyée — ne pas réintroduire de normalisation front. - Ne pas créer de clé i18n orpheline ni laisser de clé `form.main.*` morte. ## 6. Critères d'acceptation (DoD) - [ ] Les 3 écrans n'affichent plus Nom/Prénom/Téléphone/Téléphone 2/Email en bloc principal. - [ ] Le parcours de création fonctionne avec `companyName` + onglet Contacts (≥ 1 contact). - [ ] `MainFormDraft` / `ClientDetail` ne déclarent plus les 5 champs ; `mapMainDraft` / `buildMainPayload` non plus. - [ ] Aucune clé i18n `form.main.firstName/lastName/email/phone*` restante ni référencée. - [ ] `make nuxt-test` vert. - [ ] Vérification visuelle du golden path (`make dev-nuxt`, port 3004) : création → consultation → modification d'un client sans bloc contact inline.