diff --git a/public/admin/asignaciones.php b/public/admin/asignaciones.php
old mode 100755
new mode 100644
index 97d4b60..aef4bd6
--- a/public/admin/asignaciones.php
+++ b/public/admin/asignaciones.php
@@ -24,6 +24,11 @@ if (isset($_GET['success']) && $_GET['success'] === 'orden_actualizado') {
$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';
@@ -31,527 +36,246 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
} else {
$action = $_POST['action'] ?? '';
- if ($action === 'asignar') {
+ if ($action === 'asignar_actual') {
$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';
- }
+ // 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 === 'rotacion_automatica') {
+ } elseif ($action === 'rotar_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';
- }
+ header("Location: " . $_SERVER['PHP_SELF'] . "?success=automatica");
+ exit;
} else {
- $message = 'No se pudieron generar asignaciones: ' . implode(', ', $resultado['errors']);
- $messageType = 'danger';
- }
- } 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';
+ $message = 'No se pudieron generar turnos: ' . implode(', ', $resultado['errors']);
$messageType = 'danger';
}
}
}
}
-$ayudantes = $userModel->getAyudantesActivos();
-$horarios = $horariosModel->getActivos();
-
-// Encontrar el domingo actual
+// Obtener datos principales
$hoy = new DateTime();
-$diaSemana = (int)$hoy->format('w'); // 0 = domingo, 6 = sábado
+$diaSemana = (int)$hoy->format('w');
$domingoActual = clone $hoy;
-$domingoActual->modify('-' . $diaSemana . ' days'); // Restar días para llegar al domingo
-
+$domingoActual->modify('-' . $diaSemana . ' days');
$currentWeekStart = $domingoActual->format('Y-m-d');
+
$asignacionActual = $asignacionModel->getAsignacionPorSemana($currentWeekStart);
+$ayudantes = $userModel->getAyudantesActivos();
-// 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++) {
+// 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);
- $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'))
+ $proximosTurnos[] = [
+ 'semana' => $semanaInicio,
+ 'fin' => date('Y-m-d', strtotime('+5 days', strtotime($semanaInicio))),
+ 'asignacion' => $asignacion
];
}
$currentPage = 'asignaciones';
-$pageTitle = 'Asignación de Turnos';
+$pageTitle = 'Gestión de Turnos';
?>
- Fecha: = date('d/m/y', strtotime($currentWeekStart)) ?> (Dom) - = date('d/m/y', strtotime('+5 days', strtotime($currentWeekStart))) ?> (Vie) -
- - -+ 📆 Semana: + = date('d/m/Y', strtotime($currentWeekStart)) ?> + al = date('d/m/Y', strtotime('+5 days', strtotime($currentWeekStart))) ?> +
+ + +Crea automáticamente las próximas 12 semanas siguiendo el orden actual
+| - - | -Nombre | -Username | -|
|---|---|---|---|
| - - | -= htmlspecialchars($a['nombre']) ?> | -= htmlspecialchars($a['email']) ?> | -= htmlspecialchars($a['username']) ?> | -
- Arrastra los elementos para cambiar el orden de rotación. - Los cambios afectarán las asignaciones futuras. -
- -