"use client"; import { useSearchParams } from "next/navigation"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import axios from "axios"; import Cookies from "js-cookie"; import toast from "react-hot-toast"; import { SO_POR_EQUIPO } from "@/data/so_por_equipo"; import { PROCESADORES_POR_EQUIPO } from "@/data/procesadores"; import "../app/styles/layout/agregarEquipo.scss"; import "./editar.css"; export default function Editar() { const searchParams = useSearchParams(); const inventario = searchParams.get("equipoId"); const router = useRouter(); const [formData, setFormData] = useState({ inventario: "", serie: "", modelo: "", id_tipo_equipo: 0, id_marca: 0, id_estado: 0, id_uso: 0, id_adscripcion: 0, id_sistema_operativo: 0, id_procesador: 0, lugar: "", observaciones: "", responsable: "", id_periferico: 0, id_laboratorio: 0, id_proyecto: 0, fechaMovimiento: "", }); interface TipoUso { id_uso: number; tipo_uso: string; } interface Estado { id_estado: number; estado: string; } interface TipoEquipo { id_tipo_de_equipo: number; tipo_equipo: string; } interface SistemaOperativo { id_sistema_operativo: number; sistema_operativo: string; } interface Procesador { id_procesador: number; procesador: string; } interface Marca { id_marca: number; marca: string; } interface Adscripcion { id_adscripcion: number; adscripcion: string; } interface Perifericos { id_periferico: number; periferico: string; } interface Laboratorio { id_laboratorio: number; laboratorio: string; } interface Proyecto { id_proyecto: number; proyecto: string; } const [tiposUso, setTiposUso] = useState([]); const [marcas, setMarcas] = useState([]); const [estados, setEstados] = useState([]); const [adscripciones, setAdscripciones] = useState([]); const [tiposEquipo, setTiposEquipo] = useState([]); const [laboratorios, setLaboratorios] = useState([]); const [proyectos, setProyectos] = useState([]); const [sistemasOperativos, setSistemasOperativos] = useState< SistemaOperativo[] >([]); const [procesadores, setProcesadores] = useState([]); const [perifericos, setPerifericos] = useState([]); const [adscripcionLabel, setAdscripcionLabel] = useState(""); const [id, setId] = useState(0); const [suggestions, setSuggestions] = useState({ adscripcion: [] as string[], }); const api_url = process.env.NEXT_PUBLIC_API_URL; const mostrarCamposComputadora = Number(formData.id_tipo_equipo) !== 9; useEffect(() => { const fetchCatalogos = async () => { const token = Cookies.get("token"); const headers = { Authorization: `Bearer ${token}` }; try { const [ usosRes, marcasRes, estadosRes, adscripcionesRes, tiposEquipoRes, sistemasOperativosRes, procesadoresRes, laboratoriosRes, proyectosRes, ] = await Promise.all([ axios.get(`${api_url}/equipos/usos`, { headers }), axios.get(`${api_url}/equipos/marcas`, { headers }), axios.get(`${api_url}/equipos/estados`, { headers }), axios.get(`${api_url}/equipos/adscripciones`, { headers }), axios.get(`${api_url}/equipos/tipos-equipo`, { headers }), axios.get(`${api_url}/equipos/sistemas-operativos`, { headers }), axios.get(`${api_url}/equipos/procesadores`, { headers }), axios.get(`${api_url}/equipos/laboratorios`, { headers }), axios.get(`${api_url}/equipos/proyectos`, { headers }), ]); setTiposUso(usosRes.data); setMarcas(marcasRes.data); setEstados(estadosRes.data); setAdscripciones(adscripcionesRes.data); setTiposEquipo(tiposEquipoRes.data); setSistemasOperativos(sistemasOperativosRes.data); setProcesadores(procesadoresRes.data); setLaboratorios(laboratoriosRes.data); setProyectos(proyectosRes.data); } catch (error) { console.error("Error cargando catálogos:", error); toast.error("No se pudieron cargar los catálogos de datos"); } }; fetchCatalogos(); }, []); useEffect(() => { interface UnidadResponsable { idUnidadResponsable: number; unidadResponsable: string; cargo: string; titulo: string; nombre: string; apellidos: string; telefono: string; correo: string; nivel: number; idUnidadResponsablePapa: number; unidadResponsablePapa: string; } interface EquipoResponse { [key: string]: unknown; id_equipo: number; inventario: string; serie: string; lugar: string; fechaMovimiento: string; antiguedad: string; modelo: string; estado: { id_estado: number; estado: string }; adscripcion: { id_adscripcion: number; adscripcion: string }; sistemaOperativo: { id_sistema_operativo: number; sistema_operativo: string; } | null; tipoEquipo: { id_tipo_de_equipo: number; tipo_equipo: string } | null; procesador: { id_procesador: number; procesador: string; }; tipoUso: { id_uso: number; tipo_uso: string }; marca: { id_marca: number; marca: string }; periferico: { id_periferico: number; periferico: string }; observaciones?: string; laboratorio: { id_laboratorio?: number; }; proyecto: { id_proyecto?: number; }; } const fetchEquipo = async () => { if (!inventario) return; const token = Cookies.get("token"); const headers = { Authorization: `Bearer ${token}` }; try { const response = await axios.get( `${api_url}/equipos/buscar/${inventario}`, { headers } ); const equipo = response.data as EquipoResponse; const idAdscripcion = equipo.adscripcion?.id_adscripcion; const responsables: UnidadResponsable[] = Object.values(equipo).filter( (v): v is UnidadResponsable => typeof v === "object" && v !== null && "idUnidadResponsable" in v && "nombre" in v && "apellidos" in v ); const responsableEncontrado = responsables.find( (r) => r.idUnidadResponsable === idAdscripcion ); const responsable = responsableEncontrado ? `${responsableEncontrado.nombre} ${responsableEncontrado.apellidos}` : ""; setFormData({ inventario: equipo.inventario || "", serie: (equipo.serie || "").toUpperCase(), id_marca: equipo.marca?.id_marca || 0, modelo: equipo.modelo || "", id_tipo_equipo: equipo.tipoEquipo?.id_tipo_de_equipo || 0, id_estado: equipo.estado?.id_estado || 0, id_sistema_operativo: equipo.sistemaOperativo?.id_sistema_operativo || 0, id_procesador: equipo.procesador?.id_procesador || 0, id_uso: equipo.tipoUso?.id_uso || 0, observaciones: equipo.observaciones || "", id_adscripcion: equipo.adscripcion?.id_adscripcion || 0, lugar: equipo.lugar || "", id_periferico: equipo.periferico?.id_periferico || 0, id_laboratorio: equipo.laboratorio?.id_laboratorio || 0, id_proyecto: equipo.proyecto?.id_proyecto || 0, fechaMovimiento: equipo.fechaMovimiento || "", responsable, }); setAdscripcionLabel(equipo.adscripcion?.adscripcion); setId(equipo.id_equipo); } catch (err) { if (axios.isAxiosError(err)) { if (err.response) { toast.error( err.response.data?.message || "Error al crear la cuenta" ); } else if (err.request) { toast.error("No se pudo conectar con el servidor"); } else { toast.error("Ocurrió un error inesperado"); } } else { toast.error("Ocurrió un error inesperado"); } toast.error("No se pudo cargar la información del equipo."); } }; fetchEquipo(); }, [inventario]); useEffect(() => { const fetchProcesador = async () => { const token = Cookies.get("token"); const headers = { Authorization: `Bearer ${token}` }; const response = await axios.get( `${api_url}/equipos/procesador-tipo-equipos`, { headers, } ); setProcesadores(response.data); }; fetchProcesador(); }, [tiposEquipo]); useEffect(() => { const fetchPerifericos = async () => { if (Number(formData.id_tipo_equipo) != 9) return; const token = Cookies.get("token"); const headers = { Authorization: `Bearer ${token}` }; try { const response = await axios.get(`${api_url}/equipos/perifericos`, { headers, }); setPerifericos(response.data); } catch (err) { console.error(err); toast.error("No se pudieron cargar los periféricos"); } }; fetchPerifericos(); }, [formData.id_tipo_equipo]); const handleGuardar = async () => { if (!formData.inventario) { toast.error("Inventario no encontrado"); return; } if (!formData.id_marca) { toast.error("marca no encontrada"); return; } if (!formData.id_tipo_equipo) { toast.error("Tipo de equipo no encontrado"); return; } if (!formData.id_estado) { toast.error("estado no encontrado"); return; } if (!formData.id_uso) { toast.error("tipo de uso no encontrado"); return; } if (!formData.id_adscripcion) { toast.error("adscripción no encontrada"); return; } { /*if (!formData.id_laboratorio) { toast.error("Laboratorio no seleccionado"); return; } if (!formData.id_proyecto) { toast.error("Proyecto no seleccionado"); return; }*/ } if (formData.id_tipo_equipo == 9) { if (!formData.id_periferico) { toast.error("Periférico no encontrado"); return; } } if ( formData.id_tipo_equipo != 8 && formData.id_tipo_equipo != 7 && formData.id_tipo_equipo != 9 ) { if (!formData.id_sistema_operativo) { toast.error("Sistema operativo no encontrado"); return; } } if (formData.id_tipo_equipo != 9) { if (!formData.id_procesador) { toast.error("Procesador no encontrado"); return; } } const token = Cookies.get("token"); const headers = { Authorization: `Bearer ${token}` }; const data = { id_procesador: formData.id_procesador, id_estado: formData.id_estado, id_adscripcion: formData.id_adscripcion, id_laboratorio: formData.id_laboratorio, id_proyecto: formData.id_proyecto, lugar: formData.lugar, id_sistema_operativo: formData.id_sistema_operativo, id_tipo_uso: formData.id_uso, id_periferico: formData.id_periferico, serie: formData.serie, modelo: formData.modelo, id_marca: formData.id_marca, observaciones: formData.observaciones, }; try { await axios.patch(`${api_url}/equipos/update/${id}`, data, { headers, }); toast.success("Equipo actualizado correctamente"); router.push("/escaner"); } catch (error) { console.error("Error al guardar:", error); toast.error("Hubo un error al guardar el equipo."); } }; const handleInputChange = ( field: string, value: string | number | boolean ) => { if (field === "adscripcionLabel") { const textValue = value as string; setAdscripcionLabel(textValue); const normalize = (str: string) => str .normalize("NFD") .replace(/[\u0300-\u036f]/g, "") .toLowerCase(); const matches = adscripciones .filter((a) => normalize(a.adscripcion).includes(normalize(textValue))) .map((a) => a.adscripcion); setSuggestions((prev) => ({ ...prev, adscripcion: matches.slice(0, 5), })); return; } setFormData((prev) => { const newValue = field.startsWith("id_") && value !== "" ? Number(value) : value; if (field === "id_tipo_equipo") { const idTipoEquipo = Number(value); const tipoSeleccionado = tiposEquipo.find( (t) => t.id_tipo_de_equipo === idTipoEquipo ); const esPeriferico = tipoSeleccionado?.tipo_equipo === "PERIFÉRICO"; return { ...prev, id_tipo_equipo: idTipoEquipo, isImpresora: esPeriferico, }; } return { ...prev, [field]: newValue }; }); }; useEffect(() => { const fetchResponsable = async () => { if (!formData.id_adscripcion) return; try { const response = await axios.post( "https://venus.acatlan.unam.mx/funcionarios_test/test", { tipoBusqueda: "area", IdUnidadResponsable: formData.id_adscripcion, } ); const data = response.data; if (Array.isArray(data) && data.length > 0) { const first = data[0]; setFormData((prev) => ({ ...prev, responsable: `${first.nombre ?? ""} ${ first.apellidos ?? "" }`.trim(), })); } else { toast.error( "No se encontró información de la adscripción seleccionada" ); setFormData((prev) => ({ ...prev, responsable: "" })); } } catch (err) { console.error("Error al obtener responsable:", err); toast.error("No se pudo conseguir el responsable"); setFormData((prev) => ({ ...prev, responsable: "" })); } }; fetchResponsable(); }, [formData.id_adscripcion]); const handleCancelar = () => { router.push("/escaner"); }; return (

{tiposEquipo.find( (t) => t.id_tipo_de_equipo === Number(formData.id_tipo_equipo) )?.tipo_equipo || "Sin tipo"} Inventario: {formData.inventario} Fecha de censo:{" "} {formData.fechaMovimiento ? new Date(formData.fechaMovimiento).toLocaleDateString("es-MX") : "Sin fecha"}

{/* Columna 1 */}
setFormData({ ...formData, serie: e.target.value.toUpperCase(), }) } />
setFormData({ ...formData, modelo: e.target.value }) } />
{/*
*/}
{mostrarCamposComputadora && (
)}
{/* Columna 2 */}
{mostrarCamposComputadora && ( <>
)} {!mostrarCamposComputadora && (
)}
handleInputChange("adscripcionLabel", e.target.value) } style={{ fontSize: "13px" }} /> {suggestions.adscripcion.length > 0 && (
    {suggestions.adscripcion.map((s) => (
  • { const selected = adscripciones.find( (a) => a.adscripcion === s ); if (selected) { setFormData((prev) => ({ ...prev, id_adscripcion: selected.id_adscripcion, })); setAdscripcionLabel(selected.adscripcion); setSuggestions((prev) => ({ ...prev, adscripcion: [], })); } }} > {s}
  • ))}
)}
{/* Columna 3 */}
{mostrarCamposComputadora && (
)}