import { ref } from 'vue' import { debounce } from '~/shared/utils/debounce' import type { HydraCollection } from '~/shared/utils/api' /** * Ligne du référentiel QUALIMAT renvoyée par la saisie assistée (groupe * `qualimat:read`). `@id` est l'IRI conservée comme FK `carrier.qualimatCarrier` * (RG-4.01 / § 2.5) ; `validityDate` pilote le fond rouge de la colonne « Date de * validité » (RG-4.04). */ export interface QualimatCarrierRow { '@id': string id: string name: string | null siret: string | null address: string | null postalCode: string | null city: string | null validityDate: string | null status: string | null } /** Délai de debounce de la recherche (ms) — une requête après la dernière frappe. */ const SEARCH_DEBOUNCE_MS = 300 /** * Saisie assistée QUALIMAT (M4 Transport, ERP-166 — RG-4.01 / spec-back § 4.7). * * `GET /api/qualimat_carriers?search=` : référentiel en LECTURE SEULE, lignes * actives uniquement (filtré côté serveur), recherche fuzzy nom + siret. Alimente * le tableau de sélection de l'onglet Qualimat ; la ligne choisie est copiée dans * le formulaire principal (cf. `useCarrierForm.applyQualimatSelection`). * * Volontairement PAR INSTANCE (état local à l'écran d'ajout). `search()` est * debouncé (anti-spam réseau) ; `fetchNow()` expose l'appel immédiat (montage / * tests). */ export function useQualimatSearch() { const api = useApi() const results = ref([]) const loading = ref(false) /** Lance immédiatement la recherche (sans debounce). */ async function fetchNow(term: string): Promise { loading.value = true try { const data = await api.get>( '/qualimat_carriers', { search: term.trim() }, { headers: { Accept: 'application/ld+json' }, toast: false }, ) results.value = data.member ?? [] } catch { // Échec réseau / 403 : on vide les résultats, pas de toast (la recherche // assistée est non bloquante — l'utilisateur peut saisir manuellement). results.value = [] } finally { loading.value = false } } // Recherche debouncée branchée sur le champ de recherche de l'onglet Qualimat. const search = debounce((term: string) => { void fetchNow(term) }, SEARCH_DEBOUNCE_MS) return { results, loading, search, fetchNow, } }