requireAdmin(); $userModel = new User(); $horariosModel = new DiasHorarios(); $asignacionModel = new Asignacion(); $message = ''; $messageType = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!CSRF::isValidRequest()) { $message = 'Error de validación del formulario'; $messageType = 'danger'; } else { $action = $_POST['action'] ?? ''; if ($action === 'asignar') { $userId = $_POST['user_id'] ?? 0; $semana = $_POST['semana'] ?? ''; if ($userId && $semana) { $asignacionModel->asignar($userId, $semana); $message = 'Turno asignado correctamente'; $messageType = 'success'; } } elseif ($action === 'rotar') { $semana = $_POST['semana'] ?? ''; $asignacionActual = $asignacionModel->getAsignacionPorSemana($semana); if ($asignacionActual) { $proximaPersona = $asignacionModel->getProximaPersona($asignacionActual['user_id']); if ($proximaPersona) { $asignacionModel->asignar($proximaPersona['id'], $semana); $message = 'Turno rotado a: ' . htmlspecialchars($proximaPersona['nombre']); $messageType = 'success'; } } } elseif ($action === 'asignar_masivo') { $userIds = $_POST['user_ids'] ?? []; $semanaInicio = $_POST['semana_inicio'] ?? ''; $rotacionAutomatica = isset($_POST['rotacion_automatica']) ? true : false; if (!empty($userIds) && $semanaInicio) { $resultado = $asignacionModel->asignarMasivo($userIds, $semanaInicio, $rotacionAutomatica); if ($resultado['success'] > 0) { $message = "Se asignaron {$resultado['success']} turnos correctamente"; if ($rotacionAutomatica) { $message .= " con rotación automática para la siguiente semana"; } $messageType = 'success'; } if (!empty($resultado['errors'])) { $message .= "
Errores: " . implode('
', $resultado['errors']); $messageType = 'warning'; } } else { $message = 'Debes seleccionar al menos un ayudante y una semana'; $messageType = 'danger'; } } } } $ayudantes = $userModel->getAyudantesActivos(); $horarios = $horariosModel->getActivos(); // Encontrar el domingo actual $hoy = new DateTime(); $diaSemana = (int)$hoy->format('w'); // 0 = domingo, 6 = sábado $domingoActual = clone $hoy; $domingoActual->modify('-' . $diaSemana . ' days'); // Restar días para llegar al domingo $currentWeekStart = $domingoActual->format('Y-m-d'); $asignacionActual = $asignacionModel->getAsignacionPorSemana($currentWeekStart); // Calcular posición en el ciclo (semana X de 4) function calcularPosicionCiclo($semanaInicio) { // Empezamos desde el inicio del ciclo: 28 Dic 2025 $fechaInicioCiclo = new DateTime('2025-12-28'); $semanaActual = new DateTime($semanaInicio); $diasDiferencia = $fechaInicioCiclo->diff($semanaActual)->days; $semanasDesdeInicio = floor($diasDiferencia / 7); // Posición en ciclo de 4 semanas (1-4) $posicion = ($semanasDesdeInicio % 4) + 1; return $posicion; } $posicionCicloActual = calcularPosicionCiclo($currentWeekStart); // Generar semanas agrupadas por mes $mesesEspanol = [ 'January' => 'Enero', 'February' => 'Febrero', 'March' => 'Marzo', 'April' => 'Abril', 'May' => 'Mayo', 'June' => 'Junio', 'July' => 'Julio', 'August' => 'Agosto', 'September' => 'Septiembre', 'October' => 'Octubre', 'November' => 'Noviembre', 'December' => 'Diciembre' ]; $semanasAgrupadas = []; for ($i = -4; $i <= 12; $i++) { $semanaDomingo = clone $domingoActual; $semanaDomingo->modify("+{$i} weeks"); $key = $semanaDomingo->format('Y-m'); $mesIngles = $semanaDomingo->format('F'); $mesEspanol = $mesesEspanol[$mesIngles] ?? $mesIngles; $anio = $semanaDomingo->format('Y'); if (!isset($semanasAgrupadas[$key])) { $semanasAgrupadas[$key] = [ 'nombre' => "$mesEspanol $anio", 'semanas' => [] ]; } $semanasAgrupadas[$key]['semanas'][] = [ 'fecha' => $semanaDomingo->format('Y-m-d'), 'posicion' => calcularPosicionCiclo($semanaDomingo->format('Y-m-d')) ]; } $currentPage = 'asignaciones'; $pageTitle = 'Asignación de Turnos'; ?> Asignaciones - Contenedor Ibiza

Asignación de Turnos

Asignación Actual (Semana de 4)

Fecha: (Dom) - (Vie)

Asignado a:
No hay asignación para esta semana
Historial de Asignaciones
getAsignacionPorSemana($semanaVer); ?>
Semana de 4 ():
No hay asignación para la semana de 4 ()
Asignación Masiva
Debe ser un domingo
Nombre Email Username
Rotación Automática
Orden de Rotación Actual:
getAyudantesPorOrden(); foreach ($ayudantesOrdenados as $index => $ayudante): ?> .
asignarSemanasFuturasAutomaticas(12); ?>
Resultado: Se asignaron semanas futuras
Errores:
Asigna automáticamente los próximos 12 semanas siguiendo el orden de rotación
ℹ️ ¿Cómo funciona?
• El sistema mantiene un orden cíclico de ayudantes
• Cada semana (Dom→Vie) asigna automáticamente al siguiente en la lista
• Al agregar nuevos ayudantes, se integran automáticamente en el ciclo
• Usa el botón para generar las próximas 12 semanas
Reordenar Rotación

Arrastra los elementos para cambiar el orden de rotación. Los cambios afectarán las asignaciones futuras.

    getAyudantesPorOrden(); foreach ($ayudantesOrdenados as $index => $ayudante): ?>
$userId) { $stmt = $db->prepare(" UPDATE rotacion_orden SET orden = ? WHERE user_id = ? AND activo = 1 "); $stmt->execute([$index + 1, $userId]); } // Recalcular asignaciones futuras $resultado = $asignacionModel->recalcularAsignaciones(20); if ($resultado['success'] > 0) { echo '
'; echo 'Orden actualizado correctamente. '; echo "Se recalcularon {$resultado['success']} semanas futuras."; echo '
'; } } ?>