private static void handleRabbitMQOurBank(LoanRequest loanRequest)
        {
            //SSN;CreditScore;Amount;Duration
            string msg = string.Format("{0};{1};{2};{3}", loanRequest.SSN, loanRequest.CreditScore, loanRequest.Amount, loanRequest.Duration);

            LoanBroker.Utility.HandleMessaging.SendMessage <string>(QUEUE_OUT, msg);
        }
Example #2
0
        public Quote CreateQuote(LoanRequest request)
        {
            // Validation
            _loanRequestValidator.ValidateAndThrow(request);

            // Get lenders with required balance
            var lenders = _lendersService.GetAll().Where(x => x.Balance >= request.Amount);

            if (lenders == null || !lenders.Any())
            {
                throw new BusinessLogicException("No lenders found for the requested loan amount");
            }

            // Get cheapest lender
            var lender = lenders.OrderBy(x => x.AnnualPercentageYield).First();

            // Calculate monthly repayment
            var monthlyRepayment = _paymentsCalculator.GetMonthlyRepayments(request.Amount, lender.AnnualPercentageYield, request.Months);

            return(new Quote()
            {
                Id = new Random().Next(999), // In the real world, we could store quote and hence returning an id
                Amount = request.Amount,
                Months = request.Months,
                AnnualInterestRate = Math.Round(lender.AnnualPercentageYield * 100, 1),
                TotalRepayment = Math.Round(monthlyRepayment * request.Months, 2),
                MonthlyPayment = Math.Round(monthlyRepayment, 2),
            });
        }
        public bool SendMessage(EmailTemplateType type, Client client, LoanRequest loanRequest, string text = null)
        {
            var template = this.emailTemplatesService.GetByType(type);
            var body     = template.Text;
            var subject  = template.Subject;

            if (!string.IsNullOrEmpty(text))
            {
                body = body.Replace("{text}", text);
            }
            subject = subject.Replace("{firstname}", client.FirstName);
            body    = this.MassReplace(
                body,
                new Collection <KeyValuePair <string, string> > {
                new KeyValuePair <string, string>("{firstname}", client.FirstName),
                new KeyValuePair <string, string>("{lastname}", client.LastName),
                new KeyValuePair <string, string>("{time}", DateTime.Now.ToShortTimeString()),
                new KeyValuePair <string, string>("{date}", DateTime.Now.ToShortDateString()),
                new KeyValuePair <string, string>("{currentamount}", client.PrimaryAccount.Amount.ToString("C0"))
            });
            body    = body.Replace("{amount}", loanRequest.Amount.ToString());
            body    = body.Replace("{productname}", loanRequest.LoanProduct.Name);
            subject = subject.Replace("{lastname}", client.FirstName);
            return(this.SendMessage(subject, body, client.Email));
        }
        // GET: LoanRequests/Details/5

        public ActionResult Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            LoanRequest loanRequest = db.LoanRequest.Find(id);

            if (loanRequest == null)
            {
                return(HttpNotFound());
            }
            var loanApproved  = db.LoanApproved.Include(l => l.LoanRequest).Include(l => l.User).Include(l => l.Lender).Include(l => l.Dealer).Include(l => l.Car);
            var loanApproved1 = loanApproved.FirstOrDefault(l => l.LoanRequest.loan_id == id);

            if (loanApproved1 == null)
            {
                ViewBag.print = "none";
            }
            else
            {
                ViewBag.print = loanApproved1.status;
            }
            return(View(loanRequest));
        }
Example #5
0
        public void NotifyAggregator(LoanRequest loanRequest, string corrId)
        {
            using (var connection = _factory.CreateConnection())
                using (var channel = connection.CreateModel())
                {
                    LoanRequest newLoanRequest = new LoanRequest
                    {
                        ssn   = loanRequest.ssn,
                        count = loanRequest.banks.Count
                    };

                    string jsonNormlizer = JsonConvert.SerializeObject(newLoanRequest, Formatting.Indented);
                    Console.ForegroundColor = ConsoleColor.DarkMagenta;
                    Console.WriteLine("[{0}] >> notify to {1}",
                                      DateTime.Now.ToString("HH:mm:ss"), Constants.AggregatorOutRoutingKey);

                    channel.ExchangeDeclare(exchange: Constants.DirectExchangeName,
                                            type: Constants.DirectExhangeType);

                    var props = channel.CreateBasicProperties();
                    props.CorrelationId = corrId;

                    var body = Encoding.UTF8.GetBytes(jsonNormlizer);
                    channel.BasicPublish(exchange: Constants.DirectExchangeName,
                                         routingKey: Constants.AggregatorOutRoutingKey,
                                         basicProperties: props,
                                         body: body);
                }
        }
Example #6
0
        public async Task <string> GetLoans(string phone)
        {
            var result = await _apiRequest.GetLoans(phone);

            var loan = await _dao.GetByCondition(c => c.Phone == phone);

            var loanRequest = new LoanRequest {
                Data = result, Date = DateTime.UtcNow
            };

            if (loan == null)
            {
                loan = new ClientLoans
                {
                    Phone    = phone,
                    Requests = new[] { loanRequest }
                }
            }
            ;
            else
            {
                loan.Requests.ToList().Add(loanRequest);
            }

            await _dao.Save(loan).ConfigureAwait(false);

            return(result);
        }
Example #7
0
        private static void handleRabbitMQJSONBank(LoanRequest loanRequest, string routingKey)
        {
            /*
             * String format from pdf:
             * string msg = "{\"ssn\":" + loanRequest.SSN + ",\"creditScore\":" + loanRequest.CreditScore.ToString() +
             *  ",\"loanAmount\":" + loanRequest.Amount.ToString() + ",\"loanDuration\":" + loanRequest.Duration +" }";
             *
             * but getting this from the bank:
             *
             * Exception: Something went wrong.Data should be sent like: { "ssn":1605789787,"loanAmount":10.0,"loanDuration":360,"rki":false}
             * Can not instantiate value of type[simple type, class dk.cphbusiness.si.banktemplate.JsonDTO.BankLoanDTO] from JSON String; no single-String constructor/factory method
             *
             */
            //string msg = "{ \"ssn\":" + loanRequest.SSN
            //    + ",\"loanAmount\":" + loanRequest.Amount.ToString(CultureInfo.CreateSpecificCulture("en-GB"))
            //    + ",\"loanDuration\":" + loanRequest.Duration.ToString()
            //    + ",\"rki\":false }";


            //TODO: 18/12/2015 A java group says we have to send a json object...
            string msg = "{ \"ssn\":" + loanRequest.SSN.Replace("-", "")
                         + ",\"creditScore\":" + loanRequest.CreditScore.ToString()
                         + ",\"loanAmount\":" + loanRequest.Amount.ToString(CultureInfo.CreateSpecificCulture("en-GB"))
                         + ",\"loanDuration\":" + loanRequest.Duration + " }";

            Console.WriteLine("--> Sending " + msg + " to cphbusiness.bankJSON");
            HandleMessaging.SendMessage("cphbusiness.bankJSON", routingKey, Queues.RABBITMQJSONBANK_OUT, msg, "fanout");
        }
Example #8
0
        public static bool AddLoanRequest(LoanRequest request)
        {
            try
            {
                using (var context = new HackathonContext())
                {
                    context.LoanRequests.Add(request);

                    var user = context.Users.FirstOrDefault(x => x.UserId == request.User.UserId);

                    if (user != null)
                    {
                        user.CreditPoints        += 100;
                        context.Entry(user).State = EntityState.Modified;
                    }

                    context.SaveChanges();
                    return(true);
                }
            }
            catch (Exception)
            {
                //ignored
            }

            return(false);
        }
Example #9
0
 private void CheckApprovedByAllApproversStatus(LoanRequest loanRequest)
 {
     if (!loanRequest.RemainingApprovers.Any())
     {
         loanRequest.Status = LoanRequestStatus.ApprovedByAllApprovers;
     }
 }
        public ActionResult Create([Bind(Include = "Request, NetIncome, TotalDeduction")] LoanRequest loanRequest)
        {
            Db db = new Db(DbServices.ConnectionString);

            if (ModelState.IsValid)
            {
                try
                {
                    LoanRequestServices.Insert(CurrentUser.Id, loanRequest, db);
                    TempData["Success"] = ResourceServices.GetString(Cf.Data.Resources.ResourceBase.Culture, "UI", "InsertConfirmed");
                    return(RedirectToAction("Index"));
                }
                catch (CfException cfex)
                {
                    TempData["Failure"] = cfex.ErrorDefinition.LocalizedMessage;
                }
                catch (Exception ex)
                {
                    TempData["Failure"] = ex.Message;
                }
            }

            ViewBag.RequestList = new SelectList(RequestServices.List(db), "Product", "Attachment");
            return(View(loanRequest));
        }
        public ActionResult Create([Bind(Include = "loan_id,lender_id,downpayment,loan_period,emi,user_address,id_proof_file,income_certificate_file,income_tax_return_file,address_proof_file,gnn,gnn_address,gnn_address_file")] LoanRequest loanRequest)
        {
            if (ModelState.IsValid)
            {
                var loanRequest1 = new LoanRequest()
                {
                    u_id               = Convert.ToInt32(Session["u_id"]),
                    c_id               = Convert.ToInt32(Session["c_id"]),
                    d_id               = Convert.ToInt32(Session["d_id"]),
                    lender_id          = loanRequest.lender_id,
                    downpayment        = loanRequest.downpayment,
                    loan_period        = loanRequest.loan_period,
                    emi                = loanRequest.emi,
                    user_address       = loanRequest.user_address,
                    gnn                = loanRequest.gnn,
                    gnn_address        = loanRequest.gnn_address,
                    id_proof           = SaveToPhysicalLocation(loanRequest.id_proof_file),
                    income_certificate = SaveToPhysicalLocation(loanRequest.income_certificate_file),
                    income_tax_return  = SaveToPhysicalLocation(loanRequest.income_tax_return_file),
                    address_proof      = SaveToPhysicalLocation(loanRequest.address_proof_file),
                    gnn_address_p      = SaveToPhysicalLocation(loanRequest.gnn_address_file),
                };
                db.LoanRequest.Add(loanRequest1);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            ViewBag.c_id      = new SelectList(db.Car, "c_id", "car_manufacturer", loanRequest.c_id);
            ViewBag.d_id      = new SelectList(db.Dealer, "d_id", "company_name", loanRequest.d_id);
            ViewBag.lender_id = new SelectList(db.Lender, "lender_id", "bankname", loanRequest.lender_id);
            ViewBag.u_id      = new SelectList(db.User, "u_id", "firstname", loanRequest.u_id);
            return(View(loanRequest));
        }
Example #12
0
        static void Main(string[] args)
        {
            LoanRequest loanRequest = new LoanRequest
            {
                LoanAmount = double.Parse(args[1]),
                Offers     = ReadFile(args[0])
            };
            LoanResponse loanResponse = null;
            Controller   controller   = new Controller();

            try
            {
                controller.ValidateRequest(loanRequest);
                loanResponse = controller.Calculate(loanRequest) as LoanResponse;
            }
            catch (ArgumentException ex)
            {
                Console.WriteLine(ex.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            if (loanResponse != null)
            {
                CultureInfo culture = new CultureInfo(ConfigurationManager.AppSettings["DefaultCulture"]);
                Console.WriteLine("Requested amount: " + loanResponse.RequestedAmount.ToString("C", culture));
                Console.WriteLine("Rate: " + loanResponse.Rate.ToString("P1"));
                Console.WriteLine("Monthly repayment: " + loanResponse.MounthlyRepayment.ToString("C2", culture));
                Console.WriteLine("Total repayment: " + loanResponse.TotalRepayment.ToString("C2", culture));
            }
        }
Example #13
0
        public IHttpActionResult Post(LoanRequest loanRequest)
        {
            var userId = Guid.NewGuid();

            _command.Send(new ApplyForLoan()
            {
                //Apr = loanRequest.LoanDetails.Apr,
                //MonthlyPayment = loanRequest.LoanDetails.MonthlyCost,
                //LoanAmount = loanRequest.LoanDetails.LoanAmount,
                //Term = loanRequest.LoanDetails.Term,

                UserId = userId
            });

            _command.Send(new UserRegister()
            {
                Title                       = loanRequest.UserDetails.Title,
                Firstname                   = loanRequest.UserDetails.Firstname,
                Lastname                    = loanRequest.UserDetails.Lastname,
                Email                       = loanRequest.UserDetails.Email,
                PhoneNumber                 = loanRequest.UserDetails.PhoneNumber,
                DoB                         = loanRequest.UserDetails.DoB,
                AnnualIncomeBeforeTax       = loanRequest.FinancialDetails.AnnualIncomeBeforeTax,
                MonthlyMortgageContribution = loanRequest.FinancialDetails.MonthlyMortgageContribution,
                MonthlyRentContribution     = loanRequest.FinancialDetails.MonthlyRentContribution,
                LoanReason                  = loanRequest.LoanReason.Reason,
                //EmploymentStatus = loanRequest.FinancialDetails.Employment.EmploymentStatus,
                UserId = userId
            });

            //Implement Service to generate a ref number
            var quote = "Test";

            return(Ok(new { LoanRed = quote }));
        }
Example #14
0
        private static void handleRabbitMQOurBank(LoanRequest loanRequest)
        {
            //SSN;CreditScore;Amount;Duration
            string msg = string.Format("{0};{1};{2};{3}", loanRequest.SSN, loanRequest.CreditScore, loanRequest.Amount, loanRequest.Duration);

            HandleMessaging.SendMessage <string>(Queues.RABBITMQOURBANK_IN, msg);
        }
Example #15
0
        public async Task <ActionResult <LoanRequest> > PostLoanRequest(LoanRequest loanRequest)
        {
            _context.LoanRequests.Add(loanRequest);
            await _context.SaveChangesAsync();

            return(CreatedAtAction("GetLoanRequest", new { id = loanRequest.LoanRequestId }, loanRequest));
        }
Example #16
0
 public string AddRequestAccountAve(Guid loanRequestId, RequestAccountAveDto requestAccountAveDto)
 {
     try
     {
         string accountCode = requestAccountAveDto.AccountCode;
         LoanRequestRepository repository  = new LoanRequestRepository();
         LoanRequest           loanRequest = repository.ActiveContext.LoanRequests.FirstOrDefault(lr => lr.Id == loanRequestId);
         if (loanRequest == null)
         {
             return("this request with this Request no :" + requestAccountAveDto.ReqNo.ToString() + " is not there");
         }
         Account account = repository.ActiveContext.BankAccounts.OfType <Account>().FirstOrDefault(a => a.Code == accountCode);
         if (account == null)
         {
             return("account is not found");
         }
         RequestAccountAve requestAccountAve = (RequestAccountAve) new RequestAccountAve().InjectFrom <UnflatLoopValueInjection>(requestAccountAveDto);
         requestAccountAve.Id           = Guid.NewGuid();
         requestAccountAve.LoanRequest  = loanRequest;
         requestAccountAve.Account      = account;
         requestAccountAve.Average      = GetAverageType(requestAccountAveDto.AverageId, repository);
         loanRequest.RequestAccountAves = new Collection <RequestAccountAve>();
         loanRequest.RequestAccountAves.Add(requestAccountAve);
         repository.ActiveContext.SaveChanges();
         return("record added successfully");
     }
     catch (Exception exception)
     {
         return(exception.Message);
     }
 }
        public async Task UpdateLoanRequest(RequestResult result, RequestPolicyResult?refused_policy, decimal amount, int?terms, string id)
        {
            LoanRequest loanRequest = new LoanRequest
            {
                id             = id,
                status         = RequestStatus.completed,
                result         = result,
                refused_policy = refused_policy,
                amount         = amount,
                terms          = terms
            };
            var request = new HttpRequestMessage(HttpMethod.Put, _loanURL + "/api/" + id);

            var json = JsonSerializer.Serialize(loanRequest);

            request.Content = new StringContent(json, Encoding.UTF8, "application/json");

            var client   = _clientFactory.CreateClient();
            var response = await client.SendAsync(request);

            if (!response.IsSuccessStatusCode)
            {
                _logger.LogError("Error Loan: {Loan}", json);
            }
        }
Example #18
0
        public async Task <IActionResult> PutLoanRequest(int id, LoanRequest loanRequest)
        {
            if (id != loanRequest.LoanRequestId)
            {
                return(BadRequest());
            }

            _context.Entry(loanRequest).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!LoanRequestExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(NoContent());
        }
 public LoanRequestModel Reqest(LoanRequestModel loanRequestModel)
 {
     try
     {
         LoanRequest loanRequest = new LoanRequest();
         loanRequest.DictionaryData = loanRequestModel.DictionaryData;
         loanRequest.LoanSupplied   = loanRequestModel.LoanSupplied;
         loanRequest.FirstName      = loanRequestModel.FirstName;
         loanRequest.LastName       = loanRequestModel.LastName;
         loanRequest.LoanRequestrId = loanRequestModel.LoanRequestrId;
         var LoanIsExists = _context.LoanRequests.FirstOrDefault(l => l.LoanRequestrId == loanRequestModel.LoanRequestrId);
         if (LoanIsExists == null)
         {
             _context.LoanRequests.Add(loanRequest);
             _context.SaveChanges();
         }
         Customer customer = _context.Customers.FirstOrDefault(c => c.CustomerId == loanRequestModel.LoanSupplied);
         if (customer == null)
         {
             throw new Exception("Custemer not exist");
         }
         var listRule = _context.Rules.Where(item => item.CustomerId2.CustomerId == loanRequestModel.LoanSupplied).ToList();
         return(_mapper.Map <LoanRequestModel> (loanRequest));
     }
     catch (Exception e)
     {
         throw e;
     }
 }
Example #20
0
 private static void VerifyProfilePrerequisitesRuleCompleted(LoanRequest loanRequest)
 {
     if (loanRequest.Status != LoanRequestStatus.ProfilePrerequisitesAreVerified)
     {
         throw new WorkflowException("Loan Request should be verified by profile prerequisite rules first");
     }
 }
        public bool Process(LoanRequest loanRequest)
        {
            var processingStatus = default(bool);

            var validation = loanRequest != default(LoanRequest) &&
                             loanRequest.CustomerDetails != default(Customer) &&
                             loanRequest.AssetDetails != default(AssetDetail) &&
                             loanRequest.Amount <= MAX_PROCESSING_AMOUNT;

            if (validation)
            {
                processingStatus = true;

                Console.WriteLine("Loan Request Processed Internally ...");
            }
            else
            {
                Console.WriteLine("Unable to process loan request internally ...");
                Console.WriteLine("Sending the Loan Request to External and Partner Banks ...");

                processingStatus = this.externalLoanRequestProcessor.ProcessExternal(loanRequest);

                Console.WriteLine("External Loan Request Processing Completed ...");
            }

            return(processingStatus);
        }
 public void Approve(LoanRequest loanRequest)
 {
     if (loanRequest.LoanAmount <= MaxLoanApproveAmount && loanRequest.PreviousRecord)
     {
         loanRequest.Approved   = true;
         loanRequest.ApprovedBy = this;
     }
 }
Example #23
0
    public async Task Insert(LoanRequest loan)
    {
        var loanJSON = JsonSerializer.Serialize(loan);

        var item = Document.FromJson(loanJSON);

        await _table.PutItemAsync(item);
    }
        public ActionResult DeleteConfirmed(int id)
        {
            LoanRequest loanRequest = db.LoanRequest.Find(id);

            db.LoanRequest.Remove(loanRequest);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
        private static void handleWebServiceBank(LoanRequest loanRequest)
        {
            WebServiceBank.WebServiceBank webBank = new WebServiceBank.WebServiceBank();
            decimal msg = webBank.ProcessLoanRequest(loanRequest.SSN, loanRequest.CreditScore, loanRequest.Amount, loanRequest.Duration);

            //TODO: Send loanrequest info aswell as decimal msg
            LoanBroker.Utility.HandleMessaging.SendMessage <decimal>("group1_bank_out", msg);
        }
        public void UnsatisifiedLoanRequest()
        {
            var lender  = new Lender("Bob", 900, 0.04);
            var request = new LoanRequest(1000, 36);

            request.AddLenderToLoan(lender);
            Assert.False(request.IsSatisfied(), "The lender does not have enough funds to satisfy the Request");
        }
        void MonthlyRepaymentAmount()
        {
            var lender  = new Lender("Bob", 1000, 0.07);
            var request = new LoanRequest(1000, 36);

            request.AddLenderToLoan(lender);
            Assert.Equal(30.88, request.GetMonthlyRepaymentAmount());
        }
        public void SatisfiedLoanRequest()
        {
            var lender  = new Lender("Bob", 1000, 0.04);
            var request = new LoanRequest(1000, 36);

            request.AddLenderToLoan(lender);
            Assert.True(request.IsSatisfied(), "The lender has enough funds to satisfy the Request.");
        }
        public IActionResult Put(LoanRequest loanRequest)
        {
            var domainUser = _mapper.Map <Loan>(loanRequest);

            _loanService.ReturnBook(domainUser);

            return(Ok(loanRequest));
        }
Example #30
0
        public void CreateConsumer()
        {
            var counter = 0;

            var connection = _factory.CreateConnection();
            var channel    = connection.CreateModel();

            channel.ExchangeDeclare(exchange: "laurbaer_direct", type: Constants.DirectExhangeType);
            Dictionary <string, object> args = new Dictionary <string, object>();

            args.Add("x-dead-letter-exchange", "dead_exchange");
            var queueName = channel.QueueDeclare("laur_agg", false, false, false, args).QueueName;

            channel.QueueBind(queue: queueName, exchange: "laurbaer_direct", routingKey: "aggOut");

            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += (model, ea) =>
            {
                counter++;
                var body    = ea.Body;
                var probs   = ea.BasicProperties;
                var message = Encoding.UTF8.GetString(body);
                Console.ForegroundColor = ConsoleColor.DarkGreen;
                Console.WriteLine("[{0}] << received on {1}",
                                  DateTime.Now.ToString("HH:mm:ss"), message);

                LoanRequest loanRequest = null;
                try
                {
                    loanRequest = JsonConvert.DeserializeObject <LoanRequest>(message);
                }
                catch (JsonException ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine("Sending to Dead letter chan.");
                    channel.BasicNack(ea.DeliveryTag, false, false);
                    //Todo: Send to dead letter
                    return;
                }
                if (probs.CorrelationId != null)
                {
                    Console.WriteLine("Ack");
                    channel.BasicAck(ea.DeliveryTag, true);
                    aggregators.Add(probs.CorrelationId,
                                    new BankQuoteAggregate(loanRequest.count, _messageRouter));
                }
                else
                {
                    Console.WriteLine();
                    Console.WriteLine("NoAck - " + ea.DeliveryTag);
                    channel.BasicNack(ea.DeliveryTag, false, false);
                }
            };
            channel.BasicConsume(queue: queueName,
                                 noAck: false,
                                 consumer: consumer);
        }
        public string IsValid(LoanRequest loanRequest)
        {
            if (!loanRequest.LoanProduct.Requirements.NeedEarningsRecord)
            {
                return string.Empty;
            }

            return loanRequest.Client.PersonalDetails.EmploymentData.Salary
                >= loanRequest.LoanProduct.Requirements.MinSalary ? string.Empty : Error;
        }
        public string IsValid(LoanRequest loanRequest)
        {
            if (!loanRequest.LoanProduct.Requirements.NeedEarningsRecord)
            {
                return string.Empty;
            }

            return loanRequest.Client.PersonalDetails.EmploymentData.HireDate
                <= DateTime.UtcNow.AddMonths(loanRequest.LoanProduct.Requirements.MinWorkOnLastJobInMonths) ? string.Empty : Error;
        }
        public void ApproveLoanRequest(LoanRequest loanRequest, IUserContext userContext)
        {
            Contract.Requires<ArgumentNullException>(userContext.IsNotNull());
            Contract.Requires<ArgumentNullException>(loanRequest.IsNotNull());

            VerifyProfilePrerequisitesRuleCompleted(loanRequest);
            AddUserApprovers(loanRequest, userContext);
            this.CheckApprovedByAllApproversStatus(loanRequest);
            this.TakeLoan(loanRequest);
            this.gangsterBankUnitOfWork.LoanRequestsRepository.CreateOrUpdate(loanRequest);
        }
 public string IsValid(LoanRequest loanRequest)
 {
     Contract.Requires<ArgumentNullException>(loanRequest.IsNotNull());
     var list = this.rules.Select(
         rule =>
             {
                 var isValid = rule.IsValid(loanRequest);
                 return isValid.ToLower();
             });
     list = list.Where(x => x != string.Empty);
     return string.Join(", ", list);
 }
 private void CheckApprovedByAllApproversStatus(LoanRequest loanRequest)
 {
     if (!loanRequest.RemainingApprovers.Any())
     {
         loanRequest.Status = LoanRequestStatus.ApprovedByAllApprovers;
     }
 }
        private void TakeLoan(LoanRequest loanRequest)
        {
            if (loanRequest.Status != LoanRequestStatus.ApprovedByAllApprovers)
            {
                return;
            }

            loanRequest.Status = LoanRequestStatus.Approved;
            this.mailService.SendMessage(EmailTemplateType.ApproveCreditRequest, loanRequest.Client, loanRequest);
            TakenLoan takenLoan = CreateTakenLoanForClient(loanRequest);
            Account account = loanRequest.Client.PrimaryAccount;
            account.Amount += takenLoan.Amount;
            this.AddLoanPayments(takenLoan);

            this.gangsterBankUnitOfWork.ClientsRepository.CreateOrUpdate(loanRequest.Client);
        }
 private void TryApproveAndTakeLoanOnCreation(LoanRequest loanRequest)
 {
     var result = this.CheckLoanRequestPrerequisiteRules(loanRequest);
     if (loanRequest.Status == LoanRequestStatus.Declined)
     {
        this.gangsterBankUnitOfWork.LoanRequestsRepository.CreateOrUpdate(loanRequest);
        throw new Exception(result);
     }
     this.CheckApprovedByAllApproversStatus(loanRequest);
     this.TakeLoan(loanRequest);
 }
        public void DeclineLoanRequest(LoanRequest loanRequest, IUserContext userContext)
        {
            Contract.Requires<ArgumentNullException>(userContext.IsNotNull());
            Contract.Requires<ArgumentNullException>(loanRequest.IsNotNull());

            VerifyProfilePrerequisitesRuleCompleted(loanRequest);
            SetDeclinedStatus(loanRequest, userContext);

            this.gangsterBankUnitOfWork.LoanRequestsRepository.CreateOrUpdate(loanRequest);
        }
        private static void AddUserApprovers(LoanRequest loanRequest, IUserContext userContext)
        {
            IEnumerable<IdentityRoleEntity> userApprovers = GetUserApprovers(loanRequest, userContext).ToList();

            foreach (IdentityRoleEntity userRole in userApprovers)
            {
                loanRequest.ApprovedBy.Add(userRole);
            }
        }
 private static TakenLoan CreateTakenLoanForClient(LoanRequest loanRequest)
 {
     var takenLoan = new TakenLoan
                         {
                             Amount = loanRequest.Amount,
                             MaturityInMonth = loanRequest.Months,
                             ProductLoan = loanRequest.LoanProduct,
                             TakeDate = DateTime.UtcNow,
                             Payments = new Collection<LoanPayment>(),
                             Status = TakenLoanStatus.Active
                         };
     loanRequest.Client.TakenLoans.Add(takenLoan);
     return takenLoan;
 }
 private string CheckLoanRequestPrerequisiteRules(LoanRequest loanRequest)
 {
     var result = this.loanRequestPrerequisiteRule.IsValid(loanRequest);
     loanRequest.Status = result == string.Empty
                              ? LoanRequestStatus.ProfilePrerequisitesAreVerified
                              : LoanRequestStatus.Declined;
     return result;
 }
 private static IEnumerable<IdentityRoleEntity> GetUserApprovers(
     LoanRequest loanRequest, 
     IUserContext userContext)
 {
     IEnumerable<IdentityRoleEntity> userApprovers =
         loanRequest.RemainingApprovers.Intersect(userContext.IdentityRoleEntities);
     return userApprovers;
 }
 public bool IsValid(LoanRequest loanRequest)
 {
     return loanRequest.Amount >= loanRequest.LoanProduct.MinAmount
            && loanRequest.Amount <= loanRequest.LoanProduct.MaxAmount;
 }
 string ILoanRequestPrerequisiteRule.IsValid(LoanRequest loanRequest)
 {
     return loanRequest.Amount >= loanRequest.LoanProduct.MinAmount
         && loanRequest.Amount <= loanRequest.LoanProduct.MaxAmount ? string.Empty : ErrorConst;
 }
        private static void SetDeclinedStatus(LoanRequest loanRequest, IUserContext userContext)
        {
            IEnumerable<IdentityRoleEntity> userApprovers = GetUserApprovers(loanRequest, userContext);
            if (!userApprovers.Any())
            {
                throw new WorkflowException("User is not in remaining approvers list");
            }

            loanRequest.Status = LoanRequestStatus.Declined;
        }
 public string IsValid(LoanRequest loanRequest)
 {
     return loanRequest.Months >= loanRequest.LoanProduct.MinPeriodInMonth
         && loanRequest.Months <= loanRequest.LoanProduct.MaxPeriodInMonth ? string.Empty : Error;
 }
 private static void VerifyProfilePrerequisitesRuleCompleted(LoanRequest loanRequest)
 {
     if (loanRequest.Status != LoanRequestStatus.ProfilePrerequisitesAreVerified)
     {
         throw new WorkflowException("Loan Request should be verified by profile prerequisite rules first");
     }
 }
Example #48
0
 public bool SendMessage(EmailTemplateType type, Client client, LoanRequest loanRequest, string text = null)
 {
     var template = this.emailTemplatesService.GetByType(type);
     var body = template.Text;
     var subject = template.Subject;
     if (!string.IsNullOrEmpty(text))
     {
         body = body.Replace("{text}", text);
     }
     subject = subject.Replace("{firstname}", client.FirstName);
     body = this.MassReplace(
         body,
         new Collection<KeyValuePair<string, string>> {
             new KeyValuePair<string, string>("{firstname}", client.FirstName),
             new KeyValuePair<string, string>("{lastname}", client.LastName),
             new KeyValuePair<string, string>("{time}", DateTime.Now.ToShortTimeString()),
             new KeyValuePair<string, string>("{date}", DateTime.Now.ToShortDateString()),
             new KeyValuePair<string, string>("{currentamount}", client.PrimaryAccount.Amount.ToString("C0"))
         });
     body = body.Replace("{amount}", loanRequest.Amount.ToString());
     body = body.Replace("{productname}", loanRequest.LoanProduct.Name);
     subject = subject.Replace("{lastname}", client.FirstName);
     return this.SendMessage(subject, body, client.Email);
 }