BCards/src/BCards.Web/Views/Payment/ManageSubscription.cshtml
2025-08-20 22:56:36 -03:00

301 lines
15 KiB
Plaintext

@model BCards.Web.ViewModels.ManageSubscriptionViewModel
@{
ViewData["Title"] = "Gerenciar Assinatura";
Layout = "_Layout";
}
<div class="container mt-4">
<div class="row">
<div class="col-lg-8 mx-auto">
<!-- Header -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="fas fa-credit-card me-2"></i>
Gerenciar Assinatura
</h2>
<a href="@Url.Action("Dashboard", "Admin")" class="btn btn-outline-secondary">
<i class="fas fa-arrow-left me-1"></i>
Voltar ao Dashboard
</a>
</div>
<!-- Alerts -->
@if (!string.IsNullOrEmpty(Model.ErrorMessage))
{
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<i class="fas fa-exclamation-triangle me-2"></i>
@Model.ErrorMessage
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
}
@if (!string.IsNullOrEmpty(Model.SuccessMessage))
{
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="fas fa-check-circle me-2"></i>
@Model.SuccessMessage
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
}
@if (!string.IsNullOrEmpty(TempData["Error"]?.ToString()))
{
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<i class="fas fa-exclamation-triangle me-2"></i>
@TempData["Error"]
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
}
@if (!string.IsNullOrEmpty(TempData["Success"]?.ToString()))
{
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="fas fa-check-circle me-2"></i>
@TempData["Success"]
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
}
<!-- Current Subscription Card -->
<div class="card mb-4">
<div class="card-header bg-primary text-white">
<h5 class="mb-0">
<i class="fas fa-star me-2"></i>
Assinatura Atual
</h5>
</div>
<div class="card-body">
@if (Model.HasActiveSubscription)
{
<div class="row">
<div class="col-md-6">
<h4 class="text-primary">Plano @Model.PlanDisplayName</h4>
<p class="text-muted mb-2">
Status: <span class="badge bg-success">@Model.StatusDisplayName</span>
</p>
@if (Model.MonthlyAmount.HasValue)
{
<p class="mb-2">
<strong>R$ @Model.MonthlyAmount.Value.ToString("F2")</strong> / mês
</p>
}
</div>
<div class="col-md-6">
@if (Model.NextBillingDate.HasValue)
{
<p class="mb-2">
<i class="fas fa-calendar me-2"></i>
Próxima cobrança: <strong>@Model.NextBillingDate.Value.ToString("dd/MM/yyyy")</strong>
</p>
}
@if (Model.WillCancelAtPeriodEnd)
{
<p class="text-warning mb-2">
<i class="fas fa-exclamation-triangle me-2"></i>
Assinatura será cancelada em @Model.CurrentPeriodEnd?.ToString("dd/MM/yyyy")
</p>
}
</div>
</div>
<div class="mt-3">
<div class="d-flex gap-2 flex-wrap">
@if (!Model.WillCancelAtPeriodEnd)
{
<a asp-controller="Subscription" asp-action="Cancel" class="btn btn-danger">
<i class="fas fa-times me-1"></i>
Cancelar Assinatura
</a>
}
else
{
<form asp-controller="Subscription" asp-action="Reactivate" method="post" class="d-inline">
<input type="hidden" name="subscriptionId" value="@Model.StripeSubscriptionId" />
<button type="submit" class="btn btn-success" onclick="return confirm('Deseja reativar sua assinatura?')">
<i class="fas fa-undo me-1"></i>
Reativar Assinatura
</button>
</form>
}
<form method="post" action="@Url.Action("OpenStripePortal")" class="d-inline">
<button type="submit" class="btn btn-outline-primary">
<i class="fas fa-external-link-alt me-1"></i>
Portal de Pagamento
</button>
</form>
</div>
</div>
}
else
{
<div class="text-center py-4">
<i class="fas fa-info-circle text-muted" style="font-size: 3rem;"></i>
<h5 class="mt-3">Nenhuma assinatura ativa</h5>
<p class="text-muted">Você está usando o plano gratuito. Faça upgrade para desbloquear mais recursos!</p>
<a href="@Url.Action("Pricing", "Home")" class="btn btn-primary">
<i class="fas fa-upgrade me-1"></i>
Ver Planos
</a>
</div>
}
</div>
</div>
<!-- Available Plans -->
@if (Model.HasActiveSubscription && (Model.CanUpgrade || Model.CanDowngrade))
{
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-exchange-alt me-2"></i>
Alterar Plano
</h5>
</div>
<div class="card-body">
<div class="row">
@foreach (var plan in Model.AvailablePlans.Where(p => !p.IsCurrentPlan))
{
<div class="col-md-4 mb-3">
<div class="card h-100 @(plan.IsUpgrade ? "border-success" : plan.IsDowngrade ? "border-warning" : "")">
<div class="card-body text-center">
<h5 class="card-title">@plan.DisplayName</h5>
<h4 class="text-primary mb-3">R$ @plan.Price.ToString("F2")</h4>
<ul class="list-unstyled text-start mb-3">
@foreach (var feature in plan.Features)
{
<li class="mb-1">
<i class="fas fa-check text-success me-2"></i>
@feature
</li>
}
</ul>
<form method="post" action="@Url.Action("ChangePlan")">
<input type="hidden" name="newPlanType" value="@plan.PlanType" />
<button type="submit" class="btn @(plan.IsUpgrade ? "btn-success" : "btn-warning") w-100">
<i class="fas @(plan.IsUpgrade ? "fa-arrow-up" : "fa-arrow-down") me-1"></i>
@(plan.IsUpgrade ? "Fazer Upgrade" : "Fazer Downgrade")
</button>
</form>
</div>
</div>
</div>
}
</div>
</div>
</div>
}
<!-- Payment History -->
@if (Model.PaymentHistory.Any())
{
<div class="card">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-history me-2"></i>
Histórico de Pagamentos
</h5>
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-light">
<tr>
<th>Data</th>
<th>Descrição</th>
<th>Valor</th>
<th>Status</th>
<th>Recibo</th>
</tr>
</thead>
<tbody>
@foreach (var invoice in Model.PaymentHistory.Take(10))
{
<tr>
<td>@invoice.Created.ToString("dd/MM/yyyy")</td>
<td>
@if (!string.IsNullOrEmpty(invoice.Description))
{
@invoice.Description
}
else
{
<span>Assinatura @Model.PlanDisplayName</span>
}
</td>
<td>
<strong>R$ @((invoice.AmountPaid / 100m).ToString("F2"))</strong>
</td>
<td>
<span class="badge bg-success">Pago</span>
</td>
<td>
@if (!string.IsNullOrEmpty(invoice.HostedInvoiceUrl))
{
<a href="@invoice.HostedInvoiceUrl" target="_blank" class="btn btn-sm btn-outline-primary">
<i class="fas fa-download me-1"></i>
Ver
</a>
}
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
}
</div>
</div>
</div>
<!-- Cancel Subscription Modal -->
<div class="modal fade" id="cancelModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-exclamation-triangle text-warning me-2"></i>
Cancelar Assinatura
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<p>Tem certeza que deseja cancelar sua assinatura?</p>
<div class="alert alert-info">
<i class="fas fa-info-circle me-2"></i>
Sua assinatura permanecerá ativa até o final do período atual
(@Model.CurrentPeriodEnd?.ToString("dd/MM/yyyy")).
Após essa data, você retornará ao plano gratuito.
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
Manter Assinatura
</button>
@if (Model.StripeSubscription != null)
{
<form method="post" action="@Url.Action("CancelSubscription")" style="display: inline;">
<input type="hidden" name="subscriptionId" value="@Model.StripeSubscription.Id" />
<button type="submit" class="btn btn-danger">
<i class="fas fa-times me-1"></i>
Confirmar Cancelamento
</button>
</form>
}
</div>
</div>
</div>
</div>
@section Scripts {
<script>
// Auto-dismiss alerts after 5 seconds
setTimeout(function() {
$('.alert:not(.alert-dismissible)').fadeOut();
}, 5000);
</script>
}