shoc-frontend-new/src/domain/dashboard/utils/work-order-drilldown-links.ts

97 lines
3.2 KiB
TypeScript
Raw Normal View History

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;
}