Browse Source

feat: Add plan extend feature for organization

pull/69/head
Berkan Sasmaz 5 years ago
parent
commit
9e4237f132
  1. 2
      src/EventHub.Domain.Shared/Organizations/PaymentRequestProductExtraParameterConfiguration.cs
  2. 17
      src/EventHub.Domain/PaymentRequests/PaymentRequestEventHandler.cs
  3. 13
      src/EventHub.Web/Pages/Organizations/Profile.cshtml
  4. 14
      src/EventHub.Web/Pages/Payment/PreCheckout.cshtml
  5. 16
      src/EventHub.Web/Pages/Pricing.cshtml
  6. 50
      src/EventHub.Web/Pages/Pricing.cshtml.cs

2
src/EventHub.Domain.Shared/Organizations/PaymentRequestProductExtraParameterConfiguration.cs

@ -5,5 +5,7 @@ namespace EventHub.Organizations
public string OrganizationName { get; set; } public string OrganizationName { get; set; }
public OrganizationPlanType TargetPlanType { get; set; } public OrganizationPlanType TargetPlanType { get; set; }
public bool IsExtend { get; set; }
} }
} }

17
src/EventHub.Domain/PaymentRequest/PaymentRequestEventHandler.cs → src/EventHub.Domain/PaymentRequests/PaymentRequestEventHandler.cs

@ -15,7 +15,7 @@ using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.TextTemplating; using Volo.Abp.TextTemplating;
namespace EventHub.PaymentRequest namespace EventHub.PaymentRequests
{ {
public class PaymentRequestEventHandler : IDistributedEventHandler<PaymentRequestCompletedEto>, public class PaymentRequestEventHandler : IDistributedEventHandler<PaymentRequestCompletedEto>,
IDistributedEventHandler<PaymentRequestFailedEto>, ITransientDependency IDistributedEventHandler<PaymentRequestFailedEto>, ITransientDependency
@ -24,7 +24,7 @@ namespace EventHub.PaymentRequest
private readonly ITemplateRenderer _templateRenderer; private readonly ITemplateRenderer _templateRenderer;
private readonly IRepository<IdentityUser, Guid> _userRepository; private readonly IRepository<IdentityUser, Guid> _userRepository;
private readonly IRepository<Organization, Guid> _organizationRepository; private readonly IRepository<Organization, Guid> _organizationRepository;
private readonly IRepository<Payment.PaymentRequests.PaymentRequest, Guid> _paymentRequestRepository; private readonly IRepository<PaymentRequest, Guid> _paymentRequestRepository;
private readonly IOptionsSnapshot<List<OrganizationPlanInfoOptions>> _organizationPlanInfoOptionsSnapshot; private readonly IOptionsSnapshot<List<OrganizationPlanInfoOptions>> _organizationPlanInfoOptionsSnapshot;
private readonly ILogger<PaymentRequestEventHandler> _logger; private readonly ILogger<PaymentRequestEventHandler> _logger;
@ -33,7 +33,7 @@ namespace EventHub.PaymentRequest
ITemplateRenderer templateRenderer, ITemplateRenderer templateRenderer,
IRepository<IdentityUser, Guid> userRepository, IRepository<IdentityUser, Guid> userRepository,
IRepository<Organization, Guid> organizationRepository, IRepository<Organization, Guid> organizationRepository,
IRepository<Payment.PaymentRequests.PaymentRequest, Guid> paymentRequestRepository, IRepository<PaymentRequest, Guid> paymentRequestRepository,
IOptionsSnapshot<List<OrganizationPlanInfoOptions>> organizationPlanInfoOptionsSnapshot, IOptionsSnapshot<List<OrganizationPlanInfoOptions>> organizationPlanInfoOptionsSnapshot,
ILogger<PaymentRequestEventHandler> logger) ILogger<PaymentRequestEventHandler> logger)
{ {
@ -78,8 +78,15 @@ namespace EventHub.PaymentRequest
return; return;
} }
var plan = _organizationPlanInfoOptionsSnapshot.Value.First(x => x.PlanType == paymentRequestProductExtraParameter.TargetPlanType); var targetPlan = _organizationPlanInfoOptionsSnapshot.Value.First(x => x.PlanType == paymentRequestProductExtraParameter.TargetPlanType);
organization.UpgradeToPremium(DateTime.Now.AddMonths(plan.OnePremiumPeriodAsMonth)); if (paymentRequestProductExtraParameter.IsExtend)
{
organization.UpgradeToPremium(organization.PremiumEndDate!.Value.AddMonths(targetPlan.OnePremiumPeriodAsMonth));
}
else
{
organization.UpgradeToPremium(DateTime.Now.AddMonths(targetPlan.OnePremiumPeriodAsMonth));
}
await _organizationRepository.UpdateAsync(organization, true); await _organizationRepository.UpdateAsync(organization, true);
var templateModel = new var templateModel = new

13
src/EventHub.Web/Pages/Organizations/Profile.cshtml

@ -68,19 +68,16 @@
<i class="far fa-edit"></i> Edit <i class="far fa-edit"></i> Edit
</a> </a>
<abp-card class="detail-head mt-4 font-weight-bold"> <abp-card class="detail-head mt-4 font-weight-bold text-center">
<abp-card-body> <abp-card-body>
@if (Model.Organization.IsPremium) @if (Model.Organization.IsPremium)
{ {
<p>License end date: @Model.Organization.PremiumEndDate!.Value</p> <span>Premium end date: @Model.Organization.PremiumEndDate!.Value.ToShortDateString()</span>
@if (Model.Organization.PremiumEndDate!.Value.IsBetween(DateTime.Now, DateTime.Now.AddMonths(12 - 1))) @if (Model.Organization.PremiumEndDate!.Value.IsBetween(DateTime.Now, DateTime.Now.AddMonths(12 - 1)))
{ {
<abp-button id="OrganizationJoinButton" <a href="@Url.Page("/Pricing", new { organizationName = Model.Organization.Name })" class="btn btn-primary btn-block mt-3">
button-type="Primary" <i class="fas fa-handshake"></i> @L["ExtendNow"].Value
size="Block" </a>
icon="fas fa-handshake"
text="@L["ExtendNow"].Value"
data-url="@Url.Action("Join", "OrganizationMembership", new { organizationId = Model.Organization.Id })"/>
} }
} }
else else

14
src/EventHub.Web/Pages/Payment/PreCheckout.cshtml

@ -51,10 +51,18 @@
<td class="p-4"> <td class="p-4">
<div class="media align-items-center"> <div class="media align-items-center">
<div class="media-body"> <div class="media-body">
<p class="">@Model.PaymentRequest.ProductName</p> <p class="font-weight-bolder">@Model.PaymentRequest.ProductName</p>
<small> <small>
<span class="text-muted">Plan: @targetPlanType</span> @if (!paymentRequestProductExtraParameterConfiguration.IsExtend)
<span class="text-muted ml-1">End date: @DateTime.Now.AddMonths(planInfo.OnePremiumPeriodAsMonth).ToShortDateString()</span> {
<span class="text-muted">Operation: Upgrade</span>
<span class="text-muted">Target Plan: @targetPlanType</span>
<span class="text-muted ml-1">End date: @DateTime.Now.AddMonths(planInfo.OnePremiumPeriodAsMonth).ToShortDateString()</span>
}
else
{
<span class="text-muted">Operation: Extend</span>
}
<span class="text-muted ml-1">Current State: @L["Enum:PaymentRequestState:" + Model.PaymentRequest.State]</span> <span class="text-muted ml-1">Current State: @L["Enum:PaymentRequestState:" + Model.PaymentRequest.State]</span>
<span class="ui-product-color ui-product-color-sm align-text-bottom" style="background:#e81e2c;"></span> &nbsp; <span class="ui-product-color ui-product-color-sm align-text-bottom" style="background:#e81e2c;"></span> &nbsp;
</small> </small>

16
src/EventHub.Web/Pages/Pricing.cshtml

@ -45,7 +45,13 @@
{ {
<div class="d-flex col-md flex-column py-4"> <div class="d-flex col-md flex-column py-4">
<div class="display-1 text-primary my-4"><i class="lnr lnr-store text-big"></i></div> <div class="display-1 text-primary my-4"><i class="lnr lnr-store text-big"></i></div>
<h5 class="m-0">@plan.PlanType</h5> <h5 class="m-0">
@plan.PlanType
@if (Model.Organization.IsPremium)
{
<span class="align-top text-dark font-weight-bold" style="font-size: x-small" abp-badge-pill="Info"> Current Plan </span>
}
</h5>
<div class="flex-grow-1"> <div class="flex-grow-1">
<div class="py-4 my-2"> <div class="py-4 my-2">
<span class="d-inline-block text-muted text-big align-middle mr-2">$</span> <span class="d-inline-block text-muted text-big align-middle mr-2">$</span>
@ -59,10 +65,14 @@
</div> </div>
</div> </div>
<div class="px-md-3 px-lg-5"> <div class="px-md-3 px-lg-5">
@if (Model.Organization.IsPremium) @if (Model.Organization.IsPremium)
{ {
<a class="btn btn-success btn-lg rounded-pill disabled">Current Plan</a> <form id="Extend" method="post" asp-page-handler="Extend">
<abp-input asp-for="TargetPlanToUpgrade" value="@plan.PlanType"></abp-input>
<abp-input asp-for="OrganizationName"></abp-input>
<a onclick="document.getElementById('Extend').submit()" class="btn btn-primary btn-lg rounded-pill">Extend Now</a>
</form>
} }
else else
{ {

50
src/EventHub.Web/Pages/Pricing.cshtml.cs

@ -56,12 +56,24 @@ namespace EventHub.Web.Pages
public async Task<IActionResult> OnPostUpgradeAsync() public async Task<IActionResult> OnPostUpgradeAsync()
{ {
var organization = await _organizationAppService.GetProfileAsync(OrganizationName); var organization = await GetOrganizationProfileAsync();
if (organization.OwnerUserName != CurrentUser.UserName)
var plan = _organizationPlanInfoOptionsSnapshot.Value.FirstOrDefault(x => x.PlanType == TargetPlanToUpgrade && x.IsActive);
if (plan is null)
{ {
throw new AbpAuthorizationException(); Alerts.Danger("Premium plan is currently inactive!");
return Page();
} }
var paymentRequest = await CreatePaymentRequestAsync(plan, organization);
return Redirect(_paymentUrlBuilder.BuildCheckoutUrl(paymentRequest.Id).AbsoluteUri);
}
public async Task<IActionResult> OnPostExtendAsync()
{
var organization = await GetOrganizationProfileAsync();
var plan = _organizationPlanInfoOptionsSnapshot.Value.FirstOrDefault(x => x.PlanType == TargetPlanToUpgrade && x.IsActive); var plan = _organizationPlanInfoOptionsSnapshot.Value.FirstOrDefault(x => x.PlanType == TargetPlanToUpgrade && x.IsActive);
if (plan is null) if (plan is null)
{ {
@ -69,12 +81,33 @@ namespace EventHub.Web.Pages
return Page(); return Page();
} }
var paymentRequest = await CreatePaymentRequestAsync(plan, organization, true);
return Redirect(_paymentUrlBuilder.BuildCheckoutUrl(paymentRequest.Id).AbsoluteUri);
}
private async Task<OrganizationProfileDto> GetOrganizationProfileAsync()
{
var organization = await _organizationAppService.GetProfileAsync(OrganizationName);
if (organization.OwnerUserName != CurrentUser.UserName)
{
throw new AbpAuthorizationException();
}
return organization;
}
private async Task<PaymentRequestDto> CreatePaymentRequestAsync(
OrganizationPlanInfoOptions plan,
OrganizationProfileDto organization,
bool isExtend = false)
{
var paymentRequest = await _paymentRequestAppService.CreateAsync(new PaymentRequestCreationDto var paymentRequest = await _paymentRequestAppService.CreateAsync(new PaymentRequestCreationDto
{ {
CustomerId = CurrentUser.GetId().ToString(), CustomerId = CurrentUser.GetId().ToString(),
Price = plan.Price, Price = plan.Price,
ProductId = OrganizationPlanInfoOptions.GetProductId(plan, false), ProductId = OrganizationPlanInfoOptions.GetProductId(plan, isExtend),
ProductName = OrganizationPlanInfoOptions.GetProductName(plan, organization.Name, false), ProductName = OrganizationPlanInfoOptions.GetProductName(plan, organization.Name, isExtend),
ExtraProperties = ExtraProperties =
{ {
{ {
@ -82,13 +115,14 @@ namespace EventHub.Web.Pages
new PaymentRequestProductExtraParameterConfiguration new PaymentRequestProductExtraParameterConfiguration
{ {
OrganizationName = OrganizationName, OrganizationName = OrganizationName,
TargetPlanType = TargetPlanToUpgrade TargetPlanType = TargetPlanToUpgrade,
IsExtend = isExtend
} }
} }
} }
}); });
return Redirect(_paymentUrlBuilder.BuildCheckoutUrl(paymentRequest.Id).AbsoluteUri); return paymentRequest;
} }
} }
} }
Loading…
Cancel
Save