public async Task EvaluateApplication(LoanApplication loanApplication)
        {
            var score       = ApplicationScore.Green;
            var explanation = new List <string>();

            //property value
            if (loanApplication.Property.Value < loanApplication.LoanAmount)
            {
                score = ApplicationScore.Red;
                explanation.Add("Property value is lower than loan amount.");
            }

            //max age
            if (DateTime.Now.Year + loanApplication.LoanNumberOfYears - loanApplication.Customer.Birthdate.Year > 65)
            {
                score = ApplicationScore.Red;
                explanation.Add("Customer age at last installment date is above 65");
            }

            //income vs installment
            if (loanApplication.LoanAmount / (loanApplication.LoanNumberOfYears * 12) >
                loanApplication.Customer.MonthlyIncome * 0.15M)
            {
                score = ApplicationScore.Red;
                explanation.Add("Installment is higher than 15% of customer's income");
            }

            //is debtor
            var debtorInfo = await debtorRegistryClient.GetDebtorInfo(loanApplication.Customer.NationalIdentifier);

            if (debtorInfo.Debts.Any())
            {
                score = ApplicationScore.Red;
                explanation.Add("Customer is registered in debtor registry");
            }

            loanApplication.Score            = score;
            loanApplication.ScoreExplanation = string.Join(Environment.NewLine, explanation.ToArray());
        }
 public void ValidateLoanApplication(LoanApplication loanApplication)
 {
     new LoanApplicationValidator().ValidateAndThrow(loanApplication);
 }