import { z } from 'zod'; // ── Holiday Schemas ── export const createHolidaySchema = z.object({ holidayDate: z.string().min(1, 'Holiday date is required'), holidayName: z.string().min(1, 'Holiday name is required').max(255, 'Holiday name too long'), description: z.string().max(1000, 'Description too long').optional(), holidayType: z.enum(['NATIONAL', 'REGIONAL', 'ORGANIZATIONAL', 'OPTIONAL']).optional(), isRecurring: z.boolean().optional(), }); export const updateHolidaySchema = createHolidaySchema.partial(); export const holidayParamsSchema = z.object({ holidayId: z.string().uuid('Invalid holiday ID'), }); export const calendarParamsSchema = z.object({ year: z.string().regex(/^\d{4}$/, 'Year must be a 4-digit number'), }); // ── Configuration Schemas ── export const configKeyParamsSchema = z.object({ configKey: z.string().min(1, 'Config key is required').max(100, 'Config key too long'), }); export const updateConfigSchema = z.object({ configValue: z.union([z.string(), z.number(), z.boolean(), z.record(z.any())]), }); // ── User Role Management Schemas ── export const assignRoleSchema = z.object({ email: z.string().email('Valid email is required'), role: z.enum(['USER', 'MANAGEMENT', 'ADMIN'], { errorMap: () => ({ message: 'Role must be USER, MANAGEMENT, or ADMIN' }), }), }); export const updateRoleSchema = z.object({ role: z.enum(['USER', 'MANAGEMENT', 'ADMIN'], { errorMap: () => ({ message: 'Role must be USER, MANAGEMENT, or ADMIN' }), }), }); export const userIdParamsSchema = z.object({ userId: z.string().uuid('Invalid user ID'), }); // ── Activity Type Schemas ── export const createActivityTypeSchema = z.object({ title: z.string().min(1, 'Title is required').max(255, 'Title too long'), itemCode: z.string().max(50, 'Item code too long').optional(), taxationType: z.enum(['GST', 'Non GST'], { errorMap: () => ({ message: 'Taxation type must be GST or Non GST' }), }), sapRefNo: z.string().min(1, 'SAP ref number (Claim Document Type) is required').max(50, 'SAP ref number too long'), creditPostingOn: z.enum(['Spares', 'Vehicle', 'GMA', 'Apparel'], { errorMap: () => ({ message: 'Credit posting on must be Spares, Vehicle, GMA or Apparel' }), }), }); export const updateActivityTypeSchema = createActivityTypeSchema.partial(); export const activityTypeParamsSchema = z.object({ activityTypeId: z.string().uuid('Invalid activity type ID'), }); // ── Form 16 Configuration Schemas ── const notificationItemSchema = z.object({ enabled: z.boolean(), template: z.string().optional(), }); const notification26AsSchema = z.object({ enabled: z.boolean(), templateRe: z.string().optional(), templateDealers: z.string().optional(), }); export const updateForm16ConfigSchema = z.object({ submissionViewerEmails: z.array(z.string().email()).optional(), twentySixAsViewerEmails: z.array(z.string().email()).optional(), reminderEnabled: z.boolean().optional(), reminderDays: z.number().int().min(0).optional(), notification26AsDataAdded: notification26AsSchema.optional(), notificationForm16SuccessCreditNote: notificationItemSchema.optional(), notificationForm16Unsuccessful: notificationItemSchema.optional(), alertSubmitForm16Enabled: z.boolean().optional(), alertSubmitForm16FrequencyDays: z.number().int().min(0).optional(), alertSubmitForm16FrequencyHours: z.number().int().min(0).optional(), alertSubmitForm16RunAtTime: z.string().regex(/^(\d{1,2}:\d{2})?$/, 'Time must be in HH:mm format').optional(), alertSubmitForm16Template: z.string().optional(), reminderNotificationEnabled: z.boolean().optional(), reminderFrequencyDays: z.number().int().min(0).optional(), reminderFrequencyHours: z.number().int().min(0).optional(), reminderRunAtTime: z.string().regex(/^(\d{1,2}:\d{2})?$/, 'Time must be in HH:mm format').optional(), reminderNotificationTemplate: z.string().optional(), });