public void Should_Throw_Error_if_application_is_Null()
        {
            ISellerApplication sellerApplciation = null;
            var productApplciationservice        = new ProductApplicationService(_selectInvoiceService.Object, _confidentialInvoiceService.Object, _businessLoanService.Object);

            Assert.Throws <NullReferenceException>(() => productApplciationservice.SubmitApplicationFor(sellerApplciation));
        }
Beispiel #2
0
 public int SubmitApplication(ISellerApplication application)
 {
     return(_selectInvoiceService.SubmitApplicationFor(
                application.CompanyData.Number.ToString(),
                _invoiceAmount,
                _advancePercentage));
 }
 private void SetupMockBusinessLoans(ISellerApplication application, IApplicationResult result)
 {
     _mockBusinessLoansService
     .Setup(p => p.SubmitApplicationFor(It.IsAny <CompanyDataRequest>(), It.IsAny <LoansRequest>()))
     .Returns(result)
     .Verifiable();
 }
Beispiel #4
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 int SubmitApplicationFor(ISellerApplication application)
        {
            // Assumed here that it may be possible to send a blank
            // Application to the method, so I have added defensive coding to it
            if (application == null)
            {
                throw new NullReferenceException();
            }

            switch (application.Product)
            {
            case SelectiveInvoiceDiscount sid:
                return(_selectInvoiceService.SubmitApplicationFor(
                           application.CompanyData.Number.ToString(),
                           sid.InvoiceAmount,
                           sid.AdvancePercentage
                           ));

            case ConfidentialInvoiceDiscount cid:
                return(SubmitCompanyDataRequest(application.CompanyData, cid));

            case BusinessLoans loan:
                return(SubmitBusinessLoanRequest(application.CompanyData, loan));

            default:
                throw new InvalidOperationException();
            }
        }
        public static dynamic ToSubmitCommand(this ISellerApplication application)
        {
            if (application.Product is SelectiveInvoiceDiscount invoiceDiscount)
            {
                return(new SubmitSelectiveInvoiceDiscountApplicationCommand(
                           invoiceDiscount.InvoiceAmount,
                           invoiceDiscount.AdvancePercentage,
                           application.CompanyData.Number));
            }

            if (application.Product is BusinessLoans businessLoan)
            {
                return(new SubmitBusinessLoansCommand(
                           application.CompanyData,
                           businessLoan.InterestRatePerAnnum,
                           businessLoan.LoanAmount));
            }

            if (application.Product is ConfidentialInvoiceDiscount confidentialInvoiceDiscount)
            {
                return(new SubmitConfidentialInvoiceDiscountCommand(
                           confidentialInvoiceDiscount.TotalLedgerNetworth,
                           confidentialInvoiceDiscount.AdvancePercentage,
                           confidentialInvoiceDiscount.VatRate,
                           application.CompanyData));
            }

            throw new InvalidOperationException();
        }
        /// <summary>
        /// Submitting application based on the product.
        /// </summary>
        /// <param name="application"></param>
        /// <returns></returns>

        public int SubmitApplicationFor(ISellerApplication application)
        {
            try
            {
                if (application != null & application.Product != null)
                {
                    if (application.Product is SelectiveInvoiceDiscount)
                    {
                        return(SubmitApplicationForSelectiveInvoiceDiscount((SelectiveInvoiceDiscountApplication)application));
                    }

                    if (application.Product is ConfidentialInvoiceDiscount)
                    {
                        var result = SubmitApplicationForConfidentialInvoiceDiscount((ConfidentialInvoiceDiscountApplication)application);
                        return((result.Success) ? result.ApplicationId ?? -1 : -1);
                    }

                    if (application.Product is BusinessLoans)
                    {
                        var result = SubmitApplicationForBusinessLoans((BusinessLoansApplication)application);
                        return((result.Success) ? result.ApplicationId ?? -1 : -1);
                    }
                }
                else
                {
                    throw new ArgumentNullException();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return(-1);
        }
        public int SubmitApplication(ISellerApplication application)
        {
            var sid = ValidateArgument <SelectiveInvoiceDiscount>(application);

            return(_selectInvoiceService.SubmitApplicationFor(application.CompanyData.Number.ToString(),
                                                              sid.InvoiceAmount, sid.AdvancePercentage));
        }
Beispiel #9
0
 public ServiceResult SubmitApplicationFor(ISellerApplication application)
 {
     return(new ServiceResult(
                id: 1,   // generated by something
                code: 2, // lets say this means it's not critical. Probably could be an enum
                errorMessage: "Unsupported product type"));
 }
Beispiel #10
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 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 ConfidentialInvoiceDiscount cid))
            {
                throw new InvalidOperationException(
                          $"{nameof(ConfidentialInvoiceApplicationHandler)} " +
                          $"handles {nameof(ConfidentialInvoiceDiscount)} product only, " +
                          $"but {application.Product.GetType().Name} was passed");
            }

            var result = _confidentialInvoiceService.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);

            // 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 int SubmitApplicationFor(ISellerApplication application)
        {
            if (application?.CompanyData == null)
            {
                throw new ArgumentException(nameof(application.CompanyData));
            }

            if (application.Product == null)
            {
                throw new ArgumentException(nameof(application.Product));
            }

            try
            {
                switch (application.Product)
                {
                case SelectiveInvoiceDiscount sid:
                    return(CallSelectInvoiceService(application.CompanyData.Number, sid));

                case ConfidentialInvoiceDiscount cid:
                    return(CallConfidentialInvoiceWebService(application.CompanyData, cid));

                case BusinessLoans loans:
                    return(CallBusinessLoansService(application.CompanyData, loans));

                default:
                    throw new ArgumentException(nameof(application.Product));
                }
            }
            catch (Exception e)
            {
                //TODO Log exception
                throw;
            }
        }
Beispiel #13
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="application"></param>
        /// <returns></returns>
        public int SubmitApplicationFor(ISellerApplication application)
        {
            try
            {
                if (application != null && application.Product != null && application.CompanyData != null && ServicesMediator != null)
                {
                    if (application.Product is ProductServices.IServiceProvider)
                    {
                        ProductServices.IServiceProvider serviceProvider =
                            application.Product as ProductServices.IServiceProvider;

                        ProductServices.IProductService productService = serviceProvider.GetProductService(ServicesMediator);

                        return(productService.SubmitApplication(application.CompanyData));
                    }
                    else
                    {
                        throw new NotSupportedException();
                    }
                }
                else
                {
                    throw new ArgumentNullException();
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.ToString());
                throw;
            }
        }
Beispiel #14
0
        public IApplicationResult SubmitApplicationFor(ISellerApplication application)
        {
            var clerk = productResolver.Assign(application);

            // future asynchrony
            clerk.Take(application);
            return(clerk.Issue());
        }
Beispiel #15
0
        private int SubmitForBusinessLoans(ISellerApplication application)
        {
            var result = _businessLoansService.SubmitApplicationFor(
                CompanyDataRequestFactory.Create(application.CompanyData),
                LoansRequestFactory.Create(application.Product as BusinessLoans));

            return(result.ApplicationId ?? FailedStatus);
        }
Beispiel #16
0
        public void ProductApplicationService_SubmitApplicationFor_WhenCalledWithSelectiveInvoiceDiscount_OnError_ShouldReturnMinusOne()
        {
            _sellerApplication = TestSellerApplicationProvider.GetTestSellerApplication(new SelectiveInvoiceDiscount());
            _selectInvoiceServiceMock.Setup(m => m.SubmitApplicationFor(It.IsAny <string>(), It.IsAny <decimal>(), It.IsAny <decimal>())).Returns(-1);
            var result = _sut.SubmitApplicationFor(_sellerApplication);

            result.Should().Be(-1);
        }
        /// <summary>
        /// Handle applications for confidential invoice discounts.
        /// </summary>
        /// <param name="application">Applicaiton.</param>
        /// <returns>Result id of the applicaiton or a fails status.</returns>
        public int SubmitApplicationFor(ISellerApplication <ConfidentialInvoiceDiscount> application)
        {
            IApplicationResult result = _confidentialInvoiceWebService.SubmitApplicationFor(
                MappingHelper.SellerCompanyDataToCompanyDataRequest(application.CompanyData),
                application.Product.TotalLedgerNetworth, application.Product.AdvancePercentage, application.Product.VatRate);

            return(ReturnResult(result));
        }
Beispiel #18
0
        // Comments.md - my remark about returning meaningful result/error object instead of int
        public ServiceResult SubmitApplicationFor(ISellerApplication application)
        {
            // Validate.IsNotNull(application); -> guard for param validation

            var serviceHandler = ServiceHandlerDispatcher.GetHandler(application.Product);

            return(serviceHandler.SubmitApplicationFor(application));
        }
        private void SetupMockSelectInvoiceService(ISellerApplication application, int rtn)
        {
            SelectiveInvoiceDiscount product = (SelectiveInvoiceDiscount)application.Product;

            _mockSelectInvoiceService
            .Setup(p => p.SubmitApplicationFor(application.CompanyData.Number.ToString(), product.InvoiceAmount, product.AdvancePercentage))
            .Returns(rtn)
            .Verifiable();
        }
        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));
        }
Beispiel #21
0
        public void ProductApplicationService_SubmitApplicationFor_WhenCalledWithConfidentialInvoiceDiscount_OnError_ShouldReturnMinusOne()
        {
            InitResult(success: false);
            _sellerApplication = TestSellerApplicationProvider.GetTestSellerApplication(new ConfidentialInvoiceDiscount());
            _confidentialInvoiceServiceMock.Setup(m => m.SubmitApplicationFor(It.IsAny <CompanyDataRequest>(), It.IsAny <decimal>(), It.IsAny <decimal>(), It.IsAny <decimal>())).Returns(_result.Object);
            var result = _sut.SubmitApplicationFor(_sellerApplication);

            result.Should().Be(-1);
        }
Beispiel #22
0
        private int SubmitForSelectiveInvoiceDiscount(ISellerApplication application)
        {
            var product = application.Product as SelectiveInvoiceDiscount;

            return(_selectInvoiceService.SubmitApplicationFor(
                       application.CompanyData.Number.ToString(),
                       product.InvoiceAmount,
                       product.AdvancePercentage));
        }
Beispiel #23
0
        public void ProductApplicationService_SubmitApplicationFor_WhenCalledWithBusinessLoans_OnError_ShouldReturnMinusOne()
        {
            InitResult(success: false);
            _sellerApplication = TestSellerApplicationProvider.GetTestSellerApplication(new BusinessLoans());
            _businessLoansServiceMock.Setup(m => m.SubmitApplicationFor(It.IsAny <CompanyDataRequest>(), It.IsAny <LoansRequest>())).Returns(_result.Object);
            var result = _sut.SubmitApplicationFor(_sellerApplication);

            result.Should().Be(-1);
        }
        /// <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));
        }
Beispiel #25
0
        public int SubmitApplicationFor(ISellerApplication application)
        {
            var submitCommand = application.ToSubmitCommand();
            var handler       = this.serviceFactory.GetHandlerForCommand(submitCommand);

            var result = handler.ExecuteAsync(submitCommand).Result;

            return(result.Successful ? result.Data : -1);
        }
        public int SubmitApplication(ISellerApplication application)
        {
            var cid = ValidateArgument <ConfidentialInvoiceDiscount>(application);

            var result = _confidentialInvoiceService.SubmitApplicationFor(_companyDataMapper.MapToRequest(application.CompanyData),
                                                                          cid.TotalLedgerNetworth, cid.AdvancePercentage, cid.VatRate);

            return(GetResult(result));
        }
        private void SetupMockConfidentialInvoiceDiscount(ISellerApplication application, IApplicationResult result)
        {
            ConfidentialInvoiceDiscount product = (ConfidentialInvoiceDiscount)application.Product;

            _mockConfidentialInvoiceService
            .Setup(p => p.SubmitApplicationFor(It.IsAny <CompanyDataRequest>(), product.TotalLedgerNetworth, product.AdvancePercentage, product.VatRate))
            .Returns(result)
            .Verifiable();
        }
Beispiel #28
0
        public override int Submit(ISellerApplication application)
        {
            if (!(application.Product is SelectiveInvoiceDiscount sid))
            {
                throw new InvalidOperationException(GetErrorMessage(typeof(SelectiveInvoiceDiscount), application.Product.GetType()));
            }

            return(_selectInvoiceService.SubmitApplicationFor(application.CompanyData.Number.ToString(), sid.InvoiceAmount, sid.AdvancePercentage));
        }
Beispiel #29
0
        private int SubmitApplicationForBusinessLoans(ISellerApplication application, BusinessLoans loans)
        {
            var result = _businessLoansService.SubmitApplicationFor(
                _sellerApplicationMapper.MapToCompanyDataRequest(application),
                _businessLoanMapper.MapToLoanRequest(loans)
                );

            return(_applicationResultMapper.MapToResultCode(result));
        }
        public ServiceResult SubmitApplicationFor(ISellerApplication application)
        {
            var result = selectInvoiceService.SubmitApplicationFor(
                application.CompanyData.Number.ToString(),
                Product.InvoiceAmount,
                Product.AdvancePercentage);

            return(new ServiceResult(result));
        }