From 6e70202fcedc4896465a8dfe6570db34e8a71ae0 Mon Sep 17 00:00:00 2001 From: Ricardo Carneiro Date: Sun, 7 Sep 2025 17:00:50 -0300 Subject: [PATCH] feat: reativar assinatura cancelada --- .../Controllers/SubscriptionController.cs | 4 +-- src/BCards.Web/Services/IPaymentService.cs | 1 + src/BCards.Web/Services/PaymentService.cs | 29 +++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/BCards.Web/Controllers/SubscriptionController.cs b/src/BCards.Web/Controllers/SubscriptionController.cs index a73b0ab..986ce75 100644 --- a/src/BCards.Web/Controllers/SubscriptionController.cs +++ b/src/BCards.Web/Controllers/SubscriptionController.cs @@ -131,8 +131,8 @@ public class SubscriptionController : Controller try { - // Remover agendamento de cancelamento - var success = await _paymentService.CancelSubscriptionAtPeriodEndAsync(subscriptionId); + // Reativar assinatura removendo o agendamento de cancelamento + var success = await _paymentService.ReactivateSubscriptionAsync(subscriptionId); if (success) { diff --git a/src/BCards.Web/Services/IPaymentService.cs b/src/BCards.Web/Services/IPaymentService.cs index 3b51e82..a30d84c 100644 --- a/src/BCards.Web/Services/IPaymentService.cs +++ b/src/BCards.Web/Services/IPaymentService.cs @@ -21,6 +21,7 @@ public interface IPaymentService // Métodos para cancelamento com diferentes políticas Task CancelSubscriptionImmediatelyAsync(string subscriptionId, bool refund = false); Task CancelSubscriptionAtPeriodEndAsync(string subscriptionId); + Task ReactivateSubscriptionAsync(string subscriptionId); Task CreatePartialRefundAsync(string subscriptionId, decimal refundAmount); Task<(bool CanRefundFull, bool CanRefundPartial, decimal RefundAmount)> CalculateRefundAsync(string subscriptionId); } \ No newline at end of file diff --git a/src/BCards.Web/Services/PaymentService.cs b/src/BCards.Web/Services/PaymentService.cs index f0dd585..79cc415 100644 --- a/src/BCards.Web/Services/PaymentService.cs +++ b/src/BCards.Web/Services/PaymentService.cs @@ -479,6 +479,35 @@ public class PaymentService : IPaymentService } } + public async Task ReactivateSubscriptionAsync(string subscriptionId) + { + try + { + var service = new SubscriptionService(); + var options = new SubscriptionUpdateOptions + { + CancelAtPeriodEnd = false // Reativar removendo o agendamento de cancelamento + }; + + await service.UpdateAsync(subscriptionId, options); + + // Atualizar subscription local + var localSubscription = await _subscriptionRepository.GetByStripeSubscriptionIdAsync(subscriptionId); + if (localSubscription != null) + { + localSubscription.CancelAtPeriodEnd = false; + localSubscription.UpdatedAt = DateTime.UtcNow; + await _subscriptionRepository.UpdateAsync(localSubscription); + } + + return true; + } + catch (StripeException) + { + return false; + } + } + public async Task CreatePartialRefundAsync(string subscriptionId, decimal refundAmount) { // NOTA: Para planos de assinatura, reembolsos devem ser processados manualmente via Stripe Dashboard