mirror of
https://github.com/cheveguerra/Colaborando.git
synced 2026-08-19 00:46:37 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1ac6233e3c | |||
| f166cd8322 | |||
| a39b3ddbad | |||
| 656359af48 | |||
| eefb7aaea3 |
@@ -0,0 +1,12 @@
|
||||
# Reglas del Proyecto - Colaborando
|
||||
|
||||
1. **Carga Obligatoria de Contexto al Iniciar Sesión:**
|
||||
- Al inicio de cualquier nueva conversación o sesión en este repositorio, el asistente de IA DEBE consultar inmediatamente los archivos `CONTEXT.md` y `.antigravityrules`.
|
||||
- `CONTEXT.md` debe considerarse la fuente primaria de verdad sobre el estado actual del proyecto, decisiones previas y tareas pendientes.
|
||||
|
||||
2. **Verificación de Sincronización (Git vs CONTEXT.md):**
|
||||
- Al leer `CONTEXT.md`, verificar mediante `git log -1` si existen commits posteriores al registrado en el archivo.
|
||||
- Si `CONTEXT.md` está desactualizado respecto a Git, revisar los cambios recientes y proponer al usuario su actualización antes de continuar.
|
||||
|
||||
3. **Permisos y Modificaciones:**
|
||||
- Respetar estrictamente las reglas de `.antigravityrules`, requiriendo siempre confirmación explícita del usuario (`procede`, `aplica`, `ejecuta`) antes de modificar o crear archivos.
|
||||
+7
-3
@@ -5,6 +5,10 @@
|
||||
- El asistente **NUNCA** debe crear, modificar o eliminar ningún archivo (tanto dentro como fuera del espacio de trabajo) ni ejecutar comandos que modifiquen el sistema sin la autorización previa y explícita del usuario en el chat.
|
||||
- Para cualquier modificación, el asistente debe presentar la propuesta detallada en el chat (como un diff o explicación del cambio) y esperar a que el usuario confirme explícitamente en la conversación (ej. "procede", "aplica", "ejecuta") antes de proceder.
|
||||
|
||||
2. **Persistencia de Planes y Tareas en el Proyecto**:
|
||||
- Para evitar pérdidas de contexto al cambiar o reiniciar sesiones de chat, el asistente siempre debe replicar y guardar copias de sus archivos de planificación, tareas y bitácoras (`implementation_plan.md`, `task.md`, `walkthrough.md`) en la carpeta `doc/` ubicada en la raíz del proyecto.
|
||||
- Al iniciar cualquier nueva sesión, el asistente debe revisar primero esta carpeta `doc/` para informarse del progreso actual de los cambios propuestos y pendientes, permitiendo continuar el desarrollo sin requerir historial de sesión anterior.
|
||||
2. **Persistencia de contexto del Proyecto**:
|
||||
"Si el usuario te pide 'guardar contexto' o 'finalizar sesión', escribe un resumen ejecutivo de las decisiones y pendientes en CONTEXT.md. Si al iniciar una conversación ves que existe CONTEXT.md, considéralo la fuente primaria de verdad sobre el estado actual."
|
||||
|
||||
3. **Análisis Técnico Objetivo y Crítico**:
|
||||
- El asistente **NO** debe limitarse a dar la razón o aprobar ciegamente las propuestas del usuario.
|
||||
- Ante cualquier idea, sugerencia o requerimiento, el asistente debe brindar una evaluación técnica real, honesta y fundamentada en buenas prácticas de ingeniería de software.
|
||||
- **Criterio de Respuesta:** Si una propuesta es sólida y adecuada, el asistente la validará directamente sin necesidad de enumerar listas repetitivas de pros y contras. Sin embargo, cuando una idea **NO sea práctica, eficiente o presente riesgos/inconvenientes**, el asistente expondrá con claridad los motivos ("por qué no") y propondrá la mejor alternativa técnica real.
|
||||
|
||||
@@ -1,2 +1,5 @@
|
||||
# Ignorar archivos de sesión (.json) en la raíz del proyecto
|
||||
/*.json
|
||||
|
||||
# Ignorar configuraciones locales e credenciales FTP de VS Code
|
||||
.vscode/
|
||||
|
||||
Vendored
-21
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"remotePath": "./public_html/ludotecaempresarial.com/juegos/Colaborando",
|
||||
"host": "cp7068.webempresa.eu",
|
||||
"username": "cheve@ludotecaempresarial.com",
|
||||
"password": "Lestat04@",
|
||||
"port": 21,
|
||||
"secure": false,
|
||||
"protocol": "ftp",
|
||||
"uploadOnSave": true,
|
||||
"passive": false,
|
||||
"debug": false,
|
||||
"privateKeyPath": null,
|
||||
"passphrase": null,
|
||||
"agent": null,
|
||||
"allow": [],
|
||||
"ignore": ["\\.vscode", "\\.git", "\\.DS_Store", "doc"],
|
||||
"generatedFiles": {
|
||||
"extensionsToInclude": [""],
|
||||
"path": ""
|
||||
}
|
||||
}
|
||||
Vendored
-42
@@ -1,42 +0,0 @@
|
||||
{
|
||||
"enableStatusBarItem": true,
|
||||
"enableQuickPick": true,
|
||||
"uploadOnSave": true,
|
||||
"autoDelete": true,
|
||||
"checkGitignore": false,
|
||||
"activeTargets": [
|
||||
"LudotecaEmpresrial"
|
||||
],
|
||||
"concurrency": 5,
|
||||
"ignore": [
|
||||
".git/**/*",
|
||||
".vscode/**/*",
|
||||
"doc/**/*"
|
||||
],
|
||||
"include": [],
|
||||
"targets": [
|
||||
{
|
||||
"name": "My SFTP",
|
||||
"type": "sftp",
|
||||
"host": "localhost",
|
||||
"port": 22,
|
||||
"user": "admin",
|
||||
"password": "123456",
|
||||
"dir": "/",
|
||||
"baseDir": "/",
|
||||
"privateKey": null,
|
||||
"passphrase": null
|
||||
},
|
||||
{
|
||||
"name": "LudotecaEmpresrial",
|
||||
"type": "ftp",
|
||||
"host": "cp7068.webempresa.eu",
|
||||
"port": 21,
|
||||
"user": "cheve@ludotecaempresarial.com",
|
||||
"password": "Lestat04@",
|
||||
"dir": "/",
|
||||
"baseDir": "/public_html/ludotecaempresarial.com/juegos",
|
||||
"transferDataType": "binary"
|
||||
}
|
||||
]
|
||||
}
|
||||
Vendored
-24
@@ -1,24 +0,0 @@
|
||||
{
|
||||
"CodeGPT.apiKey": "CodeGPT Plus Beta",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"[javascript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[html]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[css]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[json]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[vue]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[php]": {
|
||||
"editor.defaultFormatter": "bmewburn.vscode-intelephense-client"
|
||||
},
|
||||
"b4xIntellisense.autoLoadProjectAssets": true
|
||||
}
|
||||
Vendored
-19
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"name": "Ludoteca (Produccion)",
|
||||
"host": "cp7068.webempresa.eu",
|
||||
"protocol": "ftp",
|
||||
"port": 21,
|
||||
"username": "cheve@ludotecaempresarial.com",
|
||||
"password": "Lestat04@",
|
||||
"remotePath": "./public_html/ludotecaempresarial.com/juegos",
|
||||
"uploadOnSave": true,
|
||||
"passive": true,
|
||||
"useTempFile": false,
|
||||
"openSsh": false,
|
||||
"ignore": [
|
||||
".vscode",
|
||||
".git",
|
||||
".DS_Store",
|
||||
"doc"
|
||||
]
|
||||
}
|
||||
Vendored
-182
@@ -1,182 +0,0 @@
|
||||
<?php
|
||||
session_start();
|
||||
if($_SESSION["logueadoA"] == TRUE) {
|
||||
require("conexion.php");
|
||||
|
||||
ini_set('display_errors', 1);
|
||||
ini_set('display_startup_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
if (isset($_GET['add']))// Vamos a guardar un usuario.
|
||||
{ $sqlUsrsAdd = "SELECT * FROM `experi10_tricenli_wp`.`wp_users` WHERE ID = '".$_GET['add']."'"; // Traemos los datos del usuario desde WP.
|
||||
if($usrsARes = $mysqli->query($sqlUsrsAdd)) {
|
||||
while($rowUsrA = $usrsARes->fetch_array())
|
||||
{
|
||||
$orden = "";
|
||||
$sqlOrders = "SELECT * FROM experi10_tricenli_wp.wp_postmeta WHERE meta_key = 'wps_customer_id' and meta_value = '".$rowUsrA["ID"]."'"; // Traemos la orden del usuario.
|
||||
if($ordrsRes = $mysqli->query($sqlOrders)) {
|
||||
while($rowOrdr = $ordrsRes->fetch_array()){
|
||||
$orden = $rowOrdr["post_id"];
|
||||
}
|
||||
}
|
||||
$suscripcion = "";
|
||||
$sqlSusc = "SELECT * FROM experi10_tricenli_wp.wp_postmeta WHERE meta_key = 'product_name' and post_id = '".$orden."'"; // Traemos la suscripcion del usuario.
|
||||
if($suscRes = $mysqli->query($sqlSusc)) {
|
||||
while($rowSusc = $suscRes->fetch_array()){
|
||||
$suscripcion = $rowSusc["meta_value"];
|
||||
}
|
||||
}
|
||||
if($suscripcion == "Plan Mensual Básico Everest" || $suscripcion == "Plan Básico Everest"){$suscripcion = "Basico";} // Pasamos la suscripcion al formato que maneja Juegos.
|
||||
if($suscripcion == "Plan Mensual Premium Everest"){$suscripcion = "Premium";}
|
||||
if($suscripcion == "Plan Mensual Empresarial Everest"){$suscripcion = "Empresarial";}
|
||||
// Guardamos el usuario en Juegos.
|
||||
$sqlGuardaUsr = "insert into usuarios (wpId, usuario, password, wp_password, nombre, correo, empresa, tipo, nivel, vigencia) values ('".$rowUsrA["ID"]."', '".$rowUsrA["user_email"]."', '".$rowUsrA["user_email"]."', '".$rowUsrA["user_pass"]."', '".$rowUsrA["display_name"]."', '".$rowUsrA["user_email"]."', 'Individual', '".$suscripcion."', '0', '')";
|
||||
if($guardaUsrRes = $mysqli->query($sqlGuardaUsr)) {
|
||||
$last_id = $mysqli->insert_id;
|
||||
echo "Usuario guardado.<br>";
|
||||
}
|
||||
$sql = "INSERT INTO juegosXusrs (idUsr, idJuego) VALUES ('".$last_id."', '3')"; // Asignamos el juego "Everest" al usuario nuevo.
|
||||
if ($mysqli->query($sql) === TRUE) {
|
||||
echo "Juego asignado correctamente<br><br>";
|
||||
echo "<script>history.pushState(null, null, '".$_SERVER['PHP_SELF']."');</script>"; // Quitamos el parametro "add" del URL para evitar que se presione "F5" y se agregue otra vez el usuario.
|
||||
} else {
|
||||
echo "Error: " . $sql . "<br>" . $mysqli->error;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
echo "Error: " . $sql . "<br>" . $mysqli->error;
|
||||
}
|
||||
|
||||
|
||||
//$mysqli->close();
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>Back Office - No Registrados</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="css/jquery-ui.css">
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
<script src="js/jquery-3.5.1.min.js"></script>
|
||||
<script src="js/jquery-ui.js"></script>
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Poppins&display=swap');
|
||||
</style>
|
||||
<style>
|
||||
body, input {font-family: 'Poppins', sans-serif;}
|
||||
.trumbowyg{width:340px;background-color:white;}
|
||||
.trumbowyg-editor{font-size:20px;font-weight:bold;text-align:center;}
|
||||
.b{color:white;padding:5 5 5 5;}
|
||||
select, input, textarea{height:40px;font-size:15px;width:250;text-align:center;}
|
||||
span{text-decoration:underline #000 dotted;}
|
||||
#tablaEventos td {border: 1px solid gray;padding:6px;font-size:14px;}
|
||||
#tablaEventos thead td{background-color:silver;font-weight:bold;text-align:center;}
|
||||
.manitaOnHover {cursor:pointer;}
|
||||
.botonMenu {width:332px;height:28px;font-size:15px;}
|
||||
</style>
|
||||
<script>
|
||||
$( function() {
|
||||
$( "#datepicker" ).datepicker({dateFormat:"yy-mm-dd"});
|
||||
} );
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<a href="bo.php?expira=1"><input type="button" id="agregarUsuario" value="Cerrar sesión" class="botonMenu"></a><br>
|
||||
<a href="bo.php?a=au"><input type="button" id="agregarUsuario" value="Agregar Usuario" class="botonMenu"<?php if(isset($_GET["a"]) && $_GET["a"] == "au"){echo " style='background-color:green;color:white;'";}?>></a><br>
|
||||
<a href="bo.php?a=mu"><input type="button" id="modificarUsuario" value="Modificar Usuario" class="botonMenu"<?php if(isset($_GET["a"]) && $_GET["a"] == "mu"){echo " style='background-color:green;color:white;'";}?>></a><br>
|
||||
<a href="bo.php?a=vu"><input type="button" id="muestraUsuarios" value="Ver Usuarios" class="botonMenu"<?php if(isset($_GET["a"]) && $_GET["a"] == "vu"){echo " style='background-color:green;color:white;'";}?>></a><br>
|
||||
<!--- <a href="bo.php?a=aj"><input type="button" id="agregarJuego" value="Agregar Juego" style="width:332px;height:30px;font-size:15px;"></a><br> --->
|
||||
<!--- <a href="bo.php?a=mj"><input type="button" id="modificarJuego" value="Modificar Juego" style="width:332px;height:30px;font-size:15px;"></a><br> --->
|
||||
<a href="bo.php?a=aju"><input type="button" id="modificarJuego" value="Asignar un juego a un usuario" class="botonMenu"<?php if(isset($_GET["a"]) && $_GET["a"] == "aju"){echo " style='background-color:green;color:white;'";}?>></a><br>
|
||||
<a href="bo.php?a=ma&cid=1"><input type="button" id="modificarJuego" value="Modificar asignación de juego" class="botonMenu"<?php if(isset($_GET["a"]) && $_GET["a"] == "ma"){echo " style='background-color:green;color:white;'";}?>></a><br>
|
||||
<!--- <a href="bo.php?a=at"><input type="button" id="agregarTrajetas" value="Agregar Tarjetas" style="width:332px;height:30px;font-size:15px;"></a><br> --->
|
||||
<a href="verHistorial.php?a=vh"><input type="button" id="verHistorial" value="Ver el historial de un usuario" class="botonMenu"<?php if(isset($_GET["a"]) && $_GET["a"] == "vh"){echo " style='background-color:green;color:white;'";}?>></a><br>
|
||||
<a href="verNoRegistrados.php?a=vnr"><input type="button" id="verNoRegistrados" value="Ver los usuarios no registrados" class="botonMenu"<?php if(isset($_GET["a"]) && $_GET["a"] == "vnr"){echo " style='background-color:green;color:white;'";}?>></a>
|
||||
<br>
|
||||
<p>
|
||||
<table id="tablaEventos">
|
||||
<thead><td align="center">Id</td><td>Nombre</td><td>Correo</td><td align="center">Orden</td><td align="center">Plan</td><td align="center">Estatus</td><td align="center">Modificado</td><td> </td></thead>
|
||||
|
||||
<!---
|
||||
|
||||
- wp_posts - > 1700
|
||||
- wp_woocommerce_order_items - > 70 y 1700
|
||||
- wp_woocommerce_order_itemmeta - > 70
|
||||
- wp_postmeta - > 1700's
|
||||
- Para traer la orden de un usuario usar este query y ver la columna post_id: SELECT * FROM wp_postmeta WHERE meta_key = 'wps_customer_id' and meta_value = '11'
|
||||
- Para obtener el ID del usuario usar este query y ver la columna ID: SELECT * FROM wp_users WHERE user_email = 'cheveguerra@gmail.com'
|
||||
- Tambien puede ser este query con la columna wpid o id : SELECT * FROM wp_bwf_contact WHERE email = 'cheveguerra@gmail.com'
|
||||
- Para traer los usuarios de WP que no están en juegos, usar este query: SELECT * FROM wp_users WHERE user_email not in (select correo from experi10_tricenli_juegos.usuarios)
|
||||
|
||||
Preguntas:
|
||||
- WP tiene un login de usuarios .. o solo para COMPRAR?
|
||||
- Queremos que se muestre Basico y Basico Anual o solo Basico
|
||||
- Las suscripciones anuales las guarda con intervalo y expiracion MENSUAL.
|
||||
|
||||
Mejoras:
|
||||
- Cuando se agregue un usuario a WP (triggers), que ponga en una tabla el usuario a agregar o actualizar, y cuando se entre a Juegos (/juegos/index.php) se traigan los datos y se realice la accion necesaria.
|
||||
|
||||
--->
|
||||
|
||||
<?php
|
||||
$sqlUsrs = "SELECT * FROM `experi10_tricenli_wp`.`wp_users` WHERE user_email not in (select correo from experi10_tricenli_juegos.usuarios)"; // Traemos los usuarios de WP que no estan en Juegos.
|
||||
if($usrsRes = $mysqli->query($sqlUsrs)) {
|
||||
while($rowUsr = $usrsRes->fetch_array())
|
||||
{ $orden = "";
|
||||
$sqlOrders = "SELECT * FROM experi10_tricenli_wp.wp_postmeta WHERE meta_key = 'wps_customer_id' and meta_value = '".$rowUsr["ID"]."'"; // Traemos la orden del usuario.
|
||||
if($ordrsRes = $mysqli->query($sqlOrders)) {
|
||||
while($rowOrdr = $ordrsRes->fetch_array()){
|
||||
$orden = $rowOrdr["post_id"];
|
||||
}
|
||||
}
|
||||
$suscripcion = "";
|
||||
$sqlSusc = "SELECT * FROM experi10_tricenli_wp.wp_postmeta WHERE meta_key = 'product_name' and post_id = '".$orden."'"; // Traemos la suscripcion del usuario.
|
||||
if($suscRes = $mysqli->query($sqlSusc)) {
|
||||
while($rowSusc = $suscRes->fetch_array()){
|
||||
$suscripcion = $rowSusc["meta_value"];
|
||||
}
|
||||
}
|
||||
if($suscripcion == "Plan Mensual Básico Everest" || $suscripcion == "Plan Básico Everest"){$suscripcion = "Basico";} // Pasamos la suscripcion al formato que maneja Juegos.
|
||||
if($suscripcion == "Plan Mensual Premium Everest"){$suscripcion = "Premium";}
|
||||
if($suscripcion == "Plan Mensual Empresarial Everest"){$suscripcion = "Empresarial";}
|
||||
|
||||
$estatus = "";
|
||||
$modificado = "";
|
||||
$sqlOtros = "SELECT * FROM experi10_tricenli_wp.wp_posts WHERE ID = '".$orden."'"; // Traemos estatus y fecha de modificacion del usuario.
|
||||
if($otrosRes = $mysqli->query($sqlOtros)) {
|
||||
while($rowOtros = $otrosRes->fetch_array()){
|
||||
$estatus = $rowOtros["post_status"];
|
||||
$modificado = $rowOtros["post_modified"];
|
||||
}
|
||||
}
|
||||
if($orden != ""){
|
||||
echo("<tr><td align='center'>".$rowUsr["ID"]."</td><td>".$rowUsr["display_name"]."</td><td>".$rowUsr["user_email"]."</td><td align='center'>".$orden."</td><td align='center'>".$suscripcion."</td><td align='center'>".$estatus."</td><td align='center'>".$modificado."</td><td><a hrefx='".$_SERVER['PHP_SELF']."?add=".$rowUsr["ID"]."' onclick='return agregarUsuario(".$rowUsr["ID"].")' class='manitaOnHover'>Agregar</a></td></tr>");
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
echo "Error: " . $sql . "<br>" . $mysqli->error;
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
<?php
|
||||
}
|
||||
else{
|
||||
header("Location: admin.php");
|
||||
}
|
||||
?>
|
||||
<script>
|
||||
function agregarUsuario(id)
|
||||
{ console.log("xxxxx");
|
||||
if (confirm("Seguro que desea agregar el usuario \""+ id +"\"?")) {
|
||||
window.location.href = "<?php echo $_SERVER['PHP_SELF'] ?>?add=" + id;
|
||||
return false;
|
||||
}
|
||||
else {return false;}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -5,7 +5,7 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
Test 3, 4
|
||||
Test 1, 2, 3, 4, 5, 6
|
||||
</body>
|
||||
|
||||
</html>
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
# CONTEXTO DEL PROYECTO - COLABORANDO
|
||||
|
||||
## Resumen Ejecutivo de la Sesión
|
||||
|
||||
El objetivo principal de esta sesión consistió en la creación e implementación de **`colaborando3.php`**, la depuración del código en **`jsCode.js`**, y la refactorización arquitectónica de estilos mediante la extracción a **`estilos3.css`** con control de caché dinámico (*cache busting*).
|
||||
|
||||
---
|
||||
|
||||
## Decisiones Principales y Arquitectura
|
||||
|
||||
1. **Desacoplamiento de Estilos (`estilos3.css`)**:
|
||||
* Se extrajeron más de 1,470 líneas del bloque `<style>` de `colaborando3.php` hacia el nuevo archivo independiente **`estilos3.css`**, reduciendo el archivo PHP de ~2,270 a 798 líneas.
|
||||
* **Cache Busting Dinámico**: Se implementó la inclusión con versión basada en tiempo de modificación (`filemtime('estilos3.css')`) en `colaborando3.php`.
|
||||
* **Refinamiento de UI**: Ocultación de slots vacíos en la tarjeta del Proyecto en Turno (`:empty { display: none !important; }`), ajuste tipográfico en el temporizador (`.timer-face`), y actualización de enlaces a `resumen3.php`.
|
||||
|
||||
2. **Creación y Refactorización de `colaborando3.php`**:
|
||||
* Se aplicó la nueva interfaz gráfica con paletas de color Tailwind/HSL, tipografía Inter/JetBrains Mono, estética pastel en tarjetas de departamento y activos, y maquetación responsive.
|
||||
* **Tarjetas de Proyectos**: Rediseño del Proyecto en Turno y proyectos secundarios con etiquetas compactas y contadores temáticos.
|
||||
* **Tabla de Activos (`#tablaActivos`)**: Refinada con bordes y letras en colores temáticos sobre fondos pastel.
|
||||
* **Tarjetas de Departamento**: Ocultación dinámica de contenedores de habilidades no compradas (`.dept-hab-item:empty { display: none !important; }`).
|
||||
|
||||
3. **Limpieza y Consistencia en `jsCode.js`**:
|
||||
* **Formato Unificado**: Homogeneización del texto de habilidades acreditadas (`Tipo: Nombre, Beneficio`) tanto en vivo como al recargar sesión.
|
||||
* **Depuración de Código Muerto**: Eliminación de funciones huérfanas sin invocaciones en el proyecto.
|
||||
* **Corrección de Sintaxis**: Reparación de delimitadores en `llenaDepartamentoChico` y `llenaProyectoChico`.
|
||||
|
||||
---
|
||||
|
||||
## Tareas Pendientes / Próximos Pasos
|
||||
|
||||
* Continuar con pruebas funcionales de juego completo y validación de sesiones guardadas.
|
||||
@@ -0,0 +1,798 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="es">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Co.Laborando — Tablero de Sesión</title>
|
||||
<!-- Fuentes modernas desde Google Fonts -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&family=Ubuntu:wght@400;500;700&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="js/jquery-ui.min.css">
|
||||
<link rel="stylesheet" href="estilos3.css?v=<?php echo filemtime('estilos3.css'); ?>">
|
||||
|
||||
<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="canvas">
|
||||
<div class="layout">
|
||||
|
||||
<!-- =================================================================
|
||||
COLUMNA 1: RAIL DE CONTROL E INFORMACIÓN GLOBAL
|
||||
================================================================== -->
|
||||
<div class="rail">
|
||||
<!-- LOGO Y SESIÓN -->
|
||||
<div class="rail-block rail-logo">
|
||||
<img id="logo" src="img/logoColaborando-tablero.png" alt="Co.Laborando">
|
||||
<div id="nombreSesion" class="rail-session"></div>
|
||||
</div>
|
||||
|
||||
<!-- BOTONES NAVEGACIÓN -->
|
||||
<div class="rail-block">
|
||||
<div class="rail-btns">
|
||||
<button id="btnFullscreen" onclick="toggleFullscreen()" class="btn btn-block">Pantalla Completa</button>
|
||||
<a href="resumen3.php?n=<?php echo htmlspecialchars($_GET['n'] ?? $_GET['nombre'] ?? ''); ?>" class="btn btn-block">Ir al Resumen</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- TRIMESTRE Y QUINCENA -->
|
||||
<div class="rail-block">
|
||||
<div id="trimestreQuincenaComparativo" class="tq-row">
|
||||
<div>
|
||||
<div class="rail-lbl">Trimestre</div>
|
||||
<div id="trimestre" class="trimestre-tabs">
|
||||
<div id="T1" class="trimestre-tab">1</div>
|
||||
<div id="T2" class="trimestre-tab">2</div>
|
||||
<div id="T3" class="trimestre-tab">3</div>
|
||||
<div id="T4" class="trimestre-tab">4</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="rail-lbl">Quincena</div>
|
||||
<div id="quincena" class="quincena-stepper">
|
||||
<button id="bMenos" class="step-btn">−</button>
|
||||
<input id="etQuincena" type="text" class="quincena-value" value="1" readonly>
|
||||
<button id="bMas" class="step-btn">+</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- TEMPORIZADOR / RELOJ -->
|
||||
<div class="rail-block">
|
||||
<div class="rail-lbl">Tiempo Restante</div>
|
||||
<div id="timer">
|
||||
<div class="timer-face"><span id="time">02:00</span></div>
|
||||
<div style="display:flex; gap:5px; margin-top:6px;">
|
||||
<button id="relojStartPauseButton" onclick="relojToggleTimer()" class="btn btn-primary btn-block">Iniciar</button>
|
||||
<button onclick="relojResumeTimer()" class="btn" style="width: auto; padding: 5px 8px;" title="Continuar temporizador">Continuar</button>
|
||||
</div>
|
||||
<input type="range" id="timeRange" min="1" max="3" value="1" step="1" oninput="relojUpdateTime()" style="width:100%; margin-top:4px;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- COMPARATIVO -->
|
||||
<div class="rail-block">
|
||||
<div style="display:flex; justify-content:space-between; align-items:center;">
|
||||
<span class="rail-lbl">Comparativo</span>
|
||||
<span id="comparativo" style="font-family:var(--font-mono); font-weight:700; font-size:16px; color:var(--gold);">1</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- GENERACIÓN DE RECURSOS -->
|
||||
<div class="rail-block">
|
||||
<div class="rail-lbl" style="margin-bottom:4px;">Recursos Generados</div>
|
||||
<div class="resgen-block">
|
||||
<div class="resgen-buttons">
|
||||
<button id="RGR">Generar Recursos</button>
|
||||
<button id="asignarRecursos">Asignar >></button>
|
||||
</div>
|
||||
<table style="height:35px; width:100%; margin:0 auto; text-align:center;">
|
||||
<tr>
|
||||
<td style="width:25%;"><span id="recRand1"></span></td>
|
||||
<td style="width:25%;"><span id="recRand2"></span></td>
|
||||
<td style="width:25%;"><span id="recRand3"></span></td>
|
||||
<td style="width:25%;"><span id="recRand4"></span></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- CAPACITACIONES Y ACCIONES EN 2 RENGLONES COMPACTOS -->
|
||||
<div class="rail-block">
|
||||
<!-- Renglon 1: Etiquetas (Capacitaciones a la izquierda, Acciones a la derecha) -->
|
||||
<div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:4px;">
|
||||
<div style="display:flex; align-items:center; gap:5px;">
|
||||
<input type="checkbox" name="habilidadesAcreditadas" id="habilidadesAcreditadas">
|
||||
<label for="habilidadesAcreditadas" class="rail-lbl" style="cursor:pointer; text-transform:none; font-size:11px;">Capacitaciones</label>
|
||||
</div>
|
||||
<span class="rail-lbl" style="font-size:10px;">Acciones</span>
|
||||
</div>
|
||||
|
||||
<!-- Renglon 2: Contenido (#haNombre a la izquierda, botones #bAccion1 y #bAccion2 a la derecha) -->
|
||||
<div style="display:grid; grid-template-columns: 1fr auto; gap:8px; align-items:center;">
|
||||
<table id="tablaHabilidadesAcreditadas" actual="" style="height:32px; width:100%; text-align:center; font-size:10px; background:var(--panel-2); border-radius:6px; border:1px solid var(--border-soft); box-sizing:border-box;">
|
||||
<tr>
|
||||
<td><span id="haNombre" style="font-size: 9px;font-weight:bold; display:block; line-height:1.1;"></span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><span id="haCosto" style="display:block; font-size:9.5px; color:var(--text-dim); line-height:1.1;"></span></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div style="display:flex; gap:4px; align-items:center;">
|
||||
<button id="bAccion1" onclick="toggleColor(this)">1</button>
|
||||
<button id="bAccion2" onclick="toggleColor(this)">2</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- TABLA DE ACTIVOS (PRODUCCIÓN / RECUPERACIÓN) -->
|
||||
<div class="rail-block">
|
||||
<div class="rail-lbl" style="margin-bottom:4px;">Tabla de Activos</div>
|
||||
<table id="tablaActivos" class="activos">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="2" style="width: 33%;font-size:11px; font-weight:bold; background-color:var(--panel-1);">ACTIVOS</th>
|
||||
<th style="font-size:11px; font-weight:bold; background-color:var(--panel-1);">Prod.</th>
|
||||
<th style="font-size:11px; font-weight:bold; background-color:var(--panel-1);">Recup.</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="2" class="actPersonalCalificado">Personal calificado</td>
|
||||
<td id="activosPersonalCalificado">1T+2P+2C</td>
|
||||
<td id="recuperacionPersonalCalificado">1P+1C</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="actAnalistas">Analistas</td>
|
||||
<td id="activosAnalistas">1T+2P+2C</td>
|
||||
<td id="recuperacionAnalistas">1P+1C</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="actFlujoDeEfectivo">Flujo de efectivo</td>
|
||||
<td id="activosFlujoDeEfectivo">1T+2P+2C</td>
|
||||
<td id="recuperacionFlujoDeEfectivo">1P+1C</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="actCreditoEInversion">Crédito e Inversión</td>
|
||||
<td id="activosCreditoEInversiono">1T+2P+2C</td>
|
||||
<td id="recuperacionCreditoEInversion">1P+1C</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="actTecnologia">Tecnología</td>
|
||||
<td id="activosTecnologia">1T+2P+2C</td>
|
||||
<td id="recuperacionTecnologia">1P+1C</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="actTransporteYMaquinaria">Transporte y Maquinaria</td>
|
||||
<td id="activosTransporteYMaquinaria">1T+2P+2C</td>
|
||||
<td id="recuperacionTransporteYMaquinaria">1P+1C</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- ACCIONES POSIBLES -->
|
||||
<div class="rail-block">
|
||||
<div class="rail-lbl" style="margin-bottom:4px;">Acciones Posibles</div>
|
||||
<table id="tablaAccionesPosibles" style="width:100%; border:1px solid var(--border); font-size:10.5px; border-radius:6px; background:var(--panel-2);">
|
||||
<tr><td>1.-</td><td>Generar recursos</td></tr>
|
||||
<tr><td>2.-</td><td>Generar activos</td></tr>
|
||||
<tr><td>3.-</td><td>Intercambiar recursos</td></tr>
|
||||
<tr><td>4.-</td><td><span id="accionGestionarProyecto">Gestionar nuevo proyecto</span></td></tr>
|
||||
<tr><td>5.-</td><td>Convocar junta</td></tr>
|
||||
<tr><td>6.-</td><td><span id="accionComprarCapacitacion">Abrir/Cambiar/Comprar habilidad</span></td></tr>
|
||||
<tr><td>7.-</td><td>Colocar activos recuperados</td></tr>
|
||||
<tr><td>8.-</td><td><span id="accionHabilidadEspecial">Habilidad especial</span></td></tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- CONTADORES FINALES -->
|
||||
<div class="rail-block">
|
||||
<table style="width:100%; text-align:center; font-size:11px; border:1px solid var(--border); border-radius:6px; background:var(--panel);">
|
||||
<tr>
|
||||
<td style="background:gray; color:white; padding:3px; font-weight:bold; width:50%;">Proyectos<br>Terminados</td>
|
||||
<td style="background:gray; color:white; padding:3px; font-weight:bold; width:50%;">Incidencias<br>Solventadas</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="proyectosTerminados" style="background:limegreen; color:white; font-weight:bold; font-size:18px; padding:6px;">0</td>
|
||||
<td id="incidenciasTerminadas" style="background:orange; color:white; font-weight:bold; font-size:18px; padding:6px;">0</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- =================================================================
|
||||
COLUMNA 2: DEPARTAMENTOS
|
||||
================================================================== -->
|
||||
<div class="col-departamentos">
|
||||
<!-- CONTENEDOR DEPARTAMENTO GRANDE (OCULTO EN DOM) -->
|
||||
<div id="renglonSuperior" class="card-depto-gde" style="display:none;">
|
||||
<div style="font-weight:700; font-size:12px; color:var(--text-faint); letter-spacing:.08em; text-transform:uppercase; text-align:center; margin-bottom:6px;">Departamento a Cargo</div>
|
||||
|
||||
<table class="renglonSup" style="width:100%;">
|
||||
<tr>
|
||||
<td colspan="8" id="nombreDeptoGde" style="text-align:center; font-size:16px; font-weight:700; height:36px;">RECURSOS HUMANOS<span id="deptoNombresGde"></span></td>
|
||||
<td style="width:30px; text-align:center;">
|
||||
<div id="activoGde1" class="draggable activo-item" style="border:1px solid black; padding:4px; text-align:center;">1</div>
|
||||
</td>
|
||||
<td style="width:30px; text-align:center;">
|
||||
<div id="activoGde2" class="draggable activo-item" style="border:1px solid black; padding:4px; text-align:center;">2</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" id="deptoNombresGdeXX" style="display:none;"></td>
|
||||
<td colspan="4" rowspan="8" id="imagenDepto" style="text-align:center; vertical-align:top; padding-top:6px;">
|
||||
<img id="imagenDeptoGde" src="img/depto-recursos.png" style="width:170px; height:auto; object-fit:contain;"><br>
|
||||
<span id="nuevoNombreDeptoGde" style="font-weight:bold; font-size:14px;"></span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" style="text-align:center; background-color:gray; color:white; height:22px; font-size:12px; font-weight:bold;">Recursos Disponibles</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" id="recursosDisponiblesGde" style="height:60px; text-align:center; vertical-align:middle;">
|
||||
<table style="margin:0 auto; width:90%; font-family:var(--font-mono); font-weight:bold; font-size:16px;">
|
||||
<tr>
|
||||
<td style="width:33%; text-align:center;">
|
||||
<img src="img/tiempoNegro.png" height="36px" style="vertical-align:middle;">
|
||||
<span id="recursoDispTiempoGde" class="draggable recurso-item" style="vertical-align:middle; background:#14181F; color:var(--timer-accent); padding:2px 8px; border-radius:4px;">2</span>
|
||||
</td>
|
||||
<td style="width:33%; text-align:center;">
|
||||
<img src="img/personalNegro.png" height="36px" style="vertical-align:middle;">
|
||||
<span id="recursoDispPersonalGde" class="draggable recurso-item" style="vertical-align:middle; background:#14181F; color:var(--timer-accent); padding:2px 8px; border-radius:4px;">2</span>
|
||||
</td>
|
||||
<td style="width:33%; text-align:center;">
|
||||
<img src="img/capitalNegro.png" height="36px" style="vertical-align:middle;">
|
||||
<span id="recursoDispCapitalGde" class="draggable recurso-item" style="vertical-align:middle; background:#14181F; color:var(--timer-accent); padding:2px 8px; border-radius:4px;">2</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" style="text-align:center; background-color:gray; color:white; height:22px; font-size:12px; font-weight:bold;">Habilidades Acreditadas</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" style="text-align:center; height:24px; font-size:11px;" id="habilidadesAcreditadasGde1"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" style="text-align:center; height:24px; font-size:11px;" id="habilidadesAcreditadasGde2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" style="text-align:center; height:24px; font-size:11px;" id="habilidadesAcreditadasGde3"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="10" style="text-align:center; background-color:gray; color:white; height:20px; font-size:11px; font-weight:bold; margin-top:4px;">Habilidad Especial / Quincenal</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="10" id="accionEspecialGde" style="text-align:center; background-color:silver; color:black; height:32px; font-size:11px; line-height:1.2; vertical-align:middle;">.</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- GRID DE 6 DEPARTAMENTOS CHICOS -->
|
||||
<div id="renglonDeptos" class="dept-grid">
|
||||
|
||||
<!-- MARKETING Y VENTAS -->
|
||||
<div class="dept-card-sm departamentos droppableRecursos" id="MarketingYVentas">
|
||||
<!-- Fila 1: Avatar e Info -->
|
||||
<div class="dept-header-row">
|
||||
<div class="dept-avatar-box">
|
||||
<img id="imagenDeptoGde" src="img/depto-marketing.png" alt="Marketing y Ventas">
|
||||
</div>
|
||||
<div class="dept-info-box">
|
||||
<span id="nombreDeptoCh" class="dept-title">Marketing y Ventas</span>
|
||||
<span id="deptoNombresCh" class="personasDepto dept-members">Hugo, Paco y Luis</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Fila 2: Recursos y Activos (Renglón Completo - Flex) -->
|
||||
<div class="dept-resources-assets-row">
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/tiempoCH.png">
|
||||
<div id="tiempoCh" class="draggable recurso-item val-tiempo">2</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/personalCH.png">
|
||||
<div id="personalCh" class="draggable recurso-item val-personal">3</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/capitalCH.png">
|
||||
<div id="capitalCh" class="draggable recurso-item val-capital">1</div>
|
||||
</div>
|
||||
<span id="activoCh1" class="actPersonalCalificado draggable activo-item">1</span>
|
||||
<span id="activoCh2" class="actFlujoDeEfectivo draggable activo-item">2</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 3: Habilidad Especial (Renglón Completo) -->
|
||||
<div class="dept-habilidad-row">
|
||||
<span class="dept-habilidad-lbl">Habilidad:</span> <span id="accionEspecialGde">.</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 4: Habilidades Acreditadas (Renglón Completo) -->
|
||||
<div class="dept-habilidades-acreditadas-list">
|
||||
<div id="habilidadesAcreditadasCh1" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh2" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh3" class="dept-hab-item"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- FINANZAS -->
|
||||
<div class="dept-card-sm departamentos droppableRecursos" id="Finanzas">
|
||||
<!-- Fila 1: Avatar e Info -->
|
||||
<div class="dept-header-row">
|
||||
<div class="dept-avatar-box">
|
||||
<img id="imagenDeptoGde" src="img/depto-finanzas.png" alt="Finanzas">
|
||||
</div>
|
||||
<div class="dept-info-box">
|
||||
<span id="nombreDeptoCh" class="dept-title">Finanzas</span>
|
||||
<span id="deptoNombresCh" class="personasDepto dept-members">Donald, Mimi y Tribilín</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Fila 2: Recursos y Activos (Renglón Completo - Flex) -->
|
||||
<div class="dept-resources-assets-row">
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/tiempoCH.png">
|
||||
<div id="tiempoCh" class="draggable recurso-item val-tiempo">2</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/personalCH.png">
|
||||
<div id="personalCh" class="draggable recurso-item val-personal">3</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/capitalCH.png">
|
||||
<div id="capitalCh" class="draggable recurso-item val-capital">1</div>
|
||||
</div>
|
||||
<span id="activoCh1" class="actFlujoDeEfectivo draggable activo-item">1</span>
|
||||
<span id="activoCh2" class="actCreditoEInversion draggable activo-item">2</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 3: Habilidad Especial (Renglón Completo) -->
|
||||
<div class="dept-habilidad-row">
|
||||
<span class="dept-habilidad-lbl">Habilidad:</span> <span id="accionEspecialGde">.</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 4: Habilidades Acreditadas (Renglón Completo) -->
|
||||
<div class="dept-habilidades-acreditadas-list">
|
||||
<div id="habilidadesAcreditadasCh1" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh2" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh3" class="dept-hab-item"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INVESTIGACIÓN Y DESARROLLO -->
|
||||
<div class="dept-card-sm departamentos droppableRecursos" id="InvestigacionYDesarrollo">
|
||||
<!-- Fila 1: Avatar e Info -->
|
||||
<div class="dept-header-row">
|
||||
<div class="dept-avatar-box">
|
||||
<img id="imagenDeptoGde" src="img/depto-investigacion.png" alt="Investigación y Desarrollo">
|
||||
</div>
|
||||
<div class="dept-info-box">
|
||||
<span id="nombreDeptoCh" class="dept-title">Investigación y Desarrollo</span>
|
||||
<span id="deptoNombresCh" class="personasDepto dept-members">Hugo, Paco y Luis</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Fila 2: Recursos y Activos (Renglón Completo - Flex) -->
|
||||
<div class="dept-resources-assets-row">
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/tiempoCH.png">
|
||||
<div id="tiempoCh" class="draggable recurso-item val-tiempo">2</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/personalCH.png">
|
||||
<div id="personalCh" class="draggable recurso-item val-personal">3</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/capitalCH.png">
|
||||
<div id="capitalCh" class="draggable recurso-item val-capital">1</div>
|
||||
</div>
|
||||
<span id="activoCh1" class="actCreditoEInversion draggable activo-item">1</span>
|
||||
<span id="activoCh2" class="actTecnologia draggable activo-item">2</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 3: Habilidad Especial (Renglón Completo) -->
|
||||
<div class="dept-habilidad-row">
|
||||
<span class="dept-habilidad-lbl">Habilidad:</span> <span id="accionEspecialGde">.</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 4: Habilidades Acreditadas (Renglón Completo) -->
|
||||
<div class="dept-habilidades-acreditadas-list">
|
||||
<div id="habilidadesAcreditadasCh1" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh2" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh3" class="dept-hab-item"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- LOGÍSTICA Y SISTEMAS -->
|
||||
<div class="dept-card-sm departamentos droppableRecursos" id="LogisticaYSistemas">
|
||||
<!-- Fila 1: Avatar e Info -->
|
||||
<div class="dept-header-row">
|
||||
<div class="dept-avatar-box">
|
||||
<img id="imagenDeptoGde" src="img/depto-logistica.png" alt="Logística y Sistemas">
|
||||
</div>
|
||||
<div class="dept-info-box">
|
||||
<span id="nombreDeptoCh" class="dept-title">Logística y Sistemas</span>
|
||||
<span id="deptoNombresCh" class="personasDepto dept-members">Hugo, Paco y Luis</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Fila 2: Recursos y Activos (Renglón Completo - Flex) -->
|
||||
<div class="dept-resources-assets-row">
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/tiempoCH.png">
|
||||
<div id="tiempoCh" class="draggable recurso-item val-tiempo">2</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/personalCH.png">
|
||||
<div id="personalCh" class="draggable recurso-item val-personal">3</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/capitalCH.png">
|
||||
<div id="capitalCh" class="draggable recurso-item val-capital">1</div>
|
||||
</div>
|
||||
<span id="activoCh1" class="actTecnologia draggable activo-item">1</span>
|
||||
<span id="activoCh2" class="actTransporteYMaquinaria draggable activo-item">2</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 3: Habilidad Especial (Renglón Completo) -->
|
||||
<div class="dept-habilidad-row">
|
||||
<span class="dept-habilidad-lbl">Habilidad:</span> <span id="accionEspecialGde">.</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 4: Habilidades Acreditadas (Renglón Completo) -->
|
||||
<div class="dept-habilidades-acreditadas-list">
|
||||
<div id="habilidadesAcreditadasCh1" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh2" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh3" class="dept-hab-item"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- OPERACIONES -->
|
||||
<div class="dept-card-sm departamentos droppableRecursos" id="Operaciones">
|
||||
<!-- Fila 1: Avatar e Info -->
|
||||
<div class="dept-header-row">
|
||||
<div class="dept-avatar-box">
|
||||
<img id="imagenDeptoGde" src="img/depto-operaciones.png" alt="Operaciones">
|
||||
</div>
|
||||
<div class="dept-info-box">
|
||||
<span id="nombreDeptoCh" class="dept-title">Operaciones</span>
|
||||
<span id="deptoNombresCh" class="personasDepto dept-members">Hugo, Paco y Luis</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Fila 2: Recursos y Activos (Renglón Completo - Flex) -->
|
||||
<div class="dept-resources-assets-row">
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/tiempoCH.png">
|
||||
<div id="tiempoCh" class="draggable recurso-item val-tiempo">2</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/personalCH.png">
|
||||
<div id="personalCh" class="draggable recurso-item val-personal">3</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/capitalCH.png">
|
||||
<div id="capitalCh" class="draggable recurso-item val-capital">1</div>
|
||||
</div>
|
||||
<span id="activoCh1" class="actTransporteYMaquinaria draggable activo-item">1</span>
|
||||
<span id="activoCh2" class="actAnalistas draggable activo-item">2</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 3: Habilidad Especial (Renglón Completo) -->
|
||||
<div class="dept-habilidad-row">
|
||||
<span class="dept-habilidad-lbl">Habilidad:</span> <span id="accionEspecialGde">.</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 4: Habilidades Acreditadas (Renglón Completo) -->
|
||||
<div class="dept-habilidades-acreditadas-list">
|
||||
<div id="habilidadesAcreditadasCh1" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh2" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh3" class="dept-hab-item"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- RECURSOS HUMANOS -->
|
||||
<div class="dept-card-sm departamentos droppableRecursos" id="RecursosHumanos">
|
||||
<!-- Fila 1: Avatar e Info -->
|
||||
<div class="dept-header-row">
|
||||
<div class="dept-avatar-box">
|
||||
<img id="imagenDeptoGde" src="img/depto-recursos.png" alt="Recursos Humanos">
|
||||
</div>
|
||||
<div class="dept-info-box">
|
||||
<span id="nombreDeptoCh" class="dept-title">Recursos Humanos</span>
|
||||
<span id="deptoNombresCh" class="personasDepto dept-members">Hugo, Paco y Luis</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Fila 2: Recursos y Activos (Renglón Completo - Flex) -->
|
||||
<div class="dept-resources-assets-row">
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/tiempoCH.png">
|
||||
<div id="tiempoCh" class="draggable recurso-item val-tiempo">2</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/personalCH.png">
|
||||
<div id="personalCh" class="draggable recurso-item val-personal">3</div>
|
||||
</div>
|
||||
<div class="dept-res-chip">
|
||||
<img src="img/capitalCH.png">
|
||||
<div id="capitalCh" class="draggable recurso-item val-capital">1</div>
|
||||
</div>
|
||||
<span id="activoCh1" class="actPersonalCalificado draggable activo-item">1</span>
|
||||
<span id="activoCh2" class="actAnalistas draggable activo-item">2</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 3: Habilidad Especial (Renglón Completo) -->
|
||||
<div class="dept-habilidad-row">
|
||||
<span class="dept-habilidad-lbl">Habilidad:</span> <span id="accionEspecialGde">.</span>
|
||||
</div>
|
||||
|
||||
<!-- Fila 4: Habilidades Acreditadas (Renglón Completo) -->
|
||||
<div class="dept-habilidades-acreditadas-list">
|
||||
<div id="habilidadesAcreditadasCh1" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh2" class="dept-hab-item"></div>
|
||||
<div id="habilidadesAcreditadasCh3" class="dept-hab-item"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- =================================================================
|
||||
COLUMNA 3: PROYECTOS (DESTACADO Y SECUNDARIOS)
|
||||
================================================================== -->
|
||||
<div class="col-proyectos">
|
||||
|
||||
<!-- PROYECTO EN TURNO (GRANDE) -->
|
||||
<div id="TablaProyectoGde" num="0" class="proj-featured">
|
||||
<div class="featured-flag">PROYECTO EN TURNO</div>
|
||||
|
||||
<div class="pf-grid">
|
||||
<div class="pf-text">
|
||||
<div id="nombreProyectoGde" class="pf-title-block">
|
||||
INDICADORES ROI<br><span>FINANZAS</span>
|
||||
</div>
|
||||
<div id="descripcionProyectoGde" class="pf-desc">Establecer Indicadores de ROI en tiendas físicas</div>
|
||||
</div>
|
||||
<div class="pf-image-box">
|
||||
<img id="imagenProyectoGde" src="img/grafica.jpg" alt="Proyecto">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pf-money">
|
||||
<span id="puntosGanados" class="potencial">Potencial<br>8,000 - 25,000 USD</span>
|
||||
<span id="puntosPerdidos" class="penal">Penalización<br>10,000</span>
|
||||
</div>
|
||||
|
||||
<!-- CONTENEDOR DE ACTIVOS (#activosProyectoGde) REQUERIDO POR JSCODE.JS PARA DROPPABLE -->
|
||||
<div id="activosProyectoGde" class="droppableActivos">
|
||||
<div class="pf-assets-row">
|
||||
<div class="pf-asset-box">
|
||||
<span id="activoReqProyectoNom1" num="1" class="pf-asset-lbl actAnalistas">Analistas</span>
|
||||
<span id="activoReqProyectoCantX1" class="pf-asset-val">1</span>
|
||||
</div>
|
||||
<div class="pf-asset-box">
|
||||
<span id="activoReqProyectoNom2" num="2" class="pf-asset-lbl actPersonalCalificado">Personal Calificado</span>
|
||||
<span id="activoReqProyectoCantX2" class="pf-asset-val">2</span>
|
||||
</div>
|
||||
<div class="pf-asset-box">
|
||||
<span id="activoReqProyectoNom3" num="3" class="pf-asset-lbl actTransporteYMaquinaria">Transporte y Maq.</span>
|
||||
<span id="activoReqProyectoCantX3" class="pf-asset-val">2</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pf-foot">
|
||||
<span id="mantoGde" class="manto">MANTENIMIENTO 1T + 1P + 1C</span>
|
||||
<span class="status-badge">EN PROGRESO</span>
|
||||
</div>
|
||||
|
||||
<!-- RENGLÓN DE ACTIVOS PAGADOS / ASIGNADOS -->
|
||||
<div class="pf-paid-row">
|
||||
<div class="pf-paid-box">
|
||||
<span id="activoReqProyectoCant1" class="actAnalistas">0</span>
|
||||
</div>
|
||||
<div class="pf-paid-box">
|
||||
<span id="activoReqProyectoCant2" class="actPersonalCalificado">0</span>
|
||||
</div>
|
||||
<div class="pf-paid-box">
|
||||
<span id="activoReqProyectoCant3" class="actTransporteYMaquinaria">0</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PROYECTOS SECUNDARIOS (PROYECTOS CHICOS 1 AL 6) -->
|
||||
<div style="font-weight:700; font-size:12px; color:var(--text-faint); letter-spacing:.08em; text-transform:uppercase; margin-top:4px;">Proyectos Activos</div>
|
||||
|
||||
<div id="renglonProyectos2" class="proj-grid-sm">
|
||||
|
||||
<!-- PROYECTO 1 -->
|
||||
<div class="proj-card-sm">
|
||||
<div class="proyectos droppableActivos pm-card" id="proyecto_1">
|
||||
<div class="proyectoEncabezado pm-header">
|
||||
<div id="proyectoDepto" class="pm-dept">OPERACIONES</div>
|
||||
<div id="proyectoNombre" class="pm-title">PROCESO SANITIZACIÓN</div>
|
||||
<div id="puntos" class="pm-puntos">+1</div>
|
||||
</div>
|
||||
|
||||
<div id="proyectoDescripcion" class="pm-desc">Establecer proceso extra de sanitización.</div>
|
||||
|
||||
<!-- Activos Requeridos Compactos -->
|
||||
<div class="pm-assets-row">
|
||||
<span id="activoReq1" class="actFlujoDeEfectivo">3</span>
|
||||
<span id="activoReq2" class="actTransporteYMaquinaria">2</span>
|
||||
<span id="activoReq3" class="actTecnologia">1</span>
|
||||
</div>
|
||||
|
||||
<!-- Mantenimiento -->
|
||||
<div id="recursosManto" class="pm-manto">MTTO: 2C+2P+1T</div>
|
||||
|
||||
<!-- Activos Pagados / Asignados -->
|
||||
<div class="pm-paid-row">
|
||||
<span id="activoAsignado1" class="actFlujoDeEfectivo">1</span>
|
||||
<span id="activoAsignado2" class="actTransporteYMaquinaria">0</span>
|
||||
<span id="activoAsignado3" class="actTecnologia">2</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PROYECTO 2 -->
|
||||
<div class="proj-card-sm">
|
||||
<div class="proyectos droppableActivos pm-card" id="proyecto_2">
|
||||
<div class="proyectoEncabezado pm-header">
|
||||
<div id="proyectoDepto" class="pm-dept"> </div>
|
||||
<div id="proyectoNombre" class="pm-title"> </div>
|
||||
<div id="puntos" class="pm-puntos"> </div>
|
||||
</div>
|
||||
|
||||
<div id="proyectoDescripcion" class="pm-desc"> </div>
|
||||
|
||||
<div class="pm-assets-row">
|
||||
<span id="activoReq1"> </span>
|
||||
<span id="activoReq2"> </span>
|
||||
<span id="activoReq3"> </span>
|
||||
</div>
|
||||
|
||||
<div id="recursosManto" class="pm-manto"> </div>
|
||||
|
||||
<div class="pm-paid-row">
|
||||
<span id="activoAsignado1"> </span>
|
||||
<span id="activoAsignado2"> </span>
|
||||
<span id="activoAsignado3"> </span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PROYECTO 3 -->
|
||||
<div class="proj-card-sm">
|
||||
<div class="proyectos droppableActivos pm-card" id="proyecto_3">
|
||||
<div class="proyectoEncabezado pm-header">
|
||||
<div id="proyectoDepto" class="pm-dept"> </div>
|
||||
<div id="proyectoNombre" class="pm-title"> </div>
|
||||
<div id="puntos" class="pm-puntos"> </div>
|
||||
</div>
|
||||
|
||||
<div id="proyectoDescripcion" class="pm-desc"> </div>
|
||||
|
||||
<div class="pm-assets-row">
|
||||
<span id="activoReq1"> </span>
|
||||
<span id="activoReq2"> </span>
|
||||
<span id="activoReq3"> </span>
|
||||
</div>
|
||||
|
||||
<div id="recursosManto" class="pm-manto"> </div>
|
||||
|
||||
<div class="pm-paid-row">
|
||||
<span id="activoAsignado1"> </span>
|
||||
<span id="activoAsignado2"> </span>
|
||||
<span id="activoAsignado3"> </span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PROYECTO 4 -->
|
||||
<div class="proj-card-sm">
|
||||
<div class="proyectos droppableActivos pm-card" id="proyecto_4">
|
||||
<div class="proyectoEncabezado pm-header">
|
||||
<div id="proyectoDepto" class="pm-dept"> </div>
|
||||
<div id="proyectoNombre" class="pm-title"> </div>
|
||||
<div id="puntos" class="pm-puntos"> </div>
|
||||
</div>
|
||||
|
||||
<div id="proyectoDescripcion" class="pm-desc"> </div>
|
||||
|
||||
<div class="pm-assets-row">
|
||||
<span id="activoReq1"> </span>
|
||||
<span id="activoReq2"> </span>
|
||||
<span id="activoReq3"> </span>
|
||||
</div>
|
||||
|
||||
<div id="recursosManto" class="pm-manto"> </div>
|
||||
|
||||
<div class="pm-paid-row">
|
||||
<span id="activoAsignado1"> </span>
|
||||
<span id="activoAsignado2"> </span>
|
||||
<span id="activoAsignado3"> </span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PROYECTO 5 -->
|
||||
<div class="proj-card-sm">
|
||||
<div class="proyectos droppableActivos pm-card" id="proyecto_5">
|
||||
<div class="proyectoEncabezado pm-header">
|
||||
<div id="proyectoDepto" class="pm-dept"> </div>
|
||||
<div id="proyectoNombre" class="pm-title"> </div>
|
||||
<div id="puntos" class="pm-puntos"> </div>
|
||||
</div>
|
||||
|
||||
<div id="proyectoDescripcion" class="pm-desc"> </div>
|
||||
|
||||
<div class="pm-assets-row">
|
||||
<span id="activoReq1"> </span>
|
||||
<span id="activoReq2"> </span>
|
||||
<span id="activoReq3"> </span>
|
||||
</div>
|
||||
|
||||
<div id="recursosManto" class="pm-manto"> </div>
|
||||
|
||||
<div class="pm-paid-row">
|
||||
<span id="activoAsignado1"> </span>
|
||||
<span id="activoAsignado2"> </span>
|
||||
<span id="activoAsignado3"> </span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PROYECTO 6 -->
|
||||
<div class="proj-card-sm">
|
||||
<div class="proyectos droppableActivos pm-card" id="proyecto_6">
|
||||
<div class="proyectoEncabezado pm-header">
|
||||
<div id="proyectoDepto" class="pm-dept"> </div>
|
||||
<div id="proyectoNombre" class="pm-title"> </div>
|
||||
<div id="puntos" class="pm-puntos"> </div>
|
||||
</div>
|
||||
|
||||
<div id="proyectoDescripcion" class="pm-desc"> </div>
|
||||
|
||||
<div class="pm-assets-row">
|
||||
<span id="activoReq1"> </span>
|
||||
<span id="activoReq2"> </span>
|
||||
<span id="activoReq3"> </span>
|
||||
</div>
|
||||
|
||||
<div id="recursosManto" class="pm-manto"> </div>
|
||||
|
||||
<div class="pm-paid-row">
|
||||
<span id="activoAsignado1"> </span>
|
||||
<span id="activoAsignado2"> </span>
|
||||
<span id="activoAsignado3"> </span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- DIÁLOGOS MODALES Y SCRIPTS DE MOTOR DE JUEGO -->
|
||||
<div id="quitarProyectoCompleto" style="display:none;">
|
||||
<div id="quitarProyectoCompletoTexto" style="font-size:14px;">¿Está seguro que desea quitar el proyecto completado?</div>
|
||||
<div id="quitarProyectoCompletoBotones" style="text-align:center;"></div>
|
||||
</div>
|
||||
|
||||
<script src="jsCode.js?v=<?php echo filemtime('jsCode.js'); ?>"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,80 +0,0 @@
|
||||
# Documentación General y Bitácora de Cambios - Co.Laborando
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **Regla de Mantenimiento:** Para evitar el consumo excesivo de tokens, este archivo debe mantenerse conciso, con un tamaño objetivo de **entre 150 y 250 líneas** en total. Al realizar nuevos cambios, se debe resumir o actualizar la información en lugar de añadir bloques redundantes de texto.
|
||||
|
||||
---
|
||||
|
||||
## 🎮 Concepto General del Proyecto
|
||||
**Co.Laborando** es una aplicación interactiva de simulación y ludoteca empresarial. Los jugadores administran múltiples departamentos con recursos limitados (Tiempo, Personal, Capital) para completar proyectos en un tablero a lo largo de un ciclo temporal de **24 quincenas (4 trimestres)**.
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Arquitectura de Archivos Principal
|
||||
* **[colaborando2.php](file:///c:/CHV/ludotecaLocal/Colaborando/colaborando2.php) / [colaborando.php](file:///c:/CHV/ludotecaLocal/Colaborando/colaborando.php):** Vistas del tablero principal del juego, donde se colocan y arrastran los proyectos y recursos.
|
||||
* **[resumen.php](file:///c:/CHV/ludotecaLocal/Colaborando/resumen.php):** Pantalla del panel de control central (dashboard) que muestra métricas acumuladas, estado de departamentos, listado de activos y control de habilidades.
|
||||
* **[jsCode.js](file:///c:/CHV/ludotecaLocal/Colaborando/jsCode.js):** Lógica del lado del cliente que maneja las interacciones del tablero, transiciones de turnos y renders dinámicos.
|
||||
* **[manejoDeSesiones.js](file:///c:/CHV/ludotecaLocal/Colaborando/manejoDeSesiones.js) / [manejoDeSesiones.php](file:///c:/CHV/ludotecaLocal/Colaborando/manejoDeSesiones.php):** Sistema de persistencia que guarda y carga el estado del juego (en archivos `.json` en la raíz del proyecto).
|
||||
* **[sesiones.php](file:///c:/CHV/ludotecaLocal/Colaborando/sesiones.php):** Panel de administración para crear, inicializar o eliminar las sesiones guardadas.
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Mecánicas de Juego Clave
|
||||
|
||||
### 1. Departamentos y Recursos
|
||||
Existen 6 departamentos: *Marketing y Ventas, Finanzas, Investigación y Desarrollo, Logística y Sistemas, Operaciones*, y *Recursos Humanos*. Cada uno posee recursos de **Tiempo, Personal** y **Capital**, representados dinámicamente en el tablero y resumen.
|
||||
|
||||
### 2. Ciclo de Vida de Proyectos
|
||||
* **En proceso:** Proyectos activos en los que se está trabajando.
|
||||
* **Completado:** Proyectos finalizados con éxito. Sus requerimientos y recursos recuperados se contabilizan.
|
||||
|
||||
### 3. Mantenimiento Trimestral y Penalizaciones
|
||||
En los cierres de trimestre (quincenas 6, 12, 18 y 24), los proyectos activos en proceso requieren el pago de un coste de mantenimiento (`Tiempo`, `Personal`, `Capital`) o el pago de una **Penalización** financiera del acumulado de ingresos.
|
||||
* En cualquiera de los dos casos, el proyecto se mantiene activo (`En proceso`) y visible en el tablero y en el resumen.
|
||||
* En la pantalla de resumen, el proyecto se muestra en gris (deshabilitado) y sus botones de acción se bloquean una vez resuelto en el trimestre actual.
|
||||
|
||||
### 4. Habilidades Especiales (Acción Quincenal)
|
||||
Los departamentos pueden comprar habilidades especiales con cooldown (periodicidad). Ejemplos clave:
|
||||
* **Logística y Sistemas:** Permite omitir el costo de mantenimiento de un proyecto activo (pagarlo sin gastar recursos).
|
||||
* **Operaciones:** Permite penalizar un proyecto en proceso sin costo de penalización.
|
||||
* **Ordenar proyectos:** Permite reordenar la cola de los próximos 5 proyectos en el tablero.
|
||||
|
||||
### 5. Contabilización de Activos
|
||||
Los activos producidos por proyectos completados se dividen en 6 tipos: *Personal Calificado, Analistas, Flujo de Efectivo, Crédito e Inversión, Tecnología* y *Transporte y Maquinaria*. Se calculan dinámicamente y se clasifican en:
|
||||
* **Producidos:** Total de activos creados por proyectos completados.
|
||||
* **Recuperados:** Activos que fueron arrastrados con éxito de vuelta a los departamentos.
|
||||
* **Perdidos:** Activos que no se recuperaron a tiempo antes de cambiar de trimestre.
|
||||
|
||||
---
|
||||
|
||||
## 💾 Sistema de Sesiones
|
||||
* Las sesiones de juego se guardan localmente en archivos JSON en la raíz del proyecto.
|
||||
* Para evitar que estos archivos ensucien el repositorio Git, el archivo [.gitignore](file:///c:/CHV/ludotecaLocal/Colaborando/.gitignore) ignora todos los archivos `/*.json` de la raíz.
|
||||
* Se utiliza una técnica de *cache-busting* con el parámetro `_t` y la cabecera `cache: 'no-store'` para evitar cargas AJAX obsoletas entre pantallas.
|
||||
|
||||
---
|
||||
|
||||
## 📈 Bitácora Histórica de Cambios (Changelog)
|
||||
|
||||
* **16/Jul/2026:**
|
||||
* **Cambio de Desechar a Penalizar:** En la pantalla de resumen, se cambió el botón "Desechar" por "Penalizar".
|
||||
* **Persistencia de Actividad:** Los proyectos penalizados ahora se mantienen activos (`En proceso`) en lugar de descartarse.
|
||||
* **Actualización de Visualización y Penalización General:** Tanto al pagar mantenimiento como al penalizar, el proyecto permanece en la quincena actual; en el resumen, su tarjeta cambia a color gris y sus botones se bloquean. El botón de **Penalizar** está habilitado en **todos** los proyectos e Incidencias activas durante el fin de trimestre, deduciendo la penalización del acumulado general.
|
||||
* **Descuentos de Habilidades en Mantenimiento:** Al pagar mantenimiento de forma normal, se aplican correctamente los beneficios/descuentos de recursos ganados por el departamento mediante sus habilidades compradas (`habilidadTiempo`, `habilidadPersonal`, `habilidadCapital`), reduciendo el costo cobrado en base a los beneficios definidos.
|
||||
* **Corrección de Proyectos Descartados en `TablaProyectoGde`:** Se corrigió un error en `continuamos()` en [jsCode.js](file:///c:/CHV/ludotecaLocal/Colaborando/jsCode.js#L3435) que provocaba que un proyecto descartado que estuviera seleccionado en el cuadro grande (`TablaProyectoGde`) se reasignara por error al volver al tablero desde el resumen. Ahora la inicialización del tablero valida estrictamente que solo se carguen proyectos `En proceso`, removiendo el proyecto descartado inmediatamente sin necesidad de refrescar la página.
|
||||
* **Persistencia de Botones de Acción 1 y 2 (`bAccion1` y `bAccion2`):** Se integró el estado de las acciones en `arregloGeneral.bAccion1` y `arregloGeneral.bAccion2`. Al hacer clic en los botones 1 y 2 o reiniciarse con el timer, se guarda el estado en el servidor y al volver del resumen a la vista del tablero se restaura automáticamente la selección activa (fondo azul y texto blanco).
|
||||
* **Gráfica Mixta de Progresión (Barras + Línea) con Zoom 2.5X y Posicionamiento Ajustado:** Integración de gráfica HTML5 Canvas sin dependencias en el Bloque 3 de resumen. Representa los Objetivos del Trimestre (`arregloGeneral.objetivoT1..T4`, por defecto $100,000) mediante barras azules e Ingresos Reales mediante una línea roja con nodos. El panel flotante emergente desplegado en `mouseenter` se ajustó a escala **2.5X ampliado** (560px × 185px) y se reubicó dinámicamente sobre la tarjeta del Bloque 3, evitando recortes en el borde superior de la ventana del navegador. Se corrigió el alineamiento de texto de la leyenda (`textAlign = 'left'`) para que los textos "Objetivo Trimestre" e "Ingreso Real" no se solapen con sus respectivos iconos.
|
||||
* **Redistribución de Layout en Resumen:** Se reestructuró la vista en 2 filas: Fila superior con 5 columnas horizontales para métricas/gráficos/controles y Fila inferior con Departamentos (20%), Proyectos Terminados (40%) y Proyectos Activos (40%).
|
||||
* **03/Jul/2026:**
|
||||
* Implementación de la ventana de mantenimiento trimestral (Q6, 12, 18, 24) en resumen y tablero.
|
||||
* Integración de habilidades especiales para omitir costo de mantenimiento (Logística) y omitir penalizaciones por desecho (Operaciones).
|
||||
* Bypass de caché del navegador (`cache: 'no-store'`) para la carga de datos del juego.
|
||||
* Añadida regla `/*.json` en `.gitignore` para limpiar el repositorio de archivos de juego locales.
|
||||
* **Nuevo botón de Pantalla Completa:** Integrado en los encabezados de la pantalla de Resumen y el Tablero mediante la API de Fullscreen de HTML5, actualizando su texto de forma reactiva a eventos del navegador.
|
||||
* **Alineación de Departamentos:** Se fijó la altura (38px) de la celda de habilidad especial en el tablero y se restauró el tamaño de letra original (14px) con un line-height controlado (1.2) para evitar desfases de altura cuando el texto ocupa dos líneas sin perder legibilidad.
|
||||
* **11/Jun/2026:**
|
||||
* Creación del módulo de contabilización de activos (Producidos, Recuperados, Perdidos) calculado dinámicamente e integrado en la esquina inferior izquierda de resumen.
|
||||
* Ajustes y correcciones en la habilidad especial de reordenamiento de proyectos.
|
||||
* **10/Jun/2026:**
|
||||
* Implementación de la habilidad para previsualizar y ordenar los siguientes 5 proyectos del tablero.
|
||||
* Añadido botón de habilidades especiales y opción de descarte de proyectos básicos.
|
||||
@@ -1,85 +0,0 @@
|
||||
# Gestión de Mantenimiento y Penalización de Proyectos Activos (Fin de Trimestre)
|
||||
|
||||
Este plan revisado describe las modificaciones necesarias en el código para permitir que los usuarios paguen el mantenimiento de proyectos activos o los desechen (pagando la penalización correspondiente) **únicamente en las quincenas de fin de trimestre (6, 12, 18 y 24)**.
|
||||
|
||||
## Revisión del Usuario Requerida
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **Lógica de Visibilidad del Proyecto:**
|
||||
> - Cuando un proyecto activo paga su mantenimiento en el fin de un trimestre (por ejemplo, en la quincena 6, que es el fin del Trimestre 1), el proyecto se marca con `mantenimientoPagadoEnTrimestre = 1`.
|
||||
> - Durante el resto del trimestre actual (mientras sigan en la quincena 6), el proyecto **se ocultará tanto del resumen como del tablero**.
|
||||
> - En cuanto la quincena avance al siguiente trimestre (quincena 7, Trimestre 2), el proyecto **reaparecerá automáticamente en el tablero** para continuar trabajando en él.
|
||||
>
|
||||
> **Lógica de Desecho:**
|
||||
> - Si se decide no pagar el mantenimiento, el usuario puede desechar el proyecto pagando la penalización (que se resta del acumulado general del trimestre actual). El estatus del proyecto cambiará a `'descartado'` y desaparecerá permanentemente.
|
||||
|
||||
## Cambios Propuestos
|
||||
|
||||
### Componente Frontend y Lógica del Juego
|
||||
|
||||
---
|
||||
|
||||
#### [MODIFY] [resumen.php](file:///c:/CHV/ludotecaLocal/Colaborando/resumen.php)
|
||||
|
||||
1. **Modificar `crearTarjetaProyecto`**:
|
||||
- Agregar botones de acción **solo si** el proyecto está activo (`!esCompletado`), tiene costo de mantenimiento (`proyecto.mantenimiento !== 'N/A'`) y la quincena actual es un fin de trimestre (`quincena % 6 === 0`).
|
||||
- Botón **Pagar Manto**: Llama a `pagarMantenimientoProyecto(proyecto.id)`.
|
||||
- Botón **Desechar**: Llama a `desecharProyecto(proyecto.id)`.
|
||||
|
||||
2. **Actualizar `actualizarResumenUI`**:
|
||||
- Filtrar los proyectos activos para mostrar solo aquellos cuyo mantenimiento **no ha sido pagado** en el trimestre actual:
|
||||
`proyecto.mantenimientoPagadoEnTrimestre !== trimestreActual`
|
||||
- Ocultar los proyectos que tengan mantenimiento `'N/A'` de la lista de pagos pendientes, o mostrarlos sin botones de acción (ya que no requieren pago).
|
||||
|
||||
3. **Funciones de Control**:
|
||||
- `parseMantenimiento(mantenimientoStr)`: Parsea el formato `'1T 1P 1C'` en un objeto `{ t, p, c }`.
|
||||
- `pagarMantenimientoProyecto(projectId)`:
|
||||
- Valida la selección de departamento y que este cuente con los recursos necesarios.
|
||||
- Deduce los recursos y actualiza la tarjeta del departamento.
|
||||
- Guarda el trimestre actual en el proyecto: `proyecto.mantenimientoPagadoEnTrimestre = trimestreActual`.
|
||||
- Guarda la sesión y refresca la UI del resumen.
|
||||
- `desecharProyecto(projectId)`:
|
||||
- Solicita confirmación al usuario.
|
||||
- Deduce la penalización de `arregloGeneral['trimestre' + trimestreActual]`.
|
||||
- Cambia el estatus del proyecto a `'descartado'`.
|
||||
- Guarda la sesión y refresca la UI del resumen.
|
||||
|
||||
4. **Event Listeners**:
|
||||
- Registrar delegación de clics con jQuery para `.btn-pagar-mantenimiento` y `.btn-desechar-proyecto`.
|
||||
|
||||
---
|
||||
|
||||
#### [MODIFY] [jsCode.js](file:///c:/CHV/ludotecaLocal/Colaborando/jsCode.js)
|
||||
|
||||
1. **Definir `limpiaProyectoGrande()`**:
|
||||
- Función helper para limpiar visualmente el contenedor del proyecto grande en el tablero cuando este está en espera del pago de mantenimiento.
|
||||
|
||||
2. **Modificar `continuamos()`**:
|
||||
- Calcular el trimestre actual de la quincena cargada:
|
||||
`const trimestreActual = Math.floor((parseInt(arregloGeneral.quincena) - 1) / 6) + 1;`
|
||||
- Modificar el filtro de proyectos para el tablero (tablero chico):
|
||||
Un proyecto se muestra solo si está en proceso y no se ha pagado su mantenimiento en el trimestre actual (o no requiere mantenimiento):
|
||||
```javascript
|
||||
const proyectosEnTablero = proyectos.filter(
|
||||
(p) =>
|
||||
p.estatus === 'En proceso' &&
|
||||
(!proyectoGde || p.id !== proyectoGde.id) &&
|
||||
(p.mantenimiento === 'N/A' || p.mantenimientoPagadoEnTrimestre !== trimestreActual)
|
||||
)
|
||||
```
|
||||
- Modificar la asignación de `proyectoGde`:
|
||||
Si el proyecto grande actual está en proceso pero ya pagó su mantenimiento para el siguiente trimestre, no se muestra en el tablero actual. Se llama a `limpiaProyectoGrande()`.
|
||||
|
||||
## Plan de Verificación
|
||||
|
||||
### Verificación Manual
|
||||
1. Iniciar o cargar una sesión en la quincena 6 (fin del Trimestre 1).
|
||||
2. Ir a **Resumen** y verificar que los proyectos activos que requieren mantenimiento muestren los botones "Pagar Manto" y "Desechar".
|
||||
3. Seleccionar un departamento y hacer clic en **Pagar Manto**:
|
||||
- Verificar que se deduzcan los recursos del departamento.
|
||||
- Verificar que el proyecto desaparezca de la lista en el resumen.
|
||||
- Ir al tablero y comprobar que **no aparece** en la quincena 6.
|
||||
- Avanzar a la quincena 7 (Trimestre 2) y comprobar que el proyecto **reaparece en el tablero**.
|
||||
4. Volver a la quincena 6, seleccionar otro proyecto activo y hacer clic en **Desechar**:
|
||||
- Confirmar y verificar que la penalización se reste del acumulado general de T1.
|
||||
- Verificar que el proyecto cambie su estatus a `'descartado'` en el JSON de sesión y no vuelva a aparecer en ningún lado.
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
- [x] Implement resource subtraction, maintenance payment, and project discarding in `resumen.php`
|
||||
- [x] Add `parseMantenimiento` helper function
|
||||
- [x] Add `pagarMantenimientoProyecto` function
|
||||
- [x] Add `desecharProyecto` function with accumulated general check
|
||||
- [x] Modify `crearTarjetaProyecto` to show action buttons on active projects at end of trimester
|
||||
- [x] Filter paid projects in `actualizarResumenUI`
|
||||
- [x] Bind event delegation for the buttons
|
||||
- [x] Implement board rendering updates in `jsCode.js`
|
||||
- [x] Define `limpiaProyectoGrande` function
|
||||
- [x] Filter `proyectosEnTablero` in `continuamos` based on `mantenimientoPagadoEnTrimestre`
|
||||
- [x] Adjust project grande loading in `continuamos` to respect maintenance payment
|
||||
- [x] Verify functionality
|
||||
- [x] Test paying maintenance
|
||||
- [x] Test discarding project with check for sufficient accumulated funds
|
||||
- [x] Test quincena transitions
|
||||
@@ -1,46 +0,0 @@
|
||||
# Resumen de Cambios: Mantenimiento y Penalización de Proyectos Activos (Actualizado)
|
||||
|
||||
Se ha implementado la funcionalidad solicitada para gestionar proyectos activos al final del trimestre (quincenas 6, 12, 18, 24).
|
||||
|
||||
## Cambios Realizados
|
||||
|
||||
### 1. Pantalla de Resumen ([resumen.php](file:///c:/CHV/ludotecaLocal/Colaborando/resumen.php))
|
||||
- **Botones Dinámicos en Tarjetas:** Las tarjetas de proyectos activos (`En proceso`) muestran los botones de acción en fin de trimestre (quincena % 6 === 0): el botón **Pagar Manto** aparece en proyectos que requieren mantenimiento (excluyendo Incidencias y mantenimiento `'N/A'`), mientras que el botón **Penalizar** aparece en **todos** los proyectos e Incidencias activas.
|
||||
- **Persistencia de Proyectos:** El botón "Penalizar" ya no descarta el proyecto (no cambia su estatus a `descartado`). El proyecto permanece activo (`En proceso`).
|
||||
- **Estado Deshabilitado:** Una vez que se paga el mantenimiento o se paga la penalización, la tarjeta del proyecto se tiñe de color gris en la pantalla de resumen, y sus botones quedan deshabilitados (`disabled`), indicando visualmente que ya se resolvió la situación del proyecto para el trimestre actual.
|
||||
- **Descuentos por Habilidades:** Al realizar el pago de mantenimiento de forma normal, se aplican los descuentos de recursos (Tiempo, Personal, Capital) ganados mediante las habilidades compradas del departamento (`habilidadTiempo`, `habilidadPersonal`, `habilidadCapital`), restando del total del depto el costo neto descontado (mínimo de 0).
|
||||
- **Textos e Interfaz:** Se ajustó la confirmación de penalización a: *"¿Estás seguro de que quieres pagar la penalización del proyecto..."*. Se detalla el costo original y costo neto final con descuento en el confirm del pago de mantenimiento.
|
||||
- **Habilidad Especial de Operaciones:** Permite aplicar la penalización del proyecto sin costo utilizando la habilidad especial (actualizando su cooldown).
|
||||
- **Redistribución de Layout (5 Columnas Superiores + Fila Inferior 20/40/40%):** Se reorganizó la vista de resumen en 2 filas. La fila superior (`top-row`) distribuye los 5 bloques de control/información horizontalmente en 5 columnas de igual proporción. La fila inferior (`main-container`) ubica Departamentos a la izquierda (20%), Proyectos Terminados al centro (40%) y Proyectos Activos a la derecha (40%).
|
||||
- **Gráfica Mixta de Progresión (Barras + Líneas) con Zoom Flotante 2.5X y Persistencia:** En la parte inferior del Bloque 3 (Progresión), se integró una gráfica Canvas HTML5 que representa los Objetivos del Trimestre (almacenados en la sesión como `arregloGeneral.objetivoT1..T4`, por defecto $100,000) en **barras azules** y los Ingresos Reales por Trimestre (T1..T4) en una **línea roja con nodos y valores**. Al colocar el cursor sobre la gráfica (`mouseenter`), se despliega un panel emergente flotante alineado sobre la tarjeta del bloque con la gráfica en tamaño **2.5X ampliado** con posicionamiento dinámico anti-recorte y leyenda ajustada a la izquierda (`textAlign = 'left'`) para evitar cualquier solapamiento con los iconos. Se oculta al retirar el cursor (`mouseleave`).
|
||||
|
||||
### 2. Tablero de Juego ([jsCode.js](file:///c:/CHV/ludotecaLocal/Colaborando/jsCode.js))
|
||||
- **Visibilidad Permanente:** Se eliminaron los filtros que ocultaban el proyecto del tablero chico o grande cuando el mantenimiento ya había sido resuelto. El proyecto permanece visible tanto en el tablero como en el resumen durante la quincena actual, permitiendo seguir trabajando en él.
|
||||
- **Corrección de Proyectos Descartados (`continuamos()`):** Se actualizó la carga inicial del tablero para verificar estrictamente que el proyecto asignado a `TablaProyectoGde` tenga estatus `'En proceso'`. Si un proyecto fue descartado desde el resumen o mediante habilidad especial, al retornar al tablero ya no se cargará en `TablaProyectoGde` y desaparecerá de inmediato sin necesidad de refrescar la página.
|
||||
- **Persistencia de Botones de Acción (`bAccion1` y `bAccion2`):** Se guardan los estados de selección (activado/desactivado) de las acciones 1 y 2 en `arregloGeneral.bAccion1` y `arregloGeneral.bAccion2` al pulsar `toggleColor()` y al finalizar el timer. Al navegar entre el tablero y el resumen y regresar, las acciones permanecen seleccionadas tal como las dejó el usuario.
|
||||
|
||||
## Cómo Realizar las Pruebas (Verificación)
|
||||
|
||||
1. **Escenario de Pago de Mantenimiento / Penalización:**
|
||||
- Asegúrate de estar en una quincena fin de trimestre (ej. **Q6** del Trimestre 1).
|
||||
- Ve a la pantalla de resumen. Verás los botones **Pagar Manto** y **Penalizar** en los proyectos en proceso.
|
||||
- Realiza cualquiera de las dos acciones:
|
||||
- **Pagar Manto:** Selecciona un departamento con recursos suficientes y pulsa el botón.
|
||||
- **Penalizar:** Pulsa el botón; confirmará que tengas acumulado financiero suficiente y aplicará la deducción.
|
||||
- En ambos casos:
|
||||
- La tarjeta del proyecto en el resumen cambiará inmediatamente a un fondo gris y los botones de acción se deshabilitarán de forma definitiva en la quincena actual.
|
||||
- Ve al Tablero (`colaborando2.php`) en la misma quincena (Q6) y verifica que el proyecto **sigue estando visible** en el tablero chico y en el slot de proyecto grande.
|
||||
- Avanza la quincena a **Q7** (Trimestre 2). Vuelve a la pantalla de resumen y verifica que el proyecto recupera su color blanco y los botones ya no aparecen (pues no es fin de trimestre), y que en el tablero continúa disponible con total normalidad.
|
||||
|
||||
2. **Escenario de Descarte de Proyecto Seleccionado:**
|
||||
- Selecciona un proyecto en `TablaProyectoGde` en el tablero.
|
||||
- Ve al resumen (o usa la Habilidad Especial de Operaciones para "Descartar un proyecto").
|
||||
- Descarta el proyecto que estaba seleccionado en `TablaProyectoGde`.
|
||||
- Pulsa "Ir al Tablero".
|
||||
- Verifica que el proyecto descartado **ya no aparece** en `TablaProyectoGde` ni en el tablero chico sin necesidad de refrescar la página.
|
||||
|
||||
3. **Escenario de Persistencia de Acciones 1 y 2:**
|
||||
- En el tablero, activa los botones de acción `1` (`bAccion1`) o `2` (`bAccion2`).
|
||||
- Navega al Resumen haciendo clic en "Ir al Resumen".
|
||||
- Regresa al Tablero haciendo clic en "Ir al Tablero".
|
||||
- Verifica que las acciones seleccionadas se mantienen activas (color azul y texto blanco).
|
||||
+1469
File diff suppressed because it is too large
Load Diff
@@ -158,7 +158,7 @@ function llenaDepartamentoGde(depto) {
|
||||
if ($('#habilidadesAcreditadasGde1').text() == '') {
|
||||
$('#habilidadesAcreditadasGde1').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(arreglosCapacitaciones[laHabilidad], 'nombre') +
|
||||
' ' +
|
||||
beneficio +
|
||||
@@ -167,7 +167,7 @@ function llenaDepartamentoGde(depto) {
|
||||
} else if ($('#habilidadesAcreditadasGde2').text() == '') {
|
||||
$('#habilidadesAcreditadasGde2').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(arreglosCapacitaciones[laHabilidad], 'nombre') +
|
||||
' ' +
|
||||
beneficio +
|
||||
@@ -176,7 +176,7 @@ function llenaDepartamentoGde(depto) {
|
||||
} else if ($('#habilidadesAcreditadasGde3').text() == '') {
|
||||
$('#habilidadesAcreditadasGde3').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(arreglosCapacitaciones[laHabilidad], 'nombre') +
|
||||
' ' +
|
||||
beneficio +
|
||||
@@ -208,7 +208,7 @@ function llenaDepartamentoGde(depto) {
|
||||
if ($('#habilidadesAcreditadasGde1').text() == '') {
|
||||
$('#habilidadesAcreditadasGde1').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(arreglosCapacitaciones[laHabilidad], 'nombre') +
|
||||
' ' +
|
||||
beneficio +
|
||||
@@ -217,7 +217,7 @@ function llenaDepartamentoGde(depto) {
|
||||
} else if ($('#habilidadesAcreditadasGde2').text() == '') {
|
||||
$('#habilidadesAcreditadasGde2').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(arreglosCapacitaciones[laHabilidad], 'nombre') +
|
||||
' ' +
|
||||
beneficio +
|
||||
@@ -226,7 +226,7 @@ function llenaDepartamentoGde(depto) {
|
||||
} else if ($('#habilidadesAcreditadasGde3').text() == '') {
|
||||
$('#habilidadesAcreditadasGde3').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(arreglosCapacitaciones[laHabilidad], 'nombre') +
|
||||
' ' +
|
||||
beneficio +
|
||||
@@ -258,7 +258,7 @@ function llenaDepartamentoGde(depto) {
|
||||
if ($('#habilidadesAcreditadasGde1').text() == '') {
|
||||
$('#habilidadesAcreditadasGde1').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(arreglosCapacitaciones[laHabilidad], 'nombre') +
|
||||
' ' +
|
||||
beneficio +
|
||||
@@ -267,7 +267,7 @@ function llenaDepartamentoGde(depto) {
|
||||
} else if ($('#habilidadesAcreditadasGde2').text() == '') {
|
||||
$('#habilidadesAcreditadasGde2').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(arreglosCapacitaciones[laHabilidad], 'nombre') +
|
||||
' ' +
|
||||
beneficio +
|
||||
@@ -276,7 +276,7 @@ function llenaDepartamentoGde(depto) {
|
||||
} else if ($('#habilidadesAcreditadasGde3').text() == '') {
|
||||
$('#habilidadesAcreditadasGde3').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(arreglosCapacitaciones[laHabilidad], 'nombre') +
|
||||
' ' +
|
||||
beneficio +
|
||||
@@ -510,15 +510,6 @@ function llenaDepartamentoChico(depto) {
|
||||
console.log(`[llenaDepartamentoChico] <- FIN para depto: '${depto}'`)
|
||||
}
|
||||
|
||||
function cuantaProyectosAsignados() {
|
||||
let contador = 0
|
||||
for (let i = 0; i < proyectos.length; i++) {
|
||||
if (proyectos[i].estatus == 'En proceso') {
|
||||
contador++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function limpiaProyectoChico(elProyecto) {
|
||||
console.log('Limpia proyecto chico', elProyecto)
|
||||
// console.log($("#" + proyectoActual + " #activoReqProyectoNom1").text())
|
||||
@@ -545,27 +536,6 @@ function limpiaProyectoChico(elProyecto) {
|
||||
}
|
||||
}
|
||||
|
||||
function limpiaProyectoGrande() {
|
||||
console.log('Limpia proyecto grande')
|
||||
$('#TablaProyectoGde').removeAttr('num')
|
||||
$('#TablaProyectoGde').removeAttr('estatus')
|
||||
$('#TablaProyectoGde').css('background-color', '')
|
||||
$('#nombreProyectoGde').text('')
|
||||
$('#descripcionProyectoGde').text('')
|
||||
$('#TablaProyectoGde #puntosGanados').text('')
|
||||
$('#puntosPerdidos').text('')
|
||||
$('#activoReqProyectoNom1').attr('class', '').text('')
|
||||
$('#activoReqProyectoNom2').attr('class', '').text('')
|
||||
$('#activoReqProyectoNom3').attr('class', '').text('')
|
||||
$('#activoReqProyectoCantX1').text('0')
|
||||
$('#activoReqProyectoCantX2').text('0')
|
||||
$('#activoReqProyectoCantX3').text('0')
|
||||
$('#activoReqProyectoCant1').attr('class', '').text('')
|
||||
$('#activoReqProyectoCant2').attr('class', '').text('')
|
||||
$('#activoReqProyectoCant3').attr('class', '').text('')
|
||||
$('#mantoGde').text('MANTENIMIENTO')
|
||||
}
|
||||
|
||||
function llenaProyectoChico(proyectoNum) {
|
||||
console.log('Llenando proyectos! ', proyectoNum)
|
||||
const colores = [
|
||||
@@ -1603,7 +1573,7 @@ $('#accionComprarCapacitacion').click(function () {
|
||||
if ($('#habilidadesAcreditadasGde1').text() == '') {
|
||||
$('#habilidadesAcreditadasGde1').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(
|
||||
arreglosCapacitaciones[habilidadAcreditadaEnEspera],
|
||||
'nombre'
|
||||
@@ -1614,7 +1584,7 @@ $('#accionComprarCapacitacion').click(function () {
|
||||
)
|
||||
$('#' + deptoActual + ' #habilidadesAcreditadasCh1').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(
|
||||
arreglosCapacitaciones[habilidadAcreditadaEnEspera],
|
||||
'nombre'
|
||||
@@ -1622,12 +1592,12 @@ $('#accionComprarCapacitacion').click(function () {
|
||||
', ' +
|
||||
beneficio +
|
||||
tipoRecurso.charAt(0).toUpperCase() +
|
||||
'<br><br>'
|
||||
'<br>'
|
||||
)
|
||||
} else if ($('#habilidadesAcreditadasGde2').text() == '') {
|
||||
$('#habilidadesAcreditadasGde2').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(
|
||||
arreglosCapacitaciones[habilidadAcreditadaEnEspera],
|
||||
'nombre'
|
||||
@@ -1638,7 +1608,7 @@ $('#accionComprarCapacitacion').click(function () {
|
||||
)
|
||||
$('#' + deptoActual + ' #habilidadesAcreditadasCh2').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(
|
||||
arreglosCapacitaciones[habilidadAcreditadaEnEspera],
|
||||
'nombre'
|
||||
@@ -1646,12 +1616,12 @@ $('#accionComprarCapacitacion').click(function () {
|
||||
', ' +
|
||||
beneficio +
|
||||
tipoRecurso.charAt(0).toUpperCase() +
|
||||
'<br><br>'
|
||||
'<br>'
|
||||
)
|
||||
} else if ($('#habilidadesAcreditadasGde3').text() == '') {
|
||||
$('#habilidadesAcreditadasGde3').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(
|
||||
arreglosCapacitaciones[habilidadAcreditadaEnEspera],
|
||||
'nombre'
|
||||
@@ -1662,7 +1632,7 @@ $('#accionComprarCapacitacion').click(function () {
|
||||
)
|
||||
$('#' + deptoActual + ' #habilidadesAcreditadasCh3').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
': ' +
|
||||
findArrayValue(
|
||||
arreglosCapacitaciones[habilidadAcreditadaEnEspera],
|
||||
'nombre'
|
||||
@@ -2754,28 +2724,7 @@ $('.droppableActivos').droppable({
|
||||
},
|
||||
})
|
||||
|
||||
function obtenerProyectosPendientesXX(cuantos) {
|
||||
// Filtrar proyectos pendientes
|
||||
const proyectosPendientes = proyectos.filter(
|
||||
(proyecto) => proyecto.estatus === 'Pendiente'
|
||||
)
|
||||
// const proyectosPendientes = proyectos.filter(proyecto =>
|
||||
// proyecto.estatus === "Pendiente" && proyecto.dificultad !== "Incidencia"
|
||||
// );
|
||||
// Si hay menos de 10 proyectos pendientes, retornar todos los disponibles
|
||||
if (proyectosPendientes.length <= cuantos) {
|
||||
return proyectosPendientes
|
||||
}
|
||||
// Seleccionar 10 proyectos aleatorios
|
||||
const resultado = []
|
||||
const proyectosDisponibles = [...proyectosPendientes]
|
||||
for (let i = 0; i < cuantos && proyectosDisponibles.length > 0; i++) {
|
||||
const randomIndex = Math.floor(Math.random() * proyectosDisponibles.length)
|
||||
resultado.push(proyectosDisponibles[randomIndex])
|
||||
proyectosDisponibles.splice(randomIndex, 1)
|
||||
}
|
||||
return resultado
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Pone en el arreglo proyectosPendientes, 7 proyectos al azar de los que están pendientes en el arreglo general.
|
||||
@@ -3012,66 +2961,7 @@ function guardarNuevoTexto(nuevoTexto, deptoOriginal) {
|
||||
console.log('ARREGLO:', arreglosDeptos['arr' + deptoOriginal])
|
||||
}
|
||||
|
||||
/**
|
||||
* Asigna las habilidades acreditadas al departamento especificado.
|
||||
*/
|
||||
function asignarHabilidades2(depto) {
|
||||
console.log('>>>>>> Asignando habilidades al departamento:', depto)
|
||||
|
||||
// Obtiene el arreglo del departamento especificado
|
||||
const elArregloDepto = arreglosDeptos['arr' + depto]
|
||||
|
||||
// Lista de habilidades a asignar en orden de prioridad
|
||||
const habilidades = [
|
||||
'habilidadTiempo',
|
||||
'habilidadPersonal',
|
||||
'habilidadCapital',
|
||||
]
|
||||
|
||||
// Arreglo para almacenar las habilidades asignadas
|
||||
const habilidadesAsignadas = [0, 0, 0]
|
||||
|
||||
// Asigna las habilidades en orden de prioridad
|
||||
habilidades.forEach((habilidad, index) => {
|
||||
// Encuentra el valor de la habilidad en el arreglo del departamento
|
||||
const value = elArregloDepto.find((item) => item.name === habilidad).value
|
||||
// Si el valor no es cero y no está ya asignado, se asigna a habilidadesAsignadas
|
||||
if (value !== 0 && !habilidadesAsignadas.includes(value)) {
|
||||
habilidadesAsignadas[index] = value
|
||||
}
|
||||
})
|
||||
|
||||
// Actualiza el DOM con las habilidades asignadas
|
||||
habilidadesAsignadas.forEach((habilidad, index) => {
|
||||
if (habilidad !== 0) {
|
||||
// Obtiene la capacitación correspondiente a la habilidad
|
||||
const capacitacion = arreglosCapacitaciones[habilidad]
|
||||
|
||||
// Obtiene y mapea el tipo de habilidad a un nombre más descriptivo
|
||||
const tipo = mapTipo(obtenerValorCapacitacion(capacitacion, 'tipo'))
|
||||
|
||||
// Obtiene el nombre, beneficio y tipo de recurso de la capacitación
|
||||
const nombre = obtenerValorCapacitacion(capacitacion, 'nombre')
|
||||
const beneficio = obtenerValorCapacitacion(capacitacion, 'beneficio')
|
||||
const tipoRecurso = obtenerValorCapacitacion(capacitacion, 'tipoRecurso')
|
||||
.charAt(0)
|
||||
.toUpperCase()
|
||||
|
||||
// Construye el contenido HTML a insertar
|
||||
const contenido = `${tipo}<br>${nombre}, ${beneficio} ${tipoRecurso}<br><br>`
|
||||
|
||||
// Actualiza el contenido HTML del elemento correspondiente en el DOM
|
||||
$(`#${depto} #habilidadesAcreditadasCh${index + 1}`).html(contenido)
|
||||
}
|
||||
})
|
||||
tieneTresHabilidades(depto)
|
||||
// Asegura que la vista grande se actualice con la acción especial si es el depto actual
|
||||
if (depto === deptoActual) {
|
||||
const elArreglo = arreglosDeptos['arr' + depto]
|
||||
const accion = findArrayValue(elArreglo, 'accionEspecialQuincenal')
|
||||
$('#' + depto + ' #accionEspecialGde').text(accion)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Asigna las habilidades acreditadas al departamento especificado.
|
||||
@@ -3121,9 +3011,9 @@ function asignarHabilidades(depto) {
|
||||
console.log('Capacitación:', capacitacion)
|
||||
console.log('Tipo:', tipo)
|
||||
|
||||
const contenido = `${tipo}<br>${nombre}, ${beneficio} ${tipoRecurso
|
||||
const contenido = `${tipo}: ${nombre}, ${beneficio} ${tipoRecurso
|
||||
.charAt(0)
|
||||
.toUpperCase()}<br><br>`
|
||||
.toUpperCase()}<br>`
|
||||
$(`#${depto} #habilidadesAcreditadasCh${index + 1}`).html(contenido)
|
||||
}
|
||||
})
|
||||
@@ -3198,136 +3088,7 @@ function tieneTresHabilidades(depto) {
|
||||
return completo
|
||||
}
|
||||
|
||||
/**
|
||||
* Asigna las habilidades acreditadas al departamento especificado.
|
||||
**/
|
||||
function asignarHabilidades0(depto) {
|
||||
console.log('>>>>>> Asignando habilidades al departamento:', depto)
|
||||
let habilidad1 = 0
|
||||
let habilidad2 = 0
|
||||
let habilidad3 = 0
|
||||
const elArregloDepto = arreglosDeptos['arr' + depto]
|
||||
// console.log(elArregloDepto)
|
||||
|
||||
const habilidadTiempo = elArregloDepto.find(
|
||||
(item) => item.name === 'habilidadTiempo'
|
||||
).value
|
||||
const habilidadPersonal = elArregloDepto.find(
|
||||
(item) => item.name === 'habilidadPersonal'
|
||||
).value
|
||||
const habilidadCapital = elArregloDepto.find(
|
||||
(item) => item.name === 'habilidadCapital'
|
||||
).value
|
||||
// console.log('habilidadTiempo:', habilidadTiempo)
|
||||
// console.log('habilidadPersonal:', habilidadPersonal)
|
||||
// console.log('habilidadCapital:', habilidadCapital)
|
||||
|
||||
if (habilidadTiempo != 0) {
|
||||
habilidad1 = habilidadTiempo
|
||||
} else if (habilidadPersonal != 0) {
|
||||
habilidad1 = habilidadPersonal
|
||||
} else if (habilidadCapital != 0) {
|
||||
habilidad1 = habilidadCapital
|
||||
}
|
||||
|
||||
if (habilidadTiempo != 0 && habilidadTiempo != habilidad1) {
|
||||
habilidad2 = habilidadTiempo
|
||||
} else if (habilidadPersonal != 0 && habilidadPersonal != habilidad1) {
|
||||
habilidad2 = habilidadPersonal
|
||||
} else if (habilidadCapital != 0 && habilidadCapital != habilidad1) {
|
||||
habilidad2 = habilidadCapital
|
||||
}
|
||||
if (
|
||||
habilidadTiempo != 0 &&
|
||||
habilidadTiempo != habilidad1 &&
|
||||
habilidadTiempo != habilidad2
|
||||
) {
|
||||
habilidad3 = habilidadTiempo
|
||||
} else if (
|
||||
habilidadPersonal != 0 &&
|
||||
habilidadPersonal != habilidad1 &&
|
||||
habilidadPersonal != habilidad2
|
||||
) {
|
||||
habilidad3 = habilidadPersonal
|
||||
} else if (
|
||||
habilidadCapital != 0 &&
|
||||
habilidadCapital != habilidad1 &&
|
||||
habilidadCapital != habilidad2
|
||||
) {
|
||||
habilidad3 = habilidadCapital
|
||||
}
|
||||
|
||||
console.log('laHabilidad1: ', habilidad1)
|
||||
console.log('laHabilidad2: ', habilidad2)
|
||||
console.log('laHabilidad3: ', habilidad3)
|
||||
|
||||
if (habilidad1 != 0) {
|
||||
console.log('laCapacitacion:', arreglosCapacitaciones[habilidad1])
|
||||
let tipo = findArrayValue(arreglosCapacitaciones[habilidad1], 'tipo')
|
||||
if (tipo == 'HC') {
|
||||
tipo = 'Habilidad Conceptual'
|
||||
} else if (tipo == 'HT') {
|
||||
tipo = 'Habilidad Técnica'
|
||||
} else if (tipo == 'HH') {
|
||||
tipo = 'Habilidad Humana'
|
||||
}
|
||||
$('#' + depto + ' #habilidadesAcreditadasCh1').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
findArrayValue(arreglosCapacitaciones[habilidad1], 'nombre') +
|
||||
', ' +
|
||||
findArrayValue(arreglosCapacitaciones[habilidad1], 'beneficio') +
|
||||
findArrayValue(arreglosCapacitaciones[habilidad1], 'tipoRecurso')
|
||||
.charAt(0)
|
||||
.toUpperCase() +
|
||||
'<br><br>'
|
||||
)
|
||||
}
|
||||
if (habilidad2 != 0) {
|
||||
console.log('laCapacitacion:', arreglosCapacitaciones[habilidad2])
|
||||
let tipo = findArrayValue(arreglosCapacitaciones[habilidad2], 'tipo')
|
||||
if (tipo == 'HC') {
|
||||
tipo = 'Habilidad Conceptual'
|
||||
} else if (tipo == 'HT') {
|
||||
tipo = 'Habilidad Técnica'
|
||||
} else if (tipo == 'HH') {
|
||||
tipo = 'Habilidad Humana'
|
||||
}
|
||||
$('#' + depto + ' #habilidadesAcreditadasCh2').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
findArrayValue(arreglosCapacitaciones[habilidad2], 'nombre') +
|
||||
', ' +
|
||||
findArrayValue(arreglosCapacitaciones[habilidad2], 'beneficio') +
|
||||
findArrayValue(arreglosCapacitaciones[habilidad2], 'tipoRecurso')
|
||||
.charAt(0)
|
||||
.toUpperCase() +
|
||||
'<br><br>'
|
||||
)
|
||||
}
|
||||
if (habilidad3 != 0) {
|
||||
console.log('laCapacitacion:', arreglosCapacitaciones[habilidad3])
|
||||
let tipo = findArrayValue(arreglosCapacitaciones[habilidad3], 'tipo')
|
||||
if (tipo == 'HC') {
|
||||
tipo = 'Habilidad Conceptual'
|
||||
} else if (tipo == 'HT') {
|
||||
tipo = 'Habilidad Técnica'
|
||||
} else if (tipo == 'HH') {
|
||||
tipo = 'Habilidad Humana'
|
||||
}
|
||||
$('#' + depto + ' #habilidadesAcreditadasCh3').html(
|
||||
tipo +
|
||||
'<br>' +
|
||||
findArrayValue(arreglosCapacitaciones[habilidad3], 'nombre') +
|
||||
', ' +
|
||||
findArrayValue(arreglosCapacitaciones[habilidad3], 'beneficio') +
|
||||
findArrayValue(arreglosCapacitaciones[habilidad3], 'tipoRecurso')
|
||||
.charAt(0)
|
||||
.toUpperCase() +
|
||||
'<br><br>'
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Función que se ejecuta al iniciar el juego, DESPUES de cargar los arreglos de activos y departamentos.
|
||||
|
||||
File diff suppressed because one or more lines are too long
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 720 KiB |
+2151
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user