import { z } from 'zod'; // 1. Definimos el esquema de un item individual de la lista de productos // Basado en los campos que usaste en ProductActivityList const productItemSchema = z.object({ description: z.string().optional().nullable(), dailyCount: z.coerce.string().or(z.number()).optional().nullable(), weeklyCount: z.coerce.string().or(z.number()).optional().nullable(), monthlyCount: z.coerce.string().or(z.number()).optional().nullable(), // Distribución Interna internalDistributionZone: z.string().optional().nullable(), internalQuantity: z.coerce.string().or(z.number()).optional().nullable(), internalUnit: z.string().optional().nullable(), // Distribución Externa externalCountry: z.string().optional().nullable(), externalState: z.number().optional().nullable(), externalMunicipality: z.number().optional().nullable(), externalParish: z.number().optional().nullable(), externalCity: z.string().optional().nullable(), externalDescription: z.string().optional().nullable(), externalQuantity: z.coerce.string().or(z.number()).optional().nullable(), externalUnit: z.string().optional().nullable(), // Mano de obra womenCount: z.coerce.string().or(z.number()).optional().nullable(), menCount: z.coerce.string().or(z.number()).optional().nullable(), }); const productionItemSchema = z.object({ supplyType: z.string().optional().nullable(), quantity: z.coerce.string().or(z.number()).optional().nullable(), unit: z.string().min(1, { message: 'Unidad es requerida' }).nullable(), }); const equipmentItemSchema = z.object({ machine: z.string().nullable(), quantity: z.coerce.string().or(z.number()).optional().nullable(), }); export const trainingSchema = z.object({ //Datos de la visita id: z.number().optional(), firstname: z.string().min(1, { message: 'Nombre es requerido' }), lastname: z.string().min(1, { message: 'Apellido es requerido' }), coorPhone: z .string() .optional() .nullable() .refine((val) => !val || /^(04|02)\d{9}$/.test(val), { message: 'El teléfono debe tener 11 dígitos y comenzar con 04 o 02', }), visitDate: z .string() .min(1, { message: 'Fecha y hora de visita es requerida' }), //Datos de la organización socioproductiva (OSP) ospType: z.string().min(1, { message: 'Tipo de OSP es requerido' }), ecoSector: z.string().optional().or(z.literal('')).nullable(), productiveSector: z.string().optional().or(z.literal('')).nullable(), centralProductiveActivity: z.string().optional().or(z.literal('')).nullable(), mainProductiveActivity: z.string().optional().or(z.literal('')).nullable(), productiveActivity: z .string() .min(1, { message: 'Actividad productiva es requerida' }), ospRif: z.string().optional().or(z.literal('')).nullable(), ospName: z.string().optional().or(z.literal('')).nullable(), companyConstitutionYear: z.coerce .number() .min(1900, { message: 'Año inválido' }) .nullable(), currentStatus: z .string() .min(1, { message: 'Estatus actual es requerido' }) .default('ACTIVA'), infrastructureMt2: z.string().optional().or(z.literal('')).nullable(), hasTransport: z .preprocess((val) => val === 'true' || val === true, z.boolean()) .optional() .nullable(), structureType: z.string().optional().or(z.literal('')).nullable(), isOpenSpace: z .preprocess((val) => val === 'true' || val === true, z.boolean()) .optional() .nullable(), paralysisReason: z.string().optional().nullable(), //Datos del Equipamiento equipmentList: z.array(equipmentItemSchema).optional().default([]), //Datos de Producción productionList: z.array(productionItemSchema).optional().default([]), // Datos de Actividad Productiva productList: z.array(productItemSchema).optional().default([]), //Detalles de la ubicación ospAddress: z .string() .min(1, { message: 'Dirección de la OSP es requerida' }), ospGoogleMapsLink: z.string().optional().or(z.literal('')).nullable(), communeName: z.string().optional().or(z.literal('')).nullable(), siturCodeCommune: z.string().optional().or(z.literal('')).nullable(), communeRif: z.string().optional().or(z.literal('')).nullable(), communeSpokespersonName: z.string().optional().or(z.literal('')).nullable(), communeSpokespersonPhone: z .string() .optional() .or(z.literal('')) .refine((val) => !val || /^(04|02)\d{9}$/.test(val), { message: 'El teléfono debe tener 11 dígitos y comenzar con 04 o 02', }), communeEmail: z .string() .email({ message: 'Correo electrónico de la Comuna inválido' }) .optional() .or(z.literal('')) .nullable(), communalCouncil: z .string() .min(1, { message: 'Consejo Comunal es requerido' }), siturCodeCommunalCouncil: z.string().optional().or(z.literal('')).nullable(), communalCouncilRif: z.string().optional().or(z.literal('')).nullable(), communalCouncilSpokespersonName: z .string() .optional() .or(z.literal('')) .nullable(), communalCouncilSpokespersonPhone: z .string() .optional() .or(z.literal('')) .refine((val) => !val || /^(04|02)\d{9}$/.test(val), { message: 'El teléfono debe tener 11 dígitos y comenzar con 04 o 02', }), communalCouncilEmail: z .string() .email({ message: 'Correo electrónico del Consejo Comunal inválido' }) .optional() .or(z.literal('')) .nullable(), //Datos del Responsable OSP ospResponsibleCedula: z .string() .min(1, { message: 'Cédula del responsable es requerida' }), ospResponsibleFullname: z .string() .min(1, { message: 'Nombre del responsable es requerido' }), ospResponsibleRif: z.string().optional().nullable(), civilState: z.string().optional().nullable(), ospResponsiblePhone: z .string() .min(1, { message: 'Teléfono del responsable es requerido' }) .regex(/^(04|02)\d{9}$/, { message: 'El teléfono debe tener 11 dígitos y comenzar con 04 o 02', }), ospResponsibleEmail: z .string() .email({ message: 'Correo electrónico inválido' }) .optional() .or(z.literal('')) .nullable(), familyBurden: z.coerce.number().optional(), numberOfChildren: z.coerce.number().optional(), //Datos adicionales generalObservations: z.string().optional().nullable(), //IMAGENES files: z.any().optional(), //no se envia la backend al crear ni editar el formulario state: z.number().optional().nullable(), municipality: z.number().optional().nullable(), parish: z.number().optional().nullable(), coorState: z.number().optional().nullable(), coorMunicipality: z.number().optional().nullable(), coorParish: z.number().optional().nullable(), photo1: z.string().optional().nullable(), photo2: z.string().optional().nullable(), photo3: z.string().optional().nullable(), createdBy: z.number().optional().nullable(), updatedBy: z.number().optional().nullable(), createdAt: z.string().optional().nullable(), updatedAt: z.string().optional().nullable(), }); export type TrainingSchema = z.infer; export const trainingApiResponseSchema = z.object({ message: z.string(), data: z.array(trainingSchema), meta: z.object({ page: z.number(), limit: z.number(), totalCount: z.number(), totalPages: z.number(), hasNextPage: z.boolean(), hasPreviousPage: z.boolean(), nextPage: z.number().nullable(), previousPage: z.number().nullable(), }), }); export const TrainingMutate = z.object({ message: z.string(), data: trainingSchema, });