From 06bfe33db260098cf46d788e02663120a3c5ba42 Mon Sep 17 00:00:00 2001 From: Emili Castells Guasch Date: Wed, 21 Jun 2023 15:42:18 +0200 Subject: [PATCH] Working on subscriptions (WIP) --- .../js/modules/Helper/Subscriptions.js | 2 +- .../resources/js/paypal-subscription.js | 2 + .../src/Helper/SubscriptionHelper.php | 4 +- .../src/SubscriptionModule.php | 213 +++++++++++++----- .../src/Checkout/DisableGateways.php | 3 +- 5 files changed, 165 insertions(+), 59 deletions(-) diff --git a/modules/ppcp-button/resources/js/modules/Helper/Subscriptions.js b/modules/ppcp-button/resources/js/modules/Helper/Subscriptions.js index 4fd4ae383..bac46fbad 100644 --- a/modules/ppcp-button/resources/js/modules/Helper/Subscriptions.js +++ b/modules/ppcp-button/resources/js/modules/Helper/Subscriptions.js @@ -4,7 +4,7 @@ export const isChangePaymentPage = () => { } export const subscriptionHasPlan = () => { - if (PayPalCommerceGateway.data_client_id.has_subscriptions) { + if (PayPalCommerceGateway.data_client_id.paypal_subscriptions_enabled && PayPalCommerceGateway.data_client_id.has_subscriptions) { if (PayPalCommerceGateway.subscription_plan_id !== '') { return true; } diff --git a/modules/ppcp-subscription/resources/js/paypal-subscription.js b/modules/ppcp-subscription/resources/js/paypal-subscription.js index c42ca2597..ae71a1b8e 100644 --- a/modules/ppcp-subscription/resources/js/paypal-subscription.js +++ b/modules/ppcp-subscription/resources/js/paypal-subscription.js @@ -15,6 +15,8 @@ document.addEventListener( subscriptionTrial.style.display = 'none'; } + console.log('testing') + const unlinkBtn = document.getElementById('ppcp_unlink_sub_plan'); unlinkBtn?.addEventListener('click', (event)=>{ event.preventDefault(); diff --git a/modules/ppcp-subscription/src/Helper/SubscriptionHelper.php b/modules/ppcp-subscription/src/Helper/SubscriptionHelper.php index 2250296b2..6bd1e40fe 100644 --- a/modules/ppcp-subscription/src/Helper/SubscriptionHelper.php +++ b/modules/ppcp-subscription/src/Helper/SubscriptionHelper.php @@ -176,10 +176,8 @@ class SubscriptionHelper { * @throws NotFoundException If setting is not found. */ public function checkout_subscription_product_allowed(): bool { - $subscription_mode = $this->settings->has( 'subscriptions_mode' ) ? $this->settings->get( 'subscriptions_mode' ) : ''; if ( - $subscription_mode !== 'subscriptions_api' - || ! $this->paypal_subscription_id() + ! $this->paypal_subscription_id() || ! $this->cart_contains_only_one_item() ) { return false; diff --git a/modules/ppcp-subscription/src/SubscriptionModule.php b/modules/ppcp-subscription/src/SubscriptionModule.php index 7c6d71a7c..c9ba156fc 100644 --- a/modules/ppcp-subscription/src/SubscriptionModule.php +++ b/modules/ppcp-subscription/src/SubscriptionModule.php @@ -11,6 +11,7 @@ namespace WooCommerce\PayPalCommerce\Subscription; use Exception; use WC_Product; +use WC_Product_Subscription_Variation; use WC_Subscriptions_Product; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\BillingSubscriptions; use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException; @@ -178,7 +179,7 @@ class SubscriptionModule implements ModuleInterface { //phpcs:disable WordPress.Security.NonceVerification.Recommended $post_id = wc_clean( wp_unslash( $_GET['post'] ?? '' ) ); $product = wc_get_product( $post_id ); - if ( ! is_a( $product, WC_Product::class ) || ! WC_Subscriptions_Product::is_subscription( $product ) ) { + if ( ! ( is_a( $product, WC_Product::class) || is_a( $product, WC_Product_Subscription_Variation::class) ) || ! WC_Subscriptions_Product::is_subscription( $product ) ) { return; } @@ -463,40 +464,28 @@ class SubscriptionModule implements ModuleInterface { return; } - $enable_subscription_product = wc_clean( wp_unslash( $_POST['_ppcp_enable_subscription_product'] ?? '' ) ); - $product->update_meta_data( '_ppcp_enable_subscription_product', $enable_subscription_product ); - $product->save(); - - if ( $product->get_type() === 'subscription' && $enable_subscription_product === 'yes' ) { - $subscriptions_api_handler = $c->get( 'subscription.api-handler' ); - assert( $subscriptions_api_handler instanceof SubscriptionsApiHandler ); - - if ( $product->meta_exists( 'ppcp_subscription_product' ) && $product->meta_exists( 'ppcp_subscription_plan' ) ) { - $subscriptions_api_handler->update_product( $product ); - $subscriptions_api_handler->update_plan( $product ); - return; - } - - if ( ! $product->meta_exists( 'ppcp_subscription_product' ) ) { - $subscriptions_api_handler->create_product( $product ); - } - - if ( $product->meta_exists( 'ppcp_subscription_product' ) && ! $product->meta_exists( 'ppcp_subscription_plan' ) ) { - $subscription_plan_name = wc_clean( wp_unslash( $_POST['_ppcp_subscription_plan_name'] ?? '' ) ); - if ( ! is_string( $subscription_plan_name ) ) { - return; - } - - $product->update_meta_data( '_ppcp_subscription_plan_name', $subscription_plan_name ); - $product->save(); - - $subscriptions_api_handler->create_plan( $subscription_plan_name, $product ); - } - } + $subscriptions_api_handler = $c->get('subscription.api-handler'); + assert($subscriptions_api_handler instanceof SubscriptionsApiHandler); + $this->update_subscription_product_meta($product, $subscriptions_api_handler); }, 12 ); + add_action('woocommerce_save_product_variation', function($variation_id) use($c){ + if ( ! WC_Subscriptions_Product::is_subscription( $variation_id ) || empty( $_POST['_wcsnonce_save_variations'] ) || ! wp_verify_nonce( $_POST['_wcsnonce_save_variations'], 'wcs_subscription_variations' ) ) { + return; + } + + $product = wc_get_product( $variation_id ); + if ( ! is_a( $product, WC_Product_Subscription_Variation::class ) ) { + return; + } + + $subscriptions_api_handler = $c->get('subscription.api-handler'); + assert($subscriptions_api_handler instanceof SubscriptionsApiHandler); + $this->update_subscription_product_meta($product, $subscriptions_api_handler); + }); + add_action( 'woocommerce_process_shop_subscription_meta', /** @@ -705,6 +694,32 @@ class SubscriptionModule implements ModuleInterface { } ); + add_action( + 'woocommerce_variation_options_pricing', + function( $loop, $variation_data, $variation ) use ( $c ) { + $settings = $c->get( 'wcgateway.settings' ); + assert( $settings instanceof Settings ); + + try { + $subscriptions_mode = $settings->get( 'subscriptions_mode' ); + if ( $subscriptions_mode === 'subscriptions_api' ) { + $product = wc_get_product( $variation->ID ); + if ( ! is_a( $product, WC_Product_Subscription_Variation::class ) ) { + return; + } + + $environment = $c->get( 'onboarding.environment' ); + $this->render_paypal_subscription_fields( $product, $environment ); + + } + } catch ( NotFoundException $exception ) { + return; + } + }, + 10, + 3 + ); + add_action( 'woocommerce_product_options_general_product_data', function() use ( $c ) { @@ -725,29 +740,8 @@ class SubscriptionModule implements ModuleInterface { return; } - $enable_subscription_product = $product->get_meta( '_ppcp_enable_subscription_product' ); - $subscription_plan_name = $product->get_meta( '_ppcp_subscription_plan_name' ); - - echo ''; + $environment = $c->get( 'onboarding.environment' ); + $this->render_paypal_subscription_fields( $product, $environment ); } } catch ( NotFoundException $exception ) { return; @@ -832,4 +826,115 @@ class SubscriptionModule implements ModuleInterface { } ); } + + /** + * Render PayPal Subscriptions fields. + * + * @param WC_Product $product WC Product. + * @param Environment $environment The environment. + * @return void + */ + private function render_paypal_subscription_fields( WC_Product $product, Environment $environment ): void { + $enable_subscription_product = $product->get_meta( '_ppcp_enable_subscription_product' ); + $subscription_plan_name = $product->get_meta( '_ppcp_subscription_plan_name' ); + + //echo ''; + } + + /** + * Updates subscription product meta. + * + * @param WC_Product $product + * @param SubscriptionsApiHandler $subscriptions_api_handler + * @return void + */ + private function update_subscription_product_meta(WC_Product $product, SubscriptionsApiHandler $subscriptions_api_handler): void + { + $enable_subscription_product = wc_clean(wp_unslash($_POST['_ppcp_enable_subscription_product'] ?? '')); + $product->update_meta_data('_ppcp_enable_subscription_product', $enable_subscription_product); + $product->save(); + + if (($product->get_type() === 'subscription' || $product->get_type() === 'subscription_variation') && $enable_subscription_product === 'yes') { + if ($product->meta_exists('ppcp_subscription_product') && $product->meta_exists('ppcp_subscription_plan')) { + $subscriptions_api_handler->update_product($product); + $subscriptions_api_handler->update_plan($product); + return; + } + + if (!$product->meta_exists('ppcp_subscription_product')) { + $subscriptions_api_handler->create_product($product); + } + + if ($product->meta_exists('ppcp_subscription_product') && !$product->meta_exists('ppcp_subscription_plan')) { + $subscription_plan_name = wc_clean(wp_unslash($_POST['_ppcp_subscription_plan_name'] ?? '')); + if (!is_string($subscription_plan_name)) { + return; + } + + $product->update_meta_data('_ppcp_subscription_plan_name', $subscription_plan_name); + $product->save(); + + $subscriptions_api_handler->create_plan($subscription_plan_name, $product); + } + } + } } diff --git a/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php b/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php index e5078ae3f..d2f07d7f1 100644 --- a/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php +++ b/modules/ppcp-wc-gateway/src/Checkout/DisableGateways.php @@ -124,8 +124,9 @@ class DisableGateways { return true; } + $subscription_mode = $this->settings->has( 'subscriptions_mode' ) ? $this->settings->get( 'subscriptions_mode' ) : ''; if ( - is_checkout() + (is_checkout() && $subscription_mode === 'subscriptions_api') && $this->subscription_helper->cart_contains_subscription() && ! $this->subscription_helper->checkout_subscription_product_allowed() ) {