import { ref } from 'vue' import type { CarrierDetail } from '~/modules/transport/utils/forms/carrierMappers' /** * Chargement et actions d'archivage d'un transporteur unique (écrans Consultation / * Modification, ERP-170). Miroir de `useProvider` (M3) / `useSupplier` (M2). Lit le * détail embarqué via `GET /api/carriers/{id}` (qualimatCarrier + addresses / * contacts / prices sous `carrier:item:read`, relations cross-module via leurs * read-groups) — une SEULE requête peuple les deux écrans (embed borné, pas de N+1). * * L'en-tête `Accept: application/ld+json` est imposé pour obtenir le payload Hydra * complet (avec les `@id` des relations embarquées, indispensables au préremplissage). * * État 100 % local à l'instance (refs). Les erreurs d'archivage / restauration * (notamment le 409 d'homonyme actif à la restauration) sont PROPAGÉES à l'appelant. */ export function useCarrier(id: number | string) { const api = useApi() const carrier = ref(null) const loading = ref(false) const error = ref(false) /** Récupère le détail complet (embed qualimatCarrier + addresses / contacts / prices). */ function fetchDetail(): Promise { return api.get( `/carriers/${id}`, {}, { headers: { Accept: 'application/ld+json' }, toast: false }, ) } /** Charge le détail du transporteur. En cas d'échec : `error = true`, `carrier = null`. */ async function load(): Promise { loading.value = true error.value = false try { carrier.value = await fetchDetail() } catch { error.value = true carrier.value = null } finally { loading.value = false } } /** * Bascule l'archivage (PATCH `isArchived` SEUL — groupe carrier:write:archive ; * tout autre champ → 422, security archive = Admin seul), puis RECHARGE le détail * complet (la réponse du PATCH ne porte pas l'embed des sous-collections). Toute * erreur est propagée à l'appelant AVANT le rechargement. */ async function setArchived(isArchived: boolean): Promise { await api.patch(`/carriers/${id}`, { isArchived }, { toast: false }) carrier.value = await fetchDetail() } return { carrier, loading, error, load, archive: () => setArchived(true), restore: () => setArchived(false), } }