1202 lines
51 KiB
PHP
1202 lines
51 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: /IMPORTADORES/login");
|
|
exit;
|
|
}
|
|
|
|
// Obtener configuración general de notificaciones
|
|
$query = "SELECT notificaciones, notificaciones_extra, 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");
|
|
}
|
|
|
|
$notificaciones = [
|
|
'notificaciones' => $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);
|
|
}
|
|
} |