From 9e4237f132ebc57b75533170670975e3b7bb0ca8 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Wed, 27 Oct 2021 12:02:10 +0300 Subject: [PATCH] feat: Add plan extend feature for organization --- ...questProductExtraParameterConfiguration.cs | 2 + .../PaymentRequestEventHandler.cs | 17 +++++-- .../Pages/Organizations/Profile.cshtml | 13 ++--- .../Pages/Payment/PreCheckout.cshtml | 14 ++++-- src/EventHub.Web/Pages/Pricing.cshtml | 16 ++++-- src/EventHub.Web/Pages/Pricing.cshtml.cs | 50 ++++++++++++++++--- 6 files changed, 85 insertions(+), 27 deletions(-) rename src/EventHub.Domain/{PaymentRequest => PaymentRequests}/PaymentRequestEventHandler.cs (90%) diff --git a/src/EventHub.Domain.Shared/Organizations/PaymentRequestProductExtraParameterConfiguration.cs b/src/EventHub.Domain.Shared/Organizations/PaymentRequestProductExtraParameterConfiguration.cs index f365d36..58eec5a 100644 --- a/src/EventHub.Domain.Shared/Organizations/PaymentRequestProductExtraParameterConfiguration.cs +++ b/src/EventHub.Domain.Shared/Organizations/PaymentRequestProductExtraParameterConfiguration.cs @@ -5,5 +5,7 @@ namespace EventHub.Organizations public string OrganizationName { get; set; } public OrganizationPlanType TargetPlanType { get; set; } + + public bool IsExtend { get; set; } } } \ No newline at end of file diff --git a/src/EventHub.Domain/PaymentRequest/PaymentRequestEventHandler.cs b/src/EventHub.Domain/PaymentRequests/PaymentRequestEventHandler.cs similarity index 90% rename from src/EventHub.Domain/PaymentRequest/PaymentRequestEventHandler.cs rename to src/EventHub.Domain/PaymentRequests/PaymentRequestEventHandler.cs index a39cc19..f30ab59 100644 --- a/src/EventHub.Domain/PaymentRequest/PaymentRequestEventHandler.cs +++ b/src/EventHub.Domain/PaymentRequests/PaymentRequestEventHandler.cs @@ -15,7 +15,7 @@ using Volo.Abp.EventBus.Distributed; using Volo.Abp.Identity; using Volo.Abp.TextTemplating; -namespace EventHub.PaymentRequest +namespace EventHub.PaymentRequests { public class PaymentRequestEventHandler : IDistributedEventHandler, IDistributedEventHandler, ITransientDependency @@ -24,7 +24,7 @@ namespace EventHub.PaymentRequest private readonly ITemplateRenderer _templateRenderer; private readonly IRepository _userRepository; private readonly IRepository _organizationRepository; - private readonly IRepository _paymentRequestRepository; + private readonly IRepository _paymentRequestRepository; private readonly IOptionsSnapshot> _organizationPlanInfoOptionsSnapshot; private readonly ILogger _logger; @@ -33,7 +33,7 @@ namespace EventHub.PaymentRequest ITemplateRenderer templateRenderer, IRepository userRepository, IRepository organizationRepository, - IRepository paymentRequestRepository, + IRepository paymentRequestRepository, IOptionsSnapshot> organizationPlanInfoOptionsSnapshot, ILogger logger) { @@ -78,8 +78,15 @@ namespace EventHub.PaymentRequest return; } - var plan = _organizationPlanInfoOptionsSnapshot.Value.First(x => x.PlanType == paymentRequestProductExtraParameter.TargetPlanType); - organization.UpgradeToPremium(DateTime.Now.AddMonths(plan.OnePremiumPeriodAsMonth)); + var targetPlan = _organizationPlanInfoOptionsSnapshot.Value.First(x => x.PlanType == paymentRequestProductExtraParameter.TargetPlanType); + if (paymentRequestProductExtraParameter.IsExtend) + { + organization.UpgradeToPremium(organization.PremiumEndDate!.Value.AddMonths(targetPlan.OnePremiumPeriodAsMonth)); + } + else + { + organization.UpgradeToPremium(DateTime.Now.AddMonths(targetPlan.OnePremiumPeriodAsMonth)); + } await _organizationRepository.UpdateAsync(organization, true); var templateModel = new diff --git a/src/EventHub.Web/Pages/Organizations/Profile.cshtml b/src/EventHub.Web/Pages/Organizations/Profile.cshtml index 8d4de10..d0b4987 100644 --- a/src/EventHub.Web/Pages/Organizations/Profile.cshtml +++ b/src/EventHub.Web/Pages/Organizations/Profile.cshtml @@ -68,19 +68,16 @@ Edit - + @if (Model.Organization.IsPremium) { -

License end date: @Model.Organization.PremiumEndDate!.Value

+ Premium end date: @Model.Organization.PremiumEndDate!.Value.ToShortDateString() @if (Model.Organization.PremiumEndDate!.Value.IsBetween(DateTime.Now, DateTime.Now.AddMonths(12 - 1))) { - + + @L["ExtendNow"].Value + } } else diff --git a/src/EventHub.Web/Pages/Payment/PreCheckout.cshtml b/src/EventHub.Web/Pages/Payment/PreCheckout.cshtml index 4254a8a..62117c9 100644 --- a/src/EventHub.Web/Pages/Payment/PreCheckout.cshtml +++ b/src/EventHub.Web/Pages/Payment/PreCheckout.cshtml @@ -51,10 +51,18 @@
-

@Model.PaymentRequest.ProductName

+

@Model.PaymentRequest.ProductName

- Plan: @targetPlanType - End date: @DateTime.Now.AddMonths(planInfo.OnePremiumPeriodAsMonth).ToShortDateString() + @if (!paymentRequestProductExtraParameterConfiguration.IsExtend) + { + Operation: Upgrade + Target Plan: @targetPlanType + End date: @DateTime.Now.AddMonths(planInfo.OnePremiumPeriodAsMonth).ToShortDateString() + } + else + { + Operation: Extend + } Current State: @L["Enum:PaymentRequestState:" + Model.PaymentRequest.State]   diff --git a/src/EventHub.Web/Pages/Pricing.cshtml b/src/EventHub.Web/Pages/Pricing.cshtml index a26675d..4a6496d 100644 --- a/src/EventHub.Web/Pages/Pricing.cshtml +++ b/src/EventHub.Web/Pages/Pricing.cshtml @@ -45,7 +45,13 @@ {
-
@plan.PlanType
+
+ @plan.PlanType + @if (Model.Organization.IsPremium) + { + Current Plan + } +
$ @@ -59,10 +65,14 @@
- + @if (Model.Organization.IsPremium) { - Current Plan +
+ + + Extend Now +
} else { diff --git a/src/EventHub.Web/Pages/Pricing.cshtml.cs b/src/EventHub.Web/Pages/Pricing.cshtml.cs index 8362a7c..476947c 100644 --- a/src/EventHub.Web/Pages/Pricing.cshtml.cs +++ b/src/EventHub.Web/Pages/Pricing.cshtml.cs @@ -56,12 +56,24 @@ namespace EventHub.Web.Pages public async Task OnPostUpgradeAsync() { - var organization = await _organizationAppService.GetProfileAsync(OrganizationName); - if (organization.OwnerUserName != CurrentUser.UserName) + var organization = await GetOrganizationProfileAsync(); + + 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 OnPostExtendAsync() + { + var organization = await GetOrganizationProfileAsync(); + var plan = _organizationPlanInfoOptionsSnapshot.Value.FirstOrDefault(x => x.PlanType == TargetPlanToUpgrade && x.IsActive); if (plan is null) { @@ -69,12 +81,33 @@ namespace EventHub.Web.Pages return Page(); } + var paymentRequest = await CreatePaymentRequestAsync(plan, organization, true); + + return Redirect(_paymentUrlBuilder.BuildCheckoutUrl(paymentRequest.Id).AbsoluteUri); + } + + private async Task GetOrganizationProfileAsync() + { + var organization = await _organizationAppService.GetProfileAsync(OrganizationName); + if (organization.OwnerUserName != CurrentUser.UserName) + { + throw new AbpAuthorizationException(); + } + + return organization; + } + + private async Task CreatePaymentRequestAsync( + OrganizationPlanInfoOptions plan, + OrganizationProfileDto organization, + bool isExtend = false) + { var paymentRequest = await _paymentRequestAppService.CreateAsync(new PaymentRequestCreationDto { CustomerId = CurrentUser.GetId().ToString(), Price = plan.Price, - ProductId = OrganizationPlanInfoOptions.GetProductId(plan, false), - ProductName = OrganizationPlanInfoOptions.GetProductName(plan, organization.Name, false), + ProductId = OrganizationPlanInfoOptions.GetProductId(plan, isExtend), + ProductName = OrganizationPlanInfoOptions.GetProductName(plan, organization.Name, isExtend), ExtraProperties = { { @@ -82,13 +115,14 @@ namespace EventHub.Web.Pages new PaymentRequestProductExtraParameterConfiguration { OrganizationName = OrganizationName, - TargetPlanType = TargetPlanToUpgrade + TargetPlanType = TargetPlanToUpgrade, + IsExtend = isExtend } } } }); - - return Redirect(_paymentUrlBuilder.BuildCheckoutUrl(paymentRequest.Id).AbsoluteUri); + + return paymentRequest; } } } \ No newline at end of file