import { type EmptyFields } from "@tailor-platform/erp-kit/core"; import { type TailorAnyDBField, type TailorAnyDBType } from "@tailor-platform/sdk"; import type { TailorDBInsertable } from "@tailor-platform/sdk/kysely"; import type { OrganizationModule } from "../organization"; import type { WorkforceModule } from "../workforce"; import { cancelShift } from "./command/cancelShift.generated"; import { confirmShiftSchedule } from "./command/confirmShiftSchedule.generated"; import { createShift } from "./command/createShift.generated"; import { createShiftPattern } from "./command/createShiftPattern.generated"; import { createShiftPlacement } from "./command/createShiftPlacement.generated"; import { createShiftPlacements } from "./command/createShiftPlacements.generated"; import { createShifts } from "./command/createShifts.generated"; import { createShiftSchedule } from "./command/createShiftSchedule.generated"; import { deleteShiftPattern } from "./command/deleteShiftPattern.generated"; import { releaseShiftPlacement } from "./command/releaseShiftPlacement.generated"; import { swapShiftPlacement } from "./command/swapShiftPlacement.generated"; import { updateShift } from "./command/updateShift.generated"; import { updateShiftPattern } from "./command/updateShiftPattern.generated"; import { createShiftType } from "./db/shift"; import { createShiftPatternType } from "./db/shiftPattern"; import { createShiftPlacementType } from "./db/shiftPlacement"; import { createShiftScheduleType } from "./db/shiftSchedule"; import { getShift } from "./query/getShift.generated"; import { getShiftPattern } from "./query/getShiftPattern.generated"; import { getShiftPatternByCode } from "./query/getShiftPatternByCode.generated"; import { getShiftPlacement } from "./query/getShiftPlacement.generated"; import { getShiftSchedule } from "./query/getShiftSchedule.generated"; import { getShiftVariance } from "./query/getShiftVariance.generated"; import { listOpenShifts } from "./query/listOpenShifts.generated"; import { listPublishedShifts } from "./query/listPublishedShifts.generated"; import { listShiftPatterns } from "./query/listShiftPatterns.generated"; import { listShiftPlacementsByAssignment } from "./query/listShiftPlacementsByAssignment.generated"; import { listShiftPlacementsByShift } from "./query/listShiftPlacementsByShift.generated"; import { listShifts } from "./query/listShifts.generated"; type OrganizationDB = OrganizationModule["db"]; type WorkforceDB = WorkforceModule["db"]; type WorkforceQueries = WorkforceModule["queries"]; export interface DefineModuleParams< SSF extends Record = EmptyFields, SF extends Record = EmptyFields, SPF extends Record = EmptyFields, PLF extends Record = EmptyFields, > { shiftSchedule?: { fields?: SSF }; shift?: { fields?: SF }; shiftPattern?: { fields?: SPF }; shiftPlacement?: { fields?: PLF }; workforce: { db: { assignment: WorkforceDB["assignment"] }; // Placement commands verify that an Assignment actually covers the shift's date. shiftSchedule // cannot join workforce's tables, so the reader is injected (see lib/_workforceDeps.ts). queries: { getAssignment: WorkforceQueries["getAssignment"] }; }; organization: { db: { site: OrganizationDB["site"] }; }; } /* @__NO_SIDE_EFFECTS__ */ export const defineModule = < const SSF extends Record = EmptyFields, const SF extends Record = EmptyFields, const SPF extends Record = EmptyFields, const PLF extends Record = EmptyFields, >( params: DefineModuleParams, ) => { const assignmentType: TailorAnyDBType = params.workforce.db.assignment; const siteType: TailorAnyDBType = params.organization.db.site; const shiftPattern = createShiftPatternType({ ...params.shiftPattern, scopeType: siteType }); const shiftSchedule = createShiftScheduleType({ ...params.shiftSchedule }); const shift = createShiftType({ ...params.shift, siteType }); const shiftPlacement = createShiftPlacementType({ ...params.shiftPlacement, assignmentType }); return { db: { shiftPattern, shiftSchedule, shift, shiftPlacement, }, commands: { createShiftPattern: createShiftPattern>(), updateShiftPattern: updateShiftPattern>(), deleteShiftPattern: deleteShiftPattern(), createShiftSchedule: createShiftSchedule>(), confirmShiftSchedule: confirmShiftSchedule(), createShift: createShift>(), createShifts: createShifts>(), updateShift: updateShift>(), cancelShift: cancelShift(), createShiftPlacement: createShiftPlacement>({ getAssignment: params.workforce.queries.getAssignment, }), createShiftPlacements: createShiftPlacements>({ getAssignment: params.workforce.queries.getAssignment, }), releaseShiftPlacement: releaseShiftPlacement(), swapShiftPlacement: swapShiftPlacement>({ getAssignment: params.workforce.queries.getAssignment, }), }, queries: { getShiftPattern, getShiftPatternByCode, listShiftPatterns, getShiftSchedule, getShift, getShiftVariance, listOpenShifts, listPublishedShifts, listShifts, getShiftPlacement, listShiftPlacementsByShift, listShiftPlacementsByAssignment, }, }; }; /** EmptyFields-instantiated alias — use instead of `ReturnType`, which widens field generics to their constraint. */ export type ShiftScheduleModule = ReturnType< typeof defineModule >;