using BuddyFinance.Common.Helpers; using BuddyFinance.Integration.Logging; using BuddyFinance.Integration.Models; using BuddyFinance.Integration.Models.Enums; using BuddyFinance.Integration.Models.Profiles; using BuddyFinance.Model; using System; using System.Collections.Generic; using System.Data.Entity.Validation; using System.Linq; using System.Text; namespace BuddyFinance.Integration { public class BaseIntegrator { public readonly NotificationsIntegrator _notifications = new NotificationsIntegrator(); public Dictionary _feeTypes; public BaseIntegrator() { using (var db = new BuddyFinanceDBEntities()) { var feeTypes = db.FeeTypes.ToList(); _feeTypes = feeTypes.ToDictionary(i => (FeeTypesEnum)i.Id, i => new Fee { Id = i.Id, Amount = i.Amount, VatPercentage = i.VatPercentage, Description = i.Description, Percentage = i.Percentage, AmountForPercentUse = i.AmountForPercentUse, Basis = i.Basis }); } } public T Execute(Func code) where T : BaseResult, new() { try { return code.Invoke(); } catch (Exception ex) { var result = new T { ErrorCode = (int)ResponseCodes.Exception, ErrorMessage = ex.Message }; return result; } } private GlobalSetup _globalSetup { get; set; } public GlobalSetup GlobalSetup { get { if (_globalSetup == null) { using (var db = new BuddyFinanceDBEntities()) { _globalSetup = db.GlobalSetups.FirstOrDefault(); } } return _globalSetup; } } public Dictionary _fees { get { //if(_feeTypes == null || !_feeTypes.Any()) //using (var db = new BuddyFinanceDBEntities()) //{ // var feeTypes = db.FeeTypes.ToList(); // _feeTypes = feeTypes.ToDictionary(i => (FeeTypesEnum)i.Id, // i => new Fee // { // Id = i.Id, // Amount = i.Amount, // VatPercentage = i.VatPercentage, // Description = i.Description, // Percentage = i.Percentage, // AmountForPercentUse = i.AmountForPercentUse // }); //} return _feeTypes; } } public string GetExeptionString(Exception exception) { var contents = new StringBuilder(); if (exception is DbEntityValidationException) { foreach (var entityValidationError in ((DbEntityValidationException)exception).EntityValidationErrors) { contents.AppendLine($"Entity of type \"{entityValidationError.Entry.Entity.GetType().Name}\" in state \"{entityValidationError.Entry.State}\" has the following validation errors:"); foreach (var ve in entityValidationError.ValidationErrors) { contents.AppendLine($"- Property: \"{ve.PropertyName}\", Error: \"{ve.ErrorMessage}\""); } } contents.AppendFormat(exception.ToString()); } else { contents.AppendFormat(exception.ToString()); } return contents.ToString(); } public BaseResult LoanCulculator(LoanCalculatorModel model) { var results = new BaseResult(); try { using (var db = new BuddyFinanceDBEntities()) { // calulate interest /*var interest = (model.Amount * (model.Interest / 100)) / 6; var fullInterest = interest * model.Duration; var loanTotal = model.Amount + fullInterest;*/ var interestPercentage = model.Interest / 6; var subtractionAmount = model.Amount / model.Duration; var loanTotal = model.Amount; var fullInterest = 0.0; for(var i=0; i < model.Duration; i++) { fullInterest += (model.Amount - (subtractionAmount * i)) * (interestPercentage / 100); } loanTotal += fullInterest; // calulate service fee var serviceFee = _fees[FeeTypesEnum.ServiceFee]; var serviceFeeAmount = serviceFee.Amount * model.Duration; loanTotal = loanTotal + serviceFeeAmount; // calulate initiation fee var initiationFee = _fees[FeeTypesEnum.LoanInitiationFee]; double loanInitiationFee = 0; if (model.Amount <= initiationFee.Basis) { loanInitiationFee = initiationFee.Amount; } else { loanInitiationFee = ((model.Amount-initiationFee.Basis) * initiationFee.Percentage) + initiationFee.AmountForPercentUse; } loanTotal = loanTotal + loanInitiationFee; // calulate monthly installment var installment = loanTotal / model.Duration; results.Result = new LoanCalculatorResults { MonthlyPayment = installment, TotalPayment = loanTotal, InitialPayment = loanInitiationFee, FirstPaymentDate = DateTime.Today.GetNextPaymentDate(), Interest = fullInterest, Fees = new List { new Fee { Id = serviceFee.Id, Amount= serviceFeeAmount, Description = serviceFee.Description, Percentage = serviceFee.Percentage, AmountForPercentUse = serviceFee.AmountForPercentUse, Basis = serviceFee.Basis, VatPercentage = serviceFee.VatPercentage }, new Fee { Id = initiationFee.Id, Amount= loanInitiationFee, Description = initiationFee.Description, Percentage = initiationFee.Percentage, AmountForPercentUse = initiationFee.AmountForPercentUse, Basis = initiationFee.Basis, VatPercentage = initiationFee.VatPercentage } } }; results.ErrorCode = (int)ResponseCodes.Success; results.ErrorMessage = "Success"; } } catch (Exception ex) { results.ErrorCode = (int)ResponseCodes.Exception; results.ErrorMessage = "" + ex; } return results; } } }