/**
 * Generated by orval v8.23.0 🍺
 * Do not edit manually.
 * Api
 * API operativa de Y.E. Transport & Constructors
 * OpenAPI spec version: 1.0.0
 */
import * as zod from 'zod';


/**
 * Returns server health status
 * @summary Health check
 */
export const HealthCheckResponse = zod.object({
  "status": zod.string()
})


/**
 * @summary Obtiene el resumen público de la compañía
 */
export const GetPublicOverviewResponse = zod.object({
  "companyName": zod.string(),
  "tagline": zod.string(),
  "location": zod.string(),
  "serviceAreas": zod.array(zod.string()),
  "fleetCount": zod.int(),
  "activeProjects": zod.int(),
  "featuredImage": zod.string().nullish()
})


/**
 * @summary Devuelve los reemplazos de texto público
 */
export const GetPublicContentResponse = zod.record(zod.string(), zod.string())


/**
 * @summary Lista trabajos, servicios, equipo, materiales y herramientas publicados
 */
export const ListPublicShowcaseResponseItem = zod.object({
  "id": zod.uuid(),
  "kind": zod.enum(['showcase', 'post', 'legal']),
  "slug": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['published', 'draft', 'archived']),
  "titleEs": zod.string(),
  "titleEn": zod.string(),
  "summaryEs": zod.string(),
  "summaryEn": zod.string(),
  "bodyEs": zod.string(),
  "bodyEn": zod.string(),
  "imageUrl": zod.string().nullish(),
  "imageAltEs": zod.string(),
  "imageAltEn": zod.string(),
  "gallery": zod.array(zod.object({
  "url": zod.string(),
  "altEs": zod.string(),
  "altEn": zod.string()
})),
  "seoTitleEs": zod.string(),
  "seoTitleEn": zod.string(),
  "seoDescriptionEs": zod.string(),
  "seoDescriptionEn": zod.string(),
  "published": zod.boolean(),
  "featured": zod.boolean(),
  "sortOrder": zod.int(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListPublicShowcaseResponse = zod.array(ListPublicShowcaseResponseItem)


/**
 * @summary Lista artículos SEO publicados
 */
export const ListPublicPostsResponseItem = zod.object({
  "id": zod.uuid(),
  "kind": zod.enum(['showcase', 'post', 'legal']),
  "slug": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['published', 'draft', 'archived']),
  "titleEs": zod.string(),
  "titleEn": zod.string(),
  "summaryEs": zod.string(),
  "summaryEn": zod.string(),
  "bodyEs": zod.string(),
  "bodyEn": zod.string(),
  "imageUrl": zod.string().nullish(),
  "imageAltEs": zod.string(),
  "imageAltEn": zod.string(),
  "gallery": zod.array(zod.object({
  "url": zod.string(),
  "altEs": zod.string(),
  "altEn": zod.string()
})),
  "seoTitleEs": zod.string(),
  "seoTitleEn": zod.string(),
  "seoDescriptionEs": zod.string(),
  "seoDescriptionEn": zod.string(),
  "published": zod.boolean(),
  "featured": zod.boolean(),
  "sortOrder": zod.int(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListPublicPostsResponse = zod.array(ListPublicPostsResponseItem)


/**
 * @summary Lista páginas legales públicas
 */
export const ListPublicLegalResponseItem = zod.object({
  "id": zod.uuid(),
  "kind": zod.enum(['showcase', 'post', 'legal']),
  "slug": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['published', 'draft', 'archived']),
  "titleEs": zod.string(),
  "titleEn": zod.string(),
  "summaryEs": zod.string(),
  "summaryEn": zod.string(),
  "bodyEs": zod.string(),
  "bodyEn": zod.string(),
  "imageUrl": zod.string().nullish(),
  "imageAltEs": zod.string(),
  "imageAltEn": zod.string(),
  "gallery": zod.array(zod.object({
  "url": zod.string(),
  "altEs": zod.string(),
  "altEn": zod.string()
})),
  "seoTitleEs": zod.string(),
  "seoTitleEn": zod.string(),
  "seoDescriptionEs": zod.string(),
  "seoDescriptionEn": zod.string(),
  "published": zod.boolean(),
  "featured": zod.boolean(),
  "sortOrder": zod.int(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListPublicLegalResponse = zod.array(ListPublicLegalResponseItem)


/**
 * @summary Obtiene una publicación pública por tipo y slug
 */
export const GetPublicEntryParams = zod.object({
  "kind": zod.enum(['showcase', 'post', 'legal']),
  "slug": zod.coerce.string()
})

export const GetPublicEntryResponse = zod.object({
  "id": zod.uuid(),
  "kind": zod.enum(['showcase', 'post', 'legal']),
  "slug": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['published', 'draft', 'archived']),
  "titleEs": zod.string(),
  "titleEn": zod.string(),
  "summaryEs": zod.string(),
  "summaryEn": zod.string(),
  "bodyEs": zod.string(),
  "bodyEn": zod.string(),
  "imageUrl": zod.string().nullish(),
  "imageAltEs": zod.string(),
  "imageAltEn": zod.string(),
  "gallery": zod.array(zod.object({
  "url": zod.string(),
  "altEs": zod.string(),
  "altEn": zod.string()
})),
  "seoTitleEs": zod.string(),
  "seoTitleEn": zod.string(),
  "seoDescriptionEs": zod.string(),
  "seoDescriptionEn": zod.string(),
  "published": zod.boolean(),
  "featured": zod.boolean(),
  "sortOrder": zod.int(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Envía una solicitud de cotización
 */
export const createQuoteRequestBodyClientNameMin = 2;

export const createQuoteRequestBodyMessageMin = 10;

export const createQuoteRequestBodyPriorityDefault = `normal`;

export const CreateQuoteRequestBody = zod.object({
  "clientName": zod.string().min(createQuoteRequestBodyClientNameMin),
  "company": zod.string().optional(),
  "email": zod.email(),
  "phone": zod.string().optional(),
  "service": zod.string(),
  "message": zod.string().min(createQuoteRequestBodyMessageMin),
  "priority": zod.enum(['low', 'normal', 'high']).default(createQuoteRequestBodyPriorityDefault),
  "amount": zod.number().optional()
})

export const CreateQuoteRequestResponse = zod.object({
  "id": zod.string(),
  "quoteNumber": zod.string(),
  "clientName": zod.string(),
  "company": zod.string().nullish(),
  "email": zod.email().optional(),
  "phone": zod.string().nullish(),
  "service": zod.string(),
  "message": zod.string().optional(),
  "status": zod.enum(['new', 'reviewing', 'sent', 'approved', 'declined', 'archived']),
  "amount": zod.number().nullish(),
  "priority": zod.enum(['low', 'normal', 'high']),
  "createdAt": zod.coerce.date(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Envía un mensaje de contacto
 */
export const createContactMessageBodyNameMin = 2;

export const createContactMessageBodyMessageMin = 5;



export const CreateContactMessageBody = zod.object({
  "name": zod.string().min(createContactMessageBodyNameMin),
  "email": zod.email(),
  "phone": zod.string().optional(),
  "message": zod.string().min(createContactMessageBodyMessageMin)
})

export const CreateContactMessageResponse = zod.object({
  "id": zod.string(),
  "receivedAt": zod.coerce.date()
})


/**
 * @summary Devuelve el usuario administrativo actual
 */
export const GetCurrentUserResponse = zod.union([zod.object({
  "id": zod.string(),
  "name": zod.string(),
  "email": zod.email(),
  "role": zod.enum(['Web Master', 'super_admin', 'admin', 'hr', 'secretary', 'accounting', 'supervisor', 'employee']),
  "initials": zod.string().optional(),
  "permissions": zod.array(zod.string()).optional()
}),zod.object({
  "id": zod.string(),
  "name": zod.string(),
  "role": zod.enum(['Web Master', 'super_admin', 'admin', 'hr', 'secretary', 'accounting', 'supervisor', 'employee']),
  "initials": zod.string().optional(),
  "permissions": zod.array(zod.string()).optional()
})])


/**
 * @summary Inicia una sesión web o móvil
 */
export const loginBodyPasswordMin = 8;

export const loginBodyClientDefault = `web`;
export const loginBodySecondFactorCodeMax = 128;



export const LoginBody = zod.object({
  "email": zod.email(),
  "password": zod.string().min(loginBodyPasswordMin),
  "client": zod.enum(['web', 'mobile']).default(loginBodyClientDefault),
  "secondFactor": zod.object({
  "challengeId": zod.uuid().optional(),
  "code": zod.string().min(1).max(loginBodySecondFactorCodeMax).optional()
}).optional()
})

export const LoginResponse = zod.union([zod.object({
  "user": zod.object({
  "id": zod.string(),
  "name": zod.string(),
  "email": zod.email(),
  "role": zod.enum(['Web Master', 'super_admin', 'admin', 'hr', 'secretary', 'accounting', 'supervisor', 'employee']),
  "initials": zod.string().optional(),
  "permissions": zod.array(zod.string()).optional()
}),
  "token": zod.string().optional().describe('Opaque bearer token, returned only for mobile clients.'),
  "csrfToken": zod.string().optional().describe('CSRF token for web state-changing requests.')
}),zod.object({
  "requiresSecondFactor": zod.literal(true),
  "method": zod.enum(['daily_code', 'simple_math', 'captcha']),
  "challengeId": zod.uuid(),
  "challenge": zod.string().optional(),
  "expiresAt": zod.coerce.date()
})])


/**
 * El código se muestra una sola vez, se almacena únicamente como hash y expira al finalizar el día UTC.
 * @summary Emite el código diario del usuario administrativo actual
 */
export const issueAdminSecondFactorDailyCodeResponseCodeMin = 6;
export const issueAdminSecondFactorDailyCodeResponseCodeMax = 32;



export const IssueAdminSecondFactorDailyCodeResponse = zod.object({
  "challengeId": zod.uuid(),
  "code": zod.string().min(issueAdminSecondFactorDailyCodeResponseCodeMin).max(issueAdminSecondFactorDailyCodeResponseCodeMax),
  "expiresAt": zod.coerce.date(),
  "shownOnce": zod.literal(true)
})


/**
 * El código de empleado es una credencial secreta emitida y revocada únicamente por personal autorizado. No acepta correo ni número de seguro social.
 * @summary Inicia sesión móvil con código corporativo
 */
export const mobileCodeLoginBodyEmployeeCodeMin = 6;
export const mobileCodeLoginBodyEmployeeCodeMax = 20;


export const mobileCodeLoginBodyEmployeeCodeRegExp = new RegExp('^[A-Za-z0-9_-]+$');
export const mobileCodeLoginBodyInstallationIdMin = 16;
export const mobileCodeLoginBodyInstallationIdMax = 255;

export const mobileCodeLoginBodyDeviceCredentialMin = 32;
export const mobileCodeLoginBodyDeviceCredentialMax = 255;

export const mobileCodeLoginBodyModelMax = 190;

export const mobileCodeLoginBodyOsVersionMax = 80;

export const mobileCodeLoginBodyAppVersionMax = 80;



export const MobileCodeLoginBody = zod.object({
  "employeeCode": zod.string().min(mobileCodeLoginBodyEmployeeCodeMin).max(mobileCodeLoginBodyEmployeeCodeMax).regex(mobileCodeLoginBodyEmployeeCodeRegExp).describe('Código aleatorio emitido por personal corporativo; nunca es un correo, SSN de 9 dígitos ni una secuencia débil.'),
  "installationId": zod.string().min(mobileCodeLoginBodyInstallationIdMin).max(mobileCodeLoginBodyInstallationIdMax),
  "deviceCredential": zod.string().min(mobileCodeLoginBodyDeviceCredentialMin).max(mobileCodeLoginBodyDeviceCredentialMax).optional().describe('Requerida al volver a iniciar sesión con un dispositivo ya enrolado y aprobado.'),
  "platform": zod.enum(['ios', 'android']),
  "model": zod.string().max(mobileCodeLoginBodyModelMax).optional(),
  "osVersion": zod.string().max(mobileCodeLoginBodyOsVersionMax).optional(),
  "appVersion": zod.string().max(mobileCodeLoginBodyAppVersionMax).optional()
})

export const MobileCodeLoginResponse = zod.object({
  "user": zod.object({
  "id": zod.string(),
  "name": zod.string(),
  "role": zod.enum(['Web Master', 'super_admin', 'admin', 'hr', 'secretary', 'accounting', 'supervisor', 'employee']),
  "initials": zod.string().optional(),
  "permissions": zod.array(zod.string()).optional()
}),
  "token": zod.string().describe('Credencial de sesión opaca; nunca se almacena sin hash.'),
  "device": zod.object({
  "id": zod.string(),
  "status": zod.enum(['pending', 'approved', 'revoked', 'replaced', 'rejected']),
  "platform": zod.enum(['ios', 'android']),
  "model": zod.string().nullish(),
  "osVersion": zod.string().nullish(),
  "appVersion": zod.string().nullish(),
  "approvedAt": zod.coerce.date().nullish(),
  "revokedAt": zod.coerce.date().nullish(),
  "lastActivity": zod.coerce.date().nullish()
}),
  "deviceCredential": zod.string().optional().describe('Credencial opaca de dispositivo mostrada únicamente durante el primer registro.')
})


/**
 * @summary Revoca la sesión actual
 */
export const LogoutResponse = zod.void()


/**
 * @summary Obtiene el token CSRF de la sesión web
 */
export const GetCsrfTokenResponse = zod.object({
  "csrfToken": zod.string()
})


/**
 * Solo Web Master o super_admin. La sesión devuelta es independiente de la sesión administrativa y expira en 30 minutos.
 * @summary Abre una sesión delegada de un empleado
 */
export const StartImpersonationBody = zod.object({
  "employeeId": zod.uuid()
})

export const StartImpersonationResponse = zod.object({
  "token": zod.string(),
  "csrfToken": zod.string(),
  "expiresAt": zod.coerce.date(),
  "user": zod.object({
  "id": zod.string(),
  "name": zod.string(),
  "email": zod.email(),
  "role": zod.enum(['Web Master', 'super_admin', 'admin', 'hr', 'secretary', 'accounting', 'supervisor', 'employee']),
  "initials": zod.string().optional(),
  "permissions": zod.array(zod.string()).optional()
})
})


/**
 * @summary Cierra la sesión delegada actual
 */
export const EndImpersonationResponse = zod.void()


/**
 * Devuelve únicamente obras, trabajadores, asistencia, alertas y solicitudes asignadas al supervisor autenticado.
 * @summary Resumen acotado de la operación asignada
 */
export const GetSupervisorSummaryResponse = zod.object({
  "employees": zod.array(zod.object({
  "id": zod.string(),
  "employeeNumber": zod.string(),
  "name": zod.string(),
  "role": zod.string(),
  "phone": zod.string(),
  "status": zod.enum(['active', 'on_leave', 'inactive']),
  "assignedWorksite": zod.string().nullable(),
  "hireDate": zod.coerce.date().optional(),
  "profileImage": zod.string(),
  "department": zod.string(),
  "position": zod.string(),
  "email": zod.email(),
  "address": zod.string(),
  "emergencyContacts": zod.array(zod.object({
  "name": zod.string(),
  "relationship": zod.string(),
  "phone": zod.string()
})),
  "employmentType": zod.enum(['full_time', 'part_time', 'contractor']),
  "appAccess": zod.boolean(),
  "readOnly": zod.boolean(),
  "userId": zod.string().nullish()
})),
  "worksites": zod.array(zod.object({
  "id": zod.string(),
  "projectId": zod.string(),
  "projectNumber": zod.string(),
  "name": zod.string(),
  "address": zod.string(),
  "status": zod.enum(['active', 'paused', 'complete']),
  "areasCount": zod.int(),
  "supervisorName": zod.string().nullish()
})),
  "attendance": zod.array(zod.object({
  "id": zod.string(),
  "employeeName": zod.string(),
  "employeeNumber": zod.string(),
  "worksiteName": zod.string(),
  "action": zod.enum(['check_in', 'check_out']),
  "capturedAt": zod.coerce.date(),
  "validation": zod.record(zod.string(), zod.boolean())
})),
  "alerts": zod.array(zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})),
  "securityEvents": zod.array(zod.object({
  "id": zod.string(),
  "type": zod.string(),
  "message": zod.string(),
  "severity": zod.enum(['info', 'warning', 'critical']),
  "worksiteName": zod.string().nullish(),
  "createdAt": zod.coerce.date(),
  "resolved": zod.boolean()
})),
  "leaveRequests": zod.array(zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
}))
})


/**
 * @summary Corrige una marcación del equipo asignado
 */
export const CorrectSupervisorAttendanceParams = zod.object({
  "id": zod.coerce.string()
})

export const CorrectSupervisorAttendanceBody = zod.object({
  "action": zod.enum(['check_in', 'check_out']).optional(),
  "capturedAt": zod.coerce.date().optional(),
  "worksiteId": zod.string().nullish()
})

export const CorrectSupervisorAttendanceResponse = zod.object({
  "id": zod.string(),
  "employeeName": zod.string(),
  "employeeNumber": zod.string(),
  "worksiteName": zod.string(),
  "action": zod.enum(['check_in', 'check_out']),
  "capturedAt": zod.coerce.date(),
  "validation": zod.record(zod.string(), zod.boolean())
})


/**
 * @summary Aprueba o deniega una solicitud del equipo asignado
 */
export const ReviewSupervisorLeaveRequestParams = zod.object({
  "id": zod.coerce.string()
})

export const ReviewSupervisorLeaveRequestBody = zod.object({
  "status": zod.enum(['approved', 'denied'])
})

export const ReviewSupervisorLeaveRequestResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Resumen de indicadores operativos
 */
export const GetDashboardSummaryResponse = zod.object({
  "activeProjects": zod.int(),
  "activeWorksites": zod.int(),
  "openQuotes": zod.int(),
  "fleetAvailable": zod.int(),
  "checkedInToday": zod.int(),
  "securityEvents": zod.int(),
  "maintenanceDue": zod.int(),
  "recentActivity": zod.array(zod.object({
  "id": zod.string(),
  "action": zod.string(),
  "actor": zod.string(),
  "timestamp": zod.coerce.date(),
  "severity": zod.enum(['info', 'warning', 'critical'])
}))
})


/**
 * @summary Actividad reciente
 */
export const ListActivityResponseItem = zod.object({
  "id": zod.string(),
  "action": zod.string(),
  "actor": zod.string(),
  "timestamp": zod.coerce.date(),
  "severity": zod.enum(['info', 'warning', 'critical'])
})
export const ListActivityResponse = zod.array(ListActivityResponseItem)


/**
 * @summary Lista solicitudes de cotización
 */
export const ListQuotesResponseItem = zod.object({
  "id": zod.string(),
  "quoteNumber": zod.string(),
  "clientName": zod.string(),
  "company": zod.string().nullish(),
  "email": zod.email().optional(),
  "phone": zod.string().nullish(),
  "service": zod.string(),
  "message": zod.string().optional(),
  "status": zod.enum(['new', 'reviewing', 'sent', 'approved', 'declined', 'archived']),
  "amount": zod.number().nullish(),
  "priority": zod.enum(['low', 'normal', 'high']),
  "createdAt": zod.coerce.date(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListQuotesResponse = zod.array(ListQuotesResponseItem)


/**
 * @summary Crea una cotización interna
 */
export const createQuoteBodyClientNameMin = 2;

export const createQuoteBodyMessageMin = 10;

export const createQuoteBodyPriorityDefault = `normal`;

export const CreateQuoteBody = zod.object({
  "clientName": zod.string().min(createQuoteBodyClientNameMin),
  "company": zod.string().optional(),
  "email": zod.email(),
  "phone": zod.string().optional(),
  "service": zod.string(),
  "message": zod.string().min(createQuoteBodyMessageMin),
  "priority": zod.enum(['low', 'normal', 'high']).default(createQuoteBodyPriorityDefault),
  "amount": zod.number().optional()
})

export const CreateQuoteResponse = zod.object({
  "id": zod.string(),
  "quoteNumber": zod.string(),
  "clientName": zod.string(),
  "company": zod.string().nullish(),
  "email": zod.email().optional(),
  "phone": zod.string().nullish(),
  "service": zod.string(),
  "message": zod.string().optional(),
  "status": zod.enum(['new', 'reviewing', 'sent', 'approved', 'declined', 'archived']),
  "amount": zod.number().nullish(),
  "priority": zod.enum(['low', 'normal', 'high']),
  "createdAt": zod.coerce.date(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Obtiene una cotización
 */
export const GetQuoteParams = zod.object({
  "id": zod.coerce.string()
})

export const GetQuoteResponse = zod.object({
  "id": zod.string(),
  "quoteNumber": zod.string(),
  "clientName": zod.string(),
  "company": zod.string().nullish(),
  "email": zod.email().optional(),
  "phone": zod.string().nullish(),
  "service": zod.string(),
  "message": zod.string().optional(),
  "status": zod.enum(['new', 'reviewing', 'sent', 'approved', 'declined', 'archived']),
  "amount": zod.number().nullish(),
  "priority": zod.enum(['low', 'normal', 'high']),
  "createdAt": zod.coerce.date(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Actualiza una cotización
 */
export const UpdateQuoteParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateQuoteBody = zod.object({
  "status": zod.enum(['new', 'reviewing', 'sent', 'approved', 'declined', 'archived']).optional(),
  "priority": zod.enum(['low', 'normal', 'high']).optional(),
  "amount": zod.number().optional(),
  "message": zod.string().optional()
})

export const UpdateQuoteResponse = zod.object({
  "id": zod.string(),
  "quoteNumber": zod.string(),
  "clientName": zod.string(),
  "company": zod.string().nullish(),
  "email": zod.email().optional(),
  "phone": zod.string().nullish(),
  "service": zod.string(),
  "message": zod.string().optional(),
  "status": zod.enum(['new', 'reviewing', 'sent', 'approved', 'declined', 'archived']),
  "amount": zod.number().nullish(),
  "priority": zod.enum(['low', 'normal', 'high']),
  "createdAt": zod.coerce.date(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Elimina una cotización
 */
export const DeleteQuoteParams = zod.object({
  "id": zod.coerce.string()
})

export const DeleteQuoteResponse = zod.void()


/**
 * @summary Lista clientes
 */
export const ListClientsResponseItem = zod.object({
  "id": zod.string(),
  "name": zod.string(),
  "company": zod.string(),
  "email": zod.email(),
  "phone": zod.string(),
  "status": zod.enum(['active', 'prospect', 'inactive']),
  "projectsCount": zod.int(),
  "createdAt": zod.coerce.date()
})
export const ListClientsResponse = zod.array(ListClientsResponseItem)


/**
 * @summary Crea un cliente
 */
export const createClientBodyStatusDefault = `prospect`;

export const CreateClientBody = zod.object({
  "name": zod.string(),
  "company": zod.string(),
  "email": zod.email(),
  "phone": zod.string(),
  "status": zod.enum(['active', 'prospect', 'inactive']).default(createClientBodyStatusDefault)
})

export const CreateClientResponse = zod.object({
  "id": zod.string(),
  "name": zod.string(),
  "company": zod.string(),
  "email": zod.email(),
  "phone": zod.string(),
  "status": zod.enum(['active', 'prospect', 'inactive']),
  "projectsCount": zod.int(),
  "createdAt": zod.coerce.date()
})


/**
 * @summary Actualiza un cliente
 */
export const UpdateClientParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateClientBody = zod.object({
  "name": zod.string().optional(),
  "company": zod.string().optional(),
  "email": zod.email().optional(),
  "phone": zod.string().optional(),
  "status": zod.enum(['active', 'prospect', 'inactive']).optional()
})

export const UpdateClientResponse = zod.object({
  "id": zod.string(),
  "name": zod.string(),
  "company": zod.string(),
  "email": zod.email(),
  "phone": zod.string(),
  "status": zod.enum(['active', 'prospect', 'inactive']),
  "projectsCount": zod.int(),
  "createdAt": zod.coerce.date()
})


/**
 * @summary Elimina un cliente
 */
export const DeleteClientParams = zod.object({
  "id": zod.coerce.string()
})

export const DeleteClientResponse = zod.void()


/**
 * @summary Lista proyectos
 */
export const listProjectsResponseProgressMin = 0;
export const listProjectsResponseProgressMax = 100;



export const ListProjectsResponseItem = zod.object({
  "id": zod.string(),
  "projectNumber": zod.string(),
  "name": zod.string(),
  "status": zod.enum(['planning', 'active', 'paused', 'complete', 'archived']),
  "address": zod.string(),
  "clientName": zod.string(),
  "worksitesCount": zod.int(),
  "progress": zod.int().min(listProjectsResponseProgressMin).max(listProjectsResponseProgressMax),
  "updatedAt": zod.coerce.date()
})
export const ListProjectsResponse = zod.array(ListProjectsResponseItem)


/**
 * @summary Crea un proyecto
 */
export const createProjectBodyStatusDefault = `planning`;
export const createProjectBodyProgressDefault = 0;
export const createProjectBodyProgressMin = 0;
export const createProjectBodyProgressMax = 100;



export const CreateProjectBody = zod.object({
  "projectNumber": zod.string(),
  "name": zod.string(),
  "address": zod.string(),
  "clientId": zod.string().optional(),
  "status": zod.enum(['planning', 'active', 'paused', 'complete', 'archived']).default(createProjectBodyStatusDefault),
  "progress": zod.int().min(createProjectBodyProgressMin).max(createProjectBodyProgressMax).default(createProjectBodyProgressDefault)
})

export const createProjectResponseProgressMin = 0;
export const createProjectResponseProgressMax = 100;



export const CreateProjectResponse = zod.object({
  "id": zod.string(),
  "projectNumber": zod.string(),
  "name": zod.string(),
  "status": zod.enum(['planning', 'active', 'paused', 'complete', 'archived']),
  "address": zod.string(),
  "clientName": zod.string(),
  "worksitesCount": zod.int(),
  "progress": zod.int().min(createProjectResponseProgressMin).max(createProjectResponseProgressMax),
  "updatedAt": zod.coerce.date()
})


/**
 * @summary Detalle de proyecto
 */
export const GetProjectParams = zod.object({
  "id": zod.coerce.string()
})

export const getProjectResponseOneProgressMin = 0;
export const getProjectResponseOneProgressMax = 100;



export const GetProjectResponse = zod.object({
  "id": zod.string(),
  "projectNumber": zod.string(),
  "name": zod.string(),
  "status": zod.enum(['planning', 'active', 'paused', 'complete', 'archived']),
  "address": zod.string(),
  "clientName": zod.string(),
  "worksitesCount": zod.int(),
  "progress": zod.int().min(getProjectResponseOneProgressMin).max(getProjectResponseOneProgressMax),
  "updatedAt": zod.coerce.date()
}).and(zod.object({
  "worksites": zod.array(zod.object({
  "id": zod.string(),
  "projectId": zod.string(),
  "projectNumber": zod.string(),
  "name": zod.string(),
  "address": zod.string(),
  "status": zod.enum(['active', 'paused', 'complete']),
  "areasCount": zod.int(),
  "supervisorName": zod.string().nullish()
}))
}))


/**
 * @summary Actualiza un proyecto
 */
export const UpdateProjectParams = zod.object({
  "id": zod.coerce.string()
})

export const updateProjectBodyProgressMin = 0;
export const updateProjectBodyProgressMax = 100;



export const UpdateProjectBody = zod.object({
  "name": zod.string().optional(),
  "address": zod.string().optional(),
  "clientId": zod.string().optional(),
  "status": zod.enum(['planning', 'active', 'paused', 'complete', 'archived']).optional(),
  "progress": zod.int().min(updateProjectBodyProgressMin).max(updateProjectBodyProgressMax).optional()
})

export const updateProjectResponseProgressMin = 0;
export const updateProjectResponseProgressMax = 100;



export const UpdateProjectResponse = zod.object({
  "id": zod.string(),
  "projectNumber": zod.string(),
  "name": zod.string(),
  "status": zod.enum(['planning', 'active', 'paused', 'complete', 'archived']),
  "address": zod.string(),
  "clientName": zod.string(),
  "worksitesCount": zod.int(),
  "progress": zod.int().min(updateProjectResponseProgressMin).max(updateProjectResponseProgressMax),
  "updatedAt": zod.coerce.date()
})


/**
 * @summary Elimina un proyecto
 */
export const DeleteProjectParams = zod.object({
  "id": zod.coerce.string()
})

export const DeleteProjectResponse = zod.void()


/**
 * @summary Lista obras
 */
export const ListWorksitesResponseItem = zod.object({
  "id": zod.string(),
  "projectId": zod.string(),
  "projectNumber": zod.string(),
  "name": zod.string(),
  "address": zod.string(),
  "status": zod.enum(['active', 'paused', 'complete']),
  "areasCount": zod.int(),
  "supervisorName": zod.string().nullish()
})
export const ListWorksitesResponse = zod.array(ListWorksitesResponseItem)


/**
 * @summary Crea una obra
 */
export const createWorksiteBodyStatusDefault = `active`;

export const CreateWorksiteBody = zod.object({
  "projectId": zod.string(),
  "name": zod.string(),
  "address": zod.string(),
  "status": zod.enum(['active', 'paused', 'complete']).default(createWorksiteBodyStatusDefault),
  "supervisorId": zod.string().optional()
})

export const CreateWorksiteResponse = zod.object({
  "id": zod.string(),
  "projectId": zod.string(),
  "projectNumber": zod.string(),
  "name": zod.string(),
  "address": zod.string(),
  "status": zod.enum(['active', 'paused', 'complete']),
  "areasCount": zod.int(),
  "supervisorName": zod.string().nullish()
})


/**
 * @summary Actualiza una obra
 */
export const UpdateWorksiteParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateWorksiteBody = zod.object({
  "name": zod.string().optional(),
  "address": zod.string().optional(),
  "status": zod.enum(['active', 'paused', 'complete']).optional(),
  "supervisorId": zod.string().optional()
})

export const UpdateWorksiteResponse = zod.object({
  "id": zod.string(),
  "projectId": zod.string(),
  "projectNumber": zod.string(),
  "name": zod.string(),
  "address": zod.string(),
  "status": zod.enum(['active', 'paused', 'complete']),
  "areasCount": zod.int(),
  "supervisorName": zod.string().nullish()
})


/**
 * @summary Elimina una obra
 */
export const DeleteWorksiteParams = zod.object({
  "id": zod.coerce.string()
})

export const DeleteWorksiteResponse = zod.void()


/**
 * @summary Lista maquinaria y equipo
 */
export const ListEquipmentResponseItem = zod.object({
  "id": zod.string(),
  "assetNumber": zod.string(),
  "name": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['available', 'rented', 'maintenance', 'inactive']),
  "location": zod.string(),
  "nextMaintenance": zod.coerce.date(),
  "hourlyRate": zod.number().nullish()
})
export const ListEquipmentResponse = zod.array(ListEquipmentResponseItem)


/**
 * @summary Registra maquinaria
 */
export const createEquipmentBodyStatusDefault = `available`;

export const CreateEquipmentBody = zod.object({
  "assetNumber": zod.string(),
  "name": zod.string(),
  "category": zod.string(),
  "location": zod.string(),
  "status": zod.enum(['available', 'rented', 'maintenance', 'inactive']).default(createEquipmentBodyStatusDefault),
  "nextMaintenance": zod.coerce.date().optional(),
  "hourlyRate": zod.number().optional()
})

export const CreateEquipmentResponse = zod.object({
  "id": zod.string(),
  "assetNumber": zod.string(),
  "name": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['available', 'rented', 'maintenance', 'inactive']),
  "location": zod.string(),
  "nextMaintenance": zod.coerce.date(),
  "hourlyRate": zod.number().nullish()
})


/**
 * @summary Actualiza maquinaria
 */
export const UpdateEquipmentParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateEquipmentBody = zod.object({
  "name": zod.string().optional(),
  "category": zod.string().optional(),
  "location": zod.string().optional(),
  "status": zod.enum(['available', 'rented', 'maintenance', 'inactive']).optional(),
  "nextMaintenance": zod.coerce.date().optional(),
  "hourlyRate": zod.number().optional()
})

export const UpdateEquipmentResponse = zod.object({
  "id": zod.string(),
  "assetNumber": zod.string(),
  "name": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['available', 'rented', 'maintenance', 'inactive']),
  "location": zod.string(),
  "nextMaintenance": zod.coerce.date(),
  "hourlyRate": zod.number().nullish()
})


/**
 * @summary Retira maquinaria del catálogo
 */
export const DeleteEquipmentParams = zod.object({
  "id": zod.coerce.string()
})

export const DeleteEquipmentResponse = zod.void()


/**
 * @summary Lista materiales
 */
export const ListMaterialsResponseItem = zod.object({
  "id": zod.string(),
  "sku": zod.string(),
  "name": zod.string(),
  "category": zod.string(),
  "stock": zod.number(),
  "unit": zod.string(),
  "reorderLevel": zod.number(),
  "status": zod.enum(['in_stock', 'low', 'out_of_stock'])
})
export const ListMaterialsResponse = zod.array(ListMaterialsResponseItem)


/**
 * @summary Registra material
 */
export const CreateMaterialBody = zod.object({
  "sku": zod.string(),
  "name": zod.string(),
  "category": zod.string(),
  "stock": zod.number(),
  "unit": zod.string(),
  "reorderLevel": zod.number()
})

export const CreateMaterialResponse = zod.object({
  "id": zod.string(),
  "sku": zod.string(),
  "name": zod.string(),
  "category": zod.string(),
  "stock": zod.number(),
  "unit": zod.string(),
  "reorderLevel": zod.number(),
  "status": zod.enum(['in_stock', 'low', 'out_of_stock'])
})


/**
 * @summary Actualiza material
 */
export const UpdateMaterialParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateMaterialBody = zod.object({
  "name": zod.string().optional(),
  "category": zod.string().optional(),
  "stock": zod.number().optional(),
  "unit": zod.string().optional(),
  "reorderLevel": zod.number().optional()
})

export const UpdateMaterialResponse = zod.object({
  "id": zod.string(),
  "sku": zod.string(),
  "name": zod.string(),
  "category": zod.string(),
  "stock": zod.number(),
  "unit": zod.string(),
  "reorderLevel": zod.number(),
  "status": zod.enum(['in_stock', 'low', 'out_of_stock'])
})


/**
 * @summary Retira material
 */
export const DeleteMaterialParams = zod.object({
  "id": zod.coerce.string()
})

export const DeleteMaterialResponse = zod.void()


/**
 * @summary Lista empleados y supervisores
 */
export const ListEmployeesQueryParams = zod.object({
  "q": zod.coerce.string().optional().describe('Busca por nombre, apellido, ID, correo, teléfono, departamento, puesto, dirección o SSN si existe en el registro corporativo.')
})

export const ListEmployeesResponseItem = zod.object({
  "id": zod.string(),
  "employeeNumber": zod.string(),
  "name": zod.string(),
  "role": zod.string(),
  "phone": zod.string(),
  "status": zod.enum(['active', 'on_leave', 'inactive']),
  "assignedWorksite": zod.string().nullable(),
  "hireDate": zod.coerce.date().optional(),
  "profileImage": zod.string(),
  "department": zod.string(),
  "position": zod.string(),
  "email": zod.email(),
  "address": zod.string(),
  "emergencyContacts": zod.array(zod.object({
  "name": zod.string(),
  "relationship": zod.string(),
  "phone": zod.string()
})),
  "employmentType": zod.enum(['full_time', 'part_time', 'contractor']),
  "appAccess": zod.boolean(),
  "readOnly": zod.boolean(),
  "userId": zod.string().nullish()
})
export const ListEmployeesResponse = zod.array(ListEmployeesResponseItem)


/**
 * @summary Crea un empleado
 */
export const createEmployeeBodyStatusDefault = `active`;

export const CreateEmployeeBody = zod.object({
  "employeeNumber": zod.string(),
  "name": zod.string(),
  "role": zod.string(),
  "phone": zod.string(),
  "status": zod.enum(['active', 'on_leave', 'inactive']).default(createEmployeeBodyStatusDefault),
  "assignedWorksite": zod.string().optional(),
  "hireDate": zod.coerce.date().optional(),
  "profileImage": zod.string().optional(),
  "department": zod.string(),
  "position": zod.string(),
  "email": zod.email(),
  "address": zod.string(),
  "emergencyContacts": zod.array(zod.object({
  "name": zod.string(),
  "relationship": zod.string(),
  "phone": zod.string()
})).optional(),
  "employmentType": zod.enum(['full_time', 'part_time', 'contractor']),
  "appAccess": zod.boolean().optional(),
  "readOnly": zod.boolean().optional(),
  "userId": zod.string().optional()
})

export const CreateEmployeeResponse = zod.object({
  "id": zod.string(),
  "employeeNumber": zod.string(),
  "name": zod.string(),
  "role": zod.string(),
  "phone": zod.string(),
  "status": zod.enum(['active', 'on_leave', 'inactive']),
  "assignedWorksite": zod.string().nullable(),
  "hireDate": zod.coerce.date().optional(),
  "profileImage": zod.string(),
  "department": zod.string(),
  "position": zod.string(),
  "email": zod.email(),
  "address": zod.string(),
  "emergencyContacts": zod.array(zod.object({
  "name": zod.string(),
  "relationship": zod.string(),
  "phone": zod.string()
})),
  "employmentType": zod.enum(['full_time', 'part_time', 'contractor']),
  "appAccess": zod.boolean(),
  "readOnly": zod.boolean(),
  "userId": zod.string().nullish()
})


/**
 * @summary Actualiza un empleado
 */
export const UpdateEmployeeParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateEmployeeBody = zod.object({
  "name": zod.string().optional(),
  "role": zod.string().optional(),
  "phone": zod.string().optional(),
  "status": zod.enum(['active', 'on_leave', 'inactive']).optional(),
  "assignedWorksite": zod.string().optional(),
  "profileImage": zod.string().optional(),
  "department": zod.string().optional(),
  "position": zod.string().optional(),
  "email": zod.email().optional(),
  "address": zod.string().optional(),
  "emergencyContacts": zod.array(zod.object({
  "name": zod.string(),
  "relationship": zod.string(),
  "phone": zod.string()
})).optional(),
  "employmentType": zod.enum(['full_time', 'part_time', 'contractor']).optional(),
  "appAccess": zod.boolean().optional(),
  "readOnly": zod.boolean().optional(),
  "userId": zod.string().optional()
})

export const UpdateEmployeeResponse = zod.object({
  "id": zod.string(),
  "employeeNumber": zod.string(),
  "name": zod.string(),
  "role": zod.string(),
  "phone": zod.string(),
  "status": zod.enum(['active', 'on_leave', 'inactive']),
  "assignedWorksite": zod.string().nullable(),
  "hireDate": zod.coerce.date().optional(),
  "profileImage": zod.string(),
  "department": zod.string(),
  "position": zod.string(),
  "email": zod.email(),
  "address": zod.string(),
  "emergencyContacts": zod.array(zod.object({
  "name": zod.string(),
  "relationship": zod.string(),
  "phone": zod.string()
})),
  "employmentType": zod.enum(['full_time', 'part_time', 'contractor']),
  "appAccess": zod.boolean(),
  "readOnly": zod.boolean(),
  "userId": zod.string().nullish()
})


/**
 * @summary Desactiva un empleado
 */
export const DeleteEmployeeParams = zod.object({
  "id": zod.coerce.string()
})

export const DeleteEmployeeResponse = zod.void()


/**
 * Solo Web Master, administración o RR. HH. autorizado. Los secretos sin hash se muestran una sola vez.
 * @summary Emite o rota una credencial móvil de empleado
 */
export const IssueEmployeeMobileCredentialParams = zod.object({
  "id": zod.coerce.string()
})

export const issueEmployeeMobileCredentialBodyEmployeeCodeMin = 6;
export const issueEmployeeMobileCredentialBodyEmployeeCodeMax = 20;


export const issueEmployeeMobileCredentialBodyEmployeeCodeRegExp = new RegExp('^[A-Za-z0-9_-]+$');


export const IssueEmployeeMobileCredentialBody = zod.object({
  "employeeCode": zod.string().min(issueEmployeeMobileCredentialBodyEmployeeCodeMin).max(issueEmployeeMobileCredentialBodyEmployeeCodeMax).regex(issueEmployeeMobileCredentialBodyEmployeeCodeRegExp).optional().describe('Opcional; si se omite se genera un código aleatorio de 12 a 20 caracteres. Rechaza SSN y secuencias débiles.')
})

export const issueEmployeeMobileCredentialResponseEmployeeCodeMin = 6;
export const issueEmployeeMobileCredentialResponseEmployeeCodeMax = 20;



export const IssueEmployeeMobileCredentialResponse = zod.object({
  "credentialId": zod.string(),
  "employeeCode": zod.string().min(issueEmployeeMobileCredentialResponseEmployeeCodeMin).max(issueEmployeeMobileCredentialResponseEmployeeCodeMax),
  "shownOnce": zod.literal(true)
})


/**
 * @summary Revoca una credencial móvil
 */
export const RevokeEmployeeMobileCredentialParams = zod.object({
  "id": zod.coerce.string()
})

export const RevokeEmployeeMobileCredentialResponse = zod.void()


/**
 * @summary Devuelve el perfil propio del empleado móvil
 */
export const GetMyEmployeeProfileResponse = zod.object({
  "id": zod.string(),
  "employeeNumber": zod.string(),
  "name": zod.string(),
  "role": zod.string(),
  "phone": zod.string(),
  "status": zod.enum(['active', 'on_leave', 'inactive']),
  "assignedWorksite": zod.string().nullable(),
  "hireDate": zod.coerce.date().optional(),
  "profileImage": zod.string(),
  "department": zod.string(),
  "position": zod.string(),
  "email": zod.email(),
  "address": zod.string(),
  "emergencyContacts": zod.array(zod.object({
  "name": zod.string(),
  "relationship": zod.string(),
  "phone": zod.string()
})),
  "employmentType": zod.enum(['full_time', 'part_time', 'contractor']),
  "appAccess": zod.boolean(),
  "readOnly": zod.boolean(),
  "userId": zod.string().nullish()
})


/**
 * @summary Libro de asistencia
 */
export const ListAttendanceResponseItem = zod.object({
  "id": zod.string(),
  "employeeName": zod.string(),
  "employeeNumber": zod.string(),
  "worksiteName": zod.string(),
  "action": zod.enum(['check_in', 'check_out']),
  "capturedAt": zod.coerce.date(),
  "validation": zod.record(zod.string(), zod.boolean())
})
export const ListAttendanceResponse = zod.array(ListAttendanceResponseItem)


/**
 * @summary Registra una marcación validada
 */
export const RecordAttendanceBody = zod.object({
  "employeeId": zod.string(),
  "worksiteId": zod.string(),
  "deviceId": zod.string().optional(),
  "qrToken": zod.string().optional(),
  "latitude": zod.number().optional(),
  "longitude": zod.number().optional(),
  "capturedAt": zod.coerce.date(),
  "action": zod.enum(['check_in', 'check_out'])
})

export const RecordAttendanceResponse = zod.object({
  "id": zod.string(),
  "employeeName": zod.string(),
  "employeeNumber": zod.string(),
  "worksiteName": zod.string(),
  "action": zod.enum(['check_in', 'check_out']),
  "capturedAt": zod.coerce.date(),
  "validation": zod.record(zod.string(), zod.boolean())
})


/**
 * @summary Lista la asistencia propia del empleado móvil
 */
export const ListMyAttendanceResponseItem = zod.object({
  "id": zod.string(),
  "employeeName": zod.string(),
  "employeeNumber": zod.string(),
  "worksiteName": zod.string(),
  "action": zod.enum(['check_in', 'check_out']),
  "capturedAt": zod.coerce.date(),
  "validation": zod.record(zod.string(), zod.boolean())
})
export const ListMyAttendanceResponse = zod.array(ListMyAttendanceResponseItem)


/**
 * @summary Registra una instalación móvil para aprobación corporativa
 */
export const registerMobileDeviceBodyInstallationIdMin = 16;
export const registerMobileDeviceBodyInstallationIdMax = 255;

export const registerMobileDeviceBodyModelMax = 190;

export const registerMobileDeviceBodyOsVersionMax = 80;

export const registerMobileDeviceBodyAppVersionMax = 80;



export const RegisterMobileDeviceBody = zod.object({
  "installationId": zod.string().min(registerMobileDeviceBodyInstallationIdMin).max(registerMobileDeviceBodyInstallationIdMax),
  "platform": zod.enum(['ios', 'android']),
  "model": zod.string().max(registerMobileDeviceBodyModelMax).optional(),
  "osVersion": zod.string().max(registerMobileDeviceBodyOsVersionMax).optional(),
  "appVersion": zod.string().max(registerMobileDeviceBodyAppVersionMax).optional()
})

export const RegisterMobileDeviceResponse = zod.object({
  "id": zod.string(),
  "status": zod.enum(['pending', 'approved', 'revoked', 'replaced', 'rejected']),
  "platform": zod.enum(['ios', 'android']),
  "model": zod.string().nullish(),
  "osVersion": zod.string().nullish(),
  "appVersion": zod.string().nullish(),
  "approvedAt": zod.coerce.date().nullish(),
  "revokedAt": zod.coerce.date().nullish(),
  "lastActivity": zod.coerce.date().nullish()
})


/**
 * @summary Consulta el estado del dispositivo móvil enlazado
 */
export const GetMobileDeviceStatusResponse = zod.object({
  "id": zod.string(),
  "status": zod.enum(['pending', 'approved', 'revoked', 'replaced', 'rejected']),
  "platform": zod.enum(['ios', 'android']),
  "model": zod.string().nullish(),
  "osVersion": zod.string().nullish(),
  "appVersion": zod.string().nullish(),
  "approvedAt": zod.coerce.date().nullish(),
  "revokedAt": zod.coerce.date().nullish(),
  "lastActivity": zod.coerce.date().nullish()
})


/**
 * @summary Aprueba un dispositivo móvil
 */
export const ApproveDeviceParams = zod.object({
  "id": zod.coerce.string()
})

export const approveDeviceBodyReasonMin = 3;
export const approveDeviceBodyReasonMax = 500;

export const approveDeviceBodyReplaceDefault = false;

export const ApproveDeviceBody = zod.object({
  "reason": zod.string().min(approveDeviceBodyReasonMin).max(approveDeviceBodyReasonMax).optional(),
  "replace": zod.boolean().default(approveDeviceBodyReplaceDefault)
})

export const ApproveDeviceResponse = zod.object({
  "id": zod.string(),
  "status": zod.enum(['pending', 'approved', 'revoked', 'replaced', 'rejected']),
  "platform": zod.enum(['ios', 'android']),
  "model": zod.string().nullish(),
  "osVersion": zod.string().nullish(),
  "appVersion": zod.string().nullish(),
  "approvedAt": zod.coerce.date().nullish(),
  "revokedAt": zod.coerce.date().nullish(),
  "lastActivity": zod.coerce.date().nullish()
})


/**
 * @summary Revoca o reemplaza un dispositivo móvil
 */
export const RevokeDeviceParams = zod.object({
  "id": zod.coerce.string()
})

export const revokeDeviceBodyReasonMin = 3;
export const revokeDeviceBodyReasonMax = 500;

export const revokeDeviceBodyReplaceDefault = false;

export const RevokeDeviceBody = zod.object({
  "reason": zod.string().min(revokeDeviceBodyReasonMin).max(revokeDeviceBodyReasonMax).optional(),
  "replace": zod.boolean().default(revokeDeviceBodyReplaceDefault)
})

export const RevokeDeviceResponse = zod.object({
  "id": zod.string(),
  "status": zod.enum(['pending', 'approved', 'revoked', 'replaced', 'rejected']),
  "platform": zod.enum(['ios', 'android']),
  "model": zod.string().nullish(),
  "osVersion": zod.string().nullish(),
  "appVersion": zod.string().nullish(),
  "approvedAt": zod.coerce.date().nullish(),
  "revokedAt": zod.coerce.date().nullish(),
  "lastActivity": zod.coerce.date().nullish()
})


/**
 * @summary Obtiene el QR principal para impresión corporativa
 */
export const GetProjectMainQrForPrintParams = zod.object({
  "id": zod.coerce.string()
})

export const GetProjectMainQrForPrintResponse = zod.object({
  "id": zod.string(),
  "projectId": zod.string(),
  "worksiteId": zod.string().nullish(),
  "keyVersion": zod.string(),
  "status": zod.enum(['active', 'revoked', 'rotated']),
  "printable": zod.boolean().describe('True only for authorized corporate users; never available to employee or supervisor mobile roles.'),
  "printUrl": zod.url().nullish()
})


/**
 * Solo personal corporativo autorizado puede crear, imprimir o descargar este recurso estático.
 * @summary Crea o rota el QR principal corporativo de un proyecto
 */
export const CreateProjectMainQrParams = zod.object({
  "id": zod.coerce.string()
})

export const CreateProjectMainQrResponse = zod.object({
  "id": zod.string(),
  "projectId": zod.string(),
  "worksiteId": zod.string().nullish(),
  "keyVersion": zod.string(),
  "status": zod.enum(['active', 'revoked', 'rotated']),
  "printable": zod.boolean().describe('True only for authorized corporate users; never available to employee or supervisor mobile roles.'),
  "printUrl": zod.url().nullish()
})


/**
 * El desafío firmado expira en 30–60 segundos, es de un solo uso y solo puede mostrarlo un supervisor explícitamente autorizado o personal corporativo.
 * @summary Emite un desafío QR rotativo de corta duración
 */
export const CreateQrDisplayChallengeParams = zod.object({
  "id": zod.coerce.string()
})

export const createQrDisplayChallengeResponseWatermarkMetadataFrameIntervalMsMin = 100;



export const CreateQrDisplayChallengeResponse = zod.object({
  "challenge": zod.string().describe('Opaque signed challenge payload'),
  "signature": zod.string().describe('Server signature'),
  "projectId": zod.string(),
  "worksiteId": zod.string(),
  "displaySessionId": zod.string(),
  "keyVersion": zod.string(),
  "issuedAt": zod.coerce.date(),
  "expiresAt": zod.coerce.date(),
  "watermarkMetadata": zod.object({
  "seed": zod.string(),
  "frameIntervalMs": zod.int().min(createQrDisplayChallengeResponseWatermarkMetadataFrameIntervalMsMin)
})
})


/**
 * @summary Valida un escaneo QR de asistencia
 */
export const scanAttendanceQrBodyLatitudeMin = -90;
export const scanAttendanceQrBodyLatitudeMax = 90;

export const scanAttendanceQrBodyLongitudeMin = -180;
export const scanAttendanceQrBodyLongitudeMax = 180;

export const scanAttendanceQrBodyDeviceCredentialMin = 32;



export const ScanAttendanceQrBody = zod.object({
  "challenge": zod.string(),
  "signature": zod.string(),
  "action": zod.enum(['check_in', 'check_out']),
  "latitude": zod.number().min(scanAttendanceQrBodyLatitudeMin).max(scanAttendanceQrBodyLatitudeMax),
  "longitude": zod.number().min(scanAttendanceQrBodyLongitudeMin).max(scanAttendanceQrBodyLongitudeMax),
  "platform": zod.enum(['ios', 'android']),
  "deviceCredential": zod.string().min(scanAttendanceQrBodyDeviceCredentialMin),
  "clientTime": zod.coerce.date().optional()
})

export const scanAttendanceQrResponseRiskScoreMin = 0;
export const scanAttendanceQrResponseRiskScoreMax = 100;



export const ScanAttendanceQrResponse = zod.object({
  "attendanceId": zod.string(),
  "status": zod.enum(['accepted', 'rejected', 'pending']),
  "serverTime": zod.coerce.date(),
  "riskScore": zod.int().min(scanAttendanceQrResponseRiskScoreMin).max(scanAttendanceQrResponseRiskScoreMax),
  "reason": zod.string().nullish()
})


/**
 * @summary Lista intentos de asistencia aceptados y rechazados
 */
export const listSecurityAttemptsResponseRiskScoreMin = 0;
export const listSecurityAttemptsResponseRiskScoreMax = 100;



export const ListSecurityAttemptsResponseItem = zod.object({
  "id": zod.string(),
  "employeeId": zod.string().nullish(),
  "employeeNumber": zod.string().nullish(),
  "projectId": zod.string().nullish(),
  "worksiteId": zod.string().nullish(),
  "deviceId": zod.string().nullish(),
  "platform": zod.string().nullish(),
  "result": zod.enum(['accepted', 'rejected', 'pending']),
  "reason": zod.string(),
  "latitude": zod.number().nullish(),
  "longitude": zod.number().nullish(),
  "riskScore": zod.int().min(listSecurityAttemptsResponseRiskScoreMin).max(listSecurityAttemptsResponseRiskScoreMax),
  "createdAt": zod.coerce.date()
})
export const ListSecurityAttemptsResponse = zod.array(ListSecurityAttemptsResponseItem)


/**
 * @summary Configura geofence y horario de un worksite
 */
export const UpdateWorksiteSecurityConfigParams = zod.object({
  "id": zod.coerce.string()
})

export const updateWorksiteSecurityConfigBodyLatitudeMin = -90;
export const updateWorksiteSecurityConfigBodyLatitudeMax = 90;

export const updateWorksiteSecurityConfigBodyLongitudeMin = -180;
export const updateWorksiteSecurityConfigBodyLongitudeMax = 180;

export const updateWorksiteSecurityConfigBodyGeofenceRadiusMetersMin = 25;
export const updateWorksiteSecurityConfigBodyGeofenceRadiusMetersMax = 5000;

export const updateWorksiteSecurityConfigBodyScheduleStartRegExp = new RegExp('^([01][0-9]|2[0-3]):[0-5][0-9]$');
export const updateWorksiteSecurityConfigBodyScheduleEndRegExp = new RegExp('^([01][0-9]|2[0-3]):[0-5][0-9]$');
export const updateWorksiteSecurityConfigBodyScheduleGraceMinutesMin = 0;
export const updateWorksiteSecurityConfigBodyScheduleGraceMinutesMax = 180;



export const UpdateWorksiteSecurityConfigBody = zod.object({
  "latitude": zod.number().min(updateWorksiteSecurityConfigBodyLatitudeMin).max(updateWorksiteSecurityConfigBodyLatitudeMax),
  "longitude": zod.number().min(updateWorksiteSecurityConfigBodyLongitudeMin).max(updateWorksiteSecurityConfigBodyLongitudeMax),
  "geofenceRadiusMeters": zod.int().min(updateWorksiteSecurityConfigBodyGeofenceRadiusMetersMin).max(updateWorksiteSecurityConfigBodyGeofenceRadiusMetersMax),
  "scheduleStart": zod.string().regex(updateWorksiteSecurityConfigBodyScheduleStartRegExp).nullish(),
  "scheduleEnd": zod.string().regex(updateWorksiteSecurityConfigBodyScheduleEndRegExp).nullish(),
  "scheduleGraceMinutes": zod.int().min(updateWorksiteSecurityConfigBodyScheduleGraceMinutesMin).max(updateWorksiteSecurityConfigBodyScheduleGraceMinutesMax),
  "qrDisplayAuthorized": zod.boolean().optional()
})

export const updateWorksiteSecurityConfigResponseLatitudeMin = -90;
export const updateWorksiteSecurityConfigResponseLatitudeMax = 90;

export const updateWorksiteSecurityConfigResponseLongitudeMin = -180;
export const updateWorksiteSecurityConfigResponseLongitudeMax = 180;

export const updateWorksiteSecurityConfigResponseGeofenceRadiusMetersMin = 25;
export const updateWorksiteSecurityConfigResponseGeofenceRadiusMetersMax = 5000;

export const updateWorksiteSecurityConfigResponseScheduleStartRegExp = new RegExp('^([01][0-9]|2[0-3]):[0-5][0-9]$');
export const updateWorksiteSecurityConfigResponseScheduleEndRegExp = new RegExp('^([01][0-9]|2[0-3]):[0-5][0-9]$');
export const updateWorksiteSecurityConfigResponseScheduleGraceMinutesMin = 0;
export const updateWorksiteSecurityConfigResponseScheduleGraceMinutesMax = 180;



export const UpdateWorksiteSecurityConfigResponse = zod.object({
  "latitude": zod.number().min(updateWorksiteSecurityConfigResponseLatitudeMin).max(updateWorksiteSecurityConfigResponseLatitudeMax),
  "longitude": zod.number().min(updateWorksiteSecurityConfigResponseLongitudeMin).max(updateWorksiteSecurityConfigResponseLongitudeMax),
  "geofenceRadiusMeters": zod.int().min(updateWorksiteSecurityConfigResponseGeofenceRadiusMetersMin).max(updateWorksiteSecurityConfigResponseGeofenceRadiusMetersMax),
  "scheduleStart": zod.string().regex(updateWorksiteSecurityConfigResponseScheduleStartRegExp).nullish(),
  "scheduleEnd": zod.string().regex(updateWorksiteSecurityConfigResponseScheduleEndRegExp).nullish(),
  "scheduleGraceMinutes": zod.int().min(updateWorksiteSecurityConfigResponseScheduleGraceMinutesMin).max(updateWorksiteSecurityConfigResponseScheduleGraceMinutesMax),
  "qrDisplayAuthorized": zod.boolean().optional()
})


/**
 * @summary Lista eventos de seguridad
 */
export const ListSecurityEventsResponseItem = zod.object({
  "id": zod.string(),
  "type": zod.string(),
  "message": zod.string(),
  "severity": zod.enum(['info', 'warning', 'critical']),
  "worksiteName": zod.string().nullish(),
  "createdAt": zod.coerce.date(),
  "resolved": zod.boolean()
})
export const ListSecurityEventsResponse = zod.array(ListSecurityEventsResponseItem)


/**
 * @summary Lista políticas vigentes
 */
export const ListPoliciesResponseItem = zod.object({
  "id": zod.string(),
  "title": zod.string(),
  "version": zod.string(),
  "summary": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['published', 'draft', 'archived']),
  "updatedAt": zod.coerce.date(),
  "requiredAcceptance": zod.boolean()
})
export const ListPoliciesResponse = zod.array(ListPoliciesResponseItem)


/**
 * @summary Crea una política
 */
export const createPolicyBodyStatusDefault = `draft`;
export const createPolicyBodyRequiredAcceptanceDefault = true;

export const CreatePolicyBody = zod.object({
  "title": zod.string(),
  "version": zod.string(),
  "summary": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['published', 'draft', 'archived']).default(createPolicyBodyStatusDefault),
  "requiredAcceptance": zod.boolean().default(createPolicyBodyRequiredAcceptanceDefault)
})

export const CreatePolicyResponse = zod.object({
  "id": zod.string(),
  "title": zod.string(),
  "version": zod.string(),
  "summary": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['published', 'draft', 'archived']),
  "updatedAt": zod.coerce.date(),
  "requiredAcceptance": zod.boolean()
})


/**
 * @summary Actualiza una política
 */
export const UpdatePolicyParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdatePolicyBody = zod.object({
  "title": zod.string().optional(),
  "version": zod.string().optional(),
  "summary": zod.string().optional(),
  "category": zod.string().optional(),
  "status": zod.enum(['published', 'draft', 'archived']).optional(),
  "requiredAcceptance": zod.boolean().optional()
})

export const UpdatePolicyResponse = zod.object({
  "id": zod.string(),
  "title": zod.string(),
  "version": zod.string(),
  "summary": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['published', 'draft', 'archived']),
  "updatedAt": zod.coerce.date(),
  "requiredAcceptance": zod.boolean()
})


/**
 * @summary Archiva una política
 */
export const DeletePolicyParams = zod.object({
  "id": zod.coerce.string()
})

export const DeletePolicyResponse = zod.void()


/**
 * @summary Lista documentos de operación
 */
export const ListDocumentsResponseItem = zod.object({
  "id": zod.string(),
  "name": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['current', 'expiring', 'expired', 'archived']),
  "owner": zod.string(),
  "expiresAt": zod.coerce.date().nullish(),
  "fileUrl": zod.string().nullish(),
  "updatedAt": zod.coerce.date()
})
export const ListDocumentsResponse = zod.array(ListDocumentsResponseItem)


/**
 * @summary Registra un documento
 */
export const createDocumentBodyStatusDefault = `current`;

export const CreateDocumentBody = zod.object({
  "name": zod.string(),
  "category": zod.string(),
  "owner": zod.string(),
  "status": zod.enum(['current', 'expiring', 'expired', 'archived']).default(createDocumentBodyStatusDefault),
  "expiresAt": zod.coerce.date().optional(),
  "fileUrl": zod.string().optional()
})

export const CreateDocumentResponse = zod.object({
  "id": zod.string(),
  "name": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['current', 'expiring', 'expired', 'archived']),
  "owner": zod.string(),
  "expiresAt": zod.coerce.date().nullish(),
  "fileUrl": zod.string().nullish(),
  "updatedAt": zod.coerce.date()
})


/**
 * @summary Actualiza un documento
 */
export const UpdateDocumentParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateDocumentBody = zod.object({
  "name": zod.string().optional(),
  "category": zod.string().optional(),
  "owner": zod.string().optional(),
  "status": zod.enum(['current', 'expiring', 'expired', 'archived']).optional(),
  "expiresAt": zod.coerce.date().optional(),
  "fileUrl": zod.string().optional()
})

export const UpdateDocumentResponse = zod.object({
  "id": zod.string(),
  "name": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['current', 'expiring', 'expired', 'archived']),
  "owner": zod.string(),
  "expiresAt": zod.coerce.date().nullish(),
  "fileUrl": zod.string().nullish(),
  "updatedAt": zod.coerce.date()
})


/**
 * @summary Archiva un documento
 */
export const DeleteDocumentParams = zod.object({
  "id": zod.coerce.string()
})

export const DeleteDocumentResponse = zod.void()


/**
 * @summary Lista citas y visitas
 */
export const ListAppointmentsResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListAppointmentsResponse = zod.array(ListAppointmentsResponseItem)


/**
 * @summary Crea una cita
 */
export const CreateAppointmentBody = zod.record(zod.string(), zod.unknown())

export const CreateAppointmentResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


export const UpdateAppointmentParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateAppointmentBody = zod.record(zod.string(), zod.unknown())

export const UpdateAppointmentResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


export const DeleteAppointmentParams = zod.object({
  "id": zod.coerce.string()
})

export const DeleteAppointmentResponse = zod.void()


/**
 * @summary Lista alertas operativas
 */
export const ListAlertsResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListAlertsResponse = zod.array(ListAlertsResponseItem)


/**
 * @summary Crea una alerta operativa
 */
export const CreateAlertBody = zod.record(zod.string(), zod.unknown())

export const CreateAlertResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


export const UpdateAlertParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateAlertBody = zod.record(zod.string(), zod.unknown())

export const UpdateAlertResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Lista auditoría inmutable
 */
export const ListAuditLogsResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListAuditLogsResponse = zod.array(ListAuditLogsResponseItem)


/**
 * @summary Lista roles y permisos
 */
export const ListRolesResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListRolesResponse = zod.array(ListRolesResponseItem)


/**
 * @summary Crea un rol
 */
export const CreateRoleBody = zod.record(zod.string(), zod.unknown())

export const CreateRoleResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


export const UpdateRoleParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateRoleBody = zod.record(zod.string(), zod.unknown())

export const UpdateRoleResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Lista dispositivos autorizados
 */
export const ListDevicesResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListDevicesResponse = zod.array(ListDevicesResponseItem)


export const UpdateDeviceParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateDeviceBody = zod.record(zod.string(), zod.unknown())

export const UpdateDeviceResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Lista empleos
 */
export const ListJobPostingsResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListJobPostingsResponse = zod.array(ListJobPostingsResponseItem)


/**
 * @summary Publica un empleo
 */
export const CreateJobPostingBody = zod.record(zod.string(), zod.unknown())

export const CreateJobPostingResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


export const UpdateJobPostingParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateJobPostingBody = zod.record(zod.string(), zod.unknown())

export const UpdateJobPostingResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Lista solicitudes de empleo
 */
export const ListJobApplicationsResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListJobApplicationsResponse = zod.array(ListJobApplicationsResponseItem)


/**
 * @summary Recibe una solicitud de empleo
 */
export const CreateJobApplicationBody = zod.record(zod.string(), zod.unknown())

export const CreateJobApplicationResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


export const UpdateJobApplicationParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateJobApplicationBody = zod.record(zod.string(), zod.unknown())

export const UpdateJobApplicationResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Lista recursos y artículos
 */
export const ListResourcesResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListResourcesResponse = zod.array(ListResourcesResponseItem)


/**
 * @summary Crea un recurso
 */
export const CreateResourceBody = zod.record(zod.string(), zod.unknown())

export const CreateResourceResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


export const UpdateResourceParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateResourceBody = zod.record(zod.string(), zod.unknown())

export const UpdateResourceResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Lista medios de proyectos
 */
export const ListMediaResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListMediaResponse = zod.array(ListMediaResponseItem)


/**
 * @summary Registra una imagen o video
 */
export const CreateMediaBody = zod.record(zod.string(), zod.unknown())

export const CreateMediaResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Lista el contenido público editable desde el cPanel
 */
export const ListPublicEntriesResponseItem = zod.object({
  "id": zod.uuid(),
  "kind": zod.enum(['showcase', 'post', 'legal']),
  "slug": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['published', 'draft', 'archived']),
  "titleEs": zod.string(),
  "titleEn": zod.string(),
  "summaryEs": zod.string(),
  "summaryEn": zod.string(),
  "bodyEs": zod.string(),
  "bodyEn": zod.string(),
  "imageUrl": zod.string().nullish(),
  "imageAltEs": zod.string(),
  "imageAltEn": zod.string(),
  "gallery": zod.array(zod.object({
  "url": zod.string(),
  "altEs": zod.string(),
  "altEn": zod.string()
})),
  "seoTitleEs": zod.string(),
  "seoTitleEn": zod.string(),
  "seoDescriptionEs": zod.string(),
  "seoDescriptionEn": zod.string(),
  "published": zod.boolean(),
  "featured": zod.boolean(),
  "sortOrder": zod.int(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListPublicEntriesResponse = zod.array(ListPublicEntriesResponseItem)


/**
 * @summary Crea una publicación, proyecto, servicio o página legal
 */
export const createPublicEntryBodyKindDefault = `showcase`;

export const createPublicEntryBodyStatusDefault = `published`;

export const createPublicEntryBodyPublishedDefault = true;
export const createPublicEntryBodyFeaturedDefault = false;
export const createPublicEntryBodySortOrderDefault = 0;

export const CreatePublicEntryBody = zod.object({
  "kind": zod.enum(['showcase', 'post', 'legal']).default(createPublicEntryBodyKindDefault),
  "slug": zod.string().min(1),
  "category": zod.string().min(1),
  "status": zod.enum(['published', 'draft', 'archived']).default(createPublicEntryBodyStatusDefault),
  "titleEs": zod.string().min(1),
  "titleEn": zod.string().min(1),
  "summaryEs": zod.string().optional(),
  "summaryEn": zod.string().optional(),
  "bodyEs": zod.string().optional(),
  "bodyEn": zod.string().optional(),
  "imageUrl": zod.string().optional(),
  "imageAltEs": zod.string().optional(),
  "imageAltEn": zod.string().optional(),
  "gallery": zod.array(zod.object({
  "url": zod.string(),
  "altEs": zod.string(),
  "altEn": zod.string()
})).optional(),
  "seoTitleEs": zod.string().optional(),
  "seoTitleEn": zod.string().optional(),
  "seoDescriptionEs": zod.string().optional(),
  "seoDescriptionEn": zod.string().optional(),
  "published": zod.boolean().default(createPublicEntryBodyPublishedDefault),
  "featured": zod.boolean().default(createPublicEntryBodyFeaturedDefault),
  "sortOrder": zod.int().default(createPublicEntryBodySortOrderDefault)
})

export const CreatePublicEntryResponse = zod.object({
  "id": zod.uuid(),
  "kind": zod.enum(['showcase', 'post', 'legal']),
  "slug": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['published', 'draft', 'archived']),
  "titleEs": zod.string(),
  "titleEn": zod.string(),
  "summaryEs": zod.string(),
  "summaryEn": zod.string(),
  "bodyEs": zod.string(),
  "bodyEn": zod.string(),
  "imageUrl": zod.string().nullish(),
  "imageAltEs": zod.string(),
  "imageAltEn": zod.string(),
  "gallery": zod.array(zod.object({
  "url": zod.string(),
  "altEs": zod.string(),
  "altEn": zod.string()
})),
  "seoTitleEs": zod.string(),
  "seoTitleEn": zod.string(),
  "seoDescriptionEs": zod.string(),
  "seoDescriptionEn": zod.string(),
  "published": zod.boolean(),
  "featured": zod.boolean(),
  "sortOrder": zod.int(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Actualiza contenido público
 */
export const UpdatePublicEntryParams = zod.object({
  "id": zod.coerce.string()
})






export const UpdatePublicEntryBody = zod.object({
  "kind": zod.enum(['showcase', 'post', 'legal']).optional(),
  "slug": zod.string().min(1).optional(),
  "category": zod.string().optional(),
  "status": zod.enum(['published', 'draft', 'archived']).optional(),
  "titleEs": zod.string().min(1).optional(),
  "titleEn": zod.string().min(1).optional(),
  "summaryEs": zod.string().optional(),
  "summaryEn": zod.string().optional(),
  "bodyEs": zod.string().optional(),
  "bodyEn": zod.string().optional(),
  "imageUrl": zod.string().nullish(),
  "imageAltEs": zod.string().optional(),
  "imageAltEn": zod.string().optional(),
  "gallery": zod.array(zod.object({
  "url": zod.string(),
  "altEs": zod.string(),
  "altEn": zod.string()
})).optional(),
  "seoTitleEs": zod.string().optional(),
  "seoTitleEn": zod.string().optional(),
  "seoDescriptionEs": zod.string().optional(),
  "seoDescriptionEn": zod.string().optional(),
  "published": zod.boolean().optional(),
  "featured": zod.boolean().optional(),
  "sortOrder": zod.int().optional()
})

export const UpdatePublicEntryResponse = zod.object({
  "id": zod.uuid(),
  "kind": zod.enum(['showcase', 'post', 'legal']),
  "slug": zod.string(),
  "category": zod.string(),
  "status": zod.enum(['published', 'draft', 'archived']),
  "titleEs": zod.string(),
  "titleEn": zod.string(),
  "summaryEs": zod.string(),
  "summaryEn": zod.string(),
  "bodyEs": zod.string(),
  "bodyEn": zod.string(),
  "imageUrl": zod.string().nullish(),
  "imageAltEs": zod.string(),
  "imageAltEn": zod.string(),
  "gallery": zod.array(zod.object({
  "url": zod.string(),
  "altEs": zod.string(),
  "altEn": zod.string()
})),
  "seoTitleEs": zod.string(),
  "seoTitleEn": zod.string(),
  "seoDescriptionEs": zod.string(),
  "seoDescriptionEn": zod.string(),
  "published": zod.boolean(),
  "featured": zod.boolean(),
  "sortOrder": zod.int(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Elimina contenido público
 */
export const DeletePublicEntryParams = zod.object({
  "id": zod.coerce.string()
})

export const DeletePublicEntryResponse = zod.void()


/**
 * @summary Lista exportaciones de nómina
 */
export const ListPayrollExportsResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListPayrollExportsResponse = zod.array(ListPayrollExportsResponseItem)


/**
 * @summary Genera una exportación de nómina
 */
export const CreatePayrollExportBody = zod.record(zod.string(), zod.unknown())

export const CreatePayrollExportResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Lista licencias y ausencias
 */
export const ListLeaveRequestsResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListLeaveRequestsResponse = zod.array(ListLeaveRequestsResponseItem)


/**
 * @summary Solicita una licencia
 */
export const CreateLeaveRequestBody = zod.record(zod.string(), zod.unknown())

export const CreateLeaveRequestResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


export const UpdateLeaveRequestParams = zod.object({
  "id": zod.coerce.string()
})

export const UpdateLeaveRequestBody = zod.record(zod.string(), zod.unknown())

export const UpdateLeaveRequestResponse = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})


/**
 * @summary Lista las licencias propias del empleado móvil
 */
export const ListMyLeaveRequestsResponseItem = zod.object({
  "id": zod.string(),
  "createdAt": zod.coerce.date().optional(),
  "updatedAt": zod.coerce.date().optional()
})
export const ListMyLeaveRequestsResponse = zod.array(ListMyLeaveRequestsResponseItem)


/**
 * @summary Obtiene configuración de la compañía
 */
export const GetSettingsResponse = zod.object({
  "companyName": zod.string(),
  "legalName": zod.string(),
  "phone": zod.string(),
  "email": zod.email(),
  "address": zod.string(),
  "defaultLanguage": zod.enum(['es', 'en']),
  "quoteNotificationEmail": zod.email().optional(),
  "siteContent": zod.record(zod.string(), zod.string()),
  "integrationSettings": zod.record(zod.string(), zod.unknown()),
  "adminSecondFactorEnabled": zod.boolean(),
  "adminSecondFactorMethod": zod.enum(['daily_code', 'simple_math', 'captcha'])
})


/**
 * @summary Actualiza configuración
 */
export const UpdateSettingsBody = zod.object({
  "companyName": zod.string().optional(),
  "legalName": zod.string().optional(),
  "phone": zod.string().optional(),
  "email": zod.email().optional(),
  "address": zod.string().optional(),
  "defaultLanguage": zod.enum(['es', 'en']).optional(),
  "quoteNotificationEmail": zod.email().optional(),
  "siteContent": zod.record(zod.string(), zod.string()).optional(),
  "integrationSettings": zod.record(zod.string(), zod.unknown()).optional(),
  "adminSecondFactorEnabled": zod.boolean().optional(),
  "adminSecondFactorMethod": zod.enum(['daily_code', 'simple_math', 'captcha']).optional()
})

export const UpdateSettingsResponse = zod.object({
  "companyName": zod.string(),
  "legalName": zod.string(),
  "phone": zod.string(),
  "email": zod.email(),
  "address": zod.string(),
  "defaultLanguage": zod.enum(['es', 'en']),
  "quoteNotificationEmail": zod.email().optional(),
  "siteContent": zod.record(zod.string(), zod.string()),
  "integrationSettings": zod.record(zod.string(), zod.unknown()),
  "adminSecondFactorEnabled": zod.boolean(),
  "adminSecondFactorMethod": zod.enum(['daily_code', 'simple_math', 'captcha'])
})


