diff --git a/frontend/modules/transport/pages/carriers/[id]/edit.vue b/frontend/modules/transport/pages/carriers/[id]/edit.vue index 4a22337..ae037c4 100644 --- a/frontend/modules/transport/pages/carriers/[id]/edit.vue +++ b/frontend/modules/transport/pages/carriers/[id]/edit.vue @@ -316,9 +316,9 @@ const clientOptions = ref([]) const supplierOptions = ref([]) const siteOptions = ref([]) -async function loadOptions(url: string, target: typeof clientOptions, labelOf: (m: Record) => string): Promise { +async function loadOptions(url: string, target: typeof clientOptions, labelOf: (m: Record) => string, extraParams: Record = {}): Promise { try { - const data = await api.get<{ member?: Record[] }>(url, { pagination: 'false' }, { headers: { Accept: 'application/ld+json' }, toast: false }) + const data = await api.get<{ member?: Record[] }>(url, { pagination: 'false', ...extraParams }, { headers: { Accept: 'application/ld+json' }, toast: false }) target.value = (data.member ?? []).map(m => ({ value: String(m['@id']), label: labelOf(m) })) } catch { @@ -348,7 +348,8 @@ onMounted(async () => { } } loadCountries().catch(() => {}) - void loadOptions('/clients', clientOptions, m => String(m.companyName ?? m['@id'])) + // Exclut les courtiers (catégorie COURTIER) du select clients du module Transport. + void loadOptions('/clients', clientOptions, m => String(m.companyName ?? m['@id']), { excludeCategoryCode: 'COURTIER' }) void loadOptions('/suppliers', supplierOptions, m => String(m.companyName ?? m['@id'])) void loadOptions('/sites', siteOptions, m => String(m.name ?? m['@id'])) }) diff --git a/frontend/modules/transport/pages/carriers/new.vue b/frontend/modules/transport/pages/carriers/new.vue index f471837..167d834 100644 --- a/frontend/modules/transport/pages/carriers/new.vue +++ b/frontend/modules/transport/pages/carriers/new.vue @@ -439,11 +439,12 @@ async function loadOptions( url: string, target: typeof clientOptions, labelOf: (m: Record) => string, + extraParams: Record = {}, ): Promise { try { const data = await api.get<{ member?: Record[] }>( url, - { pagination: 'false' }, + { pagination: 'false', ...extraParams }, { headers: { Accept: 'application/ld+json' }, toast: false }, ) target.value = (data.member ?? []).map(m => ({ value: String(m['@id']), label: labelOf(m) })) @@ -455,7 +456,8 @@ async function loadOptions( /** Charge les référentiels de l'onglet Prix (non bloquant : selects vides si échec). */ function loadPriceReferentials(): void { - void loadOptions('/clients', clientOptions, m => String(m.companyName ?? m['@id'])) + // Exclut les courtiers (catégorie COURTIER) du select clients du module Transport. + void loadOptions('/clients', clientOptions, m => String(m.companyName ?? m['@id']), { excludeCategoryCode: 'COURTIER' }) void loadOptions('/suppliers', supplierOptions, m => String(m.companyName ?? m['@id'])) void loadOptions('/sites', siteOptions, m => String(m.name ?? m['@id'])) } diff --git a/src/Module/Commercial/Domain/Repository/ClientRepositoryInterface.php b/src/Module/Commercial/Domain/Repository/ClientRepositoryInterface.php index 8bdafc7..043f15e 100644 --- a/src/Module/Commercial/Domain/Repository/ClientRepositoryInterface.php +++ b/src/Module/Commercial/Domain/Repository/ClientRepositoryInterface.php @@ -28,6 +28,10 @@ interface ClientRepositoryInterface * dont le code est dans la liste (OR — ERP-78). Liste vide = pas de filtre. * - $siteIds : restreint aux clients ayant au moins une adresse rattachee a * l'un des sites donnes (OR — RG-1.10). Liste vide = pas de filtre. + * - $excludeCategoryCodes : EXCLUT les clients possedant au moins une + * categorie dont le code est dans la liste (NOT IN). Liste vide = pas de + * filtre. Utilise par le module Transport pour ecarter les courtiers + * (code COURTIER) des selects clients. * * Filtrage centralise ICI (et non dans les providers/controllers) pour que * la liste paginee (ClientProvider) et l'export (ClientExportController) @@ -41,6 +45,7 @@ interface ClientRepositoryInterface * * @param list $categoryCodes * @param list $siteIds + * @param list $excludeCategoryCodes */ public function createListQueryBuilder( bool $includeArchived = false, @@ -48,6 +53,7 @@ interface ClientRepositoryInterface array $categoryCodes = [], array $siteIds = [], bool $archivedOnly = false, + array $excludeCategoryCodes = [], ): QueryBuilder; /** diff --git a/src/Module/Commercial/Infrastructure/ApiPlatform/State/Provider/ClientProvider.php b/src/Module/Commercial/Infrastructure/ApiPlatform/State/Provider/ClientProvider.php index 1d90cef..c5ead6b 100644 --- a/src/Module/Commercial/Infrastructure/ApiPlatform/State/Provider/ClientProvider.php +++ b/src/Module/Commercial/Infrastructure/ApiPlatform/State/Provider/ClientProvider.php @@ -25,6 +25,8 @@ use Symfony\Component\DependencyInjection\Attribute\Autowire; * - tri par defaut companyName ASC — RG-1.26 ; * - filtres ?search=... (fuzzy companyName + lastName + email) et * ?categoryCode= (clients ayant >= 1 categorie de ce code — ERP-78) ; + * - ?excludeCategoryCode= : EXCLUT les clients ayant >= 1 categorie de ce + * code (NOT IN — utilise par le module Transport pour ecarter les courtiers) ; * - pagination obligatoire (convention Starseed ERP-72) : Paginator ORM ; * echappatoire ?pagination=false pour alimenter un