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.number()).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.number().optional().default(0), minutes: z.number().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; export type AttendanceUpdateAddressInput = z.infer; export type AttendanceSwitchProjectInput = z.infer; export type AttendanceBalancesInput = z.infer; export type AttendanceBulkInput = z.infer; export type AttendanceLeaveInput = z.infer; export type AttendancePunchInput = z.infer; export type CreateAttendanceInput = z.infer; export type UpdateAttendanceInput = z.infer;