private async Task <decimal> CalculateAmountForPaymentAsync(SubscribableEdition targetEdition, PaymentPeriodType?periodType, EditionPaymentType editionPaymentType, Tenant tenant) { if (editionPaymentType != EditionPaymentType.Upgrade) { return(targetEdition.GetPaymentAmount(periodType)); } if (tenant.EditionId == null) { throw new UserFriendlyException(L("CanNotUpgradeSubscriptionSinceTenantHasNoEditionAssigned")); } var remainingDaysCount = tenant.CalculateRemainingDayCount(); if (remainingDaysCount <= 0) { return(targetEdition.GetPaymentAmount(periodType)); } Debug.Assert(tenant.EditionId != null, "tenant.EditionId != null"); var currentEdition = (SubscribableEdition)await _editionManager.GetByIdAsync(tenant.EditionId.Value); return(TenantManager.GetUpgradePrice(currentEdition, targetEdition, remainingDaysCount)); }
private async Task <decimal> CalculateAmountForPaymentAsync(SubscribableEdition targetEdition, PaymentPeriodType?periodType, EditionPaymentType editionPaymentType, Tenant tenant) { if (editionPaymentType != EditionPaymentType.Upgrade) { return(targetEdition.GetPaymentAmount(periodType)); } if (tenant.EditionId == null) { throw new UserFriendlyException(L("CanNotUpgradeSubscriptionSinceTenantHasNoEditionAssigned")); } var remainingHoursCount = tenant.CalculateRemainingHoursCount(); if (remainingHoursCount <= 0) { return(targetEdition.GetPaymentAmount(periodType)); } Debug.Assert(tenant.EditionId != null, "tenant.EditionId != null"); var currentEdition = (SubscribableEdition)await _editionManager.GetByIdAsync(tenant.EditionId.Value); var lastPayment = await _subscriptionPaymentRepository.GetLastCompletedPaymentOrDefaultAsync(tenant.Id, null, null); if (lastPayment?.PaymentPeriodType == null) { throw new ApplicationException("There is no completed payment record !"); } return(TenantManager.GetUpgradePrice(currentEdition, targetEdition, remainingHoursCount, lastPayment.PaymentPeriodType.Value)); }
public decimal GetUpgradePrice(SubscribableEdition currentEdition, SubscribableEdition targetEdition, int totalRemainingHourCount, PaymentPeriodType paymentPeriodType) { int numberOfHoursPerDay = 24; var totalRemainingDayCount = totalRemainingHourCount / numberOfHoursPerDay; var unusedPeriodCount = totalRemainingDayCount / (int)paymentPeriodType; var unusedHoursCount = totalRemainingHourCount % ((int)paymentPeriodType * numberOfHoursPerDay); decimal currentEditionPriceForUnusedPeriod = 0; decimal targetEditionPriceForUnusedPeriod = 0; var currentEditionPrice = currentEdition.GetPaymentAmount(paymentPeriodType); var targetEditionPrice = targetEdition.GetPaymentAmount(paymentPeriodType); if (currentEditionPrice > 0) { currentEditionPriceForUnusedPeriod = currentEditionPrice * unusedPeriodCount; currentEditionPriceForUnusedPeriod += (currentEditionPrice / (int)paymentPeriodType) / numberOfHoursPerDay * unusedHoursCount; } if (targetEditionPrice > 0) { targetEditionPriceForUnusedPeriod = targetEditionPrice * unusedPeriodCount; targetEditionPriceForUnusedPeriod += (targetEditionPrice / (int)paymentPeriodType) / numberOfHoursPerDay * unusedHoursCount; } return(targetEditionPriceForUnusedPeriod - currentEditionPriceForUnusedPeriod); }