fix(commercial) : ne sauter que les blocs contact/RIB totalement vides (bloc partiel sans nom -> 422 inline, ERP-110)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m49s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m16s

This commit is contained in:
Matthieu
2026-06-04 12:01:14 +02:00
parent 41d391eebf
commit f407c3d46a
4 changed files with 131 additions and 12 deletions
@@ -385,7 +385,9 @@ import {
hasAtLeastOneValidContact,
isBankRequiredForPaymentType,
isBillingEmailRequired,
isContactBlank,
isContactNamed,
isRibBlank,
isRibRequiredForPaymentType,
} from '~/modules/commercial/utils/clientFormRules'
import {
@@ -677,8 +679,9 @@ async function submitContacts(): Promise<void> {
if (clientId.value === null || !canValidateContacts.value || tabSubmitting.value) return
tabSubmitting.value = true
try {
// On tente TOUS les blocs (collecte des erreurs par index, ERP-110) ; les
// blocs vides (ni nom ni prenom) sont ignores.
// On tente TOUS les blocs (collecte des erreurs par index, ERP-110). Seuls
// les blocs TOTALEMENT vides sont ignores : un bloc partiellement rempli
// sans nom (email seul) est soumis -> 422 RG-1.05 inline sous le bloc.
const hasError = await submitRows(
contacts.value,
contactErrors,
@@ -705,7 +708,7 @@ async function submitContacts(): Promise<void> {
}
},
error => toast.error({ title: t('commercial.clients.toast.error'), message: apiErrorMessage(error) }),
contact => !isContactNamed(contact),
contact => isContactBlank(contact),
)
// Tant qu'un bloc reste en erreur : pas de validation d'onglet ni de toast succes.
if (hasError) return
@@ -901,8 +904,9 @@ async function submitAccounting(): Promise<void> {
return
}
// 2) POST/PATCH des RIB (erreurs inline par ligne, tous les blocs tentes
// les blocs RIB incomplets sont ignores).
// 2) POST/PATCH des RIB (erreurs inline par ligne, tous les blocs tentes).
// Seuls les blocs RIB TOTALEMENT vides sont ignores : un RIB partiel (ex.
// IBAN seul) est soumis -> 422 NotBlank (label / bic / iban) inline.
const ribHasError = await submitRows(
ribs.value,
ribErrors,
@@ -921,7 +925,7 @@ async function submitAccounting(): Promise<void> {
}
},
error => toast.error({ title: t('commercial.clients.toast.error'), message: apiErrorMessage(error) }),
rib => !ribIsComplete(rib),
rib => isRibBlank(rib),
)
if (ribHasError) return