import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField, type TailorAnyDBType } from "@tailor-platform/sdk"; import { accountReceivableDocumentLine } from "./accountReceivableDocumentLine"; const builtins = (params: { accountType?: TailorAnyDBType }) => { const accountId = db.uuid().description("Foreign key to posting Account"); return { accountReceivableDocumentLineId: db .uuid() .relation({ type: "n-1", toward: { type: accountReceivableDocumentLine, as: "accountReceivableDocumentLine" }, backward: "distributions", }) .description("Foreign key to the commercial AR document line"), correctionOfDistributionLineId: db .uuid({ optional: true }) .relation({ type: "n-1", toward: { type: "self" }, backward: "correctionDistributions", }) .description("Optional self-reference to a corrected AR distribution"), accountId: params.accountType ? accountId.relation({ type: "n-1", toward: { type: params.accountType, as: "account" }, backward: "accountReceivableDistributionLines", }) : accountId, amount: db.decimal().description("Positive distribution amount"), description: db.string({ optional: true }).description("Optional distribution description"), }; }; type ReservedFields = keyof ReturnType | CommonReservedFields; export interface CreateAccountReceivableDistributionLineTypeParams< F extends Record, > { fields?: NoReservedFields; accountType?: TailorAnyDBType; } export function createAccountReceivableDistributionLineType< const F extends Record, >(params: CreateAccountReceivableDistributionLineTypeParams) { return db .table("AccountReceivableDistributionLine", { ...builtins(params), ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .permission(defaultPermission) .gqlPermission(defaultGqlPermission); } export const accountReceivableDistributionLine = createAccountReceivableDistributionLineType({});