import { ref } from 'vue' /** * Charge les referentiels (listes courtes) alimentant les selects du formulaire * principal de l'ecran « Ajouter un prestataire » (M3 Technique, ERP-141) : * categories (type PRESTATAIRE) et sites (86 / 17 / 82). * * Miroir reduit de `useSupplierReferentials` (M2) : a ce stade (formulaire * principal) seuls categories + sites sont necessaires. Les referentiels * comptables (modes de TVA, delais/types de reglement, banques) seront charges * par l'onglet Comptabilite (ERP-144). * * Toutes les collections sont recuperees en entier via l'echappatoire prevue * `?pagination=false` (referentiels de quelques entrees), avec l'en-tete * `Accept: application/ld+json` impose par API Platform 4 pour obtenir l'enveloppe * Hydra (`member`). La valeur d'option est l'IRI Hydra (`@id`), renvoyee telle * quelle dans le payload POST (relations M2M). * * Chargement RESILIENT (Promise.allSettled) : chaque referentiel est isole ; un * echec (permission manquante, reseau) laisse simplement la liste vide. * * Etat 100 % local a l'instance (refs) — aucune persistance URL. */ /** Option generique au format attendu par MalioSelect / MalioSelectCheckbox. */ export interface RefOption { value: string label: string } interface HydraMember { '@id': string } interface CategoryMember extends HydraMember { code: string name: string } interface SiteMember extends HydraMember { name: string postalCode: string } const LD_JSON_HEADERS = { Accept: 'application/ld+json' } export function useProviderReferentials() { const api = useApi() const categories = ref([]) const sites = ref([]) /** Recupere une collection complete (pagination desactivee) en Hydra. */ async function fetchAll( url: string, query: Record = {}, ): Promise { const res = await api.get<{ member?: T[] }>( url, { pagination: 'false', ...query }, { headers: LD_JSON_HEADERS, toast: false }, ) return res.member ?? [] } /** Charge en parallele les referentiels du formulaire principal (categories + sites). */ async function loadMain(): Promise { await Promise.allSettled([ // RG-3.09 : un prestataire ne porte que des categories de type // PRESTATAIRE -> filtre cote API. Libelle affiche = `name`. fetchAll('/categories', { typeCode: 'PRESTATAIRE' }) .then((cats) => { categories.value = cats.map(c => ({ value: c['@id'], label: c.name })) }), // Sites (RG-3.03) : libelle = numero de departement (2 premiers chiffres // du code postal du site), ex: 86100 -> « 86 », 17400 -> « 17 ». fetchAll('/sites') .then((sitesList) => { sites.value = sitesList.map(s => ({ value: s['@id'], label: (s.postalCode ?? '').slice(0, 2) })) }), ]) } return { categories, sites, loadMain, } }