Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use fallback methods for updating the next payment date after migrating a stripe billing subscription #7176

Merged
merged 10 commits into from
Sep 14, 2023

Conversation

james-allan
Copy link
Contributor

Changes proposed in this Pull Request

This PR introduces multiple fallback mechanisms for updating a subscription's next payment date when it's migrated from Stripe Billing to on-site billing via tokens.

Prior to this PR it simply added 1 second to the current next payment date if it existed and it was in the future.

This still remains the 1st approach, however there's now 2 additional mechanisms if that first check fails (current next payment date is in the past for some reason):

  1. If the Stripe Billing subscription's current_period_end is in the future, use it.
  2. If all previous checks fail, attempt to calculate a new date using the $subscription->calculate_date().

If all 3 fail, something has seriously gone wrong somewhere along the line and an error is logged to the migration log.

Testing

Setup

  • Enable Stripe Billing.
  • Purchase any number of subscriptions using Stripe Billing.
  • You can use the following code snippet to start a migration for each test.
do_action( 'wcpay_migrate_subscription', 2995 ); 

Testing scenarios

  • Standard test
    1. Run the migration (see code example above).
    2. Look at the woopayments-subscription-migration log file you should notice that the new next payment date is updated by 1 sec.
    3. Check the admin subscription list table and confirm the subscription has a matching next payment date and scheduled action.
DEBUG Migrating subscription #2991.
DEBUG ---- Stripe subscription (sub_1NpN5KFyDQrVWdZ2xYQ3hGi7) has "active" status. Canceling the subscription.
DEBUG ---- Stripe subscription (sub_1NpN5KFyDQrVWdZ2xYQ3hGi7) successfully canceled.
DEBUG ---- Next payment date updated to 2023-12-12 03:16:18 to ensure subscription #2991 has a pending scheduled payment.
DEBUG ---- SUCCESS: Subscription #2991 migrated.
  • No next payment date.
    1. Delete the _schedule_next_payment meta.
    2. Run the migration (see code example above).
    3. Look at the woopayments-subscription-migration log file you should notice that the new next payment date is pulled from Stripe.
    4. Check the admin subscription list table and confirm the subscription has a matching next payment date and scheduled action.
 DEBUG Migrating subscription #2982.
 DEBUG ---- Stripe subscription (sub_1NpMxJFyDQrVWdZ28kGOsxEd) has "active" status. Canceling the subscription.
 DEBUG ---- Stripe subscription (sub_1NpMxJFyDQrVWdZ28kGOsxEd) successfully canceled.
 DEBUG ---- Next payment date updated to 2023-10-13 04:28:55 to match Stripe subscription record and to ensure subscription #2982 has a pending scheduled payment.
 DEBUG ---- SUCCESS: Subscription #2982 migrated.
 DEBUG Migrating subscription #2983.
  • No next payment date and no Stripe data
    1. Delete the _schedule_next_payment meta.
    2. Edit the update_next_payment_date() code to simulate missing current_period_end.
    3. Run the migration (see code example above).
    4. Look at the woopayments-subscription-migration log file you should notice that the new next payment date is calculated.
    5. Check the admin subscription list table and confirm the subscription has a matching next payment date and scheduled action.
unset( $wcpay_subscription['current_period_end'] );
Migrating subscription #2993.
DEBUG ---- Stripe subscription (sub_1NpNIuFyDQrVWdZ2WoCweKMW) has "active" status. Canceling the subscription.
DEBUG ---- Stripe subscription (sub_1NpNIuFyDQrVWdZ2WoCweKMW) successfully canceled.
DEBUG ---- Calculated a new next payment date (2023-09-19 03:30:29) to ensure subscription #2993 has a pending scheduled payment in the future.
DEBUG ---- SUCCESS: Subscription #2993 migrated.
  • No next payment date, no Stripe data and a failed attempt to calculate a date
    1. Delete the _schedule_next_payment meta.
    2. Edit the update_next_payment_date() code to simulate missing current_period_end.
    3. Edit the update_next_payment_date() code to simulate $subscription->calculate_date() returning an invalid date.
    4. Run the migration (see code example above).
    5. Look at the woopayments-subscription-migration log file you should notice an error message.
// Return a date that is in the past. 
$new_next_payment = gmdate( 'Y-m-d H:i:s', time() - ( HOUR_IN_SECONDS * 5 ) );
DEBUG Migrating subscription #2995.
DEBUG ---- Stripe subscription (sub_1NpNLkFyDQrVWdZ2dcwyvvZI) has "active" status. Canceling the subscription.
DEBUG ---- Stripe subscription (sub_1NpNLkFyDQrVWdZ2dcwyvvZI) successfully canceled.
DEBUG ---- ERROR: Failed to update subscription #2995 next payment date. Current next payment date (1970-01-01 00:00:00) is in the past, Stripe "current_period_end" data is invalid (1970-01-01 00:00:00) and an attempt to calculate a new date also failed (2023-09-12 02:36:46).
DEBUG Migrating subscription #2997.
DEBUG ---- Stripe subscription (sub_1NpOEMFyDQrVWdZ2RPC9XyqV) has "active" status. Canceling the subscription.
DEBUG ---- Stripe subscription (sub_1NpOEMFyDQrVWdZ2RPC9XyqV) successfully canceled.
DEBUG ---- ERROR: Failed to update subscription #2997 next payment date. Current next payment date (1970-01-01 00:00:00) is in the past, Stripe "current_period_end" data is invalid (no data) and an attempt to calculate a new date also failed (2023-09-11 23:30:14).

  • Run npm run changelog to add a changelog file, choose patch to leave it empty if the change is not significant. You can add multiple changelog files in one PR by running this command a few times.
  • Covered with tests (or have a good reason not to test in description ☝️)
  • Tested on mobile (or does not apply)

Post merge

@botwoo
Copy link
Collaborator

botwoo commented Sep 12, 2023

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 7176 or branch name update/subscription-next-payment-on-migrate in your-test.site/wp-admin/admin.php?page=jetpack-beta&plugin=woocommerce-payments

Option 2. Jurassic Ninja - available for logged-in A12s

🚀 Launch a JN site with this branch 🚀

ℹ️ Install this Tampermonkey script to get more options.


Build info:

  • Latest commit: 8448d15
  • Build time: 2023-09-14 22:30:40 UTC

Note: the build is updated when a new commit is pushed to this PR.

@github-actions
Copy link
Contributor

github-actions bot commented Sep 12, 2023

Size Change: 0 B

Total Size: 1.41 MB

ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/admin.css 1.03 kB
release/woocommerce-payments/assets/css/success.css 158 B
release/woocommerce-payments/dist/blocks-checkout-rtl.css 1.51 kB
release/woocommerce-payments/dist/blocks-checkout.css 1.51 kB
release/woocommerce-payments/dist/blocks-checkout.js 73.6 kB
release/woocommerce-payments/dist/checkout-rtl.css 440 B
release/woocommerce-payments/dist/checkout.css 441 B
release/woocommerce-payments/dist/checkout.js 28.6 kB
release/woocommerce-payments/dist/index-rtl.css 36 kB
release/woocommerce-payments/dist/index.css 36 kB
release/woocommerce-payments/dist/index.js 278 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.05 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 2.87 kB
release/woocommerce-payments/dist/multi-currency-switcher-block.js 59.8 kB
release/woocommerce-payments/dist/multi-currency.css 2.87 kB
release/woocommerce-payments/dist/multi-currency.js 54.4 kB
release/woocommerce-payments/dist/order-rtl.css 675 B
release/woocommerce-payments/dist/order.css 676 B
release/woocommerce-payments/dist/order.js 40.5 kB
release/woocommerce-payments/dist/payment-gateways-rtl.css 686 B
release/woocommerce-payments/dist/payment-gateways.css 688 B
release/woocommerce-payments/dist/payment-gateways.js 38 kB
release/woocommerce-payments/dist/payment-request-rtl.css 146 B
release/woocommerce-payments/dist/payment-request.css 146 B
release/woocommerce-payments/dist/payment-request.js 11.6 kB
release/woocommerce-payments/dist/product-details.js 789 B
release/woocommerce-payments/dist/settings-rtl.css 8.9 kB
release/woocommerce-payments/dist/settings.css 8.91 kB
release/woocommerce-payments/dist/settings.js 231 kB
release/woocommerce-payments/dist/subscription-edit-page.js 669 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal-rtl.css 519 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.css 519 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.js 20.2 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 693 B
release/woocommerce-payments/dist/subscriptions-empty-state-rtl.css 117 B
release/woocommerce-payments/dist/subscriptions-empty-state.css 117 B
release/woocommerce-payments/dist/subscriptions-empty-state.js 19.3 kB
release/woocommerce-payments/dist/tos-rtl.css 230 B
release/woocommerce-payments/dist/tos.css 231 B
release/woocommerce-payments/dist/tos.js 21.8 kB
release/woocommerce-payments/dist/upe_checkout-rtl.css 440 B
release/woocommerce-payments/dist/upe_checkout.css 441 B
release/woocommerce-payments/dist/upe_checkout.js 34 kB
release/woocommerce-payments/dist/upe_split_checkout-rtl.css 440 B
release/woocommerce-payments/dist/upe_split_checkout.css 441 B
release/woocommerce-payments/dist/upe_split_checkout.js 34.6 kB
release/woocommerce-payments/dist/upe_with_deferred_intent_creation_checkout.js 36.5 kB
release/woocommerce-payments/dist/upe-blocks-checkout-rtl.css 1.51 kB
release/woocommerce-payments/dist/upe-blocks-checkout.css 1.51 kB
release/woocommerce-payments/dist/upe-blocks-checkout.js 39.5 kB
release/woocommerce-payments/dist/upe-split-blocks-checkout-rtl.css 1.51 kB
release/woocommerce-payments/dist/upe-split-blocks-checkout.css 1.51 kB
release/woocommerce-payments/dist/upe-split-blocks-checkout.js 41 kB
release/woocommerce-payments/dist/woopay-express-button-rtl.css 146 B
release/woocommerce-payments/dist/woopay-express-button.css 146 B
release/woocommerce-payments/dist/woopay-express-button.js 50.6 kB
release/woocommerce-payments/dist/woopay-rtl.css 3.85 kB
release/woocommerce-payments/dist/woopay.css 3.85 kB
release/woocommerce-payments/dist/woopay.js 71.6 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 633 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 720 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.43 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.01 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-ajax.js 522 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-callables.js 581 B
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/babel.config.js 160 B
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.css 2.32 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.js 13.8 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.rtl.css 2.32 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.2 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-empty-state.css 291 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-order-statuses.css 403 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin.css 3.56 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/checkout.css 299 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/modal.css 742 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/view-subscription.css 572 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/wcs-upgrade.css 411 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin-pointers.js 544 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js 9.63 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.js 6.8 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.min.js 3.83 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-coupon.js 544 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-subscription.js 2.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.js 22.1 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.min.js 11.6 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/payment-method-restrictions.js 1.29 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/wcs-meta-boxes-order.js 502 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/payment-methods.js 355 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/single-product.js 429 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/view-subscription.js 1.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/wcs-cart.js 781 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/modal.js 1.1 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/wcs-upgrade.js 1.27 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.css 392 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.js 3.06 kB

compressed-size-action

Copy link
Contributor

@mattallan mattallan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've tested migrating subscriptions under the following cases:

  • use existing date just add a second (+1 second)
  • delete next payment date and use stripe billing date
  • delete next payment date in the stripe subscription data
  • delete next payment date non-woopayments subscription and confirm it calculates date
  • test calculating an invalid date
  • test exception thrown in udpate_dates

I didn't come across any issues.

P.S. I pushed up a small change as per our discussion to remove the "SUCCESS" log because there are some cases were migration completes with errors that aren't recoverable or would not produce any different outcome if retried so we finish the migration.

@james-allan james-allan added this pull request to the merge queue Sep 14, 2023
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to no response for status checks Sep 14, 2023
@james-allan
Copy link
Contributor Author

Merging with just the php 7.3 check stuck in limbo. It was broken in #7134 and is being reverted in #7213.

@james-allan james-allan merged commit cda8ef4 into develop Sep 14, 2023
27 checks passed
@james-allan james-allan deleted the update/subscription-next-payment-on-migrate branch September 14, 2023 23:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants