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).
})