- Schema now accepts both string and number user_ids (frontend sends strings) - Bulk fill now skips Czech public holidays in addition to weekends Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
160 lines
5.1 KiB
TypeScript
160 lines
5.1 KiB
TypeScript
import { z } from "zod";
|
|
|
|
export const AttendanceNotesSchema = z.object({
|
|
notes: z.string().nullish(),
|
|
});
|
|
|
|
export const AttendanceUpdateAddressSchema = z.object({
|
|
address: z.string().max(500).nullish(),
|
|
punch_action: z.string().optional().default("arrival"),
|
|
});
|
|
|
|
export const AttendanceSwitchProjectSchema = z.object({
|
|
project_id: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.nullish(),
|
|
});
|
|
|
|
export const AttendanceBalancesSchema = z.object({
|
|
user_id: z.union([z.number(), z.string()]).transform((v) => Number(v)),
|
|
year: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.optional(),
|
|
action_type: z.string(),
|
|
vacation_total: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.optional(),
|
|
vacation_used: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.optional(),
|
|
sick_used: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.optional(),
|
|
});
|
|
|
|
export const AttendanceBulkSchema = z.object({
|
|
month: z.string().regex(/^\d{4}-\d{2}$/, "Měsíc je povinný (formát YYYY-MM)"),
|
|
user_ids: z
|
|
.array(z.union([z.number(), z.string()]).transform((v) => Number(v)))
|
|
.min(1, "Vyberte alespoň jednoho zaměstnance"),
|
|
arrival_time: z.string().optional().default("08:00"),
|
|
departure_time: z.string().optional().default("16:30"),
|
|
break_start_time: z.string().optional().default("12:00"),
|
|
break_end_time: z.string().optional().default("12:30"),
|
|
});
|
|
|
|
export const AttendanceLeaveSchema = z.object({
|
|
user_id: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.optional(),
|
|
date_from: z.string().min(1, "Datum je povinné"),
|
|
date_to: z.string().optional(),
|
|
leave_type: z.string().optional().default("vacation"),
|
|
leave_hours: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.optional(),
|
|
notes: z.string().nullish(),
|
|
});
|
|
|
|
const ProjectLogSchema = z.object({
|
|
project_id: z.union([z.number(), z.string()]).transform((v) => Number(v)),
|
|
hours: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v) || 0)
|
|
.optional()
|
|
.default(0),
|
|
minutes: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v) || 0)
|
|
.optional()
|
|
.default(0),
|
|
});
|
|
|
|
export const AttendancePunchSchema = z.object({
|
|
punch_action: z.string(),
|
|
latitude: z.union([z.number(), z.string(), z.null()]).optional(),
|
|
longitude: z.union([z.number(), z.string(), z.null()]).optional(),
|
|
accuracy: z.union([z.number(), z.string(), z.null()]).optional(),
|
|
address: z.string().max(500).nullish(),
|
|
});
|
|
|
|
export const CreateAttendanceSchema = z.object({
|
|
user_id: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.optional(),
|
|
shift_date: z.string(),
|
|
arrival_time: z.string().nullish(),
|
|
arrival_lat: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.nullish(),
|
|
arrival_lng: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.nullish(),
|
|
arrival_accuracy: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.nullish(),
|
|
arrival_address: z.string().nullish(),
|
|
departure_time: z.string().nullish(),
|
|
departure_lat: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.nullish(),
|
|
departure_lng: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.nullish(),
|
|
departure_accuracy: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.nullish(),
|
|
departure_address: z.string().nullish(),
|
|
notes: z.string().nullish(),
|
|
project_id: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.nullish(),
|
|
leave_type: z.string().optional().default("work"),
|
|
leave_hours: z
|
|
.union([z.number(), z.string()])
|
|
.transform((v) => Number(v))
|
|
.nullish(),
|
|
project_logs: z.array(ProjectLogSchema).optional(),
|
|
});
|
|
|
|
export const UpdateAttendanceSchema = z.object({
|
|
arrival_time: z.union([z.string(), z.null()]).optional(),
|
|
departure_time: z.union([z.string(), z.null()]).optional(),
|
|
break_start: z.union([z.string(), z.null()]).optional(),
|
|
break_end: z.union([z.string(), z.null()]).optional(),
|
|
notes: z.string().nullish(),
|
|
project_id: z.union([z.number(), z.string(), z.null()]).optional(),
|
|
leave_type: z.string().optional(),
|
|
leave_hours: z.union([z.number(), z.string(), z.null()]).optional(),
|
|
project_logs: z.array(ProjectLogSchema).optional(),
|
|
});
|
|
|
|
export type AttendanceNotesInput = z.infer<typeof AttendanceNotesSchema>;
|
|
export type AttendanceUpdateAddressInput = z.infer<
|
|
typeof AttendanceUpdateAddressSchema
|
|
>;
|
|
export type AttendanceSwitchProjectInput = z.infer<
|
|
typeof AttendanceSwitchProjectSchema
|
|
>;
|
|
export type AttendanceBalancesInput = z.infer<typeof AttendanceBalancesSchema>;
|
|
export type AttendanceBulkInput = z.infer<typeof AttendanceBulkSchema>;
|
|
export type AttendanceLeaveInput = z.infer<typeof AttendanceLeaveSchema>;
|
|
export type AttendancePunchInput = z.infer<typeof AttendancePunchSchema>;
|
|
export type CreateAttendanceInput = z.infer<typeof CreateAttendanceSchema>;
|
|
export type UpdateAttendanceInput = z.infer<typeof UpdateAttendanceSchema>;
|