fix: Corregir funcionalidad de reordenamiento y generación automática de turnos

- Añadir jQuery para resolver error 'jQuery is not defined'
- Corregir variable $db indefinida en reordenamiento de rotación
- Añadir método getDb() a clase Asignacion para acceso a base de datos
- Implementar procesamiento correcto de acción 'rotacion_automatica'
- Actualizar inputs ocultos al reordenar elementos visuales
- Añadir redirección para recargar datos actualizados después de guardar orden
- Mejorar manejo de mensajes de éxito/errores en generación automática
This commit is contained in:
nickpons666
2026-01-30 22:30:55 -06:00
parent 4c7f298acd
commit 76b0584667
2 changed files with 33 additions and 16 deletions

View File

@@ -19,6 +19,11 @@ $asignacionModel = new Asignacion();
$message = ''; $message = '';
$messageType = ''; $messageType = '';
if (isset($_GET['success']) && $_GET['success'] === 'orden_actualizado') {
$message = 'Orden actualizado correctamente. Se recalcularon las asignaciones futuras.';
$messageType = 'success';
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!CSRF::isValidRequest()) { if (!CSRF::isValidRequest()) {
$message = 'Error de validación del formulario'; $message = 'Error de validación del formulario';
@@ -47,6 +52,21 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$messageType = 'success'; $messageType = 'success';
} }
} }
} elseif ($action === 'rotacion_automatica') {
$resultado = $asignacionModel->asignarSemanasFuturasAutomaticas(12);
if ($resultado['success'] > 0) {
$message = "Se generaron {$resultado['success']} semanas futuras correctamente";
if (!empty($resultado['errors'])) {
$message .= ". Errores: " . implode(', ', $resultado['errors']);
$messageType = 'warning';
} else {
$messageType = 'success';
}
} else {
$message = 'No se pudieron generar asignaciones: ' . implode(', ', $resultado['errors']);
$messageType = 'danger';
}
} elseif ($action === 'asignar_masivo') { } elseif ($action === 'asignar_masivo') {
$userIds = $_POST['user_ids'] ?? []; $userIds = $_POST['user_ids'] ?? [];
$semanaInicio = $_POST['semana_inicio'] ?? ''; $semanaInicio = $_POST['semana_inicio'] ?? '';
@@ -370,17 +390,7 @@ No hay asignación para la semana <?= $posicionSinAsignar ?> de 4 (<?= date('d/m
<?php endforeach; ?> <?php endforeach; ?>
</div> </div>
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'rotacion_automatica'): ?>
<?php
$resultado = $asignacionModel->asignarSemanasFuturasAutomaticas(12);
?>
<div class="alert alert-<?= !empty($resultado['errors']) ? 'warning' : 'success' ?>">
<strong>Resultado:</strong> Se asignaron <?= $resultado['success'] ?> semanas futuras
<?php if (!empty($resultado['errores'])): ?>
<br><small>Errores: <?= implode(', ', $resultado['errores']) ?></small>
<?php endif; ?>
</div>
<?php endif; ?>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<form method="POST" class="h-100 d-flex flex-column justify-content-center"> <form method="POST" class="h-100 d-flex flex-column justify-content-center">
@@ -451,7 +461,7 @@ No hay asignación para la semana <?= $posicionSinAsignar ?> de 4 (<?= date('d/m
if (!empty($nuevosOrdenes)) { if (!empty($nuevosOrdenes)) {
foreach ($nuevosOrdenes as $index => $userId) { foreach ($nuevosOrdenes as $index => $userId) {
$stmt = $db->prepare(" $stmt = $asignacionModel->getDb()->prepare("
UPDATE rotacion_orden UPDATE rotacion_orden
SET orden = ? SET orden = ?
WHERE user_id = ? AND activo = 1 WHERE user_id = ? AND activo = 1
@@ -463,10 +473,9 @@ No hay asignación para la semana <?= $posicionSinAsignar ?> de 4 (<?= date('d/m
$resultado = $asignacionModel->recalcularAsignaciones(20); $resultado = $asignacionModel->recalcularAsignaciones(20);
if ($resultado['success'] > 0) { if ($resultado['success'] > 0) {
echo '<div class="alert alert-success mt-3">'; // Redireccionar para recargar los datos actualizados
echo 'Orden actualizado correctamente. '; header("Location: " . $_SERVER['PHP_SELF'] . "?success=orden_actualizado");
echo "Se recalcularon {$resultado['success']} semanas futuras."; exit;
echo '</div>';
} }
} }
?> ?>
@@ -475,6 +484,7 @@ No hay asignación para la semana <?= $posicionSinAsignar ?> de 4 (<?= date('d/m
</div> </div>
</div> </div>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script> <script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script> <script>
@@ -491,6 +501,9 @@ No hay asignación para la semana <?= $posicionSinAsignar ?> de 4 (<?= date('d/m
function actualizarNumeros() { function actualizarNumeros() {
$("#sortableList li").each(function(index) { $("#sortableList li").each(function(index) {
$(this).find('.badge').text('☰ ' + (index + 1)); $(this).find('.badge').text('☰ ' + (index + 1));
// Actualizar el valor del input oculto con el nuevo orden
var userId = $(this).data('id');
$(this).find('input[type="hidden"]').attr('name', 'ordenes[' + index + ']').val(userId);
}); });
} }

View File

@@ -9,6 +9,10 @@ class Asignacion {
$this->db = Database::getInstance()->getConnection(); $this->db = Database::getInstance()->getConnection();
} }
public function getDb() {
return $this->db;
}
public function getAsignacionActual() { public function getAsignacionActual() {
$hoy = new DateTime(); $hoy = new DateTime();
$diaSemana = (int)$hoy->format('w'); $diaSemana = (int)$hoy->format('w');