{% extends 'base.html.twig' %}
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('plugins/datatables-bs4/css/dataTables.bootstrap4.min.css') }}">
<link rel="stylesheet" href="{{ asset('plugins/datatables-responsive/css/responsive.bootstrap4.min.css') }}">
<link rel="stylesheet" href="{{ asset('plugins/datatables-buttons/css/buttons.bootstrap4.min.css')}}">
<link rel="stylesheet" href="{{ asset('plugins/toastr/toastr.min.css') }}">
<style>
label {
margin-right: 1rem;
}
</style>
{% endblock %}
{% block body %}
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<section class="content-header">
<div class="card">
<div class="card-header">
<h1 class="card-title">Atención a solicitudes de mantenimiento</h1>
<div class="card-tools">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item">Inicio</li>
<li class="breadcrumb-item active"> </li>
</ol>
</div>
</div>
</div>
</section>
{# Solicitudes de mantenimiento recibidas del plantel #}
<section class="content">
<!-- Default box -->
<div class="card card-outline card-teal p-3">
<div class="card-header" style="background: #e9fad4;">
<h1 class="card-title"><b>Solicitudes de mantenimiento <small class="text-success"><b>Recibidas del plantel</b></small></b></h1>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-card-widget="collapse" title="Collapse" style="color: #000000; background: #ffffff;">
<i class="fas fa-plus"></i>
</button>
</div>
<br>
<br>
<section class="content">
<div class="container-fluid">
<div class="row">
<div class="col-12 col-sm-6 col-md-3">
<div id="estatusA" class="info-box">
<span class="info-box-icon bg-warning elevation-1"><i class="fas fa-info-circle text-white"></i></span>
<div class="info-box-content">
<span class="info-box-text">Pendientes</span>
<span class="info-box-number">0</span>
</div>
</div>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div id="estatusB" class="info-box mb-3">
<span class="info-box-icon bg-danger elevation-1"><i class="fas fa-cog"></i></span>
<div class="info-box-content">
<span class="info-box-text">En proceso</span>
<span class="info-box-number">0</span>
</div>
</div>
</div>
<div class="clearfix hidden-md-up"></div>
<div class="col-12 col-sm-6 col-md-3">
<div id="estatusC" class="info-box mb-3">
<span class="info-box-icon bg-success elevation-1"><i class="fas fa-thumbs-up"></i></span>
<div class="info-box-content">
<span class="info-box-text">Atendidas (por evaluar)</span>
<span class="info-box-number">0</span>
</div>
</div>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div id="estatusD" class="info-box mb-3">
<span class="info-box-icon bg-info elevation-1"><i class="fas fa-check-circle"></i></span>
<div class="info-box-content">
<span class="info-box-text">Evaluadas</span>
<span class="info-box-number">0</span>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
<div class="card-body">
<section class="content">
<div class="row justify-content-center">
<div class="col-12">
<!-- Default box -->
<div class="card card-outline card-teal p-3">
<div class="card-body">
<table id="table-solicitud" class="table table-hover w-100">
<thead>
<tr>
<th>Solicitud</th>
<th>Marbete</th>
<th>Descripción</th>
<th>Usuario</th>
<th>Acción a realizar</th>
<th>Tipo</th>
<th>Estatus</th>
<th>No.M</th>
<th>Accion</th>
</tr>
</thead>
<tbody>
{% for s in solicitudes %}
<tr id="solicitud-{{ s.id_sol }}">
<td class="id">{{ s.id_sol }}</td>
<th class="idEquipo" >{{ s.marbete }}</th>
<td class="tipoEquipo"> Marca: <b>{{ s.marca }}</b> <br>Modelo: <b>{{ s.modelo }}</b> <br>No.M: <b>{{ s.mantenimiento_count }}</b> </td>
<td class="usuario" >{{ s.unombre }} {{ s.uapellido }}</td>
<td class="falla text-justify" >{{ s.falla }}</td>
<td class="tipoMantenimiento" >{{ s.tipo_mantenimiento }}</td>
<td class="estatus">
{% if s.estatus == 1 %}
<span class="badge bg-gradient-yellow d-block" style="width: 8rem;">Pendiente</span>
{% elseif s.estatus == 2 %}
<span class="badge bg-gradient-danger d-block" style="width: 8rem;">En proceso</span>
{% elseif s.estatus == 3 %}
<span class="badge bg-gradient-primary d-block" style="width: 8rem;">Atendido</span>
{# <a href="#modal-solicitud-evaluacion" class="evaluacion" data-toggle="modal" onclick="evaluacion('{{ path('prog_correctivo_evaluacion', {'idSol': s.idsolicitud}) }}')">
<i class="fa fa-check-circle text-primary"></i>
</a> #}
{% elseif s.estatus == 4 %}
<span class="badge bg-gradient-green d-block" style="width: 8rem;">Evaluado</span>
{% endif %}
</td>
<td class="tipoEquipo">
<span style="background-color: #c2e0c6; border: 1px solid #6fa56f; padding: 4px;">
<b>{{ s.mantenimiento_count }}</b>
</span>
</td>
<td class="text-right" style="white-space: nowrap">
{# Visualización de datos del equipo #}
{% if s.tipo_equipo == 'Equipo' %}
<a href="#modal-solicitud-vista" class="text-info btn" data-toggle="modal" onclick="vistaTipo('{{ path('prog_correctivo_vista_tipo', {'tipo': 'Equipo', 'id': s.id_equipo}) }}')">
<i class="fa fa-laptop" data-toggle="tooltip" title="Datos del Equipo de Cómputo"></i>
</a>
{% elseif s.tipo_equipo == 'Impresora' %}
<a href="#modal-solicitud-vista" class="text-info btn" data-toggle="modal" onclick="vistaTipo('{{ path('prog_correctivo_vista_tipo', {'tipo': 'Impresora', 'id': s.id_equipo}) }}')">
<i class="fa fa-print" data-toggle="tooltip" title="Datos de la impresora"></i>
</a>
{% elseif s.tipo_equipo == 'Red' %}
<a href="#modal-solicitud-vista" class="text-info btn" data-toggle="modal" onclick="vistaTipo('{{ path('prog_correctivo_vista_tipo', {'tipo': 'Red', 'id': s.id_equipo}) }}')">
<i class="fa fa-wifi" data-toggle="tooltip" title="Datos del dispositivo de red"></i>
</a>
{% elseif s.tipo_equipo == 'Otro' %}
<a href="#modal-solicitud-vista" class="text-info btn" data-toggle="modal" onclick="vistaTipo('{{ path('prog_correctivo_vista_tipo', {'tipo': 'Otro', 'id': s.id_equipo}) }}')">
<i class="fa fa-desktop" data-toggle="tooltip" title="Datos del equipo"></i>
</a>
{% endif %}
{# Edición de los datos del equipo #}
<a href="#modal-vista-solicitud" class="text-info btn" data-toggle="modal" onclick="vistaModalSolicitud('{{ path('app_solicitud_vista_detalle', {'id': s.id_sol}) }}', {{ s.id_sol }}, {{ s.estatus }})">
<i class="fa fa-file" data-toggle="tooltip" title="Ver Solicitud"></i>
</a>
{% if s.estatus <= 3 %}
<a href="#editar-solicitud" class="btn_editar btn" onclick="editarInfoSolicitud('{{ path('app_solicitud_edit', {'idSol': s.id_sol}) }}')" data-toggle="modal" title="Editar"><i class="fas fa-pen"></i></a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</section>
</div>
<!-- Modal vista de informacion de solicitud -->
<div class="modal hide" id="modal-vista-solicitud"></div>
<div class="modal hide" id="editar-solicitud"></div>
<!-- Modal de solicitud para programar mantenimiento correctivo -->
<div class="modal hide" id="modal-solicitud-programar"></div>
<!-- /.modal de solicitud para programar mantenimiento correctivo -->
<!-- Modal de solicitudes programadas para mantenimiento correctivo -->
<div class="modal hide" id="modal-solicitud-vista"></div>
<!-- /.modal de solicitudes programadas para mantenimiento correctivo -->
<!-- Modal de evaluación de mantenimiento correctivo -->
<div class="modal hide" id="modal-solicitud-evaluacion"></div>
<!-- /.modal de evaluacion de mantenimiento preventivo correctivo -->
{% endblock %}
{% block javascripts %}
<script src="{{ asset('plugins/datatables/jquery.dataTables.min.js') }}"></script>
<script src="{{ asset('plugins/datatables-bs4/js/dataTables.bootstrap4.min.js') }}"></script>
<script src="{{ asset('plugins/datatables-responsive/js/dataTables.responsive.min.js') }}"></script>
<script src="{{ asset('plugins/datatables-responsive/js/responsive.bootstrap4.min.js') }}"></script>
<script src="{{ asset('plugins/datatables-buttons/js/dataTables.buttons.min.js') }}"></script>
<script src="{{ asset('plugins/datatables-buttons/js/buttons.bootstrap4.min.js') }}"></script>
<script src="{{ asset('plugins/jszip/jszip.min.js') }}"></script>
<script src="{{ asset('plugins/pdfmake/pdfmake.min.js') }}"></script>
<script src="{{ asset('plugins/pdfmake/vfs_fonts.js') }}"></script>
<script src="{{ asset('plugins/datatables-buttons/js/buttons.html5.min.js') }}"></script>
<script src="{{ asset('plugins/datatables-buttons/js/buttons.print.min.js') }}"></script>
<script src="{{ asset('plugins/datatables-buttons/js/buttons.colVis.min.js') }}"></script>
<script src="{{ asset('plugins/toastr/toastr.min.js') }}"></script>
<script type="text/javascript">
$("#atencion-mtto").addClass("active");
$(function () {
// DataTable
$('#table-solicitud').DataTable({
"aaSorting": [],
orderCellsTop: true,
{# Define un valor predeterminado para LengthChange #}
"pageLength": 25,
"scrollX": true,
{# sDom: 'lrtip', #}
"bLengthChange" : true,
language: {
url: 'https://cdn.datatables.net/plug-ins/1.10.22/i18n/Spanish.json'
},
});
vistaDashboard();
});
// Contador de numero de solicitudes en dashbord
function vistaDashboard() {
$.ajax({
type: "POST",
url: '{{ path('app_solicitud_vista') }}',
dataType: "json",
cache: false,
contentType: false,
processData: false,
success: function (data) {
let datos = data;
if(datos.data[1]){
row = $('#estatusA');
row.find('.info-box-number').text(datos.data[1].solicitudCont);
}
if(datos.data[2]){
row = $('#estatusB');
row.find('.info-box-number').text(datos.data[2].solicitudCont);
}
if(datos.data[3]){
row = $('#estatusC');
row.find('.info-box-number').text(datos.data[3].solicitudCont);
}
if(datos.data[4]){
row = $('#estatusD');
row.find('.info-box-number').text(datos.data[4].solicitudCont);
}
},
error: function (data, text, error) {
$(document).Toasts('create', {
autohide: true,
delay: 3000,
class: 'bg-danger',
title: 'Actualización de Dashboard',
subtitle: 'Ocurrio un error',
body: data.responseJSON.mensaje
});
},
complete: function () {
}
});
}
function actualizarVista() {
$.ajax({
type: "POST",
url: '{{ path('app_solicitud_vista') }}',
dataType: "json",
cache: false,
contentType: false,
processData: false,
success: function (data) {
let datos = data;
console.log(datos.info);
let row = "";
for(let i = 0; i < datos.info.length; i++){
row = $('#solicitud-' + datos.info[i].id);
if (datos.info[i].estatus === '1') {
row.find('.estatus').html('<div class="badge bg-gradient-yellow d-block" style="width: 8rem;">Pendiente</div>');
}
if (datos.info[i].estatus === '2') {
row.find('.estatus').html('<div class="badge bg-gradient-danger d-block" style="width: 8rem;">En proceso</div>');
}
if (datos.info[i].estatus === '3') {
row.find('.estatus').html('<div class="badge bg-gradient-primary d-block" style="width: 8rem;">Atendido</div>');
}
if (datos.info[i].estatus === '4') {
row.find('.estatus').html('<div class="badge bg-gradient-green d-block" style="width: 8rem;">Evaluado</div>');
}
}
},
error: function (data, text, error) {
$(document).Toasts('create', {
autohide: true,
delay: 3000,
class: 'bg-danger',
title: 'Actualización de Dashboard',
subtitle: 'Ocurrio un error',
body: data.responseJSON.mensaje
});
},
complete: function () {
}
});
}
function vistaInformacionTabla(data){
$.each(data, function (key, s) {
row = $('#solicitud-' + s.id_sol);
if (s.estatus === 'Pendiente') {
row.find('.estatus').html('<div class="badge bg-gradient-yellow" style="width: 8rem;">Pendiente</div>');
}
if (s.estatus === 'En proceso') {
row.find('.estatus').html('<div class="badge bg-gradient-danger" style="width: 8rem;">En proceso</div>');
}
if (s.estatus === 'Atendido') {
row.find('.estatus').html('<div class="badge bg-gradient-primary" style="width: 8rem;">Atendido</div>');
}
if (s.estatus === 'Evaluado') {
row.find('.estatus').html('<div class="badge bg-gradient-success" style="width: 8rem;">Evaluado</div>');
}
});
}
function vistaTipo(url) {
$('#modal-solicitud-vista').load(url, function ()
{
// configuración del Modal
$("#modal-solicitud-vista").on('hide.bs.modal', function () {
$(this).html('Cargando');
});
$(".modal-dialog").draggable;
vistaTipoAjax(url);
})
}
function vistaTipoAjax(url) {
$.ajax({
type: "POST",
url: url,
data: formData, // Adjuntar los campos del formulario enviado.
dataType: "json",
cache: false,
contentType: false,
processData: false,
success: function (data){
},
error: function (data, text, error) {
},
complete: function () {
}
});
}
function vistaSolicitud(data) {
let datos = data;
row = $('#solicitud-' + datos.id);
row.find('.evaluacion').css('display', 'none');
row.find('.estatus').html(datos.estatus);
}
function editarInfoSolicitud(url){
$('#editar-solicitud').load(url, function ()
{
// configuración del Modal
$("#editar-solicitud").on('hide.bs.modal', function () {
$(this).html('Cargando');
});
$(".modal-dialog").draggable;
editarInfoSolicitudAjax(url)
})
}
function editarInfoSolicitudAjax(url) {
let send = $("#btn_solicitud_guardar");
$('#btn_solicitud_guardar').on('click', function () {
let formData = new FormData(document.getElementById("form-editar-solicitud"));
$.ajax({
type: "POST",
url: url,
data: formData, // Adjuntar los campos del formulario enviado.
contentType: false,
processData: false,
beforeSend: function () {
send.text("Actualizando "); // Para input de tipo button
send.append("<i class='fa fa-spinner fa-spin' style='font-size:16px'></i>");
send.prop("disabled", true);
},
success: function (data) {
console.log(data);
let datos = data;
let row = $('#solicitud-' + datos.idSol);
row.find('.tipoEquipo').html('Marca: <b>' + datos.marca + '</b><br>Modelo: <b>' + datos.modelo + '</b> <br>No.M: <b>' + datos.mantenimiento_count + '</b>');
row.find('.idEquipo').html(datos.idEquipo);
row.find('.tipoMantenimiento').html(datos.tipoMantenimiento);
row.find('.falla').html(datos.falla);
if (datos.estatus === "Pendiente") {
row.find('.estatus').html('<div class="badge bg-gradient-yellow d-block" style="width: 8rem;">' + datos.estatus + '</div>');
}
if (datos.estatus === "En proceso") {
row.find('.estatus').html('<div class="badge bg-gradient-danger d-block" style="width: 8rem;">' + datos.estatus + '</div>');
}
if (datos.estatus === "Atendido") {
row.find('.estatus').html('<div class="badge bg-gradient-primary d-block" style="width: 8rem;">' + datos.estatus + '</div>');
}
if (datos.estatus === "Evaluado") {
row.find('.estatus').html('<div class="badge bg-gradient-green d-block" style="width: 8rem;">' + datos.estatus + '</div>');
}
row.find('.tipoEquipo').html('No.M: <b>'+ datos.mantenimiento_count + '</b>');
vistaDashboard();
closeModal('editar-solicitud');
},
error: function (data, text, error) {
console.log(data);
console.log(text);
let datos = data.responseJSON;
mostrarError(datos.message);
$("#editar-solicitud").html(datos.form);
editarInfoSolicitudAjax(url);
},
complete: function (data) {
send.text("Guardar");
// Se ejecuta al termino de la petición
//actualizarVista();
}
});
return false; // Evitar ejecutar el submit del formulario.
});
//actualizarVista();
}
<!-- Actualizar tabla de bitácora -->
function actualizarSolicitud(data) {
$("#table-solicitud").dataTable().fnClearTable();
$("#table-solicitud").dataTable().fnDestroy();
var edit = "";
var html = "";
$.each(data, function (key, solicitud) {
html += '<tr id="idSol' + solicitud.idSol + '">' +
'<td class="tipoEquipo">' + solicitud.tipoEquipo + '</td>' +
'<td class="idEquipo">' + solicitud.idEquipo + '</td>' +
'<td class="tipoMantenimiento">' + solicitud.tipoMantenimiento + '</td>' +
'<td class="falla">' + solicitud.falla + '</td>' +
'<td class="text-right btn">' +
'<a href="' + solicitud.ver + '"><i class="fas fa-eye"></i></a>' + edit +
'</td>' +
'</tr>';
});
$("#table-solicitud").find($("tbody")).html(html);
$('#table-solicitud').DataTable({
"aaSorting": [],
orderCellsTop: true,
{# Define un valor predeterminado para LengthChange #}
"pageLength": 50,
"scrollX": true,
{# sDom: 'lrtip', #}
"bLengthChange": true,
language: {
url: 'https://cdn.datatables.net/plug-ins/1.10.22/i18n/Spanish.json'
},
});
}
// Cambia el color del estatus
function cambiarEstatus(url) {
$.ajax({
url: url,
dataType: "json",
cache: false,
contentType: false,
processData: false,
success: function (data) {
let datos = data;
let row = $('#idSol'+ datos.idSol);
if (datos.estatus === "Pendiente") {
row.find('.estatus').html('<div class="badge bg-gradient-yellow d-block" style="width: 8rem;">' + datos.estatus + '</div>');
}
if (datos.estatus === "En proceso") {
row.find('.estatus').html('<div class="badge bg-gradient-danger d-block" style="width: 8rem;">' + datos.estatus + '</div>');
}
if (datos.estatus === "Atendido") {
row.find('.estatus').html('<div class="badge bg-gradient-primary d-block" style="width: 8rem;">' + datos.estatus + '</div>');
}
if (datos.estatus === "Evaluado") {
row.find('.estatus').html('<div class="badge bg-gradient-green d-block" style="width: 8rem;">' + datos.estatus + '</div>');
}
//alertMessage(0, datos.mensaje);
},
error: function (data, text, error) {
alertMessage(1, error);
},
complete: function (data) {
// Se ejecuta al termino de la petición
}
});
}
function vistaModalSolicitud(url, idsol, estatus) {
$('#modal-vista-solicitud').load(url, function ()
{
// configuración del Modal
$("#modal-vista-solicitud").on('hide.bs.modal', function () {
$(this).html('Cargando');
});
$(".modal-dialog").draggable;
if (estatus === 1){
$('#solicitud-' + idsol).find('.estatus').html('<div class="badge bg-gradient-danger d-block" style="width: 8rem;">En proceso</div>');
}
vistaDashboard();
})
}
function mostrarError(mensaje) {
if (mensaje === "0") {
$('.mensajeError').html('<ul class="list-unstyled"><li><i class="fa fa-exclamation-triangle" aria-hidden="true"></i><span class="glyphicon glyphicon-exclamation-sign"></span> <strong>"ALERTA: No es posible cambiar de estatus, porque, el equipo no tiene usuario asignado o el correo del usuario es inválido. Debe ir a el catálogo del equipo para asignar el usuario correcto al equipo y regrese a modificar la orden"<strong></li></ul>')
.css('display', 'block');
} else {
$('.mensajeError').html('')
.css('display', 'none');;
}
}
</script>
{% endblock %}