import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField } from "@tailor-platform/sdk"; import { partnerAddress } from "./partnerAddress"; import { supplierAccount } from "./supplierAccount"; export const SUPPLIER_ADDRESS_PURPOSES = [ "ORDER_FROM", "REMIT_TO", "SHIP_FROM", "RETURN_TO", ] as const; const builtins = { accountId: db .uuid() .relation({ type: "n-1", toward: { type: supplierAccount, as: "account" }, backward: "addressUsages", }) .description("Foreign key to SupplierAccount"), addressId: db .uuid() .relation({ type: "n-1", toward: { type: partnerAddress, as: "address" }, backward: "supplierAddressUsages", }) .description("Foreign key to reusable PartnerAddress"), purpose: db .enum(SUPPLIER_ADDRESS_PURPOSES) .description("Supplier address purpose: ORDER_FROM, REMIT_TO, SHIP_FROM, or RETURN_TO"), isDefault: db.bool().description("Whether this is the default address for the account purpose"), }; type ReservedFields = keyof typeof builtins | CommonReservedFields; export interface CreateSupplierAddressUsageTypeParams> { fields?: NoReservedFields; } export function createSupplierAddressUsageType>( params: CreateSupplierAddressUsageTypeParams, ) { return db .table("SupplierAddressUsage", { ...builtins, ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .indexes({ fields: ["accountId", "addressId", "purpose"], unique: true, name: "supplier_address_usage_unique_idx", }) .permission(defaultPermission) .gqlPermission(defaultGqlPermission); } export const supplierAddressUsage = createSupplierAddressUsageType({});