Files
contenedor_ibiza/public/admin/asignaciones.php
nickpons666 6a5a1d48ef feat: Crear interfaz simple de gestión y unificar vista de ayudante
- Crear versión ultra simple de admin/asignaciones.php con solo funcionalidades esenciales
- Mover asignaciones complejas a asignaciones_completo.php para acceso avanzado
- Modificar ayudante.php para permitir acceso a administradores sin redirigir
- Añadir detección automática: usuarios ven navbar simple, admins ven navbar completo
- Eliminar archivo duplicado vista-ayudante.php para evitar mantener código duplicado
- Corregir rutas BASE_PATH para compatibilidad entre archivos en /admin/ y /public/
- Añadir enlace 👥 Vista Ayudante en navbar de admin
- Mejorar experiencia de usuario con diseño limpio y minimalista
2026-01-31 00:29:01 -06:00

281 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->requireAdmin();
$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);
$ayudantes = $userModel->getAyudantesActivos();
// 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>