private LoanOffer GetLoanOffer(long id) { var cr = _cashRequests.Get(id); var loan = _loanBuilder.CreateNewLoan(cr, cr.ApprovedSum(), cr.OfferStart.HasValue ? cr.OfferStart.Value : DateTime.UtcNow, cr.ApprovedRepaymentPeriod.HasValue ? cr.ApprovedRepaymentPeriod.Value : 12); var calc = new LoanRepaymentScheduleCalculator(loan, loan.Date, CurrentValues.Instance.AmountToChargeFrom); calc.GetState(); try { ServiceClient service = new ServiceClient(); long nlLoanId = service.Instance.GetLoanByOldID(loan.Id, cr.Customer.Id, 1).Value; if (nlLoanId > 0) { var nlModel = service.Instance.GetLoanState(loan.Customer.Id, nlLoanId, loan.Date, 1, true).Value; Log.InfoFormat("<<< NL_Compare: {0}\n===============loan: {1} >>>", nlModel, loan); } // ReSharper disable once CatchAllClause } catch (Exception ex) { Log.InfoFormat("<<< NL_Compare fail at: {0}, err: {1}", Environment.StackTrace, ex.Message); } var apr = loan.LoanAmount == 0 ? 0 : _aprCalc.Calculate(loan.LoanAmount, loan.Schedule, loan.SetupFee, loan.Date); var loanOffer = LoanOffer.InitFromLoan(loan, apr, null, cr); //TODO calculate offer Log.DebugFormat("calculate offer for customer {0}", cr.Customer.Id); return(loanOffer); }
public JsonResult GetOffer(GetInstantOfferModel model, CompanyInfo company) { var context = ObjectFactory.GetInstance <IWorkplaceContext>(); var response = this.m_oServiceClient.Instance.BrokerInstantOffer(new BrokerInstantOfferRequest { Created = DateTime.UtcNow, BrokerId = context.UserId, CompanyNameNumber = model.CompanyNameNumber, AnnualTurnover = model.AnnualTurnover, AnnualProfit = model.AnnualProfit, NumOfEmployees = model.NumOfEmployees, MainApplicantCreditScore = model.MainApplicantCreditScore, IsHomeOwner = model.IsHomeOwner, ExperianRefNum = company.BusRefNum, ExperianCompanyName = company.BusName, ExperianCompanyLegalStatus = company.LegalStatus, ExperianCompanyPostcode = company.PostCode }); var loanTypeRepository = ObjectFactory.GetInstance <LoanTypeRepository>(); var loanSourceRepository = ObjectFactory.GetInstance <LoanSourceRepository>(); var loanBuilder = ObjectFactory.GetInstance <LoanBuilder>(); var aprCalc = ObjectFactory.GetInstance <APRCalculator>(); var cr = new CashRequest { ApprovedRepaymentPeriod = response.Response.RepaymentPeriod, InterestRate = response.Response.InterestRate, LoanType = loanTypeRepository.Get(response.Response.LoanTypeId), LoanSource = loanSourceRepository.Get(response.Response.LoanSourceId), ManagerApprovedSum = response.Response.ApprovedSum, UseBrokerSetupFee = response.Response.UseBrokerSetupFee, UseSetupFee = response.Response.UseSetupFee, RepaymentPeriod = response.Response.RepaymentPeriod, LoanLegals = new List <LoanLegal>() }; var loan = loanBuilder.CreateNewLoan(cr, cr.ApprovedSum(), DateTime.UtcNow, cr.ApprovedRepaymentPeriod.HasValue ? cr.ApprovedRepaymentPeriod.Value : 12); var calc = new LoanRepaymentScheduleCalculator(loan, loan.Date, CurrentValues.Instance.AmountToChargeFrom); calc.GetState(); try { long nlLoanId = this.m_oServiceClient.Instance.GetLoanByOldID(loan.Id, loan.Customer.Id, context.UserId).Value; if (nlLoanId > 0) { var nlModel = this.m_oServiceClient.Instance.GetLoanState(loan.Customer.Id, nlLoanId, loan.Date, context.UserId, true).Value; ms_oLog.Info("<<< NL_Compare: {0}\n===============loan: {1} >>>", nlModel, loan); } // ReSharper disable once CatchAllClause } catch (Exception ex) { ms_oLog.Info("<<< NL_Compare fail at: {0}, err: {1}", Environment.StackTrace, ex.Message); } var apr = loan.LoanAmount == 0 ? 0 : aprCalc.Calculate(loan.LoanAmount, loan.Schedule, loan.SetupFee, loan.Date); var loanOffer = LoanOffer.InitFromLoan(loan, apr, null, cr); return(Json(loanOffer, JsonRequestBehavior.AllowGet)); } // GetOffer
} // Calculate private LoanOffer CalculateLoan(int amount, int loanType, int repaymentPeriod) { if (!this.context.Customer.CreditSum.HasValue) { log.Warn( "Cannot calculate loan ({0} of type {1} for {2} repayments) for customer {3}: credit sum is null.", amount.ToString("C0"), loanType, repaymentPeriod, this.context.Customer.Stringify() ); return(null); } // if if (this.context.Customer.Status != Status.Approved) { log.Warn( "Cannot calculate loan ({0} of type {1} for {2} repayments) for customer {3}: customer status is '{4}'.", amount.ToString("C0"), loanType, repaymentPeriod, this.context.Customer.Stringify(), this.context.Customer.Status ); return(null); } // if var creditSum = this.context.Customer.CreditSum.Value; this.context.Customer.ValidateOfferDate(); if (amount < 0) { amount = (int)Math.Floor(creditSum); } if (amount > creditSum) { log.Warn( "Attempt to calculate schedule for amount({0}) bigger than credit sum value({1})", amount, creditSum ); amount = (int)Math.Floor(creditSum); } // if var cr = this.context.Customer.LastCashRequest; if (this.context.Customer.IsLoanTypeSelectionAllowed == 1) { var oDBHelper = ObjectFactory.GetInstance <IDatabaseDataHelper>() as DatabaseDataHelper; if (oDBHelper != null) { cr.LoanType = oDBHelper.LoanTypeRepository.Get(loanType); } } // if if (cr.IsCustomerRepaymentPeriodSelectionAllowed) { cr.RepaymentPeriod = repaymentPeriod; } BuiltLoan builtLoan = this.loanBuilder.BuildLoan(cr, amount, DateTime.UtcNow, cr.RepaymentPeriod); var schedule = builtLoan.Loan.Schedule; var apr = this.aprCalc.Calculate(amount, schedule, builtLoan.Loan.SetupFee, builtLoan.Loan.Date); var b = new AgreementsModelBuilder(this.loanLegalRepo); var agreement = b.Build(this.context.Customer, amount, builtLoan.Loan); // TODO calculate offer log.Debug("calculate offer for customer {0}", this.context.Customer.Id); var loanOffer = LoanOffer.InitFromLoan(builtLoan.Loan, apr, agreement, cr); loanOffer.ManualSetupFeePercent = builtLoan.ManualSetupFeePercent; loanOffer.BrokerFeePercent = builtLoan.BrokerFeePercent; return(loanOffer); } // CalculateLoan