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 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);

            var lastPayment = await _subscriptionPaymentRepository.GetLastCompletedPaymentOrDefaultAsync(tenant.Id, null, null);

            if (lastPayment == null || !lastPayment.PaymentPeriodType.HasValue)
            {
                throw new ApplicationException("There is no completed payment record !");
            }

            return(TenantManager.GetUpgradePrice(currentEdition, targetEdition, remainingDaysCount, lastPayment.PaymentPeriodType.Value));
        }