"use client" import { useState } from "react" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { ArrowLeft, Printer, Plus, Minus, Calendar, DollarSign, FileText, AlertCircle, ExternalLink, MessageSquare, } from "lucide-react" // Tipos interface TramiteVersion { id: string versionNro: string nombre: string formaJuridica: string organismo: string jurisdiccion: string fechaRealizacion: string documentacion: string requiereCertificaciones: boolean certificacionesDetalle: string pasoAPaso: string costos: Array<{ descripcion: string monto: string moneda: string observacion: string }> comentariosInternos: string linkGuia: string dondeSeRealiza: string adjuntos: Array<{ id: string tipo: string titulo: string }> } interface VersionOption { id: string versionNro: string fecha: string } interface CompararVersionesProps { versionActual: TramiteVersion versionesDisponibles: VersionOption[] versionComparar?: TramiteVersion onVersionChange?: (versionId: string) => void onVolver?: () => void onImprimir?: () => void } // Datos de ejemplo const versionActualEjemplo: TramiteVersion = { id: "v3", versionNro: "3.0", nombre: "Inscripción AFIP - Responsable Inscripto", formaJuridica: "SRL", organismo: "AFIP", jurisdiccion: "Nación", fechaRealizacion: "2024-01-10", documentacion: `**Documentación requerida:** - DNI del representante legal - Estatuto social actualizado - Constancia de inscripción en IGJ - Comprobante de domicilio fiscal - Formulario 460/F completo - Certificado de habilitación municipal **Requisitos adicionales:** - Clave fiscal nivel 3 o superior - Domicilio fiscal habilitado`, requiereCertificaciones: true, certificacionesDetalle: "Certificación de firma por escribano público para el representante legal", pasoAPaso: `**Procedimiento paso a paso:** 1. Ingresar a [AFIP con Clave Fiscal](https://auth.afip.gob.ar) 2. Seleccionar "Sistema Registral" → "Registro Tributario" 3. Completar Formulario 460/F con los datos de la sociedad 4. Adjuntar documentación digitalizada 5. Enviar solicitud y aguardar número de trámite 6. Descargar constancia de inicio de trámite 7. Aguardar resolución (5-10 días hábiles) 8. Descargar constancia de inscripción definitiva 9. Verificar datos en el sistema`, costos: [ { descripcion: "Tasa administrativa AFIP", monto: "15000", moneda: "ARS", observacion: "Pago único al momento de inscripción", }, { descripcion: "Certificación escribano", monto: "25000", moneda: "ARS", observacion: "Varía según escribanía", }, { descripcion: "Tasa municipal", monto: "8000", moneda: "ARS", observacion: "Solo para CABA", }, ], comentariosInternos: "Recordar que el trámite puede demorar más en época de vencimientos. Verificar siempre que el domicilio fiscal esté habilitado antes de iniciar. Actualizado con nuevos requisitos 2024.", linkGuia: "https://www.afip.gob.ar/genericos/guiavirtual/inscripcion_2024.asp", dondeSeRealiza: "Virtual", adjuntos: [ { id: "1", tipo: "Modelo", titulo: "Formulario 460F - Modelo completo.pdf" }, { id: "2", tipo: "Normativa", titulo: "RG AFIP 4120 - Inscripción RI.pdf" }, { id: "3", tipo: "Interno", titulo: "Checklist interno - Inscripción AFIP.xlsx" }, { id: "4", tipo: "Normativa", titulo: "RG AFIP 5250 - Actualización 2024.pdf" }, ], } const versionAnteriorEjemplo: TramiteVersion = { id: "v2", versionNro: "2.0", nombre: "Inscripción AFIP - Responsable Inscripto", formaJuridica: "SRL", organismo: "AFIP", jurisdiccion: "Nación", fechaRealizacion: "2023-11-10", documentacion: `**Documentación requerida:** - DNI del representante legal - Estatuto social actualizado - Constancia de inscripción en IGJ - Comprobante de domicilio fiscal - Formulario 460/F completo **Requisitos adicionales:** - Clave fiscal nivel 3 o superior - Domicilio fiscal habilitado`, requiereCertificaciones: true, certificacionesDetalle: "Certificación de firma por escribano público para el representante legal", pasoAPaso: `**Procedimiento paso a paso:** 1. Ingresar a [AFIP con Clave Fiscal](https://auth.afip.gob.ar) 2. Seleccionar "Sistema Registral" → "Registro Tributario" 3. Completar Formulario 460/F con los datos de la sociedad 4. Adjuntar documentación digitalizada 5. Enviar solicitud y aguardar número de trámite 6. Descargar constancia de inicio de trámite 7. Aguardar resolución (5-10 días hábiles) 8. Descargar constancia de inscripción definitiva`, costos: [ { descripcion: "Tasa administrativa AFIP", monto: "12000", moneda: "ARS", observacion: "Pago único al momento de inscripción", }, { descripcion: "Certificación escribano", monto: "20000", moneda: "ARS", observacion: "Varía según escribanía", }, ], comentariosInternos: "Recordar que el trámite puede demorar más en época de vencimientos. Verificar siempre que el domicilio fiscal esté habilitado antes de iniciar.", linkGuia: "https://www.afip.gob.ar/genericos/guiavirtual/", dondeSeRealiza: "Virtual", adjuntos: [ { id: "1", tipo: "Modelo", titulo: "Formulario 460F - Modelo completo.pdf" }, { id: "2", tipo: "Normativa", titulo: "RG AFIP 4120 - Inscripción RI.pdf" }, { id: "3", tipo: "Interno", titulo: "Checklist interno - Inscripción AFIP.xlsx" }, ], } const versionesDisponiblesEjemplo: VersionOption[] = [ { id: "v2", versionNro: "2.0", fecha: "2023-11-10" }, { id: "v1", versionNro: "1.0", fecha: "2023-06-15" }, ] // Función para detectar diferencias en texto function detectarDiferenciasTexto(textoAnterior: string, textoActual: string) { const lineasAnteriores = textoAnterior.split("\n") const lineasActuales = textoActual.split("\n") const resultado = { anterior: [] as Array<{ texto: string; tipo: "igual" | "eliminado" | "modificado" }>, actual: [] as Array<{ texto: string; tipo: "igual" | "agregado" | "modificado" }>, } const maxLineas = Math.max(lineasAnteriores.length, lineasActuales.length) for (let i = 0; i < maxLineas; i++) { const lineaAnterior = lineasAnteriores[i] || "" const lineaActual = lineasActuales[i] || "" if (lineaAnterior === lineaActual) { resultado.anterior.push({ texto: lineaAnterior, tipo: "igual" }) resultado.actual.push({ texto: lineaActual, tipo: "igual" }) } else if (!lineaActual && lineaAnterior) { resultado.anterior.push({ texto: lineaAnterior, tipo: "eliminado" }) } else if (!lineaAnterior && lineaActual) { resultado.actual.push({ texto: lineaActual, tipo: "agregado" }) } else { resultado.anterior.push({ texto: lineaAnterior, tipo: "modificado" }) resultado.actual.push({ texto: lineaActual, tipo: "modificado" }) } } return resultado } // Componente para mostrar texto con diferencias function TextoDiferencias({ lineas, }: { lineas: Array<{ texto: string; tipo: "igual" | "eliminado" | "agregado" | "modificado" }> }) { return (
{lineas.map((linea, index) => (
{linea.tipo === "eliminado" && } {linea.tipo === "agregado" && } {linea.texto || " "}
))}
) } export function CompararVersiones({ versionActual = versionActualEjemplo, versionesDisponibles = versionesDisponiblesEjemplo, versionComparar = versionAnteriorEjemplo, onVersionChange, onVolver, onImprimir, }: CompararVersionesProps) { const [versionSeleccionada, setVersionSeleccionada] = useState(versionComparar.id) const handleVersionChange = (versionId: string) => { setVersionSeleccionada(versionId) console.log("[v0] Cambiando versión a comparar:", versionId) if (onVersionChange) { onVersionChange(versionId) } } const handleVolver = () => { console.log("[v0] Volviendo al trámite") if (onVolver) { onVolver() } } const handleImprimir = () => { console.log("[v0] Imprimiendo comparación") if (onImprimir) { onImprimir() } window.print() } // Detectar diferencias const difDocumentacion = detectarDiferenciasTexto(versionComparar.documentacion, versionActual.documentacion) const difPasoAPaso = detectarDiferenciasTexto(versionComparar.pasoAPaso, versionActual.pasoAPaso) const difComentarios = detectarDiferenciasTexto( versionComparar.comentariosInternos, versionActual.comentariosInternos, ) // Detectar diferencias en costos const costosAnteriores = versionComparar.costos.map((c) => c.descripcion) const costosActuales = versionActual.costos.map((c) => c.descripcion) const costosEliminados = versionComparar.costos.filter((c) => !costosActuales.includes(c.descripcion)) const costosAgregados = versionActual.costos.filter((c) => !costosAnteriores.includes(c.descripcion)) const costosComunes = versionActual.costos.filter((c) => costosAnteriores.includes(c.descripcion)) // Detectar diferencias en adjuntos const adjuntosAnteriores = versionComparar.adjuntos.map((a) => a.titulo) const adjuntosActuales = versionActual.adjuntos.map((a) => a.titulo) const adjuntosEliminados = versionComparar.adjuntos.filter((a) => !adjuntosActuales.includes(a.titulo)) const adjuntosAgregados = versionActual.adjuntos.filter((a) => !adjuntosAnteriores.includes(a.titulo)) const adjuntosComunes = versionActual.adjuntos.filter((a) => adjuntosAnteriores.includes(a.titulo)) return (
{/* Header con barra de selección */}

Comparación de Versiones

{versionActual.nombre}

{/* Contenido comparativo */}
{/* Headers de columnas */}

Versión {versionComparar.versionNro}

Versión anterior

{new Date(versionComparar.fechaRealizacion).toLocaleDateString("es-AR")}

Versión {versionActual.versionNro}

Versión actual

{new Date(versionActual.fechaRealizacion).toLocaleDateString("es-AR")}
{/* Información General */}
Información General

{versionComparar.dondeSeRealiza}

{versionComparar.requiereCertificaciones && (

{versionComparar.certificacionesDetalle}

)}
Información General

{versionActual.dondeSeRealiza}

{versionActual.requiereCertificaciones && (

{versionActual.certificacionesDetalle}

)}
{/* Documentación y Requisitos */}
Documentación y Requisitos
Documentación y Requisitos
{/* Paso a Paso */}
Paso a Paso
Paso a Paso
{/* Costos */}
Costos
{/* Costos eliminados */} {costosEliminados.map((costo, index) => (

{costo.descripcion}

{costo.moneda} ${Number(costo.monto).toLocaleString("es-AR")}

{costo.observacion && (

{costo.observacion}

)}
))} {/* Costos comunes */} {costosComunes.map((costoActual, index) => { const costoAnterior = versionComparar.costos.find((c) => c.descripcion === costoActual.descripcion) const montosCambiaron = costoAnterior && costoAnterior.monto !== costoActual.monto return (

{costoAnterior?.descripcion}

{costoAnterior?.moneda} ${Number(costoAnterior?.monto).toLocaleString("es-AR")}

{costoAnterior?.observacion && (

{costoAnterior.observacion}

)}
) })}
Costos
{/* Costos comunes */} {costosComunes.map((costoActual, index) => { const costoAnterior = versionComparar.costos.find((c) => c.descripcion === costoActual.descripcion) const montosCambiaron = costoAnterior && costoAnterior.monto !== costoActual.monto return (

{costoActual.descripcion}

{costoActual.moneda} ${Number(costoActual.monto).toLocaleString("es-AR")}

{costoActual.observacion && (

{costoActual.observacion}

)}
) })} {/* Costos agregados */} {costosAgregados.map((costo, index) => (

{costo.descripcion}

{costo.moneda} ${Number(costo.monto).toLocaleString("es-AR")}

{costo.observacion && (

{costo.observacion}

)}
))}
{/* Adjuntos */}
Adjuntos ({versionComparar.adjuntos.length})
{/* Adjuntos eliminados */} {adjuntosEliminados.map((adjunto) => (

{adjunto.titulo}

{adjunto.tipo}
))} {/* Adjuntos comunes */} {adjuntosComunes.map((adjunto) => (

{adjunto.titulo}

{adjunto.tipo}
))}
Adjuntos ({versionActual.adjuntos.length})
{/* Adjuntos comunes */} {adjuntosComunes.map((adjunto) => (

{adjunto.titulo}

{adjunto.tipo}
))} {/* Adjuntos agregados */} {adjuntosAgregados.map((adjunto) => (

{adjunto.titulo}

{adjunto.tipo}
))}
{/* Comentarios Internos */}
Comentarios Internos
Comentarios Internos
) }