import { type EmptyFields } from "@tailor-platform/erp-kit/core"; import { type TailorAnyDBField } from "@tailor-platform/sdk"; import type { TailorDBInsertable } from "@tailor-platform/sdk/kysely"; import type { PrimitivesModule } from "../primitives"; import { activateCompany } from "./command/activateCompany.generated"; import { createCompany } from "./command/createCompany.generated"; import { createDepartment } from "./command/createDepartment.generated"; import { createSite } from "./command/createSite.generated"; import { deactivateCompany } from "./command/deactivateCompany.generated"; import { deactivateDepartment } from "./command/deactivateDepartment.generated"; import { deactivateSite } from "./command/deactivateSite.generated"; import { deleteCompany } from "./command/deleteCompany.generated"; import { reactivateCompany } from "./command/reactivateCompany.generated"; import { reactivateDepartment } from "./command/reactivateDepartment.generated"; import { reactivateSite } from "./command/reactivateSite.generated"; import { updateCompany } from "./command/updateCompany.generated"; import { updateDepartment } from "./command/updateDepartment.generated"; import { updateSite } from "./command/updateSite.generated"; import { createCompanyType, type CreateCompanyTypeParams } from "./db/company"; import { createDepartmentType, type CreateDepartmentTypeParams } from "./db/department"; import { createSiteType, type CreateSiteTypeParams } from "./db/site"; import { detectDepartmentCircularReference } from "./query/detectDepartmentCircularReference.generated"; import { getCompany } from "./query/getCompany.generated"; import { getDepartment } from "./query/getDepartment.generated"; import { getDepartmentChildren } from "./query/getDepartmentChildren.generated"; import { getSite } from "./query/getSite.generated"; import { listDepartmentsByCompany } from "./query/listDepartmentsByCompany.generated"; import { listSitesByCompany } from "./query/listSitesByCompany.generated"; type PrimitivesDB = PrimitivesModule["db"]; export type PrimitivesQueries = PrimitivesModule["queries"]; export interface DefineModuleParams< CF extends Record, SF extends Record, DF extends Record, > { company?: CreateCompanyTypeParams; site?: CreateSiteTypeParams; department?: CreateDepartmentTypeParams; primitives: { db: { currency: PrimitivesDB["currency"] }; queries: Pick; }; } /* @__NO_SIDE_EFFECTS__ */ export const defineModule = < const CF extends Record = EmptyFields, const SF extends Record = EmptyFields, const DF extends Record = EmptyFields, >( params: DefineModuleParams, ) => { const company = createCompanyType({ ...params.company, currencyType: params.primitives.db.currency, }); const site = createSiteType(params.site ?? {}); const department = createDepartmentType(params.department ?? {}); return { db: { company, site, department }, commands: { createCompany: createCompany>(params.primitives.queries), updateCompany: updateCompany>(params.primitives.queries), activateCompany: activateCompany(params.primitives.queries), deactivateCompany: deactivateCompany(), reactivateCompany: reactivateCompany(), deleteCompany: deleteCompany(), createSite: createSite>(), updateSite: updateSite>(), deactivateSite: deactivateSite(), reactivateSite: reactivateSite(), createDepartment: createDepartment>(), updateDepartment: updateDepartment>(), deactivateDepartment: deactivateDepartment(), reactivateDepartment: reactivateDepartment(), }, queries: { getCompany, getDepartment, getDepartmentChildren, detectDepartmentCircularReference, getSite, listDepartmentsByCompany, listSitesByCompany, }, }; }; /** EmptyFields-instantiated alias — use instead of `ReturnType`, which widens field generics to their constraint. */ export type OrganizationModule = ReturnType< typeof defineModule >;