import { type CommonReservedFields, type NoReservedFields, defaultGqlPermission, defaultPermission, } from "@tailor-platform/erp-kit/core"; import { db, type TailorAnyDBField } from "@tailor-platform/sdk"; import { leaveGrant } from "./leaveGrant"; import { leaveRequest } from "./leaveRequest"; // ADR-005/ADR-013: audit-preserving ledger line linking one LeaveRequest to the exact LeaveGrant // it drew days from. Rows are never deleted or overwritten; restoration only stamps restoredAt. const builtins = { // Intra-module FK: same-module type, imported directly (no injection needed) leaveRequestId: db .uuid() .relation({ type: "n-1", toward: { type: leaveRequest, as: "leaveRequest" }, backward: "consumptions", }) .description("Foreign key to the LeaveRequest this allocation was made for"), // Intra-module FK: same-module type, imported directly (no injection needed) leaveGrantId: db .uuid() .relation({ type: "n-1", toward: { type: leaveGrant, as: "leaveGrant" }, backward: "consumptions", }) .description("Foreign key to the LeaveGrant the days were drawn from and restored to"), daysConsumed: db .decimal() .description( "Allocation amount drawn from the grant for this request; positive, never exceeds the amount allocated at creation, and never changes after insert", ), restoredAt: db .datetime({ optional: true }) .description( "Timestamp the reservation was restored (reject, withdraw, or approved cancellation); null until restored, set exactly once", ), }; type ReservedFields = keyof typeof builtins | CommonReservedFields; export interface CreateLeaveConsumptionTypeParams> { fields?: NoReservedFields; } export function createLeaveConsumptionType>( params: CreateLeaveConsumptionTypeParams, ) { return db .table("LeaveConsumption", { ...builtins, ...((params.fields ?? {}) as F), ...db.fields.timestamps(), }) .permission(defaultPermission) .gqlPermission(defaultGqlPermission); } export const leaveConsumption = createLeaveConsumptionType({});