import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField, type TailorAnyDBType } from "@tailor-platform/sdk"; import { businessPartner } from "./businessPartner"; import { supplierAccountLifecycle } from "./supplierAccount.lifecycle.generated"; const builtins = (params: { companyType?: TailorAnyDBType; currencyType?: TailorAnyDBType; accountType?: TailorAnyDBType; }) => { const companyId = db.uuid().description("Foreign key to Company"); const preferredCurrencyId = db .uuid({ optional: true }) .description("Optional preferred transaction currency"); const defaultExpenseAccountId = db .uuid({ optional: true }) .description("Default expense account for non-PO supplier invoices"); return { partnerId: db .uuid() .relation({ type: "n-1", toward: { type: businessPartner, as: "partner" }, backward: "supplierAccounts", }) .description("Foreign key to BusinessPartner"), companyId: params.companyType ? companyId.relation({ type: "n-1", toward: { type: params.companyType, as: "company" }, backward: "supplierAccounts", }) : companyId, code: db.string().description("Supplier account code unique within the company"), name: db.string().description("Supplier account display name"), preferredCurrencyId: params.currencyType ? preferredCurrencyId.relation({ type: "n-1", toward: { type: params.currencyType, as: "preferredCurrency" }, backward: "preferredSupplierAccounts", }) : preferredCurrencyId, defaultExpenseAccountId: params.accountType ? defaultExpenseAccountId.relation({ type: "n-1", toward: { type: params.accountType, as: "defaultExpenseAccount" }, backward: "defaultExpenseSupplierAccounts", }) : defaultExpenseAccountId, status: db.enum(supplierAccountLifecycle.states).description("Lifecycle status"), }; }; type ReservedFields = keyof ReturnType | CommonReservedFields; export interface CreateSupplierAccountTypeParams> { fields?: NoReservedFields; companyType?: TailorAnyDBType; currencyType?: TailorAnyDBType; accountType?: TailorAnyDBType; } export function createSupplierAccountType>( params: CreateSupplierAccountTypeParams, ) { return db .table("SupplierAccount", { ...builtins(params), ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .indexes({ fields: ["companyId", "code"], unique: true, name: "supplier_account_company_code_unique_idx", }) .permission({ ...defaultPermission, delete: [] }) .gqlPermission(defaultGqlPermission); } export const supplierAccount = createSupplierAccountType({});