"use client" import type React from "react" import { useState } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Switch } from "@/components/ui/switch" import { Badge } from "@/components/ui/badge" import { Checkbox } from "@/components/ui/checkbox" import { Plus, X, Upload, FileText, Scale, BookOpen, Gavel, FolderOpen, AlertCircle, ArrowLeft } from "lucide-react" import { RichTextEditor } from "@/components/rich-text-editor" import { MarkdownEditor } from "./markdown-editor" import { useCatalogos } from "@/hooks/use-catalogos" // Tipos type FormaJuridica = "SA" | "SRL" | "SAS" | "Monotributo" | "Responsable Inscripto" type TipoJurisdiccion = "nacion" | "provincia" | "municipio" type TipoRealizacion = "virtual" | "presencial" | "mixto" type TipoAdjunto = "modelo" | "normativa" | "bibliografia" | "jurisprudencia" | "interno" type Moneda = "ARS" | "USD" | "EUR" type EstadoTramite = "En proceso" | "Completado" | "Cancelado" interface Costo { id: string descripcion: string monto: string moneda: Moneda observacion: string } interface Adjunto { id: string tipo: TipoAdjunto titulo: string archivo?: File } interface FormData { fechaRealizacion: string | number | readonly string[] | undefined // Datos base nombre: string formaJuridicaId: number | "" tipoJurisdiccion: TipoJurisdiccion | "" jurisdiccionId: number | "" organismoId: number | "" tipoRealizacion: TipoRealizacion | "" linkGuia: string // Estado del trámite estado: EstadoTramite | "" // Contenido documentacion: string requiereCertificaciones: boolean certificacionesDetalle: string pasoAPaso: string // Costos costos: Costo[] // Comentarios comentariosInternos: string // Adjuntos // Adjuntos adjuntos: Adjunto[] // Formas Jurídicas múltiples formasJuridicasMultiples?: number[] // Organismos múltiples organismosMultiples?: number[] created_at?: string fechaAlta?: string } interface TramiteFormProps { onSubmit: (data: FormData) => void onCancel: () => void initialData?: Partial isEditMode?: boolean isSubmitting?: boolean } const tiposAdjuntoLabels: Record = { modelo: { label: "Modelo", icon: FileText }, normativa: { label: "Normativa", icon: Scale }, bibliografia: { label: "Bibliografía", icon: BookOpen }, jurisprudencia: { label: "Jurisprudencia", icon: Gavel }, interno: { label: "Interno", icon: FolderOpen }, } export function TramiteForm({ onSubmit, onCancel, initialData, isEditMode = false, isSubmitting = false, }: TramiteFormProps) { const { catalogos, isLoading } = useCatalogos() const [formasJuridicasSeleccionadas, setFormasJuridicasSeleccionadas] = useState( initialData?.formasJuridicasMultiples ? initialData.formasJuridicasMultiples : initialData?.formaJuridicaId ? [initialData.formaJuridicaId as number] : [], ) const [organismosSeleccionados, setOrganismosSeleccionados] = useState( initialData?.organismosMultiples ? initialData.organismosMultiples : initialData?.organismoId ? [initialData.organismoId as number] : [], ) const [formData, setFormData] = useState({ nombre: "", formaJuridicaId: "", tipoJurisdiccion: "", fechaRealizacion: "", jurisdiccionId: "", organismoId: "", tipoRealizacion: "", linkGuia: "", estado: initialData?.estado || "En proceso", documentacion: "", requiereCertificaciones: false, certificacionesDetalle: "", pasoAPaso: "", costos: [], comentariosInternos: "", adjuntos: [], fechaAlta: initialData?.created_at ? new Date(initialData.created_at).toISOString().split("T")[0] : new Date().toISOString().split("T")[0], ...initialData, }) const [errors, setErrors] = useState>({}) const [isDragging, setIsDragging] = useState(false) // Validación simple const validateForm = (): boolean => { const newErrors: Record = {} if (!formData.nombre.trim()) newErrors.nombre = "El nombre es requerido" // Validate formas juridicas (same logic for both create and edit modes) if (formasJuridicasSeleccionadas.length === 0) { newErrors.formaJuridica = "Debe seleccionar al menos una persona jurídica" } if (organismosSeleccionados.length === 0) { newErrors.organismo = "Debe seleccionar al menos un organismo" } if (!formData.tipoJurisdiccion) newErrors.tipoJurisdiccion = "La jurisdicción es requerida" if ( (formData.tipoJurisdiccion === "provincia" || formData.tipoJurisdiccion === "municipio") && !formData.jurisdiccionId ) { newErrors.jurisdiccionId = "El detalle de jurisdicción es requerido" } if (!formData.tipoRealizacion) newErrors.tipoRealizacion = "El tipo de realización es requerido" if (!formData.estado) newErrors.estado = "El estado es requerido" setErrors(newErrors) return Object.keys(newErrors).length === 0 } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (validateForm()) { onSubmit({ ...formData, formasJuridicasMultiples: formasJuridicasSeleccionadas, organismosMultiples: organismosSeleccionados, formaJuridicaId: isEditMode ? formData.formaJuridicaId : formasJuridicasSeleccionadas.length === 1 ? formasJuridicasSeleccionadas[0] : "", organismoId: organismosSeleccionados.length === 1 ? organismosSeleccionados[0] : "", created_at: formData.fechaAlta, } as any) } } // Handlers para costos const agregarCosto = () => { const nuevoCosto: Costo = { id: Date.now().toString(), descripcion: "", monto: "", moneda: "ARS", observacion: "", } setFormData({ ...formData, costos: [...formData.costos, nuevoCosto] }) } const actualizarCosto = (id: string, campo: keyof Costo, valor: string) => { setFormData({ ...formData, costos: formData.costos.map((costo) => (costo.id === id ? { ...costo, [campo]: valor } : costo)), }) } const eliminarCosto = (id: string) => { setFormData({ ...formData, costos: formData.costos.filter((costo) => costo.id !== id), }) } // Handlers para adjuntos const agregarAdjunto = (tipo: TipoAdjunto, titulo: string, archivo?: File) => { const nuevoAdjunto: Adjunto = { id: Date.now().toString(), tipo, titulo, archivo, } setFormData({ ...formData, adjuntos: [...formData.adjuntos, nuevoAdjunto] }) } const eliminarAdjunto = (id: string) => { setFormData({ ...formData, adjuntos: formData.adjuntos.filter((adjunto) => adjunto.id !== id), }) } const handleDragOver = (e: React.DragEvent) => { e.preventDefault() setIsDragging(true) } const handleDragLeave = () => { setIsDragging(false) } const handleDrop = (e: React.DragEvent) => { e.preventDefault() setIsDragging(false) const files = Array.from(e.dataTransfer.files) files.forEach((file) => { agregarAdjunto("interno", file.name, file) }) } const handleFileInput = (e: React.ChangeEvent) => { const files = Array.from(e.target.files || []) files.forEach((file) => { agregarAdjunto("interno", file.name, file) }) } const toggleFormaJuridica = (id: number) => { setFormasJuridicasSeleccionadas((prev) => { if (prev.includes(id)) { return prev.filter((f) => f !== id) } else { return [...prev, id] } }) setErrors({ ...errors, formaJuridica: "" }) } const toggleOrganismo = (id: number) => { setOrganismosSeleccionados((prev) => { if (prev.includes(id)) { return prev.filter((o) => o !== id) } else { return [...prev, id] } }) setErrors({ ...errors, organismo: "" }) } const jurisdiccionesFiltradas = catalogos.jurisdicciones.filter((j) => j.tipo === formData.tipoJurisdiccion) if (isLoading) { return
Cargando catálogos...
} return (
{/* Encabezado */}

{initialData ? "Editar Trámite" : "Nuevo Trámite"}

Complete la información del trámite

{/* Sección 1: Datos Base */} Datos Base Información general del trámite {/* Nombre */}
setFormData({ ...formData, nombre: e.target.value })} className={errors.nombre ? "border-destructive" : ""} /> {errors.nombre && (

{errors.nombre}

)}
{/* Checkboxes múltiples para ambos modos */}
{catalogos.formas_juridicas.map((fj) => (
toggleFormaJuridica(fj.id)} />
))}
{errors.formaJuridica && (

{errors.formaJuridica}

)} {!isEditMode && formasJuridicasSeleccionadas.length > 0 && (
{formasJuridicasSeleccionadas.map((id) => { const fj = catalogos.formas_juridicas.find((f) => f.id === id) return ( {fj?.nombre} ) })}
)}
{catalogos.organismos.map((org) => (
toggleOrganismo(org.id)} />
))}
{errors.organismo && (

{errors.organismo}

)} {organismosSeleccionados.length > 0 && (
{organismosSeleccionados.map((id) => { const org = catalogos.organismos.find((o) => o.id === id) return ( {org?.nombre} ) })}
)}
{/* Jurisdicción */}
{errors.tipoJurisdiccion && (

{errors.tipoJurisdiccion}

)}
{/* Detalle Jurisdicción */}
{errors.jurisdiccionId && (

{errors.jurisdiccionId}

)}
{/* Fecha de Realización y Fecha de Alta */}
setFormData({ ...formData, fechaRealizacion: e.target.value })} />
{/* Fecha de Alta (Solo lectura en edición, editable en creación) */}
setFormData({ ...formData, fechaAlta: e.target.value })} disabled={isEditMode} // Solo editable al crear /> {isEditMode && (

La fecha de carga no se puede modificar una vez creada.

)}
{/* Tipo de Realización */}
{errors.tipoRealizacion && (

{errors.tipoRealizacion}

)}
{/* Link a Guía Oficial */}
setFormData({ ...formData, linkGuia: e.target.value })} />
{/* Estado */}
{errors.estado && (

{errors.estado}

)}
{/* Sección 2: Contenido */} Contenido Detalles del procedimiento y requisitos {/* Documentación/Requisitos - Ahora con Rich Text Editor */}
setFormData({ ...formData, documentacion: value })} placeholder="Describa la documentación necesaria y requisitos..." minHeight="200px" />
{/* Certificaciones Externas */}
setFormData({ ...formData, requiereCertificaciones: checked, certificacionesDetalle: checked ? formData.certificacionesDetalle : "", }) } />
{formData.requiereCertificaciones && (