public NewLoanResponseModel Calculate(NewLoanRequestModel requestModel, String cookieValue) { RequestHistoryResponseModel requestHistory = null; if (cookieValue != null) { UserRequestModel user = _jWTService.decodeJWTAsync(cookieValue).Result; requestHistory = new RequestHistoryResponseModel(); requestHistory.Request_Time = DateTime.Now; requestHistory.Calculator_Type = "credit"; requestHistory.User = user; } var validated = _newLoanValidator.Validate(requestModel); if (!validated.IsValid) { _logger.Error($"New Loan BadRequest! {validated}"); return(new NewLoanResponseModel { Status = HttpStatusCode.BadRequest, ErrorMessage = validated.ToString() }); } try { var plan = requestModel.InstallmentType == Installments.AnnuityInstallment ? CalcHelpers.GetAnuityPlan(requestModel).ToList() : CalcHelpers.GetDecreasingPlan(requestModel).ToList(); var totalFeesCost = plan.Sum(x => x.Fees); var totalMonthlyInstallmentsCost = plan.Sum(x => x.MonthlyInstallment); var totalInterestCost = plan.Sum(x => x.InterestInstallment); NewLoanResponseModel newLoanResponse = new NewLoanResponseModel { Status = HttpStatusCode.OK, //AnnualPercentCost = CalcHelpers.CalculateAPR(totalFeesCost, totalInterestCost, requestModel.LoanAmount, requestModel.Period), AnnualPercentCost = 0, TotalCost = totalMonthlyInstallmentsCost + totalFeesCost, FeesCost = totalFeesCost, InterestsCost = totalInterestCost, InstallmentsCost = totalMonthlyInstallmentsCost, RepaymentPlan = plan }; if (requestHistory != null) { requestHistory.Calculation_Result = "Input:" + requestModel.ToString().Trim() + "Result: " + newLoanResponse.ToString().Trim(); requestHistory.User_Agent = requestModel.UserAgent; _requestHistoryDataService.insertRequest(requestHistory); } return(newLoanResponse); } catch (Exception ex) { _logger.Error($"An error occured while trying to calculate new loan.\nInput: {requestModel}\nMessage: {ex.Message}"); return(new NewLoanResponseModel { Status = HttpStatusCode.InternalServerError, ErrorMessage = "Something went wrong. Please contact our support team." }); } }
public LeasingLoanResponseModel Calculate(LeasingLoanRequestModel requestModel, string cookieValue) { RequestHistoryResponseModel requestHistory = null; if (cookieValue != null) { UserRequestModel user = _jWTService.decodeJWTAsync(cookieValue).Result; requestHistory = new RequestHistoryResponseModel(); requestHistory.Request_Time = DateTime.Now; requestHistory.Calculator_Type = "leasing"; requestHistory.User = user; } var validated = _leasingLoanValidator.Validate(requestModel); if (!validated.IsValid) { _logger.Error($"Leasing Loan BadRequest! {validated}"); return(new LeasingLoanResponseModel { Status = HttpStatusCode.BadRequest, ErrorMessage = validated.ToString() }); } //TO DO: AnnualPercentCost how to calculate ? try { var totalFees = CalcHelpers.GetFeeCost(requestModel.StartingFee, requestModel.ProductPrice); var totalCost = totalFees + requestModel.StartingInstallment + requestModel.Period * requestModel.MonthlyInstallment; if (totalCost < requestModel.ProductPrice) { return(new LeasingLoanResponseModel { Status = HttpStatusCode.BadRequest, ErrorMessage = "You cannot have a leasing loan with these parameters." }); } LeasingLoanResponseModel leasingLoanResponse = new LeasingLoanResponseModel { Status = HttpStatusCode.OK, //AnnualPercentCost TotalCost = totalCost, TotalFees = totalFees }; if (requestHistory != null) { requestHistory.Calculation_Result = "Input: " + requestModel.ToString().Trim() + " Result: " + leasingLoanResponse.ToString().Trim(); requestHistory.User_Agent = requestModel.UserAgent; _requestHistoryDataService.insertRequest(requestHistory); } return(leasingLoanResponse); } catch (Exception ex) { _logger.Error($"An error occured while trying to calculate leasing loan.\nInput: {requestModel}\nMessage: {ex.Message}"); return(new LeasingLoanResponseModel { Status = HttpStatusCode.InternalServerError, ErrorMessage = "Something went wrong. Please contact our support team." }); } }
public RefinancingLoanResponseModel Calculate(RefinancingLoanRequestModel requestModel, String cookieValue) { RequestHistoryResponseModel requestHistory = null; if (cookieValue != null) { UserRequestModel user = _jWTService.decodeJWTAsync(cookieValue).Result; requestHistory = new RequestHistoryResponseModel(); requestHistory.Request_Time = DateTime.Now; requestHistory.Calculator_Type = "refinance"; requestHistory.User = user; } var validated = _refinancingLoanValidator.Validate(requestModel); if (!validated.IsValid) { _logger.Error($"Refinancing Loan BadRequest! {validated}"); return(new RefinancingLoanResponseModel { Status = HttpStatusCode.BadRequest, ErrorMessage = validated.ToString() }); } try { var plan = CalcHelpers.GetAnuityPlan(new NewLoanRequestModel { LoanAmount = requestModel.LoanAmount, Period = requestModel.Period, Interest = requestModel.Interest, InstallmentType = Installments.AnnuityInstallment }).ToList(); var periodLeft = requestModel.Period - requestModel.CountOfPaidInstallments; var monthlyInstallmentCurrentLoan = plan.First(x => x.Id == 1).MonthlyInstallment; var moneyLeftToBePaid = requestModel.LoanAmount - plan.Where(x => x.Id <= requestModel.CountOfPaidInstallments).Sum(x => x.PrincipalInstallment); var earlyInstallmentsFeeInCurrency = CalcHelpers.GetFeeCost(requestModel.EarlyInstallmentsFee, moneyLeftToBePaid); var newPlan = CalcHelpers.GetAnuityPlan(new NewLoanRequestModel { LoanAmount = Math.Floor(moneyLeftToBePaid), Period = periodLeft, Interest = requestModel.NewInterest, InstallmentType = Installments.AnnuityInstallment, Fees = new List <FeeModel> { new FeeModel { Type = FeeType.StartingApplicationFee, Value = requestModel.StartingFeesCurrency, ValueType = FeeValueType.Currency }, new FeeModel { Type = FeeType.OtherStartingFees, Value = requestModel.StartingFeesPercent, ValueType = FeeValueType.Percent } } }).ToList(); var monthlyInstallmentNewLoan = newPlan.First(x => x.Id == 1).MonthlyInstallment; var totalCostNewLoan = periodLeft * monthlyInstallmentNewLoan + earlyInstallmentsFeeInCurrency + requestModel.StartingFeesCurrency + requestModel.StartingFeesPercent + CalcHelpers.GetFeeCost(requestModel.StartingFeesPercent, moneyLeftToBePaid); RefinancingLoanResponseModel refinancingLoanResponse = new RefinancingLoanResponseModel { Status = HttpStatusCode.OK, CurrentLoan = new RefinancingLoanHelperModel { Interest = requestModel.Interest, Period = requestModel.Period, EarlyInstallmentsFee = earlyInstallmentsFeeInCurrency, MonthlyInstallment = monthlyInstallmentCurrentLoan, Total = periodLeft * monthlyInstallmentCurrentLoan }, NewLoan = new RefinancingLoanHelperModel { Interest = requestModel.NewInterest, Period = periodLeft, MonthlyInstallment = monthlyInstallmentNewLoan, Total = totalCostNewLoan } }; if (requestHistory != null) { requestHistory.Calculation_Result = "Input: " + requestModel.ToString().Trim() + "Result: " + refinancingLoanResponse.ToString().Trim(); requestHistory.User_Agent = requestModel.UserAgent; _requestHistoryDataService.insertRequest(requestHistory); } return(refinancingLoanResponse); } catch (Exception ex) { _logger.Error($"An error occured while trying to calculate new loan.\nInput: {requestModel}\nMessage: {ex.Message}"); return(new RefinancingLoanResponseModel { Status = HttpStatusCode.InternalServerError, ErrorMessage = "Something went wrong. Please contact our support team." }); } }