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 { BusinessPartnerModule } from "../business-partner"; import type { CoaManagementModule } from "../coa-management"; import type { FinancialAccountingModule } from "../financial-accounting"; import type { InventoryModule } from "../inventory"; import type { OrganizationModule } from "../organization"; import type { PrimitivesModule } from "../primitives"; import type { PurchaseModule } from "../purchase"; import { cancelAccountPayableDocument } from "./command/cancelAccountPayableDocument.generated"; import { cancelOutgoingPayment } from "./command/cancelOutgoingPayment.generated"; import { correctAccountPayableDocument } from "./command/correctAccountPayableDocument.generated"; import { createAccountPayableDocument } from "./command/createAccountPayableDocument.generated"; import { createInvoiceToleranceConfig } from "./command/createInvoiceToleranceConfig.generated"; import { createOutgoingPayment } from "./command/createOutgoingPayment.generated"; import { postAccountPayableDocument } from "./command/postAccountPayableDocument.generated"; import { postOutgoingPayment } from "./command/postOutgoingPayment.generated"; import { registerAccountPayableDocument } from "./command/registerAccountPayableDocument.generated"; import { releaseAccountPayableDocumentHold } from "./command/releaseAccountPayableDocumentHold.generated"; import { reverseOutgoingPayment } from "./command/reverseOutgoingPayment.generated"; import { updateAccountPayableDocument } from "./command/updateAccountPayableDocument.generated"; import { updateInvoiceToleranceConfig } from "./command/updateInvoiceToleranceConfig.generated"; import { updateOutgoingPayment } from "./command/updateOutgoingPayment.generated"; import { createAccountPayableDistributionLineType, type CreateAccountPayableDistributionLineTypeParams, } from "./db/accountPayableDistributionLine"; import { createAccountPayableDocumentType, type CreateAccountPayableDocumentTypeParams, } from "./db/accountPayableDocument"; import { createAccountPayableDocumentHoldType, type CreateAccountPayableDocumentHoldTypeParams, } from "./db/accountPayableDocumentHold"; import { createAccountPayableDocumentLineType, type CreateAccountPayableDocumentLineTypeParams, } from "./db/accountPayableDocumentLine"; import { createAccountPayableDueScheduleLineType, type CreateAccountPayableDueScheduleLineTypeParams, } from "./db/accountPayableDueScheduleLine"; import { createAccountPayableSettlementType, type CreateAccountPayableSettlementTypeParams, } from "./db/accountPayableSettlement"; import { createInvoiceToleranceConfigType, type CreateInvoiceToleranceConfigTypeParams, } from "./db/invoiceToleranceConfig"; import { createOutgoingPaymentType, type CreateOutgoingPaymentTypeParams, } from "./db/outgoingPayment"; import { getOutgoingPayment } from "./query/getOutgoingPayment.generated"; type OrganizationDB = OrganizationModule["db"]; export type OrganizationQueries = OrganizationModule["queries"]; type BusinessPartnerDB = BusinessPartnerModule["db"]; export type BusinessPartnerQueries = BusinessPartnerModule["queries"]; type PrimitivesDB = PrimitivesModule["db"]; export type PrimitivesQueries = PrimitivesModule["queries"]; type CoaManagementDB = CoaManagementModule["db"]; export type CoaManagementQueries = CoaManagementModule["queries"]; export type FinancialAccountingCommands = FinancialAccountingModule["commands"]; export type FinancialAccountingQueries = FinancialAccountingModule["queries"]; type PurchaseDB = PurchaseModule["db"]; export type PurchaseCommands = PurchaseModule["commands"]; export type PurchaseQueries = PurchaseModule["queries"]; export type InventoryCommands = InventoryModule["commands"]; export type InventoryQueries = InventoryModule["queries"]; export interface DefineModuleParams< ApdF extends Record = EmptyFields, ApdlF extends Record = EmptyFields, ApdistF extends Record = EmptyFields, ApdslF extends Record = EmptyFields, ApdhF extends Record = EmptyFields, ItcF extends Record = EmptyFields, OpF extends Record = EmptyFields, ApsF extends Record = EmptyFields, > { accountPayableDocument?: CreateAccountPayableDocumentTypeParams; accountPayableDocumentLine?: CreateAccountPayableDocumentLineTypeParams; accountPayableDistributionLine?: CreateAccountPayableDistributionLineTypeParams; accountPayableDueScheduleLine?: CreateAccountPayableDueScheduleLineTypeParams; accountPayableDocumentHold?: CreateAccountPayableDocumentHoldTypeParams; invoiceToleranceConfig?: CreateInvoiceToleranceConfigTypeParams; outgoingPayment?: CreateOutgoingPaymentTypeParams; accountPayableSettlement?: CreateAccountPayableSettlementTypeParams; organization: { db: { company: OrganizationDB["company"]; }; queries: Pick; }; businessPartner: { db: { supplierAccount: BusinessPartnerDB["supplierAccount"]; }; queries: Pick; }; primitives: { db: { currency: PrimitivesDB["currency"]; unit: PrimitivesDB["unit"]; }; queries: Pick; }; financialAccounting: { commands: Pick; queries: Pick; }; coaManagement: { db: { account: CoaManagementDB["account"]; }; queries: Pick; }; purchase: { db: { purchaseOrderLine: PurchaseDB["purchaseOrderLine"]; }; commands: Pick; queries: Pick; }; inventory: { commands: Pick; queries: Pick; }; } /* @__NO_SIDE_EFFECTS__ */ export const defineModule = < const ApdF extends Record = EmptyFields, const ApdlF extends Record = EmptyFields, const ApdistF extends Record = EmptyFields, const ApdslF extends Record = EmptyFields, const ApdhF extends Record = EmptyFields, const ItcF extends Record = EmptyFields, const OpF extends Record = EmptyFields, const ApsF extends Record = EmptyFields, >( params: DefineModuleParams, ) => { const accountPayableDocumentDb = createAccountPayableDocumentType({ ...params.accountPayableDocument, companyType: params.organization.db.company, supplierAccountType: params.businessPartner.db.supplierAccount, currencyType: params.primitives.db.currency, accountType: params.coaManagement.db.account, }); const accountPayableDocumentLineDb = createAccountPayableDocumentLineType({ ...params.accountPayableDocumentLine, purchaseOrderLineType: params.purchase.db.purchaseOrderLine, unitType: params.primitives.db.unit, }); const accountPayableDistributionLineDb = createAccountPayableDistributionLineType({ ...params.accountPayableDistributionLine, accountType: params.coaManagement.db.account, }); const accountPayableDueScheduleLineDb = createAccountPayableDueScheduleLineType({ ...params.accountPayableDueScheduleLine, }); const accountPayableDocumentHoldDb = createAccountPayableDocumentHoldType({ ...params.accountPayableDocumentHold, }); const invoiceToleranceConfigDb = createInvoiceToleranceConfigType({ ...params.invoiceToleranceConfig, companyType: params.organization.db.company, supplierAccountType: params.businessPartner.db.supplierAccount, }); const outgoingPaymentDb = createOutgoingPaymentType({ ...params.outgoingPayment, companyType: params.organization.db.company, supplierAccountType: params.businessPartner.db.supplierAccount, currencyType: params.primitives.db.currency, accountType: params.coaManagement.db.account, }); const accountPayableSettlementDb = createAccountPayableSettlementType({ ...params.accountPayableSettlement, }); return { db: { accountPayableDocument: accountPayableDocumentDb, accountPayableDocumentLine: accountPayableDocumentLineDb, accountPayableDistributionLine: accountPayableDistributionLineDb, accountPayableDueScheduleLine: accountPayableDueScheduleLineDb, accountPayableDocumentHold: accountPayableDocumentHoldDb, invoiceToleranceConfig: invoiceToleranceConfigDb, outgoingPayment: outgoingPaymentDb, accountPayableSettlement: accountPayableSettlementDb, }, commands: { cancelAccountPayableDocument: cancelAccountPayableDocument( params.purchase.commands, params.purchase.queries, params.inventory.commands, ), cancelOutgoingPayment: cancelOutgoingPayment(), correctAccountPayableDocument: correctAccountPayableDocument( params.organization.queries, params.businessPartner.queries, params.primitives.queries, params.coaManagement.queries, params.financialAccounting.commands, params.financialAccounting.queries, params.purchase.commands, params.purchase.queries, params.inventory.queries, params.inventory.commands, ), createAccountPayableDocument: createAccountPayableDocument< TailorDBInsertable, TailorDBInsertable >( params.organization.queries, params.businessPartner.queries, params.primitives.queries, params.coaManagement.queries, params.purchase.queries, params.inventory.queries, ), createInvoiceToleranceConfig: createInvoiceToleranceConfig( params.organization.queries, params.businessPartner.queries, ), createOutgoingPayment: createOutgoingPayment< TailorDBInsertable, TailorDBInsertable >( params.organization.queries, params.businessPartner.queries, params.primitives.queries, params.coaManagement.queries, ), postAccountPayableDocument: postAccountPayableDocument( params.organization.queries, params.financialAccounting.commands, params.financialAccounting.queries, params.coaManagement.queries, params.purchase.queries, params.inventory.commands, ), postOutgoingPayment: postOutgoingPayment( params.organization.queries, params.businessPartner.queries, params.primitives.queries, params.coaManagement.queries, params.financialAccounting.commands, params.financialAccounting.queries, ), registerAccountPayableDocument: registerAccountPayableDocument( params.purchase.queries, params.purchase.commands, params.inventory.queries, ), releaseAccountPayableDocumentHold: releaseAccountPayableDocumentHold(), reverseOutgoingPayment: reverseOutgoingPayment( params.financialAccounting.commands, params.financialAccounting.queries, ), updateAccountPayableDocument: updateAccountPayableDocument< TailorDBInsertable, TailorDBInsertable >( params.primitives.queries, params.coaManagement.queries, params.purchase.queries, params.inventory.queries, params.businessPartner.queries, ), updateInvoiceToleranceConfig: updateInvoiceToleranceConfig(), updateOutgoingPayment: updateOutgoingPayment< TailorDBInsertable, TailorDBInsertable >(params.coaManagement.queries), }, queries: { getOutgoingPayment }, }; }; /** EmptyFields-instantiated alias — use instead of `ReturnType`, which widens field generics to their constraint. */ export type AccountPayableModule = ReturnType< typeof defineModule >;