$(document).ready(function () {
let select2Bucket = [];
let isTableLoading = true; // Flag para detectar si la tabla está cargando
// Mostrar el overlay antes de comenzar cualquier carga
function showOverlay() {
$('#overlay').css('visibility', 'visible');
}
// Ocultar el overlay
function hideOverlay() {
$('#overlay').css('visibility', 'hidden');
}
// Función para cargar datos para Select2
async function loadSelect2Options() {
try {
const bucketDataResponse = await bucketData();
if (bucketDataResponse.length) {
select2Bucket = bucketDataResponse;
return true; // Indica que la carga de datos de Select2 fue exitosa
} else {
console.error('No se recibieron datos para Select2.');
hideOverlay();
return false; // Indica que la carga de datos de Select2 falló
}
} catch (error) {
console.error('Error al cargar los datos de Select2:', error);
select2Bucket = [];
return false; // Indica que la carga de datos de Select2 falló
}
}
// Función para inicializar Select2 para todos los elementos con las opciones cargadas
function initializeSelect2ForAll() {
$('.selectBucket').each(function () {
const selectId = $(this).attr('id');
const selectedValue = $(this).data('selected-value'); // Obtener el valor seleccionado desde los datos
// Inicializar Select2 solo si los datos están disponibles
$(this).select2({
data: select2Bucket,
placeholder: 'Seleccione una opción',
width: 'resolve'
}).val(selectedValue || '').trigger('change'); // Establecer el valor seleccionado
});
// Una vez que la tabla está completamente cargada
isTableLoading = false;
}
// Función para cargar datos en la tabla
async function cargarDatos() {
showOverlay(); // Mostrar el overlay antes de cargar los datos
try {
const data = await $.ajax({
url: 'https://panel.fivetwofive.tech/yaaxlum/public/tableProrrateo',
method: 'GET',
dataType: 'json'
});
if (!data || !data.length) {
console.error('No se recibieron datos para la tabla.');
return;
}
$('#flujoTable').DataTable().clear().destroy();
$('#flujoTable tbody').empty();
$.each(data, function (index, item) {
const rowIdT = (item.ID_COSTO ? 'idrow_' + item.ID_COSTO : 'idrowReg_' + item.ID_REGISTRO);
const regisId = 'regis_' + item.ID_REGISTRO;
const cuenId = 'cuent_' + item.ID_CAT;
const cargId = 'cargId_' + item.ID_COSTO;
const abonId = 'abonId_' + item.ID_COSTO;
const clubId = 'clubId_' + item.ID_COSTO;
const ibouId = 'ibouId_' + item.ID_COSTO;
const membId = 'membId_' + item.ID_COSTO;
const terrId = 'terrId_' + item.ID_COSTO;
const embId = 'embId_' + item.ID_COSTO;
//CANCELACIÓN DE BUCKET
// const newSelectBucketId = (item.ID_COSTO ? 'selectBucket_' + item.ID_COSTO : 'selectBucketRegister_' + item.ID_REGISTRO);
const idbuck = item.ID_BUCKET;
const isDisabled = item.ID_COSTO !== null && idbuck === null ? 'enabled' : (item.ID_COSTO === null && idbuck === null) ? 'disabled' : '';
let fila = `
` +
`
${item.ID_COSTO ? item.ID_COSTO : 'NO ASSIG.'}
` +
`
` + item.ID_REGISTRO + '
' +
'
' + item.FECHA + '
' +
`
` + item.CUENTA + '
' +
`
` + item.CARGO + '
' +
`
` + item.ABONO + '
' +
`
` + `` + '
' +
//CANCELACIÓN DE BUCKET
// `
` +
// `` +
// '
' +
`
` + item.CLUBES + '
' +
`
` + item.INBOUND + '
' +
`
` + item.MEMBRESIAS + '
' +
`
` + item.TERRENOS + '
' +
`
` + item.EMBAJADORAS + '
' +
'
';
$('#flujoTable tbody').append(fila);
});
$('#flujoTable').DataTable({
paging: true,
pageLength: 10,
searching: true,
info: true,
ordering: false,
lengthChange: true,
columnDefs: [
//CANCELACIÓN DE BUCKET
// { width: '9%', targets: 0 },
// { width: '9%', targets: 1 },
// { width: '15%', targets: 2 },
// { width: '20%', targets: 3 },
// { width: '15%', targets: 4 },
// { width: '15%', targets: 5 },
// { width: '20%', targets: 2 },
// { width: '15%', targets: 3 },
],
language: {
emptyTable: 'No hay datos disponibles en la tabla',
info: 'Mostrando _START_ a _END_ de _TOTAL_ entradas',
infoEmpty: 'Mostrando 0 a 0 de 0 entradas',
infoFiltered: '(filtrado de _MAX_ entradas totales)',
lengthMenu: 'Mostrar _MENU_ entradas',
search: 'Buscar:',
zeroRecords: 'No se encontraron coincidencias',
paginate: {
first: 'Primero',
last: 'Último',
next: 'Siguiente',
previous: 'Anterior'
}
},
drawCallback: function () {
// Inicializar Select2 para todos los elementos después de que la tabla se haya dibujado
initializeSelect2ForAll();
}
});
} catch (error) {
console.error('Error al cargar los datos:', error);
} finally {
hideOverlay(); // Ocultar el overlay cuando los datos se han cargado
}
}
// Función para aplicar los filtros
function applyFilters() {
const bucketFilter = $('#bucketFilter').is(':checked');
// Limpia cualquier filtro personalizado anterior
$.fn.dataTable.ext.search = [];
if (bucketFilter) {
$.fn.dataTable.ext.search.push(function (settings, data, dataIndex) {
// Busca el valor de la celda que comienza con `dataRow_`
const table = $('#flujoTable').DataTable();
const rowNode = table.row(dataIndex).node();
const bucket = $(rowNode).find('td[id^="dataRow_"]').text().trim();
// Solo muestra filas que tengan "NO ASSIG."
return bucket === "NO ASSIG.";
});
}
// Redibuja la tabla con el filtro aplicado
$('#flujoTable').DataTable().draw();
}
// Llamada a la función de carga de datos
async function init() {
showOverlay(); // Mostrar el overlay
const select2Loaded = await loadSelect2Options();
if (select2Loaded) {
await cargarDatos();
}
}
init();
// Detectar el cambio manual en el Select2
//CANCELACIÓN DE BUCKET
// $(document).on('select2:select', '.selectBucket', function () {
// if (!isTableLoading) { // Solo hacer log si la tabla no está en proceso de carga
// // Encuentra el elemento
más cercano
// const $row = $(this).closest('tr');
// const valueBucket = $(this).val();
// // Usa el selector correcto para encontrar el
con id que empieza con "regis_"
// const rowId = $row.attr('id');
// // console.log('ID del
encontrado:', rowId);
// const regisTd = $row.find('td[id^="regis_"]');
// const idRegistro = regisTd.length ? regisTd.text() : null;
// // Extrae el valor del ID si es necesario
// if (rowId) {
// let bucketID = valueBucket;
// $.ajax({
// url: '/act_bucket',
// type: 'POST',
// data: {
// ID_REGISTRO: idRegistro,
// ID_BUCKET: bucketID
// },
// success: function(response) {
// console.log('All good');
// },
// error: function(xhr, status, error) {
// console.error('Error al enviar los datos:', status, error);
// }
// });
// } else {
// console.log('No se encontró id');
// }
// }
// });
// // Aplicar los filtros
$('#bucketFilter').on('change', function () {
applyFilters();
});
});
// Manejar el clic en el botón específico
$(document).on('click', 'button[id^="ccId_"]', function () {
// Encontrar el
asociado al botón clickeado
$('#overlay').css('visibility', 'visible');
let $row = $(this).closest('tr');
// Obtener el ID del
let rowId = $row.attr('id');
let idPrefix = rowId.split('_')[0]; // Tipo de id
let idValue = rowId.split('_')[1]; // Valor del ID
// Determinar el tipo y preparar el objeto de datos
let tipo = idPrefix === 'idrowReg' ? 'ID_REGISTRO' : 'ID_PRORRATEO';
if (idPrefix === 'idrowReg') { // NO TIENE ID DE PRORRATEO
$.ajax({
url: 'https://panel.fivetwofive.tech/yaaxlum/public/getCentroCostoData', // Cambia esta URL por la URL de tu API
type: 'GET',
data: {
tipo: tipo, // Agrega el tipo al objeto de datos
idValue: idValue // Agrega el idValue al objeto de datos
},
success: function(response) {
// Asegúrate de que la respuesta sea del formato correcto
console.log(response); // Verifica la respuesta en la consola
$('#overlay').css('visibility', 'hidden');
let centroCostoContainer = $('#centroCostoContainer');
centroCostoContainer.empty(); // Limpiar el contenedor antes de añadir nuevos datos
// Crear las filas dinámicamente
$.each(response.centroCostos, function(index, costo) {
let row = `
`;
centroCostoContainer.append(row);
});
// Establecer el idValue en los datos del modal
$('#modalcc').data('idValue', idValue);
// Mostrar el modal
$('#modalcc').modal('show');
},
error: function(xhr, status, error) {
console.error('Error al obtener datos:', status, error);
// Manejar el error aquí
}
});
} else if (idPrefix === 'idrow') {
// TIENE ID DE PRORRATEO
let tdElement = $row.find('td[id^="regis_"]');
let regisId = tdElement.attr('id'); // Obtiene el ID del
let regisValue = tdElement.text(); // Obtiene el texto dentro del
console.log('registor', tdElement)
$.ajax({
url: 'https://panel.fivetwofive.tech/yaaxlum/public/getCentroCostoData', // Cambia esta URL por la URL de tu API
type: 'GET',
data: {
tipo: tipo, // Agrega el tipo al objeto de datos
idValue: regisValue // Agrega el idValue al objeto de datos
},
success: function(response) {
// Asegúrate de que la respuesta sea del formato correcto
console.log(response); // Verifica la respuesta en la consola
$('#overlay').css('visibility', 'hidden');
let centroCostoContainer = $('#centroCostoContainer');
centroCostoContainer.empty(); // Limpiar el contenedor antes de añadir nuevos datos
// Crear un mapa de valores para un acceso rápido
let valoresMap = {};
$.each(response.valoresCentroCostos, function(index, valorPro) {
valoresMap[valorPro.ID_CENTRO_COSTO] = valorPro.COSTO; // Aquí se usa COSTO para obtener el valor
});
// Crear las filas dinámicamente y marcar los checkboxes si ya han sido seleccionados
$.each(response.centroCostos, function(index, costo) {
let isChecked = valoresMap.hasOwnProperty(costo.ID_CENTRO_COSTO) ? 'checked' : '';
let valorCentroCosto = valoresMap[costo.ID_CENTRO_COSTO] || '0.00'; // Asigna el valor de COSTO o 0.00 si no existe
let row = `
`;
centroCostoContainer.append(row);
});
$('#modalcc').data('idValue', idValue);
$('#modalcc').modal('show');
},
error: function(xhr, status, error) {
console.error('Error al obtener datos:', status, error);
// Manejar el error aquí
}
});
// Aquí puedes hacer lo que necesites con idValue
} else {
console.error('No se reconoció el ', rowId);
}
});
// Función para manejar el cambio en los checkboxes
$(document).on('change', '.costo-checkbox', function () {
let checkboxes = $('.costo-checkbox');
let checkedCount = checkboxes.filter(':checked').length;
let totalCheckboxes = checkboxes.length;
if (totalCheckboxes === 0) return;
let valuePerCheckbox = (checkedCount > 0) ? (1 / checkedCount).toFixed(2) : 0.00;
checkboxes.each(function () {
let checkboxId = $(this).attr('id');
let valueInput = $('#' + checkboxId + '-value');
if ($(this).is(':checked')) {
valueInput.val(valuePerCheckbox);
} else {
valueInput.val('0.00');
}
});
});
// Función para manejar el guardado de datos
$(document).on('click', '#saveCentroCosto', function () {
$('#modalOverlay').css('visibility', 'visible');
// Obtener el ID del registro
let idValue = $('#modalcc').data('idValue'); // ID del registro si es necesario
// Crear un array para almacenar los datos de los centros de costo
let centroCostosData = [];
let totalValue = 0; // Variable para acumular el total de los valores
// Recorre todos los checkboxes y sus valores correspondientes
$('.costo-checkbox').each(function () {
let checkboxId = $(this).attr('id');
let isChecked = $(this).is(':checked');
let valueInput = $('#' + checkboxId + '-value');
let value = parseFloat(valueInput.val());
if (isChecked) {
centroCostosData.push({
ID_CENTRO_COSTO: checkboxId.replace('costo-', ''), // Extrae el ID del checkbox
VALUE: value // Valor del campo de texto asociado
});
totalValue += value; // Acumula el valor total
}
});
// Validar el total de los valores
if (totalValue !== 1.00 && totalValue !== 0) {
alert('El prorrateo no cumple el 100%. Por favor, ajuste los valores.');
$('#modalOverlay').css('visibility', 'hidden');
return; // Detiene el envío si no cumple la condición
}
// Verificar si hay una fila existente con el ID
let $rowReg = $('#flujoTable').find(`tr[id='idrowReg_${idValue}']`);
let $row = $('#flujoTable').find(`tr[id='idrow_${idValue}']`);
//Agregar sin ID_COSTO
if ($rowReg.length > 0) {
$.ajax({
url: 'https://panel.fivetwofive.tech/yaaxlum/public/saveCentroCostos',
type: 'POST',
data: JSON.stringify({
idValue: idValue,
centroCostos: centroCostosData
}),
contentType: 'application/json', // Asegúrate de especificar el tipo de contenido
success: function(response) {
// Actualizar la fila en la tabla
let $row = $('#flujoTable').find(`tr[id='idrowReg_${idValue}']`); // Asegúrate de que el id sea correcto
if ($row.length) {
// Actualiza el campo selectBucket con el nuevo ID_BUCKET
let newIdCosto = response.newId; // Obtén el nuevo ID_COSTO
// Habilitar el selectBucket
//CANCELACIÓN DE BUCKET
// $row.find('select.selectBucket').prop('disabled', false);
// Actualiza el ID del
con el nuevo ID_COSTO
$row.attr('id', `idrow_${newIdCosto}`);
// Actualiza el contenido de la celda específica
$row.find('td').eq(0).html(` ${newIdCosto}`);
// Re-dibuja la tabla si es necesario
// $('#flujoTable').DataTable().draw();
}
$('#modalOverlay').css('visibility', 'hidden');
$('#modalcc').modal('hide');
},
error: function(xhr, status, error) {
console.error('Error al guardar datos:', status, error);
$('#modalOverlay').css('visibility', 'hidden');
// Manejar el error aquí
}
});
} else if ($row.length > 0) {
// Si existe una fila con idrow_, entonces es un registro existente
let tdElement = $row.find('td[id^="regis_"]');
let regisId = tdElement.attr('id'); // Obtiene el ID del
let regisValue = tdElement.text(); // Obtiene el texto dentro del
// Verifica si centroCostosData es un array vacío y, si es así, agrega un objeto predeterminado
if (Array.isArray(centroCostosData) && centroCostosData.length === 0) {
centroCostosData.push({ ID_CENTRO_COSTO: null, VALUE: null });
}
$.ajax({
url: 'https://panel.fivetwofive.tech/yaaxlum/public/saveCentroCostos',
type: 'POST',
data: JSON.stringify({
idValue: regisValue,
centroCostos: centroCostosData,
stats: "update"
}),
contentType: 'application/json', // Asegúrate de especificar el tipo de contenido
success: function(response) {
// Actualizar la fila en la tabla
let $row = $('#flujoTable').find(`tr[id='idrowReg_${idValue}']`); // Asegúrate de que el id sea correcto
if ($row.length) {
// Actualiza el campo selectBucket con el nuevo ID_BUCKET
let newIdCosto = response.newId; // Obtén el nuevo ID_COSTO
// Habilitar el selectBucket
//CANCELACIÓN DE BUCKET
// $row.find('select.selectBucket').prop('disabled', false);
// Actualiza el ID del
con el nuevo ID_COSTO
$row.attr('id', `idrow_${newIdCosto}`);
// Actualiza el contenido de la celda específica
$row.find('td').eq(0).html(` ${newIdCosto}`);
// Re-dibuja la tabla si es necesario
// $('#flujoTable').DataTable().draw();
}
$('#modalOverlay').css('visibility', 'hidden');
$('#modalcc').modal('hide');
},
error: function(xhr, status, error) {
console.error('Error al guardar datos:', status, error);
$('#modalOverlay').css('visibility', 'hidden');
// Manejar el error aquí
}
});
} else {
// Manejar el caso donde no existe ninguna fila con los IDs especificados
console.error('No se encontró ninguna fila con el ID especificado.');
}
});
$('#sidebarToggle, .navbar-toggler').on('click', function () {
$('#sidebar, #content').toggleClass('active');
});