import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField } from "@tailor-platform/sdk"; import { customerAccount } from "./customerAccount"; import { partnerAddress } from "./partnerAddress"; export const CUSTOMER_ADDRESS_PURPOSES = ["BILL_TO", "SHIP_TO"] as const; const builtins = { accountId: db .uuid() .relation({ type: "n-1", toward: { type: customerAccount, as: "account" }, backward: "addressUsages", }) .description("Foreign key to CustomerAccount"), addressId: db .uuid() .relation({ type: "n-1", toward: { type: partnerAddress, as: "address" }, backward: "customerAddressUsages", }) .description("Foreign key to reusable PartnerAddress"), purpose: db .enum(CUSTOMER_ADDRESS_PURPOSES) .description("Customer address purpose: BILL_TO or SHIP_TO"), isDefault: db.bool().description("Whether this is the default address for the account purpose"), }; type ReservedFields = keyof typeof builtins | CommonReservedFields; export interface CreateCustomerAddressUsageTypeParams> { fields?: NoReservedFields; } export function createCustomerAddressUsageType>( params: CreateCustomerAddressUsageTypeParams, ) { return db .table("CustomerAddressUsage", { ...builtins, ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .indexes({ fields: ["accountId", "addressId", "purpose"], unique: true, name: "customer_address_usage_unique_idx", }) .permission(defaultPermission) .gqlPermission(defaultGqlPermission); } export const customerAddressUsage = createCustomerAddressUsageType({});