From 613aaa88c9d158bb5eb369c54ae74b4655cae1ea Mon Sep 17 00:00:00 2001 From: tristan Date: Mon, 8 Jun 2026 11:00:37 +0200 Subject: [PATCH] fix(commercial) : masquage RIB hors LCR (forms + consultation) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les blocs RIB ne s'affichent plus que si le type de reglement est une LCR (RG-1.13). - Creation / edition : blocs + bouton « + RIB » conditionnes a LCR (computed visibleRibs) ; basculer hors LCR vide la liste (et marque les RIB persistes pour suppression serveur en edition) pour ne pas soumettre de RIB fantome ; plus d'amorce inconditionnelle d'un bloc vide. - Consultation : plus de bloc RIB vide affiche quand le client n'a aucun RIB (la collection vraie est rendue, sans placeholder). --- .../commercial/pages/clients/[id]/edit.vue | 25 ++++++++++++++++--- .../commercial/pages/clients/[id]/index.vue | 10 ++++---- .../modules/commercial/pages/clients/new.vue | 22 ++++++++++++---- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/frontend/modules/commercial/pages/clients/[id]/edit.vue b/frontend/modules/commercial/pages/clients/[id]/edit.vue index 784f654..2a53dfa 100644 --- a/frontend/modules/commercial/pages/clients/[id]/edit.vue +++ b/frontend/modules/commercial/pages/clients/[id]/edit.vue @@ -292,9 +292,9 @@ - +
@@ -333,6 +333,7 @@
{}) if (main.relationType === 'courtier') referentials.loadBrokers().catch(() => {}) @@ -897,9 +900,25 @@ const selectedPaymentTypeCode = computed(() => const isBankRequired = computed(() => isBankRequiredForPaymentType(selectedPaymentTypeCode.value)) const isRibRequired = computed(() => isRibRequiredForPaymentType(selectedPaymentTypeCode.value)) +// Les blocs RIB ne sont affiches que pour une LCR (RG-1.13). +const visibleRibs = computed(() => isRibRequired.value ? ribs.value : []) + function onPaymentTypeChange(value: string | number | null): void { accounting.paymentTypeIri = value === null ? null : String(value) if (!isBankRequired.value) accounting.bankIri = null + // Les RIB n'ont de sens que pour une LCR (RG-1.13) : on amorce un bloc vide + // quand LCR est choisi, sinon on vide la liste — les RIB deja persistes sont + // marques pour suppression serveur au prochain enregistrement. + if (isRibRequired.value) { + if (ribs.value.length === 0) ribs.value.push(emptyRib()) + } + else { + for (const rib of ribs.value) { + if (rib.id != null) removedRibIds.value.push(rib.id) + } + ribs.value = [] + ribErrors.value = [] + } } const canValidateAccounting = computed(() => { diff --git a/frontend/modules/commercial/pages/clients/[id]/index.vue b/frontend/modules/commercial/pages/clients/[id]/index.vue index 739ebda..9e34e00 100644 --- a/frontend/modules/commercial/pages/clients/[id]/index.vue +++ b/frontend/modules/commercial/pages/clients/[id]/index.vue @@ -293,7 +293,7 @@ import { type ClientDetail, type SelectOption, } from '~/modules/commercial/utils/clientConsultation' -import { emptyAddress, emptyContact, emptyRib } from '~/modules/commercial/types/clientForm' +import { emptyAddress, emptyContact } from '~/modules/commercial/types/clientForm' // Masque d'affichage (purement visuel, la donnee reste celle du serveur). const SIREN_MASK = '#########' @@ -350,10 +350,10 @@ const addressViews = computed(() => { const views = (client.value?.addresses ?? []).map(mapAddressView) return views.length ? views : [{ draft: emptyAddress(), siteOptions: [], categoryOptions: [] }] }) -const ribs = computed(() => { - const list = (client.value?.ribs ?? []).map(mapRibToDraft) - return list.length ? list : [emptyRib()] -}) +// Exception au placeholder ci-dessus : on n'affiche AUCUN bloc RIB quand le +// client n'en a pas (un RIB n'existe que pour un reglement LCR — RG-1.13). Pas +// de bloc vierge fantome en consultation. +const ribs = computed(() => (client.value?.ribs ?? []).map(mapRibToDraft)) // Draft comptable (tout null si l'utilisateur n'a pas accounting.view). const accounting = computed(() => mapAccountingDraft(client.value ?? ({} as ClientDetail))) diff --git a/frontend/modules/commercial/pages/clients/new.vue b/frontend/modules/commercial/pages/clients/new.vue index ea12344..dea166f 100644 --- a/frontend/modules/commercial/pages/clients/new.vue +++ b/frontend/modules/commercial/pages/clients/new.vue @@ -292,9 +292,9 @@
- +
@@ -334,6 +334,7 @@
const isBankRequired = computed(() => isBankRequiredForPaymentType(selectedPaymentTypeCode.value)) const isRibRequired = computed(() => isRibRequiredForPaymentType(selectedPaymentTypeCode.value)) +// Les blocs RIB ne sont affiches que pour une LCR (RG-1.13). +const visibleRibs = computed(() => isRibRequired.value ? ribs.value : []) + function onPaymentTypeChange(value: string | number | null): void { accounting.paymentTypeIri = value === null ? null : String(value) // La banque n'a de sens que pour un virement : on la vide sinon (RG-1.12). if (!isBankRequired.value) accounting.bankIri = null + // Les RIB n'ont de sens que pour une LCR (RG-1.13) : on amorce un bloc vide + // quand LCR est choisi, on vide la liste sinon (pas de RIB fantome soumis). + if (isRibRequired.value) { + if (ribs.value.length === 0) ribs.value.push(emptyRib()) + } + else { + ribs.value = [] + ribErrors.value = [] + } } // RG-1.30 : les 6 champs scalaires obligatoires (comme les onglets Contact / @@ -1023,8 +1036,7 @@ interface ContactResponse { onMounted(() => { // Echec du chargement des referentiels non bloquant : les selects restent vides. referentials.loadCommon().catch(() => {}) - // Au moins un bloc RIB toujours visible en creation : on amorce un bloc vide - // (non persiste tant qu'incomplet — RG-1.13). - if (ribs.value.length === 0) ribs.value.push(emptyRib()) + // Pas d'amorce de RIB ici : un bloc vide n'apparait que si LCR est choisi + // (cf. onPaymentTypeChange). })