SubmitApplicationFor_ShouldCallConfidentialInvoiceService_WhenGetConfidentialInvoiceDiscountProduct()
        {
            var sellerApplication = CreateSellerApplicationWithConfidentialInvoiceDiscount();

            _productApplicationService.SubmitApplicationFor(sellerApplication);

            A.CallTo(
                () => _confidentialInvoiceService.SubmitApplicationFor(
                    A <CompanyDataRequest> ._,
                    A <decimal> ._,
                    A <decimal> ._,
                    A <decimal> ._))
            .MustHaveHappened();
        }
        public void SubmitApplicationFor_ConfidentialInvoiceDiscount_CallsConfidentialInvoiceService()
        {
            // **Arrange**
            ConfidentialInvoiceDiscount cidProduct  = _fixture.Build <ConfidentialInvoiceDiscount>().Create();
            SellerCompanyData           companyData = _fixture.Build <SellerCompanyData>().Create();
            SellerApplication <ConfidentialInvoiceDiscount> application = _fixture.Build <SellerApplication <ConfidentialInvoiceDiscount> >()
                                                                          .With(a => a.Product, cidProduct)
                                                                          .With(a => a.CompanyData, companyData)
                                                                          .Create();

            cid.SubmitApplicationFor(
                Arg.Is <CompanyDataRequest>(x => x.DirectorName == companyData.DirectorName &&
                                            x.CompanyNumber == companyData.Number &&
                                            x.CompanyName == companyData.Name &&
                                            x.CompanyFounded == companyData.Founded),
                cidProduct.TotalLedgerNetworth,
                cidProduct.AdvancePercentage,
                cidProduct.VatRate)
            .Returns(new TestApplicationResult(10, true, new List <string>()));

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

            // **Assert**
            cid.Received(1).SubmitApplicationFor(Arg.Is <CompanyDataRequest>(x => x.DirectorName == companyData.DirectorName &&
                                                                             x.CompanyNumber == companyData.Number &&
                                                                             x.CompanyName == companyData.Name &&
                                                                             x.CompanyFounded == companyData.Founded), cidProduct.TotalLedgerNetworth, cidProduct.AdvancePercentage, cidProduct.VatRate);
            Assert.Equal(10, result);
        }
        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 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());
        }
 /// <summary>
 /// Submitting application for Confidential Invoice Discount.
 /// </summary>
 /// <param name="application"></param>
 /// <returns></returns>
 public IApplicationResult SubmitApplicationForConfidentialInvoiceDiscount(ConfidentialInvoiceDiscountApplication application)
 {
     return(_confidentialInvoiceWebService.SubmitApplicationFor(
                SetCompanyDataRequest(application),
                application.ConfidentialInvoiceDiscount.TotalLedgerNetworth,
                application.ConfidentialInvoiceDiscount.AdvancePercentage,
                application.ConfidentialInvoiceDiscount.VatRate));
 }
        /// <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));
        }
        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));
        }
Beispiel #8
0
        private int SubmitForConfidentialInvoiceDiscount(ISellerApplication application)
        {
            var product = application.Product as ConfidentialInvoiceDiscount;
            var result  = _confidentialInvoiceWebService.SubmitApplicationFor(
                CompanyDataRequestFactory.Create(application.CompanyData),
                product.TotalLedgerNetworth,
                product.AdvancePercentage,
                product.VatRate);

            return(result.ApplicationId ?? FailedStatus);
        }
Beispiel #9
0
        private int SubmitApplicationForConfidentialInvoiceDiscount(ISellerApplication application, ConfidentialInvoiceDiscount cid)
        {
            var result = _confidentialInvoiceWebService.SubmitApplicationFor(
                _sellerApplicationMapper.MapToCompanyDataRequest(application),
                cid.TotalLedgerNetworth,
                cid.AdvancePercentage,
                cid.VatRate
                );

            return(_applicationResultMapper.MapToResultCode(result));
        }
Beispiel #10
0
        public async Task <ServiceResult> RunAsync(ISellerApplication application)
        {
            var cid    = application.Product as ConfidentialInvoiceDiscount;
            var result = /*await*/ service.SubmitApplicationFor(
                application.CompanyData.ToRequest(),
                cid.TotalLedgerNetworth,
                cid.AdvancePercentage,
                cid.VatRate);

            return(new ServiceResult(result.Success ? ProceedStatus.Ready : ProceedStatus.Error, result));
        }
        private int CallConfidentialInvoiceWebService(ISellerCompanyData companyData, ConfidentialInvoiceDiscount cid)
        {
            var companyDataRequest = GetCompanyDataRequest(companyData);

            var result = _confidentialInvoiceWebService.SubmitApplicationFor(
                companyDataRequest,
                cid.TotalLedgerNetworth,
                cid.AdvancePercentage,
                cid.VatRate);

            return(ProcessApplicationResult(result));
        }
        public override IApplicationServiceWorker Submit()
        {
            var product = (ConfidentialInvoiceDiscount)Application.Product;

            ApplicationResult = _confidentialInvoiceService.SubmitApplicationFor(
                CompanyDataRequestMapping.MapFromSellerCompanyData(Application.CompanyData),
                product.TotalLedgerNetworth,
                product.AdvancePercentage,
                product.VatRate);

            return(this);
        }
Beispiel #13
0
        public int SubmitApplication(ISellerApplication application)
        {
            var result = _confidentialInvoiceWebService.SubmitApplicationFor(
                new CompanyDataRequest
            {
                CompanyFounded = application.CompanyData.Founded,
                CompanyNumber  = application.CompanyData.Number,
                CompanyName    = application.CompanyData.Name,
                DirectorName   = application.CompanyData.DirectorName
            }, _totalLedgerNetworth, _advancePercentage, _vatRate);

            return((result.Success) ? result.ApplicationId ?? -1 : -1);
        }
        /// <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 result             = _confidentialInvoiceService.SubmitApplicationFor(companyDataRequest,
                                                                                          _confidentialInvoiceDiscountProduct.TotalLedgerNetworth, _confidentialInvoiceDiscountProduct.AdvancePercentage, _confidentialInvoiceDiscountProduct.VatRate);

                return((result.Success) ? result.ApplicationId ?? -1 : -1);
            }
        }
Beispiel #15
0
        /// <inheritdoc />
        public int SubmitForConfidentialInvoiceDiscount(ISellerCompanyData companyData, ConfidentialInvoiceDiscount cid)
        {
            var result = _confidentialInvoiceWebService.SubmitApplicationFor(
                new CompanyDataRequest
            {
                CompanyFounded = companyData.Founded,
                CompanyNumber  = companyData.Number,
                CompanyName    = companyData.Name,
                DirectorName   = companyData.DirectorName
            }, cid.TotalLedgerNetworth, cid.AdvancePercentage, cid.VatRate);

            return((result.Success) ? result.ApplicationId ?? -1 : -1);
        }
Beispiel #16
0
        /// <summary>
        /// Returning ServiceResult instead of int -> no backwards compatibility, doing that on purpose. It's something (more information) for something (backwards compatibility) :)
        /// </summary>
        /// <param name="application"></param>
        /// <returns></returns>
        public ServiceResult SubmitApplicationFor(ISellerApplication application)
        {
            var result = _confidentialInvoiceWebService.SubmitApplicationFor(
                new CompanyDataRequest
            {
                CompanyFounded = application.CompanyData.Founded,
                CompanyNumber  = application.CompanyData.Number,
                CompanyName    = application.CompanyData.Name,
                DirectorName   = application.CompanyData.DirectorName
            }, Product.TotalLedgerNetworth, Product.AdvancePercentage, Product.VatRate);

            return(new ServiceResult(result));
        }
Beispiel #17
0
        protected override IApplicationResult SubmitWithResult(ISellerApplication application)
        {
            if (!(application.Product is ConfidentialInvoiceDiscount cid))
            {
                throw new InvalidOperationException(GetErrorMessage(typeof(ConfidentialInvoiceDiscount), application.Product.GetType()));
            }

            return(_confidentialInvoiceWebService.SubmitApplicationFor(
                       application.CompanyData.ToCompanyDataRequest(),
                       cid.TotalLedgerNetworth,
                       cid.AdvancePercentage,
                       cid.VatRate));
        }
        private int SubmitCompanyDataRequest(ISellerCompanyData application, ConfidentialInvoiceDiscount cid)
        {
            var companyDataRequest = CreateCompanyDataRequest(application);

            var result = _confidentialInvoiceWebService.SubmitApplicationFor(
                companyDataRequest, cid.TotalLedgerNetworth, cid.AdvancePercentage, cid.VatRate);

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

            return(result.ApplicationId ?? -1);
        }
Beispiel #19
0
        public int Execute(ISellerApplication application)
        {
            var product = application.Product as ConfidentialInvoiceDiscount;

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

            return((result.Success) ? result.ApplicationId ?? -1 : -1);
        }
        public int Execute(ISellerApplication application)
        {
            var cid = application.Product as ConfidentialInvoiceDiscount;

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

            var result = _confidentialInvoiceWebService.SubmitApplicationFor(
                application.CompanyData.FromCompanyData(),
                cid.TotalLedgerNetworth, cid.AdvancePercentage, cid.VatRate);

            return(result.Success ? result.ApplicationId ?? -1 : -1);
        }
        public int ProcessProduct()
        {
            var product = (ConfidentialInvoiceDiscount)application.Product;
            var result  = service.SubmitApplicationFor(
                new CompanyDataRequest
            {
                CompanyFounded = application.CompanyData.Founded,
                CompanyNumber  = application.CompanyData.Number,
                CompanyName    = application.CompanyData.Name,
                DirectorName   = application.CompanyData.DirectorName
            },
                product.TotalLedgerNetworth,
                product.AdvancePercentage,
                vatRate
                );

            return((result.Success) ? result.ApplicationId ?? -1 : -1);
        }
Beispiel #22
0
        public bool IsSubmittedApplicationForConfidentialInvoiceDiscountSuccess(
            ConfidentialInvoiceDiscountRequestModel product, ISellerApplication application)
        {
            if (application.CompanyData == null || product == null)
            {
                return(false);
            }

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

            return(result.Success && result.ApplicationId.HasValue);
        }
Beispiel #23
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();
        }
        public int Handle(ISellerApplication application)
        {
            if (application == null)
            {
                throw new ArgumentNullException(nameof(application));
            }

            if (application.Product is ConfidentialInvoiceDiscount product)
            {
                var result = _confidentialInvoiceWebService.SubmitApplicationFor(
                    new CompanyDataRequest
                {
                    CompanyFounded = application.CompanyData.Founded,
                    CompanyNumber  = application.CompanyData.Number,
                    CompanyName    = application.CompanyData.Name,
                    DirectorName   = application.CompanyData.DirectorName
                }, product.TotalLedgerNetworth, product.AdvancePercentage, product.VatRate);
                return((result.Success) ? result.ApplicationId ?? -1 : -1);
            }

            throw new InvalidOperationException();
        }
Beispiel #25
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();
        }