/** * Helpers purs de l'onglet Contact transporteur (M4 Transport, ERP-168) — ALIGNÉ * sur `providerContact.ts` (M3) / les autres modules : mêmes règles de validité et * de gating « + Nouveau contact » (un contact est « nommé » dès qu'il porte un * prénom OU un nom). Seule spécificité M4 conservée : les téléphones partent au back * dans le tableau virtuel `phones` (max 2), mappés par le CarrierContactProcessor. * Testables sans Vue ni API. */ import type { CarrierContactFormDraft } from '~/modules/transport/types/carrierForm' /** Vrai si une chaîne porte au moins un caractère non-espace. */ function isFilled(value: string | null | undefined): boolean { return value !== null && value !== undefined && value.trim() !== '' } /** * Un bloc Contact est VIDE tant qu'aucun champ comptant pour la validité n'est * rempli — prénom / nom / fonction / téléphone principal / email. `phoneSecondary` * est EXCLU (aligné M1/M2/M3 : un bloc ne portant qu'un 2e numéro reste vide). Sert * le filtrage des amorces vides à la soumission. */ export function isCarrierContactBlank(contact: CarrierContactFormDraft): boolean { return ![ contact.firstName, contact.lastName, contact.jobTitle, contact.phonePrimary, contact.email, ].some(isFilled) } /** * Un contact est « nommé » (valide) dès qu'il porte un prénom OU un nom — aligné * sur M1/M2/M3. Pilote le gating « + Nouveau contact » : la fonction / le téléphone * / l'email seuls ne suffisent pas pour ajouter un nouveau bloc. */ export function isCarrierContactNamed(contact: CarrierContactFormDraft): boolean { return isFilled(contact.firstName) || isFilled(contact.lastName) } /** * Payload de la sous-ressource contacts (groupe `carrier:write:contacts`). Les * chaînes vides partent à null (le serveur normalise/trim). Les téléphones sont * regroupés dans le tableau `phones` (numéros non vides, max 2 — RG-4.08) ; le 2e * numéro n'est inclus que s'il a été révélé (`hasSecondaryPhone`). */ export function buildCarrierContactPayload(contact: CarrierContactFormDraft): Record { const phones = [ contact.phonePrimary, contact.hasSecondaryPhone ? contact.phoneSecondary : null, ].filter((phone): phone is string => isFilled(phone)) return { firstName: contact.firstName || null, lastName: contact.lastName || null, jobTitle: contact.jobTitle || null, email: contact.email || null, phones, } }