Exemplo n.º 1
0
        public QuoteResult GetQuote(int loanAmount)
        {
            if (loanAmount < minimumLoanAmount)
            {
                return(new FailedQuoteResult($"Loan amount cannot be less than {minimumLoanAmount}"));
            }

            if (loanAmount > maximumLoanAmount)
            {
                return(new FailedQuoteResult($"Loan amount cannot be more than {maximumLoanAmount}"));
            }

            if (loanAmount % allowedIncrement != 0)
            {
                return(new FailedQuoteResult($"Loan amount must be an increment of {allowedIncrement}"));
            }

            var market = marketDataRepository.GetMarketData();

            if (market.Sum(x => x.Available) < loanAmount)
            {
                return(new FailedQuoteResult($"Insuffiecnet funds avaialble for the requested amount"));
            }

            // Calculate the best market available for the loan amount.
            var availableMarket = marketCalculator.AvailableMarket(loanAmount, market);

            // Calculate the intrest rate
            var rate = marketCalculator.CalculateIntrestRate(availableMarket);

            // Calculate the monthly repayment
            var monthlyRepayment = marketCalculator.CalulateMonthlyRepayments(loanAmount, rate, loanPeriod);

            // Calculate the total repayments
            var totalRepayment = marketCalculator.CalculateTotalRepayments(monthlyRepayment, loanPeriod);

            var quote = new Quote();

            quote.RequestedAmount  = loanAmount;
            quote.TotalRepayment   = totalRepayment;
            quote.MonthlyRepayment = monthlyRepayment;
            quote.Rate             = rate;

            return(new SuccessfulQuoteResult(quote));
        }