import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField, type TailorAnyDBType } from "@tailor-platform/sdk"; import { purchaseOrder } from "./purchaseOrder"; const builtins = (params: { itemType?: TailorAnyDBType; unitType?: TailorAnyDBType; siteType?: TailorAnyDBType; }) => { const itemId = db.uuid().description("Foreign key to Item"); const unitId = db.uuid().description("Unit of measure"); const receivingSiteId = db .uuid({ optional: true }) .description("Optional line-level receiving Site"); return { purchaseOrderId: db .uuid() .relation({ type: "n-1", toward: { type: purchaseOrder, as: "purchaseOrder" }, backward: "lines", }) .description("Foreign key to PurchaseOrder"), itemId: params.itemType ? itemId.relation({ type: "n-1", toward: { type: params.itemType, as: "item" }, backward: "purchaseOrderLines", }) : itemId, itemSnapshotName: db .string({ optional: true }) .description("Snapshotted item display name at order time"), itemSnapshotSku: db .string({ optional: true }) .description("Snapshotted item SKU at order time"), quantity: db.decimal().description("Ordered quantity"), unitPrice: db.decimal().description("Unit price"), unitId: params.unitType ? unitId.relation({ type: "n-1", toward: { type: params.unitType, as: "unit" }, backward: "purchaseOrderLines", }) : unitId, receivingSiteId: params.siteType ? receivingSiteId.relation({ type: "n-1", toward: { type: params.siteType, as: "receivingSite" }, backward: "purchaseOrderLines", }) : receivingSiteId, requiresPhysicalReceipt: db .bool() .description("Whether physical receipt is required for this line"), billedQuantity: db .decimal() .hooks({ create: ({ input }) => input ?? "0" }) .description("Current billed quantity projection from external billing sources"), receivedQuantity: db .decimal() .hooks({ create: ({ input }) => input ?? "0" }) .description("Current received quantity projection from inbound shipments"), }; }; type ReservedFields = keyof ReturnType | CommonReservedFields; export interface CreatePurchaseOrderLineTypeParams> { fields?: NoReservedFields; itemType?: TailorAnyDBType; unitType?: TailorAnyDBType; siteType?: TailorAnyDBType; } export function createPurchaseOrderLineType>( params: CreatePurchaseOrderLineTypeParams, ) { return db .table("PurchaseOrderLine", { ...builtins(params), ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .permission(defaultPermission) .gqlPermission(defaultGqlPermission); } export const purchaseOrderLine = createPurchaseOrderLineType({});