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 { OrganizationModule } from "../organization"; import { createAccount } from "./command/createAccount.generated"; import { deactivateAccount } from "./command/deactivateAccount.generated"; import { reactivateAccount } from "./command/reactivateAccount.generated"; import { updateAccount } from "./command/updateAccount.generated"; import { createAccountType, type CreateAccountTypeParams } from "./db/account"; import { getAccount } from "./query/getAccount.generated"; import { listAccounts } from "./query/listAccounts.generated"; type OrganizationDB = OrganizationModule["db"]; export type OrganizationQueries = OrganizationModule["queries"]; export interface DefineModuleParams> { account?: CreateAccountTypeParams; organization: { db: { company: OrganizationDB["company"] }; queries: Pick; }; } /* @__NO_SIDE_EFFECTS__ */ export const defineModule = = EmptyFields>( params: DefineModuleParams, ) => { const accountDb = createAccountType({ ...params.account, companyType: params.organization.db.company, }); return { db: { account: accountDb, }, commands: { createAccount: createAccount>(params.organization.queries), updateAccount: updateAccount>(), deactivateAccount: deactivateAccount(), reactivateAccount: reactivateAccount(), }, queries: { getAccount, listAccounts, }, }; }; /** EmptyFields-instantiated alias — use instead of `ReturnType`, which widens field generics to their constraint. */ export type CoaManagementModule = ReturnType>;