File "mantenimiento.js"

Full Path: C:/wamp64/www/RegistroEquipos2/frontend/mantenimiento/mantenimiento.js
File size: 17.31 KB
MIME-type: text/plain
Charset: utf-8

$(document).ready(function() {
    let tablaProgramados = null;
    let tablaHistorial = null;
    let tablaRegistros = null;

    // =====================================================
    // Cargar equipos en el select
    // =====================================================
    function cargarEquipos() {
        return fetch('../../backend/mantenimiento/listar_equipos.php')
            .then(res => res.json())
            .then(response => {
                const select = $('#equipoSelect');
                select.empty().append('<option value="">Seleccione un equipo</option>');
                if (response.status === 'success' && response.data.length > 0) {
                    response.data.forEach(eq => {
                        select.append(new Option(eq.texto, eq.id));
                    });
                } else {
                    select.append('<option value="">No hay equipos disponibles</option>');
                }
            })
            .catch(err => console.error('Error cargando equipos:', err));
    }

    // =====================================================
    // Cargar mantenimientos programados (CON VALIDACIÓN DE MORA)
    // =====================================================
    function cargarProgramados() {
        fetch('../../backend/mantenimiento/listar.php?tipo=programados')
            .then(res => res.json())
            .then(response => {
                if (response.status === 'success') {
                    if (tablaProgramados) {
                        tablaProgramados.destroy();
                    }
                    
                    // Procesar datos para agregar clase CSS según si está en mora
                    const hoy = new Date().toISOString().split('T')[0]; // YYYY-MM-DD
                    const datos = response.data.map(item => {
                        item.en_mora = (item.fecha_programada < hoy) ? 1 : 0;
                        return item;
                    });

                    tablaProgramados = $('#tablaProgramados').DataTable({
                        data: datos,
                        columns: [
                            { data: 'id' },
                            { data: 'marca' },
                            { data: 'referencia' },
                            { data: 'serial' },
                            { 
                                data: 'fecha_programada',
                                render: function(data, type, row) {
                                    if (type === 'display') {
                                        const fecha = new Date(data).toLocaleDateString('es-CO');
                                        if (row.en_mora) {
                                            return `<span class="text-danger fw-bold">${fecha} ⚠️</span>`;
                                        }
                                        return fecha;
                                    }
                                    return data;
                                }
                            },
                            { data: 'observaciones', defaultContent: '' },
                            {
                                data: null,
                                render: function(data) {
                                    return `
                                        <button class="btn btn-sm btn-info btn-editar-prog" data-id="${data.id}" data-obs="${data.observaciones || ''}"><i class="fas fa-edit"></i></button>
                                        <button class="btn btn-sm btn-success btn-realizar" data-id="${data.id}">Realizado</button>
                                    `;
                                }
                            }
                        ],
                        order: [[4, 'asc']],
                        createdRow: function(row, data, dataIndex) {
                            if (data.en_mora) {
                                $(row).addClass('table-danger'); // Fila completa en rojo
                            }
                        }
                    });
                }
            })
            .catch(err => console.error('Error cargando programados:', err));
    }

    // =====================================================
    // Cargar historial (CON INDICADOR DE RETRASO)
    // =====================================================
    function cargarHistorial() {
        fetch('../../backend/mantenimiento/listar.php?tipo=historial')
            .then(res => res.json())
            .then(response => {
                if (response.status === 'success') {
                    if (tablaHistorial) {
                        tablaHistorial.destroy();
                    }

                    // Procesar datos para agregar estado de retraso
                    const datos = response.data.map(item => {
                        const programada = new Date(item.fecha_programada);
                        const realizada = item.fecha_realizada ? new Date(item.fecha_realizada) : null;
                        if (realizada) {
                            item.con_retraso = (realizada > programada) ? 1 : 0;
                        } else {
                            item.con_retraso = 0;
                        }
                        return item;
                    });

                    tablaHistorial = $('#tablaHistorial').DataTable({
                        data: datos,
                        columns: [
                            { data: 'id' },
                            { data: 'marca' },
                            { data: 'referencia' },
                            { data: 'serial' },
                            {
                                data: 'fecha_programada',
                                render: function(data) {
                                    return data ? new Date(data).toLocaleDateString('es-CO') : '';
                                }
                            },
                            {
                                data: 'fecha_realizada',
                                render: function(data, type, row) {
                                    if (type === 'display' && data) {
                                        const fecha = new Date(data).toLocaleDateString('es-CO');
                                        if (row.con_retraso) {
                                            return `<span class="text-warning fw-bold">${fecha} ⚠️</span>`;
                                        }
                                        return `<span class="text-success fw-bold">${fecha} ✅</span>`;
                                    }
                                    return data;
                                }
                            },
                            { data: 'observaciones', defaultContent: '' },
                            {
                                data: null,
                                render: function(data) {
                                    return `<button class="btn btn-sm btn-info btn-editar-obs" data-id="${data.id}" data-obs="${data.observaciones || ''}"><i class="fas fa-edit"></i> Editar</button>`;
                                }
                            }
                        ],
                        order: [[5, 'desc']],
                        dom: 'Bfrtip',
                        buttons: [
                            {
                                extend: 'excelHtml5',
                                text: '<i class="fas fa-file-excel"></i> Exportar Excel',
                                title: 'Historial de Mantenimientos',
                                className: 'd-none',
                                exportOptions: {
                                    columns: [0,1,2,3,4,5,6]
                                }
                            }
                        ]
                    });
                }
            })
            .catch(err => console.error('Error cargando historial:', err));
    }

    // =====================================================
    // Exportar Excel
    // =====================================================
    $('#btnExportarExcelHistorial').on('click', function() {
        if (tablaHistorial) {
            tablaHistorial.button('.buttons-excel').trigger();
        } else {
            Swal.fire('Atención', 'Primero cargue el historial', 'warning');
        }
    });

    // =====================================================
    // Cargar dashboard
    // =====================================================
    function cargarDashboard() {
        fetch('../../backend/mantenimiento/dashboard.php')
            .then(res => res.json())
            .then(response => {
                if (response.status === 'success') {
                    $('#stat-realizados').text(response.data.realizados);
                    $('#stat-programados').text(response.data.programados);
                    $('#stat-cancelados').text(response.data.cancelados);
                } else {
                    Swal.fire('Error', response.mensaje, 'error');
                }
            })
            .catch(err => {
                console.error('Error cargando dashboard:', err);
                Swal.fire('Error', 'No se pudo cargar el dashboard', 'error');
            });
    }

    // =====================================================
    // TABLA DE REGISTROS DE COMPUTADORES
    // =====================================================
    function cargarRegistrosComputadores() {
        if (tablaRegistros) {
            tablaRegistros.ajax.reload();
            return;
        }
        tablaRegistros = $('#tablaRegistrosComputadores').DataTable({
            ajax: {
                url: '../../backend/computador/computerSelect.php',
                dataSrc: 'data'
            },
            columns: [
                { data: 'id' },
                { data: 'fecha' },
                { data: 'marca' },
                { data: 'referencia' },
                { data: 'serial' },
                { data: 'nombreRecibe' },
                {
                    data: null,
                    render: function(data) {
                        var disponibles = $('#equipoSelect option').map(function() {
                            return $(this).val();
                        }).get();
                        if (disponibles.includes(String(data.id))) {
                            return `<button class="btn btn-sm btn-primary btn-seleccionar-registro" data-id="${data.id}" data-texto="${data.marca} ${data.referencia} (${data.serial})">Seleccionar</button>`;
                        } else {
                            return `<button class="btn btn-sm btn-secondary" disabled>No disponible</button>`;
                        }
                    }
                }
            ],
            order: [[0, 'desc']]
        });
    }

    // Evento para seleccionar un registro de la tabla
    $('#tablaRegistrosComputadores tbody').on('click', '.btn-seleccionar-registro', function() {
        const id = $(this).data('id');
        $('#equipoSelect').val(id).trigger('change');
        $('#programados-tab').tab('show');
        Swal.fire('Equipo seleccionado', 'Ahora puede programar el mantenimiento', 'success');
        $(this).prop('disabled', true).text('Seleccionado');
    });

    // =====================================================
    // Programar mantenimiento
    // =====================================================
    $('#formMantenimiento').on('submit', function(e) {
        e.preventDefault();
        const data = {
            registro_id: $('#equipoSelect').val(),
            fecha_programada: $('#fechaProgramada').val(),
            observaciones: $('#observaciones').val()
        };
        if (!data.registro_id || !data.fecha_programada) {
            Swal.fire('Atención', 'Seleccione un equipo y una fecha', 'warning');
            return;
        }
        fetch('../../backend/mantenimiento/programar.php', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(data)
        })
        .then(res => res.json())
        .then(response => {
            if (response.status === 'success') {
                Swal.fire('Éxito', response.mensaje, 'success');
                $('#formMantenimiento')[0].reset();
                cargarEquipos().then(() => {
                    cargarProgramados();
                    cargarRegistrosComputadores();
                    cargarDashboard();
                });
            } else {
                Swal.fire('Error', response.mensaje, 'error');
            }
        })
        .catch(err => {
            Swal.fire('Error', 'Error de conexión', 'error');
            console.error(err);
        });
    });

    // =====================================================
    // Editar observaciones en programados
    // =====================================================
    $('#tablaProgramados tbody').on('click', '.btn-editar-prog', function() {
        const id = $(this).data('id');
        const obs = $(this).data('obs');
        $('#editId').val(id);
        $('#editObservaciones').val(obs);
        $('#modalEditarObservaciones').data('origen', 'programados').modal('show');
    });

    // =====================================================
    // Editar observaciones en historial
    // =====================================================
    $('#tablaHistorial tbody').on('click', '.btn-editar-obs', function() {
        const id = $(this).data('id');
        const obs = $(this).data('obs');
        $('#editId').val(id);
        $('#editObservaciones').val(obs);
        $('#modalEditarObservaciones').data('origen', 'historial').modal('show');
    });

    // Guardar cambios de observaciones
    $('#guardarEditObservaciones').on('click', function() {
        const id = $('#editId').val();
        const observaciones = $('#editObservaciones').val();
        if (!id) return;

        fetch('../../backend/mantenimiento/update_observaciones.php', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ id: id, observaciones: observaciones })
        })
        .then(res => res.json())
        .then(response => {
            if (response.status === 'success') {
                Swal.fire('Éxito', response.mensaje, 'success');
                $('#modalEditarObservaciones').modal('hide');
                const origen = $('#modalEditarObservaciones').data('origen');
                if (origen === 'programados') {
                    cargarProgramados();
                } else {
                    cargarHistorial();
                }
            } else {
                Swal.fire('Error', response.mensaje, 'error');
            }
        })
        .catch(err => {
            Swal.fire('Error', 'Error de conexión', 'error');
            console.error(err);
        });
    });

    // =====================================================
    // Marcar como realizado (con validación de retraso)
    // =====================================================
    $('#tablaProgramados tbody').on('click', '.btn-realizar', function() {
        const id = $(this).data('id');
        Swal.fire({
            title: '¿Confirmar mantenimiento realizado?',
            text: 'Esta acción moverá el registro al historial',
            icon: 'question',
            showCancelButton: true,
            confirmButtonColor: '#28a745',
            confirmButtonText: 'Sí, realizado',
            cancelButtonText: 'Cancelar'
        }).then((result) => {
            if (result.isConfirmed) {
                fetch('../../backend/mantenimiento/realizar.php', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ id: id })
                })
                .then(res => res.json())
                .then(response => {
                    if (response.status === 'success') {
                        Swal.fire('Éxito', response.mensaje, 'success');
                        cargarEquipos().then(() => {
                            cargarProgramados();
                            cargarHistorial();
                            cargarRegistrosComputadores();
                            cargarDashboard();
                        });
                    } else {
                        Swal.fire('Error', response.mensaje, 'error');
                    }
                })
                .catch(err => {
                    Swal.fire('Error', 'Error de conexión', 'error');
                    console.error(err);
                });
            }
        });
    });

    // =====================================================
    // Botón actualizar dashboard
    // =====================================================
    $('#btnActualizarDashboard').on('click', cargarDashboard);

    // =====================================================
    // Inicializar todo
    // =====================================================
    cargarEquipos().then(() => {
        cargarProgramados();
        cargarHistorial();
        cargarRegistrosComputadores();
        cargarDashboard();
    });
});