import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField, type TailorAnyDBType } from "@tailor-platform/sdk"; const builtins = (params: { companyType?: TailorAnyDBType; supplierAccountType?: TailorAnyDBType; }) => { const companyId = db.uuid().description("Foreign key to Company"); const supplierAccountId = db.uuid().description("Foreign key to SupplierAccount"); return { companyId: params.companyType ? companyId.relation({ type: "n-1", toward: { type: params.companyType, as: "company" }, backward: "invoiceToleranceConfigs", }) : companyId, supplierAccountId: params.supplierAccountType ? supplierAccountId.relation({ type: "n-1", toward: { type: params.supplierAccountType, as: "supplierAccount" }, backward: "invoiceToleranceConfigs", }) : supplierAccountId, quantityAbsoluteTolerance: db .decimal({ optional: true }) .description("Optional absolute quantity tolerance for AP invoice checks"), quantityPercentageTolerance: db .decimal({ optional: true }) .description("Optional percentage quantity tolerance for AP invoice checks; 0.05 means 5%"), unitPriceAbsoluteTolerance: db .decimal({ optional: true }) .description("Optional absolute unit price tolerance for AP invoice checks"), unitPricePercentageTolerance: db .decimal({ optional: true }) .description("Optional percentage unit price tolerance for AP invoice checks; 0.05 means 5%"), }; }; type ReservedFields = keyof ReturnType | CommonReservedFields; export interface CreateInvoiceToleranceConfigTypeParams< F extends Record, > { fields?: NoReservedFields; companyType?: TailorAnyDBType; supplierAccountType?: TailorAnyDBType; } export function createInvoiceToleranceConfigType>( params: CreateInvoiceToleranceConfigTypeParams, ) { return db .table("InvoiceToleranceConfig", { ...builtins(params), ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .indexes({ fields: ["companyId", "supplierAccountId"], unique: true, name: "invoice_tolerance_company_supplier_unique_idx", }) .permission(defaultPermission) .gqlPermission(defaultGqlPermission); } export const invoiceToleranceConfig = createInvoiceToleranceConfigType({});