import * as z from "zod"; import { LOAType } from "../types/loa"; export const loaTypeSchema = z.object({ id: z.number(), name: z.string(), max_length_days: z.number(), }); export const loaSchema = z.object({ member_id: z.number(), start_date: z.date(), end_date: z.date(), type: loaTypeSchema, reason: z.string(), }) .superRefine((data, ctx) => { const { start_date, end_date, type } = data; const today = new Date(); today.setHours(0, 0, 0, 0); if (start_date < today) { ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["start_date"], message: "Start date cannot be in the past.", }); } // 1. end > start if (end_date <= start_date) { ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["end_date"], message: "End date must be after start date.", }); } // 2. calculate max const maxEnd = new Date(start_date); maxEnd.setDate(maxEnd.getDate() + type.max_length_days); if (end_date > maxEnd) { ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["end_date"], message: `This LOA type allows a maximum of ${type.max_length_days} days.`, }); } });