Corrección gestión de notificaciones

This commit is contained in:
2025-05-29 09:01:50 -06:00
parent 79c75ef011
commit e08a813802
3 changed files with 577 additions and 214 deletions

View File

@@ -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
];
}
}
// 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));
}
}
?>