diff --git a/app/controllers/preferencias.php b/app/controllers/preferencias.php index cc1dbde..fb75d90 100644 --- a/app/controllers/preferencias.php +++ b/app/controllers/preferencias.php @@ -37,7 +37,7 @@ function notificaciones() $preferenciasRow = false; } - // Si no existe registro, crear valores por defecto (incluyendo horario) + // Si no existe registro, crear valores por defecto if (!$preferenciasRow) { $preferencias = [ 'nuevas_solicitudes' => 0, @@ -49,14 +49,14 @@ function notificaciones() 'nuevos_archivos' => 0, 'intentos_fallidos' => 0, 'bloqueo_cuenta' => 0, - 'resumen_diario_hora' => '08:00:00', + 'resumen_diario_hora' => '08:00', 'resumen_diario_dias' => 'L-V' ]; } else { $preferencias = $preferenciasRow; - // Agregar campos de horario si no existen en el registro - $preferencias['resumen_diario_hora'] = $preferenciasRow['resumen_diario_hora'] ?? '08:00:00'; - $preferencias['resumen_diario_dias'] = $preferenciasRow['resumen_diario_dias'] ?? 'L-V'; + // Asegurar valores por defecto para campos de resumen si no existen + $preferencias['resumen_diario_hora'] = $preferencias['resumen_diario_hora'] ?? '08:00'; + $preferencias['resumen_diario_dias'] = $preferencias['resumen_diario_dias'] ?? 'L-V'; } // Obtener tipos de notificaciones disponibles @@ -152,6 +152,11 @@ function guardarPreferenciasAjax() sqlsrv_free_stmt($stmt_delete); } } + + $response_data = [ + 'notificaciones' => $notificaciones, + 'notificaciones_extra' => $notificaciones_extra + ]; break; case 'notificaciones_extra': @@ -180,6 +185,10 @@ function guardarPreferenciasAjax() throw new Exception("Error al actualizar configuración de correo extra"); } sqlsrv_free_stmt($stmt); + + $response_data = [ + 'notificaciones_extra' => $notificaciones_extra + ]; break; case 'tipo_notificacion': @@ -190,6 +199,17 @@ function guardarPreferenciasAjax() throw new Exception("Tipo de notificación no especificado"); } + // Validar que el tipo de notificación es válido + $tipos_validos = [ + 'nuevas_solicitudes', 'registro_solicitud', 'cambio_estado', + 'resumen_diario', 'alertas_tiempo', 'documentos_expediente', + 'nuevos_archivos', 'intentos_fallidos', 'bloqueo_cuenta' + ]; + + if (!in_array($tipo_nombre, $tipos_validos)) { + throw new Exception("Tipo de notificación no válido"); + } + // Verificar que las notificaciones generales estén activadas $query_check = "SELECT notificaciones FROM usuarios_sistema WHERE id_usuario = ?"; $stmt_check = sqlsrv_prepare($conn, $query_check, [$id_usuario]); @@ -216,7 +236,7 @@ function guardarPreferenciasAjax() if ($exists) { // Actualizar el campo específico - $query = "UPDATE preferencias_notificaciones_usuario SET $tipo_nombre = ? WHERE id_usuario = ?"; + $query = "UPDATE preferencias_notificaciones_usuario SET [$tipo_nombre] = ? WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$valor, $id_usuario]); } else { // Crear registro con valores por defecto y el campo específico @@ -229,13 +249,15 @@ function guardarPreferenciasAjax() 'documentos_expediente' => 0, 'nuevos_archivos' => 0, 'intentos_fallidos' => 0, - 'bloqueo_cuenta' => 0 + 'bloqueo_cuenta' => 0, + 'resumen_diario_hora' => '08:00', + 'resumen_diario_dias' => 'L-V' ]; // Establecer el valor específico $tipos_default[$tipo_nombre] = $valor; - $campos = implode(', ', array_keys($tipos_default)); + $campos = '[' . implode('], [', array_keys($tipos_default)) . ']'; $placeholders = rtrim(str_repeat('?, ', count($tipos_default)), ', '); $query = "INSERT INTO preferencias_notificaciones_usuario (id_usuario, $campos) VALUES (?, $placeholders)"; @@ -244,12 +266,16 @@ function guardarPreferenciasAjax() } if (!$stmt || !sqlsrv_execute($stmt)) { - throw new Exception("Error al actualizar preferencia específica"); + throw new Exception("Error al actualizar preferencia específica: " . print_r(sqlsrv_errors(), true)); } sqlsrv_free_stmt($stmt); + + $response_data = [ + $tipo_nombre => $valor + ]; break; - case 'resumen_diario_config': + case 'resumen_config': $hora = $input['hora'] ?? '08:00'; $dias = $input['dias'] ?? 'L-V'; @@ -259,23 +285,35 @@ function guardarPreferenciasAjax() } // Validar días - $dias_validos = ['L-V', 'TODOS', 'L-S']; - if (!in_array($dias, $dias_validos)) { - throw new Exception("Configuración de días inválida"); + $dias_validos = ['L-V', 'TODOS']; + $es_personalizado = !in_array($dias, $dias_validos); + + if ($es_personalizado) { + // Validar formato personalizado (ej: "L,M,X" o "L,V,S,D") + $dias_array = explode(',', $dias); + $dias_permitidos = ['L', 'M', 'X', 'J', 'V', 'S', 'D']; + + foreach ($dias_array as $dia) { + $dia = trim($dia); + if (!in_array($dia, $dias_permitidos)) { + throw new Exception("Días seleccionados inválidos"); + } + } } - // Verificar que las notificaciones generales estén activadas - $query_check = "SELECT notificaciones FROM usuarios_sistema WHERE id_usuario = ?"; + // Verificar que el resumen diario esté activado + $query_check = "SELECT resumen_diario FROM preferencias_notificaciones_usuario WHERE id_usuario = ?"; $stmt_check = sqlsrv_prepare($conn, $query_check, [$id_usuario]); + $resumen_activo = false; + if ($stmt_check && sqlsrv_execute($stmt_check)) { $row = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); + $resumen_activo = $row && $row['resumen_diario']; sqlsrv_free_stmt($stmt_check); - - if (!$row || !$row['notificaciones']) { - throw new Exception("Las notificaciones generales deben estar activadas primero"); - } - } else { - throw new Exception("Error al verificar configuración"); + } + + if (!$resumen_activo) { + throw new Exception("El resumen diario debe estar activado para configurar sus opciones"); } // Verificar si existe el registro @@ -289,10 +327,8 @@ function guardarPreferenciasAjax() } if ($exists) { - // Actualizar configuración de resumen diario - $query = "UPDATE preferencias_notificaciones_usuario - SET resumen_diario_hora = ?, resumen_diario_dias = ? - WHERE id_usuario = ?"; + // Actualizar configuración del resumen + $query = "UPDATE preferencias_notificaciones_usuario SET resumen_diario_hora = ?, resumen_diario_dias = ? WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$hora, $dias, $id_usuario]); } else { // Crear registro con valores por defecto @@ -300,7 +336,7 @@ function guardarPreferenciasAjax() 'nuevas_solicitudes' => 0, 'registro_solicitud' => 0, 'cambio_estado' => 0, - 'resumen_diario' => 0, + 'resumen_diario' => 1, // Activado porque llegamos aquí desde su configuración 'alertas_tiempo' => 0, 'documentos_expediente' => 0, 'nuevos_archivos' => 0, @@ -310,7 +346,7 @@ function guardarPreferenciasAjax() 'resumen_diario_dias' => $dias ]; - $campos = implode(', ', array_keys($tipos_default)); + $campos = '[' . implode('], [', array_keys($tipos_default)) . ']'; $placeholders = rtrim(str_repeat('?, ', count($tipos_default)), ', '); $query = "INSERT INTO preferencias_notificaciones_usuario (id_usuario, $campos) VALUES (?, $placeholders)"; @@ -319,9 +355,14 @@ function guardarPreferenciasAjax() } if (!$stmt || !sqlsrv_execute($stmt)) { - throw new Exception("Error al actualizar configuración de resumen diario"); + throw new Exception("Error al actualizar configuración del resumen: " . print_r(sqlsrv_errors(), true)); } sqlsrv_free_stmt($stmt); + + $response_data = [ + 'resumen_hora' => $hora, + 'resumen_dias' => $dias + ]; break; default: @@ -334,7 +375,8 @@ function guardarPreferenciasAjax() echo json_encode([ 'success' => true, 'message' => 'Preferencias guardadas automáticamente', - 'tipo' => $tipo_cambio + 'tipo' => $tipo_cambio, + 'data' => $response_data ?? [] ]); } catch (Exception $e) { @@ -419,4 +461,71 @@ function obtenerPreferenciasNotificacion($id_usuario) 'preferencias' => $preferencias, 'correo_extra' => $correo_extra ]; -} \ No newline at end of file +} + +// Función auxiliar para verificar si un usuario debe recibir un tipo específico de notificación +function debeRecibirNotificacion($id_usuario, $tipo_notificacion) +{ + $preferencias = obtenerPreferenciasNotificacion($id_usuario); + + if (!$preferencias || !$preferencias['config_general']['notificaciones']) { + return false; + } + + // Si no hay preferencias específicas, usar valores por defecto (false) + if (!$preferencias['preferencias']) { + return false; + } + + return isset($preferencias['preferencias'][$tipo_notificacion]) && + $preferencias['preferencias'][$tipo_notificacion]; +} + +// Función auxiliar para obtener la configuración del resumen diario de un usuario +function obtenerConfigResumenDiario($id_usuario) +{ + $conn = getConnection(); + + $query = " + SELECT pnu.resumen_diario, pnu.resumen_diario_hora, pnu.resumen_diario_dias + FROM preferencias_notificaciones_usuario pnu + INNER JOIN usuarios_sistema us ON pnu.id_usuario = us.id_usuario + WHERE pnu.id_usuario = ? AND us.notificaciones = 1 AND pnu.resumen_diario = 1 + "; + + $stmt = sqlsrv_prepare($conn, $query, [$id_usuario]); + $config = null; + + if ($stmt && sqlsrv_execute($stmt)) { + $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); + if ($row) { + $config = [ + 'hora' => $row['resumen_diario_hora'] ?? '08:00', + 'dias' => $row['resumen_diario_dias'] ?? 'L-V' + ]; + } + sqlsrv_free_stmt($stmt); + } + + sqlsrv_close($conn); + return $config; +} + +// Función auxiliar para verificar si hoy es día de envío de resumen según la configuración del usuario +function esDiaResumen($config_dias) +{ + $hoy = date('N'); // 1=Lunes, 7=Domingo + $dia_letra = ['', 'L', 'M', 'X', 'J', 'V', 'S', 'D'][$hoy]; + + switch ($config_dias) { + case 'L-V': + return in_array($hoy, [1, 2, 3, 4, 5]); // Lunes a Viernes + case 'TODOS': + return true; + default: + // Configuración personalizada + $dias_activos = explode(',', $config_dias); + return in_array($dia_letra, array_map('trim', $dias_activos)); + } +} +?> \ No newline at end of file diff --git a/views/partials/sidebar_configuracion.php b/views/partials/sidebar_configuracion.php index 08bbe1a..0e4becf 100644 --- a/views/partials/sidebar_configuracion.php +++ b/views/partials/sidebar_configuracion.php @@ -64,7 +64,7 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador // Detecta si estamos en alguna parta de seguridad $esVistaSeguridad = str_contains($_SERVER['REQUEST_URI'], '/seguridad'); // Detecta si estamos en alguna parte de preferencias - $esVistaPreferencias = str_contains($_SERVER['REQUEST_URI'], '/preferencias') + $esVistaPreferencias = str_contains($_SERVER['REQUEST_URI'], '/preferencias'); ?> diff --git a/views/preferencias/notificaciones.php b/views/preferencias/notificaciones.php index 060a199..3644531 100644 --- a/views/preferencias/notificaciones.php +++ b/views/preferencias/notificaciones.php @@ -9,6 +9,7 @@ include __DIR__ . '/../partials/sidebar_configuracion.php'; + @@ -187,62 +192,227 @@ include __DIR__ . '/../partials/sidebar_configuracion.php'; -