'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@repo/shadcn/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@repo/shadcn/form'; import { Input } from '@repo/shadcn/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@repo/shadcn/select'; import { Textarea } from '@repo/shadcn/textarea'; import { useForm } from 'react-hook-form'; import { useCreateTraining, useUpdateTraining } from '../hooks/use-training'; import { TrainingSchema, trainingSchema } from '../schemas/training'; import { useMunicipalityQuery, useParishQuery, useStateQuery, } from '@/feactures/location/hooks/use-query-location'; import { Card, CardContent, CardHeader, CardTitle, } from '@repo/shadcn/components/ui/card'; import { SelectSearchable } from '@repo/shadcn/select-searchable'; import React from 'react'; const PRODUCTIVE_ACTIVITIES = [ 'Agricola', 'Textil', 'Bloquera', 'Carpinteria', 'Unidad de suministro', ]; const OSP_TYPES = ['COOPERATIVA', 'EPSIC', 'EPSDC', 'UPF', 'OTROS']; const STATUS_OPTIONS = ['ACTIVA', 'INACTIVA']; const CIVIL_STATE_OPTIONS = ['Soltero', 'Casado']; interface CreateTrainingFormProps { onSuccess?: () => void; onCancel?: () => void; defaultValues?: Partial; } export function CreateTrainingForm({ onSuccess, onCancel, defaultValues, }: CreateTrainingFormProps) { const { mutate: createTraining, isPending: isCreating } = useCreateTraining(); const { mutate: updateTraining, isPending: isUpdating } = useUpdateTraining(); const isSaving = isCreating || isUpdating; const [state, setState] = React.useState(0); const [municipality, setMunicipality] = React.useState(0); const [disabledMunicipality, setDisabledMunicipality] = React.useState(true); const [disabledParish, setDisabledParish] = React.useState(true); const [selectedFiles, setSelectedFiles] = React.useState([]); const { data: dataState } = useStateQuery(); const { data: dataMunicipality } = useMunicipalityQuery(state); const { data: dataParish } = useParishQuery(municipality); const stateOptions = dataState?.data || [{ id: 0, name: 'Sin estados' }]; const municipalityOptions = Array.isArray(dataMunicipality?.data) && dataMunicipality.data.length > 0 ? dataMunicipality.data : [{ id: 0, stateId: 0, name: 'Sin Municipios' }]; // const parishOptions = dataParish?.data || [{id:0,municipalityId:0,name:'Sin Parroquias'}] const parishOptions = Array.isArray(dataParish?.data) && dataParish.data.length > 0 ? dataParish.data : [{ id: 0, stateId: 0, name: 'Sin Parroquias' }]; // No local state needed for existing photos, we use form values React.useEffect(() => { if (defaultValues) { if (defaultValues.state) { setState(Number(defaultValues.state)); setDisabledMunicipality(false); } if (defaultValues.municipality) { setMunicipality(Number(defaultValues.municipality)); setDisabledParish(false); } } }, [defaultValues]); const formatToLocalISO = (dateStr?: string | Date) => { const date = dateStr ? new Date(dateStr) : new Date(); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); return `${year}-${month}-${day}T${hours}:${minutes}`; }; const form = useForm({ resolver: zodResolver(trainingSchema), defaultValues: { firstname: defaultValues?.firstname || '', lastname: defaultValues?.lastname || '', visitDate: formatToLocalISO(defaultValues?.visitDate), productiveActivity: defaultValues?.productiveActivity || '', financialRequirementDescription: defaultValues?.financialRequirementDescription || '', siturCodeCommune: defaultValues?.siturCodeCommune || '', communalCouncil: defaultValues?.communalCouncil || '', siturCodeCommunalCouncil: defaultValues?.siturCodeCommunalCouncil || '', ospName: defaultValues?.ospName || '', ospAddress: defaultValues?.ospAddress || '', ospRif: defaultValues?.ospRif || '', ospType: defaultValues?.ospType || '', currentStatus: defaultValues?.currentStatus || 'ACTIVA', companyConstitutionYear: defaultValues?.companyConstitutionYear || new Date().getFullYear(), producerCount: defaultValues?.producerCount || 0, productCount: defaultValues?.productCount || 0, productDescription: defaultValues?.productDescription || '', installedCapacity: defaultValues?.installedCapacity || '', operationalCapacity: defaultValues?.operationalCapacity || '', ospResponsibleFullname: defaultValues?.ospResponsibleFullname || '', ospResponsibleCedula: defaultValues?.ospResponsibleCedula || '', ospResponsibleRif: defaultValues?.ospResponsibleRif || '', ospResponsiblePhone: defaultValues?.ospResponsiblePhone || '', civilState: defaultValues?.civilState || '', familyBurden: defaultValues?.familyBurden || 0, numberOfChildren: defaultValues?.numberOfChildren || 0, generalObservations: defaultValues?.generalObservations || '', ospResponsibleEmail: defaultValues?.ospResponsibleEmail || '', photo1: defaultValues?.photo1 || '', photo2: defaultValues?.photo2 || '', photo3: defaultValues?.photo3 || '', paralysisReason: defaultValues?.paralysisReason || '', state: defaultValues?.state || undefined, municipality: defaultValues?.municipality || undefined, parish: defaultValues?.parish || undefined, }, mode: 'onChange', }); const onSubmit = async (formData: TrainingSchema) => { const data = new FormData(); Object.entries(formData).forEach(([key, value]) => { if (key !== 'files' && value !== undefined && value !== null) { data.append(key, value.toString()); } }); if (defaultValues?.id) { data.append('id', defaultValues.id.toString()); } selectedFiles.forEach((file) => { data.append('files', file); }); const mutation = defaultValues?.id ? updateTraining : createTraining; mutation(data as any, { onSuccess: () => { form.reset(); setSelectedFiles([]); onSuccess?.(); }, onError: (e) => { console.error(e); form.setError('root', { type: 'manual', message: 'Error al guardar el registro', }); }, }); }; return ( <>

Formulario de Registro de Organizaciones Socioproductivas

Complete el Formulario para guardar la organización

{form.formState.errors.root && (
{form.formState.errors.root.message}
)} {/* 1. Datos de la visita */} 1. Datos de la visita ( Nombre del Coordinador Estadal )} /> ( Apellido del coordinador Estadal )} /> ( Fecha y hora de la visita )} /> {/* 2. Datos de la OSP */} 2. Datos de la Organización Socioproductiva (OSP) ( Tipos de Organización )} /> ( RIF de la OSP )} /> ( Nombre de la Organización )} /> ( Actividad Productiva )} /> ( Año de constitución )} /> ( Cantidad de Productos )} /> ( Estatus )} /> ( Breve descripción del producto o servicio