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