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 { CoaManagementModule } from "../coa-management"; import type { OrganizationModule } from "../organization"; import type { PrimitivesModule } from "../primitives"; import { createCustomerAccount } from "./command/createCustomerAccount.generated"; import { createPartner } from "./command/createPartner.generated"; import { createPartnerAddress } from "./command/createPartnerAddress.generated"; import { createPartnerBankAccount } from "./command/createPartnerBankAccount.generated"; import { createSupplierAccount } from "./command/createSupplierAccount.generated"; import { deactivateCustomerAccount } from "./command/deactivateCustomerAccount.generated"; import { deactivatePartner } from "./command/deactivatePartner.generated"; import { deactivatePartnerAddress } from "./command/deactivatePartnerAddress.generated"; import { deactivatePartnerBankAccount } from "./command/deactivatePartnerBankAccount.generated"; import { deactivateSupplierAccount } from "./command/deactivateSupplierAccount.generated"; import { reactivateCustomerAccount } from "./command/reactivateCustomerAccount.generated"; import { reactivatePartner } from "./command/reactivatePartner.generated"; import { reactivatePartnerAddress } from "./command/reactivatePartnerAddress.generated"; import { reactivatePartnerBankAccount } from "./command/reactivatePartnerBankAccount.generated"; import { reactivateSupplierAccount } from "./command/reactivateSupplierAccount.generated"; import { updateCustomerAccount } from "./command/updateCustomerAccount.generated"; import { updatePartner } from "./command/updatePartner.generated"; import { updatePartnerAddress } from "./command/updatePartnerAddress.generated"; import { updatePartnerBankAccount } from "./command/updatePartnerBankAccount.generated"; import { updateSupplierAccount } from "./command/updateSupplierAccount.generated"; import { createBusinessPartnerType, type CreateBusinessPartnerTypeParams, } from "./db/businessPartner"; import { createCustomerAccountType, type CreateCustomerAccountTypeParams, } from "./db/customerAccount"; import { createCustomerAddressUsageType, type CreateCustomerAddressUsageTypeParams, } from "./db/customerAddressUsage"; import { createCustomerBankAccountUsageType, type CreateCustomerBankAccountUsageTypeParams, } from "./db/customerBankAccountUsage"; import { createPartnerAddressType, type CreatePartnerAddressTypeParams } from "./db/partnerAddress"; import { createPartnerBankAccountType, type CreatePartnerBankAccountTypeParams, } from "./db/partnerBankAccount"; import { createSupplierAccountType, type CreateSupplierAccountTypeParams, } from "./db/supplierAccount"; import { createSupplierAddressUsageType, type CreateSupplierAddressUsageTypeParams, } from "./db/supplierAddressUsage"; import { createSupplierBankAccountUsageType, type CreateSupplierBankAccountUsageTypeParams, } from "./db/supplierBankAccountUsage"; import { getCustomerAccount } from "./query/getCustomerAccount.generated"; import { getSupplierAccount } from "./query/getSupplierAccount.generated"; import { listBusinessPartners } from "./query/listBusinessPartners.generated"; type OrganizationDB = OrganizationModule["db"]; export type OrganizationQueries = OrganizationModule["queries"]; type PrimitivesDB = PrimitivesModule["db"]; export type PrimitivesQueries = PrimitivesModule["queries"]; type CoaManagementDB = CoaManagementModule["db"]; export type CoaManagementQueries = CoaManagementModule["queries"]; export interface DefineModuleParams< BPF extends Record, PAF extends Record, BAF extends Record, CAF extends Record, CAUF extends Record, CBUF extends Record, SAF extends Record, SAUF extends Record, SBUF extends Record, > { businessPartner?: CreateBusinessPartnerTypeParams; partnerAddress?: CreatePartnerAddressTypeParams; partnerBankAccount?: CreatePartnerBankAccountTypeParams; customerAccount?: CreateCustomerAccountTypeParams; customerAddressUsage?: CreateCustomerAddressUsageTypeParams; customerBankAccountUsage?: CreateCustomerBankAccountUsageTypeParams; supplierAccount?: CreateSupplierAccountTypeParams; supplierAddressUsage?: CreateSupplierAddressUsageTypeParams; supplierBankAccountUsage?: CreateSupplierBankAccountUsageTypeParams; organization: { db: { company: OrganizationDB["company"] }; queries: Pick; }; primitives: { db: { currency: PrimitivesDB["currency"] }; queries: Pick; }; coaManagement: { db: { account: CoaManagementDB["account"] }; queries: Pick; }; } /* @__NO_SIDE_EFFECTS__ */ export const defineModule = < const BPF extends Record = EmptyFields, const PAF extends Record = EmptyFields, const BAF extends Record = EmptyFields, const CAF extends Record = EmptyFields, const CAUF extends Record = EmptyFields, const CBUF extends Record = EmptyFields, const SAF extends Record = EmptyFields, const SAUF extends Record = EmptyFields, const SBUF extends Record = EmptyFields, >( params: DefineModuleParams, ) => { const businessPartnerDb = createBusinessPartnerType(params.businessPartner ?? {}); const partnerAddressDb = createPartnerAddressType(params.partnerAddress ?? {}); const partnerBankAccountDb = createPartnerBankAccountType({ ...params.partnerBankAccount, currencyType: params.primitives.db.currency, }); const customerAccountDb = createCustomerAccountType({ ...params.customerAccount, companyType: params.organization.db.company, currencyType: params.primitives.db.currency, }); const customerAddressUsageDb = createCustomerAddressUsageType(params.customerAddressUsage ?? {}); const customerBankAccountUsageDb = createCustomerBankAccountUsageType( params.customerBankAccountUsage ?? {}, ); const supplierAccountDb = createSupplierAccountType({ ...params.supplierAccount, companyType: params.organization.db.company, currencyType: params.primitives.db.currency, accountType: params.coaManagement.db.account, }); const supplierAddressUsageDb = createSupplierAddressUsageType(params.supplierAddressUsage ?? {}); const supplierBankAccountUsageDb = createSupplierBankAccountUsageType( params.supplierBankAccountUsage ?? {}, ); return { db: { businessPartner: businessPartnerDb, partnerAddress: partnerAddressDb, partnerBankAccount: partnerBankAccountDb, customerAccount: customerAccountDb, customerAddressUsage: customerAddressUsageDb, customerBankAccountUsage: customerBankAccountUsageDb, supplierAccount: supplierAccountDb, supplierAddressUsage: supplierAddressUsageDb, supplierBankAccountUsage: supplierBankAccountUsageDb, }, commands: { createPartner: createPartner>(), updatePartner: updatePartner>(), deactivatePartner: deactivatePartner(), reactivatePartner: reactivatePartner(), createCustomerAccount: createCustomerAccount< TailorDBInsertable, TailorDBInsertable, TailorDBInsertable >(params.organization.queries, params.primitives.queries), updateCustomerAccount: updateCustomerAccount< TailorDBInsertable, TailorDBInsertable, TailorDBInsertable >(params.primitives.queries), deactivateCustomerAccount: deactivateCustomerAccount(), reactivateCustomerAccount: reactivateCustomerAccount(), createSupplierAccount: createSupplierAccount< TailorDBInsertable, TailorDBInsertable, TailorDBInsertable >(params.organization.queries, params.primitives.queries, params.coaManagement.queries), updateSupplierAccount: updateSupplierAccount< TailorDBInsertable, TailorDBInsertable, TailorDBInsertable >(params.primitives.queries, params.coaManagement.queries), deactivateSupplierAccount: deactivateSupplierAccount(), reactivateSupplierAccount: reactivateSupplierAccount(), createPartnerAddress: createPartnerAddress>(), updatePartnerAddress: updatePartnerAddress>(), deactivatePartnerAddress: deactivatePartnerAddress(), reactivatePartnerAddress: reactivatePartnerAddress(), createPartnerBankAccount: createPartnerBankAccount>( params.primitives.queries, ), updatePartnerBankAccount: updatePartnerBankAccount>( params.primitives.queries, ), deactivatePartnerBankAccount: deactivatePartnerBankAccount(), reactivatePartnerBankAccount: reactivatePartnerBankAccount(), }, queries: { listBusinessPartners, getCustomerAccount, getSupplierAccount, }, }; }; export type BusinessPartnerModule = ReturnType< typeof defineModule< EmptyFields, EmptyFields, EmptyFields, EmptyFields, EmptyFields, EmptyFields, EmptyFields, EmptyFields, EmptyFields > >;