diff --git a/frontend/modules/commercial/pages/clients/[id]/edit.vue b/frontend/modules/commercial/pages/clients/[id]/edit.vue index 33bfa13..4bcf02b 100644 --- a/frontend/modules/commercial/pages/clients/[id]/edit.vue +++ b/frontend/modules/commercial/pages/clients/[id]/edit.vue @@ -556,8 +556,19 @@ const contactOptions = computed(() => // Pays : referentiel `country` charge via l'API (ERP-116), en remplacement de // l'ancienne liste codee en dur. Valeur = nom du pays (l'adresse stocke -// `country` en chaine libre, donc value === label). -const countryOptions = computed(() => referentials.countries.value) +// `country` en chaine libre, donc value === label). 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'appartient pas au referentiel. +const embedCountryOptions = computed(() => + mergeOptions([], (client.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), +) const relationOptions = computed(() => [ { value: 'distributeur', label: t('commercial.clients.form.main.relationDistributor') }, diff --git a/frontend/modules/commercial/pages/clients/new.vue b/frontend/modules/commercial/pages/clients/new.vue index ba646e0..252f578 100644 --- a/frontend/modules/commercial/pages/clients/new.vue +++ b/frontend/modules/commercial/pages/clients/new.vue @@ -785,8 +785,15 @@ const contactOptions = computed(() => // Pays disponibles : referentiel `country` charge via l'API (ERP-116), en // remplacement de l'ancienne liste codee en dur. France reste preselectionnee -// par defaut sur chaque adresse (cf. valeur initiale du draft d'adresse). -const countryOptions = computed(() => referentials.countries.value) +// par defaut sur chaque adresse (cf. valeur initiale du draft d'adresse) : on +// garantit donc sa presence en fallback si `/countries` echoue (resilience +// ERP-102), pour ne pas afficher un select vide sur une valeur deja soumise. +const countryOptions = computed(() => { + const list = referentials.countries.value + return list.some(c => c.value === 'France') + ? list + : [{ value: 'France', label: 'France' }, ...list] +}) // Type d'adresse (Select) obligatoire + RG-1.10 (>= 1 site) + RG-1.11 (email // facturation si Facturation) sur chaque adresse. diff --git a/migrations/Version20260609100000.php b/migrations/Version20260609100000.php index 7bd4a0b..84fab8b 100644 --- a/migrations/Version20260609100000.php +++ b/migrations/Version20260609100000.php @@ -35,7 +35,7 @@ final class Version20260609100000 extends AbstractMigration { public function getDescription(): string { - return 'ERP-116 : table country (referentiel pays) + seed des 6 pays.'; + return 'ERP-116 : table country (referentiel pays) + seed des 7 pays.'; } public function up(Schema $schema): void