public void SetRequestHistoryValues(RequestHistoryResponseModel requestHistory, string cookieValue, string calculatorType)
 {
     if (cookieValue != null)
     {
         UserRequestModel user = _jWTService.decodeJWTAsync(cookieValue).Result;
         requestHistory = new RequestHistoryResponseModel();
         requestHistory.Request_Time    = DateTime.Now;
         requestHistory.Calculator_Type = calculatorType;
         requestHistory.User            = user;
     }
 }
        public async void insertRequest(RequestHistoryResponseModel request)
        {
            using var conn = await _database.CreateConnectionAsync();

            var parameters = new
            {
                User_Id            = request.User.Id,
                User_Agent         = request.User_Agent,
                Calculation_Result = request.Calculation_Result,
                Calculator_Type    = request.Calculator_Type,
                Request_Time       = DateTime.Now
            };

            await conn.ExecuteAsync("INSERT INTO [Request_History](User_Id, User_Agent, Calculation_Result, Calculator_Type, Request_Time) " +
                                    "VALUES (@User_Id, @User_Agent, @Calculation_Result, @Calculator_Type, @Request_Time)", parameters);
        }
        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."
                });
            }
        }
Ejemplo n.º 5
0
        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."
                });
            }
        }