"use client" import { useState, useEffect, useCallback } from "react" import { useRouter } from "next/navigation" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Card } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Checkbox } from "@/components/ui/checkbox" import { Label } from "@/components/ui/label" import { Search, Plus, Eye, ChevronLeft, ChevronRight, X, Loader2, Archive, Info } from "lucide-react" import { Alert, AlertDescription } from "@/components/ui/alert" import { useCatalogos } from "@/hooks/use-catalogos" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" // Tipos de datos type EstadoTramite = "En proceso" | "Completado" | "Cancelado" interface Tramite { id: number nombre: string forma_juridica: { id: number; nombre: string } formas_juridicas?: { id: number; nombre: string }[] organismos: { id: number; nombre: string }[] jurisdiccion: { id: number; nombre: string; tipo: string } updated_at: string estado: EstadoTramite deleted_at?: string | null } interface PaginationMeta { current_page: number last_page: number total: number } export function TramitesListado() { const router = useRouter() const { catalogos, isLoading: isLoadingCatalogos } = useCatalogos() // Filtros const [formaJuridicaId, setFormaJuridicaId] = useState("") const [organismoId, setOrganismoId] = useState("") const [tipoJurisdiccion, setTipoJurisdiccion] = useState("") const [jurisdiccionId, setJurisdiccionId] = useState("") const [searchQuery, setSearchQuery] = useState("") const [incluirArchivados, setIncluirArchivados] = useState(false) // Data & Pagination const [tramites, setTramites] = useState([]) const [isLoading, setIsLoading] = useState(true) const [meta, setMeta] = useState(null) const [currentPage, setCurrentPage] = useState(1) const fetchTramites = useCallback(async () => { try { setIsLoading(true) const token = localStorage.getItem("token") if (!token) return const params = new URLSearchParams() params.append("page", currentPage.toString()) if (searchQuery) params.append("q", searchQuery) if (formaJuridicaId) params.append("forma_juridica_id", formaJuridicaId) if (organismoId) params.append("organismo_id", organismoId) if (jurisdiccionId) params.append("jurisdiccion_id", jurisdiccionId) if (incluirArchivados) params.append("incluir_archivados", "true") // Note: filtering by tipoJurisdiccion is handled by filtering the jurisdiction dropdown, // but if we wanted to filter by type in backend we'd need to implement it there too. // For now, we rely on the specific jurisdiccion_id being sent. const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/tramites?${params.toString()}`, { headers: { Authorization: `Bearer ${token}`, Accept: "application/json", }, }) if (!response.ok) throw new Error("Error al cargar trámites") const data = await response.json() setTramites(data.data) setMeta(data.meta) } catch (error) { console.error(error) } finally { setIsLoading(false) } }, [currentPage, searchQuery, formaJuridicaId, organismoId, jurisdiccionId, incluirArchivados]) useEffect(() => { fetchTramites() }, [fetchTramites]) const limpiarFiltros = () => { setFormaJuridicaId("") setOrganismoId("") setTipoJurisdiccion("") setJurisdiccionId("") setSearchQuery("") setCurrentPage(1) } // Filtrar jurisdicciones para el dropdown dependiente const jurisdiccionesFiltradas = catalogos.jurisdicciones.filter( (j) => !tipoJurisdiccion || j.tipo === tipoJurisdiccion, ) const getEstadoBadge = (estado: EstadoTramite) => { const variants: Record = { "En proceso": { variant: "default", label: "En proceso" }, Completado: { variant: "outline", label: "Completado" }, Cancelado: { variant: "destructive", label: "Cancelado" }, } return variants[estado] || { variant: "secondary", label: estado } } return (
{/* Encabezado */}

Gestión de Trámites

Administre y realice seguimiento de todos los trámites

{/* Filtros */}

Filtros

La lista de Jurisdicciones se actualizará según el{" "} Tipo de Jurisdicción seleccionado.
{/* Forma Jurídica */}
{/* Organismo */}
{/* Tipo Jurisdicción */}
{/* Detalle Jurisdicción */}
{/* Buscador */}
{ setSearchQuery(e.target.value) setCurrentPage(1) }} className="bg-background pl-9" />
{/* Filtro Archivados */}
{ setIncluirArchivados(checked === true) setCurrentPage(1) }} />
{/* Tabla */} Nombre Forma Jurídica Organismo Jurisdicción Última Actualización Estado Acciones {isLoading ? (
Cargando trámites...
) : tramites.length === 0 ? ( No se encontraron trámites con los filtros seleccionados. ) : ( tramites.map((tramite) => { const estadoBadge = getEstadoBadge(tramite.estado) const formasJuridicasText = tramite.formas_juridicas && tramite.formas_juridicas.length > 0 ? tramite.formas_juridicas.map((fj) => fj.nombre).join(", ") : tramite.forma_juridica?.nombre const organismosText = tramite.organismos?.map((o) => o.nombre).join(", ") return (
router.push(`/tramite/${tramite.id}`)} > {tramite.nombre}

{tramite.nombre}

{formasJuridicasText}

{formasJuridicasText}

{organismosText}

{organismosText}

{tramite.jurisdiccion?.nombre}

{tramite.jurisdiccion?.nombre}

{new Date(tramite.updated_at).toLocaleDateString("es-AR")}
{estadoBadge.label} {tramite.deleted_at && ( Archivado )}
) }) )}
{/* Paginación */} {meta && (
Mostrando {meta.current_page * 15 - 14} a {Math.min(meta.current_page * 15, meta.total)} de {meta.total}{" "} trámites
Página {meta.current_page} de {meta.last_page}
)}
) }