diff --git a/app/controllers/agencias.php b/app/controllers/agencias.php
index 42a4c98..1100255 100644
--- a/app/controllers/agencias.php
+++ b/app/controllers/agencias.php
@@ -22,11 +22,6 @@ function dashboard()
include __DIR__ . '/../../views/agencias/dashboard_agencias.php';
}
-function solicitudesVinculacion()
-{
- include __DIR__ . '/../../views/agencias/solicitudes_vinculacion.php';
-}
-
function alta()
{
if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'admin_agencia') {
@@ -34,6 +29,76 @@ function alta()
exit;
}
+ $conn = getConnection();
+
+ // DEBUG: Verificar conexión
+ if (!$conn) {
+ die("Error de conexión: " . print_r(sqlsrv_errors(), true));
+ }
+
+ // Obtener la agencia del administrador actual
+ $sqlAgencia = "SELECT id_agencia FROM agencias_aduanales WHERE id_administrador = ?";
+ $stmtAgencia = sqlsrv_query($conn, $sqlAgencia, [$_SESSION['usuario_id']]);
+
+ // DEBUG: Verificar query de agencia
+ if ($stmtAgencia === false) {
+ die("Error en consulta de agencia: " . print_r(sqlsrv_errors(), true));
+ }
+
+ $rowAgencia = sqlsrv_fetch_array($stmtAgencia, SQLSRV_FETCH_ASSOC);
+
+ // DEBUG: Verificar si se encontró la agencia
+ if (!$rowAgencia) {
+ die("No se encontró agencia para el administrador ID: " . $_SESSION['usuario_id']);
+ }
+
+ $id_agencia = $rowAgencia['id_agencia'];
+
+ // === CONSULTA DE AGENTES ADUANALES ===
+ // Verificar si hay registros en la tabla agente_agencia
+ $sqlCount = "SELECT COUNT(*) as total FROM agente_agencia WHERE id_agencia = ?";
+ $stmtCount = sqlsrv_query($conn, $sqlCount, [$id_agencia]);
+ $rowCount = sqlsrv_fetch_array($stmtCount, SQLSRV_FETCH_ASSOC);
+
+ // Verificar registros activos
+ $sqlCountActive = "SELECT COUNT(*) as total FROM agente_agencia WHERE id_agencia = ? AND activo = 1";
+ $stmtCountActive = sqlsrv_query($conn, $sqlCountActive, [$id_agencia]);
+ $rowCountActive = sqlsrv_fetch_array($stmtCountActive, SQLSRV_FETCH_ASSOC);
+
+ // Consulta de agentes vinculados ACTIVOS a MI agencia
+ $sql = "
+ SELECT
+ u.id_usuario,
+ u.nombre,
+ u.email,
+ u.tipo_usuario as tipo_usuario_sistema,
+ u.activo,
+ u.creado_en,
+ u.creado_por,
+ aa.fecha_asignacion as fecha_vinculacion,
+ aa.id_relacion,
+ 'agente' as tipo_vinculacion
+ FROM agente_agencia aa
+ INNER JOIN usuarios_sistema u ON aa.id_agente = u.id_usuario
+ WHERE aa.id_agencia = ?
+ AND aa.activo = 1
+ AND u.activo = 1
+ ORDER BY aa.fecha_asignacion DESC
+ ";
+ $stmt = sqlsrv_query($conn, $sql, [$id_agencia]);
+
+ // DEBUG: Verificar query de agentes
+ if ($stmt === false) {
+ die("Error en consulta de agentes: " . print_r(sqlsrv_errors(), true));
+ }
+
+ $agentes = [];
+ if ($stmt !== false) {
+ while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
+ $agentes[] = $row;
+ }
+ }
+
include __DIR__ . '/../../views/agencias/alta_agentes.php';
}
diff --git a/app/controllers/agentes.php b/app/controllers/agentes.php
index 17da4fa..2fd4388 100644
--- a/app/controllers/agentes.php
+++ b/app/controllers/agentes.php
@@ -24,244 +24,158 @@ function dashboard()
include __DIR__ . '/../../views/agentes/dashboard_agentes.php';
}
-function importadores_activos()
+function vinculados()
{
- if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'agente_aduanal') {
- header('Location: /IMPORTADORES/login');
- exit;
- }
+ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'agente_aduanal') {
+ header('Location: /IMPORTADORES/login');
+ exit;
+ }
$conn = getConnection();
-
- $sql = "SELECT id_importador, nombre_empresa, email, telefono, creado_en
- FROM importadores
- WHERE estatus = 'aprobado'
- ORDER BY creado_en DESC";
-
- $stmt = sqlsrv_query($conn, $sql);
- $importadores = [];
- while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
- $importadores[] = $row;
+
+ if (!$conn) {
+ die("Error de conexión: " . print_r(sqlsrv_errors(), true));
}
- include __DIR__ . '/../../views/agentes/importadores_activos.php';
-}
-
-function solicitudes_pendientes() {
- if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'agente_aduanal') {
- header('Location: /IMPORTADORES/login');
- exit;
+ // Obtener la agencia del administrador actual
+ $sqlAgencia = "SELECT id_agencia FROM agente_agencia WHERE id_agente = ? AND activo = 1";
+ $stmtAgencia = sqlsrv_query($conn, $sqlAgencia, [$_SESSION['usuario_id']]);
+
+ // DEBUG: Verificar query de agencia
+ if ($stmtAgencia === false) {
+ die("Error en consulta de agencia: " . print_r(sqlsrv_errors(), true));
+ }
+
+ $rowAgencia = sqlsrv_fetch_array($stmtAgencia, SQLSRV_FETCH_ASSOC);
+
+ // DEBUG: Verificar si se encontró la agencia
+ if (!$rowAgencia) {
+ die("No se encontró agencia vinculada el agente ID: " . $_SESSION['usuario_id']);
}
- $conn = getConnection();
+ $id_agencia = $rowAgencia['id_agencia'];
- $sql = "SELECT request_id, company_name, rfc, email, phone, request_date,opinion_file
- FROM solicitudes_importadores
- WHERE request_status = 'pending'
- ORDER BY request_date DESC";
+ // Primero, verificar si hay registros en la tabla importador_agencia
+ $sqlCount = "SELECT COUNT(*) as total FROM importador_agencia WHERE id_agencia = ?";
+ $stmtCount = sqlsrv_query($conn, $sqlCount, [$id_agencia]);
+ $rowCount = sqlsrv_fetch_array($stmtCount, SQLSRV_FETCH_ASSOC);
- $stmt = sqlsrv_query($conn, $sql);
- $solicitudes = [];
- while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
- $solicitudes[] = $row;
+ // Verificar registros activos y aprobados
+ $sqlCountActive = "SELECT COUNT(*) as total FROM importador_agencia WHERE id_agencia = ? AND activo = 1 AND estado = 'APROBADO'";
+ $stmtCountActive = sqlsrv_query($conn, $sqlCountActive, [$id_agencia]);
+ $rowCountActive = sqlsrv_fetch_array($stmtCountActive, SQLSRV_FETCH_ASSOC);
+
+ // Consulta corregida: solo usuarios vinculados ACTIVOS a MI agencia
+ $sql = "
+ SELECT
+ ia.*,
+ u.nombre as importador_nombre,
+ ig.rfc,
+ ig.telefono,
+ aa.nombre_agencia
+ FROM importador_agencia ia
+ INNER JOIN usuarios_sistema u ON ia.id_importador = u.id_usuario
+ LEFT JOIN informacion_general ig ON u.id_usuario = ig.id_usuario
+ LEFT JOIN agencias_aduanales aa ON ia.id_agencia = aa.id_agencia
+ WHERE ia.id_agencia = ? AND ia.activo = 1 AND ia.estado = 'APROBADO'
+ ORDER BY ia.fecha_vinculacion DESC
+ ";
+ $stmt = sqlsrv_query($conn, $sql, [$id_agencia]);
+
+ // DEBUG: Verificar query principal
+ if ($stmt === false) {
+ die("Error en consulta principal: " . print_r(sqlsrv_errors(), true));
}
- include __DIR__ . '/../../views/agentes/solicitudes_pendientes.php';
-}
-
-function aprobar_solicitud()
-{
- $conn = getConnection();
- $id = $_GET['id'] ?? null;
-
- if (!$id || !is_numeric($id)) {
- die("❌ ID inválido.");
- }
-
- // Obtener la solicitud
- $sql = "SELECT * FROM solicitudes_importadores WHERE request_id = ?";
- $stmt = sqlsrv_query($conn, $sql, [$id]);
- $solicitud = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
-
- if (!$solicitud) {
- die("❌ Solicitud no encontrada.");
- }
-
- // Validar que no haya sido aprobada ya
- if ($solicitud['request_status'] === 'approved') {
- die("⚠️ Esta solicitud ya fue aprobada.");
- }
-
- // Preparar datos
- $nombre = decrypt($solicitud['company_name']);
- $email = $solicitud['email'];
- $tipo = 'importador';
-
- // Generar contraseña aleatoria
- $password_plain = bin2hex(random_bytes(5));
- $password_hash = password_hash($password_plain, PASSWORD_DEFAULT);
-
- // Encriptar datos sensibles
- $nombre_encrypt = encrypt($nombre);
- $email_encrypt = encrypt($email);
-
- // Insertar en usuarios_sistema
- $sqlInsert = "INSERT INTO usuarios_sistema (nombre, email, password_hash, tipo_usuario, activo, creado_en, dos factores)
- VALUES (?, ?, ?, ?, 1, GETDATE()), 0";
- $stmtInsert = sqlsrv_query($conn, $sqlInsert, [
- $nombre_encrypt, $email_encrypt, $password_hash, $tipo
- ]);
-
- if (!$stmtInsert) {
- die("❌ Error al crear usuario: " . print_r(sqlsrv_errors(), true));
- }
-
- // Actualizar solicitud
- $sqlUpdate = "UPDATE solicitudes_importadores
- SET request_status = 'approved', approval_date = GETDATE(), approved_by = ?
- WHERE request_id = ?";
- $stmtUpdate = sqlsrv_query($conn, $sqlUpdate, [$_SESSION['usuario_id'] ?? null, $id]);
-
- if (!$stmtUpdate) {
- die("❌ Error al actualizar solicitud: " . print_r(sqlsrv_errors(), true));
- }
-
- // Enviar correo al importador
- $mail = new PHPMailer(true);
- try {
- $mail->isSMTP();
- $mail->Host = 'secure.emailsrvr.com';
- $mail->SMTPAuth = true;
- $mail->Username = 'noreply@aduanasoft.com.mx';
- $mail->Password = $_ENV['SMTP_PASS'];
- $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
- $mail->Port = 587;
-
- $mail->setFrom('noreply@aduanasoft.com.mx', 'SIIH | AduanaSoft');
- $mail->addAddress($email);
- $mail->CharSet = 'UTF-8';
- $mail->isHTML(true);
- $mail->Subject = 'Tu acceso a la plataforma SIIH ha sido autorizado';
-
- $mail->Body = "
-
-
-
-
¡Bienvenido a SIIH!
-
-
-
Tu registro como importador ha sido aprobado. Aquí tienes tus credenciales de acceso:
-
Correo: $email
-
Contraseña: $password_plain
-
📌 Te recomendamos cambiar tu contraseña una vez que ingreses al sistema.
-
Ir al sistema
-
-
- © " . date('Y') . " SIIH · Desarrollado por AduanaSoft
-
-
-
";
-
- $mail->send();
- } catch (Exception $e) {
- error_log("Error al enviar correo: {$mail->ErrorInfo}");
- }
-
- header("Location: /IMPORTADORES/AGENTES/solicitudes_pendientes");
- exit;
-}
-
-function activos()
-{
- if (!($_SESSION['usuario_id'] ?? false)) {
- die("⚠️ No autorizado.");
- }
-
- require_once __DIR__ . '/../helpers/crypto.php';
- $conn = getConnection();
-
- $sql = "SELECT id_usuario, nombre, email, tipo_usuario, creado_en, activo
- FROM usuarios_sistema
- WHERE tipo_usuario = 'importador'
- ORDER BY creado_en DESC";
-
- $stmt = sqlsrv_query($conn, $sql);
- $importadores = [];
-
- if ($stmt) {
- while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
- $row['nombre'] = decrypt($row['nombre']);
- $row['email'] = decrypt($row['email']);
- $importadores[] = $row;
+ $vinculados = [];
+ if ($stmt !== false) {
+ while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
+ $vinculados[] = $row;
}
}
-
- include __DIR__ . '/../../views/agentes/importadores_activos.php';
+
+ include __DIR__ . '/../../views/vinculaciones/importadores_vinculados.php';
}
-function toggle_estado()
-{
- if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'agente_aduanal') {
- die("⚠️ No autorizado.");
- }
+function desvincularAgente()
+{
+ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'agente_aduanal') {
+ header('Location: /IMPORTADORES/login');
+ exit;
+ }
- $id = $_GET['id'] ?? null;
-
- if (!$id || !is_numeric($id)) {
- die("❌ ID inválido.");
- }
-
- $conn = getConnection();
-
- $sql = "SELECT activo FROM usuarios_sistema WHERE id_usuario = ?";
- $stmt = sqlsrv_query($conn, $sql, [$id]);
-
- if (!$stmt || !($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))) {
- die("❌ Usuario no encontrado.");
- }
-
- $nuevoEstado = $row['activo'] == 1 ? 0 : 1;
-
- $update = "UPDATE usuarios_sistema SET activo = ? WHERE id_usuario = ?";
- $result = sqlsrv_query($conn, $update, [$nuevoEstado, $id]);
-
- if (!$result) {
- die("❌ Error al actualizar: " . print_r(sqlsrv_errors(), true));
- }
-
- // Guardar en bitácora
- require_once __DIR__ . '/../helpers/bitacoras.php';
- registrar_bitacora_usuario($_SESSION['usuario_id'], 'toggle_estado', "Modificó estado del usuario $id a $nuevoEstado");
-
- header("Location: /IMPORTADORES/agentes/activos");
- exit;
-}
-
-function bitacora()
-{
- $conn = getConnection();
- if (!($_SESSION['usuario_id'] ?? false)) {
- header('Location: /IMPORTADORES/login');
+ // Verificar que se recibió el ID de la relación
+ $id_relacion = $_GET['id'] ?? null;
+ if (!$id_relacion || !is_numeric($id_relacion)) {
+ header('Location: /IMPORTADORES/agentes/vinculados?error=invalid_id');
exit;
}
- $sql = "
- SELECT u.id_usuario, u.nombre, b.email, b.ip, b.fecha, b.exito, b.detalle
- FROM dbo.bitacora_login b
- JOIN dbo.usuarios_sistema u ON u.id_usuario = b.id_usuario
- ORDER BY b.fecha DESC
- ";
+ $conn = getConnection();
- $stmt = sqlsrv_query($conn, $sql);
- if ($stmt === false) {
- die("Error en bitacora(): " . print_r(sqlsrv_errors(), true));
+ try {
+ // Iniciar transacción
+ sqlsrv_begin_transaction($conn);
+
+ // 1. Primero obtener la agencia del agente aduanal
+ $sqlAgenciaAgente = "
+ SELECT id_agencia
+ FROM agente_agencia
+ WHERE id_agente = ? AND activo = 1
+ ";
+ $stmtAgenciaAgente = sqlsrv_query($conn, $sqlAgenciaAgente, [$_SESSION['usuario_id']]);
+
+ if ($stmtAgenciaAgente === false) {
+ throw new Exception('Error en la consulta de agencia-agente: ' . print_r(sqlsrv_errors(), true));
+ }
+ $agenciaAgente = sqlsrv_fetch_array($stmtAgenciaAgente, SQLSRV_FETCH_ASSOC);
+
+
+ $id_agencia_agente = $agenciaAgente['id_agencia'];
+
+ // 2. Verificar que la relación existe y pertenece a la MISMA agencia del agente
+ $sqlVerificar = "
+ SELECT
+ ia.*,
+ u.id_usuario, u.nombre as importador_nombre, aa.nombre_agencia
+ FROM importador_agencia ia
+ INNER JOIN usuarios_sistema u ON ia.id_importador = u.id_usuario
+ INNER JOIN agencias_aduanales aa ON ia.id_agencia = aa.id_agencia
+ WHERE ia.id_relacion = ? AND ia.id_agencia = ?
+ ";
+ $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$id_relacion, $id_agencia_agente]);
+
+ if ($stmtVerificar === false) {
+ throw new Exception('Error en la consulta de verificación: ' . print_r(sqlsrv_errors(), true));
+ }
+
+ $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC);
+
+
+ // 4. Desactivar la relación (no eliminar, mantener historial)
+ $sqlDesactivar = "
+ UPDATE importador_agencia
+ SET activo = 0,
+ estado = 'DESVINCULADO'
+ WHERE id_relacion = ?
+ ";
+ $stmtDesactivar = sqlsrv_query($conn, $sqlDesactivar, [$id_relacion]);
+
+ if ($stmtDesactivar === false) {
+ throw new Exception('Error al desactivar la relación: ' . print_r(sqlsrv_errors(), true));
+ }
+
+ // Confirmar transacción
+ sqlsrv_commit($conn);
+
+ header('Location: /IMPORTADORES/agentes/vinculados?success=unlinked');
+ exit;
+
+ } catch (Exception $e) {
+ // Revertir transacción en caso de error
+ sqlsrv_rollback($conn);
+ error_log("Error desvinculando importador: " . $e->getMessage());
+ header('Location: /IMPORTADORES/agentes/vinculados?error=unlinked_failed');
+ exit;
}
-
- $bitacoras = [];
- while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
- $row['nombre'] = decrypt($row['nombre']); // Desencripta aquí
- $bitacoras[] = $row;
- }
-
- include __DIR__ . '/../../views/agentes/bitacora.php';
}
\ No newline at end of file
diff --git a/app/controllers/importadores.php b/app/controllers/importadores.php
index 7548a6d..e82198b 100644
--- a/app/controllers/importadores.php
+++ b/app/controllers/importadores.php
@@ -46,4 +46,97 @@ function lista()
}
include __DIR__ . '/../../views/locaciones/lista.php';
+}
+
+function desvincularUsuario()
+{
+ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') {
+ header('Location: /IMPORTADORES/login');
+ exit;
+ }
+
+ // Verificar que se recibió el ID de la relación
+ $id_relacion = $_GET['id'] ?? null;
+ if (!$id_relacion || !is_numeric($id_relacion)) {
+ header('Location: /IMPORTADORES/vinculaciones/vinculacionesUsuario?error=invalid_id');
+ exit;
+ }
+
+ $conn = getConnection();
+
+ try {
+ // Iniciar transacción
+ sqlsrv_begin_transaction($conn);
+
+ // 1. Verificar que la relación existe y pertenece a la agencia del admin
+ $sqlVerificar = "
+ SELECT
+ ia.*,
+ u.id_usuario, u.nombre as importador_nombre, aa.nombre_agencia
+ FROM importador_agencia ia
+ INNER JOIN usuarios_sistema u ON ia.id_importador = u.id_usuario
+ INNER JOIN agencias_aduanales aa ON ia.id_agencia = aa.id_agencia
+ WHERE ia.id_relacion = ? AND ia.id_importador = ?
+ ";
+ $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$id_relacion, $_SESSION['usuario_id']]);
+
+ // Verificar si la consulta fue exitosa
+ if ($stmtVerificar === false) {
+ $errors = sqlsrv_errors();
+ error_log("Error en consulta verificar: " . print_r($errors, true));
+ throw new Exception('Error en la consulta de verificación');
+ }
+
+ $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC);
+
+ if (!$relacion) {
+ throw new Exception('Relación no encontrada o no tienes permisos para desvincularla');
+ }
+
+ if ($relacion['activo'] == 0) {
+ throw new Exception('Esta relación ya está inactiva');
+ }
+
+ // 2. Desactivar la relación (no eliminar, mantener historial)
+ $sqlDesactivar = "
+ UPDATE importador_agencia
+ SET activo = 0,
+ fecha_desvinculacion = GETDATE(),
+ estado = 'DESVINCULADO'
+ WHERE id_relacion = ? AND id_importador = ?
+ ";
+
+ $stmtDesactivar = sqlsrv_query($conn, $sqlDesactivar, [$id_relacion, $_SESSION['usuario_id']]);
+
+ if ($stmtDesactivar === false) {
+ $errors = sqlsrv_errors();
+ error_log("Error en actualización: " . print_r($errors, true));
+ throw new Exception('Error al desactivar la relación');
+ }
+
+ // Verificar que se actualizó al menos una fila
+ $filasAfectadas = sqlsrv_rows_affected($stmtDesactivar);
+ if ($filasAfectadas === 0) {
+ throw new Exception('No se pudo actualizar la relación');
+ }
+
+ // Limpiar statements
+ sqlsrv_free_stmt($stmtVerificar);
+ sqlsrv_free_stmt($stmtDesactivar);
+
+ // Confirmar transacción
+ sqlsrv_commit($conn);
+ sqlsrv_close($conn);
+
+ header('Location: /IMPORTADORES/vinculaciones/vinculacionesUsuario?success=unlinked');
+ exit;
+
+ } catch (Exception $e) {
+ // Revertir transacción en caso de error
+ sqlsrv_rollback($conn);
+ sqlsrv_close($conn);
+
+ header('Location: /IMPORTADORES/vinculaciones/vinculacionesUsuario?error=unlinked_failed&msg=' . urlencode($e->getMessage()));
+ exit;
+ }
}
\ No newline at end of file
diff --git a/app/controllers/productos_frecuentes.php b/app/controllers/productos_frecuentes.php
index 92d933a..85de855 100644
--- a/app/controllers/productos_frecuentes.php
+++ b/app/controllers/productos_frecuentes.php
@@ -1,8 +1,6 @@
[]]);
@@ -324,8 +315,6 @@ function ajax_unidades()
exit;
}
-
-
/** POST /IMPORTADORES/productos_frecuentes/procesar_csv
* Procesa el upload y la inserción de CSV **/
function procesar_csv()
@@ -360,4 +349,4 @@ function procesar_csv()
$_SESSION['flash_success'] = 'Importación completada.';
header('Location: /IMPORTADORES/productos_frecuentes');
exit;
-}
+}
\ No newline at end of file
diff --git a/app/controllers/vinculaciones.php b/app/controllers/vinculaciones.php
index 7a2b28e..19d5781 100644
--- a/app/controllers/vinculaciones.php
+++ b/app/controllers/vinculaciones.php
@@ -3,46 +3,41 @@ require_once __DIR__ . '/../helpers/session.php';
require_once __DIR__ . '/../../config/database.php';
require_once __DIR__ . '/../helpers/crypto.php';
-function vinculacionesUsuario()
-{
- if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') {
- header('Location: /IMPORTADORES/login');
- exit;
- }
+function vinculacionesUsuario()
+{
+ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') {
+ header('Location: /IMPORTADORES/login');
+ exit;
+ }
$conn = getConnection();
- $id_importador = $_SESSION['usuario_id'];
+ // DEBUG: Verificar conexión
+ if (!$conn) {
+ die("Error de conexión: " . print_r(sqlsrv_errors(), true));
+ }
+
+ // Consulta de todas las relaciones del importador
$sql = "
- SELECT
- ia.*,
- aa.id_agencia, aa.nombre_agencia, aa.rfc_agencia, aa.telefono, aa.direccion
- FROM importador_agencia ia
- INNER JOIN agencias_aduanales aa ON ia.id_agencia = aa.id_agencia
- WHERE ia.id_importador = ?
- AND ia.activo = 1
- AND ia.estado = 'APROBADO'
- ORDER BY ia.fecha_vinculacion DESC
- ";
- $stmt = sqlsrv_query($conn, $sql, [$id_importador]);
+ SELECT *
+ FROM importador_agencia ia
+ INNER JOIN agencias_aduanales aa ON ia.id_agencia = aa.id_agencia
+ WHERE ia.id_importador = ? AND ia.activo = 1
+ ORDER BY ia.fecha_vinculacion DESC
+ ";
+ $stmt = sqlsrv_query($conn, $sql, [$_SESSION['usuario_id']]);
$vinculaciones = [];
if ($stmt !== false) {
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$vinculaciones[] = $row;
}
- sqlsrv_free_stmt($stmt);
- } else {
- // Manejo de errores
- $errors = sqlsrv_errors();
- error_log("Error en consulta vinculaciones: " . print_r($errors, true));
- }
+ }
- sqlsrv_close($conn);
- include __DIR__ . '/../../views/vinculaciones/vinculaciones_importador.php';
+ include __DIR__ . '/../../views/vinculaciones/vinculaciones_importador.php';
}
-function usuariosVinculados()
+function vinculacionesAgencia()
{
if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'admin_agencia') {
header('Location: /IMPORTADORES/login');
@@ -57,7 +52,7 @@ function usuariosVinculados()
}
// Obtener la agencia del administrador actual
- $sqlAgencia = "SELECT id_agencia FROM agencias_aduanales WHERE id_administrador = ?";
+ $sqlAgencia = "SELECT id_agencia FROM agencias_aduanales WHERE id_administrador = ?";
$stmtAgencia = sqlsrv_query($conn, $sqlAgencia, [$_SESSION['usuario_id']]);
// DEBUG: Verificar query de agencia
@@ -74,23 +69,26 @@ function usuariosVinculados()
$id_agencia = $rowAgencia['id_agencia'];
+ // === CONSULTA DE IMPORTADORES ===
// Primero, verificar si hay registros en la tabla importador_agencia
- $sqlCount = "SELECT COUNT(*) as total FROM importador_agencia WHERE id_agencia = ?";
+ $sqlCount = "SELECT COUNT(*) as total FROM importador_agencia WHERE id_agencia = ?";
$stmtCount = sqlsrv_query($conn, $sqlCount, [$id_agencia]);
- $rowCount = sqlsrv_fetch_array($stmtCount, SQLSRV_FETCH_ASSOC);
+ $rowCount = sqlsrv_fetch_array($stmtCount, SQLSRV_FETCH_ASSOC);
// Verificar registros activos y aprobados
- $sqlCountActive = "SELECT COUNT(*) as total FROM importador_agencia WHERE id_agencia = ? AND activo = 1 AND estado = 'APROBADO'";
+ $sqlCountActive = "SELECT COUNT(*) as total FROM importador_agencia WHERE id_agencia = ? AND activo = 1 AND estado = 'APROBADO'";
$stmtCountActive = sqlsrv_query($conn, $sqlCountActive, [$id_agencia]);
- $rowCountActive = sqlsrv_fetch_array($stmtCountActive, SQLSRV_FETCH_ASSOC);
+ $rowCountActive = sqlsrv_fetch_array($stmtCountActive, SQLSRV_FETCH_ASSOC);
- // Consulta corregida: solo usuarios vinculados ACTIVOS a MI agencia
+ // Consulta de importadores vinculados ACTIVOS a MI agencia
$sql = "
SELECT
ia.*,
u.nombre as importador_nombre,
+ u.tipo_usuario as tipo_usuario_sistema,
ig.rfc,
- ig.telefono
+ ig.telefono,
+ 'importador' as tipo_vinculacion
FROM importador_agencia ia
INNER JOIN usuarios_sistema u ON ia.id_importador = u.id_usuario
LEFT JOIN informacion_general ig ON u.id_usuario = ig.id_usuario
@@ -101,7 +99,7 @@ function usuariosVinculados()
// DEBUG: Verificar query principal
if ($stmt === false) {
- die("Error en consulta principal: " . print_r(sqlsrv_errors(), true));
+ die("Error en consulta de importadores: " . print_r(sqlsrv_errors(), true));
}
$vinculados = [];
@@ -110,8 +108,54 @@ function usuariosVinculados()
$vinculados[] = $row;
}
}
+
+ // === CONSULTA DE AGENTES ADUANALES ===
+ // Verificar si hay registros en la tabla agente_agencia
+ $sqlCount2 = "SELECT COUNT(*) as total FROM agente_agencia WHERE id_agencia = ?";
+ $stmtCount2 = sqlsrv_query($conn, $sqlCount2, [$id_agencia]);
+ $rowCount2 = sqlsrv_fetch_array($stmtCount2, SQLSRV_FETCH_ASSOC);
+
+ // Verificar registros activos
+ $sqlCountActive2 = "SELECT COUNT(*) as total FROM agente_agencia WHERE id_agencia = ? AND activo = 1";
+ $stmtCountActive2 = sqlsrv_query($conn, $sqlCountActive2, [$id_agencia]);
+ $rowCountActive2 = sqlsrv_fetch_array($stmtCountActive2, SQLSRV_FETCH_ASSOC);
+
+ // Consulta de agentes vinculados ACTIVOS a MI agencia
+ $sql2 = "
+ SELECT
+ aa.*,
+ aa.fecha_asignacion as fecha_vinculacion,
+ u.nombre as importador_nombre,
+ u.tipo_usuario as tipo_usuario_sistema,
+ ig.rfc,
+ ig.telefono,
+ 'agente' as tipo_vinculacion
+ FROM agente_agencia aa
+ INNER JOIN usuarios_sistema u ON aa.id_agente = u.id_usuario
+ LEFT JOIN informacion_general ig ON u.id_usuario = ig.id_usuario
+ WHERE aa.id_agencia = ? AND aa.activo = 1
+ ORDER BY aa.fecha_asignacion DESC
+ ";
+ $stmt2 = sqlsrv_query($conn, $sql2, [$id_agencia]);
+
+ // DEBUG: Verificar query de agentes
+ if ($stmt2 === false) {
+ die("Error en consulta de agentes: " . print_r(sqlsrv_errors(), true));
+ }
+
+ // AGREGAR los agentes al array existente (no sobrescribir)
+ if ($stmt2 !== false) {
+ while ($row = sqlsrv_fetch_array($stmt2, SQLSRV_FETCH_ASSOC)) {
+ $vinculados[] = $row;
+ }
+ }
+
+ // Opcional: Ordenar todo el array por fecha de vinculación
+ usort($vinculados, function($a, $b) {
+ return $b['fecha_vinculacion'] <=> $a['fecha_vinculacion'];
+ });
- include __DIR__ . '/../../views/agencias/usuarios_vinculados.php';
+ include __DIR__ . '/../../views/vinculaciones/usuarios_vinculados.php';
}
function nuevaVinculacion()
@@ -190,7 +234,7 @@ function vincular()
}
}
-function desvincular()
+function desvincularAgencia()
{
// ✅ CORREGIR: Debe ser admin_agencia, no importador
if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'admin_agencia') {
@@ -200,63 +244,108 @@ function desvincular()
// Verificar que se recibió el ID de la relación
$id_relacion = $_GET['id'] ?? null;
+ $tipo = $_GET['tipo'] ?? null;
+
if (!$id_relacion || !is_numeric($id_relacion)) {
header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?error=invalid_id');
exit;
}
+ // Validar que el tipo sea válido
+ if (!in_array($tipo, ['importador', 'agente'])) {
+ header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?error=invalid_type');
+ exit;
+ }
+
$conn = getConnection();
try {
// Iniciar transacción
sqlsrv_begin_transaction($conn);
- // 1. Verificar que la relación existe y pertenece a la agencia del admin
- $sqlVerificar = "
- SELECT
- ia.*,
- aa.id_administrador,
- u.nombre as importador_nombre
- FROM importador_agencia ia
- INNER JOIN agencias_aduanales aa ON ia.id_agencia = aa.id_agencia
- INNER JOIN usuarios_sistema u ON ia.id_importador = u.id_usuario
- WHERE ia.id_relacion = ? AND aa.id_administrador = ?
- ";
- $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$id_relacion, $_SESSION['usuario_id']]);
- $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC);
+ if ($tipo === 'importador') {
- if (!$relacion) {
- throw new Exception('Relación no encontrada o no tienes permisos para desvincularla');
+ // Verificar relación de importador
+ $sqlVerificar = "
+ SELECT
+ ia.*,
+ aa.id_administrador,
+ u.nombre as usuario_nombre,
+ u.tipo_usuario
+ FROM importador_agencia ia
+ INNER JOIN agencias_aduanales aa ON ia.id_agencia = aa.id_agencia
+ INNER JOIN usuarios_sistema u ON ia.id_importador = u.id_usuario
+ WHERE ia.id_relacion = ? AND aa.id_administrador = ? AND u.tipo_usuario = 'importador'
+ ";
+ $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$id_relacion, $_SESSION['usuario_id']]);
+ $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC);
+
+ if (!$relacion) {
+ throw new Exception('Relación de importador no encontrada o no tienes permisos para desvincularla');
+ }
+
+ if ($relacion['activo'] == 0) {
+ throw new Exception('Esta relación de importador ya está inactiva');
+ }
+
+ // Desactivar la relación de importador
+ $sqlDesactivar = "
+ UPDATE importador_agencia
+ SET activo = 0,
+ fecha_desvinculacion = GETDATE(),
+ estado = 'DESVINCULADO'
+ WHERE id_relacion = ?
+ ";
+
+ } else if ($tipo === 'agente') {
+ // Verificar relación de agente aduanal
+ $sqlVerificar = "
+ SELECT
+ aa.*,
+ ag.id_administrador,
+ u.nombre as usuario_nombre,
+ u.tipo_usuario
+ FROM agente_agencia aa
+ INNER JOIN agencias_aduanales ag ON aa.id_agencia = ag.id_agencia
+ INNER JOIN usuarios_sistema u ON aa.id_agente = u.id_usuario
+ WHERE aa.id_relacion = ? AND ag.id_administrador = ? AND u.tipo_usuario = 'agente_aduanal'
+ ";
+ $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$id_relacion, $_SESSION['usuario_id']]);
+ $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC);
+
+ if (!$relacion) {
+ throw new Exception('Relación de agente no encontrada o no tienes permisos para desvincularla');
+ }
+
+ if ($relacion['activo'] == 0) {
+ throw new Exception('Esta relación de agente ya está inactiva');
+ }
+
+ // Desactivar la relación de agente
+ $sqlDesactivar = "
+ UPDATE agente_agencia
+ SET activo = 0,
+ fecha_desvinculacion = GETDATE()
+ WHERE id_relacion = ?
+ ";
}
- if ($relacion['activo'] == 0) {
- throw new Exception('Esta relación ya está inactiva');
- }
-
- // 2. Desactivar la relación (no eliminar, mantener historial)
- $sqlDesactivar = "
- UPDATE importador_agencia
- SET activo = 0,
- fecha_desvinculacion = GETDATE(),
- estado = 'DESVINCULADO'
- WHERE id_relacion = ?
- ";
$stmtDesactivar = sqlsrv_query($conn, $sqlDesactivar, [$id_relacion]);
if (!$stmtDesactivar) {
- throw new Exception('Error al desactivar la relación');
+ throw new Exception('Error al desactivar la relación de ' . $tipo);
}
// Confirmar transacción
sqlsrv_commit($conn);
- header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?success=unlinked');
+ header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?success=unlinked&tipo=' . $tipo);
exit;
} catch (Exception $e) {
// Revertir transacción en caso de error
sqlsrv_rollback($conn);
- header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?error=unlinked_failed');
+ header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?error=unlinked_failed&message=' . urlencode($e->getMessage()));
exit;
}
}
@@ -365,7 +454,7 @@ function solicitudesVinculacion()
}
}
- include __DIR__ . '/../../views/agencias/solicitudes_vinculacion.php';
+ include __DIR__ . '/../../views/vinculaciones/solicitudes_vinculacion.php';
}
function aprobarVinculacion()
@@ -551,98 +640,4 @@ function denegarVinculacion()
header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?error=denied_error');
exit;
}
-}
-
-function desvincularUsuario()
-{
- // ✅ CORREGIR: Debe ser admin_agencia, no importador
- if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') {
- header('Location: /IMPORTADORES/login');
- exit;
- }
-
- // Verificar que se recibió el ID de la relación
- $id_relacion = $_GET['id'] ?? null;
- if (!$id_relacion || !is_numeric($id_relacion)) {
- header('Location: /IMPORTADORES/vinculaciones/vinculacionesUsuario?error=invalid_id');
- exit;
- }
-
- $conn = getConnection();
-
- try {
- // Iniciar transacción
- sqlsrv_begin_transaction($conn);
-
- // 1. Verificar que la relación existe y pertenece a la agencia del admin
- $sqlVerificar = "
- SELECT
- ia.*,
- u.id_usuario, u.nombre as importador_nombre, aa.nombre_agencia
- FROM importador_agencia ia
- INNER JOIN usuarios_sistema u ON ia.id_importador = u.id_usuario
- INNER JOIN agencias_aduanales aa ON ia.id_agencia = aa.id_agencia
- WHERE ia.id_relacion = ? AND ia.id_importador = ?
- ";
- $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$id_relacion, $_SESSION['usuario_id']]);
-
- // Verificar si la consulta fue exitosa
- if ($stmtVerificar === false) {
- $errors = sqlsrv_errors();
- error_log("Error en consulta verificar: " . print_r($errors, true));
- throw new Exception('Error en la consulta de verificación');
- }
-
- $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC);
-
- if (!$relacion) {
- throw new Exception('Relación no encontrada o no tienes permisos para desvincularla');
- }
-
- if ($relacion['activo'] == 0) {
- throw new Exception('Esta relación ya está inactiva');
- }
-
- // 2. Desactivar la relación (no eliminar, mantener historial)
- $sqlDesactivar = "
- UPDATE importador_agencia
- SET activo = 0,
- fecha_desvinculacion = GETDATE(),
- estado = 'DESVINCULADO'
- WHERE id_relacion = ? AND id_importador = ?
- ";
-
- $stmtDesactivar = sqlsrv_query($conn, $sqlDesactivar, [$id_relacion, $_SESSION['usuario_id']]);
-
- if ($stmtDesactivar === false) {
- $errors = sqlsrv_errors();
- error_log("Error en actualización: " . print_r($errors, true));
- throw new Exception('Error al desactivar la relación');
- }
-
- // Verificar que se actualizó al menos una fila
- $filasAfectadas = sqlsrv_rows_affected($stmtDesactivar);
- if ($filasAfectadas === 0) {
- throw new Exception('No se pudo actualizar la relación');
- }
-
- // Limpiar statements
- sqlsrv_free_stmt($stmtVerificar);
- sqlsrv_free_stmt($stmtDesactivar);
-
- // Confirmar transacción
- sqlsrv_commit($conn);
- sqlsrv_close($conn);
-
- header('Location: /IMPORTADORES/vinculaciones/vinculacionesUsuario?success=unlinked');
- exit;
-
- } catch (Exception $e) {
- // Revertir transacción en caso de error
- sqlsrv_rollback($conn);
- sqlsrv_close($conn);
-
- header('Location: /IMPORTADORES/vinculaciones/vinculacionesUsuario?error=unlinked_failed&msg=' . urlencode($e->getMessage()));
- exit;
- }
}
\ No newline at end of file
diff --git a/views/admin/agencias_activas.php b/views/admin/agencias_activas.php
index 096816f..71a36e2 100644
--- a/views/admin/agencias_activas.php
+++ b/views/admin/agencias_activas.php
@@ -73,10 +73,6 @@
-
-
- | No hay agencias registradas aún. |
-
diff --git a/views/admin/alta_usuarios.php b/views/admin/alta_usuarios.php
index 35b6047..48ce417 100644
--- a/views/admin/alta_usuarios.php
+++ b/views/admin/alta_usuarios.php
@@ -6,7 +6,6 @@
Dashboard | Administrador
-
@@ -39,7 +38,7 @@
-
👥 Alta de Usuarios
+
👥 Alta de Usuarios