asdadsasd
// Variables globales
let formEntries = [];
let filteredEntries = [];
let originalOrder = [];
let currentSort = { key: null, asc: true };
let groups = [];
let selectedGroup = null;
// Funciones de utilidad
function showLoading() {
document.getElementById('loadingOverlay').style.display = 'flex';
}
function hideLoading() {
document.getElementById('loadingOverlay').style.display = 'none';
}
// Función para traducir el sexo
function traducirSexo(sex) {
if (!sex || sex === '') return '';
if (sex === 'MAN') return 'Hombre';
if (sex === 'WOMAN') return 'Mujer';
return sex;
}
// Función para detectar si una entrada es de tipo cabin
function isCabinEntry(entry) {
// Verificar si el campo accommodation es 'CABIN'
return entry.accommodation === 'CABIN';
}
// Función para obtener el texto de alojamiento
function getAccommodationText(entry) {
if (isCabinEntry(entry)) {
return 'CABAÑA';
}
return entry.accommodation || '';
}
// Función para cargar los grupos
async function loadGroups() {
try {
console.log('Loading groups from API...');
const response = await fetch(`${API_ENDPOINT}/groups`);
if (!response.ok) {
console.error('Error fetching groups:', response.status);
return;
}
groups = await response.json();
console.log('Groups loaded:', groups);
// Actualizar el cache
if (!window.groupsCache) {
window.groupsCache = {};
}
groups.forEach(group => {
window.groupsCache[group.code] = group.name;
});
// Llenar el select de grupos
fillGroupFilter();
} catch (error) {
console.error('Error loading groups:', error);
}
}
// Función para llenar el filtro de grupos
function fillGroupFilter() {
const groupFilter = document.getElementById('groupFilter');
if (!groupFilter) return;
// Mantener la opción "Todos los grupos"
groupFilter.innerHTML = '';
// Agregar la opción "SIN GRUPO"
const sinGrupoOption = document.createElement('option');
sinGrupoOption.value = 'SIN_GRUPO';
sinGrupoOption.textContent = 'SIN GRUPO';
groupFilter.appendChild(sinGrupoOption);
// Agregar las opciones de grupos
groups.forEach(group => {
const option = document.createElement('option');
option.value = group.code;
option.textContent = group.name;
groupFilter.appendChild(option);
});
}
// Función para mostrar los líderes del grupo seleccionado
function showGroupLeaders(groupCode) {
const leadersInfo = document.getElementById('leadersInfo');
const leadersList = document.getElementById('leadersList');
if (!leadersInfo || !leadersList) return;
if (!groupCode || groupCode === 'SIN_GRUPO') {
leadersInfo.classList.remove('show');
return;
}
const group = groups.find(g => g.code === groupCode);
if (!group || !group.leaders || group.leaders.length === 0) {
leadersInfo.classList.remove('show');
return;
}
// Mostrar la información de líderes
leadersList.innerHTML = group.leaders.map(leader =>
`
${leader.name} ${leader.surname}
`
).join('');
leadersInfo.classList.add('show');
}
// Función para verificar si un inscrito tiene alojamiento sin pagar
function hasUnpaidAccommodation(entry) {
console.log('Checking unpaid accommodation for entry:', entry.id);
console.log('formEntryProducts:', entry.formEntryProducts);
// Excluir entradas de tipo cabin de la detección de deuda
if (isCabinEntry(entry)) {
console.log('Entry is cabin type, skipping debt detection');
return false;
}
if (!entry.formEntryProducts || !Array.isArray(entry.formEntryProducts)) {
console.log('No formEntryProducts or not an array');
return false;
}
const hasUnpaid = entry.formEntryProducts.some(product => {
console.log('Product:', product);
const isAccommodation = product.type === 'ACCOMMODATION';
const isUnpaid = product.paidAmount === 0 || product.paidAmount === null || product.paidAmount === undefined;
console.log('Is accommodation:', isAccommodation, 'Is unpaid:', isUnpaid);
return isAccommodation && isUnpaid;
});
console.log('Has unpaid accommodation:', hasUnpaid);
return hasUnpaid;
}
// Función para obtener el nombre del grupo por código
async function getGroupName(groupCode) {
console.log('getGroupName called with groupCode:', groupCode);
if (!groupCode || groupCode === '') {
console.log('Empty groupCode, returning empty string');
return '';
}
try {
// Cache de grupos para evitar múltiples llamadas
if (!window.groupsCache) {
window.groupsCache = {};
}
// Si ya tenemos el grupo en cache, devolverlo
if (window.groupsCache[groupCode]) {
console.log('Found in cache:', window.groupsCache[groupCode]);
return window.groupsCache[groupCode];
}
console.log('Fetching groups from API...');
const response = await fetch(`${API_ENDPOINT}/groups`);
if (!response.ok) {
console.error('Error fetching groups:', response.status);
return '';
}
const groups = await response.json();
console.log('Groups received:', groups);
// Guardar todos los grupos en cache
groups.forEach(group => {
window.groupsCache[group.code] = group.name;
});
const result = window.groupsCache[groupCode] || '';
console.log('Final result for', groupCode, ':', result);
return result;
} catch (error) {
console.error('Error fetching group name:', error);
return '';
}
}
// Función para formatear fechas
function formatDate(dateString) {
if (!dateString) return '';
try {
return new Date(dateString).toLocaleString('es-ES');
} catch (e) {
return dateString;
}
}
// Función para quitar tildes/acentos
function quitarTildes(str) {
return (str || '').normalize('NFD').replace(/[ \u0301\u0308]/g, '').replace(/[\u00f1\u00d1]/g, 'n').replace(/\u00f1/g, 'n').replace(/\u00d1/g, 'N');
}
// Función para cargar los datos
async function fetchFormEntries() {
console.log('fetchFormEntries() llamado');
if (typeof API_ENDPOINT === 'undefined') {
console.error('API_ENDPOINT no está definido');
const container = document.getElementById('tableContainer');
if (container) {
container.innerHTML = '
Error: No se pudo cargar la configuración de la API.
';
}
return;
}
// Obtener el formId de los parámetros de la URL
const params = new URLSearchParams(window.location.search);
const formId = params.get('formId');
if (!formId) {
const container = document.getElementById('tableContainer');
if (container) {
container.innerHTML = '
Error: No se especificó el ID del formulario.
';
}
return;
}
showLoading();
console.log('Iniciando fetch a la API...');
console.log('URL completa:', `${API_ENDPOINT}/form-entries/all-active?formId=${formId}`);
try {
const res = await fetch(`${API_ENDPOINT}/form-entries/all-active?formId=${formId}`);
console.log('Respuesta recibida, status:', res.status);
if (!res.ok) {
throw new Error(`HTTP error! status: ${res.status}`);
}
const data = await res.json();
console.log('Datos procesados, registros:', data.length);
console.log('Primeros 3 registros:', data.slice(0, 3));
// Verificar si los datos incluyen formEntryProducts
if (data.length > 0) {
console.log('Estructura del primer registro:', Object.keys(data[0]));
if (data[0].formEntryProducts) {
console.log('formEntryProducts del primer registro:', data[0].formEntryProducts);
} else {
console.log('No se encontró formEntryProducts en los datos');
}
}
formEntries = data;
filteredEntries = data;
originalOrder = [...data];
// Cargar grupos después de cargar los datos
await loadGroups();
updateStats();
await renderTable();
} catch (error) {
console.error('Error en la petición:', error);
console.error('Stack trace:', error.stack);
const container = document.getElementById('tableContainer');
if (container) {
container.innerHTML = `
No se pudieron cargar los datos. Error: ${error.message}
`;
}
} finally {
hideLoading();
}
}
// Función para actualizar estadísticas
function updateStats() {
const count = document.getElementById('count');
const countLabel = document.getElementById('countLabel');
if (count) {
count.textContent = filteredEntries.length;
}
if (countLabel) {
// Verificar si hay filtros activos
const searchInput = document.getElementById('searchInput');
const groupFilter = document.getElementById('groupFilter');
const hasSearch = searchInput && searchInput.value.trim() !== '';
const hasGroupFilter = groupFilter && groupFilter.value !== '';
if (hasSearch || hasGroupFilter) {
countLabel.textContent = 'Filtrados';
} else {
countLabel.textContent = 'Total';
}
}
}
// Función para renderizar la tabla
async function renderTable() {
console.log('renderTable() llamado');
console.log('filteredEntries:', filteredEntries);
console.log('filteredEntries.length:', filteredEntries ? filteredEntries.length : 'undefined');
const container = document.getElementById('tableContainer');
if (!filteredEntries.length) {
if (container) {
container.innerHTML = '