// The warehouse board (phase 4 contract, api/warehouse.py). import { api } from "./client"; import { qs } from "./query"; import { normaliseFacets, type BoardQuery, type BoardResponse, type PacketCard } from "./types"; const COLUMNS = ["incoming", "pulling", "hold", "pulled", "released"] as const; /** Every column and number present, even when the server leaves one out. */ function normalise(raw: Partial | null): BoardResponse { const cols = (raw?.columns ?? {}) as Partial>; const columns = Object.fromEntries(COLUMNS.map((c) => [c, Array.isArray(cols[c]) ? cols[c] : []])) as BoardResponse["columns"]; const facets = normaliseFacets(raw?.facets); return { kpis: { waiting: 0, pulling: 0, hold: 0, pulled: 0, open_shorts: 0, released_24h: 0, ...(raw?.kpis ?? {}) }, columns, shorts: Array.isArray(raw?.shorts) ? raw.shorts : [], ...(facets ? { facets } : {}), }; } export const warehouseApi = { board: async (q: BoardQuery = {}, signal?: AbortSignal): Promise => normalise(await api.get | null>(`/api/warehouse/board${qs({ ...q })}`, signal)), };