/**
* @author Mauricio Peña Domínguez
*/
import M_obtenerActividades from "/InscripcionesEVG/assets/js/models/m_obtenerActividades.js";
import { ModalConfirmacion } from "/InscripcionesEVG/assets/js/utils/modalConfirmacion.js";
import M_obtenerInscripcionesActividad from "/InscripcionesEVG/assets/js/models/m_obtenerInscripcionesActividad.js";
import { Loader } from "/InscripcionesEVG/assets/js/utils/loader.js";
/**
* Carga las actividades, opcionalmente filtradas por un momento, y genera
* en la tabla los botones para descargar los datos en Excel o ZIP.
* @param {number|null} idMomento - Identificador del momento para filtrar actividades.
*/
async function cargarActividadesConDescarga(idMomento) {
try {
const modelo = new M_obtenerActividades();
const actividades = await modelo.obtenerActividades();
// Filtrar por momento si se proporciona uno
const actividadesFiltradas = idMomento
? actividades.filter((act) => act.idMomento == idMomento)
: actividades;
const tabla = document.querySelector(".tabla-pruebas");
const tbody = tabla.querySelector("tbody");
const contenedorDescargarTodos = document.querySelector(
".descargar-todos-container",
);
// Limpiar contenido previo
tbody.innerHTML = "";
if (actividadesFiltradas.length === 0) {
// No hay actividades: ocultar tabla y botón, mostrar mensaje
tabla.style.display = "none";
let mensaje = document.querySelector(".mensaje-sin-actividades");
if (!mensaje) {
mensaje = document.createElement("p");
mensaje.classList.add("mensaje-sin-actividades");
mensaje.style.color = "#666";
mensaje.style.fontStyle = "italic";
mensaje.textContent = "No hay actividades disponibles.";
tabla.after(mensaje);
}
mensaje.style.display = "block";
if (contenedorDescargarTodos)
contenedorDescargarTodos.style.display = "none";
return;
}
// Hay actividades: mostrar tabla y ocultar mensaje si existe
tabla.style.display = "table";
let mensaje = document.querySelector(".mensaje-sin-actividades");
if (mensaje) {
mensaje.style.display = "none";
}
if (contenedorDescargarTodos)
contenedorDescargarTodos.style.display = "block";
const actividadesParaZip = [];
for (const actividad of actividadesFiltradas) {
const tr = document.createElement("tr");
// Columna: Nombre de la actividad
const tdNombre = document.createElement("td");
tdNombre.textContent = actividad.nombre;
tr.appendChild(tdNombre);
// Columna: Botón de descarga individual Excel
const tdDescargar = document.createElement("td");
const btnDescargar = document.createElement("button");
btnDescargar.classList.add("btn-descargar-excel");
const textoExcel = document.createElement("span");
textoExcel.textContent = "Descargar ";
textoExcel.style.marginRight = "6px";
textoExcel.style.color = "white";
const imgExcel = document.createElement("img");
imgExcel.src = "/InscripcionesEVG/assets/img/excel.png";
imgExcel.alt = "Descargar Excel";
imgExcel.style.width = "25px";
imgExcel.style.height = "25px";
btnDescargar.appendChild(textoExcel);
btnDescargar.appendChild(imgExcel);
const idActividad = actividad.idActividad;
actividadesParaZip.push({ idActividad });
btnDescargar.addEventListener("click", async () => {
const loader = new Loader("Generando Excel...");
try {
await obtenerExceldeActividades(idActividad);
} catch (error) {
console.error("Error al generar Excel:", error);
} finally {
loader.ocultar();
}
});
tdDescargar.appendChild(btnDescargar);
tr.appendChild(tdDescargar);
tbody.appendChild(tr);
}
// Botón para descargar todas las actividades en ZIP
let contenedor = document.querySelector(".descargar-todos-container");
if (!contenedor) {
contenedor = document.createElement("div");
contenedor.classList.add("descargar-todos-container");
tabla.after(contenedor);
} else {
contenedor.innerHTML = "";
}
const btnDescargarTodos = document.createElement("button");
btnDescargarTodos.innerHTML = "Descargar carpeta comprimida <i>.zip</i>";
btnDescargarTodos.classList.add("btn-descargar-todos");
btnDescargarTodos.addEventListener("click", async () => {
const loader = new Loader("Generando zip...");
try {
const idsActividades = actividadesFiltradas.map(
(act) => act.idActividad,
);
await obtenerZipActividades(idsActividades);
} catch (error) {
console.error("Error al generar todos los Excel:", error);
} finally {
loader.ocultar();
}
});
contenedor.appendChild(btnDescargarTodos);
} catch (error) {
console.error("Error al cargar las actividades con descarga:", error);
}
}
/**
* Genera y descarga un archivo Excel con las inscripciones de una actividad.
* Muestra un modal si la actividad no tiene inscripciones.
* @param {number} idActividad - Identificador de la actividad.
*/
async function obtenerExceldeActividades(idActividad) {
const modelo = new M_obtenerInscripcionesActividad();
const excels = await modelo.obtenerAlumnosInscripcionesActividad(idActividad);
if (
!excels ||
(Array.isArray(excels) && excels.length === 0) ||
(typeof excels === "object" && Object.keys(excels).length === 0)
) {
new ModalConfirmacion({
titulo: "No disponible",
mensaje: "Esta prueba no tiene inscripciones",
onAceptar: () => {},
onCancelar: () => {},
});
return;
}
const response = await fetch(
"/InscripcionesEVG/controllers/generar_excelActividades.php",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(excels),
},
);
if (!response.ok) {
alert("Error al generar el Excel");
return;
}
let filename = "archivo.xlsx";
const disposition = response.headers.get("Content-Disposition");
if (disposition && disposition.includes("filename=")) {
const match = disposition.match(/filename="?([^"]+)"?/);
if (match && match[1]) {
filename = match[1];
}
}
const blob = await response.blob();
const url = window.URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}
/**
* Genera y descarga un archivo ZIP con todos los Excels de las actividades
* que tienen inscripciones. Muestra modal si no hay inscripciones en ninguna.
* @param {number[]} idsActividades - Array de IDs de actividades.
*/
async function obtenerZipActividades(idsActividades) {
const modelo = new M_obtenerInscripcionesActividad();
const datosParaExcel = [];
for (const idActividad of idsActividades) {
const excels =
await modelo.obtenerAlumnosInscripcionesActividad(idActividad);
if (excels && Array.isArray(excels) && excels.length > 0) {
datosParaExcel.push(excels);
}
}
if (datosParaExcel.length === 0) {
new ModalConfirmacion({
titulo: "No disponible",
mensaje: "Ninguna de las pruebas tiene inscripciones",
onAceptar: () => {},
onCancelar: () => {},
});
return;
}
const response = await fetch(
"/InscripcionesEVG/controllers/generar_zipActividades.php",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(datosParaExcel),
},
);
if (!response.ok) {
alert("Error al generar el ZIP");
return;
}
const blob = await response.blob();
const url = window.URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "actividades_excel.zip";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}
export { cargarActividadesConDescarga };