Files
MVE/app/controllers/preferencias.php

836 lines
34 KiB
PHP

<?php
require_once __DIR__ . '/../helpers/session.php';
require_once __DIR__ . '/../../config/database.php';
require_once __DIR__ . '/../helpers/crypto.php';
function index()
{
include __DIR__ . '/../../views/preferencias/dashboard_preferencias.php';
}
function notificaciones()
{
$conn = getConnection();
$idUsuario = $_SESSION['usuario_id'] ?? null;
if (!$idUsuario) {
header("Location: /login");
exit;
}
// Obtener configuración general de notificaciones
$query = "SELECT notificaciones, notificaciones_extra 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));
}
$notificaciones = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC) ?: ['notificaciones' => 0, 'notificaciones_extra' => 0];
sqlsrv_free_stmt($stmt);
// 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);
}
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 {
// 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
if (!$notificaciones) {
$query_delete = "DELETE FROM preferencias_notificaciones_usuario 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");
}
// 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]);
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 preferencias_notificaciones_usuario 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 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
$tipos_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'
];
// 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 preferencias_notificaciones_usuario (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");
}
}
}
// 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 (!$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 preferencias_notificaciones_usuario 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 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
$tipos_default = [
'nuevas_solicitudes' => 0,
'registro_solicitud' => 0,
'cambio_estado' => 0,
'resumen_diario' => 1, // Activado porque llegamos aquí desde su configuración
'alertas_tiempo' => 0,
'documentos_expediente' => 0,
'nuevos_archivos' => 0,
'intentos_fallidos' => 0,
'bloqueo_cuenta' => 0,
'resumen_diario_hora' => $hora,
'resumen_diario_dias' => $dias
];
$campos = '[' . implode('], [', array_keys($tipos_default)) . ']';
$placeholders = rtrim(str_repeat('?, ', count($tipos_default)), ', ');
$query = "INSERT INTO preferencias_notificaciones_usuario (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 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);
}
}