From 0a993f854df58b7eeb8d8a1e11a2267b8ab5e44f Mon Sep 17 00:00:00 2001 From: dinamiko Date: Thu, 2 Jun 2022 15:11:01 +0200 Subject: [PATCH] Do not check order approved status if it does not contains physical goods --- modules/ppcp-api-client/services.php | 4 +++ .../src/Helper/OrderHelper.php | 34 +++++++++++++++++++ modules/ppcp-button/services.php | 2 ++ .../src/Endpoint/ApproveOrderEndpoint.php | 14 ++++++-- modules/ppcp-wc-gateway/services.php | 4 ++- .../src/Processor/OrderProcessor.php | 15 ++++++-- .../Processor/OrderProcessorTest.php | 23 +++++++++++-- 7 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 modules/ppcp-api-client/src/Helper/OrderHelper.php diff --git a/modules/ppcp-api-client/services.php b/modules/ppcp-api-client/services.php index 24bcd1a21..6be5355be 100644 --- a/modules/ppcp-api-client/services.php +++ b/modules/ppcp-api-client/services.php @@ -47,6 +47,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookEventFactory; use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory; use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache; use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies; +use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper; use WooCommerce\PayPalCommerce\ApiClient\Repository\ApplicationContextRepository; use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository; use WooCommerce\PayPalCommerce\ApiClient\Repository\CustomerRepository; @@ -671,4 +672,7 @@ return array( 'SE', ); }, + 'api.order-helper' => static function( ContainerInterface $container ): OrderHelper { + return new OrderHelper(); + }, ); diff --git a/modules/ppcp-api-client/src/Helper/OrderHelper.php b/modules/ppcp-api-client/src/Helper/OrderHelper.php new file mode 100644 index 000000000..79a5d78c0 --- /dev/null +++ b/modules/ppcp-api-client/src/Helper/OrderHelper.php @@ -0,0 +1,34 @@ +purchase_units() as $unit ) { + if ( $unit->contains_physical_goods() ) { + return true; + } + } + + return false; + } +} diff --git a/modules/ppcp-button/services.php b/modules/ppcp-button/services.php index 227dc2fb5..f8b6c415e 100644 --- a/modules/ppcp-button/services.php +++ b/modules/ppcp-button/services.php @@ -151,6 +151,7 @@ return array( $three_d_secure = $container->get( 'button.helper.three-d-secure' ); $settings = $container->get( 'wcgateway.settings' ); $dcc_applies = $container->get( 'api.helpers.dccapplies' ); + $order_helper = $container->get( 'api.order-helper' ); $logger = $container->get( 'woocommerce.logger.woocommerce' ); return new ApproveOrderEndpoint( $request_data, @@ -159,6 +160,7 @@ return array( $three_d_secure, $settings, $dcc_applies, + $order_helper, $logger ); }, diff --git a/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php b/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php index bfbde9923..f9966aea6 100644 --- a/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php +++ b/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php @@ -16,6 +16,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus; use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException; use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies; +use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper; use WooCommerce\PayPalCommerce\Button\Exception\RuntimeException; use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure; use WooCommerce\PayPalCommerce\Session\SessionHandler; @@ -26,7 +27,6 @@ use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; */ class ApproveOrderEndpoint implements EndpointInterface { - const ENDPOINT = 'ppc-approve-order'; /** @@ -71,6 +71,13 @@ class ApproveOrderEndpoint implements EndpointInterface { */ private $dcc_applies; + /** + * The order helper. + * + * @var OrderHelper + */ + protected $order_helper; + /** * The logger. * @@ -87,6 +94,7 @@ class ApproveOrderEndpoint implements EndpointInterface { * @param ThreeDSecure $three_d_secure The 3d secure helper object. * @param Settings $settings The settings. * @param DccApplies $dcc_applies The DCC applies object. + * @param OrderHelper $order_helper The order helper. * @param LoggerInterface $logger The logger. */ public function __construct( @@ -96,6 +104,7 @@ class ApproveOrderEndpoint implements EndpointInterface { ThreeDSecure $three_d_secure, Settings $settings, DccApplies $dcc_applies, + OrderHelper $order_helper, LoggerInterface $logger ) { @@ -105,6 +114,7 @@ class ApproveOrderEndpoint implements EndpointInterface { $this->threed_secure = $three_d_secure; $this->settings = $settings; $this->dcc_applies = $dcc_applies; + $this->order_helper = $order_helper; $this->logger = $logger; } @@ -173,7 +183,7 @@ class ApproveOrderEndpoint implements EndpointInterface { 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( // translators: %s is the id of the order. __( 'Order %s is not approved yet.', 'woocommerce-paypal-payments' ), diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index afef63285..5a477efa1 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -218,6 +218,7 @@ return array( $environment = $container->get( 'onboarding.environment' ); $logger = $container->get( 'woocommerce.logger.woocommerce' ); $subscription_helper = $container->get( 'subscription.helper' ); + $order_helper = $container->get('api.order-helper'); return new OrderProcessor( $session_handler, $order_endpoint, @@ -227,7 +228,8 @@ return array( $settings, $logger, $environment, - $subscription_helper + $subscription_helper, + $order_helper ); }, 'wcgateway.processor.refunds' => static function ( ContainerInterface $container ): RefundProcessor { diff --git a/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php b/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php index b1d3358bd..7c5de5c88 100644 --- a/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php +++ b/modules/ppcp-wc-gateway/src/Processor/OrderProcessor.php @@ -14,6 +14,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Entity\Order; use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus; use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory; +use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper; use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure; use WooCommerce\PayPalCommerce\Onboarding\Environment; use WooCommerce\PayPalCommerce\Session\SessionHandler; @@ -106,6 +107,13 @@ class OrderProcessor { */ private $subscription_helper; + /** + * The order helper. + * + * @var OrderHelper + */ + private $order_helper; + /** * OrderProcessor constructor. * @@ -118,6 +126,7 @@ class OrderProcessor { * @param LoggerInterface $logger A logger service. * @param Environment $environment The environment. * @param SubscriptionHelper $subscription_helper The subscription helper. + * @param OrderHelper $order_helper The order helper. */ public function __construct( SessionHandler $session_handler, @@ -128,7 +137,8 @@ class OrderProcessor { Settings $settings, LoggerInterface $logger, Environment $environment, - SubscriptionHelper $subscription_helper + SubscriptionHelper $subscription_helper, + OrderHelper $order_helper ) { $this->session_handler = $session_handler; @@ -140,6 +150,7 @@ class OrderProcessor { $this->environment = $environment; $this->logger = $logger; $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 ); $error_message = null; - if ( ! $this->order_is_approved( $order ) ) { + if ( $this->order_helper->contains_physical_goods( $order ) && ! $this->order_is_approved( $order ) ) { $error_message = __( 'The payment has not been approved yet.', 'woocommerce-paypal-payments' diff --git a/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php b/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php index ae051a68c..55badb305 100644 --- a/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php +++ b/tests/PHPUnit/WcGateway/Processor/OrderProcessorTest.php @@ -16,6 +16,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus; use WooCommerce\PayPalCommerce\ApiClient\Entity\Payments; use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit; use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory; +use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper; use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure; use WooCommerce\PayPalCommerce\Onboarding\Environment; use WooCommerce\PayPalCommerce\Session\SessionHandler; @@ -129,6 +130,8 @@ class OrderProcessorTest extends TestCase $subscription_helper = Mockery::mock(SubscriptionHelper::class); $subscription_helper->shouldReceive('has_subscription'); + $order_helper = Mockery::mock(OrderHelper::class); + $testee = new OrderProcessor( $sessionHandler, $orderEndpoint, @@ -138,7 +141,8 @@ class OrderProcessorTest extends TestCase $settings, $logger, $this->environment, - $subscription_helper + $subscription_helper, + $order_helper ); $wcOrder @@ -165,6 +169,8 @@ class OrderProcessorTest extends TestCase $wcOrder->expects('set_transaction_id') ->with($transactionId); + $order_helper->shouldReceive('contains_physical_goods')->andReturn(true); + $this->assertTrue($testee->process($wcOrder)); } @@ -247,6 +253,8 @@ class OrderProcessorTest extends TestCase $logger = Mockery::mock(LoggerInterface::class); $subscription_helper = Mockery::mock(SubscriptionHelper::class); + $order_helper = Mockery::mock(OrderHelper::class); + $testee = new OrderProcessor( $sessionHandler, $orderEndpoint, @@ -256,7 +264,8 @@ class OrderProcessorTest extends TestCase $settings, $logger, $this->environment, - $subscription_helper + $subscription_helper, + $order_helper ); $wcOrder @@ -277,6 +286,9 @@ class OrderProcessorTest extends TestCase ->with($transactionId); $wcOrder ->expects('payment_complete'); + + $order_helper->shouldReceive('contains_physical_goods')->andReturn(true); + $this->assertTrue($testee->process($wcOrder)); } @@ -343,6 +355,8 @@ class OrderProcessorTest extends TestCase $logger = Mockery::mock(LoggerInterface::class); $subscription_helper = Mockery::mock(SubscriptionHelper::class); + $order_helper = Mockery::mock(OrderHelper::class); + $testee = new OrderProcessor( $sessionHandler, $orderEndpoint, @@ -352,7 +366,8 @@ class OrderProcessorTest extends TestCase $settings, $logger, $this->environment, - $subscription_helper + $subscription_helper, + $order_helper ); $wcOrder @@ -368,6 +383,8 @@ class OrderProcessorTest extends TestCase $orderIntent ); + $order_helper->shouldReceive('contains_physical_goods')->andReturn(true); + $this->assertFalse($testee->process($wcOrder)); $this->assertNotEmpty($testee->last_error()); }