import { ref } from 'vue' /** * Référentiels alimentant les selects de contrepartie de l'écran « Ticket de * pesée » (M5, ERP-189) : liste des clients (M1) et des fournisseurs (M2). * * Collections récupérées en entier via l'échappatoire `?pagination=false` * (référentiels de quelques dizaines d'entrées), avec l'en-tête * `Accept: application/ld+json` imposé par API Platform 4 pour obtenir * l'enveloppe Hydra (`member`). La valeur d'option est l'IRI Hydra (`@id`) — * renvoyée telle quelle dans le payload POST/PATCH (relation ManyToOne). * * Miroir de `useClientReferentials` (M1). État 100 % local à l'instance. */ /** Option au format attendu par MalioSelect ({ label, value }). */ export interface RefOption { value: string label: string } interface PartyMember { '@id': string companyName: string } const LD_JSON_HEADERS = { Accept: 'application/ld+json' } export function useWeighingTicketReferentials() { const api = useApi() const clients = ref([]) const suppliers = ref([]) /** Récupère une collection complète (pagination désactivée) en Hydra. */ async function fetchAll(url: string): Promise { const res = await api.get<{ member?: PartyMember[] }>( url, { pagination: 'false' }, { headers: LD_JSON_HEADERS, toast: false }, ) return res.member ?? [] } /** * Charge en parallèle clients + fournisseurs (résilient : un référentiel en * échec — ex. 403 selon le rôle — laisse simplement son select vide sans * faire échouer l'autre). */ async function load(): Promise { await Promise.allSettled([ fetchAll('/clients').then((list) => { clients.value = list.map(c => ({ value: c['@id'], label: c.companyName })) }), fetchAll('/suppliers').then((list) => { suppliers.value = list.map(s => ({ value: s['@id'], label: s.companyName })) }), ]) } return { clients, suppliers, load } }