$usuario['notificaciones'] ?? 0, 'notificaciones_extra' => $usuario['notificaciones_extra'] ?? 0 ]; $tipoUsuario = $usuario['tipo_usuario'] ?? 'importador'; sqlsrv_free_stmt($stmt); switch ($tipoUsuario) { case 'importador': // Obtener preferencias específicas de notificaciones $query = "SELECT * FROM preferencias_notificaciones_usuario WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); if ($stmt && sqlsrv_execute($stmt)) { $preferenciasRow = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); sqlsrv_free_stmt($stmt); } else { $preferenciasRow = false; } // Después de obtener $preferenciasRow, antes de crear el array $preferencias if ($preferenciasRow && isset($preferenciasRow['resumen_diario_hora'])) { // Formatear la hora para el input HTML $hora_obj = $preferenciasRow['resumen_diario_hora']; if ($hora_obj instanceof DateTime) { $preferenciasRow['resumen_diario_hora'] = $hora_obj->format('H:i'); } elseif (is_string($hora_obj)) { // Si viene como string "08:00:00.0000000", extraer solo HH:MM $preferenciasRow['resumen_diario_hora'] = substr($hora_obj, 0, 5); } } // Si no existe registro, crear valores por defecto if (!$preferenciasRow) { $preferencias = [ 'nuevas_solicitudes' => 0, 'registro_solicitud' => 0, 'cambio_estado' => 0, 'resumen_diario' => 0, 'alertas_tiempo' => 0, 'documentos_expediente' => 0, 'nuevos_archivos' => 0, 'intentos_fallidos' => 0, 'bloqueo_cuenta' => 0, 'resumen_diario_hora' => '08:00', 'resumen_diario_dias' => 'L-V' ]; } else { $preferencias = $preferenciasRow; // 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 $query = "SELECT nombre, descripcion FROM tipos_notificaciones ORDER BY nombre"; $stmt = sqlsrv_query($conn, $query); if (!$stmt) { die("Error al obtener tipos: " . print_r(sqlsrv_errors(), true)); } // Crear array asociativo para la vista $tipos = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $tipos[$row['nombre']] = $row['descripcion']; } sqlsrv_free_stmt($stmt); // Obtener correo extra si existe $query = "SELECT correo FROM correo_extra WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); $correoExtra = ''; if ($stmt && sqlsrv_execute($stmt)) { $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); $correoExtra = $row ? $row['correo'] : ''; sqlsrv_free_stmt($stmt); } break; // case 'agente_agencia': // Obtener preferencias específicas de notificaciones para agente // $query = "SELECT * FROM preferencias_notificaciones_agente WHERE id_usuario = ?"; // $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); // if ($stmt && sqlsrv_execute($stmt)) { // $preferenciasRow = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); // sqlsrv_free_stmt($stmt); // } else { // $preferenciasRow = false; // } // Formatear hora si existe // if ($preferenciasRow && isset($preferenciasRow['resumen_diario_hora'])) { // $hora_obj = $preferenciasRow['resumen_diario_hora']; // if ($hora_obj instanceof DateTime) { // $preferenciasRow['resumen_diario_hora'] = $hora_obj->format('H:i'); // } elseif (is_string($hora_obj)) { // $preferenciasRow['resumen_diario_hora'] = substr($hora_obj, 0, 5); // } // } // Si no existe registro, crear valores por defecto para agente // if (!$preferenciasRow) { // $preferencias = [ // 'nuevas_solicitudes' => 0, // 'solicitudes_asignadas' => 0, // 'cambio_estado' => 0, // 'documentos_recibidos' => 0, // 'documentos_rechazados' => 0, // 'alertas_vencimiento' => 0, // 'notificaciones_sistema' => 0, // 'resumen_diario' => 0, // 'alertas_tiempo' => 0, // 'resumen_diario_hora' => '08:00', // 'resumen_diario_dias' => 'L-V' // ]; // } else { // $preferencias = $preferenciasRow; // $preferencias['resumen_diario_hora'] = $preferencias['resumen_diario_hora'] ?? '08:00'; // $preferencias['resumen_diario_dias'] = $preferencias['resumen_diario_dias'] ?? 'L-V'; // } // Obtener tipos de notificaciones específicas para agentes // $query = "SELECT nombre, descripcion FROM tipos_notificaciones WHERE tipo_usuario = 'agente_aduanal' OR tipo_usuario IS NULL ORDER BY nombre"; // $stmt = sqlsrv_query($conn, $query); // if (!$stmt) { // die("Error al obtener tipos: " . print_r(sqlsrv_errors(), true)); // } // $tipos = []; // while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { // $tipos[$row['nombre']] = $row['descripcion']; // } // sqlsrv_free_stmt($stmt); // Obtener correo extra si existe // $query = "SELECT correo FROM correo_extra WHERE id_usuario = ?"; // $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); // $correoExtra = ''; // if ($stmt && sqlsrv_execute($stmt)) { // $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); // $correoExtra = $row ? $row['correo'] : ''; // sqlsrv_free_stmt($stmt); // } // break; // case 'admin_agencia': // Obtener preferencias específicas de notificaciones para admin de agencia // $query = "SELECT * FROM preferencias_notificaciones_agencia WHERE id_usuario = ?"; // $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); // if ($stmt && sqlsrv_execute($stmt)) { // $preferenciasRow = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); // sqlsrv_free_stmt($stmt); // } else { // $preferenciasRow = false; // } // Formatear hora si existe // if ($preferenciasRow && isset($preferenciasRow['resumen_diario_hora'])) { // $hora_obj = $preferenciasRow['resumen_diario_hora']; // if ($hora_obj instanceof DateTime) { // $preferenciasRow['resumen_diario_hora'] = $hora_obj->format('H:i'); // } elseif (is_string($hora_obj)) { // $preferenciasRow['resumen_diario_hora'] = substr($hora_obj, 0, 5); // } // } // Si no existe registro, crear valores por defecto para admin de agencia // if (!$preferenciasRow) { // $preferencias = [ // 'nuevas_solicitudes' => 0, // 'solicitudes_completadas' => 0, // 'reportes_agentes' => 0, // 'alertas_rendimiento' => 0, // 'documentos_pendientes' => 0, // 'notificaciones_sistema' => 0, // 'alertas_vencimiento' => 0, // 'resumen_semanal' => 0, // 'resumen_mensual' => 0, // 'resumen_diario' => 0, // 'resumen_diario_hora' => '08:00', // 'resumen_diario_dias' => 'L-V' // ]; // } else { // $preferencias = $preferenciasRow; // $preferencias['resumen_diario_hora'] = $preferencias['resumen_diario_hora'] ?? '08:00'; // $preferencias['resumen_diario_dias'] = $preferencias['resumen_diario_dias'] ?? 'L-V'; // } // Obtener tipos de notificaciones específicas para admin de agencia // $query = "SELECT nombre, descripcion FROM tipos_notificaciones WHERE tipo_usuario = 'admin_agencia' OR tipo_usuario IS NULL ORDER BY nombre"; // $stmt= sqlsrv_query($conn, $query); // if (!$stmt) { // die("Error al obtener tipos: " . print_r(sqlsrv_errors(), true)); // } // $tipos = []; // while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { // $tipos[$row['nombre']] = $row['descripcion']; // } // sqlsrv_free_stmt($stmt); // Obtener correo extra si existe // $query = "SELECT correo FROM correo_extra WHERE id_usuario = ?"; // $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); // $correoExtra = ''; // if ($stmt && sqlsrv_execute($stmt)) { // $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); // $correoExtra = $row ? $row['correo'] : ''; // sqlsrv_free_stmt($stmt); // } // break; // case 'super_admin': // Obtener preferencias específicas de notificaciones para super admin // $query = "SELECT * FROM preferencias_notificaciones_admin WHERE id_usuario = ?"; // $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); // if ($stmt && sqlsrv_execute($stmt)) { // $preferenciasRow = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); // sqlsrv_free_stmt($stmt); // } else { // $preferenciasRow = false; // } // Formatear hora si existe // if ($preferenciasRow && isset($preferenciasRow['resumen_diario_hora'])) { // $hora_obj = $preferenciasRow['resumen_diario_hora']; // if ($hora_obj instanceof DateTime) { // $preferenciasRow['resumen_diario_hora'] = $hora_obj->format('H:i'); // } elseif (is_string($hora_obj)) { // $preferenciasRow['resumen_diario_hora'] = substr($hora_obj, 0, 5); // } // } // Si no existe registro, crear valores por defecto para super admin // if (!$preferenciasRow) { // $preferencias = [ // 'alertas_sistema' => 0, // 'reportes_globales' => 0, // 'nuevos_usuarios' => 0, // 'alertas_seguridad' => 0, // 'errores_sistema' => 0, // 'notificaciones_criticas' => 0, // 'estadisticas_uso' => 0, // 'mantenimiento_sistema' => 0, // 'resumen_diario' => 0, // 'resumen_semanal' => 0, // 'resumen_mensual' => 0, // 'resumen_diario_hora' => '08:00', // 'resumen_diario_dias' => 'L-V' // ]; // } else { // $preferencias = $preferenciasRow; // $preferencias['resumen_diario_hora'] = $preferencias['resumen_diario_hora'] ?? '08:00'; // $preferencias['resumen_diario_dias'] = $preferencias['resumen_diario_dias'] ?? 'L-V'; // } // Obtener tipos de notificaciones específicas para super admin // $query = "SELECT nombre, descripcion FROM tipos_notificaciones WHERE tipo_usuario = 'super_admin' OR tipo_usuario IS NULL ORDER BY nombre"; // $stmt = sqlsrv_query($conn, $query); // if (!$stmt) { // die("Error al obtener tipos: " . print_r(sqlsrv_errors(), true)); // } // $tipos = []; // while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { // $tipos[$row['nombre']] = $row['descripcion']; // } // sqlsrv_free_stmt($stmt); // Obtener correo extra si existe // $query = "SELECT correo FROM correo_extra WHERE id_usuario = ?"; // $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); // $correoExtra = ''; // if ($stmt && sqlsrv_execute($stmt)) { // $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); // $correoExtra = $row ? $row['correo'] : ''; // sqlsrv_free_stmt($stmt); // } // break; default: // Tipo de usuario no reconocido, usar configuración básica $preferencias = [ 'notificaciones_generales' => 0, 'resumen_diario' => 0, 'resumen_diario_hora' => '08:00', 'resumen_diario_dias' => 'L-V' ]; $tipos = []; $correoExtra = ''; break; } sqlsrv_close($conn); include __DIR__ . '/../../views/preferencias/notificaciones.php'; } function guardarPreferenciasAjax() { // Verificar que sea una petición AJAX if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Petición inválida']); exit; } // Verificar método POST if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); echo json_encode(['success' => false, 'message' => 'Método no permitido']); exit; } $conn = getConnection(); // Verificar autenticación if (!isset($_SESSION['usuario_id']) || ($_SESSION['pendiente_confirmacion'] ?? false)) { http_response_code(401); echo json_encode(['success' => false, 'message' => 'Usuario no autenticado']); exit; } $id_usuario = $_SESSION['usuario_id']; try { // Obtener tipo de usuario $query = "SELECT tipo_usuario FROM usuarios_sistema WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$id_usuario]); if (!$stmt || !sqlsrv_execute($stmt)) { throw new Exception("Error al obtener tipo de usuario"); } $usuario = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); if (!$usuario) { throw new Exception("Usuario no encontrado"); } $tipo_usuario = $usuario['tipo_usuario']; sqlsrv_free_stmt($stmt); // Leer datos JSON del cuerpo de la petición $input = json_decode(file_get_contents('php://input'), true); if (!$input) { throw new Exception("Datos inválidos"); } // Iniciar transacción sqlsrv_begin_transaction($conn); // Determinar qué tipo de cambio se está realizando $tipo_cambio = $input['tipo'] ?? 'general'; switch ($tipo_cambio) { case 'notificaciones_general': $notificaciones = $input['valor'] ? 1 : 0; // Si se desactivan las notificaciones, también desactivar notificaciones extra $notificaciones_extra = $notificaciones ? ($input['notificaciones_extra'] ?? 0) : 0; $query = "UPDATE usuarios_sistema SET notificaciones = ?, notificaciones_extra = ? WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$notificaciones, $notificaciones_extra, $id_usuario]); if (!$stmt || !sqlsrv_execute($stmt)) { throw new Exception("Error al actualizar configuración general"); } sqlsrv_free_stmt($stmt); // Si se desactivan las notificaciones, limpiar preferencias específicas según tipo de usuario if (!$notificaciones) { $tabla_preferencias = getTablaPreferencias($tipo_usuario); if ($tabla_preferencias) { $query_delete = "DELETE FROM $tabla_preferencias WHERE id_usuario = ?"; $stmt_delete = sqlsrv_prepare($conn, $query_delete, [$id_usuario]); if ($stmt_delete) { sqlsrv_execute($stmt_delete); sqlsrv_free_stmt($stmt_delete); } } } $response_data = [ 'notificaciones' => $notificaciones, 'notificaciones_extra' => $notificaciones_extra ]; break; case 'notificaciones_extra': $notificaciones_extra = $input['valor'] ? 1 : 0; // Validar que existe correo extra si se quiere activar if ($notificaciones_extra) { $query_check = "SELECT correo FROM correo_extra WHERE id_usuario = ?"; $stmt_check = sqlsrv_prepare($conn, $query_check, [$id_usuario]); if ($stmt_check && sqlsrv_execute($stmt_check)) { $row = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); sqlsrv_free_stmt($stmt_check); if (!$row || empty($row['correo'])) { throw new Exception("No tienes un correo adicional registrado. Ve a Seguridad para registrar uno primero."); } } else { throw new Exception("No tienes un correo adicional registrado. Ve a Seguridad para registrar uno primero."); } } $query = "UPDATE usuarios_sistema SET notificaciones_extra = ? WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$notificaciones_extra, $id_usuario]); if (!$stmt || !sqlsrv_execute($stmt)) { 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': $tipo_nombre = $input['nombre'] ?? ''; $valor = $input['valor'] ? 1 : 0; if (empty($tipo_nombre)) { throw new Exception("Tipo de notificación no especificado"); } // Obtener configuración específica según tipo de usuario $config = getConfiguracionTipoUsuario($tipo_usuario); $tabla_preferencias = $config['tabla']; $tipos_validos = $config['tipos_validos']; // Validar que el tipo de notificación es válido para este tipo de usuario if (!in_array($tipo_nombre, $tipos_validos)) { throw new Exception("Tipo de notificación no válido para este tipo de usuario"); } // 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]); if ($stmt_check && sqlsrv_execute($stmt_check)) { $row = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); 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"); } // Verificar si existe el registro $query_exists = "SELECT COUNT(*) as count FROM $tabla_preferencias WHERE id_usuario = ?"; $stmt_exists = sqlsrv_prepare($conn, $query_exists, [$id_usuario]); $exists = false; if ($stmt_exists && sqlsrv_execute($stmt_exists)) { $row = sqlsrv_fetch_array($stmt_exists, SQLSRV_FETCH_ASSOC); $exists = $row['count'] > 0; sqlsrv_free_stmt($stmt_exists); } if ($exists) { // Actualizar el campo específico $query = "UPDATE $tabla_preferencias SET [$tipo_nombre] = ? WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$valor, $id_usuario]); } else { // Crear registro con valores por defecto específicos del tipo de usuario $tipos_default = $config['valores_default']; // Establecer el valor específico $tipos_default[$tipo_nombre] = $valor; $campos = '[' . implode('], [', array_keys($tipos_default)) . ']'; $placeholders = rtrim(str_repeat('?, ', count($tipos_default)), ', '); $query = "INSERT INTO $tabla_preferencias (id_usuario, $campos) VALUES (?, $placeholders)"; $params = array_merge([$id_usuario], array_values($tipos_default)); $stmt = sqlsrv_prepare($conn, $query, $params); } if (!$stmt || !sqlsrv_execute($stmt)) { 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_config': $hora = $input['hora'] ?? '08:00'; $dias = $input['dias'] ?? 'L-V'; // Validar formato de hora if (!preg_match('/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/', $hora)) { throw new Exception("Formato de hora inválido"); } // Validar días $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"); } } } // Obtener tabla de preferencias según tipo de usuario $tabla_preferencias = getTablaPreferencias($tipo_usuario); if (!$tabla_preferencias) { throw new Exception("Tipo de usuario no válido para configuración de resumen"); } // Verificar que el resumen diario esté activado $query_check = "SELECT resumen_diario FROM $tabla_preferencias 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 (!$resumen_activo) { throw new Exception("El resumen diario debe estar activado para configurar sus opciones"); } // Verificar si existe el registro $query_exists = "SELECT COUNT(*) as count FROM $tabla_preferencias WHERE id_usuario = ?"; $stmt_exists = sqlsrv_prepare($conn, $query_exists, [$id_usuario]); $exists = false; if ($stmt_exists && sqlsrv_execute($stmt_exists)) { $row = sqlsrv_fetch_array($stmt_exists, SQLSRV_FETCH_ASSOC); $exists = $row['count'] > 0; sqlsrv_free_stmt($stmt_exists); } if ($exists) { // Actualizar configuración del resumen $query = "UPDATE $tabla_preferencias 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 específicos del tipo de usuario $config = getConfiguracionTipoUsuario($tipo_usuario); $tipos_default = $config['valores_default']; // Activar resumen diario y configurar hora/días $tipos_default['resumen_diario'] = 1; $tipos_default['resumen_diario_hora'] = $hora; $tipos_default['resumen_diario_dias'] = $dias; $campos = '[' . implode('], [', array_keys($tipos_default)) . ']'; $placeholders = rtrim(str_repeat('?, ', count($tipos_default)), ', '); $query = "INSERT INTO $tabla_preferencias (id_usuario, $campos) VALUES (?, $placeholders)"; $params = array_merge([$id_usuario], array_values($tipos_default)); $stmt = sqlsrv_prepare($conn, $query, $params); } if (!$stmt || !sqlsrv_execute($stmt)) { throw new Exception("Error al actualizar configuración del resumen: " . print_r(sqlsrv_errors(), true)); } sqlsrv_free_stmt($stmt); $response_data = [ 'resumen_diario_hora' => $hora, 'resumen_diario_dias' => $dias ]; break; default: throw new Exception("Tipo de cambio no válido"); } sqlsrv_commit($conn); sqlsrv_close($conn); echo json_encode([ 'success' => true, 'message' => 'Preferencias guardadas automáticamente', 'tipo' => $tipo_cambio, 'data' => $response_data ?? [] ]); } catch (Exception $e) { sqlsrv_rollback($conn); sqlsrv_close($conn); http_response_code(400); echo json_encode([ 'success' => false, 'message' => $e->getMessage(), 'tipo' => $tipo_cambio ?? 'unknown' ]); } exit; } // Función auxiliar para obtener la tabla de preferencias según tipo de usuario function getTablaPreferencias($tipo_usuario) { switch ($tipo_usuario) { case 'importador': return 'preferencias_notificaciones_usuario'; case 'agente_aduanal': return 'preferencias_notificaciones_agente'; case 'admin_agencia': return 'preferencias_notificaciones_agencia'; case 'super_admin': return 'preferencias_notificaciones_admin'; default: return null; } } // Función auxiliar para obtener configuración específica por tipo de usuario function getConfiguracionTipoUsuario($tipo_usuario) { switch ($tipo_usuario) { case 'importador': return [ 'tabla' => 'preferencias_notificaciones_usuario', 'tipos_validos' => [ 'nuevas_solicitudes', 'registro_solicitud', 'cambio_estado', 'resumen_diario', 'alertas_tiempo', 'documentos_expediente', 'nuevos_archivos', 'intentos_fallidos', 'bloqueo_cuenta' ], 'valores_default' => [ 'nuevas_solicitudes' => 0, 'registro_solicitud' => 0, 'cambio_estado' => 0, 'resumen_diario' => 0, 'alertas_tiempo' => 0, 'documentos_expediente' => 0, 'nuevos_archivos' => 0, 'intentos_fallidos' => 0, 'bloqueo_cuenta' => 0, 'resumen_diario_hora' => '08:00', 'resumen_diario_dias' => 'L-V' ] ]; case 'agente_aduanal': return [ 'tabla' => 'preferencias_notificaciones_agente', 'tipos_validos' => [ 'nuevas_solicitudes', 'solicitudes_asignadas', 'cambio_estado', 'documentos_recibidos', 'documentos_rechazados', 'alertas_vencimiento', 'notificaciones_sistema', 'resumen_diario', 'alertas_tiempo' ], 'valores_default' => [ 'nuevas_solicitudes' => 0, 'solicitudes_asignadas' => 0, 'cambio_estado' => 0, 'documentos_recibidos' => 0, 'documentos_rechazados' => 0, 'alertas_vencimiento' => 0, 'notificaciones_sistema' => 0, 'resumen_diario' => 0, 'alertas_tiempo' => 0, 'resumen_diario_hora' => '08:00', 'resumen_diario_dias' => 'L-V' ] ]; case 'admin_agencia': return [ 'tabla' => 'preferencias_notificaciones_agencia', 'tipos_validos' => [ 'nuevas_solicitudes', 'solicitudes_completadas', 'reportes_agentes', 'alertas_rendimiento', 'documentos_pendientes', 'notificaciones_sistema', 'alertas_vencimiento', 'resumen_semanal', 'resumen_mensual', 'resumen_diario' ], 'valores_default' => [ 'nuevas_solicitudes' => 0, 'solicitudes_completadas' => 0, 'reportes_agentes' => 0, 'alertas_rendimiento' => 0, 'documentos_pendientes' => 0, 'notificaciones_sistema' => 0, 'alertas_vencimiento' => 0, 'resumen_semanal' => 0, 'resumen_mensual' => 0, 'resumen_diario' => 0, 'resumen_diario_hora' => '08:00', 'resumen_diario_dias' => 'L-V' ] ]; case 'super_admin': return [ 'tabla' => 'preferencias_notificaciones_admin', 'tipos_validos' => [ 'alertas_sistema', 'reportes_globales', 'nuevos_usuarios', 'alertas_seguridad', 'errores_sistema', 'notificaciones_criticas', 'estadisticas_uso', 'mantenimiento_sistema', 'resumen_diario', 'resumen_semanal', 'resumen_mensual' ], 'valores_default' => [ 'alertas_sistema' => 0, 'reportes_globales' => 0, 'nuevos_usuarios' => 0, 'alertas_seguridad' => 0, 'errores_sistema' => 0, 'notificaciones_criticas' => 0, 'estadisticas_uso' => 0, 'mantenimiento_sistema' => 0, 'resumen_diario' => 0, 'resumen_semanal' => 0, 'resumen_mensual' => 0, 'resumen_diario_hora' => '08:00', 'resumen_diario_dias' => 'L-V' ] ]; default: return null; } } // Función auxiliar para obtener el correo extra de un usuario (útil para el sistema de notificaciones) function obtenerCorreoExtra($id_usuario) { $conn = getConnection(); $query = "SELECT ce.correo FROM correo_extra ce INNER JOIN usuarios_sistema us ON ce.id_usuario = us.id_usuario WHERE ce.id_usuario = ? AND us.notificaciones_extra = 1 "; $stmt = sqlsrv_prepare($conn, $query, [$id_usuario]); $correo = null; if ($stmt && sqlsrv_execute($stmt)) { $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); $correo = $row ? $row['correo'] : null; sqlsrv_free_stmt($stmt); } sqlsrv_close($conn); return $correo; } // Función auxiliar para obtener todas las preferencias de notificación de un usuario function obtenerPreferenciasNotificacion($id_usuario) { $conn = getConnection(); // Obtener configuración general $query = "SELECT notificaciones, notificaciones_extra FROM usuarios_sistema WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$id_usuario]); if (!$stmt || !sqlsrv_execute($stmt)) { sqlsrv_close($conn); return null; } $config = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); sqlsrv_free_stmt($stmt); if (!$config || !$config['notificaciones']) { sqlsrv_close($conn); return null; // Usuario no tiene notificaciones activadas } // Obtener preferencias específicas $query = "SELECT * FROM preferencias_notificaciones_usuario WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$id_usuario]); $preferencias = null; if ($stmt && sqlsrv_execute($stmt)) { $preferencias = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); sqlsrv_free_stmt($stmt); } // Obtener correo extra si está activado $correo_extra = null; if ($config['notificaciones_extra']) { $query = "SELECT correo FROM correo_extra WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$id_usuario]); if ($stmt && sqlsrv_execute($stmt)) { $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); $correo_extra = $row ? $row['correo'] : null; sqlsrv_free_stmt($stmt); } } sqlsrv_close($conn); return [ 'config_general' => $config, '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)); } } function catalogos() { $conn = getConnection(); $idUsuario = $_SESSION['usuario_id'] ?? null; if (!$idUsuario) { header("Location: /IMPORTADORES/login"); exit; } // Obtener configuración general de catalogos y tipo de usuario $query = "SELECT preferencias_catalogos, tipo_usuario FROM usuarios_sistema WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); if (!$stmt || !sqlsrv_execute($stmt)) { die("Error al obtener configuración: " . print_r(sqlsrv_errors(), true)); } $usuario = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); if (!$usuario) { die("Usuario no encontrado"); } $catalogos = $usuario['preferencias_catalogos'] ?? 0; $tipoUsuario = $usuario['tipo_usuario'] ?? 'importador'; sqlsrv_free_stmt($stmt); // Obtener preferencias específicas según el tipo de usuario switch ($tipoUsuario) { case 'importador': $query = "SELECT * FROM preferencias_catalogos_usuario WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); if ($stmt && sqlsrv_execute($stmt)) { $preferenciasRow = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); sqlsrv_free_stmt($stmt); } else { $preferenciasRow = false; } // Si no existe registro, crear valores por defecto para importador if (!$preferenciasRow) { $preferencias = [ 'locaciones' => 0, 'vinculacion' => 0, 'transportistas' => 0, 'transportes' => 0, 'choferes' => 0, 'proveedores' => 0, 'productos_frecuentes' => 0, 'solicitudes_importacion' => 0, 'expediente_electronico' => 0, 'configuracion' => 0, 'cerrar_sesion' => 0 ]; } else { $preferencias = $preferenciasRow; } break; // case 'agente_aduanal': // $query = "SELECT * FROM preferencias_catalogos_agente WHERE id_usuario = ?"; // $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); // if ($stmt && sqlsrv_execute($stmt)) { // $preferenciasRow = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); // sqlsrv_free_stmt($stmt); // } else { // $preferenciasRow = false; // } // Si no existe registro, crear valores por defecto para agente aduanal // if (!$preferenciasRow) { // $preferencias = [ // // Aquí se definirán los campos específicos para agente aduanal // // cuando se creen las tablas correspondientes // 'configuracion' => 0, // 'cerrar_sesion' => 0 // ]; // } else { // $preferencias = $preferenciasRow; // } // break; // case 'admin_agencia': // $query = "SELECT * FROM preferencias_catalogos_agencia WHERE id_usuario = ?"; // $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); // if ($stmt && sqlsrv_execute($stmt)) { // $preferenciasRow = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); // sqlsrv_free_stmt($stmt); // } else { // $preferenciasRow = false; // } // Si no existe registro, crear valores por defecto para admin agencia // if (!$preferenciasRow) { // $preferencias = [ // // Aquí se definirán los campos específicos para admin agencia // // cuando se creen las tablas correspondientes // 'configuracion' => 0, // 'cerrar_sesion' => 0 // ]; // } else { // $preferencias = $preferenciasRow; // } // break; // case 'super_admin': // $query = "SELECT * FROM preferencias_catalogos_admin WHERE id_usuario = ?"; // $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); // if ($stmt && sqlsrv_execute($stmt)) { // $preferenciasRow = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); // sqlsrv_free_stmt($stmt); // } else { // $preferenciasRow = false; // } // Si no existe registro, crear valores por defecto para super admin // if (!$preferenciasRow) { // $preferencias = [ // // Aquí se definirán los campos específicos para super admin // // cuando se creen las tablas correspondientes // 'configuracion' => 0, // 'cerrar_sesion' => 0 // ]; // } else { // $preferencias = $preferenciasRow; // } // break; default: // Tipo de usuario no reconocido, usar valores por defecto mínimos $preferencias = [ 'configuracion' => 0, 'cerrar_sesion' => 0 ]; break; } // Obtener tipos de catalogos disponibles según el tipo de usuario $query = "SELECT nombre, descripcion, color FROM tipos_catalogos WHERE tipo_usuario = ? ORDER BY id"; $stmt = sqlsrv_prepare($conn, $query, [$tipoUsuario]); if (!$stmt || !sqlsrv_execute($stmt)) { die("Error al obtener tipos: " . print_r(sqlsrv_errors(), true)); } // Crear array asociativo para la vista $tipos = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $tipos[$row['nombre']] = [ 'descripcion' => $row['descripcion'], 'color' => $row['color'] ]; } sqlsrv_free_stmt($stmt); sqlsrv_close($conn); include __DIR__ . '/../../views/preferencias/catalogos.php'; } function guardarCatalogosAjax() { // Verificar que sea una petición AJAX if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Petición no válida']); exit; } // Obtener datos JSON del cuerpo de la petición $input = json_decode(file_get_contents('php://input'), true); if (!$input || !isset($input['tipo'])) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Datos no válidos']); exit; } $conn = getConnection(); $idUsuario = $_SESSION['usuario_id'] ?? null; if (!$idUsuario) { http_response_code(401); echo json_encode(['success' => false, 'message' => 'Usuario no autenticado']); exit; } // Obtener tipo de usuario $query = "SELECT tipo_usuario FROM usuarios_sistema WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); if (!$stmt || !sqlsrv_execute($stmt)) { http_response_code(500); echo json_encode(['success' => false, 'message' => 'Error al obtener información del usuario']); exit; } $usuario = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); $tipoUsuario = $usuario['tipo_usuario'] ?? 'importador'; sqlsrv_free_stmt($stmt); try { $tipo = $input['tipo']; switch ($tipo) { case 'catalogos_general': // Actualizar preferencias generales de catálogos $valor = isset($input['valor']) && $input['valor'] ? 1 : 0; $query = "UPDATE usuarios_sistema SET preferencias_catalogos = ? WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$valor, $idUsuario]); if (!$stmt || !sqlsrv_execute($stmt)) { throw new Exception('Error al actualizar preferencias generales'); } sqlsrv_free_stmt($stmt); break; case 'tipo_catalogo': // Actualizar preferencia específica de catálogo if (!isset($input['nombre']) || !isset($input['valor'])) { throw new Exception('Datos incompletos para tipo de catálogo'); } $nombre = $input['nombre']; $valor = $input['valor'] ? 1 : 0; // Determinar la tabla según el tipo de usuario $tabla = ''; switch ($tipoUsuario) { case 'importador': $tabla = 'preferencias_catalogos_usuario'; break; case 'agente_aduanal': $tabla = 'preferencias_catalogos_agente'; break; case 'admin_agencia': $tabla = 'preferencias_catalogos_agencia'; break; case 'super_admin': $tabla = 'preferencias_catalogos_admin'; break; default: throw new Exception('Tipo de usuario no válido'); } // Verificar si existe un registro para este usuario $query = "SELECT id_preferencia FROM $tabla WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); if (!$stmt || !sqlsrv_execute($stmt)) { throw new Exception('Error al verificar preferencias existentes'); } $existe = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); sqlsrv_free_stmt($stmt); if ($existe) { // Actualizar registro existente $query = "UPDATE $tabla SET [$nombre] = ? WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$valor, $idUsuario]); } else { // Crear nuevo registro $query = "INSERT INTO $tabla (id_usuario, [$nombre]) VALUES (?, ?)"; $stmt = sqlsrv_prepare($conn, $query, [$idUsuario, $valor]); } if (!$stmt || !sqlsrv_execute($stmt)) { throw new Exception('Error al actualizar preferencia de catálogo'); } sqlsrv_free_stmt($stmt); break; default: throw new Exception('Tipo de operación no válido'); } // Confirmar transacción sqlsrv_commit($conn); // Respuesta exitosa echo json_encode([ 'success' => true, 'message' => 'Preferencias actualizadas correctamente' ]); } catch (Exception $e) { // Revertir transacción en caso de error sqlsrv_rollback($conn); http_response_code(500); echo json_encode([ 'success' => false, 'message' => $e->getMessage() ]); } finally { sqlsrv_close($conn); } }