52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
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.`,
|
|
});
|
|
}
|
|
});
|