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 { OrganizationModule } from "../organization"; import type { PrimitivesModule } from "../primitives"; import type { SalesModule } from "../sales"; import { cancelAccountReceivableDocument } from "./command/cancelAccountReceivableDocument.generated"; import { cancelIncomingPayment } from "./command/cancelIncomingPayment.generated"; import { correctAccountReceivableDocument } from "./command/correctAccountReceivableDocument.generated"; import { createAccountReceivableDocument } from "./command/createAccountReceivableDocument.generated"; import { createIncomingPayment } from "./command/createIncomingPayment.generated"; import { postAccountReceivableDocument } from "./command/postAccountReceivableDocument.generated"; import { postIncomingPayment } from "./command/postIncomingPayment.generated"; import { registerAccountReceivableDocument } from "./command/registerAccountReceivableDocument.generated"; import { reverseIncomingPayment } from "./command/reverseIncomingPayment.generated"; import { updateIncomingPayment } from "./command/updateIncomingPayment.generated"; import { createAccountReceivableDistributionLineType, type CreateAccountReceivableDistributionLineTypeParams, } from "./db/accountReceivableDistributionLine"; import { createAccountReceivableDocumentType, type CreateAccountReceivableDocumentTypeParams, } from "./db/accountReceivableDocument"; import { createAccountReceivableDocumentLineType, type CreateAccountReceivableDocumentLineTypeParams, } from "./db/accountReceivableDocumentLine"; import { createAccountReceivableDueScheduleLineType, type CreateAccountReceivableDueScheduleLineTypeParams, } from "./db/accountReceivableDueScheduleLine"; import { createAccountReceivableSettlementType, type CreateAccountReceivableSettlementTypeParams, } from "./db/accountReceivableSettlement"; import { createIncomingPaymentType, type CreateIncomingPaymentTypeParams, } from "./db/incomingPayment"; import { getIncomingPayment } from "./query/getIncomingPayment.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 SalesDB = SalesModule["db"]; export type SalesCommands = SalesModule["commands"]; export interface DefineModuleParams< ArdF extends Record = EmptyFields, ArdlF extends Record = EmptyFields, ArdistF extends Record = EmptyFields, ArdslF extends Record = EmptyFields, IpF extends Record = EmptyFields, ArsF extends Record = EmptyFields, > { accountReceivableDocument?: CreateAccountReceivableDocumentTypeParams; accountReceivableDocumentLine?: CreateAccountReceivableDocumentLineTypeParams; accountReceivableDistributionLine?: CreateAccountReceivableDistributionLineTypeParams; accountReceivableDueScheduleLine?: CreateAccountReceivableDueScheduleLineTypeParams; incomingPayment?: CreateIncomingPaymentTypeParams; accountReceivableSettlement?: CreateAccountReceivableSettlementTypeParams; organization: { db: { company: OrganizationDB["company"] }; queries: Pick; }; businessPartner: { db: { customerAccount: BusinessPartnerDB["customerAccount"] }; queries: Pick; }; primitives: { db: { currency: PrimitivesDB["currency"]; unit: PrimitivesDB["unit"] }; queries: Pick; }; coaManagement: { db: { account: CoaManagementDB["account"] }; queries: Pick; }; financialAccounting: { commands: Pick; queries: Pick; }; sales: { db: { salesOrderLine: SalesDB["salesOrderLine"] }; commands: Pick; }; } /* @__NO_SIDE_EFFECTS__ */ export const defineModule = < const ArdF extends Record = EmptyFields, const ArdlF extends Record = EmptyFields, const ArdistF extends Record = EmptyFields, const ArdslF extends Record = EmptyFields, const IpF extends Record = EmptyFields, const ArsF extends Record = EmptyFields, >( params: DefineModuleParams, ) => { const accountReceivableDocument = createAccountReceivableDocumentType({ ...params.accountReceivableDocument, companyType: params.organization.db.company, customerAccountType: params.businessPartner.db.customerAccount, currencyType: params.primitives.db.currency, accountType: params.coaManagement.db.account, }); const accountReceivableDocumentLine = createAccountReceivableDocumentLineType({ ...params.accountReceivableDocumentLine, salesOrderLineType: params.sales.db.salesOrderLine, unitType: params.primitives.db.unit, }); const accountReceivableDistributionLine = createAccountReceivableDistributionLineType({ ...params.accountReceivableDistributionLine, accountType: params.coaManagement.db.account, }); const accountReceivableDueScheduleLine = createAccountReceivableDueScheduleLineType({ ...params.accountReceivableDueScheduleLine, }); const incomingPayment = createIncomingPaymentType({ ...params.incomingPayment, companyType: params.organization.db.company, customerAccountType: params.businessPartner.db.customerAccount, currencyType: params.primitives.db.currency, accountType: params.coaManagement.db.account, }); const accountReceivableSettlement = createAccountReceivableSettlementType({ ...params.accountReceivableSettlement, }); return { db: { accountReceivableDocument, accountReceivableDocumentLine, accountReceivableDistributionLine, accountReceivableDueScheduleLine, incomingPayment, accountReceivableSettlement, }, commands: { correctAccountReceivableDocument: correctAccountReceivableDocument< TailorDBInsertable, TailorDBInsertable >( params.organization.queries, params.businessPartner.queries, params.primitives.queries, params.coaManagement.queries, params.financialAccounting.commands, params.financialAccounting.queries, params.sales.commands, ), createAccountReceivableDocument: createAccountReceivableDocument< TailorDBInsertable, TailorDBInsertable >( params.organization.queries, params.businessPartner.queries, params.primitives.queries, params.coaManagement.queries, ), postAccountReceivableDocument: postAccountReceivableDocument( params.organization.queries, params.coaManagement.queries, params.financialAccounting.commands, params.financialAccounting.queries, ), registerAccountReceivableDocument: registerAccountReceivableDocument(params.sales.commands), cancelAccountReceivableDocument: cancelAccountReceivableDocument(params.sales.commands), cancelIncomingPayment: cancelIncomingPayment(), createIncomingPayment: createIncomingPayment< TailorDBInsertable, TailorDBInsertable >( params.organization.queries, params.businessPartner.queries, params.primitives.queries, params.coaManagement.queries, ), postIncomingPayment: postIncomingPayment( params.organization.queries, params.businessPartner.queries, params.primitives.queries, params.coaManagement.queries, params.financialAccounting.commands, params.financialAccounting.queries, ), reverseIncomingPayment: reverseIncomingPayment( params.financialAccounting.commands, params.financialAccounting.queries, ), updateIncomingPayment: updateIncomingPayment< TailorDBInsertable, TailorDBInsertable >(params.coaManagement.queries), }, queries: { getIncomingPayment }, }; }; export type AccountReceivableModule = ReturnType< typeof defineModule >;