- Resumen de activos en la esquina inferior izq del resumen

- Correccion en la habilidad de reordenamiento
- Se agregaron los activos, penalizacin y potencial al reordenamiento
This commit is contained in:
2026-06-11 21:56:02 -06:00
parent f8e7a0d7b9
commit fea2ae1659
4 changed files with 401 additions and 61 deletions
+145 -61
View File
@@ -443,9 +443,6 @@ function llenaProyectoGde(proyectoNum) {
$('#activoReqProyectoCant2').text(proyectos[proyectoNum].activoAsignado2)
$('#activoReqProyectoCant3').text(proyectos[proyectoNum].activoAsignado3)
$('#mantoGde').text('MANTENIMIENTO ' + proyectos[proyectoNum].mantenimiento)
// Quitamos el proyecto actual del arreglo siguientesProyectos.
siguientesProyectos.splice(0, 1)
}
/**
@@ -972,6 +969,15 @@ function redibujarTablero() {
// Prioridad 3: Si no hay ninguno 'En proceso', tomar el primero de la cola 'En siguientes'.
if (!nuevoProyectoGde) {
nuevoProyectoGde = proyectos.find((p) => p.estatus === 'En siguientes')
if (nuevoProyectoGde) {
let index = siguientesProyectos.findIndex(
(p) => p.id === nuevoProyectoGde.id
)
if (index !== -1) {
siguientesProyectos.splice(index, 1)
sincronizarColaSiguientes()
}
}
}
// 2. Limpiar todos los slots de proyectos chicos.
@@ -1980,7 +1986,7 @@ $('#accionHabilidadEspecial').click(function () {
guardaSesion()
}
} else if (accionQuincenal === 'Ordenar los próximos 5 proyectos') {
abrirDialogoOrdenarProyectos(elArreglo, quincenaActual);
abrirDialogoOrdenarProyectos(elArreglo, quincenaActual)
} else if (accionQuincenal === 'Omitir un mantenimiento') {
// Actualizamos lastUsed
setArrayValue(elArreglo, 'accionEspecialLastUsed', quincenaActual)
@@ -3373,6 +3379,8 @@ function continuamos() {
obtenerProyectosPendientes()
if (siguientesProyectos.length > 0) {
llenaProyectoGde(siguientesProyectos[0].id)
siguientesProyectos.splice(0, 1)
sincronizarColaSiguientes()
}
} else {
// JUEGO CARGADO
@@ -3431,7 +3439,17 @@ function continuamos() {
// 4. Reconstruir la cola de 'siguientesProyectos'.
// Primero, tomar los que ya estaban 'En siguientes' del estado guardado.
siguientesProyectos = proyectos.filter((p) => p.estatus === 'En siguientes')
let tempSiguientes = proyectos.filter((p) => p.estatus === 'En siguientes')
if (arregloGeneral.siguientesProyectosIds) {
tempSiguientes.sort((a, b) => {
let idxA = arregloGeneral.siguientesProyectosIds.indexOf(a.id)
let idxB = arregloGeneral.siguientesProyectosIds.indexOf(b.id)
if (idxA === -1) idxA = 999
if (idxB === -1) idxB = 999
return idxA - idxB
})
}
siguientesProyectos = tempSiguientes
// Luego, completar la cola con proyectos 'Pendiente' si es necesario.
const proyectosPendientes = proyectos.filter(
@@ -3455,6 +3473,7 @@ function continuamos() {
siguientesProyectos.push(proyectoElegido)
proyectosDisponibles.splice(randomIndex, 1)
}
sincronizarColaSiguientes()
// 5. Llenar el proyecto grande.
if (proyectoGde) {
@@ -3462,6 +3481,8 @@ function continuamos() {
} else if (siguientesProyectos.length > 0) {
// Si no había ningún proyecto en el tablero, tomar el primero de la cola.
llenaProyectoGde(siguientesProyectos[0].id)
siguientesProyectos.splice(0, 1)
sincronizarColaSiguientes()
}
}
@@ -3696,82 +3717,145 @@ window.confirm = function (message, callback, customWidth) {
})
}
function sincronizarColaSiguientes() {
if (typeof arregloGeneral !== 'undefined' && siguientesProyectos) {
arregloGeneral.siguientesProyectosIds = siguientesProyectos.map((p) => p.id)
}
}
function abrirDialogoOrdenarProyectos(elArreglo, quincenaActual) {
let proyectosAOrdenar = siguientesProyectos.slice(0, 5);
let proyectosRestantes = siguientesProyectos.slice(5);
let proyectosAOrdenar = siguientesProyectos.slice(0, 5)
let proyectosRestantes = siguientesProyectos.slice(5)
let container = $('<div></div>');
container.append('<p style="margin-bottom: 15px; font-size: 14px;">Arrastra los proyectos para ordenar la prioridad en la que aparecerán:</p>');
let container = $('<div></div>')
container.append(
'<p style="margin-bottom: 15px; font-size: 14px;">Arrastra los proyectos para ordenar la prioridad en la que aparecerán:</p>'
)
let list = $(
'<ul id="sortable-proyectos" style="list-style-type: none; padding: 0; margin: 0;"></ul>'
)
const claseMapa = {
amarillo: 'actPersonalCalificado',
naranjas: 'actAnalistas',
verdes: 'actFlujoDeEfectivo',
azules: 'actTransporteYMaquinaria',
rojos: 'actTecnologia',
morados: 'actCreditoEInversion',
}
const colores = [
'amarillo',
'naranjas',
'verdes',
'azules',
'rojos',
'morados',
]
let list = $('<ul id="sortable-proyectos" style="list-style-type: none; padding: 0; margin: 0;"></ul>');
proyectosAOrdenar.forEach((p, idx) => {
let activosReqHtml = ''
colores.forEach((color) => {
const valor = p[color]
if (valor !== null && valor > 0) {
const claseActivo = claseMapa[color]
const textColor =
color === 'amarillo' || color === 'naranjas' || color === 'verdes'
? 'black'
: 'white'
activosReqHtml += `<span class="${claseActivo}" style="padding: 2px 6px; border-radius: 3px; color: ${textColor}; font-weight: bold; font-size: 11px; margin-right: 4px;">${valor}</span>`
}
})
const penVal = parseInt(p.penalizacion) || 0
const penalizacionFormateada =
penVal > 0 ? '$' + new Intl.NumberFormat('es-MX').format(penVal) : 'N/A'
let item = $(`
<li class="ui-state-default" data-id="${p.id}" style="margin: 8px 0; padding: 10px; border: 2px solid gray; border-radius: 4px; background-color: #f9f9f9; cursor: grab; display: flex; justify-content: space-between; align-items: center; font-size: 14px;">
<span style="font-weight: bold;">${idx + 1}. ${p.nombreProyecto}</span>
<span style="font-size: 11px; background-color: #eee; padding: 2px 6px; border-radius: 3px; color: #555;">${p.departamento}</span>
<li class="ui-state-default" data-id="${p.id}" style="margin: 8px 0; padding: 10px; border: 2px solid gray; border-radius: 4px; background-color: #f9f9f9; cursor: grab; display: flex; flex-direction: column; gap: 6px; font-size: 14px;">
<div style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
<span style="font-weight: bold;">${idx + 1}. ${p.nombreProyecto}</span>
<span style="font-size: 11px; background-color: #eee; padding: 2px 6px; border-radius: 3px; color: #555;">${p.departamento}</span>
</div>
<div style="display: flex; justify-content: space-between; align-items: center; width: 100%; font-size: 12px; color: #666;">
<div style="display: flex; gap: 4px;">
${activosReqHtml}
</div>
<div style="text-align: left; line-height: 1.4;">
Potencial: <b>${p.potencial || 'N/A'}</b><br>
Penalización: <b>${penalizacionFormateada}</b>
</div>
</div>
</li>
`);
list.append(item);
});
container.append(list);
`)
list.append(item)
})
container.append(list)
container.dialog({
modal: true,
title: 'Ordenar Próximos 5 Proyectos',
width: 500,
open: function() {
open: function () {
list.sortable({
placeholder: "ui-state-highlight",
placeholder: 'ui-state-highlight',
forcePlaceholderSize: true,
update: function(event, ui) {
list.find('li').each(function(index) {
let nombre = $(this).find('span').first().text();
nombre = nombre.replace(/^\d+\.\s*/, '');
$(this).find('span').first().text((index + 1) + '. ' + nombre);
});
}
});
list.disableSelection();
$('<style id="sortable-style">.ui-state-highlight { height: 40px; background-color: #ffffcc; border: 2px dashed #999; margin: 8px 0; border-radius: 4px; }</style>').appendTo('head');
update: function (event, ui) {
list.find('li').each(function (index) {
let nombre = $(this).find('span').first().text()
nombre = nombre.replace(/^\d+\.\s*/, '')
$(this)
.find('span')
.first()
.text(index + 1 + '. ' + nombre)
})
},
})
list.disableSelection()
$(
'<style id="sortable-style">.ui-state-highlight { height: 40px; background-color: #ffffcc; border: 2px dashed #999; margin: 8px 0; border-radius: 4px; }</style>'
).appendTo('head')
},
close: function() {
$('#sortable-style').remove();
$(this).dialog('destroy').remove();
close: function () {
$('#sortable-style').remove()
$(this).dialog('destroy').remove()
},
buttons: {
"Guardar Orden": function() {
let nuevoOrdenIds = [];
list.find('li').each(function() {
nuevoOrdenIds.push(parseInt($(this).data('id')));
});
'Guardar Orden': function () {
let nuevoOrdenIds = []
list.find('li').each(function () {
nuevoOrdenIds.push(parseInt($(this).data('id')))
})
let nuevosSiguientes = [];
nuevoOrdenIds.forEach(id => {
let proj = proyectos.find(p => p.id === id);
if (proj) nuevosSiguientes.push(proj);
});
nuevosSiguientes = nuevosSiguientes.concat(proyectosRestantes);
siguientesProyectos = nuevosSiguientes;
let nuevosSiguientes = []
nuevoOrdenIds.forEach((id) => {
let proj = proyectos.find((p) => p.id === id)
if (proj) nuevosSiguientes.push(proj)
})
proyectos.forEach(p => {
if (p.estatus === 'En siguientes') p.estatus = 'Pendiente';
});
siguientesProyectos.forEach(p => {
let proj = proyectos.find(pr => pr.id === p.id);
if (proj) proj.estatus = 'En siguientes';
});
nuevosSiguientes = nuevosSiguientes.concat(proyectosRestantes)
siguientesProyectos = nuevosSiguientes
sincronizarColaSiguientes()
setArrayValue(elArreglo, 'accionEspecialLastUsed', quincenaActual);
var audio = new Audio('./Microwave_bell.wav');
audio.play();
window.alert('¡Orden de proyectos actualizado con éxito!');
proyectos.forEach((p) => {
if (p.estatus === 'En siguientes') p.estatus = 'Pendiente'
})
siguientesProyectos.forEach((p) => {
let proj = proyectos.find((pr) => pr.id === p.id)
if (proj) proj.estatus = 'En siguientes'
})
if (typeof guardaSesion === 'function') guardaSesion();
$(this).dialog('close');
setArrayValue(elArreglo, 'accionEspecialLastUsed', quincenaActual)
var audio = new Audio('./Microwave_bell.wav')
audio.play()
window.alert('¡Orden de proyectos actualizado con éxito!')
if (typeof guardaSesion === 'function') guardaSesion()
$(this).dialog('close')
},
"Cancelar": function() { $(this).dialog('close'); }
}
});
Cancelar: function () {
$(this).dialog('close')
},
},
})
}
// </script>