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);
        }
Exemple #2
0
        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
Exemple #3
0
        }         // 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