import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField } from "@tailor-platform/sdk"; import { accountPayableDueScheduleLine } from "./accountPayableDueScheduleLine"; import { outgoingPayment } from "./outgoingPayment"; export const ACCOUNT_PAYABLE_SETTLEMENT_SOURCE_TYPES = ["OUTGOING_PAYMENT"] as const; const builtins = { sourceType: db .enum(ACCOUNT_PAYABLE_SETTLEMENT_SOURCE_TYPES) .description("Settlement source discriminator"), outgoingPaymentId: db .uuid() .relation({ type: "n-1", toward: { type: outgoingPayment, as: "outgoingPayment" }, backward: "settlements", }) .description("Source FK when sourceType is OUTGOING_PAYMENT"), accountPayableDueScheduleLineId: db .uuid() .relation({ type: "n-1", toward: { type: accountPayableDueScheduleLine, as: "accountPayableDueScheduleLine" }, backward: "accountPayableSettlements", }) .description("Foreign key to the settled AccountPayableDueScheduleLine"), settledAmount: db.decimal().description("Positive amount allocated to the due schedule line"), reversalOfSettlementId: db .uuid({ optional: true }) .relation({ type: "1-1", toward: { type: "self" }, backward: "reversals", }) .description("Optional self-reference to the original settlement being reversed"), }; type ReservedFields = keyof typeof builtins | CommonReservedFields; export interface CreateAccountPayableSettlementTypeParams< F extends Record, > { fields?: NoReservedFields; } export function createAccountPayableSettlementType< const F extends Record, >(params: CreateAccountPayableSettlementTypeParams) { return db .table("AccountPayableSettlement", { ...builtins, ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .indexes({ fields: ["sourceType", "outgoingPaymentId", "accountPayableDueScheduleLineId"], unique: false, name: "account_payable_settlement_outgoing_payment_due_schedule_idx", }) .permission(defaultPermission) .gqlPermission(defaultGqlPermission); } export const accountPayableSettlement = createAccountPayableSettlementType({});