For Braintree, return `active` subscription status if latest transaction also succeeded

This commit is contained in:
Katherine 2023-11-16 19:15:46 -05:00 committed by GitHub
parent 84b56ae1b2
commit 7fbc327591
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 4 deletions

View File

@ -220,9 +220,11 @@ public class BraintreeManager implements SubscriptionProcessorManager {
} }
} }
private static SubscriptionStatus getSubscriptionStatus(final Subscription.Status status) { private static SubscriptionStatus getSubscriptionStatus(final Subscription.Status status, final boolean latestTransactionFailed) {
return switch (status) { return switch (status) {
case ACTIVE -> SubscriptionStatus.ACTIVE; // Stripe returns a PAST_DUE status if the subscription's most recent payment failed.
// This check ensures that Braintree is consistent with Stripe.
case ACTIVE -> latestTransactionFailed ? SubscriptionStatus.PAST_DUE : SubscriptionStatus.ACTIVE;
case CANCELED, EXPIRED -> SubscriptionStatus.CANCELED; case CANCELED, EXPIRED -> SubscriptionStatus.CANCELED;
case PAST_DUE -> SubscriptionStatus.PAST_DUE; case PAST_DUE -> SubscriptionStatus.PAST_DUE;
case PENDING -> SubscriptionStatus.INCOMPLETE; case PENDING -> SubscriptionStatus.INCOMPLETE;
@ -435,9 +437,11 @@ public class BraintreeManager implements SubscriptionProcessorManager {
final Optional<Transaction> latestTransaction = getLatestTransactionForSubscription(subscription); final Optional<Transaction> latestTransaction = getLatestTransactionForSubscription(subscription);
boolean latestTransactionFailed = false;
if (latestTransaction.isPresent()){ if (latestTransaction.isPresent()){
paymentProcessing = isPaymentProcessing(latestTransaction.get().getStatus()); paymentProcessing = isPaymentProcessing(latestTransaction.get().getStatus());
if (getPaymentStatus(latestTransaction.get().getStatus()) != PaymentStatus.SUCCEEDED) { if (getPaymentStatus(latestTransaction.get().getStatus()) != PaymentStatus.SUCCEEDED) {
latestTransactionFailed = true;
chargeFailure = createChargeFailure(latestTransaction.get()); chargeFailure = createChargeFailure(latestTransaction.get());
} }
} }
@ -450,7 +454,7 @@ public class BraintreeManager implements SubscriptionProcessorManager {
endOfCurrentPeriod, endOfCurrentPeriod,
Subscription.Status.ACTIVE == subscription.getStatus(), Subscription.Status.ACTIVE == subscription.getStatus(),
!subscription.neverExpires(), !subscription.neverExpires(),
getSubscriptionStatus(subscription.getStatus()), getSubscriptionStatus(subscription.getStatus(), latestTransactionFailed),
latestTransaction.map(this::getPaymentMethodFromTransaction).orElse(PaymentMethod.PAYPAL), latestTransaction.map(this::getPaymentMethodFromTransaction).orElse(PaymentMethod.PAYPAL),
paymentProcessing, paymentProcessing,
chargeFailure chargeFailure

View File

@ -84,7 +84,7 @@ public interface SubscriptionProcessorManager {
INCOMPLETE("incomplete"), INCOMPLETE("incomplete"),
/** /**
* Payment on the latest renewal either failed or wasn't attempted. * Payment on the latest renewal failed but there are processor retries left, or payment wasn't attempted.
*/ */
PAST_DUE("past_due"), PAST_DUE("past_due"),