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 { customerAccountLifecycle } from "./customerAccount.lifecycle.generated"; const builtins = (params: { companyType?: TailorAnyDBType; currencyType?: TailorAnyDBType }) => { const companyId = db.uuid().description("Foreign key to Company"); const preferredCurrencyId = db .uuid({ optional: true }) .description("Optional preferred transaction currency"); return { partnerId: db .uuid() .relation({ type: "n-1", toward: { type: businessPartner, as: "partner" }, backward: "customerAccounts", }) .description("Foreign key to BusinessPartner"), companyId: params.companyType ? companyId.relation({ type: "n-1", toward: { type: params.companyType, as: "company" }, backward: "customerAccounts", }) : companyId, code: db.string().description("Customer account code unique within the company"), name: db.string().description("Customer account display name"), preferredCurrencyId: params.currencyType ? preferredCurrencyId.relation({ type: "n-1", toward: { type: params.currencyType, as: "preferredCurrency" }, backward: "preferredCustomerAccounts", }) : preferredCurrencyId, status: db.enum(customerAccountLifecycle.states).description("Lifecycle status"), }; }; type ReservedFields = keyof ReturnType | CommonReservedFields; export interface CreateCustomerAccountTypeParams> { fields?: NoReservedFields; companyType?: TailorAnyDBType; currencyType?: TailorAnyDBType; } export function createCustomerAccountType>( params: CreateCustomerAccountTypeParams, ) { return db .table("CustomerAccount", { ...builtins(params), ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .indexes({ fields: ["companyId", "code"], unique: true, name: "customer_account_company_code_unique_idx", }) .permission({ ...defaultPermission, delete: [] }) .gqlPermission(defaultGqlPermission); } export const customerAccount = createCustomerAccountType({});