diff --git a/frontend/modules/commercial/composables/useSupplierReferentials.ts b/frontend/modules/commercial/composables/useSupplierReferentials.ts index 44dfa2e..8636ce3 100644 --- a/frontend/modules/commercial/composables/useSupplierReferentials.ts +++ b/frontend/modules/commercial/composables/useSupplierReferentials.ts @@ -51,6 +51,11 @@ interface ReferentialMember extends HydraMember { label: string } +interface CountryMember extends HydraMember { + code: string + name: string +} + const LD_JSON_HEADERS = { Accept: 'application/ld+json' } export function useSupplierReferentials() { @@ -62,6 +67,7 @@ export function useSupplierReferentials() { const paymentDelays = ref([]) const paymentTypes = ref([]) const banks = ref([]) + const countries = ref([]) /** Recupere une collection complete (pagination desactivee) en Hydra. */ async function fetchAll( @@ -103,6 +109,13 @@ export function useSupplierReferentials() { .then((types) => { paymentTypes.value = types.map(t => ({ value: t['@id'], label: t.label, code: t.code })) }), fetchAll('/banks') .then((banksList) => { banks.value = banksList.map(b => ({ value: b['@id'], label: b.label })) }), + // Pays (ERP-116) : la valeur d'option est le NOM du pays (et non l'IRI), + // car l'adresse stocke `country` en chaine libre (« France »...). On + // conserve ainsi la compatibilite avec les adresses existantes sans FK + // ni migration de donnees a ce stade. value === label. Aligne sur les + // clients (`useClientReferentials`) pour une liste de pays identique. + fetchAll('/countries') + .then((list) => { countries.value = list.map(c => ({ value: c.name, label: c.name })) }), ]) } @@ -113,6 +126,7 @@ export function useSupplierReferentials() { paymentDelays, paymentTypes, banks, + countries, loadCommon, } } diff --git a/frontend/modules/commercial/pages/suppliers/[id]/edit.vue b/frontend/modules/commercial/pages/suppliers/[id]/edit.vue index 8936e8c..7074ab9 100644 --- a/frontend/modules/commercial/pages/suppliers/[id]/edit.vue +++ b/frontend/modules/commercial/pages/suppliers/[id]/edit.vue @@ -515,10 +515,19 @@ const contactOptions = computed(() => })), ) -const countryOptions: RefOption[] = [ - { value: 'France', label: 'France' }, - { value: 'Espagne', label: 'Espagne' }, -] +// Pays : referentiel `country` charge via l'API (ERP-116), aligne sur l'ecran +// client. On merge la valeur deja stockee sur chaque adresse (embed) — comme les +// autres selects de cet ecran — pour ne pas vider le select si `/countries` +// echoue (resilience ERP-102) ou si un pays historique n'est plus au referentiel. +const embedCountryOptions = computed(() => + mergeOptions([], (supplier.value?.addresses ?? []) + .map(a => a.country) + .filter((c): c is string => !!c) + .map(c => ({ value: c, label: c }))), +) +const countryOptions = computed(() => + mergeOptions(referentials.countries.value, embedCountryOptions.value), +) // Selects comptables : referentiel UNION valeur courante de l'embed (libelle). const tvaModeOptions = computed(() => mergeOptions(referentials.tvaModes.value, referentialOptionOf(supplier.value?.tvaMode))) diff --git a/frontend/modules/commercial/pages/suppliers/[id]/index.vue b/frontend/modules/commercial/pages/suppliers/[id]/index.vue index 41c721d..7b6ce61 100644 --- a/frontend/modules/commercial/pages/suppliers/[id]/index.vue +++ b/frontend/modules/commercial/pages/suppliers/[id]/index.vue @@ -361,10 +361,16 @@ const allSiteOptions = computed(() => })), ) -const countryOptions: SelectOption[] = [ - { value: 'France', label: 'France' }, - { value: 'Espagne', label: 'Espagne' }, -] +// Pays (consultation, lecture seule) : derive des adresses du fournisseur, comme +// l'ecran client. Le referentiel `country` (ERP-116) n'est pas charge ici, l'ecran +// n'affiche que les valeurs deja stockees. +const countryOptions = computed(() => + [...new Set( + (supplier.value?.addresses ?? []) + .map(a => a.country) + .filter((c): c is string => !!c), + )].map(c => ({ value: c, label: c })), +) // Selects comptables : libelle issu de l'embed (option unique ou vide). const tvaModeOptions = computed(() => referentialOptionOf(supplier.value?.tvaMode)) diff --git a/frontend/modules/commercial/pages/suppliers/new.vue b/frontend/modules/commercial/pages/suppliers/new.vue index 3101184..7d72565 100644 --- a/frontend/modules/commercial/pages/suppliers/new.vue +++ b/frontend/modules/commercial/pages/suppliers/new.vue @@ -646,11 +646,15 @@ const contactOptions = computed(() => })), ) -// Pays disponibles (France preselectionnee par defaut sur chaque adresse). -const countryOptions: RefOption[] = [ - { value: 'France', label: 'France' }, - { value: 'Espagne', label: 'Espagne' }, -] +// Pays : referentiel `country` charge via l'API (ERP-116), aligne sur l'ecran +// client. France garantie en tete pour rester preselectionnable par defaut sur +// chaque adresse meme si `/countries` echoue (resilience ERP-102). +const countryOptions = computed(() => { + const list = referentials.countries.value + return list.some(c => c.value === 'France') + ? list + : [{ value: 'France', label: 'France' }, ...list] +}) // « + Adresse » desactive tant que la derniere adresse n'est pas valide. const canAddAddress = computed(() => {