0) { header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?error=pending_request'); exit; } } // Insertar la nueva solicitud $sql = "INSERT INTO solicitudes_vinculacion (id_importador, id_agencia, mensaje, estado, fecha_solicitud) VALUES (?, ?, 'Solicitud de vinculación', 'PENDIENTE', GETDATE())"; $params = [$id_importador, $id_agencia]; $stmt = sqlsrv_prepare($conn, $sql, $params); if ($stmt && sqlsrv_execute($stmt)) { header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?success=sended_request'); exit; } else { header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?error=failed_request'); exit; } } function desvincular() { // ✅ CORREGIR: Debe ser admin_agencia, no importador if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'admin_agencia') { 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/usuariosVinculados?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.*, 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 (!$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 = ? "; $stmtDesactivar = sqlsrv_query($conn, $sqlDesactivar, [$id_relacion]); if (!$stmtDesactivar) { throw new Exception('Error al desactivar la relación'); } // Confirmar transacción sqlsrv_commit($conn); header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?success=unlinked'); exit; } catch (Exception $e) { // Revertir transacción en caso de error sqlsrv_rollback($conn); header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?error=unlinked_failed'); exit; } } function cancelar() { if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { header('Location: /IMPORTADORES/login'); exit; } $conn = getConnection(); $id_importador = $_SESSION['usuario_id']; $id_agencia = (int) $_GET['id']; $sql = "UPDATE solicitudes_vinculacion SET estado = 'CANCELADA', fecha_respuesta = GETDATE() WHERE id_importador = ? AND id_agencia = ? AND estado = 'PENDIENTE'"; $params = [$id_importador, $id_agencia]; $stmt = sqlsrv_prepare($conn, $sql, $params); if ($stmt && sqlsrv_execute($stmt)) { header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?success=cancelled'); exit; } } function solicitudesVinculacion() { if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'admin_agencia') { header('Location: /IMPORTADORES/login'); exit; } $conn = getConnection(); // Obtener agencia... $sqlAgencia = "SELECT id_agencia FROM agencias_aduanales WHERE id_administrador = ?"; $params = [$_SESSION['usuario_id']]; $stmtAgencia = sqlsrv_query($conn, $sqlAgencia, $params); $rowAgencia = sqlsrv_fetch_array($stmtAgencia, SQLSRV_FETCH_ASSOC); if (!$rowAgencia) { $solicitudes = []; include __DIR__ . '/../../views/agencias/solicitudes_vinculacion.php'; return; } $id_agencia = $rowAgencia['id_agencia']; // Verificar solicitudes básicas $debugSql = "SELECT COUNT(*) as total FROM solicitudes_vinculacion WHERE id_agencia = ?"; $debugStmt = sqlsrv_query($conn, $debugSql, [$id_agencia]); $debugRow = sqlsrv_fetch_array($debugStmt, SQLSRV_FETCH_ASSOC); // Verificar pendientes $debugSql2 = "SELECT COUNT(*) as total FROM solicitudes_vinculacion WHERE estado = 'PENDIENTE' AND id_agencia = ?"; $debugStmt2 = sqlsrv_query($conn, $debugSql2, [$id_agencia]); $debugRow2 = sqlsrv_fetch_array($debugStmt2, SQLSRV_FETCH_ASSOC); // Consulta principal $sql = " SELECT sv.id_solicitud, u.nombre AS importador_nombre, ig.rfc, sv.mensaje, sv.fecha_solicitud, si.opinion_file FROM solicitudes_vinculacion sv INNER JOIN usuarios_sistema u ON sv.id_importador = u.id_usuario LEFT JOIN informacion_general ig ON u.id_usuario = ig.id_usuario LEFT JOIN solicitudes_importadores si ON LTRIM(RTRIM(LOWER(si.company_name))) = LTRIM(RTRIM(LOWER(u.nombre))) WHERE sv.estado = 'PENDIENTE' AND sv.id_agencia = ? ORDER BY sv.fecha_solicitud DESC "; $params = [$id_agencia]; $stmt = sqlsrv_query($conn, $sql, $params); // ✅ INICIALIZAR EL ARRAY DE SOLICITUDES $solicitudes = []; // ✅ VERIFICAR SI LA CONSULTA FUNCIONÓ if ($stmt === false) { // Usar consulta simplificada como backup $sqlSimple = " SELECT sv.id_solicitud, u.nombre AS importador_nombre, sv.mensaje, sv.fecha_solicitud FROM solicitudes_vinculacion sv INNER JOIN usuarios_sistema u ON sv.id_importador = u.id_usuario WHERE sv.estado = 'PENDIENTE' AND sv.id_agencia = ? ORDER BY sv.fecha_solicitud DESC "; $stmt = sqlsrv_query($conn, $sqlSimple, $params); } // ✅ PROCESAR LOS RESULTADOS Y LLENAR EL ARRAY if ($stmt !== false) { while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $solicitudes[] = $row; } } include __DIR__ . '/../../views/agencias/solicitudes_vinculacion.php'; } function aprobarVinculacion() { // Verificar autenticación y permisos if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'admin_agencia') { header('Location: /IMPORTADORES/login'); exit; } // Verificar que se recibió el ID de la solicitud $id_solicitud = $_GET['id'] ?? null; if (!$id_solicitud || !is_numeric($id_solicitud)) { header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?error=request_id_invalid'); exit; } $conn = getConnection(); try { // Iniciar transacción sqlsrv_begin_transaction($conn); // 1. Obtener datos de la solicitud y verificar que pertenece a la agencia del admin $sqlSolicitud = " SELECT sv.id_solicitud, sv.id_importador, sv.id_agencia, sv.estado, aa.id_administrador FROM solicitudes_vinculacion sv INNER JOIN agencias_aduanales aa ON sv.id_agencia = aa.id_agencia WHERE sv.id_solicitud = ? AND aa.id_administrador = ? "; $stmtSolicitud = sqlsrv_query($conn, $sqlSolicitud, [$id_solicitud, $_SESSION['usuario_id']]); $solicitud = sqlsrv_fetch_array($stmtSolicitud, SQLSRV_FETCH_ASSOC); if (!$solicitud) { throw new Exception('Solicitud no encontrada o no tienes permisos para aprobarla'); } if ($solicitud['estado'] !== 'PENDIENTE') { throw new Exception('Esta solicitud ya ha sido procesada'); } // 2. Verificar si ya existe una relación activa entre importador y agencia $sqlVerificar = " SELECT id_relacion FROM importador_agencia WHERE id_importador = ? AND id_agencia = ? AND activo = 1 "; $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$solicitud['id_importador'], $solicitud['id_agencia']]); $relacionExistente = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC); if ($relacionExistente) { throw new Exception('Ya existe una vinculación activa entre este importador y la agencia'); } // 3. Actualizar el estado de la solicitud a APROBADO $sqlActualizar = " UPDATE solicitudes_vinculacion SET estado = 'APROBADO', fecha_respuesta = GETDATE(), respondido_por = ?, comentarios_respuesta = 'Vinculación aprobada' WHERE id_solicitud = ? "; $stmtActualizar = sqlsrv_query($conn, $sqlActualizar, [$_SESSION['usuario_id'], $id_solicitud]); if (!$stmtActualizar) { throw new Exception('Error al actualizar la solicitud'); } // 4. Crear la relación en importador_agencia $sqlRelacion = " INSERT INTO importador_agencia ( id_importador, id_agencia, activo, fecha_vinculacion, creado_por, aprobado_por, estado ) VALUES (?, ?, 1, GETDATE(), ?, ?, 'APROBADO') "; $stmtRelacion = sqlsrv_query($conn, $sqlRelacion, [ $solicitud['id_importador'], $solicitud['id_agencia'], $solicitud['id_importador'], // creado_por (el importador que solicitó) $_SESSION['usuario_id'] // aprobado_por (el admin de agencia) ]); if (!$stmtRelacion) { throw new Exception('Error al crear la relación importador-agencia'); } // Confirmar transacción sqlsrv_commit($conn); header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?success=approved'); exit; } catch (Exception $e) { // Revertir transacción en caso de error sqlsrv_rollback($conn); header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?error=denied'); exit; } } function denegarVinculacion() { // Verificar autenticación y permisos if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'admin_agencia') { header('Location: /IMPORTADORES/login'); exit; } // Verificar que se recibió el ID de la solicitud $id_solicitud = $_GET['id'] ?? null; if (!$id_solicitud || !is_numeric($id_solicitud)) { header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?error=request_id_invalid'); exit; } $conn = getConnection(); try { // Iniciar transacción sqlsrv_begin_transaction($conn); // 1. Obtener datos de la solicitud y verificar que pertenece a la agencia del admin $sqlSolicitud = " SELECT sv.id_solicitud, sv.id_importador, sv.id_agencia, sv.estado, aa.id_administrador FROM solicitudes_vinculacion sv INNER JOIN agencias_aduanales aa ON sv.id_agencia = aa.id_agencia WHERE sv.id_solicitud = ? AND aa.id_administrador = ? "; $stmtSolicitud = sqlsrv_query($conn, $sqlSolicitud, [$id_solicitud, $_SESSION['usuario_id']]); $solicitud = sqlsrv_fetch_array($stmtSolicitud, SQLSRV_FETCH_ASSOC); if (!$solicitud) { throw new Exception('Solicitud no encontrada o no tienes permisos para denegarla'); } if ($solicitud['estado'] !== 'PENDIENTE') { throw new Exception('Esta solicitud ya ha sido procesada'); } // 2. Actualizar el estado de la solicitud a DENEGADO $sqlActualizar = " UPDATE solicitudes_vinculacion SET estado = 'DENEGADO', fecha_respuesta = GETDATE(), respondido_por = ? WHERE id_solicitud = ? "; $stmtActualizar = sqlsrv_query($conn, $sqlActualizar, [$_SESSION['usuario_id'], $id_solicitud]); if (!$stmtActualizar) { throw new Exception('Error al actualizar la solicitud'); } if (!$stmtRelacion) { throw new Exception('Error al registrar el rechazo en el historial'); } // Confirmar transacción sqlsrv_commit($conn); header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?success=denied'); exit; } catch (Exception $e) { // Revertir transacción en caso de error sqlsrv_rollback($conn); 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; } }