import { ALL_WIZARD_STATUSES } from "@/domain/work-orders/types/work-order-wizard"; import { WO_TYPES, type WOType } from "@/domain/work-orders/types/work-order-wizard"; import type { DashboardRangeKey } from "@/domain/dashboard/types/dashboard-range"; import { addDaysIso, businessTodayIso, dashboardRangeParams, } from "@/domain/dashboard/utils/dashboard-range-utils"; export const WORK_ORDERS_ROUTE = "/workorders"; export const UPLIFTS_ROUTE = "/uplifts"; export const OPEN_WIZARD_STATUSES: readonly string[] = ALL_WIZARD_STATUSES.filter( (status) => status !== "Completed", ); export function workOrderDrilldownUrl(search: URLSearchParams): string { const query = search.toString(); return query ? `${WORK_ORDERS_ROUTE}?${query}` : WORK_ORDERS_ROUTE; } function setDateRange(search: URLSearchParams, range: DashboardRangeKey): void { const params = dashboardRangeParams(range); if (params.dateFrom && params.dateTo) { search.set("dateFrom", params.dateFrom); search.set("dateTo", params.dateTo); } } export function workOrderRangeDrilldownSearch(range: DashboardRangeKey): URLSearchParams { const search = new URLSearchParams(); setDateRange(search, range); return search; } export function workOrderStatusDrilldownSearch( status: string, range: DashboardRangeKey, ): URLSearchParams { const search = workOrderRangeDrilldownSearch(range); search.set("statuses", status); return search; } export function workOrderTypeDrilldownSearch( type: string, range: DashboardRangeKey, ): URLSearchParams | null { if (!WO_TYPES.includes(type as WOType)) return null; const search = workOrderRangeDrilldownSearch(range); search.set("types", type); return search; } export function workOrderDispatcherDrilldownSearch( dispatcherId: string, range: DashboardRangeKey, ): URLSearchParams { const search = workOrderRangeDrilldownSearch(range); search.set("dispatchers", dispatcherId); return search; } export function workOrderRegionDrilldownSearch( region: string, range: DashboardRangeKey, ): URLSearchParams { const search = workOrderRangeDrilldownSearch(range); search.set("regions", region); return search; } export function scheduledTomorrowDrilldownSearch( today: string = businessTodayIso(), ): URLSearchParams { const tomorrow = addDaysIso(today, 1); const search = new URLSearchParams(); search.set("dateFrom", tomorrow); search.set("dateTo", tomorrow); return search; } export function avetaPendingDrilldownSearch(today: string = businessTodayIso()): URLSearchParams { // The Aveta Pending count (backend#138 / SH-294) is: AvetaRequired, scheduled // today or tomorrow, open, and missing its Aveta-category document. The board // has no missing-Aveta-document filter, so the closest reachable set is the // Aveta-required work in the two-day open window. `docs=No` is deliberately // NOT sent: it filters on completion-document status, a different document // from the Aveta clearance one, so it would narrow to the wrong rows. const search = new URLSearchParams(); search.set("dateFrom", today); search.set("dateTo", addDaysIso(today, 1)); search.set("aveta", "1"); search.set("statuses", OPEN_WIZARD_STATUSES.join(",")); return search; }