Example #1
0
        public IEnumerable <LoanOffer> GetLoanOffers()
        {
            var loanOffers = new List <LoanOffer>();

            if (!File.Exists(filename))
            {
                throw new Exception("The specified file does not exist");
            }

            using (var reader = File.OpenText(filename))
            {
                var line = reader.ReadLine();                 // Read and ignore first line as it contains the headers.
                while ((line = reader.ReadLine()) != null)
                {
                    var columns   = line.Split(',');
                    var loanOffer = new LoanOffer
                    {
                        LenderName = columns[0],
                        Rate       = decimal.Parse(columns[1]),
                        Amount     = decimal.Parse(columns[2])
                    };
                    loanOffers.Add(loanOffer);
                }
            }

            return(loanOffers);
        }
Example #2
0
 public LoanOfferReportResult(LoanOffer loanOffer, bool isExcel, bool isShowDetails, Customer customer)
 {
     _loanOffer     = loanOffer;
     _isExcel       = isExcel;
     _isShowDetails = isShowDetails;
     _customer      = customer;
 }
Example #3
0
        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 byte[] GenerateReport(LoanOffer loanOffer, bool isExcel, bool isShowDetails, string header)
        {
            var worksheet = _workbook.Worksheets[_workbook.Worksheets.ActiveSheetIndex];

            worksheet.Name = "Loan Offer";

            int row    = 6;
            int column = 1;

            _workbook.ChangePalette(Color.FromArgb(197, 197, 197), 55);
            _workbook.ChangePalette(Color.FromArgb(221, 221, 221), 54);
            _workbook.ChangePalette(Color.FromArgb(123, 178, 36), 53);

            HeaderReportGenerator.CreateHeader(worksheet, header, column - 1, column, 7);

            worksheet.Cells.SetColumnWidth(0, 1);
            worksheet.Cells.SetColumnWidth(1, 16);
            worksheet.Cells.SetColumnWidth(2, 15);

            CreateXlsHeader(worksheet, row, column);
            var i = 0;

            foreach (var item in loanOffer.Schedule)
            {
                row++;
                i++;
                worksheet.Cells[row, column].PutValue(item.Date.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture));
                worksheet.Cells[row, column + 1].PutValue("£" + FormattingUtils.FormatMiddle(item.LoanRepayment));
                worksheet.Cells[row, column + 2].PutValue("£" + FormattingUtils.FormatMiddle(item.Interest));
                worksheet.Cells[row, column + 3].PutValue(FormattingUtils.FormatMiddle(item.InterestRate * 100) + "%");
                var fee = loanOffer.SetupFee > 0 && i == 1 ? loanOffer.SetupFee : 0;
                if (item.Fees > 0)
                {
                    fee += item.Fees;
                }
                var res  = fee != 0 ? "£" + FormattingUtils.FormatMiddle(fee) : "-";
                var res1 = loanOffer.SetupFee > 0 && i == 1 ? "*" : string.Empty;
                worksheet.Cells[row, column + 4].PutValue(res + res1);
                //worksheet.Cells.Merge(row, column + 5, 1, 3);
                worksheet.Cells[row, column + 5].PutValue("£" + FormattingUtils.FormatMiddle(item.AmountDue));
                SetCellStyle(worksheet, row, column, false);
            }

            row = CreateTotalBlock(loanOffer, row, column, worksheet);

            if (loanOffer.Details.IsModified)
            {
                row++;
                worksheet.Cells.Merge(row, column, 1, 7);
                worksheet.Cells[row, column].PutValue("Offer was manually modified");
                worksheet.Cells[row, column].Style.Font.IsBold = true;
            }
            if (isShowDetails)
            {
                CreateDetails(loanOffer.Details, row, column, worksheet);
            }

            return(ConvertFormat(_workbook, isExcel ? FileFormatType.Excel2003 : FileFormatType.Pdf));
        }
Example #5
0
        // [Transactional]
        public JsonResult Calculate(int amount, int loanType, int repaymentPeriod)
        {
            log.Debug(
                "Calculating schedule for customer {0}: {1} of type {2} for {3} repayments.",
                this.context.Customer.Stringify(),
                amount.ToString("C0"),
                loanType,
                repaymentPeriod
                );

            // el: slider of offer display (customer app)
            LoanOffer loanOffer = CalculateLoan(amount, loanType, repaymentPeriod);

            log.Debug(
                "Calculating schedule for customer {0}: {1} of type {2} for {3} repayments - loan offer is {4}.",
                this.context.Customer.Stringify(),
                amount.ToString("C0"),
                loanType,
                repaymentPeriod,
                loanOffer == null ? "-- null --" : "-- not null --"
                );

            if (loanOffer == null)
            {
                return(Json(new { error = "Invalid customer state" }, JsonRequestBehavior.AllowGet));
            }

            log.Debug(
                "Calculating schedule for customer {0}: {1} of type {2} for {3} repayments - hunting for legal docs...",
                this.context.Customer.Stringify(),
                amount.ToString("C0"),
                loanType,
                repaymentPeriod
                );

            var productSubTypeID = this.context.Customer.LastCashRequest.ProductSubTypeID;
            var originId         = this.context.Customer.CustomerOrigin.CustomerOriginID;
            var isRegulated      = this.context.Customer.PersonalInfo.TypeOfBusiness.IsRegulated();

            loanOffer.Templates = this.serviceClient.Instance.GetLegalDocs(
                this.context.UserId,
                this.context.UserId,
                originId,
                isRegulated,
                productSubTypeID ?? 0
                ).LoanAgreementTemplates.ToList();

            log.Debug(
                "Completed calculating schedule for customer {0}: {1} of type {2} for {3} repayments.",
                this.context.Customer.Stringify(),
                amount.ToString("C0"),
                loanType,
                repaymentPeriod
                );

            return(Json(loanOffer, JsonRequestBehavior.AllowGet));
        }         // Calculate
Example #6
0
        public async Task UpdateAsync(LoanOffer loanOffer)
        {
            var request  = CreateUpdateItemRequest(loanOffer);
            var response = await _dynamoDbClient.UpdateItemAsync(request);

            if (response.HttpStatusCode != HttpStatusCode.OK)
            {
                throw new FailedToUpdateLoanOfferInDynamoDbException(response.HttpStatusCode);
            }
        }
Example #7
0
        public async Task AddAsync(LoanOffer loanOffer)
        {
            var request  = CreatePutLoanOfferRequest(loanOffer);
            var response = await _dynamoDbClient.PutItemAsync(request);

            if (response.HttpStatusCode != HttpStatusCode.OK)
            {
                throw new FailedToPutLoanOfferToDynamoDbException(response.HttpStatusCode);
            }
        }
        public void CalculateFutureValue()
        {
            var loan = new LoanOffer(LOAN_PERIOD_MONTHS);

            loan.Principle = LOAN_1_PRINCIPLE;
            loan.Rate      = LOAN_1_RATE;

            double totalRepayment = loan.GetTotalRepaymentValue();

            Assert.Equal(1111.58, totalRepayment);
        }
        public void CalculateMonthlyRepayment()
        {
            var loan = new LoanOffer(LOAN_PERIOD_MONTHS);

            loan.Principle = LOAN_1_PRINCIPLE;
            loan.Rate      = LOAN_1_RATE;

            double monthlyRepayment = loan.GetMonthlyRepaymentValue();

            Assert.Equal(30.88, monthlyRepayment);
        }
Example #10
0
        public void check_if_there_are_sufficient_offers(int available1, int available2, decimal loanRequested, bool expectedResult)
        {
            var bobOffer   = new LoanOffer("Bob", 0.075d, available1);
            var janeOffer  = new LoanOffer("Jane", 0.069d, available2);
            var loanOffers = new LoanOffers(new List <LoanOffer> {
                bobOffer, janeOffer
            });

            var result = loanOffers.HasSufficientOffersFor(new Money(loanRequested));

            result.Should().Be(expectedResult);
        }
Example #11
0
 private static UpdateItemRequest CreateUpdateItemRequest(LoanOffer loanOffer)
 => new UpdateItemRequest
 {
     TableName        = LoanOfferTableName,
     Key              = GetDictionaryWithIdAttribute(loanOffer.Id),
     AttributeUpdates = new Dictionary <string, AttributeValueUpdate>
     {
         { RequestedLoanAmountDynamoFiledName, new AttributeValueUpdate(new AttributeValue {
                 N = loanOffer.RequestedLoanAmount.ToString()
             }, AttributeAction.PUT) }
     }
 };
Example #12
0
        public void get_sufficient_loan_offers_sorted_by_rate_in_ascending_order()
        {
            var bobOffer   = new LoanOffer("Bob", 0.075d, 640);
            var janeOffer  = new LoanOffer("Jane", 0.069d, 480);
            var fredOffer  = new LoanOffer("Fred", 0.071d, 520);
            var loanOffers = new LoanOffers(new List <LoanOffer> {
                bobOffer, janeOffer, fredOffer
            });

            var sortedLoanOffers = loanOffers.GetSufficientSortedLoanOffers(new Money(900m));

            sortedLoanOffers.Should().ContainInOrder(janeOffer, fredOffer);
        }
Example #13
0
        public void Print_PrintError_Test()
        {
            //Arrange
            var loanOffer = new LoanOffer("Some Error");

            int counter = 0;

            var mockDelegate = new Mock <Action <string, object> >();

            mockDelegate.Setup(x => x("Error in the lenders file or the requested loan amount: \n\r Some Error", null)).Callback <string, object>((s, obj) => { counter++; });

            //Act
            loanOffer.Print(mockDelegate.Object);

            mockDelegate.Verify(foo => foo("Error in the lenders file or the requested loan amount: \n\r Some Error", null), Times.Once);
            Assert.AreEqual(1, counter);
        }
Example #14
0
        public void Print_Successful_Results_Test()
        {
            //Arrange
            var loanOffer = new LoanOffer(1500, 0.06, 30.78, 36);

            int counter = 0;

            var mockDelegate = new Mock <Action <string, object> >();

            mockDelegate.Setup(x => x("Requested amount: £1500\r\nRate: 6.0%\r\nMonthly repayment: £30.78\r\nTotal repayment: £1,108.08", null)).Callback <string, object>((s, obj) => { counter++; });

            //Act
            loanOffer.Print(mockDelegate.Object);

            mockDelegate.Verify(foo => foo("Requested amount: £1500\r\nRate: 6.0%\r\nMonthly repayment: £30.78\r\nTotal repayment: £1,108.08", null), Times.Once);
            Assert.AreEqual(1, counter);
        }
        private int CreateTotalBlock(LoanOffer loanOffer, int row, int column, Worksheet worksheet)
        {
            row += 2;
            worksheet.Cells.Merge(row, column, 2, 1);
            worksheet.Cells[row, column + 1].PutValue("Loan");
            worksheet.Cells[row + 1, column + 1].PutValue("£" + FormattingUtils.FormatMiddle(loanOffer.TotalPrincipal));

            worksheet.Cells.Merge(row, column + 2, 2, 1);
            worksheet.Cells.Merge(row, column + 3, 2, 1);

            worksheet.Cells[row, column + 4].PutValue("Cost");
            worksheet.Cells[row + 1, column + 4].PutValue("£" + FormattingUtils.FormatMiddle(loanOffer.TotalInterest));

            worksheet.Cells.Merge(row, column + 5, 2, 1);

            worksheet.Cells[row, column + 6].PutValue("Total");
            worksheet.Cells[row + 1, column + 6].PutValue("£" + FormattingUtils.FormatMiddle(loanOffer.Total));

            var filePath = System.Web.HttpContext.Current.Server.MapPath("~/Content/img/image-money64.png");

            worksheet.Pictures.Add(row, column + 0, filePath, 50, 50);

            filePath = System.Web.HttpContext.Current.Server.MapPath("~/Content/img/plus.png");
            worksheet.Pictures.Add(row, column + 2, filePath, 100, 80);

            filePath = System.Web.HttpContext.Current.Server.MapPath("~/Content/img/image-money32.png");
            worksheet.Pictures.Add(row, column + 3, filePath, 100, 80);

            filePath = System.Web.HttpContext.Current.Server.MapPath("~/Content/img/arrow-right.png");
            worksheet.Pictures.Add(row, column + 5, filePath, 100, 80);

            row += 2;

            worksheet.Cells.Merge(row, column + 0, 2, 7);
            worksheet.Cells[row, column + 0].PutValue(string.Format("Real Loan Cost ={0:0.00}%,    Apr={1}%",
                                                                    loanOffer.RealInterestCost * 100, loanOffer.Apr));

            //worksheet.Cells[row, column].GetMergedRange().SetOutlineBorder(BorderType.BottomBorder, CellBorderType.Thin, Color.FromArgb(197, 197, 197));
            //worksheet.Cells[row, column].GetMergedRange().SetOutlineBorder(BorderType.LeftBorder, CellBorderType.Thin, Color.FromArgb(197, 197, 197));
            //worksheet.Cells[row, column].GetMergedRange().SetOutlineBorder(BorderType.RightBorder, CellBorderType.Thin, Color.FromArgb(197, 197, 197));
            //worksheet.Cells[row, column].GetMergedRange().SetOutlineBorder(BorderType.TopBorder, CellBorderType.Thin, Color.FromArgb(197, 197, 197));
            return(row + 1);
        }
Example #16
0
 private static PutItemRequest CreatePutLoanOfferRequest(LoanOffer loanOffer)
 => new PutItemRequest
 {
     TableName = LoanOfferTableName,
     Item      = new Dictionary <string, AttributeValue>
     {
         { IdDynamoFieldName, new AttributeValue {
               S = loanOffer.Id.ToString()
           } },
         { PeselNumberDynamoFieldName, new AttributeValue {
               S = loanOffer.PeselNumber.Value
           } },
         { EmailAddressDynamoFieldName, new AttributeValue {
               S = loanOffer.EmailAddress.Value
           } },
         { MaxLoanAmountDynamoFieldName, new AttributeValue {
               N = loanOffer.MaxLoanAmount.ToString()
           } },
     }
 };
 public LoanOfferRepository()
 {
     if (_loanOffers is null)
     {
         _loanOffers = new List <LoanOffer>();
         var loanMortgageDetail = new LoanOffer()
         {
             Id       = 1,
             Interest = 0.035m,
             Type     = IntallmentType.Decreasing,
             Name     = LoanName.Mortgage,
         };
         _loanOffers.Add(loanMortgageDetail);
         var loanCarOffer = new LoanOffer()
         {
             Id       = 2,
             Interest = 0.095m,
             Type     = IntallmentType.Equal,
             Name     = LoanName.Car,
         };
         _loanOffers.Add(loanCarOffer);
     }
 }
Example #18
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
Example #19
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