overhauled form system to new modern form
This commit is contained in:
51
shared/schemas/loaSchema.ts
Normal file
51
shared/schemas/loaSchema.ts
Normal file
@@ -0,0 +1,51 @@
|
||||
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.`,
|
||||
});
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user