import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField, type TailorAnyDBType } from "@tailor-platform/sdk"; import { storageLocationLifecycle } from "./storageLocation.lifecycle.generated"; const builtins = (params: { siteType?: TailorAnyDBType }) => { const siteId = db.uuid().description("Foreign key to Site"); return { name: db.string().description("Location display name, unique within site"), code: db.string({ optional: true }).description("Location code, unique within site"), siteId: params.siteType ? siteId.relation({ type: "n-1", toward: { type: params.siteType, as: "site" }, backward: "storageLocations", }) : siteId, storageCondition: db .string({ optional: true }) .description("Storage condition: ambient, cold, hazardous"), capacity: db.decimal({ optional: true }).description("Optional storage capacity"), status: db.enum(storageLocationLifecycle.states).description("Lifecycle status"), }; }; type ReservedFields = keyof ReturnType | CommonReservedFields; export interface CreateStorageLocationTypeParams> { fields?: NoReservedFields; siteType?: TailorAnyDBType; } export function createStorageLocationType>( params: CreateStorageLocationTypeParams, ) { return db .table("StorageLocation", { ...builtins(params), ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .permission(defaultPermission) .gqlPermission(defaultGqlPermission); } export const storageLocation = createStorageLocationType({});