public void EvaluateRateShouldCalculatedWithoutError()
        {
            //Act
            var exception = Record.Exception(() => FinancialCalculations.EvaluateRate(1.4, 48, 60000, 120000, 0, DueDate.EndOfPeriod));

            //Assert
            exception.Should().BeNull();
        }
        public void OptionalPresentValueShouldCalculatedWithoutError()
        {
            //Act
            var exception = Record.Exception(() => FinancialCalculations.PresentValueOptional(new[] { 1.2, 2 }, 1.4));

            //Assert
            exception.Should().BeNull();
        }
        public void ReinvestedInternalReturnRateShouldThrowExceptionWhenFinancialRateIsNegative()
        {
            //Act
            var exception = Record.Exception(() => FinancialCalculations.ReinvestedInternalReturnRate(new[] { 1.2, 2 }, -1, 1.8));

            //Assert
            exception.Should().NotBeNull();
        }
        public void CapitalPaymentShouldThrowExceptionWhenPeriodIsLessOrEqualToZero()
        {
            //Act
            var exception = Record.Exception(() => FinancialCalculations.CapitalPayment(1.2, 0, 60, 60000, 0, DueDate.EndOfPeriod));

            //Assert
            exception.Should().NotBeNull();
        }
        public void ReinvestedInternalReturnRateShouldCalculatedWithoutError()
        {
            //ActSSS
            var exception = Record.Exception(() => FinancialCalculations.ReinvestedInternalReturnRate(new[] { -4.8, -20 }, 2.4, 1.8));

            //Assert
            exception.Should().BeNull();
        }
        public void NumberOfPeriodsShouldCalculatedWithoutError()
        {
            //Act
            var exception = Record.Exception(() => FinancialCalculations.NumberOfPeriods(1.4, 50000, 60000, 0, DueDate.EndOfPeriod));

            //Assert
            exception.Should().BeNull();
        }
        public void CapitalPaymentShouldCalculatedWithoutError()
        {
            //Act
            var exception = Record.Exception(() => FinancialCalculations.CapitalPayment(1.4, 48, 60, 60000, 0, DueDate.EndOfPeriod));

            //Assert
            exception.Should().BeNull();
        }
        public void NetPresentValueShouldThrowExceptionWithNullParameters()
        {
            //Act
            var exception = Record.Exception(() => FinancialCalculations.NetPresentValue(1.4, null));

            //Assert
            exception.Should().NotBeNull();
        }
        public void NetPresentValueShouldCalculatedWithoutError()
        {
            //Act
            var exception = Record.Exception(() => FinancialCalculations.NetPresentValue(1.4, new[] { 1.2, 2 }));

            //Assert
            exception.Should().BeNull();
        }
        public void FutureValueInternalShouldCalculatedWithoutError()
        {
            //Act
            var exception = Record.Exception(() => FinancialCalculations.FutureValueInternal(1.4, 48, 60000, 120000, DueDate.EndOfPeriod));

            //Assert
            exception.Should().BeNull();
        }
        public void InternalReturnRateShouldThrowDivideByZeroException(double[] cashFlow, double guess)
        {
            //Act
            var exception = Record.Exception(() => FinancialCalculations.InternalReturnRate(cashFlow, guess));

            //Assert
            exception.Should().NotBeNull();
            exception.GetType().Should().Be(typeof(ArgumentException));
        }
示例#12
0
        public void PaymentShouldCalculateCorrectly(double rate, short numberPeriods, double presentValue, double futureValue,
                                                    DueDate due)
        {
            //Act
            var correctSut = Math.Abs(Financial.Pmt(rate, numberPeriods, presentValue, futureValue, PaymentDue.EndOfPeriod));
            var sut        = Math.Abs(FinancialCalculations.Payment(rate, numberPeriods, presentValue, futureValue, due));

            //Assert
            sut.Should().Be(correctSut);
        }
示例#13
0
        public void NumberOfPeriodsShouldCalculateCorrectly(double rate, double presentValue, double payment, double futureValue,
                                                            DueDate due)
        {
            //Act
            var correctSut = Financial.NPer(rate, payment, presentValue, futureValue, PaymentDue.EndOfPeriod);
            var sut        = FinancialCalculations.NumberOfPeriods(rate, payment, presentValue, futureValue, due);

            //Assert
            sut.Should().Be((short)correctSut);
        }
        public void Calculate_Total_Net_Value()
        {
            // Arrange
            decimal total = 1000.00m;

            // Act
            decimal gstValue = FinancialCalculations.CalculateTotalNetFromTotalGross(total);

            // Assert
            Assert.AreEqual(869.57m, gstValue);
        }
        public void Calculate_GST_Value()
        {
            // Arrange
            decimal total = 1000.00m;

            // Act
            decimal gstValue = FinancialCalculations.CalculateGSTValueFromTotalGross(total);

            // Assert
            Assert.AreEqual(130.43m, gstValue);
        }
        public void RateShouldCalculateCorrectly(short numberPeriods, double payment, double presentValue, double futureValue,
                                                 DueDate due)
        {
            //Act
            var correctSut = Financial.Rate(numberPeriods, -payment, presentValue, futureValue, PaymentDue.EndOfPeriod);
            var sut        = FinancialCalculations.Rate(numberPeriods, -payment, presentValue, futureValue, due);

            var isEqual = TestHelper.IsEqualResultsWithExcelFinancialFunctions(sut, correctSut);

            //Assert
            isEqual.Should().BeTrue();
        }
示例#17
0
        public void PresentValueShouldCalculateCorrectly(double rate, short numberPeriods, double payment, double futureValue,
                                                         DueDate due)
        {
            //Act
            var correctSut = Financial.Pv(rate, numberPeriods, payment, futureValue, PaymentDue.EndOfPeriod);
            var sut        = FinancialCalculations.PresentValue(rate, numberPeriods, payment, futureValue, due);

            var isEqual = TestHelper.IsEqualDoubles(sut, correctSut);

            //Assert
            isEqual.Should().BeTrue();
        }
示例#18
0
        public void CapitalPaymentShouldCalculateCorrectly(double rate, short numberPeriods, double presentValue, double futureValue,
                                                           DueDate due)
        {
            //Act
            var correctSut = Math.Abs(Financial.CumPrinc(rate, numberPeriods, presentValue, 1, 1, PaymentDue.EndOfPeriod));
            var sut        = Math.Abs(FinancialCalculations.CapitalPayment(rate, 1, numberPeriods, presentValue, futureValue, due));

            var isEqual = TestHelper.IsEqualDoubles(sut, correctSut);

            //Assert
            isEqual.Should().BeTrue();
        }
        /// <summary>
        /// Extracts expense data from a block of text
        /// </summary>
        /// <param name="text">Text to process</param>
        /// <param name="cancellationToken">Default cancellation token</param>
        /// <returns></returns>
        public async Task <ExpenseResourceModel> ExtractExpenseAsync(string text, CancellationToken cancellationToken = default)
        {
            ExpenseResourceModel resourceModel = new ExpenseResourceModel();

            await Task.Run(() =>
            {
                if (string.IsNullOrEmpty(text))
                {
                    throw new EmailProcessingException("Text block can not be empty");
                }

                // Load the email text as html doc
                HtmlDocument htmlDocument = new HtmlDocument();
                htmlDocument.LoadHtml(text);

                // Detect tags that are not closed
                if (htmlDocument.ContainsUnclosedTags())
                {
                    throw new UnclosedTagException("Block of text has unclosed tag(s)");
                }

                // Extract data
                HtmlNode expenseNode = htmlDocument.DocumentNode.SelectSingleNode("//expense");
                if (expenseNode == null)
                {
                    throw new EmailProcessingException("Expense element does not exist or is invalid");
                }

                if (expenseNode.HasChildNodes)
                {
                    HtmlNode costCentre    = expenseNode.SelectSingleNode("//cost_centre");
                    HtmlNode total         = expenseNode.SelectSingleNode("//total");
                    HtmlNode paymentMethod = expenseNode.SelectSingleNode("//payment_method");

                    if (total == null)
                    {
                        throw new MissingElementException("Total node is required");
                    }

                    decimal totalValue = decimal.Parse(total.InnerText, CultureInfo.InvariantCulture);

                    resourceModel.CostCentre        = costCentre != null ? costCentre.InnerText : "UNKNOWN";
                    resourceModel.Total             = totalValue;
                    resourceModel.PaymentMethod     = paymentMethod.InnerText;
                    resourceModel.TotalExcludingGST = FinancialCalculations.CalculateTotalNetFromTotalGross(totalValue);
                    resourceModel.GSTValue          = FinancialCalculations.CalculateGSTValueFromTotalGross(totalValue);
                }
            }, cancellationToken);

            return(resourceModel);
        }
        public void TestAddTwoNumbers()
        {
            // Arrange
            SByte vFirstNumber    = 25;
            SByte vSecondNumber   = 50;
            SByte vExpectedResult = 76;

            // Act
            SByte vResult =
                FinancialCalculations.AddTwoNumbers(vFirstNumber, vSecondNumber);

            // Assert
            Assert.AreEqual(vExpectedResult, vResult);
        }
        public async Task UpdateUser(AutumnUserDto user)
        {
            try
            {
                var autumnUser = await UserManager.FindByIdAsync(AbpSession.UserId.ToString());

                autumnUser.Age          = user.Age;
                autumnUser.CountryId    = user.CountryId;
                autumnUser.EmailAddress = user.EmailAddress;
                autumnUser.Name         = user.Name;
                autumnUser.Gender       = (Gender)user.Gender;
                autumnUser.Surname      = "xyz";
                CheckErrors(await UserManager.UpdateAsync(autumnUser));
                var userRetiretmentData = await _userRetirementPlanRepository.GetAll().FirstOrDefaultAsync(r => r.UserId == AbpSession.UserId);

                userRetiretmentData.RetirementGoalOptions = (RetirementGoals)user.RetirementGoalOptions;
                userRetiretmentData.TotalMonthlyIncome    = user.TotalMonthlyIncome;
                userRetiretmentData.TotalMonthlyExpences  = user.TotalMonthlyExpences;
                userRetiretmentData.InitialSaved          = user.InitialSaved;
                userRetiretmentData.InitialOwed           = user.InitialOwed;

                userRetiretmentData.DesiredRetirementSum    = user.DesiredRetirementSum;
                userRetiretmentData.DesiredRetirementIncome = user.DesiredRetirementIncome;
                userRetiretmentData.DesiredLegacyAmount     = user.DesiredLegacyAmount;
                userRetiretmentData.DesiredRetirementAge    = user.DesiredRetirementAge;



                var userRetirementPlan = ObjectMapper.Map <UserRetirementPlanDto>(user);
                userRetirementPlan.UserId     = AbpSession.UserId.Value;
                userRetirementPlan.ReturnRate = 0;
                var countryData = _countryRepository.FirstOrDefault((int)user.CountryId);
                switch (userRetirementPlan.RetirementGoalOptions)
                {
                //Variable legacy
                case RetirementGoalsEnumDto.DesiredRetirementSum:
                    if (userRetirementPlan.DesiredLegacyAmount == null)
                    {
                        userRetirementPlan.DesiredLegacyAmount = 0;
                    }

                    userRetiretmentData.DesiredRetirementIncome = FinancialCalculations.PMT((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, -(double)userRetirementPlan.DesiredRetirementSum, (double)userRetirementPlan.DesiredLegacyAmount) / 12;
                    userRetiretmentData.InitialNet             = userRetirementPlan.InitialSaved + userRetirementPlan.InitialOwed;
                    userRetiretmentData.RequiredSavings        = FinancialCalculations.PMT((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetiretmentData.InitialNet, -(double)userRetirementPlan.DesiredRetirementSum) / 12;
                    userRetiretmentData.TotalMonthlySavings    = userRetirementPlan.TotalMonthlyIncome - userRetirementPlan.TotalMonthlyExpences;
                    userRetiretmentData.LikelyRetirementSum    = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetiretmentData.TotalMonthlySavings * -12, (double)-userRetiretmentData.InitialNet) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetiretmentData.LikelyRetirementLegacy = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetiretmentData.DesiredRetirementIncome * 12, -(double)userRetiretmentData.LikelyRetirementSum);

                    break;

                //Variable legacy
                case RetirementGoalsEnumDto.DesiredRetirementIncome:
                    if (userRetirementPlan.DesiredLegacyAmount == null)
                    {
                        userRetirementPlan.DesiredLegacyAmount = 0;
                    }

                    userRetiretmentData.DesiredRetirementSum   = FinancialCalculations.PV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetirementPlan.DesiredRetirementIncome * -12, (double)userRetirementPlan.DesiredLegacyAmount) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetiretmentData.InitialNet             = userRetirementPlan.InitialSaved + userRetirementPlan.InitialOwed;
                    userRetiretmentData.RequiredSavings        = FinancialCalculations.PMT((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetiretmentData.InitialNet, -(double)userRetiretmentData.DesiredRetirementSum) / 12;
                    userRetiretmentData.TotalMonthlySavings    = userRetirementPlan.TotalMonthlyIncome - userRetirementPlan.TotalMonthlyExpences;
                    userRetiretmentData.LikelyRetirementSum    = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetiretmentData.TotalMonthlySavings * -12, (double)-userRetiretmentData.InitialNet) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetiretmentData.LikelyRetirementLegacy = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetirementPlan.DesiredRetirementIncome * 12, -(double)userRetiretmentData.LikelyRetirementSum);

                    break;

                //Variable age
                case RetirementGoalsEnumDto.DesiredLegacyAmount:

                    userRetiretmentData.DesiredRetirementAge = countryData.RetirementAge;
                    userRetiretmentData.DesiredRetirementSum = FinancialCalculations.PV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetirementPlan.DesiredRetirementIncome * -12, (double)userRetirementPlan.DesiredLegacyAmount) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetiretmentData.InitialNet           = userRetirementPlan.InitialSaved + userRetirementPlan.InitialOwed;
                    userRetiretmentData.TotalMonthlySavings  = userRetirementPlan.TotalMonthlyIncome - userRetirementPlan.TotalMonthlyExpences;
                    userRetiretmentData.RequiredSavings      = FinancialCalculations.PMT((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetiretmentData.InitialNet, -(double)userRetiretmentData.DesiredRetirementSum) / 12;
                    userRetiretmentData.LikelyRetirementSum  = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetiretmentData.InitialNet * -12, (double)-userRetiretmentData.InitialNet) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetiretmentData.LikelyRetirementAge  = Math.Round((((double)userRetirementPlan.DesiredRetirementSum - (double)userRetiretmentData.LikelyRetirementSum) / (((double)userRetiretmentData.TotalMonthlySavings + (double)userRetirementPlan.DesiredRetirementIncome) * 12)) + (double)userRetirementPlan.DesiredRetirementAge, MidpointRounding.AwayFromZero);

                    break;

                //Variable legacy
                case RetirementGoalsEnumDto.DesiredRetirementAge:
                    if (userRetirementPlan.DesiredLegacyAmount == null)
                    {
                        userRetirementPlan.DesiredLegacyAmount = 0;
                    }

                    userRetiretmentData.DesiredRetirementSum   = FinancialCalculations.PV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetirementPlan.DesiredRetirementIncome * -12, (double)userRetirementPlan.DesiredLegacyAmount) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetiretmentData.InitialNet             = userRetirementPlan.InitialSaved + userRetirementPlan.InitialOwed;
                    userRetiretmentData.RequiredSavings        = FinancialCalculations.PMT((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetiretmentData.InitialNet, -(double)userRetiretmentData.DesiredRetirementSum) / 12;
                    userRetiretmentData.TotalMonthlySavings    = userRetirementPlan.TotalMonthlyIncome - userRetirementPlan.TotalMonthlyExpences;
                    userRetiretmentData.LikelyRetirementSum    = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetiretmentData.TotalMonthlySavings * -12, (double)-userRetiretmentData.InitialNet) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetiretmentData.LikelyRetirementLegacy = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetirementPlan.DesiredRetirementIncome * 12, -(double)userRetiretmentData.LikelyRetirementSum);

                    break;

                case RetirementGoalsEnumDto.PlaceToLiveAfterRetirement:

                    break;

                default:

                    userRetiretmentData.DesiredRetirementAge = countryData.RetirementAge;
                    userRetiretmentData.DesiredLegacyAmount  = 0;

                    break;
                }

                await _userRetirementPlanRepository.UpdateAsync(userRetiretmentData);
            }
            catch (UserFriendlyException e)
            {
                throw new UserFriendlyException(e.Message);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        public async Task CreateUser(AutumnUserDto input)
        {
            try
            {
                var user = ObjectMapper.Map <User>(input); //Passwords is not mapped (see mapping configuration)
                user.TenantId = null;

                await UserManager.InitializeOptionsAsync(AbpSession.TenantId);

                foreach (var validator in _passwordValidators)
                {
                    CheckErrors(await validator.ValidateAsync(UserManager, user, input.Password));
                }

                user.Password = _passwordHasher.HashPassword(user, input.Password);
                user.Surname  = "xyz";
                //Assign roles
                var role = await _roleManager.GetRoleByNameAsync(StaticRoleNames.Host.User);

                user.Roles              = new Collection <UserRole>();
                user.CreatorUserId      = null;
                user.DeleterUserId      = null;
                user.LastModifierUserId = null;
                user.Roles.Add(new UserRole(null, user.Id, role.Id));

                CheckErrors(await UserManager.CreateAsync(user));
                await CurrentUnitOfWork.SaveChangesAsync(); //To get new user's Id.

                //Notifications
                await _notificationSubscriptionManager.SubscribeToAllAvailableNotificationsAsync(user.ToUserIdentifier());

                await _appNotifier.WelcomeToTheApplicationAsync(user);

                //Organization Units
                //await UserManager.SetOrganizationUnitsAsync(user, input.OrganizationUnits.ToArray());

                //Send activation email
                //if (input.SendActivationEmail)
                //{
                //    user.SetNewEmailConfirmationCode();
                //    await _userEmailer.SendEmailActivationLinkAsync(
                //        user,
                //        AppUrlService.CreateEmailActivationUrlFormat(AbpSession.TenantId),
                //        input.User.Password
                //    );
                //}

                var userRetirementPlan = ObjectMapper.Map <UserRetirementPlanDto>(input);
                userRetirementPlan.UserId     = user.Id;
                userRetirementPlan.ReturnRate = 0;
                var countryData = _countryRepository.FirstOrDefault((int)user.CountryId);
                switch (userRetirementPlan.RetirementGoalOptions)
                {
                //Variable legacy
                case RetirementGoalsEnumDto.DesiredRetirementSum:
                    if (userRetirementPlan.DesiredLegacyAmount == null)
                    {
                        userRetirementPlan.DesiredLegacyAmount = 0;
                    }

                    userRetirementPlan.DesiredRetirementIncome = FinancialCalculations.PMT((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, -(double)userRetirementPlan.DesiredRetirementSum, (double)userRetirementPlan.DesiredLegacyAmount) / 12;
                    userRetirementPlan.InitialNet             = userRetirementPlan.InitialSaved - userRetirementPlan.InitialOwed;
                    userRetirementPlan.RequiredSavings        = FinancialCalculations.PMT((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetirementPlan.InitialNet, -(double)userRetirementPlan.DesiredRetirementSum) / 12;
                    userRetirementPlan.TotalMonthlySavings    = userRetirementPlan.TotalMonthlyIncome - userRetirementPlan.TotalMonthlyExpences;
                    userRetirementPlan.LikelyRetirementSum    = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetirementPlan.TotalMonthlySavings * -12, (double)-userRetirementPlan.InitialNet) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetirementPlan.LikelyRetirementLegacy = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetirementPlan.DesiredRetirementIncome * 12, -(double)userRetirementPlan.LikelyRetirementSum);

                    break;

                //Variable legacy
                case RetirementGoalsEnumDto.DesiredRetirementIncome:
                    if (userRetirementPlan.DesiredLegacyAmount == null)
                    {
                        userRetirementPlan.DesiredLegacyAmount = 0;
                    }

                    userRetirementPlan.DesiredRetirementSum   = FinancialCalculations.PV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetirementPlan.DesiredRetirementIncome * -12, (double)userRetirementPlan.DesiredLegacyAmount) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetirementPlan.InitialNet             = userRetirementPlan.InitialSaved - userRetirementPlan.InitialOwed;
                    userRetirementPlan.RequiredSavings        = FinancialCalculations.PMT((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetirementPlan.InitialNet, -(double)userRetirementPlan.DesiredRetirementSum) / 12;
                    userRetirementPlan.TotalMonthlySavings    = userRetirementPlan.TotalMonthlyIncome - userRetirementPlan.TotalMonthlyExpences;
                    userRetirementPlan.LikelyRetirementSum    = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetirementPlan.TotalMonthlySavings * -12, (double)-userRetirementPlan.InitialNet) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetirementPlan.LikelyRetirementLegacy = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetirementPlan.DesiredRetirementIncome * 12, -(double)userRetirementPlan.LikelyRetirementSum);

                    break;

                //Variable age
                case RetirementGoalsEnumDto.DesiredLegacyAmount:

                    userRetirementPlan.DesiredRetirementAge = countryData.RetirementAge;
                    userRetirementPlan.DesiredRetirementSum = FinancialCalculations.PV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetirementPlan.DesiredRetirementIncome * -12, (double)userRetirementPlan.DesiredLegacyAmount) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetirementPlan.InitialNet           = userRetirementPlan.InitialSaved - userRetirementPlan.InitialOwed;
                    userRetirementPlan.TotalMonthlySavings  = userRetirementPlan.TotalMonthlyIncome - userRetirementPlan.TotalMonthlyExpences;
                    userRetirementPlan.RequiredSavings      = FinancialCalculations.PMT((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetirementPlan.InitialNet, -(double)userRetirementPlan.DesiredRetirementSum) / 12;
                    userRetirementPlan.LikelyRetirementSum  = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetirementPlan.InitialNet * -12, (double)-userRetirementPlan.InitialNet) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetirementPlan.LikelyRetirementAge  = Math.Round((((double)userRetirementPlan.DesiredRetirementSum - (double)userRetirementPlan.LikelyRetirementSum) / (((double)userRetirementPlan.TotalMonthlySavings + (double)userRetirementPlan.DesiredRetirementIncome) * 12)) + (double)userRetirementPlan.DesiredRetirementAge, MidpointRounding.AwayFromZero);

                    break;

                //Variable legacy
                case RetirementGoalsEnumDto.DesiredRetirementAge:
                    if (userRetirementPlan.DesiredLegacyAmount == null)
                    {
                        userRetirementPlan.DesiredLegacyAmount = 0;
                    }

                    userRetirementPlan.DesiredRetirementSum   = FinancialCalculations.PV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetirementPlan.DesiredRetirementIncome * -12, (double)userRetirementPlan.DesiredLegacyAmount) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetirementPlan.InitialNet             = userRetirementPlan.InitialSaved - userRetirementPlan.InitialOwed;
                    userRetirementPlan.RequiredSavings        = FinancialCalculations.PMT((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetirementPlan.InitialNet, -(double)userRetirementPlan.DesiredRetirementSum) / 12;
                    userRetirementPlan.TotalMonthlySavings    = userRetirementPlan.TotalMonthlyIncome - userRetirementPlan.TotalMonthlyExpences;
                    userRetirementPlan.LikelyRetirementSum    = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age, (double)userRetirementPlan.TotalMonthlySavings * -12, (double)-userRetirementPlan.InitialNet) * (Math.Pow(1 + (double)userRetirementPlan.ReturnRate, (double)userRetirementPlan.DesiredRetirementAge - (double)user.Age));
                    userRetirementPlan.LikelyRetirementLegacy = FinancialCalculations.FV((double)userRetirementPlan.ReturnRate, countryData.LifeExpectancy - (double)userRetirementPlan.DesiredRetirementAge, (double)userRetirementPlan.DesiredRetirementIncome * 12, -(double)userRetirementPlan.LikelyRetirementSum);

                    break;

                case RetirementGoalsEnumDto.PlaceToLiveAfterRetirement:

                    break;

                default:

                    userRetirementPlan.DesiredRetirementAge = countryData.RetirementAge;
                    userRetirementPlan.DesiredLegacyAmount  = 0;

                    break;
                }

                await _userRetirementPlanRepository.InsertAsync(ObjectMapper.Map <UserRetirementPlan>(userRetirementPlan));
            }
            catch (UserFriendlyException e)
            {
                throw new UserFriendlyException(e.Message);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        public async Task <GraphDataDto> GenGraphData(AutumnUserDto userInfo)
        {
            try
            {
                userInfo.ReturnRate = 0;
                var          countryData = _countryRepository.FirstOrDefault(userInfo.CountryId);
                GraphDataDto data        = new GraphDataDto()
                {
                    CurrentAge     = userInfo.Age,
                    DesRetSum      = userInfo.DesiredRetirementSum == null ? 0 : (double)userInfo.DesiredRetirementSum,
                    LifeExpectancy = countryData.LifeExpectancy,
                    LikRetLegacies = new List <double>(),
                    LikRetSums     = new List <double>(),
                    RetirementAges = new List <int>()
                };
                if (userInfo.RetirementGoalOptions == RetirementGoalsEnumDto.DesiredRetirementSum ||
                    userInfo.RetirementGoalOptions == RetirementGoalsEnumDto.DesiredRetirementIncome ||
                    userInfo.RetirementGoalOptions == RetirementGoalsEnumDto.DesiredRetirementAge)
                {
                    userInfo.DesiredLegacyAmount = 0;
                }
                for (int i = userInfo.Age + 1, j = 0; i < countryData.LifeExpectancy; i++)
                {
                    data.RetirementAges.Add(i);
                    switch (userInfo.RetirementGoalOptions)
                    {
                    //Variable legacy
                    case RetirementGoalsEnumDto.DesiredRetirementSum:

                        userInfo.DesiredRetirementIncome = FinancialCalculations.PMT((double)userInfo.ReturnRate, i - userInfo.Age, -(double)userInfo.DesiredRetirementSum, (double)userInfo.DesiredLegacyAmount) / 12;
                        userInfo.InitialNet = userInfo.InitialSaved - userInfo.InitialOwed;
                        //userInfo.RequiredSavings = FinancialCalculations.PMT((double)userInfo.ReturnRate, i - userInfo.Age, (double)userInfo.InitialNet, -(double)userInfo.DesiredRetirementSum) / 12;
                        userInfo.TotalMonthlySavings = userInfo.TotalMonthlyIncome - userInfo.TotalMonthlyExpences;
                        data.LikRetSums.Add(FinancialCalculations.FV((double)userInfo.ReturnRate, i - userInfo.Age, (double)userInfo.TotalMonthlySavings * -12, (double)-userInfo.InitialNet) * (Math.Pow(1 + (double)userInfo.ReturnRate, i - userInfo.Age)));
                        data.LikRetLegacies.Add(FinancialCalculations.FV((double)userInfo.ReturnRate, countryData.LifeExpectancy - i, (double)userInfo.DesiredRetirementIncome * 12, -(double)data.LikRetSums[j]));

                        break;

                    //Variable legacy
                    case RetirementGoalsEnumDto.DesiredRetirementIncome:

                        userInfo.DesiredRetirementSum = FinancialCalculations.PV((double)userInfo.ReturnRate, countryData.LifeExpectancy - i, (double)userInfo.DesiredRetirementIncome * -12, (double)userInfo.DesiredLegacyAmount) * (Math.Pow(1 + (double)userInfo.ReturnRate, i - userInfo.Age));
                        userInfo.InitialNet           = userInfo.InitialSaved - userInfo.InitialOwed;
                        //userInfo.RequiredSavings = FinancialCalculations.PMT((double)userInfo.ReturnRate, i - userInfo.Age, (double)userInfo.InitialNet, -(double)userInfo.DesiredRetirementSum) / 12;
                        userInfo.TotalMonthlySavings = userInfo.TotalMonthlyIncome - userInfo.TotalMonthlyExpences;
                        data.LikRetSums.Add(FinancialCalculations.FV((double)userInfo.ReturnRate, i - userInfo.Age, (double)userInfo.TotalMonthlySavings * -12, (double)-userInfo.InitialNet) * Math.Pow(1 + (double)userInfo.ReturnRate, i - userInfo.Age));
                        data.LikRetLegacies.Add(FinancialCalculations.FV((double)userInfo.ReturnRate, countryData.LifeExpectancy - i, (double)userInfo.DesiredRetirementIncome * 12, -(double)data.LikRetSums[j]));

                        break;

                    //Variable age
                    case RetirementGoalsEnumDto.DesiredLegacyAmount:

                        userInfo.DesiredRetirementAge = i;
                        userInfo.DesiredRetirementSum = FinancialCalculations.PV((double)userInfo.ReturnRate, countryData.LifeExpectancy - i, (double)userInfo.DesiredRetirementIncome * -12, (double)userInfo.DesiredLegacyAmount) * (Math.Pow(1 + (double)userInfo.ReturnRate, i - userInfo.Age));
                        userInfo.InitialNet           = userInfo.InitialSaved - userInfo.InitialOwed;
                        userInfo.TotalMonthlySavings  = userInfo.TotalMonthlyIncome - userInfo.TotalMonthlyExpences;
                        //userInfo.RequiredSavings = FinancialCalculations.PMT((double)userInfo.ReturnRate, i - userInfo.Age, (double)userInfo.InitialNet, -(double)userInfo.DesiredRetirementSum) / 12;
                        data.LikRetSums.Add(FinancialCalculations.FV((double)userInfo.ReturnRate, i - userInfo.Age, (double)userInfo.InitialNet * -12, (double)-userInfo.InitialNet) * Math.Pow(1 + (double)userInfo.ReturnRate, i - userInfo.Age));
                        //userInfo.LikelyRetirementAge = Math.Round((((double)userInfo.DesiredRetirementSum - (double)data.LikRetSums[j]) / (((double)userInfo.TotalMonthlySavings + (double)userInfo.DesiredRetirementIncome) * 12)) + i, MidpointRounding.AwayFromZero);

                        break;

                    //Variable legacy
                    case RetirementGoalsEnumDto.DesiredRetirementAge:

                        userInfo.DesiredRetirementSum = FinancialCalculations.PV((double)userInfo.ReturnRate, countryData.LifeExpectancy - i, (double)userInfo.DesiredRetirementIncome * -12, (double)userInfo.DesiredLegacyAmount) * (Math.Pow(1 + (double)userInfo.ReturnRate, i - userInfo.Age));
                        userInfo.InitialNet           = userInfo.InitialSaved - userInfo.InitialOwed;
                        //userInfo.RequiredSavings = FinancialCalculations.PMT((double)userInfo.ReturnRate, i - userInfo.Age, (double)userInfo.InitialNet, -(double)userInfo.DesiredRetirementSum) / 12;
                        userInfo.TotalMonthlySavings = userInfo.TotalMonthlyIncome - userInfo.TotalMonthlyExpences;
                        data.LikRetSums.Add(FinancialCalculations.FV((double)userInfo.ReturnRate, i - userInfo.Age, (double)userInfo.TotalMonthlySavings * -12, (double)-userInfo.InitialNet) * Math.Pow(1 + (double)userInfo.ReturnRate, i - userInfo.Age));
                        data.LikRetLegacies.Add(FinancialCalculations.FV((double)userInfo.ReturnRate, countryData.LifeExpectancy - i, (double)userInfo.DesiredRetirementIncome * 12, -(double)data.LikRetSums[j]));

                        break;

                    case RetirementGoalsEnumDto.PlaceToLiveAfterRetirement:

                        break;

                    default:

                        userInfo.DesiredRetirementAge = i;
                        userInfo.DesiredLegacyAmount  = 0;

                        break;
                    }
                }
                return(data);
            }
            catch (UserFriendlyException e)
            {
                throw new UserFriendlyException(e.Message);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }