50 lines
2.0 KiB
TypeScript
50 lines
2.0 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
export const PDV_REQUIRED_HEADERS = [
|
|
'ID',
|
|
'Nombre del PDV',
|
|
'Segmentación',
|
|
'Latitud',
|
|
'Longitud',
|
|
'Visitas semanales',
|
|
'Duración visita(horas)',
|
|
'Prioridad',
|
|
] as const;
|
|
|
|
export const PDV_NORMALIZED_REQUIRED = [
|
|
'id',
|
|
'nombre_del_pdv',
|
|
'segmentacion',
|
|
'latitud',
|
|
'longitud',
|
|
'prioridad',
|
|
] as const;
|
|
|
|
export const SEGMENTACIONES = ['AA', 'A', 'B', 'C', 'D'] as const;
|
|
|
|
export const pdvRowSchema = z.object({
|
|
id: z.union([z.string(), z.number()]).refine(v => String(v).trim() !== '', { message: 'ID requerido' }),
|
|
nombre_del_pdv: z.string().min(1, 'Nombre del PDV requerido'),
|
|
segmentacion: z.string().refine(v => (SEGMENTACIONES as readonly string[]).includes(v.toUpperCase()), {
|
|
message: `Segmentación debe ser ${SEGMENTACIONES.join(', ')}`,
|
|
}),
|
|
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'),
|
|
visitas_semanales: z.number().int('Visitas semanales debe ser entero').min(1, 'Visitas semanales mínimo 1').max(7, 'Visitas semanales máximo 7').optional(),
|
|
duracion_visitahoras: z.number().min(0.01, 'Duración visita debe ser >0').max(168, 'Duración visita máximo 168').optional(),
|
|
minimo_horas_semana: z.number().min(0.01, 'Mínimo horas semana debe ser >0').max(168, 'Mínimo horas semana máximo 168').optional(),
|
|
prioridad: z.number().int('Prioridad debe ser entero').min(1, 'Prioridad mínimo 1').max(5, 'Prioridad máximo 5'),
|
|
}).superRefine((data, ctx) => {
|
|
const hasVisitsFormat = data.visitas_semanales !== undefined && data.duracion_visitahoras !== undefined;
|
|
if (!hasVisitsFormat && data.minimo_horas_semana === undefined) {
|
|
ctx.addIssue({
|
|
code: z.ZodIssueCode.custom,
|
|
path: ['minimo_horas_semana'],
|
|
message: 'Incluye Mínimo horas semana o Visitas semanales + Duración visita(horas)'
|
|
});
|
|
}
|
|
});
|
|
|
|
export type PdvRow = z.infer<typeof pdvRowSchema>;
|
|
export const PDV_MAX_ROWS = 2000;
|