2026-09-16 19:37:15 -03:00
|
|
|
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 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 {
|
2026-09-17 00:36:55 -03:00
|
|
|
// 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.
|
2026-09-16 19:37:15 -03:00
|
|
|
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;
|
|
|
|
|
}
|