Use payment success timestamp to calculate recurring donation badge expiration

This commit is contained in:
Katherine
2023-12-12 07:01:20 -08:00
committed by GitHub
parent 6c7a3df5ae
commit 3cbbf37468
7 changed files with 30 additions and 11 deletions

View File

@@ -542,7 +542,7 @@ public class BraintreeManager implements SubscriptionProcessorManager {
.build());
}
final Instant expiration = transaction.getSubscriptionDetails().getBillingPeriodEndDate().toInstant();
final Instant paidAt = transaction.getSubscriptionDetails().getBillingPeriodStartDate().toInstant();
final Plan plan = braintreeGateway.plan().find(transaction.getPlanId());
final BraintreePlanMetadata metadata;
@@ -553,7 +553,7 @@ public class BraintreeManager implements SubscriptionProcessorManager {
throw new RuntimeException(e);
}
return new ReceiptItem(transaction.getId(), expiration, metadata.level());
return new ReceiptItem(transaction.getId(), paidAt, metadata.level());
})
.orElseThrow(() -> new WebApplicationException(Response.Status.NO_CONTENT)));
}

View File

@@ -606,14 +606,22 @@ public class StripeManager implements SubscriptionProcessorManager {
}
InvoiceLineItem subscriptionLineItem = subscriptionLineItems.stream().findAny().get();
return getReceiptForSubscriptionInvoiceLineItem(subscriptionLineItem);
return getReceiptForSubscription(subscriptionLineItem, latestSubscriptionInvoice);
});
}
private CompletableFuture<ReceiptItem> getReceiptForSubscriptionInvoiceLineItem(InvoiceLineItem subscriptionLineItem) {
private CompletableFuture<ReceiptItem> getReceiptForSubscription(InvoiceLineItem subscriptionLineItem,
Invoice invoice) {
final Instant paidAt;
if (invoice.getStatusTransitions().getPaidAt() != null) {
paidAt = Instant.ofEpochSecond(invoice.getStatusTransitions().getPaidAt());
} else {
logger.warn("No paidAt timestamp exists for paid invoice {}, falling back to end of subscription period", invoice.getId());
paidAt = Instant.ofEpochSecond(subscriptionLineItem.getPeriod().getEnd());
}
return getProductForPrice(subscriptionLineItem.getPrice().getId()).thenApply(product -> new ReceiptItem(
subscriptionLineItem.getId(),
Instant.ofEpochSecond(subscriptionLineItem.getPeriod().getEnd()),
paidAt,
getLevelForProduct(product)));
}

View File

@@ -154,7 +154,7 @@ public interface SubscriptionProcessorManager {
}
record ReceiptItem(String itemId, Instant expiration, long level) {
record ReceiptItem(String itemId, Instant paidAt, long level) {
}