diff --git a/frontend/modules/commercial/pages/clients/[id]/edit.vue b/frontend/modules/commercial/pages/clients/[id]/edit.vue index afb6275..99b9af1 100644 --- a/frontend/modules/commercial/pages/clients/[id]/edit.vue +++ b/frontend/modules/commercial/pages/clients/[id]/edit.vue @@ -766,7 +766,10 @@ async function submitContacts(): Promise { } }, error => showError(error), - contact => isContactBlank(contact), + // On ne saute QUE les amorces neuves (id null) totalement vides. Un + // bloc existant vide est soumis -> 422 RG-1.05 inline (sinon la modif + // serait perdue en silence avec un faux toast de succes). + contact => contact.id === null && isContactBlank(contact), ) // Tant qu'un bloc reste en erreur : pas de toast succes. if (hasError) return @@ -905,6 +908,10 @@ async function submitAccounting(): Promise { if (accountingReadonly.value || !canValidateAccounting.value || tabSubmitting.value) return tabSubmitting.value = true accountingErrors.clearErrors() + // Reset des erreurs RIB des le debut : l'etape 1 (PATCH scalaires) peut + // echouer et `return` avant submitRows (qui porte sinon le reset), laissant + // des erreurs de RIB obsoletes affichees sous les blocs. + ribErrors.value = [] try { // 1) PATCH des scalaires comptables (erreurs inline sur leurs champs). try { @@ -941,7 +948,10 @@ async function submitAccounting(): Promise { } }, error => showError(error), - rib => isRibBlank(rib), + // On ne saute QUE les amorces neuves (id null) totalement vides. Un + // RIB existant vide est soumis -> 422 NotBlank inline (sinon la modif + // serait perdue en silence avec un faux toast de succes). + rib => rib.id === null && isRibBlank(rib), ) if (ribHasError) return toast.success({ title: t('commercial.clients.toast.updateSuccess') }) diff --git a/frontend/modules/commercial/pages/clients/new.vue b/frontend/modules/commercial/pages/clients/new.vue index 7136d0e..1b82795 100644 --- a/frontend/modules/commercial/pages/clients/new.vue +++ b/frontend/modules/commercial/pages/clients/new.vue @@ -708,7 +708,10 @@ async function submitContacts(): Promise { } }, error => toast.error({ title: t('commercial.clients.toast.error'), message: apiErrorMessage(error) }), - contact => isContactBlank(contact), + // On ne saute QUE les amorces neuves (id null) totalement vides. Un + // bloc existant vide est soumis -> 422 RG-1.05 inline (sinon la modif + // serait perdue en silence avec un faux toast de succes). + contact => contact.id === null && isContactBlank(contact), ) // Tant qu'un bloc reste en erreur : pas de validation d'onglet ni de toast succes. if (hasError) return @@ -886,6 +889,10 @@ async function submitAccounting(): Promise { if (clientId.value === null || !canValidateAccounting.value || tabSubmitting.value) return tabSubmitting.value = true accountingErrors.clearErrors() + // Reset des erreurs RIB des le debut : l'etape 1 (PATCH scalaires) peut + // echouer et `return` avant submitRows (qui porte sinon le reset), laissant + // des erreurs de RIB obsoletes affichees sous les blocs. + ribErrors.value = [] try { // 1) PATCH des scalaires comptables (erreurs inline sur leurs champs). try { @@ -925,7 +932,10 @@ async function submitAccounting(): Promise { } }, error => toast.error({ title: t('commercial.clients.toast.error'), message: apiErrorMessage(error) }), - rib => isRibBlank(rib), + // On ne saute QUE les amorces neuves (id null) totalement vides. Un + // RIB existant vide est soumis -> 422 NotBlank inline (sinon la modif + // serait perdue en silence avec un faux toast de succes). + rib => rib.id === null && isRibBlank(rib), ) if (ribHasError) return