fix(front) : RIB neuf vide soumis (422 inline) quand c'est le seul RIB restant

Onglet Comptabilite : on ne saute une amorce RIB neuve vide QUE s'il reste un autre
RIB soumettable (garde hasSubmittableRib, miroir de l'onglet Contacts). Sinon — ex.
unique RIB existant supprime puis remplace par un bloc vide en LCR — le bloc vide est
soumis et le back renvoie une 422 NotBlank mappee en rouge sous label/bic/iban, au lieu
de laisser le DELETE echouer en « dernier RIB d'une LCR » (message plat sans propertyPath).
L'ancien RIB est preserve (arret avant le DELETE). Applique creation + edition, fournisseur + client.
This commit is contained in:
2026-06-11 08:53:06 +02:00
parent f2ad41ad64
commit 71db3418e3
4 changed files with 27 additions and 17 deletions
@@ -953,8 +953,11 @@ async function submitAccounting(): Promise<void> {
try { try {
// 1) POST/PATCH des RIB d'abord (erreurs inline par ligne, tous les blocs // 1) POST/PATCH des RIB d'abord (erreurs inline par ligne, tous les blocs
// tentes). Le back exige >=1 RIB persiste pour valider une LCR a l'etape 2. // tentes). Le back exige >=1 RIB persiste pour valider une LCR a l'etape 2.
// Seuls les blocs RIB TOTALEMENT vides sont ignores : un RIB partiel (ex. // On ne saute une amorce neuve vide QUE s'il reste un autre RIB soumettable :
// IBAN seul) est soumis -> 422 NotBlank (label / bic / iban) inline. // sinon (ex. l'unique RIB existant supprime, remplace par un bloc vide), on la
// soumet pour declencher la 422 NotBlank inline plutot que de laisser le DELETE
// echouer en « dernier RIB d'une LCR » (message plat sans propertyPath).
const hasSubmittableRib = ribs.value.some(r => r.id !== null || !isRibBlank(r))
const ribHasError = await submitRows( const ribHasError = await submitRows(
ribs.value, ribs.value,
ribErrors, ribErrors,
@@ -975,10 +978,10 @@ async function submitAccounting(): Promise<void> {
} }
}, },
error => showError(error), error => showError(error),
// On ne saute QUE les amorces neuves (id null) totalement vides. Un // On ne saute une amorce neuve (id null) totalement vide que si un autre RIB
// RIB existant vide est soumis -> 422 NotBlank inline (sinon la modif // est soumettable. Un RIB existant vide est toujours soumis -> 422 NotBlank
// serait perdue en silence avec un faux toast de succes). // inline (sinon la modif serait perdue en silence avec un faux toast succes).
rib => rib.id === null && isRibBlank(rib), rib => hasSubmittableRib && rib.id === null && isRibBlank(rib),
) )
if (ribHasError) return if (ribHasError) return
@@ -920,8 +920,9 @@ async function submitAccounting(): Promise<void> {
try { try {
// 1) POST/PATCH des RIB d'abord (erreurs inline par ligne, tous les blocs // 1) POST/PATCH des RIB d'abord (erreurs inline par ligne, tous les blocs
// tentes). Le back exige >=1 RIB persiste pour valider une LCR a l'etape 2. // tentes). Le back exige >=1 RIB persiste pour valider une LCR a l'etape 2.
// Seuls les blocs RIB TOTALEMENT vides sont ignores : un RIB partiel (ex. // On ne saute une amorce neuve vide QUE s'il reste un autre RIB soumettable :
// IBAN seul) est soumis -> 422 NotBlank (label / bic / iban) inline. // sinon (LCR sans aucun RIB rempli) on la soumet -> 422 NotBlank inline.
const hasSubmittableRib = ribs.value.some(r => r.id !== null || !isRibBlank(r))
const ribHasError = await submitRows( const ribHasError = await submitRows(
ribs.value, ribs.value,
ribErrors, ribErrors,
@@ -941,10 +942,10 @@ async function submitAccounting(): Promise<void> {
} }
}, },
error => toast.error({ title: t('commercial.clients.toast.error'), message: apiErrorMessage(error) }), error => toast.error({ title: t('commercial.clients.toast.error'), message: apiErrorMessage(error) }),
// On ne saute QUE les amorces neuves (id null) totalement vides. Un // On ne saute une amorce neuve (id null) totalement vide que si un autre RIB
// RIB existant vide est soumis -> 422 NotBlank inline (sinon la modif // est soumettable. Un RIB existant vide est toujours soumis -> 422 NotBlank
// serait perdue en silence avec un faux toast de succes). // inline (sinon la modif serait perdue en silence avec un faux toast succes).
rib => rib.id === null && isRibBlank(rib), rib => hasSubmittableRib && rib.id === null && isRibBlank(rib),
) )
if (ribHasError) return if (ribHasError) return
@@ -841,7 +841,11 @@ async function submitAccounting(): Promise<void> {
accountingErrors.clearErrors() accountingErrors.clearErrors()
try { try {
// 1) POST/PATCH des RIB d'abord (erreurs inline par ligne, tous les blocs // 1) POST/PATCH des RIB d'abord (erreurs inline par ligne, tous les blocs
// tentes). Seuls les blocs RIB TOTALEMENT vides (amorce neuve) sont ignores. // tentes). On ne saute une amorce neuve vide QUE s'il reste un autre RIB
// soumettable : sinon (ex. l'unique RIB existant supprime, remplace par un
// bloc vide), on la soumet pour declencher la 422 NotBlank inline plutot que
// de laisser le DELETE echouer en « dernier RIB d'une LCR » (message plat).
const hasSubmittableRib = ribs.value.some(r => r.id !== null || !isRibBlank(r))
const ribHasError = await submitRows( const ribHasError = await submitRows(
ribs.value, ribs.value,
ribErrors, ribErrors,
@@ -862,7 +866,7 @@ async function submitAccounting(): Promise<void> {
} }
}, },
error => showError(error), error => showError(error),
rib => rib.id === null && isRibBlank(rib), rib => hasSubmittableRib && rib.id === null && isRibBlank(rib),
) )
if (ribHasError) return if (ribHasError) return
@@ -782,8 +782,10 @@ async function submitAccounting(): Promise<void> {
tabSubmitting.value = true tabSubmitting.value = true
accountingErrors.clearErrors() accountingErrors.clearErrors()
try { try {
// 1) POST/PATCH des RIB d'abord (erreurs inline par ligne). Seuls les blocs // 1) POST/PATCH des RIB d'abord (erreurs inline par ligne). On ne saute une
// RIB TOTALEMENT vides (amorce neuve) sont ignores. // amorce neuve vide QUE s'il reste un autre RIB soumettable : sinon (LCR sans
// aucun RIB rempli) on la soumet pour declencher la 422 NotBlank inline.
const hasSubmittableRib = ribs.value.some(r => r.id !== null || !isRibBlank(r))
const ribHasError = await submitRows( const ribHasError = await submitRows(
ribs.value, ribs.value,
ribErrors, ribErrors,
@@ -802,7 +804,7 @@ async function submitAccounting(): Promise<void> {
} }
}, },
error => toast.error({ title: t('commercial.suppliers.toast.error'), message: apiErrorMessage(error) }), error => toast.error({ title: t('commercial.suppliers.toast.error'), message: apiErrorMessage(error) }),
rib => rib.id === null && isRibBlank(rib), rib => hasSubmittableRib && rib.id === null && isRibBlank(rib),
) )
if (ribHasError) return if (ribHasError) return