correciones al formulario osp

This commit is contained in:
2026-01-28 22:42:19 -04:00
parent d2908f1e4c
commit 8efe595f73
23 changed files with 9036 additions and 1685 deletions

View File

@@ -1,154 +1,166 @@
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({
productName: z.string(),
description: z.string().optional(),
dailyCount: z.coerce.string().or(z.number()).optional(), // Aceptamos string o number por los inputs
weeklyCount: z.coerce.string().or(z.number()).optional(),
monthlyCount: z.coerce.string().or(z.number()).optional(),
// Distribución Interna
internalState: z.number().optional(),
internalMunicipality: z.number().optional(),
internalParish: z.number().optional(),
internalDescription: z.string().optional(),
internalQuantity: z.coerce.string().or(z.number()).optional(),
// Distribución Externa
externalCountry: z.string().optional(),
externalState: z.number().optional(),
externalMunicipality: z.number().optional(),
externalParish: z.number().optional(),
externalCity: z.string().optional(),
externalDescription: z.string().optional(),
externalQuantity: z.coerce.string().or(z.number()).optional(),
// Mano de obra
womenCount: z.coerce.string().or(z.number()).optional(),
menCount: z.coerce.string().or(z.number()).optional(),
});
const productionItemSchema = z.object({
rawMaterial: z.string(),
supplyType: z.string().optional(),
quantity: z.coerce.string().or(z.number()).optional(), // Aceptamos string o number por los inputs
});
const equipmentItemSchema = z.object({
machine: z.string(),
specifications: z.string().optional(),
quantity: z.coerce.string().or(z.number()).optional(), // Aceptamos string o number por los inputs
});
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(),
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('')),
productiveSector: z.string().optional().or(z.literal('')),
centralProductiveActivity: z.string().optional().or(z.literal('')),
mainProductiveActivity: z.string().optional().or(z.literal('')),
productiveActivity: z
.string()
.min(1, { message: 'Actividad productiva es requerida' }),
// financialRequirementDescription: z
// .string()
// .min(1, { message: 'Descripción es requerida' }),
siturCodeCommune: z
.string()
.min(1, { message: 'Código SITUR Comuna es requerido' }),
communeName: z
.string()
.min(1, { message: 'Nombre de la Comuna es requerido' }),
communeRif: z
.string()
.min(1, { message: 'RIF de la Comuna es requerido' }),
communeSpokespersonName: z
.string()
.min(1, { message: 'Nombre del Vocero de la Comuna es requerido' }),
communeSpokespersonCedula: z
.string()
.min(1, { message: 'Cédula del Vocero de la Comuna es requerida' }),
communeSpokespersonRif: z
.string()
.min(1, { message: 'RIF del Vocero de la Comuna es requerido' }),
communeSpokespersonPhone: z
.string()
.min(1, { message: 'Teléfono del Vocero de la Comuna es requerido' }),
communeEmail: z.string().email({ message: 'Correo electrónico de la Comuna inválido' }),
communalCouncil: z
.string()
.min(1, { message: 'Consejo Comunal es requerido' }),
siturCodeCommunalCouncil: z
.string()
.min(1, { message: 'Código SITUR Consejo Comunal es requerido' }),
communalCouncilRif: z
.string()
.min(1, { message: 'RIF del Consejo Comunal es requerido' }),
communalCouncilSpokespersonName: z
.string()
.min(1, { message: 'Nombre del Vocero del Consejo Comunal es requerido' }),
communalCouncilSpokespersonCedula: z
.string()
.min(1, { message: 'Cédula del Vocero del Consejo Comunal es requerida' }),
communalCouncilSpokespersonRif: z
.string()
.min(1, { message: 'RIF del Vocero del Consejo Comunal es requerido' }),
communalCouncilSpokespersonPhone: z
.string()
.min(1, { message: 'Teléfono del Vocero del Consejo Comunal es requerido' }),
communalCouncilEmail: z
.string()
.email({ message: 'Correo electrónico del Consejo Comunal inválido' }),
ospGoogleMapsLink: z
.string()
.min(1, { message: 'Enlace de Google Maps es requerido' }),
ospRif: z.string().optional().or(z.literal('')),
ospName: z.string().min(1, { message: 'Nombre de la OSP es requerido' }),
ospAddress: z
.string()
.min(1, { message: 'Dirección de la OSP es requerida' }),
ospRif: z.string().min(1, { message: 'RIF de la OSP es requerido' }),
ospType: z.string().min(1, { message: 'Tipo de OSP es requerido' }),
companyConstitutionYear: z.coerce
.number()
.min(1900, { message: 'Año inválido' }),
currentStatus: z
.string()
.min(1, { message: 'Estatus actual es requerido' })
.default('ACTIVA'),
companyConstitutionYear: z.coerce
.number()
.min(1900, { message: 'Año inválido' }),
producerCount: z.coerce
.number()
.min(0, { message: 'Cantidad de productores requerida' }),
// productCount: z.coerce
// .number()
// .min(0, { message: 'Cantidad de productos requerida' })
// .optional(),
productDescription: z
infrastructureMt2: z.string().optional().or(z.literal('')),
hasTransport: z
.preprocess((val) => val === 'true' || val === true, z.boolean())
.optional(),
structureType: z.string().optional().or(z.literal('')),
isOpenSpace: z
.preprocess((val) => val === 'true' || val === true, z.boolean())
.optional(),
paralysisReason: z.string().optional().default(''),
//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: 'Descripción del producto es requerida' }),
prodDescriptionInternal: z
.min(1, { message: 'Dirección de la OSP es requerida' }),
ospGoogleMapsLink: z.string().optional().or(z.literal('')),
communeName: z.string().optional().or(z.literal('')),
siturCodeCommune: z.string().optional().or(z.literal('')),
communeRif: z.string().optional().or(z.literal('')),
communeSpokespersonName: z.string().optional().or(z.literal('')),
communeSpokespersonCedula: z.string().optional().or(z.literal('')),
communeSpokespersonRif: z.string().optional().or(z.literal('')),
communeSpokespersonPhone: z.string().optional().or(z.literal('')),
communeEmail: z
.string()
.min(1, { message: 'Descripción del producto es requerida' }),
installedCapacity: z
.email({ message: 'Correo electrónico de la Comuna inválido' })
.optional()
.or(z.literal('')),
communalCouncil: z
.string()
.min(1, { message: 'Capacidad instalada es requerida' }),
operationalCapacity: z
.min(1, { message: 'Consejo Comunal es requerido' }),
siturCodeCommunalCouncil: z.string().optional().or(z.literal('')),
communalCouncilRif: z.string().optional().or(z.literal('')),
communalCouncilSpokespersonName: z.string().optional().or(z.literal('')),
communalCouncilSpokespersonCedula: z.string().optional().or(z.literal('')),
communalCouncilSpokespersonRif: z.string().optional().or(z.literal('')),
communalCouncilSpokespersonPhone: z.string().optional().or(z.literal('')),
communalCouncilEmail: z
.string()
.min(1, { message: 'Capacidad operativa es requerida' }),
ospResponsibleFullname: z
.string()
.min(1, { message: 'Nombre del responsable es requerido' }),
.email({ message: 'Correo electrónico del Consejo Comunal inválido' })
.optional()
.or(z.literal('')),
//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()
.min(1, { message: 'RIF del responsable es requerido' }),
civilState: z.string().min(1, { message: 'Estado civil es requerido' }),
ospResponsiblePhone: z
.string()
.min(1, { message: 'Teléfono del responsable es requerido' }),
civilState: z.string().min(1, { message: 'Estado civil es requerido' }),
ospResponsibleEmail: z
.string()
.email({ message: 'Correo electrónico inválido' }),
familyBurden: z.coerce
.number()
.min(0, { message: 'Carga familiar requerida' }),
numberOfChildren: z.coerce
.number()
.min(0, { message: 'Número de hijos requerido' }),
ospResponsibleEmail: z
.string()
.email({ message: 'Correo electrónico inválido' }),
//Datos adicionales
generalObservations: z.string().optional().default(''),
photo1: z.string().optional().nullable(),
photo2: z.string().optional().nullable(),
photo3: z.string().optional().nullable(),
//IMAGENES
files: z.any().optional(),
paralysisReason: z.string().optional().default(''),
//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(),
coorPhone: z.string().optional().nullable(),
ecoSector: z.string().min(1, { message: 'Sector económico es requerido' }),
productiveSector: z.string().min(1, { message: 'Sector productivo es requerido' }),
centralProductiveActivity: z.string().min(1, { message: 'Actividad productiva central es requerida' }),
mainProductiveActivity: z.string().min(1, { message: 'Actividad productiva principal es requerida' }),
typesOfEquipment: z.string().min(1, { message: 'Tipo de equipo es requerido' }),
equipmentCount: z.coerce.number().min(0, { message: 'Cantidad de equipo requerida' }),
equipmentDescription: z.string().min(1, { message: 'Descripción del equipo es requerida' }),
rawMaterial: z.string().min(1, { message: 'Material bruto es requerido' }),
materialType: z.string().min(1, { message: 'Tipo de material es requerido' }),
rawMaterialCount: z.coerce.number().min(0, { message: 'Cantidad de material bruto requerida' }),
productCountDaily: z.coerce.number().min(0, { message: 'Cantidad diaria de productos requerida' }),
productCountWeekly: z.coerce.number().min(0, { message: 'Cantidad semanal de productos requerida' }),
productCountMonthly: z.coerce.number().min(0, { message: 'Cantidad mensual de productos requerida' }),
internalCount: z.coerce.number().min(0, { message: 'Cantidad interna requerida' }),
externalCount: z.coerce.number().min(0, { message: 'Cantidad externa requerida' }),
prodDescriptionExternal: z.string().min(1, { message: 'Descripción del producto es requerida' }),
country: z.string().min(1, { message: 'País es requerido' }),
city: z.string().min(1, { message: 'Ciudad es requerida' }),
menCount: z.coerce.number().min(0, { message: 'Cantidad de hombres requerida' }),
womenCount: z.coerce.number().min(0, { message: 'Cantidad de mujeres requerida' }),
photo1: z.string().optional().nullable(),
photo2: z.string().optional().nullable(),
photo3: z.string().optional().nullable(),
});
export type TrainingSchema = z.infer<typeof trainingSchema>;