예제 #1
0
        public int Handle(ISellerApplication application)
        {
            if (application == null)
            {
                throw new ArgumentNullException(nameof(application));
            }

            if (application.Product is BusinessLoans product)
            {
                var result = _businessLoansService.SubmitApplicationFor(new CompanyDataRequest
                {
                    CompanyFounded = application.CompanyData.Founded,
                    CompanyNumber  = application.CompanyData.Number,
                    CompanyName    = application.CompanyData.Name,
                    DirectorName   = application.CompanyData.DirectorName
                }, new LoansRequest
                {
                    InterestRatePerAnnum = product.InterestRatePerAnnum,
                    LoanAmount           = product.LoanAmount
                });
                return((result.Success) ? result.ApplicationId ?? -1 : -1);
            }

            throw new InvalidOperationException();
        }
        public void SubmitApplicationFor_BusinessLoans_CallsBusinessLoansService()
        {
            // **Arrange**
            BusinessLoan      product     = _fixture.Build <BusinessLoan>().Create();
            SellerCompanyData companyData = _fixture.Build <SellerCompanyData>().Create();
            SellerApplication <BusinessLoan> application = _fixture.Build <SellerApplication <BusinessLoan> >()
                                                           .With(a => a.Product, product)
                                                           .With(a => a.CompanyData, companyData)
                                                           .Create();

            loans.SubmitApplicationFor(
                Arg.Is <CompanyDataRequest>(x => x.DirectorName == companyData.DirectorName &&
                                            x.CompanyNumber == companyData.Number &&
                                            x.CompanyName == companyData.Name &&
                                            x.CompanyFounded == companyData.Founded),
                Arg.Is <LoansRequest>(y => y.InterestRatePerAnnum == product.InterestRatePerAnnum &&
                                      y.LoanAmount == product.LoanAmount))
            .Returns(new TestApplicationResult(10, true, new List <string>()));

            // **Act**
            int result = _service.SubmitApplicationFor(application);

            // **Assert**
            loans.Received(1).SubmitApplicationFor(Arg.Is <CompanyDataRequest>(x => x.DirectorName == companyData.DirectorName &&
                                                                               x.CompanyNumber == companyData.Number &&
                                                                               x.CompanyName == companyData.Name &&
                                                                               x.CompanyFounded == companyData.Founded),
                                                   Arg.Is <LoansRequest>(y => y.InterestRatePerAnnum == product.InterestRatePerAnnum &&
                                                                         y.LoanAmount == product.LoanAmount));
            Assert.Equal(10, result);
        }
예제 #3
0
        public int SubmitApplicationFor(ISellerApplication application)
        {
            // Missing input is not null validation here since in my opinion
            // it has to be delegated to a framework like FluentValidation
            // and be applied in Startup class so that we could do it automatically
            // Cons: Validator has to be created for each Request to be validated

            if (!(application.Product is BusinessLoans loans))
            {
                throw new InvalidOperationException(
                          $"{nameof(BusinessLoansApplicationHandler)} " +
                          $"handles {nameof(BusinessLoans)} product only, " +
                          $"but {application.Product.GetType().Name} was passed");
            }

            var result = _businessLoansService.SubmitApplicationFor(new CompanyDataRequest
            {
                CompanyFounded = application.CompanyData.Founded,
                CompanyNumber  = application.CompanyData.Number,
                CompanyName    = application.CompanyData.Name,
                DirectorName   = application.CompanyData.DirectorName
            }, new LoansRequest
            {
                InterestRatePerAnnum = loans.InterestRatePerAnnum,
                LoanAmount           = loans.LoanAmount
            });

            // I don't like the concept of returning numeric result. It is not informative and should be made object
            return((result.Success) ? result.ApplicationId ?? -1 : -1);
        }
        public void Init()
        {
            _selectInvoiceService       = A.Fake <ISelectInvoiceService>();
            _confidentialInvoiceService = A.Fake <IConfidentialInvoiceService>();
            _businessLoansService       = A.Fake <IBusinessLoansService>();

            _productApplicationService = new ProductApplicationService(
                _selectInvoiceService,
                _confidentialInvoiceService,
                _businessLoansService);

            A.CallTo(() => _selectInvoiceService.SubmitApplicationFor(
                         A <string> ._,
                         A <decimal> ._,
                         A <decimal> ._)).Returns(codeOfSuccessfulAnswerFromService);

            A.CallTo(
                () => _confidentialInvoiceService.SubmitApplicationFor(
                    A <CompanyDataRequest> ._,
                    A <decimal> ._,
                    A <decimal> ._,
                    A <decimal> ._)).Returns(CreateSuccessApplicationResult());

            A.CallTo(
                () => _businessLoansService.SubmitApplicationFor(
                    A <CompanyDataRequest> ._,
                    A <LoansRequest> ._))
            .Returns(CreateSuccessApplicationResult());
        }
예제 #5
0
        private int SubmitForBusinessLoans(ISellerApplication application)
        {
            var result = _businessLoansService.SubmitApplicationFor(
                CompanyDataRequestFactory.Create(application.CompanyData),
                LoansRequestFactory.Create(application.Product as BusinessLoans));

            return(result.ApplicationId ?? FailedStatus);
        }
        public async Task <ServiceResult> RunAsync(ISellerApplication application)
        {
            var loans  = application.Product as BusinessLoans;
            var result = /*await*/ service.SubmitApplicationFor(
                application.CompanyData.ToRequest(),
                loans.ToRequest());

            return(new ServiceResult(result.Success ? ProceedStatus.Ready : ProceedStatus.Error, result));
        }
        /// <summary>
        /// Handle applications for business loans.
        /// </summary>
        /// <param name="application">Applicaiton.</param>
        /// <returns>Result id of the applicaiton or a fails status.</returns>
        public int SubmitApplicationFor(ISellerApplication <BusinessLoan> application)
        {
            IApplicationResult result = _businessLoansService
                                        .SubmitApplicationFor(
                MappingHelper.SellerCompanyDataToCompanyDataRequest(application.CompanyData),
                MappingHelper.ToLoanRequest(application.Product));

            return(ReturnResult(result));
        }
예제 #8
0
        private int SubmitApplicationForBusinessLoans(ISellerApplication application, BusinessLoans loans)
        {
            var result = _businessLoansService.SubmitApplicationFor(
                _sellerApplicationMapper.MapToCompanyDataRequest(application),
                _businessLoanMapper.MapToLoanRequest(loans)
                );

            return(_applicationResultMapper.MapToResultCode(result));
        }
        public override IApplicationServiceWorker Submit()
        {
            var product = (BusinessLoans)Application.Product;

            ApplicationResult = _businessLoansService.SubmitApplicationFor(
                CompanyDataRequestMapping.MapFromSellerCompanyData(Application.CompanyData),
                LoansRequestMapping.MapFromLoansProduct(product));

            return(this);
        }
 /// <summary>
 /// Submitting application for Business Loans.
 /// </summary>
 /// <param name="application"></param>
 /// <returns></returns>
 public IApplicationResult SubmitApplicationForBusinessLoans(BusinessLoansApplication application)
 {
     return(_businessLoansService.SubmitApplicationFor(
                SetCompanyDataRequest(application),
                new LoansRequest
     {
         InterestRatePerAnnum = application.BusinessLoans.InterestRatePerAnnum,
         LoanAmount = application.BusinessLoans.LoanAmount
     }));
 }
예제 #11
0
        public int SubmitApplication(ISellerApplication application)
        {
            var loans = ValidateArgument <BusinessLoans>(application);

            var result = _businessLoansService.SubmitApplicationFor(_companyDataMapper.MapToRequest(application.CompanyData),
                                                                    new LoansRequest
            {
                InterestRatePerAnnum = loans.InterestRatePerAnnum,
                LoanAmount           = loans.LoanAmount
            });

            return(GetResult(result));
        }
        private int CallBusinessLoansService(ISellerCompanyData companyData, BusinessLoans loans)
        {
            var companyDataRequest = GetCompanyDataRequest(companyData);

            var result = _businessLoansService.SubmitApplicationFor(
                companyDataRequest,
                new LoansRequest
            {
                InterestRatePerAnnum = loans.InterestRatePerAnnum,
                LoanAmount           = loans.LoanAmount
            });

            return(ProcessApplicationResult(result));
        }
        protected override IApplicationResult SubmitWithResult(ISellerApplication application)
        {
            if (!(application.Product is BusinessLoans loans))
            {
                throw new InvalidOperationException(GetErrorMessage(typeof(BusinessLoans), application.Product.GetType()));
            }

            return(_businessLoansService.SubmitApplicationFor(application.CompanyData.ToCompanyDataRequest(),
                                                              new LoansRequest
            {
                InterestRatePerAnnum = loans.InterestRatePerAnnum,
                LoanAmount = loans.LoanAmount
            }));
        }
예제 #14
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="companyData"></param>
        /// <returns></returns>
        public int SubmitApplication(ISellerCompanyData companyData)
        {
            using (IKernel kernel = new StandardKernel(new NinjectBindings()))
            {
                IMapper mapper = kernel.Get <IMapper>();

                var companyDataRequest = mapper.Map <ISellerCompanyData, CompanyDataRequest>(companyData);
                var loansRequest       = mapper.Map <IBusinessLoansProduct, LoansRequest>(_businessLoansProduct);

                var result = _businessLoansService.SubmitApplicationFor(companyDataRequest, loansRequest);

                return((result.Success) ? result.ApplicationId ?? -1 : -1);
            }
        }
        public ServiceResult SubmitApplicationFor(ISellerApplication application)
        {
            var result = _businessLoansService.SubmitApplicationFor(new CompanyDataRequest
            {
                CompanyFounded = application.CompanyData.Founded,
                CompanyNumber  = application.CompanyData.Number,
                CompanyName    = application.CompanyData.Name,
                DirectorName   = application.CompanyData.DirectorName
            }, new LoansRequest
            {
                InterestRatePerAnnum = Product.InterestRatePerAnnum,
                LoanAmount           = Product.LoanAmount
            });

            return(new ServiceResult(result));
        }
        public void SubmitApplicationFor_ShouldCallBusinessLoansService_WhenGetBusinessLoansProduct()
        {
            var sellerApplication = new SellerApplication
            {
                Product     = _fixture.Build <BusinessLoans>().Create(),
                CompanyData = CreateCompanyData()
            };

            _productApplicationService.SubmitApplicationFor(sellerApplication);

            A.CallTo(
                () => _businessLoansService.SubmitApplicationFor(
                    A <CompanyDataRequest> ._,
                    A <LoansRequest> ._))
            .MustHaveHappened();
        }
예제 #17
0
        public int SubmitApplication(ISellerApplication application)
        {
            var result = _businessLoansService.SubmitApplicationFor(new CompanyDataRequest
            {
                CompanyFounded = application.CompanyData.Founded,
                CompanyNumber  = application.CompanyData.Number,
                CompanyName    = application.CompanyData.Name,
                DirectorName   = application.CompanyData.DirectorName
            }, new LoansRequest
            {
                InterestRatePerAnnum = _interestRatePerAnnum,
                LoanAmount           = _loanAmount
            });

            return((result.Success) ? result.ApplicationId ?? -1 : -1);
        }
예제 #18
0
        public int Execute(ISellerApplication application)
        {
            var loans = application.Product as BusinessLoans;

            if (application.CompanyData == null || loans != null)
            {
                return(Globals.NulResult);
            }

            var result = _businessLoansService.SubmitApplicationFor(
                application.CompanyData.FromCompanyData(),
                new LoansRequest
            {
                InterestRatePerAnnum = loans.InterestRatePerAnnum,
                LoanAmount           = loans.LoanAmount
            });

            return(result.Success ? result.ApplicationId ?? -1 : -1);
        }
예제 #19
0
        private int SubmitBusinessLoanRequest(ISellerCompanyData companyData, BusinessLoans loan)
        {
            var companyDataRequest = CreateCompanyDataRequest(companyData);

            var loanApplication = new LoansRequest
            {
                InterestRatePerAnnum = loan.InterestRatePerAnnum,
                LoanAmount           = loan.LoanAmount
            };

            var result = _businessLoansService.SubmitApplicationFor(companyDataRequest, loanApplication);

            if (!result.Success)
            {
                return(-1);
            }

            return(result.ApplicationId ?? -1);
        }
예제 #20
0
        public int ProcessProduct()
        {
            var loans  = application.Product as BusinessLoans;
            var result = service.SubmitApplicationFor(
                new CompanyDataRequest
            {
                CompanyFounded = application.CompanyData.Founded,
                CompanyNumber  = application.CompanyData.Number,
                CompanyName    = application.CompanyData.Name,
                DirectorName   = application.CompanyData.DirectorName
            },
                new LoansRequest
            {
                InterestRatePerAnnum = loans.InterestRatePerAnnum,
                LoanAmount           = loans.LoanAmount
            }
                );

            return((result.Success) ? result.ApplicationId ?? -1 : -1);
        }
예제 #21
0
        public bool IsSubmittedApplicationForBusinessLoansSuccess(
            BusinessLoans product, ISellerApplication application)
        {
            if (application?.CompanyData == null || application.Product == null || product == null)
            {
                return(false);
            }

            var result = _businessLoansService.SubmitApplicationFor(new CompanyDataRequestModel
            {
                CompanyFounded = application.CompanyData.Founded,
                CompanyNumber  = application.CompanyData.Number,
                CompanyName    = application.CompanyData.Name,
                DirectorName   = application.CompanyData.DirectorName
            }, new LoansRequestModel
            {
                InterestRatePerAnnum = product.InterestRatePerAnnum,
                LoanAmount           = product.LoanAmount
            });

            return(result.Success && result.ApplicationId.HasValue);
        }
예제 #22
0
        public int SubmitApplicationFor(ISellerApplication application)
        {
            if (application.Product is SelectiveInvoiceDiscount sid)
            {
                return(_selectInvoiceService.SubmitApplicationFor(application.CompanyData.Number.ToString(), sid.InvoiceAmount, sid.AdvancePercentage));
            }

            if (application.Product is ConfidentialInvoiceDiscount cid)
            {
                var result = _confidentialInvoiceWebService.SubmitApplicationFor(
                    new CompanyDataRequest
                {
                    CompanyFounded = application.CompanyData.Founded,
                    CompanyNumber  = application.CompanyData.Number,
                    CompanyName    = application.CompanyData.Name,
                    DirectorName   = application.CompanyData.DirectorName
                }, cid.TotalLedgerNetworth, cid.AdvancePercentage, cid.VatRate);

                return((result.Success) ? result.ApplicationId ?? -1 : -1);
            }

            if (application.Product is BusinessLoans loans)
            {
                var result = _businessLoansService.SubmitApplicationFor(new CompanyDataRequest
                {
                    CompanyFounded = application.CompanyData.Founded,
                    CompanyNumber  = application.CompanyData.Number,
                    CompanyName    = application.CompanyData.Name,
                    DirectorName   = application.CompanyData.DirectorName
                }, new LoansRequest
                {
                    InterestRatePerAnnum = loans.InterestRatePerAnnum,
                    LoanAmount           = loans.LoanAmount
                });
                return((result.Success) ? result.ApplicationId ?? -1 : -1);
            }

            throw new InvalidOperationException();
        }
예제 #23
0
        public int SubmitApplicationFor(ISellerApplication application)
        {
            //2.	No null checks for application and the product/company data within being null.
            if (application == null || application.Product == null || application.CompanyData == null)
            {
                throw new ArgumentNullException();
            }

            try
            {
                var applicationSuccess = 0;
                if (application.Product is SelectiveInvoiceDiscount sid)
                {
                    applicationSuccess = _selectInvoiceService.SubmitApplicationFor(application.CompanyData.Number.ToString(), sid.InvoiceAmount, sid.AdvancePercentage);
                    //3. disposing objects when done using them
                    sid = null;
                    return(applicationSuccess);
                }

                if (application.Product is ConfidentialInvoiceDiscount cid)
                {
                    var result = _confidentialInvoiceWebService.SubmitApplicationFor(
                        new CompanyDataRequest
                    {
                        CompanyFounded = application.CompanyData.Founded,
                        CompanyNumber  = application.CompanyData.Number,
                        CompanyName    = application.CompanyData.Name,
                        DirectorName   = application.CompanyData.DirectorName
                    }, cid.TotalLedgerNetworth, cid.AdvancePercentage, cid.VatRate);

                    //4.	The outcome from the services IApplicationResult should be checked for Null before accessing any properties.
                    applicationSuccess = result != null ? (result.Success) ? result.ApplicationId ?? -1 : -1 : -1;
                    //3. disposing objects when done using them
                    cid = null;
                    return(applicationSuccess);
                }

                if (application.Product is BusinessLoans loans)
                {
                    var result = _businessLoansService.SubmitApplicationFor(new CompanyDataRequest
                    {
                        CompanyFounded = application.CompanyData.Founded,
                        CompanyNumber  = application.CompanyData.Number,
                        CompanyName    = application.CompanyData.Name,
                        DirectorName   = application.CompanyData.DirectorName
                    }, new LoansRequest
                    {
                        InterestRatePerAnnum = loans.InterestRatePerAnnum,
                        LoanAmount           = loans.LoanAmount
                    });

                    //4.	The outcome from the services IApplicationResult should be checked for Null before accessing any properties.
                    applicationSuccess = result != null ? (result.Success) ? result.ApplicationId ?? -1 : -1 : -1;
                    //3. disposing objects when done using them
                    loans = null;
                    return(applicationSuccess);
                }
            }
            catch
            {
                //1.	exception handling to gracefully handle any errors from the services being called.
                //2.    also takes care of the scenario where the service variable is null
                throw new Exception("Error while submitting the application");
            }

            throw new InvalidOperationException();
        }