import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField, type TailorAnyDBType } from "@tailor-platform/sdk"; import { transferOrder } from "./transferOrder"; const builtins = (params: { itemType?: TailorAnyDBType; unitType?: TailorAnyDBType }) => { const itemId = db.uuid().description("Item being transferred"); const unitId = db .uuid() .description("Business unit for ordered, shipped, and received quantities"); return { transferOrderId: db .uuid() .relation({ type: "n-1", toward: { type: transferOrder, as: "transferOrder" }, backward: "lines", }) .description("Foreign key to TransferOrder header"), itemId: params.itemType ? itemId.relation({ type: "n-1", toward: { type: params.itemType, as: "item" }, backward: "transferOrderLines", }) : itemId, unitId: params.unitType ? unitId.relation({ type: "n-1", toward: { type: params.unitType, as: "unit" }, backward: "transferOrderLines", }) : unitId, orderedQuantity: db.decimal().description("Quantity requested for transfer"), shippedQuantity: db.decimal().description("Cumulative quantity shipped"), receivedQuantity: db.decimal().description("Cumulative quantity received"), }; }; type ReservedFields = keyof ReturnType | CommonReservedFields; export interface CreateTransferOrderLineTypeParams> { fields?: NoReservedFields; itemType?: TailorAnyDBType; unitType?: TailorAnyDBType; } export function createTransferOrderLineType>( params: CreateTransferOrderLineTypeParams, ) { return db .table("TransferOrderLine", { ...builtins(params), ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .permission(defaultPermission) .gqlPermission(defaultGqlPermission); } export const transferOrderLine = createTransferOrderLineType({});