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

@@ -71,7 +70,7 @@

✅ Usuarios Activos

- +
@@ -108,7 +107,7 @@ + - - - - -
-

📥 Solicitudes Pendientes

- -
-
-
#
- - - - - - - - - - - - - - - - - - - - - - - - - - -
#EmpresaRFCCorreoTeléfonoFechaArchivo SATAcción
format('Y-m-d H:i') : '' ?> - - Ver PDF - - No adjunto - - - Aprobar -
-
-
-
- - - \ No newline at end of file diff --git a/views/bitacoras/bitacora_agencias.php b/views/bitacoras/bitacora_agencias.php index e69de29..da7ff11 100644 --- a/views/bitacoras/bitacora_agencias.php +++ b/views/bitacoras/bitacora_agencias.php @@ -0,0 +1,38 @@ + + + + + + + Dashboard | Configuración + + + + + + + + + + + + \ No newline at end of file diff --git a/views/bitacoras/bitacora_usuario.php b/views/bitacoras/bitacora_usuario.php index d9a705c..2cb9505 100644 --- a/views/bitacoras/bitacora_usuario.php +++ b/views/bitacoras/bitacora_usuario.php @@ -1,30 +1,4 @@ - + diff --git a/views/bitacoras/bitacora_usuarios.php b/views/bitacoras/bitacora_usuarios.php index c450a35..abd0847 100644 --- a/views/bitacoras/bitacora_usuarios.php +++ b/views/bitacoras/bitacora_usuarios.php @@ -1,4 +1,4 @@ - + diff --git a/views/bitacoras/bitacora_vinculaciones.php b/views/bitacoras/bitacora_vinculaciones.php index e69de29..da7ff11 100644 --- a/views/bitacoras/bitacora_vinculaciones.php +++ b/views/bitacoras/bitacora_vinculaciones.php @@ -0,0 +1,38 @@ + + + + + + + Dashboard | Configuración + + + + + + + + + + + + \ No newline at end of file diff --git a/views/bitacoras/dashboard_bitacoras.php b/views/bitacoras/dashboard_bitacoras.php index 552a7b9..d725c94 100644 --- a/views/bitacoras/dashboard_bitacoras.php +++ b/views/bitacoras/dashboard_bitacoras.php @@ -47,30 +47,30 @@
-
Registro de usuarios
+
Registro de usuarios

Ver registros de los usuarios.

+ class="btn btn-success btn-sm mt-2 "> Ver registro de usuarios
-
Registro de agencias
+
Registro de agencias

Ver registros de las agencias.

+ class="btn btn-info btn-sm mt-2 "> Ver registro de agencias
-
Mi actividad
+
Mi actividad

Ver mi actividad en la plataforma.

+ class="btn btn-warning btn-sm mt-2 "> Ver mis accesos
@@ -90,20 +90,20 @@
-
Registro de vinculaciones
+
Registro de vinculaciones

Ver las vinculaciones de mi agencia.

+ class="btn btn-success btn-sm mt-2 "> Ver actividad
-
Mi actividad
+
Mi actividad

Ver mi actividad en la plataforma.

+ class="btn btn-info btn-sm mt-2 "> Ver mis accesos
@@ -123,10 +123,10 @@
-
Mi actividad
+
Mi actividad

Ver mi actividad en la plataforma.

+ class="btn btn-success btn-sm mt-2 "> Ver mis accesos
@@ -146,10 +146,10 @@
-
Mi actividad
+
Mi actividad

Ver mi actividad en la plataforma.

+ class="btn btn-success btn-sm mt-2 "> Ver mis accesos
diff --git a/views/bitacoras/sistema_agencia.php b/views/bitacoras/sistema_agencia.php index e69de29..da7ff11 100644 --- a/views/bitacoras/sistema_agencia.php +++ b/views/bitacoras/sistema_agencia.php @@ -0,0 +1,38 @@ + + + + + + + Dashboard | Configuración + + + + + + + + + + + + \ No newline at end of file diff --git a/views/bitacoras/vinculaciones_usuario.php b/views/bitacoras/vinculaciones_usuario.php index e69de29..da7ff11 100644 --- a/views/bitacoras/vinculaciones_usuario.php +++ b/views/bitacoras/vinculaciones_usuario.php @@ -0,0 +1,38 @@ + + + + + + + Dashboard | Configuración + + + + + + + + + + + + \ No newline at end of file diff --git a/views/partials/sidebar_agencia.php b/views/partials/sidebar_agencia.php index 80fda4c..aabe169 100644 --- a/views/partials/sidebar_agencia.php +++ b/views/partials/sidebar_agencia.php @@ -49,8 +49,8 @@ - + 👥 Usuarios Vinculados @@ -90,8 +90,8 @@ - + ✅ Usuarios Vinculados diff --git a/views/partials/sidebar_agente.php b/views/partials/sidebar_agente.php index b99f045..78cc583 100644 --- a/views/partials/sidebar_agente.php +++ b/views/partials/sidebar_agente.php @@ -52,8 +52,8 @@ - + 🔗 Vinculados @@ -142,17 +142,42 @@ 🏠 Inicio - - - ✅ Importadores Activos + + + 🔗 Vinculados - - - 🕓 Bitácora - + + + + + role="button" aria-expanded="true" aria-controls="submenuAgentesAduanales" + onclick=""> + 📑 Patentes + 2 + + + + + 📑 Patentes + 2 + + @@ -185,37 +210,6 @@ - - - - - role="button" aria-expanded="true" aria-controls="submenuAgentesAduanales" - onclick=""> - 📑 Patentes - 2 - - - - - 📑 Patentes - 2 - - - diff --git a/views/agentes/importadores_activos.php b/views/vinculaciones/importadores_vinculados.php similarity index 50% rename from views/agentes/importadores_activos.php rename to views/vinculaciones/importadores_vinculados.php index c77d8bd..ec6c31e 100644 --- a/views/agentes/importadores_activos.php +++ b/views/vinculaciones/importadores_vinculados.php @@ -5,7 +5,11 @@ Dashboard | Agente Aduanal + + + +