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 cancelarVinculacion() { 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 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; } }