added censado por and tring to fix reportes

This commit is contained in:
2025-12-05 16:52:31 -06:00
parent 41cfb9bddc
commit e71bbc4987
14 changed files with 131 additions and 81 deletions
@@ -8,6 +8,7 @@ import Pregunta7EP from "@/components/Perifericos/Pregunta7EP";
import Pregunta9 from "@/components/Equipo_Computo/Pregunta9";
import "../../styles/layout/reporte.scss";
import Pregunta8 from "@/components/Perifericos/Pregunta8";
import DownloadReporteXLSX from "@/components/Dowload/Reporte";
type PreguntaKey =
| "pregunta1"
@@ -22,7 +23,7 @@ const LABELS: Record<PreguntaKey, string> = {
pregunta2: "Sistema Operativo",
pregunta3: "Plataforma y tipo procesador",
pregunta7EP: "Laboratorios",
pregunta8:"Proyectos",
pregunta8: "Proyectos",
pregunta9: "Generales",
};
@@ -32,7 +33,7 @@ const TAB_BACKGROUNDS: Record<PreguntaKey, string> = {
pregunta2: "bg-gray",
pregunta3: "bg-gray",
pregunta7EP: "bg-gray",
pregunta8:"bg-gray",
pregunta8: "bg-gray",
pregunta9: "bg-blue",
};
@@ -48,7 +49,7 @@ export default function Page() {
case "pregunta3":
return <Pregunta3 />;
case "pregunta7EP":
return <Pregunta7EP />
return <Pregunta7EP />;
case "pregunta8":
return <Pregunta8 />;
case "pregunta9":
@@ -80,6 +81,7 @@ export default function Page() {
{label}
</button>
))}
<DownloadReporteXLSX />
</div>
<div className={`data-table_reporte ${currentBgClass}`}>
{renderPregunta()}
+1 -1
View File
@@ -40,7 +40,6 @@ export default function Page() {
return (
<>
<Pregunta7 />
<DownloadReporteXLSX/>
</>
);
default:
@@ -68,6 +67,7 @@ export default function Page() {
{label}
</button>
))}
<DownloadReporteXLSX/>
</div>
<div className={`data-table_reporte`}>{renderPregunta()}</div>
</div>
+2 -1
View File
@@ -8,6 +8,7 @@
justify-content: center;
.innerContainer {
position: relative;
max-width: 1000px;
width: 100%;
padding: 1rem 2rem;
@@ -80,7 +81,7 @@ textarea {
display: flex;
justify-content: space-evenly;
align-items: end;
gap: 30px;
gap: 10px;
width: 100%;
height: 100%;
.btnGuardar {
-3
View File
@@ -127,7 +127,6 @@ export default function Page() {
const [proyectos, setProyectos] = useState<Proyecto[]>([]);
const mostrarCamposComputadora = Number(formData.id_tipo_equipo) !== 9;
const esTablet = [7, 8].includes(Number(formData.id_tipo_equipo));
const api_url = process.env.NEXT_PUBLIC_API_URL;
useEffect(() => {
@@ -539,7 +538,6 @@ export default function Page() {
)}
</select>
</div>
{!esTablet && (
<div className="formGroup">
<label>Sistema operativo</label>
<select
@@ -567,7 +565,6 @@ export default function Page() {
))}
</select>
</div>
)}
</>
)}
-1
View File
@@ -36,7 +36,6 @@ export default function DownloadReporteXLSX() {
return (
<button className={styles.downloadBtn} onClick={handleDownload}>
<span className={styles.icon}></span>
Descargar XLSX
</button>
);
+4 -27
View File
@@ -1,20 +1,19 @@
.downloadBtn {
display: flex;
align-items: center;
gap: 8px;
background: #1a73e8;
background: #217346;
color: white;
border: none;
padding: 10px 16px;
cursor: pointer;
border-radius: 6px;
border-radius: 10px 10px 0 0;
font-size: 14px;
font-weight: 600;
transition: background 0.2s ease;
}
.downloadBtn:hover {
background: #1459b3;
background: #1e5838;
}
/* Icono con css puro */
@@ -22,26 +21,4 @@
width: 18px;
height: 18px;
position: relative;
}
.icon::before {
content: "";
width: 3px;
height: 10px;
background: white;
position: absolute;
left: 7px;
top: 0;
}
.icon::after {
content: "";
width: 10px;
height: 10px;
border-left: 3px solid white;
border-bottom: 3px solid white;
transform: rotate(-45deg);
position: absolute;
left: 4px;
top: 8px;
}
}
+10 -2
View File
@@ -36,6 +36,7 @@ export default function Editar() {
id_laboratorio: 0,
id_proyecto: 0,
fechaMovimiento: "",
user: "",
});
interface TipoUso {
@@ -201,6 +202,9 @@ export default function Editar() {
proyecto: {
id_proyecto?: number;
};
user: {
nombre?: string;
};
}
const fetchEquipo = async () => {
@@ -254,6 +258,7 @@ export default function Editar() {
id_proyecto: equipo.proyecto?.id_proyecto || 0,
fechaMovimiento: equipo.fechaMovimiento || "",
responsable,
user: equipo.user?.nombre || "",
});
setAdscripcionLabel(equipo.adscripcion?.adscripcion);
@@ -385,12 +390,12 @@ export default function Editar() {
}
}
if ((formData.lugar).length > 200) {
if (formData.lugar.length > 200) {
toast.error("Inventario no encontrado");
return;
}
if ((formData.observaciones).length > 200) {
if (formData.observaciones.length > 200) {
toast.error("Inventario no encontrado");
return;
}
@@ -519,6 +524,9 @@ export default function Editar() {
return (
<div className="agregarEquipoContainer">
<div className="innerContainer">
<h2 className="user">
<span>Censado por {formData.user}</span>
</h2>
<h2 className="information">
<span>
{tiposEquipo.find(
+66 -27
View File
@@ -7,8 +7,9 @@ import style from "./pregunta1_1.module.scss";
import ToggleButton from "../Toggle/ToggleButton";
type RawEntry = {
uso: string;
categoria: string;
tipo_equipo: string;
tipo_uso: string;
sistema_operativo: string;
total: string;
};
@@ -20,14 +21,21 @@ const USO_INDEX: Record<string, number> = {
ADMINISTRATIVO: 4,
};
const CATEGORIA_MAP: Record<string, { tabla: number; so: string }> = {
"ESCRITORIO PC": { tabla: 0, so: "Windows" },
"ESCRITORIO MAC OS": { tabla: 0, so: "Mac OS" },
"ESCRITORIO LINUX": { tabla: 0, so: "Linux" },
"PORTÁTILES WINDOWS": { tabla: 2, so: "Windows" },
"PORTÁTILES MAC OS": { tabla: 2, so: "Mac OS" },
"TABLETA iPAD OS": { tabla: 1, so: "Mac OS" },
SERVIDOR: { tabla: 3, so: "Linux" },
const CATEGORIA_MAP: Record<string, { tabla: number }> = {
"ESCRITORIO PC": { tabla: 0 },
"ESCRITORIO MAC OS": { tabla: 0 },
"ESCRITORIO MAC OS ": { tabla: 0 }, // tiene espacio al final
"ESCRITORIO LINUX": { tabla: 0 },
"PORTÁTILES WINDOWS": { tabla: 2 },
"PORTÁTILES MAC OS": { tabla: 2 },
"PORTÁTILES LINUX": { tabla: 2 },
"TABLETA IPAD OS": { tabla: 1 },
"TABLETA ANDROID": { tabla: 1 },
SERVIDOR: { tabla: 3 },
};
const TITULOS_TABLAS = [
@@ -37,14 +45,37 @@ const TITULOS_TABLAS = [
"Alto rendimiento",
];
const SISTEMAS_OPERATIVOS = ["Windows", "Linux", "Mac OS"];
const SISTEMAS_POR_TABLA: Record<number, readonly string[]> = {
0: ["Windows", "Linux", "Mac OS"],
1: ["Android", "iPad OS"],
2: ["Windows", "Linux", "Mac OS"],
3: ["Servidor"],
};
function normalizarSO(soRaw: string): string {
const so = soRaw.trim().toUpperCase();
if (so.includes("WINDOWS")) return "Windows";
if (so.includes("LINUX")) return "Linux";
if (so.includes("MAC")) return "Mac OS";
if (so.includes("CHROME")) return "Chrome OS";
if (so.includes("IOS") || so.includes("IPAD")) return "iPad OS";
// Servidores
if (so.includes("SERVER") || so.includes("UNIX")) return "Servidor";
return "Otro";
}
export default function Pregunta1() {
const [tablas, setTablas] = useState<number[][][]>(
Array.from({ length: 4 }, () =>
Array.from({ length: 3 }, () => Array(5).fill(0))
)
);
const crearTablas = () =>
Array.from({ length: 4 }, (_, tablaIndex) =>
Array.from({ length: SISTEMAS_POR_TABLA[tablaIndex].length }, () =>
Array(5).fill(0)
)
);
const [tablas, setTablas] = useState<number[][][]>(crearTablas());
const [loading, setLoading] = useState(true);
@@ -70,19 +101,30 @@ export default function Pregunta1() {
);
for (const item of res.data) {
const categoria = item.categoria.trim();
const categoria = item.tipo_equipo.trim().toUpperCase();
const mapping = CATEGORIA_MAP[categoria];
if (!mapping) continue;
const { tabla, so } = mapping;
const soIndex = SISTEMAS_OPERATIVOS.indexOf(so);
if (soIndex === -1) continue;
const { tabla } = mapping;
const usoIndex = USO_INDEX[item.uso];
let soIndex = -1;
// 🟦 Caso especial: SERVIDOR → siempre a la fila "Servidor"
if (tabla === 3) {
soIndex = 0; // único SO disponible en SISTEMAS_POR_TABLA[3]
} else {
const soNormalizado = normalizarSO(item.sistema_operativo);
soIndex = SISTEMAS_POR_TABLA[tabla].indexOf(soNormalizado);
if (soIndex === -1) continue;
}
const usoIndex = USO_INDEX[item.tipo_uso.toUpperCase()];
if (usoIndex === undefined) continue;
const total = parseInt(item.total) || 0;
nuevaTablas[tabla][soIndex][usoIndex] = total;
// 🔥 Corrección importante → SUMAR, no reemplazar
nuevaTablas[tabla][soIndex][usoIndex] += total;
}
setTablas(nuevaTablas);
@@ -125,7 +167,7 @@ export default function Pregunta1() {
</thead>
<tbody>
{SISTEMAS_OPERATIVOS.map((so, soIndex) => {
{SISTEMAS_POR_TABLA[tablaIndex].map((so, soIndex) => {
const valores = datosSO[soIndex];
const totalFila = valores.reduce((a, b) => a + b, 0);
@@ -183,11 +225,8 @@ export default function Pregunta1() {
<div className={style["contenedor-tablas"]}>
{renderTabla(0)}
{renderTabla(1)}
</div>
<div className={style["contenedor-tablas"]}>
{renderTabla(2)}
{renderTabla(1)}
{renderTabla(3)}
</div>
</div>
+8 -10
View File
@@ -3,10 +3,11 @@
import { useState, useEffect } from "react";
import Cookies from "js-cookie";
import axios from "axios";
import "./pregunta9.css";
import Pregunta10 from "./pregunta10";
import ToggleButton from "../Toggle/ToggleButton";
import "./pregunta9.css";
type AntiguedadItem = {
antiguedad: string | null;
total: string;
@@ -23,15 +24,15 @@ export default function Pregunta9() {
const [datos, setDatos] = useState([
{
nombre: "Computadoras de Escritorio",
valores: ["0.00", "0.00", "0.00", "0.00", "0.00"],
valores: ["0.00", "0.00", "0.00", "0.00"],
},
{
nombre: "Computadoras Portátiles",
valores: ["0.00", "0.00", "0.00", "0.00", "0.00"],
valores: ["0.00", "0.00", "0.00", "0.00"],
},
{
nombre: "Alto Rendimiento",
valores: ["0.00", "0.00", "0.00", "0.00", "0.00"],
valores: ["0.00", "0.00", "0.00", "0.00"],
},
]);
@@ -44,7 +45,6 @@ export default function Pregunta9() {
let entre4_6 = 0;
let mayores6 = 0;
let notfound = 0;
for (const item of items) {
const total = Number(item.total) || 0;
@@ -64,15 +64,15 @@ export default function Pregunta9() {
break;
// Cualquier otro valor (aunque no debería haber) lo meteríamos en mayores6
default:
notfound += total;
mayores6 += total;
break;
}
}
const totalEquipo = menores2 + mayores6 + entre2_3 + entre4_6 + notfound;
const totalEquipo = menores2 + mayores6 + entre2_3 + entre4_6 ;
if (totalEquipo === 0) {
return ["0.00", "0.00", "0.00", "0.00", "0.00"];
return ["0.00", "0.00", "0.00", "0.00"];
}
const pct = (valor: number) => ((valor / totalEquipo) * 100).toFixed(2);
@@ -82,7 +82,6 @@ export default function Pregunta9() {
pct(entre2_3),
pct(entre4_6),
pct(mayores6),
pct(notfound),
];
};
@@ -172,7 +171,6 @@ export default function Pregunta9() {
<th className="rosa-fuerte">Entre 2 y 3 años</th>
<th className="rosa-fuerte">Entre 4 y 5 años</th>
<th className="rosa-fuerte">Mayor a 6 años</th>
<th className="rosa-fuerte">No registrados</th>
<th className="azul-marino">Total</th>
</tr>
</thead>
+1 -1
View File
@@ -62,7 +62,7 @@ export default function Pregunta10() {
return (
<>
<div className="pregunta-cuadro">
Equipos de cómputo que tienen garantía de proveedoro.
Equipos de cómputo que tienen garantía de proveedor.
<ToggleButton
onChange={(estado) => {
cargarDatos(estado);
@@ -24,7 +24,7 @@
.tabla-contenedor {
background: white;
padding: 20px;
padding: 1rem;
border-radius: 10px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
overflow-x: auto;
@@ -41,14 +41,15 @@
th,
td {
text-align: center;
border: 1px solid #ddd;
padding: 12px;
padding: 5px;
}
th {
color: white;
font-weight: 600;
font-size: 15px;
font-size: 13px;
}
td {
@@ -131,6 +131,7 @@
background: #f8fafc;
font-size: 14px;
transition: 0.2s ease;
text-align: center;
}
.inputBox_P3:focus {
+15
View File
@@ -118,3 +118,18 @@ input:focus {
cursor: pointer;
font-size: 14px;
}
.user{
color: #333 !important;
position: absolute;
left: 2rem;
bottom: 1rem;
}
@media(max-width:1075px) {
.user{
position: relative;
left: 0;
bottom: 0;
}
}
+14 -2
View File
@@ -19,7 +19,7 @@ export const SO_POR_EQUIPO: Record<
{
id_sistema_operativo: 7,
sistema_operativo:
"Mac OS X (Mojave, Catalina, 11 - Big Sur, 12 - Monterrey)",
"Mac OS X (Mojave, Catalina, 11 - Big Sur, 12 - Monterey)",
},
{
id_sistema_operativo: 8,
@@ -60,7 +60,7 @@ export const SO_POR_EQUIPO: Record<
{
id_sistema_operativo: 7,
sistema_operativo:
"Mac OS X (Mojave, Catalina, 11 - Big Sur, 12 - Monterrey)",
"Mac OS X (Mojave, Catalina, 11 - Big Sur, 12 - Monterey)",
},
{
id_sistema_operativo: 8,
@@ -72,6 +72,18 @@ export const SO_POR_EQUIPO: Record<
"Mac OS X (Snow Leopard, Lion, Mountain Lion, Mavericks)",
},
],
/*"TABLETA ANDROID"*/ 7: [
{
id_sistema_operativo: 18,
sistema_operativo: "ANDROID",
},
],
/*"TABLETA iPAD OS"*/ 8: [
{
id_sistema_operativo: 29,
sistema_operativo: "IOS",
},
],
/*SERVIDOR*/ 10: [
{
id_sistema_operativo: 12,