$(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'); });