- Crear método getUsuariosGestion() que incluye ayudantes y coordinadores - Actualizar asignaciones_completo.php para mostrar coordinadores - Actualizar todas las páginas de gestión para usar nuevo método - Corregir que coordinadores aparezcan en asignaciones masivas - Mantener consistencia en todos los módulos de administración
282 lines
12 KiB
PHP
282 lines
12 KiB
PHP
<?php
|
|
if (!defined('BASE_PATH')) {
|
|
define('BASE_PATH', dirname(__DIR__, 2));
|
|
}
|
|
require_once BASE_PATH . '/config/config.php';
|
|
require_once BASE_PATH . '/src/Auth.php';
|
|
require_once BASE_PATH . '/src/User.php';
|
|
require_once BASE_PATH . '/src/DiasHorarios.php';
|
|
require_once BASE_PATH . '/src/Asignacion.php';
|
|
require_once BASE_PATH . '/src/CSRF.php';
|
|
|
|
$auth = new Auth();
|
|
$auth->requireCoordinador();
|
|
|
|
$userModel = new User();
|
|
$horariosModel = new DiasHorarios();
|
|
$asignacionModel = new Asignacion();
|
|
|
|
$message = '';
|
|
$messageType = '';
|
|
|
|
if (isset($_GET['success']) && $_GET['success'] === 'orden_actualizado') {
|
|
$message = 'Orden actualizado correctamente. Se recalcularon las asignaciones futuras.';
|
|
$messageType = 'success';
|
|
}
|
|
|
|
if (isset($_GET['success']) && $_GET['success'] === 'automatica') {
|
|
$message = 'Turnos generados automáticamente correctamente.';
|
|
$messageType = 'success';
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
if (!CSRF::isValidRequest()) {
|
|
$message = 'Error de validación del formulario';
|
|
$messageType = 'danger';
|
|
} else {
|
|
$action = $_POST['action'] ?? '';
|
|
|
|
if ($action === 'asignar_actual') {
|
|
$userId = $_POST['user_id'] ?? 0;
|
|
|
|
// Encontrar el domingo actual
|
|
$hoy = new DateTime();
|
|
$diaSemana = (int)$hoy->format('w');
|
|
$domingoActual = clone $hoy;
|
|
$domingoActual->modify('-' . $diaSemana . ' days');
|
|
$currentWeekStart = $domingoActual->format('Y-m-d');
|
|
|
|
if ($userId) {
|
|
$asignacionModel->asignar($userId, $currentWeekStart);
|
|
$message = 'Turno actual asignado correctamente';
|
|
$messageType = 'success';
|
|
header("Location: " . $_SERVER['PHP_SELF'] . "?success=actual");
|
|
exit;
|
|
}
|
|
} elseif ($action === 'rotar_automatica') {
|
|
$resultado = $asignacionModel->asignarSemanasFuturasAutomaticas(12);
|
|
|
|
if ($resultado['success'] > 0) {
|
|
header("Location: " . $_SERVER['PHP_SELF'] . "?success=automatica");
|
|
exit;
|
|
} else {
|
|
$message = 'No se pudieron generar turnos: ' . implode(', ', $resultado['errors']);
|
|
$messageType = 'danger';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Obtener datos principales
|
|
$hoy = new DateTime();
|
|
$diaSemana = (int)$hoy->format('w');
|
|
$domingoActual = clone $hoy;
|
|
$domingoActual->modify('-' . $diaSemana . ' days');
|
|
$currentWeekStart = $domingoActual->format('Y-m-d');
|
|
|
|
$asignacionActual = $asignacionModel->getAsignacionPorSemana($currentWeekStart);
|
|
// Para gestión de turnos, incluir ayudantes y coordinadores
|
|
$ayudantes = $userModel->getUsuariosGestion();
|
|
|
|
// Obtener próximos turnos (siguientes 3 semanas)
|
|
$proximosTurnos = [];
|
|
for ($i = 1; $i <= 3; $i++) {
|
|
$semanaDomingo = clone $domingoActual;
|
|
$semanaDomingo->modify("+{$i} weeks");
|
|
$semanaInicio = $semanaDomingo->format('Y-m-d');
|
|
$asignacion = $asignacionModel->getAsignacionPorSemana($semanaInicio);
|
|
|
|
$proximosTurnos[] = [
|
|
'semana' => $semanaInicio,
|
|
'fin' => date('Y-m-d', strtotime('+5 days', strtotime($semanaInicio))),
|
|
'asignacion' => $asignacion
|
|
];
|
|
}
|
|
|
|
$currentPage = 'asignaciones';
|
|
$pageTitle = 'Gestión de Turnos';
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="es">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Turnos - Contenedor Ibiza</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<style>
|
|
.turno-card {
|
|
transition: transform 0.2s;
|
|
}
|
|
.turno-card:hover {
|
|
transform: translateY(-2px);
|
|
}
|
|
.btn-accion {
|
|
min-width: 120px;
|
|
}
|
|
.turno-actual {
|
|
border-left: 5px solid #198754;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<?php include BASE_PATH . '/public/partials/navbar.php'; ?>
|
|
|
|
<div class="container mt-4">
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h2 class="mb-0">📅 Gestión de Turnos</h2>
|
|
<a href="/admin/asignaciones_completo.php" class="btn btn-outline-secondary btn-sm">
|
|
⚙️ Vista Avanzada
|
|
</a>
|
|
</div>
|
|
|
|
<?php if ($message): ?>
|
|
<div class="alert alert-<?= $messageType ?> alert-dismissible fade show">
|
|
<?= htmlspecialchars($message) ?>
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<!-- TURNO ACTUAL -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="card turno-actual shadow-sm">
|
|
<div class="card-header bg-success text-white">
|
|
<h5 class="mb-0">📍 Turno Actual</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row align-items-center">
|
|
<div class="col-md-6">
|
|
<p class="mb-2">
|
|
<strong>📆 Semana:</strong>
|
|
<?= date('d/m/Y', strtotime($currentWeekStart)) ?>
|
|
al <?= date('d/m/Y', strtotime('+5 days', strtotime($currentWeekStart))) ?>
|
|
</p>
|
|
|
|
<?php if ($asignacionActual): ?>
|
|
<div class="alert alert-success mb-3">
|
|
<h6 class="mb-1">✅ Asignado a:</h6>
|
|
<strong class="fs-5"><?= htmlspecialchars($asignacionActual['nombre']) ?></strong>
|
|
</div>
|
|
<?php else: ?>
|
|
<div class="alert alert-warning mb-3">
|
|
<h6 class="mb-1">⚠️ Sin asignar</h6>
|
|
<span class="fs-5">No hay ayudante asignado esta semana</span>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<div class="col-md-6 text-center">
|
|
<form method="POST" class="d-flex justify-content-center gap-2">
|
|
<?= CSRF::getTokenField() ?>
|
|
<input type="hidden" name="action" value="asignar_actual">
|
|
|
|
<select class="form-select" name="user_id" style="max-width: 200px;" required>
|
|
<option value="">Seleccionar...</option>
|
|
<?php foreach ($ayudantes as $a): ?>
|
|
<option value="<?= $a['id'] ?>"
|
|
<?= $asignacionActual && $a['id'] == $asignacionActual['id'] ? 'selected' : '' ?>>
|
|
<?= htmlspecialchars($a['nombre']) ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
|
|
<button type="submit" class="btn btn-success btn-accion">
|
|
💾 Asignar
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ACCIONES RÁPIDAS -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="card shadow-sm">
|
|
<div class="card-header bg-primary text-white">
|
|
<h5 class="mb-0">⚡ Acciones Rápidas</h5>
|
|
</div>
|
|
<div class="card-body text-center">
|
|
<div class="row">
|
|
<div class="col-md-6 mb-3">
|
|
<div class="p-3">
|
|
<h6 class="mb-3">🔄 Generar Turnos Automáticos</h6>
|
|
<p class="text-muted mb-3">Crea automáticamente las próximas 12 semanas siguiendo el orden actual</p>
|
|
<form method="POST" style="display: inline;">
|
|
<?= CSRF::getTokenField() ?>
|
|
<input type="hidden" name="action" value="rotar_automatica">
|
|
<button type="submit" class="btn btn-primary btn-lg btn-accion">
|
|
🚀 Generar Automático
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6 mb-3">
|
|
<div class="p-3">
|
|
<h6 class="mb-3">👥 Gestionar Orden</h6>
|
|
<p class="text-muted mb-3">Modifica el orden de rotación de los ayudantes</p>
|
|
<a href="/admin/asignaciones_completo.php#reordenar" class="btn btn-outline-primary btn-lg btn-accion">
|
|
⚙️ Orden de Rotación
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- PRÓXIMOS TURNOS -->
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card shadow-sm">
|
|
<div class="card-header bg-info text-white">
|
|
<h5 class="mb-0">📋 Próximos Turnos</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<?php foreach ($proximosTurnos as $index => $turno): ?>
|
|
<div class="col-md-4 mb-3">
|
|
<div class="card turno-card h-100">
|
|
<div class="card-body text-center">
|
|
<h6 class="card-title">
|
|
📅 <?= date('d/m', strtotime($turno['semana'])) ?> -
|
|
<?= date('d/m', strtotime($turno['fin'])) ?>
|
|
</h6>
|
|
|
|
<?php if ($turno['asignacion']): ?>
|
|
<div class="alert alert-success mb-2">
|
|
<strong>✅ <?= htmlspecialchars($turno['asignacion']['nombre']) ?></strong>
|
|
</div>
|
|
<?php else: ?>
|
|
<div class="alert alert-warning mb-2">
|
|
<strong>⚠️ Sin asignar</strong>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<a href="/admin/asignaciones_completo.php" class="btn btn-sm btn-outline-primary">
|
|
Modificar
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
|
|
<div class="text-center mt-3">
|
|
<a href="/admin/asignaciones_completo.php" class="btn btn-outline-info">
|
|
📊 Ver todos los turnos
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
</body>
|
|
</html>
|