From a2d02cd7f4399f15da4f684757fd22339425e92e Mon Sep 17 00:00:00 2001 From: Emili Castells Guasch Date: Fri, 20 Sep 2024 12:15:11 +0200 Subject: [PATCH] Extrat update subscription status logic to its own class --- .../ppcp-paypal-subscriptions/services.php | 6 ++ .../src/PayPalSubscriptionsModule.php | 57 ++--------- .../src/SubscriptionStatus.php | 96 +++++++++++++++++++ 3 files changed, 111 insertions(+), 48 deletions(-) create mode 100644 modules/ppcp-paypal-subscriptions/src/SubscriptionStatus.php diff --git a/modules/ppcp-paypal-subscriptions/services.php b/modules/ppcp-paypal-subscriptions/services.php index 4e64e678b..a39a84c8a 100644 --- a/modules/ppcp-paypal-subscriptions/services.php +++ b/modules/ppcp-paypal-subscriptions/services.php @@ -40,4 +40,10 @@ return array( dirname( realpath( __FILE__ ), 3 ) . '/woocommerce-paypal-payments.php' ); }, + 'paypal-subscriptions.status' => static function ( ContainerInterface $container ): SubscriptionStatus { + return new SubscriptionStatus( + $container->get( 'api.endpoint.billing-subscriptions' ), + $container->get( 'woocommerce.logger.woocommerce' ) + ); + }, ); diff --git a/modules/ppcp-paypal-subscriptions/src/PayPalSubscriptionsModule.php b/modules/ppcp-paypal-subscriptions/src/PayPalSubscriptionsModule.php index 07dd5c8c6..ba88097be 100644 --- a/modules/ppcp-paypal-subscriptions/src/PayPalSubscriptionsModule.php +++ b/modules/ppcp-paypal-subscriptions/src/PayPalSubscriptionsModule.php @@ -189,6 +189,9 @@ class PayPalSubscriptionsModule implements ServiceModule, ExtendingModule, Execu 30 ); + /** + * Executed when updating WC Subscription. + */ add_action( 'woocommerce_process_shop_subscription_meta', /** @@ -196,65 +199,23 @@ class PayPalSubscriptionsModule implements ServiceModule, ExtendingModule, Execu * * @psalm-suppress MissingClosureParamType */ - function( $id, $post ) use ( $c ) { + function( $id ) use ( $c ) { $subscription = wcs_get_subscription( $id ); if ( ! is_a( $subscription, WC_Subscription::class ) ) { return; } + $subscription_id = $subscription->get_meta( 'ppcp_subscription' ) ?? ''; if ( ! $subscription_id ) { return; } - $subscriptions_endpoint = $c->get( 'api.endpoint.billing-subscriptions' ); - assert( $subscriptions_endpoint instanceof BillingSubscriptions ); - if ( $subscription->get_status() === 'cancelled' ) { - try { - $subscriptions_endpoint->cancel( $subscription_id ); - } catch ( RuntimeException $exception ) { - $error = $exception->getMessage(); - if ( is_a( $exception, PayPalApiException::class ) ) { - $error = $exception->get_details( $error ); - } + $subscription_status = $c->get( 'paypal-subscriptions.status' ); + assert( $subscription_status instanceof SubscriptionStatus ); - $logger = $c->get( 'woocommerce.logger.woocommerce' ); - $logger->error( 'Could not cancel subscription product on PayPal. ' . $error ); - } - } - - if ( $subscription->get_status() === 'pending-cancel' ) { - try { - $subscriptions_endpoint->suspend( $subscription_id ); - } catch ( RuntimeException $exception ) { - $error = $exception->getMessage(); - if ( is_a( $exception, PayPalApiException::class ) ) { - $error = $exception->get_details( $error ); - } - - $logger = $c->get( 'woocommerce.logger.woocommerce' ); - $logger->error( 'Could not suspend subscription product on PayPal. ' . $error ); - } - } - - if ( $subscription->get_status() === 'active' ) { - try { - $current_subscription = $subscriptions_endpoint->subscription( $subscription_id ); - if ( $current_subscription->status === 'SUSPENDED' ) { - $subscriptions_endpoint->activate( $subscription_id ); - } - } catch ( RuntimeException $exception ) { - $error = $exception->getMessage(); - if ( is_a( $exception, PayPalApiException::class ) ) { - $error = $exception->get_details( $error ); - } - - $logger = $c->get( 'woocommerce.logger.woocommerce' ); - $logger->error( 'Could not reactivate subscription product on PayPal. ' . $error ); - } - } + $subscription_status->update_status( $subscription->get_status(), $subscription_id ); }, - 20, - 2 + 20 ); add_filter( diff --git a/modules/ppcp-paypal-subscriptions/src/SubscriptionStatus.php b/modules/ppcp-paypal-subscriptions/src/SubscriptionStatus.php new file mode 100644 index 000000000..f5a0217ac --- /dev/null +++ b/modules/ppcp-paypal-subscriptions/src/SubscriptionStatus.php @@ -0,0 +1,96 @@ +subscriptions_endpoint = $subscriptions_endpoint; + $this->logger = $logger; + } + + /** + * Updates PayPal subscription status from the given WC Subscription status. + * + * @param string $subscription_status The WC Subscription status. + * @param string $subscription_id The PayPal Subscription ID. + * @return void + */ + public function update_status(string $subscription_status, string $subscription_id): void { + if ($subscription_status === 'cancelled') { + try { + $this->subscriptions_endpoint->cancel($subscription_id); + } catch (RuntimeException $exception) { + + $this->logger->error('Could not cancel subscription product on PayPal. ' + . $this->get_error($exception)); + } + } + + if ($subscription_status === 'pending-cancel') { + try { + $this->subscriptions_endpoint->suspend($subscription_id); + } catch (RuntimeException $exception) { + $this->logger->error('Could not suspend subscription product on PayPal. ' + . $this->get_error($exception)); + } + } + + if ($subscription_status === 'active') { + try { + $current_subscription = $this->subscriptions_endpoint->subscription($subscription_id); + if ($current_subscription->status === 'SUSPENDED') { + $this->subscriptions_endpoint->activate($subscription_id); + } + } catch (RuntimeException $exception) { + $this->logger->error('Could not reactivate subscription product on PayPal. ' + . $this->get_error($exception)); + } + } + } + + /** + * Get error from exception. + * + * @param RuntimeException $exception The exception. + * @return string + */ + private function get_error(RuntimeException $exception): string { + $error = $exception->getMessage(); + if (is_a($exception, PayPalApiException::class)) { + $error = $exception->get_details($error); + } + + return $error; + } +}