Files
Colaborando/resumen.php
T

954 lines
45 KiB
PHP

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Resumen de Colaborando</title>
<!-- Estilos y scripts base de colaborando2.php -->
<link rel="stylesheet" href="js/jquery-ui.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Ubuntu&display=swap');
body,
input,
button {
font-family: 'Ubuntu', sans-serif;
font-size: 14px;
}
table {
width: 100%;
border-collapse: collapse;
}
.draggable {
cursor: pointer;
}
/* --- Estilos para la nueva maqueta --- */
.main-container {
display: flex;
gap: 15px;
padding: 10px;
}
.column {
display: flex;
flex-direction: column;
gap: 5px;
}
.column-left {
flex: 1 1 0px;
/* 1/5 del ancho */
}
.column-depts {
flex: 1 1 0px;
/* 1/5 del ancho */
}
.column-completed {
flex: 1 1 0px;
/* 1/5 del ancho */
}
.column-active {
flex: 2 1 0px;
/* 2/5 del ancho */
}
.card {
border: 2px solid #ccc;
border-radius: 5px;
padding: 5px;
background-color: #f9f9f9;
}
h2 {
text-align: center;
margin-top: 0;
font-size: 1.2em;
background-color: gray;
color: white;
padding: 5px;
border-radius: 3px;
}
/* Estilos para las tablas de resumen */
.summary-table {
font-size: 12px;
}
.summary-table th,
.summary-table td {
border: 1px solid #ddd;
padding: 4px;
text-align: center;
}
.summary-table th {
background-color: #e9e9e9;
}
/* Estilos para los departamentos en una columna */
/* Se ajusta el selector para que apunte a los .card dentro de la columna de departamentos,
restaurando el borde gris y eliminando el padding para que la tabla se ajuste. */
.column-depts .card {
padding: 0;
border: solid 3px gray;
}
.departamentos #nombreDeptoCh {
font-size: 16px;
font-weight: bold;
}
.departamentos td {
padding: 2px 5px;
}
/* Estilos para los proyectos (activos y completados) */
.project-card {
border: 2px solid gray;
font-size: 12px;
background-color: white;
}
.project-card.completado {
background-color: lightgray;
}
.project-header {
font-weight: bold;
text-align: center;
padding: 4px;
border-bottom: 1px solid gray;
}
.project-body {
padding: 5px;
text-align: center;
}
.project-assets-req,
.project-assets-asig {
display: flex;
justify-content: center;
gap: 5px;
margin-top: 5px;
}
.project-assets-req span,
.project-assets-asig span {
padding: 4px;
color: white;
border-radius: 3px;
min-width: 30px;
text-align: center;
}
.project-footer {
background-color: silver;
text-align: center;
padding: 3px;
font-size: 11px;
border-top: 1px solid gray;
}
/* Clases de activos (copiadas de colaborando2.php) */
.actNinguno {
background-color: white;
color: black !important;
border: 1px solid #ccc;
}
.actPersonalCalificado {
background-color: yellow;
color: black !important;
}
.actAnalistas {
background-color: orange;
color: black !important;
}
.actFlujoDeEfectivo {
background-color: limegreen;
color: black !important;
}
.actCreditoEInversion {
background-color: blueviolet;
color: white !important;
}
.actTecnologia {
background-color: red;
color: white !important;
}
.actTransporteYMaquinaria {
background-color: blue;
color: white !important;
}
/* Estilo para drag-drop de recuperación */
.asset-recover {
cursor: grab;
}
.nav-button {
display: inline-block;
padding: 6px 10px;
font-size: 14px;
font-weight: bold;
color: #fff !important;
background-color: #007bff;
border-radius: 4px;
text-decoration: none;
text-align: center;
}
.nav-button:hover {
background-color: #0056b3;
}
</style>
<!-- Scripts base -->
<script src="js/jquery-3.5.1.min.js"></script>
<script src="js/jquery-ui.min.js"></script>
<script src="colaborando_arreglos.js?v=<?php echo filemtime('colaborando_arreglos.js'); ?>"></script>
<script src="manejoDeSesiones.js?v=<?php echo filemtime('manejoDeSesiones.js'); ?>"></script>
</head>
<body>
<div class="main-container">
<!-- =================================================================
COLUMNA 1: RESUMEN GENERAL (IZQUIERDA)
================================================================== -->
<div class="column column-left">
<div class="card">
<img id="logo" src="img/logoColaborando-tablero.png" style="width:100%">
<div style="display: flex; justify-content: space-between; align-items: center; padding: 5px 10px;">
<div id="nombreSesion" style="font-weight: bold; font-size: 16px; color: #555;"></div>
<a href="colaborando2.php?n=<?php echo htmlspecialchars($_GET['n'] ?? $_GET['nombre'] ?? ''); ?>" class="nav-button">Ir al Tablero</a>
</div>
</div>
<div class="card">
<table style="width:100%; text-align:center; vertical-align: top;">
<tr>
<td style="width:40%; padding-top: 20px;">
<span id="resumenTrimestre" style="font-size:1.5em; font-weight:bold; color: #007bff;">
</span>
&nbsp;
<span id="resumenQuincena" style="font-size:1.5em; font-weight:bold; color: #007bff;">
</span>
</td>
<td style="width:60%;">
<div id="timer"><span id="time" style="font-size:20px;">2:00</span></div>
<div class="button-container">
<button id="relojStartPauseButton" onclick="relojToggleTimer()">Iniciar</button>
<!-- <button onclick="relojPauseTimer()">Pausar</button> -->
<button onclick="relojResumeTimer()">Continuar</button>
</div>
<input type="range" id="timeRange" min="1" max="3" value="1" step="1" oninput="relojUpdateTime()">
<div id="rangeValue" style="font-weight: bold;">2 min</div>
</td>
</tr>
</table>
<!-- Hidden elements to keep jsCode.js and other logic working -->
<div style="display:none;">
<div id="trimestre">
<table>
<tr>
<td id="T1">1</td>
<td id="T2">2</td>
<td id="T3">3</td>
<td id="T4">4</td>
</tr>
</table>
</div>
<div id="quincena">
<table id="tablaQuincena">
<tr>
<td><button id="bMenos"></button></td>
<td><input id="etQuincena" type="text" value="1"></td>
<td><button id="bMas"></button></td>
</tr>
</table>
</div>
</div>
</div>
<div class="card">
<table id="tablaActivos" class="summary-table">
<thead>
<tr>
<th colspan="2">ACTIVOS</th>
<th>Producción</th>
<th>Recuperación</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="2" class="actPersonalCalificado" style="color:black!important;">Personal calificado</td>
<td id="activosPersonalCalificado"></td>
<td id="recuperacionPersonalCalificado"></td>
</tr>
<tr>
<td colspan="2" class="actAnalistas" style="color:black!important;">Analistas</td>
<td id="activosAnalistas"></td>
<td id="recuperacionAnalistas"></td>
</tr>
<tr>
<td colspan="2" class="actFlujoDeEfectivo" style="color:black!important;">Flujo de efectivo</td>
<td id="activosFlujoDeEfectivo"></td>
<td id="recuperacionFlujoDeEfectivo"></td>
</tr>
<tr>
<td colspan="2" class="actCreditoEInversion">Crédito e Inversión</td>
<td id="activosCreditoEInversion"></td>
<td id="recuperacionCreditoEInversion"></td>
</tr>
<tr>
<td colspan="2" class="actTecnologia">Tecnología</td>
<td id="activosTecnologia"></td>
<td id="recuperacionTecnologia"></td>
</tr>
<tr>
<td colspan="2" class="actTransporteYMaquinaria">Transporte y Maquinaria</td>
<td id="activosTransporteYMaquinaria"></td>
<td id="recuperacionTransporteYMaquinaria"></td>
</tr>
</tbody>
</table>
</div>
<div class="card">
<h2>PROGRESIÓN</h2>
<!-- Aquí se podría agregar una librería de gráficos para la gráfica -->
<div id="grafico-progresion" style="height: 100px; background-color: #f0f0f0; border: 1px solid #ccc;"></div>
<table class="summary-table" style="margin-top: 10px;">
<thead>
<tr>
<th></th>
<th>T1</th>
<th>T2</th>
<th>T3</th>
<th>T4</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ingreso</td>
<td id="ingresoT1">$0</td>
<td id="ingresoT2">$0</td>
<td id="ingresoT3">$0</td>
<td id="ingresoT4">$0</td>
</tr>
<tr>
<td>Acumulado</td>
<td id="acumuladoT1">$0</td>
<td id="acumuladoT2">$0</td>
<td id="acumuladoT3">$0</td>
<td id="acumuladoT4">$0</td>
</tr>
</tbody>
</table>
</div>
<div class="card">
<h2>PROYECTOS</h2>
<table id="resumen-proyectos" class="summary-table">
<!-- Contenido se llenará con JS -->
</table>
</div>
<div class="card">
<h2>INCIDENCIAS</h2>
<table id="resumen-incidencias" class="summary-table">
<!-- Contenido se llenará con JS -->
</table>
</div>
</div>
<!-- =================================================================
COLUMNA 2: DEPARTAMENTOS
================================================================== -->
<div class="column column-depts">
<h2>DEPARTAMENTOS</h2>
<!-- MarketingYVentas -->
<div class="card">
<table style="width:100%;" class="departamentos droppableRecursos droppable-asset-recovery" id="MarketingYVentas">
<tr style="border-bottom: 1px solid gray; height: 35px;">
<td style="width: 70%;"><span id="nombreDeptoCh">MARKETING Y VENTAS</span></td>
<td style="text-align:right;" colspan="2">
<span style="border:1px solid black;padding:5px;" class="actPersonalCalificado draggable activo-item" id="activoCh1">0</span>
<span style="border:1px solid black;padding:5px;" class="actFlujoDeEfectivo draggable activo-item" id="activoCh2">0</span>
</td>
</tr>
<tr style="vertical-align:middle;">
<td style="text-align:center;">
<img src="img/tiempoCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="tiempoCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/personalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="personalCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/capitalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="capitalCh" class="draggable recurso-item">0</div>
</td>
</tr>
</table>
</div>
<!-- Finanzas -->
<div class="card">
<table style="width:100%;" class="departamentos droppableRecursos droppable-asset-recovery" id="Finanzas">
<tr style="border-bottom: 1px solid gray; height: 35px;">
<td style="width: 70%;"><span id="nombreDeptoCh">FINANZAS</span></td>
<td style="text-align:right;" colspan="2">
<span style="border:1px solid black;padding:5px;" class="actFlujoDeEfectivo draggable activo-item" id="activoCh1">0</span>
<span style="border:1px solid black;padding:5px;" class="actCreditoEInversion draggable activo-item" id="activoCh2">0</span>
</td>
</tr>
<tr style="vertical-align:middle;">
<td style="text-align:center;">
<img src="img/tiempoCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="tiempoCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/personalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="personalCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/capitalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="capitalCh" class="draggable recurso-item">0</div>
</td>
</tr>
</table>
</div>
<!-- InvestigacionYDesarrollo -->
<div class="card">
<table style="width:100%;" class="departamentos droppableRecursos droppable-asset-recovery" id="InvestigacionYDesarrollo">
<tr style="border-bottom: 1px solid gray; height: 35px;">
<td style="width: 70%;"><span id="nombreDeptoCh">INVESTIGACIÓN Y DESARROLLO</span></td>
<td style="text-align:right;" colspan="2">
<span style="border:1px solid black;padding:5px;" class="actCreditoEInversion draggable activo-item" id="activoCh1">0</span>
<span style="border:1px solid black;padding:5px;" class="actTecnologia draggable activo-item" id="activoCh2">0</span>
</td>
</tr>
<tr style="vertical-align:middle;">
<td style="text-align:center;">
<img src="img/tiempoCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="tiempoCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/personalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="personalCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/capitalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="capitalCh" class="draggable recurso-item">0</div>
</td>
</tr>
</table>
</div>
<!-- LogisticaYSistemas -->
<div class="card">
<table style="width:100%;" class="departamentos droppableRecursos droppable-asset-recovery" id="LogisticaYSistemas">
<tr style="border-bottom: 1px solid gray; height: 35px;">
<td style="width: 70%;"><span id="nombreDeptoCh">LOGÍSTICA Y SISTEMAS</span></td>
<td style="text-align:right;" colspan="2">
<span style="border:1px solid black;padding:5px;" class="actTecnologia draggable activo-item" id="activoCh1">0</span>
<span style="border:1px solid black;padding:5px;" class="actTransporteYMaquinaria draggable activo-item" id="activoCh2">0</span>
</td>
</tr>
<tr style="vertical-align:middle;">
<td style="text-align:center;">
<img src="img/tiempoCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="tiempoCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/personalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="personalCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/capitalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="capitalCh" class="draggable recurso-item">0</div>
</td>
</tr>
</table>
</div>
<!-- Operaciones -->
<div class="card">
<table style="width:100%;" class="departamentos droppableRecursos droppable-asset-recovery" id="Operaciones">
<tr style="border-bottom: 1px solid gray; height: 35px;">
<td style="width: 70%;"><span id="nombreDeptoCh">OPERACIONES</span></td>
<td style="text-align:right;" colspan="2">
<span style="border:1px solid black;padding:5px;" class="actTransporteYMaquinaria draggable activo-item" id="activoCh1">0</span>
<span style="border:1px solid black;padding:5px;" class="actAnalistas draggable activo-item" id="activoCh2">0</span>
</td>
</tr>
<tr style="vertical-align:middle;">
<td style="text-align:center;">
<img src="img/tiempoCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="tiempoCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/personalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="personalCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/capitalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="capitalCh" class="draggable recurso-item">0</div>
</td>
</tr>
</table>
</div>
<!-- RecursosHumanos -->
<div class="card">
<table style="width:100%;" class="departamentos droppableRecursos droppable-asset-recovery" id="RecursosHumanos">
<tr style="border-bottom: 1px solid gray; height: 35px;">
<td style="width: 70%;"><span id="nombreDeptoCh">RECURSOS HUMANOS</span></td>
<td style="text-align:right;" colspan="2">
<span style="border:1px solid black;padding:5px;" class="actPersonalCalificado draggable activo-item" id="activoCh1">0</span>
<span style="border:1px solid black;padding:5px;" class="actAnalistas draggable activo-item" id="activoCh2">0</span>
</td>
</tr>
<tr style="vertical-align:middle;">
<td style="text-align:center;">
<img src="img/tiempoCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="tiempoCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/personalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="personalCh" class="draggable recurso-item">0</div>
</td>
<td style="text-align:center;">
<img src="img/capitalCH.png" style="width: 30px; height: 30px; vertical-align: middle;">
<div style="vertical-align:middle; display:inline-block; font-weight:bold; font-size:16px;" id="capitalCh" class="draggable recurso-item">0</div>
</td>
</tr>
</table>
</div>
</div>
<!-- =================================================================
COLUMNA 3: PROYECTOS TERMINADOS
================================================================== -->
<div class="column column-completed">
<h2>PROYECTOS TERMINADOS (T)</h2>
<div id="completed-projects-container">
<!-- Los proyectos completados del trimestre se insertan aquí por JS -->
</div>
</div>
<!-- =================================================================
COLUMNA 4: PROYECTOS ACTIVOS
================================================================== -->
<div class="column column-active">
<h2>PROYECTOS ACTIVOS</h2>
<div id="active-projects-container" style="display: flex; flex-wrap: wrap; gap: 10px; align-content: flex-start;">
<!-- Los proyectos activos se insertan aquí por JS -->
</div>
</div>
</div>
<!-- =================================================================
JAVASCRIPT
================================================================== -->
<script src="jsCode.js?v=<?php echo filemtime('jsCode.js'); ?>"></script>
<script>
// Sobreescribimos 'continuamos' para añadir la lógica de esta pantalla
const originalContinuamos = continuamos;
continuamos = function() {
originalContinuamos();
actualizarResumenUI();
};
// YA NO SE NECESITA la función local `llenaDepartamentoGde` porque ahora usamos la de jsCode.js
function formatCurrency(value) {
return new Intl.NumberFormat('es-MX', {
style: 'currency',
currency: 'MXN',
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(value);
}
/**
* Actualiza la UI de una tarjeta de departamento en la pantalla de resumen.
* Usa IDs porque ahora la estructura es como en colaborando2.php
*/
function actualizarTarjetaDepto(deptoId) {
const deptoArr = arreglosDeptos['arr' + deptoId];
const deptoCard = $('#' + deptoId);
if (!deptoArr || !deptoCard.length) return;
// Actualizar recursos
deptoCard.find('#tiempoCh').text(findArrayValue(deptoArr, 'recursoTiempo'));
deptoCard.find('#personalCh').text(findArrayValue(deptoArr, 'recursoPersonal'));
deptoCard.find('#capitalCh').text(findArrayValue(deptoArr, 'recursoCapital'));
// Actualizar activos
deptoCard.find('#activoCh1').text(findArrayValue(deptoArr, 'activo1'));
deptoCard.find('#activoCh2').text(findArrayValue(deptoArr, 'activo2'));
}
function actualizarResumenUI() {
console.log("Actualizando UI de Resumen...");
const quincena = parseInt($('#etQuincena').val()) || 1;
const trimestreActual = Math.floor((quincena - 1) / 6) + 1;
$('#resumenTrimestre').text(`T${trimestreActual}`);
$('#resumenQuincena').text(`Q${quincena}`);
// --- 1. Actualizar Progresión ---
$('#ingresoT1').text(formatCurrency(arregloGeneral.trimestre1 || 0));
$('#ingresoT2').text(formatCurrency(arregloGeneral.trimestre2 || 0));
$('#ingresoT3').text(formatCurrency(arregloGeneral.trimestre3 || 0));
$('#ingresoT4').text(formatCurrency(arregloGeneral.trimestre4 || 0));
let acumulado = 0;
acumulado += (arregloGeneral.trimestre1 || 0);
$('#acumuladoT1').text(formatCurrency(acumulado));
acumulado += (arregloGeneral.trimestre2 || 0);
$('#acumuladoT2').text(formatCurrency(acumulado));
acumulado += (arregloGeneral.trimestre3 || 0);
$('#acumuladoT3').text(formatCurrency(acumulado));
acumulado += (arregloGeneral.trimestre4 || 0);
$('#acumuladoT4').text(formatCurrency(acumulado));
// --- 2. Contar y mostrar resumen de Proyectos e Incidencias ---
let conteoProyectos = {
1: {
concretados: 0
},
2: {
concretados: 0
},
3: {
concretados: 0
},
4: {
concretados: 0
}
};
let conteoIncidencias = {
1: {
resueltos: 0
},
2: {
resueltos: 0
},
3: {
resueltos: 0
},
4: {
resueltos: 0
}
};
let proyectosEnProceso = 0;
let incidenciasEnProceso = 0;
proyectos.forEach(p => {
const esIncidencia = p.dificultad === 'Incidencia';
const trimestreCompletado = p.trimestreCompletado;
if (p.estatus === 'Completado') {
if (esIncidencia) {
if (!conteoIncidencias[trimestreCompletado]) conteoIncidencias[trimestreCompletado] = {
resueltos: 0
};
conteoIncidencias[trimestreCompletado].resueltos++;
} else {
if (!conteoProyectos[trimestreCompletado]) conteoProyectos[trimestreCompletado] = {
concretados: 0
};
conteoProyectos[trimestreCompletado].concretados++;
}
} else if (p.estatus === 'En proceso') {
if (esIncidencia) {
incidenciasEnProceso++;
} else {
proyectosEnProceso++;
}
}
});
$('#resumen-proyectos').html(`
<thead><tr><th></th><th>T1</th><th>T2</th><th>T3</th><th>T4</th></tr></thead>
<tbody>
<tr><td>En Proceso</td><td colspan="4">${proyectosEnProceso}</td></tr>
<tr><td>Concretados</td><td>${conteoProyectos[1].concretados}</td><td>${conteoProyectos[2].concretados}</td><td>${conteoProyectos[3].concretados}</td><td>${conteoProyectos[4].concretados}</td></tr>
</tbody>
`);
$('#resumen-incidencias').html(`
<thead><tr><th></th><th>T1</th><th>T2</th><th>T3</th><th>T4</th></tr></thead>
<tbody>
<tr><td>En Proceso</td><td colspan="4">${incidenciasEnProceso}</td></tr>
<tr><td>Resueltos</td><td>${conteoIncidencias[1].resueltos}</td><td>${conteoIncidencias[2].resueltos}</td><td>${conteoIncidencias[3].resueltos}</td><td>${conteoIncidencias[4].resueltos}</td></tr>
</tbody>
`);
// --- 3. Llenar columnas de proyectos ---
const completedContainer = $('#completed-projects-container');
const activeContainer = $('#active-projects-container');
completedContainer.empty();
activeContainer.empty();
$('.column-completed h2').text(`PROYECTOS TERMINADOS (T${trimestreActual})`);
proyectos.forEach(p => {
if (p.estatus === 'Completado' && p.trimestreCompletado === trimestreActual) {
completedContainer.append(crearTarjetaProyecto(p, true));
} else if (p.estatus === 'En proceso') {
activeContainer.append(crearTarjetaProyecto(p, false));
}
});
// --- 4. Actualizar todas las tarjetas de departamento con los datos cargados ---
const deptoIds = ["MarketingYVentas", "Finanzas", "InvestigacionYDesarrollo", "LogisticaYSistemas", "Operaciones", "RecursosHumanos"];
deptoIds.forEach(deptoId => {
actualizarTarjetaDepto(deptoId);
});
// --- 5. Inicializar todas las interacciones de Drag & Drop ---
inicializarInteraccionesDragDrop();
// --- 6. Seleccionar el primer departamento para activar la vista
// La función original en jsCode.js ya se encarga de esto al final de `continuamos()`
}
function crearTarjetaProyecto(proyecto, esCompletado) {
const colores = ['amarillo', 'naranjas', 'verdes', 'azules', 'rojos', 'morados'];
let activosReqHtml = '';
let activosAsigHtml = '';
const coloresConValores = colores
.filter(color => proyecto[color] !== null && proyecto[color] > 0)
.map(color => ({
color,
valor: proyecto[color]
}));
let laClase = '';
for (let i = 0; i < 3; i++) {
if (i < coloresConValores.length) {
const activo = coloresConValores[i];
const claseActivo = 'act' + getClassNameFromColor(activo.color);
activosReqHtml += `<span class="${claseActivo}">${activo.valor}</span>`;
const draggableClass = esCompletado ? 'asset-recover' : '';
const assetId = `asset-${proyecto.id}-${i}`;
activosAsigHtml += `<span id="${assetId}" class="${claseActivo} ${draggableClass}" data-asset-type="${getClassNameFromColor(activo.color)}">${proyecto['activoAsignado' + (i + 1)]}</span>`;
} else {
activosReqHtml += `<span class="actNinguno"></span>`;
activosAsigHtml += `<span class="actNinguno"></span>`;
}
}
const completadoClass = esCompletado ? 'completado' : '';
return `
<div class="project-card ${completadoClass}" style="flex-basis: 48%;">
<div class="project-header">${proyecto.nombreProyecto.toUpperCase()}</div>
<div class="project-body">
<i>${proyecto.descripcion}</i>
<div class="project-assets-req">${activosReqHtml}</div>
<div class="project-assets-asig">${activosAsigHtml}</div>
</div>
<div class="project-footer">MANTENIMIENTO: ${proyecto.mantenimiento}</div>
</div>
`;
}
function getClassNameFromColor(color) {
switch (color) {
case 'amarillo':
return 'PersonalCalificado';
case 'naranjas':
return 'Analistas';
case 'verdes':
return 'FlujoDeEfectivo';
case 'azules':
return 'TransporteYMaquinaria';
case 'rojos':
return 'Tecnologia';
case 'morados':
return 'CreditoEInversion';
default:
return 'Ninguno';
}
}
function inicializarInteraccionesDragDrop() {
console.log("[RESUMEN] Inicializando interacciones de Drag & Drop...");
// 1. DRAGGABLE: Hacemos arrastrables los activos de proyectos terminados.
$('.asset-recover').draggable({
revert: "invalid",
helper: "clone",
start: function(event, ui) {
if (parseInt($(this).text()) === 0) {
return false;
}
ui.helper.css('z-index', 100);
}
});
// La lógica DRAGGABLE para los recursos del departamento activo ya está en jsCode.js.
// 2. DROPPABLE: Se crea UN SOLO manejador para las tablas de departamento,
// que acepta tanto recursos como activos, evitando que una inicialización
// sobrescriba a la otra.
$('.departamentos.droppableRecursos').droppable({
accept: ".recurso-item, .asset-recover", // Acepta ambos tipos de elementos.
drop: function(event, ui) {
console.log(`[DROP EVENT] -> Elemento soltado en: ${this.id}. Elemento arrastrado:`, ui.draggable[0]);
// LÓGICA PARA RECURSOS (adaptada de jsCode.js)
if (ui.draggable.hasClass('recurso-item')) {
console.log("[DROP EVENT] -> Es un 'recurso-item'. Ejecutando lógica de intercambio.");
var droppedText = ui.draggable.text();
var originalValue = parseInt(droppedText) || 0;
// <<<< LÍNEA CLAVE: Regresa el elemento a su posición original >>>>
ui.draggable.css({
top: originalPosition.top,
left: originalPosition.left
});
if (originalValue === 0) {
console.log("[DROP EVENT] -> Recurso de origen tiene 0. Cancelando.");
return;
}
var newValue = originalValue - 1;
var audio = new Audio('./Microwave_bell.wav');
audio.play();
// Actualiza el texto del elemento original que se está arrastrando
ui.draggable.text(newValue);
// Determina qué tipo de recurso es y actualiza los arreglos y la UI
if (ui.draggable.attr("id") == 'recursoDispTiempoGde') {
$('#' + this.id + ' #tiempoCh').text(parseInt($('#' + this.id + ' #tiempoCh').text()) + 1);
setArrayValue(arreglosDeptos['arr' + this.id], 'recursoTiempo', parseInt($('#' + this.id + ' #tiempoCh').text()));
setArrayValue(arreglosDeptos['arr' + deptoActual], 'recursoTiempo', newValue);
$('#' + deptoActual + ' #tiempoCh').text(newValue);
} else if (ui.draggable.attr("id") == 'recursoDispPersonalGde') {
$('#' + this.id + ' #personalCh').text(parseInt($('#' + this.id + ' #personalCh').text()) + 1);
setArrayValue(arreglosDeptos['arr' + this.id], 'recursoPersonal', parseInt($('#' + this.id + ' #personalCh').text()));
setArrayValue(arreglosDeptos['arr' + deptoActual], 'recursoPersonal', newValue);
$('#' + deptoActual + ' #personalCh').text(newValue);
} else if (ui.draggable.attr("id") == 'recursoDispCapitalGde') {
$('#' + this.id + ' #capitalCh').text(parseInt($('#' + this.id + ' #capitalCh').text()) + 1);
setArrayValue(arreglosDeptos['arr' + this.id], 'recursoCapital', parseInt($('#' + this.id + ' #capitalCh').text()));
setArrayValue(arreglosDeptos['arr' + deptoActual], 'recursoCapital', newValue);
$('#' + deptoActual + ' #capitalCh').text(newValue);
}
}
// LÓGICA PARA ACTIVOS (la que ya estaba en resumen.php)
else if (ui.draggable.hasClass('asset-recover')) {
console.log("[DROP EVENT] -> Es un 'asset-recover'. Ejecutando lógica de recuperación.");
const deptoId = $(this).attr('id');
const assetType = ui.draggable.data('asset-type');
const assetElementId = ui.draggable.attr('id');
const costoRecuperacion = arreglosActivos['arr' + assetType];
const costoT = findArrayValue(costoRecuperacion, 'recuperacionTiempo');
const costoP = findArrayValue(costoRecuperacion, 'recuperacionPersonal');
const costoC = findArrayValue(costoRecuperacion, 'recuperacionCapital');
const deptoArr = arreglosDeptos['arr' + deptoId];
const recT = findArrayValue(deptoArr, 'recursoTiempo');
const recP = findArrayValue(deptoArr, 'recursoPersonal');
const recC = findArrayValue(deptoArr, 'recursoCapital');
if (recT >= costoT && recP >= costoP && recC >= costoC) {
setArrayValue(deptoArr, 'recursoTiempo', recT - costoT);
setArrayValue(deptoArr, 'recursoPersonal', recP - costoP);
setArrayValue(deptoArr, 'recursoCapital', recC - costoC);
let activoSlot = '';
if (findArrayValue(deptoArr, 'activo1Tipo') === assetType) activoSlot = 'activo1';
else if (findArrayValue(deptoArr, 'activo2Tipo') === assetType) activoSlot = 'activo2';
if (activoSlot) {
const valorActualActivo = findArrayValue(deptoArr, activoSlot);
setArrayValue(deptoArr, activoSlot, valorActualActivo + 1);
const assetElement = $(`#${assetElementId}`);
const currentCount = parseInt(assetElement.text());
assetElement.text(currentCount - 1);
const assetIdParts = assetElementId.split('-');
const projectId = parseInt(assetIdParts[1]);
const assetIndex = parseInt(assetIdParts[2]);
const projectToUpdate = proyectos.find(p => p.id === projectId);
if (projectToUpdate) {
const assetSlotName = `activoAsignado${assetIndex + 1}`;
if (projectToUpdate[assetSlotName] > 0) {
projectToUpdate[assetSlotName]--;
}
}
actualizarTarjetaDepto(deptoId);
var audio = new Audio('./Microwave_bell.wav');
audio.play();
} else {
alert(`El departamento ${deptoId} no puede almacenar activos de tipo ${assetType}.`);
setArrayValue(deptoArr, 'recursoTiempo', recT);
setArrayValue(deptoArr, 'recursoPersonal', recP);
setArrayValue(deptoArr, 'recursoCapital', recC);
}
} else {
alert("Recursos insuficientes en el departamento para recuperar este activo.");
}
}
},
over: function(event, ui) {
// Lógica combinada para el 'over'
if (ui.draggable.hasClass('recurso-item') && $(this).attr('id') !== deptoActual) {
$(this).parent().css('background-color', '#e9f5e9'); // Pinta el div.card
} else if (ui.draggable.hasClass('asset-recover')) {
$(this).parent().css('background-color', '#e9f5e9'); // Pinta el div.card
}
},
out: function(event, ui) {
$(this).parent().css('background-color', ''); // Limpia el color del div.card
}
});
}
// Listener para los botones de quincena para actualizar la UI
$('#bMas, #bMenos').on('click', function() {
setTimeout(actualizarResumenUI, 100);
});
// El listener para el click en .departamentos ya está en jsCode.js y funcionará ahora
</script>
</body>
</html>