Do not check order approved status if it does not contains physical goods

This commit is contained in:
dinamiko 2022-06-02 15:11:01 +02:00
parent 77230fefa8
commit 0a993f854d
7 changed files with 88 additions and 8 deletions

View file

@ -47,6 +47,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookEventFactory;
use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory; use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache; use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies; use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper;
use WooCommerce\PayPalCommerce\ApiClient\Repository\ApplicationContextRepository; use WooCommerce\PayPalCommerce\ApiClient\Repository\ApplicationContextRepository;
use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository; use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository;
use WooCommerce\PayPalCommerce\ApiClient\Repository\CustomerRepository; use WooCommerce\PayPalCommerce\ApiClient\Repository\CustomerRepository;
@ -671,4 +672,7 @@ return array(
'SE', 'SE',
); );
}, },
'api.order-helper' => static function( ContainerInterface $container ): OrderHelper {
return new OrderHelper();
},
); );

View file

@ -0,0 +1,34 @@
<?php
/**
* PayPal order helper.
*
* @package WooCommerce\PayPalCommerce\ApiClient\Helper
*/
declare(strict_types=1);
namespace WooCommerce\PayPalCommerce\ApiClient\Helper;
use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
/**
* Class OrderHelper
*/
class OrderHelper {
/**
* Checks if order contains virtual products.
*
* @param Order $order PayPal order.
* @return bool
*/
public function contains_physical_goods( Order $order ): bool {
foreach ( $order->purchase_units() as $unit ) {
if ( $unit->contains_physical_goods() ) {
return true;
}
}
return false;
}
}

View file

@ -151,6 +151,7 @@ return array(
$three_d_secure = $container->get( 'button.helper.three-d-secure' ); $three_d_secure = $container->get( 'button.helper.three-d-secure' );
$settings = $container->get( 'wcgateway.settings' ); $settings = $container->get( 'wcgateway.settings' );
$dcc_applies = $container->get( 'api.helpers.dccapplies' ); $dcc_applies = $container->get( 'api.helpers.dccapplies' );
$order_helper = $container->get( 'api.order-helper' );
$logger = $container->get( 'woocommerce.logger.woocommerce' ); $logger = $container->get( 'woocommerce.logger.woocommerce' );
return new ApproveOrderEndpoint( return new ApproveOrderEndpoint(
$request_data, $request_data,
@ -159,6 +160,7 @@ return array(
$three_d_secure, $three_d_secure,
$settings, $settings,
$dcc_applies, $dcc_applies,
$order_helper,
$logger $logger
); );
}, },

View file

@ -16,6 +16,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus; use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException; use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies; use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper;
use WooCommerce\PayPalCommerce\Button\Exception\RuntimeException; use WooCommerce\PayPalCommerce\Button\Exception\RuntimeException;
use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure; use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure;
use WooCommerce\PayPalCommerce\Session\SessionHandler; use WooCommerce\PayPalCommerce\Session\SessionHandler;
@ -26,7 +27,6 @@ use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
*/ */
class ApproveOrderEndpoint implements EndpointInterface { class ApproveOrderEndpoint implements EndpointInterface {
const ENDPOINT = 'ppc-approve-order'; const ENDPOINT = 'ppc-approve-order';
/** /**
@ -71,6 +71,13 @@ class ApproveOrderEndpoint implements EndpointInterface {
*/ */
private $dcc_applies; private $dcc_applies;
/**
* The order helper.
*
* @var OrderHelper
*/
protected $order_helper;
/** /**
* The logger. * The logger.
* *
@ -87,6 +94,7 @@ class ApproveOrderEndpoint implements EndpointInterface {
* @param ThreeDSecure $three_d_secure The 3d secure helper object. * @param ThreeDSecure $three_d_secure The 3d secure helper object.
* @param Settings $settings The settings. * @param Settings $settings The settings.
* @param DccApplies $dcc_applies The DCC applies object. * @param DccApplies $dcc_applies The DCC applies object.
* @param OrderHelper $order_helper The order helper.
* @param LoggerInterface $logger The logger. * @param LoggerInterface $logger The logger.
*/ */
public function __construct( public function __construct(
@ -96,6 +104,7 @@ class ApproveOrderEndpoint implements EndpointInterface {
ThreeDSecure $three_d_secure, ThreeDSecure $three_d_secure,
Settings $settings, Settings $settings,
DccApplies $dcc_applies, DccApplies $dcc_applies,
OrderHelper $order_helper,
LoggerInterface $logger LoggerInterface $logger
) { ) {
@ -105,6 +114,7 @@ class ApproveOrderEndpoint implements EndpointInterface {
$this->threed_secure = $three_d_secure; $this->threed_secure = $three_d_secure;
$this->settings = $settings; $this->settings = $settings;
$this->dcc_applies = $dcc_applies; $this->dcc_applies = $dcc_applies;
$this->order_helper = $order_helper;
$this->logger = $logger; $this->logger = $logger;
} }
@ -173,7 +183,7 @@ class ApproveOrderEndpoint implements EndpointInterface {
wp_send_json_success( $order ); wp_send_json_success( $order );
} }
if ( ! $order->status()->is( OrderStatus::APPROVED ) ) { if ( $this->order_helper->contains_physical_goods( $order ) && ! $order->status()->is( OrderStatus::APPROVED ) ) {
$message = sprintf( $message = sprintf(
// translators: %s is the id of the order. // translators: %s is the id of the order.
__( 'Order %s is not approved yet.', 'woocommerce-paypal-payments' ), __( 'Order %s is not approved yet.', 'woocommerce-paypal-payments' ),

View file

@ -218,6 +218,7 @@ return array(
$environment = $container->get( 'onboarding.environment' ); $environment = $container->get( 'onboarding.environment' );
$logger = $container->get( 'woocommerce.logger.woocommerce' ); $logger = $container->get( 'woocommerce.logger.woocommerce' );
$subscription_helper = $container->get( 'subscription.helper' ); $subscription_helper = $container->get( 'subscription.helper' );
$order_helper = $container->get('api.order-helper');
return new OrderProcessor( return new OrderProcessor(
$session_handler, $session_handler,
$order_endpoint, $order_endpoint,
@ -227,7 +228,8 @@ return array(
$settings, $settings,
$logger, $logger,
$environment, $environment,
$subscription_helper $subscription_helper,
$order_helper
); );
}, },
'wcgateway.processor.refunds' => static function ( ContainerInterface $container ): RefundProcessor { 'wcgateway.processor.refunds' => static function ( ContainerInterface $container ): RefundProcessor {

View file

@ -14,6 +14,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
use WooCommerce\PayPalCommerce\ApiClient\Entity\Order; use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus; use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory; use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory;
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper;
use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure; use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure;
use WooCommerce\PayPalCommerce\Onboarding\Environment; use WooCommerce\PayPalCommerce\Onboarding\Environment;
use WooCommerce\PayPalCommerce\Session\SessionHandler; use WooCommerce\PayPalCommerce\Session\SessionHandler;
@ -106,6 +107,13 @@ class OrderProcessor {
*/ */
private $subscription_helper; private $subscription_helper;
/**
* The order helper.
*
* @var OrderHelper
*/
private $order_helper;
/** /**
* OrderProcessor constructor. * OrderProcessor constructor.
* *
@ -118,6 +126,7 @@ class OrderProcessor {
* @param LoggerInterface $logger A logger service. * @param LoggerInterface $logger A logger service.
* @param Environment $environment The environment. * @param Environment $environment The environment.
* @param SubscriptionHelper $subscription_helper The subscription helper. * @param SubscriptionHelper $subscription_helper The subscription helper.
* @param OrderHelper $order_helper The order helper.
*/ */
public function __construct( public function __construct(
SessionHandler $session_handler, SessionHandler $session_handler,
@ -128,7 +137,8 @@ class OrderProcessor {
Settings $settings, Settings $settings,
LoggerInterface $logger, LoggerInterface $logger,
Environment $environment, Environment $environment,
SubscriptionHelper $subscription_helper SubscriptionHelper $subscription_helper,
OrderHelper $order_helper
) { ) {
$this->session_handler = $session_handler; $this->session_handler = $session_handler;
@ -140,6 +150,7 @@ class OrderProcessor {
$this->environment = $environment; $this->environment = $environment;
$this->logger = $logger; $this->logger = $logger;
$this->subscription_helper = $subscription_helper; $this->subscription_helper = $subscription_helper;
$this->order_helper = $order_helper;
} }
/** /**
@ -160,7 +171,7 @@ class OrderProcessor {
$this->add_paypal_meta( $wc_order, $order, $this->environment ); $this->add_paypal_meta( $wc_order, $order, $this->environment );
$error_message = null; $error_message = null;
if ( ! $this->order_is_approved( $order ) ) { if ( $this->order_helper->contains_physical_goods( $order ) && ! $this->order_is_approved( $order ) ) {
$error_message = __( $error_message = __(
'The payment has not been approved yet.', 'The payment has not been approved yet.',
'woocommerce-paypal-payments' 'woocommerce-paypal-payments'

View file

@ -16,6 +16,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
use WooCommerce\PayPalCommerce\ApiClient\Entity\Payments; use WooCommerce\PayPalCommerce\ApiClient\Entity\Payments;
use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit; use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit;
use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory; use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory;
use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper;
use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure; use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure;
use WooCommerce\PayPalCommerce\Onboarding\Environment; use WooCommerce\PayPalCommerce\Onboarding\Environment;
use WooCommerce\PayPalCommerce\Session\SessionHandler; use WooCommerce\PayPalCommerce\Session\SessionHandler;
@ -129,6 +130,8 @@ class OrderProcessorTest extends TestCase
$subscription_helper = Mockery::mock(SubscriptionHelper::class); $subscription_helper = Mockery::mock(SubscriptionHelper::class);
$subscription_helper->shouldReceive('has_subscription'); $subscription_helper->shouldReceive('has_subscription');
$order_helper = Mockery::mock(OrderHelper::class);
$testee = new OrderProcessor( $testee = new OrderProcessor(
$sessionHandler, $sessionHandler,
$orderEndpoint, $orderEndpoint,
@ -138,7 +141,8 @@ class OrderProcessorTest extends TestCase
$settings, $settings,
$logger, $logger,
$this->environment, $this->environment,
$subscription_helper $subscription_helper,
$order_helper
); );
$wcOrder $wcOrder
@ -165,6 +169,8 @@ class OrderProcessorTest extends TestCase
$wcOrder->expects('set_transaction_id') $wcOrder->expects('set_transaction_id')
->with($transactionId); ->with($transactionId);
$order_helper->shouldReceive('contains_physical_goods')->andReturn(true);
$this->assertTrue($testee->process($wcOrder)); $this->assertTrue($testee->process($wcOrder));
} }
@ -247,6 +253,8 @@ class OrderProcessorTest extends TestCase
$logger = Mockery::mock(LoggerInterface::class); $logger = Mockery::mock(LoggerInterface::class);
$subscription_helper = Mockery::mock(SubscriptionHelper::class); $subscription_helper = Mockery::mock(SubscriptionHelper::class);
$order_helper = Mockery::mock(OrderHelper::class);
$testee = new OrderProcessor( $testee = new OrderProcessor(
$sessionHandler, $sessionHandler,
$orderEndpoint, $orderEndpoint,
@ -256,7 +264,8 @@ class OrderProcessorTest extends TestCase
$settings, $settings,
$logger, $logger,
$this->environment, $this->environment,
$subscription_helper $subscription_helper,
$order_helper
); );
$wcOrder $wcOrder
@ -277,6 +286,9 @@ class OrderProcessorTest extends TestCase
->with($transactionId); ->with($transactionId);
$wcOrder $wcOrder
->expects('payment_complete'); ->expects('payment_complete');
$order_helper->shouldReceive('contains_physical_goods')->andReturn(true);
$this->assertTrue($testee->process($wcOrder)); $this->assertTrue($testee->process($wcOrder));
} }
@ -343,6 +355,8 @@ class OrderProcessorTest extends TestCase
$logger = Mockery::mock(LoggerInterface::class); $logger = Mockery::mock(LoggerInterface::class);
$subscription_helper = Mockery::mock(SubscriptionHelper::class); $subscription_helper = Mockery::mock(SubscriptionHelper::class);
$order_helper = Mockery::mock(OrderHelper::class);
$testee = new OrderProcessor( $testee = new OrderProcessor(
$sessionHandler, $sessionHandler,
$orderEndpoint, $orderEndpoint,
@ -352,7 +366,8 @@ class OrderProcessorTest extends TestCase
$settings, $settings,
$logger, $logger,
$this->environment, $this->environment,
$subscription_helper $subscription_helper,
$order_helper
); );
$wcOrder $wcOrder
@ -368,6 +383,8 @@ class OrderProcessorTest extends TestCase
$orderIntent $orderIntent
); );
$order_helper->shouldReceive('contains_physical_goods')->andReturn(true);
$this->assertFalse($testee->process($wcOrder)); $this->assertFalse($testee->process($wcOrder));
$this->assertNotEmpty($testee->last_error()); $this->assertNotEmpty($testee->last_error());
} }