8fae987e15
Auto Tag Develop / tag (push) Successful in 6s
Acte la décision refonte-contact dans les specs : le contact principal inline (firstName/lastName/phonePrimary/phoneSecondary/email) est retiré des entités tiers (Client, Supplier). Les contacts vivent uniquement dans ClientContact / SupplierContact (onglet Contacts). Garantie « >=1 contact nommé » préservée par RG-1.05/1.14 (M1) et RG-2.04/2.13 (M2). - M1 (spec-back/spec-front/cahier) : modèle Client sans contact inline ; RG-1.01/1.02 supprimées ; D1 (recherche) / D2 (export) décrites ; version V1. - M2 (spec-back/spec-front) : FICHIERS NOUVEAUX (non versionnés sur develop), introduits déjà corrigés (Supplier sans contact inline, RG-2.01/2.02 supprimées) ; version V0.2. - docs/specs/M1-clients/refonte-contact/ : décision (README) + tickets (M1 back/front/specs, M2 specs) + prompts + amendement des tickets M2. Lesstime : tâches #103 (M1 back), #104 (M1 front), #105 (M1 specs), #106 (M2 specs) ; tickets M2 #85-#97 amendés. --------- Co-authored-by: Matthieu <contact@malio.fr> Reviewed-on: #54 Co-authored-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr> Co-committed-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr>
5.0 KiB
5.0 KiB
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
companyNameet ≥ 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:mainn'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 ; conserverisContactNamed()(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). ComposantsMalio*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/ClientDetailne déclarent plus les 5 champs ;mapMainDraft/buildMainPayloadnon plus.- Aucune clé i18n
form.main.firstName/lastName/email/phone*restante ni référencée. make nuxt-testvert.- Vérification visuelle du golden path (
make dev-nuxt, port 3004) : création → consultation → modification d'un client sans bloc contact inline.