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); }
public LoanOfferReportResult(LoanOffer loanOffer, bool isExcel, bool isShowDetails, Customer customer) { _loanOffer = loanOffer; _isExcel = isExcel; _isShowDetails = isShowDetails; _customer = customer; }
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)); }
// [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
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); } }
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); }
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); }
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) } } };
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); }
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); }
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); }
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); } }
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