feat(front) : page ajouter un client (formulaire principal + onglets) (ERP-63)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Failing after 2m37s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m11s

- pages/clients/new.vue : route /clients/new gatee par commercial.clients.manage.
  Formulaire principal (POST /clients) puis validation incrementale des onglets
  via MalioTabList ; un onglet valide passe en lecture seule, passage automatique
  au suivant. Information (PATCH groupe information), Contact/Adresse (sous-ressources
  contacts/addresses), Comptabilite (PATCH scalaires accounting + POST ribs, gate
  accounting.view/manage), onglets coquille auto-avances. Mode strict RG-1.28 :
  chaque requete ne porte que les champs de son groupe.
- i18n : cles commercial.clients.form.* (formulaire, onglets, confirmation, toasts).

RG-1.04 (Information obligatoire pour la Commerciale) : non miroitee cote front
(roles = IRIs dans /api/me, Bureau == Commerciale en permissions) ; appliquee de
maniere fiable par le back. A rebrancher quand un code de role sera expose.
This commit is contained in:
2026-06-02 17:25:09 +02:00
parent 1bc432e8fa
commit 29ee4e9fd0
2 changed files with 975 additions and 0 deletions
+84
View File
@@ -99,6 +99,90 @@
"phoneFormat": "Format de téléphone invalide (attendu : XX XX XX XX XX).",
"emailFormat": "Format d'email invalide.",
"addressCategoryForbidden": "Une catégorie « Distributeur » ou « Courtier » ne peut pas qualifier une adresse."
},
"form": {
"title": "Ajouter un client",
"submit": "Valider",
"duplicateCompany": "Un client portant ce nom de société existe déjà.",
"main": {
"companyName": "Nom de l'entreprise",
"firstName": "Prénom",
"lastName": "Nom",
"email": "Email",
"phonePrimary": "Téléphone",
"phoneSecondary": "Téléphone (2)",
"addPhone": "Ajouter un numéro",
"categories": "Catégories",
"relation": "Relation",
"relationNone": "Aucune",
"relationDistributor": "Distributeur",
"relationBroker": "Courtier",
"distributorName": "Nom du distributeur",
"brokerName": "Nom du courtier",
"triageService": "Prestation de triage"
},
"information": {
"description": "Description",
"competitors": "Concurrents",
"foundedAt": "Date de création",
"employeesCount": "Nombre de salariés",
"revenueAmount": "Chiffre d'affaires",
"profitAmount": "Résultat",
"directorName": "Dirigeant"
},
"contact": {
"title": "Contact {n}",
"lastName": "Nom",
"firstName": "Prénom",
"jobTitle": "Fonction",
"email": "Email",
"phonePrimary": "Téléphone",
"phoneSecondary": "Téléphone (2)",
"addPhone": "Ajouter un numéro",
"remove": "Supprimer le contact",
"add": "Nouveau contact"
},
"address": {
"title": "Adresse {n}",
"prospect": "Prospect",
"delivery": "Adresse de livraison",
"billing": "Facturation",
"categories": "Catégorie",
"country": "Pays",
"postalCode": "Code postal",
"city": "Ville",
"street": "Adresse",
"streetComplement": "Adresse complémentaire",
"sites": "Sites Starseed",
"contacts": "Contact(s) rattaché(s)",
"billingEmail": "Email de facturation",
"remove": "Supprimer l'adresse",
"add": "Nouvelle adresse",
"degraded": "Service d'adresse indisponible : saisie de la ville et de l'adresse en mode libre."
},
"accounting": {
"siren": "SIREN",
"accountNumber": "Numéro de compte",
"tvaMode": "Mode de TVA",
"nTva": "N° de TVA",
"paymentDelay": "Délai de règlement",
"paymentType": "Type de règlement",
"bank": "Banque",
"ribTitle": "RIB {n}",
"ribLabel": "Libellé",
"ribBic": "BIC",
"ribIban": "IBAN",
"addRib": "Ajouter un RIB",
"removeRib": "Supprimer le RIB"
},
"confirmDelete": {
"title": "Confirmer la suppression",
"contact": "Supprimer ce contact ?",
"address": "Supprimer cette adresse ?",
"rib": "Supprimer ce RIB ?",
"cancel": "Annuler",
"confirm": "Confirmer"
}
}
}
},