import type { Asset, Site } from "./data"; import headOffice from "./plant-location-policy.json"; export const HEAD_OFFICE = headOffice; export type MapAsset = Pick; export type MapSite = Pick; type Coordinates = { latitude: number | null; longitude: number | null }; export type MapLocation = Coordinates & { source: "site" | "missing-site" | "head-office" | "manual" | "unlocated"; siteName: string | null; }; export function hasCoords(point: Coordinates): boolean { const { latitude, longitude } = point; return latitude != null && longitude != null && Number.isFinite(latitude) && Number.isFinite(longitude) && Math.abs(latitude) <= 90 && Math.abs(longitude) <= 180 && (latitude !== 0 || longitude !== 0); } // Current assignment controls placement, independently of historic invoice hires. // Resolve at read time so existing assignments and site-coordinate edits work // immediately, without overwriting a machine's separately saved manual pin. export function resolveAssetLocation(asset: Coordinates & { site?: string }, sites: MapSite[]): MapLocation { if (asset.site) { const site = sites.find(s => s.id === asset.site); return site && hasCoords(site) ? { latitude: site.latitude, longitude: site.longitude, source: "site", siteName: site.name } : { latitude: null, longitude: null, source: "missing-site", siteName: site?.name ?? "Unknown site" }; } if (!hasCoords(asset)) return { latitude: null, longitude: null, source: "unlocated", siteName: null }; const atOffice = Math.abs(asset.latitude! - HEAD_OFFICE.latitude) < 0.000001 && Math.abs(asset.longitude! - HEAD_OFFICE.longitude) < 0.000001; return { latitude: asset.latitude, longitude: asset.longitude, source: atOffice ? "head-office" : "manual", siteName: null }; }