40 lines
1.4 KiB
TypeScript
40 lines
1.4 KiB
TypeScript
import { z } from 'zod';
|
||
|
||
export const USUARIO_REQUIRED_HEADERS = [
|
||
'ID',
|
||
'Nombre del empleado',
|
||
'Latitud',
|
||
'Longitud',
|
||
'Horas por día usuario',
|
||
'Horas por semana usuario',
|
||
] as const;
|
||
|
||
export const USUARIO_NORMALIZED_REQUIRED = [
|
||
'id',
|
||
'nombre_del_empleado',
|
||
'latitud',
|
||
'longitud',
|
||
'horas_por_dia_usuario',
|
||
'horas_por_semana_usuario',
|
||
] as const;
|
||
|
||
export const usuarioRowSchema = z.object({
|
||
id: z.union([z.string(), z.number()]).refine(v => String(v).trim() !== '', { message: 'ID requerido' }),
|
||
nombre_del_empleado: z.string().min(1, 'Nombre del empleado requerido'),
|
||
latitud: z.number().min(-90, 'Latitud mínima -90').max(90, 'Latitud máxima 90'),
|
||
longitud: z.number().min(-180, 'Longitud mínima -180').max(180, 'Longitud máxima 180'),
|
||
horas_por_dia_usuario: z.number().min(0.5, 'Horas por día mínimo 0.5').max(24, 'Horas por día máximo 24'),
|
||
horas_por_semana_usuario: z.number().min(1, 'Horas por semana mínimo 1').max(168, 'Horas por semana máximo 168'),
|
||
}).superRefine((data, ctx) => {
|
||
if (data.horas_por_semana_usuario > data.horas_por_dia_usuario * 7) {
|
||
ctx.addIssue({
|
||
code: z.ZodIssueCode.custom,
|
||
message: 'Horas por semana no puede exceder 7 × horas por día',
|
||
path: ['horas_por_semana_usuario'],
|
||
});
|
||
}
|
||
});
|
||
|
||
export type UsuarioRow = z.infer<typeof usuarioRowSchema>;
|
||
export const USUARIO_MAX_ROWS = 50;
|