/** * Shipper (carrier) → logo asset resolver. * * Centralises the mapping that is otherwise repeated as inline v-if chains * (components/AgGrid/SalesOrder/AgShipper.vue, components/sales/OrderForm.vue). * Assets live in public/assets/shipper/ and are referenced as /assets/shipper/… * * Matching rules, in priority order: * 1. hardcoded shipper ids (GEL Express 1000002, Cargo International 1000005, * DHL Express 1000006) — these carriers have no distinctive config/name * 2. "DHL Express" by name (checked BEFORE plain DHL) * 3. DHL by M_ShipperCfg_ID identifier or name prefix * 4. DPD / GLS / GEL / Cargo by name * 5. null → caller renders a fallback (icon + initials) */ export interface ShipperLike { id?: any name?: string cfgIdentifier?: string } const ID_LOGOS: Record = { '1000002': '/assets/shipper/gelexpress.png', '1000005': '/assets/shipper/cargo_logo_small.png', '1000006': '/assets/shipper/dhlexpress.png' } export const shipperLogoSrc = (s: ShipperLike | null | undefined): string | null => { if(!s) return null const id = s.id != null ? String(s.id) : '' if(id && ID_LOGOS[id]) return ID_LOGOS[id] const name = String(s.name || '').trim() const upper = name.toUpperCase() const cfg = String(s.cfgIdentifier || '').trim().toUpperCase() if(upper.includes('DHL') && upper.includes('EXPRESS')) return '/assets/shipper/dhlexpress.png' if(cfg === 'DHL' || upper.startsWith('DHL')) return '/assets/shipper/dhl_logo_small.svg' if(upper.startsWith('DPD')) return '/assets/shipper/dpd_logo_small.png' if(upper.startsWith('GLS')) return '/assets/shipper/gls_logo_small.svg' if(upper.includes('GEL')) return '/assets/shipper/gelexpress.png' if(upper.includes('CARGO')) return '/assets/shipper/cargo_logo_small.png' return null } /** Two-letter badge text for shippers without a logo asset ("Hermes" → "HE", "Deutsche Post" → "DP"). */ export const shipperInitials = (name: string | null | undefined): string => { const words = String(name || '').trim().split(/\s+/).filter(Boolean) if(words.length === 0) return '?' if(words.length === 1) return words[0].substring(0, 2).toUpperCase() return (words[0][0] + words[1][0]).toUpperCase() } export const useShipperLogo = () => ({ shipperLogoSrc, shipperInitials })