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:
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user