import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField } from "@tailor-platform/sdk"; import { partnerBankAccount } from "./partnerBankAccount"; import { supplierAccount } from "./supplierAccount"; export const SUPPLIER_BANK_ACCOUNT_PURPOSES = ["PAYMENT", "REFUND"] as const; const builtins = { accountId: db .uuid() .relation({ type: "n-1", toward: { type: supplierAccount, as: "account" }, backward: "bankAccountUsages", }) .description("Foreign key to SupplierAccount"), bankAccountId: db .uuid() .relation({ type: "n-1", toward: { type: partnerBankAccount, as: "bankAccount" }, backward: "supplierBankAccountUsages", }) .description("Foreign key to reusable PartnerBankAccount"), purpose: db .enum(SUPPLIER_BANK_ACCOUNT_PURPOSES) .description("Supplier bank account purpose: PAYMENT or REFUND"), isDefault: db .bool() .description("Whether this is the default bank account for the account purpose"), }; type ReservedFields = keyof typeof builtins | CommonReservedFields; export interface CreateSupplierBankAccountUsageTypeParams< F extends Record, > { fields?: NoReservedFields; } export function createSupplierBankAccountUsageType< const F extends Record, >(params: CreateSupplierBankAccountUsageTypeParams) { return db .table("SupplierBankAccountUsage", { ...builtins, ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .indexes({ fields: ["accountId", "bankAccountId", "purpose"], unique: true, name: "supplier_bank_account_usage_unique_idx", }) .permission(defaultPermission) .gqlPermission(defaultGqlPermission); } export const supplierBankAccountUsage = createSupplierBankAccountUsageType({});