Example #1
0
        public async Task Build_ProcessesAllReturnsInProducerList()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var schemeReturn = new SchemeReturn()
            {
                ApprovalNo   = "WEE/AA1111AA/SCH",
                ProducerList = new SchemeReturnProducer[]
                {
                    new SchemeReturnProducer
                    {
                        Returns = new[] { A.Dummy <TonnageReturnType>(), A.Dummy <TonnageReturnType>() }
                    },
                    new SchemeReturnProducer
                    {
                        Returns = new[] { A.Dummy <TonnageReturnType>() }
                    }
                }
            };

            await builder.Create().Build(schemeReturn);

            A.CallTo(() => builder.DataReturnVersionBuilder.AddEeeOutputAmount(A <string> ._, A <string> ._, A <WeeeCategory> ._, A <ObligationType> ._, A <decimal> ._))
            .MustHaveHappened(Repeated.Exactly.Times(3));
        }
        public async Task Build_ProcessesAllReturnsInProducerList()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var schemeReturn = new SchemeReturn()
            {
                ApprovalNo = "WEE/AA1111AA/SCH",
                ProducerList = new SchemeReturnProducer[]
                {
                    new SchemeReturnProducer
                    {
                        Returns = new[] { A.Dummy<TonnageReturnType>(), A.Dummy<TonnageReturnType>() }
                    },
                    new SchemeReturnProducer
                    {
                        Returns = new[] { A.Dummy<TonnageReturnType>() }
                    }
                }
            };

            await builder.Create().Build(schemeReturn);

            A.CallTo(() => builder.DataReturnVersionBuilder.AddEeeOutputAmount(A<string>._, A<string>._, A<WeeeCategory>._, A<ObligationType>._, A<decimal>._))
                 .MustHaveHappened(Repeated.Exactly.Times(3));
        }
Example #3
0
        public async Task Build_ProcessesAllReturnsInDeliveredToAaTF()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var schemeReturn = new SchemeReturn()
            {
                ApprovalNo      = "WEE/AA1111AA/SCH",
                DeliveredToAATF = new[]
                {
                    new SchemeReturnDeliveredToFacility
                    {
                        Returns = new[] { A.Dummy <TonnageReturnType>(), A.Dummy <TonnageReturnType>() }
                    },
                    new SchemeReturnDeliveredToFacility
                    {
                        Returns = new[] { A.Dummy <TonnageReturnType>() }
                    },
                }
            };

            await builder.Create().Build(schemeReturn);

            A.CallTo(() => builder.DataReturnVersionBuilder.AddAatfDeliveredAmount(A <string> ._, A <string> ._, A <WeeeCategory> ._, A <ObligationType> ._, A <decimal> ._))
            .MustHaveHappened(Repeated.Exactly.Times(3));
        }
Example #4
0
        public async Task HandleAsync_SavesDataUpload()
        {
            // Arrange
            var builder = new ProcessDataReturnXmlFileHandlerBuilder();

            var schemeReturn = new SchemeReturn()
            {
                ComplianceYear = "2016", ReturnPeriod = SchemeReturnReturnPeriod.Quarter1JanuaryMarch
            };
            var xmlGeneratorResult = new GenerateFromDataReturnXmlResult <SchemeReturn>(A.Dummy <string>(),
                                                                                        schemeReturn, new List <XmlValidationError>());

            A.CallTo(() => builder.XmlGenerator.GenerateDataReturns <SchemeReturn>(A <ProcessDataReturnXmlFile> ._))
            .Returns(xmlGeneratorResult);

            A.CallTo(() => builder.DataReturnVersionFromXmlBuilder.Build(A <SchemeReturn> ._))
            .Returns(new DataReturnVersionBuilderResult(A.Dummy <DataReturnVersion>(), A.Dummy <List <ErrorData> >()));

            // Act
            await builder.InvokeHandleAsync();

            // Assert
            A.CallTo(() => builder.DataAccess.AddAndSaveAsync(A <DataReturnUpload> ._))
            .MustHaveHappened(Repeated.Exactly.Once);
        }
Example #5
0
        public async Task HandleAsync_XmlContainsBusinessErrorAndWarning_StoresBusinessErrorAndWarning()
        {
            using (DatabaseWrapper database = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper  helper       = new ModelHelper(database.Model);
                DomainHelper domainHelper = new DomainHelper(database.WeeeContext);

                var organisation      = helper.CreateOrganisation();
                var scheme            = helper.CreateScheme(organisation);
                var dataReturnVersion = helper.CreateDataReturnVersion(scheme, 2016, 3, false);

                database.Model.SaveChanges();

                var builder = new ProcessDataReturnXmlFileHandlerBuilder(database.WeeeContext);

                var schemeReturn = new SchemeReturn()
                {
                    ComplianceYear = "2016",
                    ReturnPeriod   = SchemeReturnReturnPeriod.Quarter3JulySeptember
                };

                var xmlGeneratorResult = new GenerateFromDataReturnXmlResult <SchemeReturn>(
                    "Test XML string",
                    schemeReturn,
                    new List <XmlValidationError>());

                A.CallTo(() => builder.XmlGenerator.GenerateDataReturns <SchemeReturn>(A <ProcessDataReturnXmlFile> ._))
                .Returns(xmlGeneratorResult);

                var dbDataReturnVersion     = domainHelper.GetDataReturnVersion(dataReturnVersion.Id);
                var businessErrorAndWarning = new List <ErrorData>
                {
                    new ErrorData("Error text", ErrorLevel.Error),
                    new ErrorData("Warning text", ErrorLevel.Warning)
                };

                var dataReturnVersionBuilderResult = new DataReturnVersionBuilderResult(dbDataReturnVersion, businessErrorAndWarning);

                A.CallTo(() => builder.DataReturnVersionFromXmlBuilder.Build(A <SchemeReturn> ._))
                .Returns(dataReturnVersionBuilderResult);

                // Act
                var dataReturnUploadId = await builder.InvokeHandleAsync(organisation.Id);

                // Assert
                var dataReturnUpload = domainHelper.GetDataReturnUpload(dataReturnUploadId);

                Assert.Equal(2, dataReturnUpload.Errors.Count);
                Assert.All(dataReturnUpload.Errors, e => Assert.Equal(Domain.Error.UploadErrorType.Business, e.ErrorType));
                Assert.Contains(dataReturnUpload.Errors, p => p.ErrorLevel == Domain.Error.ErrorLevel.Error && p.Description == "Error text");
                Assert.Contains(dataReturnUpload.Errors, p => p.ErrorLevel == Domain.Error.ErrorLevel.Warning && p.Description == "Warning text");
            }
        }
Example #6
0
        public async Task HandleAsync_XmlDoesNotContainSchemaError_StoresAvailableDataReturnData()
        {
            using (DatabaseWrapper database = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper  helper       = new ModelHelper(database.Model);
                DomainHelper domainHelper = new DomainHelper(database.WeeeContext);

                var organisation      = helper.CreateOrganisation();
                var scheme            = helper.CreateScheme(organisation);
                var dataReturnVersion = helper.CreateDataReturnVersion(scheme, 2016, 3, false);

                database.Model.SaveChanges();

                var builder = new ProcessDataReturnXmlFileHandlerBuilder(database.WeeeContext);

                var schemeReturn = new SchemeReturn()
                {
                    ComplianceYear = "2016",
                    ReturnPeriod   = SchemeReturnReturnPeriod.Quarter3JulySeptember
                };

                var xmlGeneratorResult = new GenerateFromDataReturnXmlResult <SchemeReturn>(
                    "Test XML string",
                    schemeReturn,
                    new List <XmlValidationError>());

                A.CallTo(() => builder.XmlGenerator.GenerateDataReturns <SchemeReturn>(A <ProcessDataReturnXmlFile> ._))
                .Returns(xmlGeneratorResult);

                var dbDataReturnVersion            = domainHelper.GetDataReturnVersion(dataReturnVersion.Id);
                var dataReturnVersionBuilderResult = new DataReturnVersionBuilderResult(dbDataReturnVersion, A.Dummy <List <ErrorData> >());

                A.CallTo(() => builder.DataReturnVersionFromXmlBuilder.Build(A <SchemeReturn> ._))
                .Returns(dataReturnVersionBuilderResult);

                // Act
                var dataReturnUploadId = await builder.InvokeHandleAsync(organisation.Id, fileName : "XML file name");

                // Assert
                var dataReturnUpload = domainHelper.GetDataReturnUpload(dataReturnUploadId);

                Assert.Equal(scheme.Id, dataReturnUpload.Scheme.Id);
                Assert.Equal("Test XML string", dataReturnUpload.RawData.Data);
                Assert.Equal("XML file name", dataReturnUpload.FileName);
                Assert.Equal(2016, dataReturnUpload.ComplianceYear);
                Assert.Equal(Convert.ToInt32(QuarterType.Q3), dataReturnUpload.Quarter);
                Assert.NotEqual(TimeSpan.Zero, dataReturnUpload.ProcessTime);
            }
        }
Example #7
0
        public async Task Build_NoDeliveredToAe_DoesNotProcessDeliveredToAe()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var schemeReturn = new SchemeReturn()
            {
                ApprovalNo    = "WEE/AA1111AA/SCH",
                DeliveredToAE = null
            };

            await builder.Create().Build(schemeReturn);

            A.CallTo(() => builder.DataReturnVersionBuilder.AddAeDeliveredAmount(A <string> ._, A <string> ._, A <WeeeCategory> ._, A <ObligationType> ._, A <decimal> ._))
            .MustNotHaveHappened();
        }
Example #8
0
        public async Task Build_ProcessesAllReturnsInCollectedFromDcf()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var schemeReturn = new SchemeReturn()
            {
                ApprovalNo       = "WEE/AA1111AA/SCH",
                CollectedFromDCF = new[] { A.Dummy <TonnageReturnType>(), A.Dummy <TonnageReturnType>() }
            };

            await builder.Create().Build(schemeReturn);

            A.CallTo(() => builder.DataReturnVersionBuilder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.Dcf, A <WeeeCategory> ._, A <ObligationType> ._, A <decimal> ._))
            .MustHaveHappened(Repeated.Exactly.Times(2));
        }
Example #9
0
        public async Task Build_NoB2CWEEEFromDistributors_DoesNotProcessB2CWEEEFromDistributors()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var schemeReturn = new SchemeReturn()
            {
                ApprovalNo = "WEE/AA1111AA/SCH",
                B2CWEEEFromDistributors = null
            };

            await builder.Create().Build(schemeReturn);

            A.CallTo(() => builder.DataReturnVersionBuilder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.Distributor, A <WeeeCategory> ._, A <ObligationType> ._, A <decimal> ._))
            .MustNotHaveHappened();
        }
        public async Task Build_NoCollectedFromDcf_DoesNotProcessCollectedFromDcf()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var schemeReturn = new SchemeReturn()
            {
                ApprovalNo = "WEE/AA1111AA/SCH",
                CollectedFromDCF = null
            };

            await builder.Create().Build(schemeReturn);

            A.CallTo(() => builder.DataReturnVersionBuilder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.Dcf, A<WeeeCategory>._, A<ObligationType>._, A<decimal>._))
                 .MustNotHaveHappened();
        }
        public async Task Build_NoProducers_DoesNotProcessProducerList()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var schemeReturn = new SchemeReturn()
            {
                ApprovalNo = "WEE/AA1111AA/SCH",
                ProducerList = null
            };

            await builder.Create().Build(schemeReturn);

            A.CallTo(() => builder.DataReturnVersionBuilder.AddEeeOutputAmount(A<string>._, A<string>._, A<WeeeCategory>._, A<ObligationType>._, A<decimal>._))
                 .MustNotHaveHappened();
        }
        public void GenerateDataReturns_ReturnsExpectedDeserialisedType()
        {
            var schemeReturn = new SchemeReturn();

            var builder = new GenerateFromXmlBuilder();

            A.CallTo(() => builder.SchemaValidator.Validate(A <byte[]> ._, string.Empty, A <XNamespace> ._, A <string> ._))
            .Returns(new List <XmlValidationError>());

            A.CallTo(() => builder.XmlConverter.Deserialize <SchemeReturn>(A <XDocument> ._))
            .Returns(schemeReturn);

            var result = builder.Build().GenerateDataReturns <SchemeReturn>(new ProcessDataReturnXmlFile(A.Dummy <Guid>(), A.Dummy <byte[]>(), A.Dummy <string>()));

            Assert.IsType <SchemeReturn>(result.DeserialisedType);
            Assert.Equal(schemeReturn, result.DeserialisedType);
        }
        public void GenerateDataReturns_ReturnsExpectedDeserialisedType()
        {
            var schemeReturn = new SchemeReturn();

            var builder = new GenerateFromXmlBuilder();

            A.CallTo(() => builder.SchemaValidator.Validate(A<byte[]>._, string.Empty, A<XNamespace>._, A<string>._))
                .Returns(new List<XmlValidationError>());

            A.CallTo(() => builder.XmlConverter.Deserialize<SchemeReturn>(A<XDocument>._))
                .Returns(schemeReturn);

            var result = builder.Build().GenerateDataReturns<SchemeReturn>(new ProcessDataReturnXmlFile(A.Dummy<Guid>(), A.Dummy<byte[]>(), A.Dummy<string>()));

            Assert.IsType<SchemeReturn>(result.DeserialisedType);
            Assert.Equal(schemeReturn, result.DeserialisedType);
        }
        public async Task HandleAsync_SchemaErrors_DoesNotPerformBusinessValidation()
        {
            // Arrange
            var builder = new ProcessDataReturnXmlFileHandlerBuilder();

            var schemeReturn = new SchemeReturn() { ComplianceYear = "2016", ReturnPeriod = SchemeReturnReturnPeriod.Quarter1JanuaryMarch };
            var xmlGeneratorResult = new GenerateFromDataReturnXmlResult<SchemeReturn>(A.Dummy<string>(),
                schemeReturn, new List<XmlValidationError> { new XmlValidationError(Core.Shared.ErrorLevel.Error, XmlErrorType.Schema, "Test") });

            A.CallTo(() => builder.XmlGenerator.GenerateDataReturns<SchemeReturn>(A<ProcessDataReturnXmlFile>._))
                .Returns(xmlGeneratorResult);

            // Act
            await builder.InvokeHandleAsync();

            // Assert
            A.CallTo(() => builder.DataReturnVersionFromXmlBuilder.Build(A<SchemeReturn>._)).MustNotHaveHappened();
        }
Example #15
0
        public async Task Build_ReturnsResult()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var expectedResult = new DataReturnVersionBuilderResult(A.Dummy <DataReturnVersion>(), A.Dummy <List <ErrorData> >());

            A.CallTo(() => builder.DataReturnVersionBuilder.Build())
            .Returns(expectedResult);

            SchemeReturn schemeReturn = new SchemeReturn()
            {
                ApprovalNo = "WEE/AA1111AA/SCH"
            };

            var actualResult = await builder.Create().Build(schemeReturn);

            Assert.Equal(expectedResult, actualResult);
        }
        public async Task HandleAsync_SavesDataUpload()
        {
            // Arrange
            var builder = new ProcessDataReturnXmlFileHandlerBuilder();

            var schemeReturn = new SchemeReturn() { ComplianceYear = "2016", ReturnPeriod = SchemeReturnReturnPeriod.Quarter1JanuaryMarch };
            var xmlGeneratorResult = new GenerateFromDataReturnXmlResult<SchemeReturn>(A.Dummy<string>(),
                schemeReturn, new List<XmlValidationError>());

            A.CallTo(() => builder.XmlGenerator.GenerateDataReturns<SchemeReturn>(A<ProcessDataReturnXmlFile>._))
                .Returns(xmlGeneratorResult);

            A.CallTo(() => builder.DataReturnVersionFromXmlBuilder.Build(A<SchemeReturn>._))
                 .Returns(new DataReturnVersionBuilderResult(A.Dummy<DataReturnVersion>(), A.Dummy<List<ErrorData>>()));

            // Act
            await builder.InvokeHandleAsync();

            // Assert
            A.CallTo(() => builder.DataAccess.AddAndSaveAsync(A<DataReturnUpload>._))
                .MustHaveHappened(Repeated.Exactly.Once);
        }
Example #17
0
        public async Task HandleAsync_SchemaErrors_DoesNotPerformBusinessValidation()
        {
            // Arrange
            var builder = new ProcessDataReturnXmlFileHandlerBuilder();

            var schemeReturn = new SchemeReturn()
            {
                ComplianceYear = "2016", ReturnPeriod = SchemeReturnReturnPeriod.Quarter1JanuaryMarch
            };
            var xmlGeneratorResult = new GenerateFromDataReturnXmlResult <SchemeReturn>(A.Dummy <string>(),
                                                                                        schemeReturn, new List <XmlValidationError> {
                new XmlValidationError(Core.Shared.ErrorLevel.Error, XmlErrorType.Schema, "Test")
            });

            A.CallTo(() => builder.XmlGenerator.GenerateDataReturns <SchemeReturn>(A <ProcessDataReturnXmlFile> ._))
            .Returns(xmlGeneratorResult);

            // Act
            await builder.InvokeHandleAsync();

            // Assert
            A.CallTo(() => builder.DataReturnVersionFromXmlBuilder.Build(A <SchemeReturn> ._)).MustNotHaveHappened();
        }
        public async Task HandleAsync_XmlContainsError_DoesNotReturnVersionForDataUpload()
        {
            using (DatabaseWrapper database = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper helper = new ModelHelper(database.Model);
                DomainHelper domainHelper = new DomainHelper(database.WeeeContext);

                var organisation = helper.CreateOrganisation();
                var scheme = helper.CreateScheme(organisation);
                var dataReturnVersion = helper.CreateDataReturnVersion(scheme, 2016, 3, false);

                database.Model.SaveChanges();

                var builder = new ProcessDataReturnXmlFileHandlerBuilder(database.WeeeContext);

                var schemeReturn = new SchemeReturn()
                {
                    ComplianceYear = "2016",
                    ReturnPeriod = SchemeReturnReturnPeriod.Quarter3JulySeptember
                };

                var xmlGeneratorResult = new GenerateFromDataReturnXmlResult<SchemeReturn>(
                    "Test XML string",
                    schemeReturn,
                    new List<XmlValidationError>());

                A.CallTo(() => builder.XmlGenerator.GenerateDataReturns<SchemeReturn>(A<ProcessDataReturnXmlFile>._))
                     .Returns(xmlGeneratorResult);

                var dbDataReturnVersion = domainHelper.GetDataReturnVersion(dataReturnVersion.Id);
                var businessErrorAndWarning = new List<ErrorData>
                {
                    new ErrorData("Error text", ErrorLevel.Error)
                };

                var dataReturnVersionBuilderResult = new DataReturnVersionBuilderResult(dbDataReturnVersion, businessErrorAndWarning);

                A.CallTo(() => builder.DataReturnVersionFromXmlBuilder.Build(A<SchemeReturn>._))
                    .Returns(dataReturnVersionBuilderResult);

                // Act
                var dataReturnUploadId = await builder.InvokeHandleAsync(organisation.Id);

                // Assert
                var dataReturnUpload = domainHelper.GetDataReturnUpload(dataReturnUploadId);

                Assert.Null(dataReturnUpload.DataReturnVersion);
            }
        }
Example #19
0
        public async Task <DataReturnVersionBuilderResult> Build(SchemeReturn schemeReturn)
        {
            // PreValidate (any validation before business validation)
            var preValidationErrors = await dataReturnVersionBuilder.PreValidate();

            // And process XML-specific validation
            var schemeApprovalNumberMismatchResult = schemeApprovalNumberMismatch.Validate(schemeReturn.ApprovalNo,
                                                                                           dataReturnVersionBuilder.Scheme);

            var preBusinessValidationResult = new DataReturnVersionBuilderResult();

            preBusinessValidationResult.ErrorData.AddRange(preValidationErrors);
            preBusinessValidationResult.ErrorData.AddRange(schemeApprovalNumberMismatchResult);

            // If there are any pre-business validation errors return them
            if (preBusinessValidationResult.ErrorData.Any())
            {
                return(preBusinessValidationResult);
            }

            // Then build the Data Return Version
            if (schemeReturn.ProducerList != null)
            {
                foreach (var producer in schemeReturn.ProducerList)
                {
                    foreach (var tonnageReturn in producer.Returns)
                    {
                        await dataReturnVersionBuilder.AddEeeOutputAmount(producer.RegistrationNo,
                                                                          producer.ProducerCompanyName, tonnageReturn.CategoryName.ToDomainWeeeCategory(),
                                                                          tonnageReturn.ObligationType.ToDomainObligationType(), tonnageReturn.TonnesReturnValue);
                    }
                }
            }

            if (schemeReturn.CollectedFromDCF != null)
            {
                foreach (var collectedFromDcf in schemeReturn.CollectedFromDCF)
                {
                    await dataReturnVersionBuilder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.Dcf,
                                                                          collectedFromDcf.CategoryName.ToDomainWeeeCategory(), collectedFromDcf.ObligationType.ToDomainObligationType(), collectedFromDcf.TonnesReturnValue);
                }
            }

            if (schemeReturn.B2CWEEEFromDistributors != null)
            {
                foreach (var weeeFromDistributor in schemeReturn.B2CWEEEFromDistributors)
                {
                    await dataReturnVersionBuilder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.Distributor,
                                                                          weeeFromDistributor.CategoryName.ToDomainWeeeCategory(), weeeFromDistributor.ObligationType.ToDomainObligationType(), weeeFromDistributor.TonnesReturnValue);
                }
            }

            if (schemeReturn.B2CWEEEFromFinalHolders != null)
            {
                foreach (var weeeFromFinalHolders in schemeReturn.B2CWEEEFromFinalHolders)
                {
                    await dataReturnVersionBuilder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.FinalHolder,
                                                                          weeeFromFinalHolders.CategoryName.ToDomainWeeeCategory(), weeeFromFinalHolders.ObligationType.ToDomainObligationType(), weeeFromFinalHolders.TonnesReturnValue);
                }
            }

            if (schemeReturn.DeliveredToAATF != null)
            {
                foreach (var deliveredToAatf in schemeReturn.DeliveredToAATF)
                {
                    foreach (var tonnageReturn in deliveredToAatf.Returns)
                    {
                        await dataReturnVersionBuilder.AddAatfDeliveredAmount(deliveredToAatf.AATFApprovalNo, deliveredToAatf.FacilityName, tonnageReturn.CategoryName.ToDomainWeeeCategory(),
                                                                              tonnageReturn.ObligationType.ToDomainObligationType(), tonnageReturn.TonnesReturnValue);
                    }
                }
            }

            if (schemeReturn.DeliveredToAE != null)
            {
                foreach (var deliveredToAe in schemeReturn.DeliveredToAE)
                {
                    foreach (var tonnageReturn in deliveredToAe.Returns)
                    {
                        await dataReturnVersionBuilder.AddAeDeliveredAmount(deliveredToAe.AEApprovalNo, deliveredToAe.OperatorName, tonnageReturn.CategoryName.ToDomainWeeeCategory(),
                                                                            tonnageReturn.ObligationType.ToDomainObligationType(), tonnageReturn.TonnesReturnValue);
                    }
                }
            }

            return(await dataReturnVersionBuilder.Build());
        }
        public async Task Build_ProcessesAllReturnsInDeliveredToAaTF()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var schemeReturn = new SchemeReturn()
            {
                ApprovalNo = "WEE/AA1111AA/SCH",
                DeliveredToAATF = new[]
                {
                    new SchemeReturnDeliveredToFacility
                    {
                        Returns = new[] { A.Dummy<TonnageReturnType>(), A.Dummy<TonnageReturnType>() }
                    },
                    new SchemeReturnDeliveredToFacility
                    {
                        Returns = new[] { A.Dummy<TonnageReturnType>() }
                    },
                }
            };

            await builder.Create().Build(schemeReturn);

            A.CallTo(() => builder.DataReturnVersionBuilder.AddAatfDeliveredAmount(A<string>._, A<string>._, A<WeeeCategory>._, A<ObligationType>._, A<decimal>._))
                 .MustHaveHappened(Repeated.Exactly.Times(3));
        }
        public async Task Build_ReturnsResult()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var expectedResult = new DataReturnVersionBuilderResult(A.Dummy<DataReturnVersion>(), A.Dummy<List<ErrorData>>());

            A.CallTo(() => builder.DataReturnVersionBuilder.Build())
                 .Returns(expectedResult);

            SchemeReturn schemeReturn = new SchemeReturn()
            {
                ApprovalNo = "WEE/AA1111AA/SCH"
            };

            var actualResult = await builder.Create().Build(schemeReturn);

            Assert.Equal(expectedResult, actualResult);
        }
        public async Task Build_ProcessesAllReturnsInCollectedFromDcf()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var schemeReturn = new SchemeReturn()
            {
                ApprovalNo = "WEE/AA1111AA/SCH",
                CollectedFromDCF = new[] { A.Dummy<TonnageReturnType>(), A.Dummy<TonnageReturnType>() }
            };

            await builder.Create().Build(schemeReturn);

            A.CallTo(() => builder.DataReturnVersionBuilder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.Dcf, A<WeeeCategory>._, A<ObligationType>._, A<decimal>._))
                 .MustHaveHappened(Repeated.Exactly.Times(2));
        }
        public async Task<DataReturnVersionBuilderResult> Build(SchemeReturn schemeReturn)
        {
            // PreValidate (any validation before business validation)
            var preValidationErrors = await dataReturnVersionBuilder.PreValidate();

            // And process XML-specific validation
            var schemeApprovalNumberMismatchResult = schemeApprovalNumberMismatch.Validate(schemeReturn.ApprovalNo,
                dataReturnVersionBuilder.Scheme);

            var preBusinessValidationResult = new DataReturnVersionBuilderResult();
            preBusinessValidationResult.ErrorData.AddRange(preValidationErrors);
            preBusinessValidationResult.ErrorData.AddRange(schemeApprovalNumberMismatchResult);

            // If there are any pre-business validation errors return them
            if (preBusinessValidationResult.ErrorData.Any())
            {
                return preBusinessValidationResult;
            }

            // Then build the Data Return Version
            if (schemeReturn.ProducerList != null)
            {
                foreach (var producer in schemeReturn.ProducerList)
                {
                    foreach (var tonnageReturn in producer.Returns)
                    {
                        await dataReturnVersionBuilder.AddEeeOutputAmount(producer.RegistrationNo,
                              producer.ProducerCompanyName, tonnageReturn.CategoryName.ToDomainWeeeCategory(),
                              tonnageReturn.ObligationType.ToDomainObligationType(), tonnageReturn.TonnesReturnValue);
                    }
                }
            }

            if (schemeReturn.CollectedFromDCF != null)
            {
                foreach (var collectedFromDcf in schemeReturn.CollectedFromDCF)
                {
                    await dataReturnVersionBuilder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.Dcf,
                         collectedFromDcf.CategoryName.ToDomainWeeeCategory(), collectedFromDcf.ObligationType.ToDomainObligationType(), collectedFromDcf.TonnesReturnValue);
                }
            }

            if (schemeReturn.B2CWEEEFromDistributors != null)
            {
                foreach (var weeeFromDistributor in schemeReturn.B2CWEEEFromDistributors)
                {
                    await dataReturnVersionBuilder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.Distributor,
                            weeeFromDistributor.CategoryName.ToDomainWeeeCategory(), weeeFromDistributor.ObligationType.ToDomainObligationType(), weeeFromDistributor.TonnesReturnValue);
                }
            }

            if (schemeReturn.B2CWEEEFromFinalHolders != null)
            {
                foreach (var weeeFromFinalHolders in schemeReturn.B2CWEEEFromFinalHolders)
                {
                    await dataReturnVersionBuilder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.FinalHolder,
                           weeeFromFinalHolders.CategoryName.ToDomainWeeeCategory(), weeeFromFinalHolders.ObligationType.ToDomainObligationType(), weeeFromFinalHolders.TonnesReturnValue);
                }
            }

            if (schemeReturn.DeliveredToAATF != null)
            {
                foreach (var deliveredToAatf in schemeReturn.DeliveredToAATF)
                {
                    foreach (var tonnageReturn in deliveredToAatf.Returns)
                    {
                        await dataReturnVersionBuilder.AddAatfDeliveredAmount(deliveredToAatf.AATFApprovalNo, deliveredToAatf.FacilityName, tonnageReturn.CategoryName.ToDomainWeeeCategory(),
                                     tonnageReturn.ObligationType.ToDomainObligationType(), tonnageReturn.TonnesReturnValue);
                    }
                }
            }

            if (schemeReturn.DeliveredToAE != null)
            {
                foreach (var deliveredToAe in schemeReturn.DeliveredToAE)
                {
                    foreach (var tonnageReturn in deliveredToAe.Returns)
                    {
                        await dataReturnVersionBuilder.AddAeDeliveredAmount(deliveredToAe.AEApprovalNo, deliveredToAe.OperatorName, tonnageReturn.CategoryName.ToDomainWeeeCategory(),
                                         tonnageReturn.ObligationType.ToDomainObligationType(), tonnageReturn.TonnesReturnValue);
                    }
                }
            }

            return await dataReturnVersionBuilder.Build();
        }
        public async Task Build_NoDeliveredToAaTF_DoesNotProcessDeliveredToAaTF()
        {
            var builder = new DataReturnVersionFromXmlBuilderHelper("WEE/AA1111AA/SCH");

            var schemeReturn = new SchemeReturn()
            {
                ApprovalNo = "WEE/AA1111AA/SCH",
                DeliveredToAATF = null
            };

            await builder.Create().Build(schemeReturn);

            A.CallTo(() => builder.DataReturnVersionBuilder.AddAatfDeliveredAmount(A<string>._, A<string>._, A<WeeeCategory>._, A<ObligationType>._, A<decimal>._))
                 .MustNotHaveHappened();
        }
        public async Task HandleAsync_XmlDoesNotContainSchemaError_StoresAvailableDataReturnData()
        {
            using (DatabaseWrapper database = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper helper = new ModelHelper(database.Model);
                DomainHelper domainHelper = new DomainHelper(database.WeeeContext);

                var organisation = helper.CreateOrganisation();
                var scheme = helper.CreateScheme(organisation);
                var dataReturnVersion = helper.CreateDataReturnVersion(scheme, 2016, 3, false);

                database.Model.SaveChanges();

                var builder = new ProcessDataReturnXmlFileHandlerBuilder(database.WeeeContext);

                var schemeReturn = new SchemeReturn()
                {
                    ComplianceYear = "2016",
                    ReturnPeriod = SchemeReturnReturnPeriod.Quarter3JulySeptember
                };

                var xmlGeneratorResult = new GenerateFromDataReturnXmlResult<SchemeReturn>(
                    "Test XML string",
                    schemeReturn,
                    new List<XmlValidationError>());

                A.CallTo(() => builder.XmlGenerator.GenerateDataReturns<SchemeReturn>(A<ProcessDataReturnXmlFile>._))
                     .Returns(xmlGeneratorResult);

                var dbDataReturnVersion = domainHelper.GetDataReturnVersion(dataReturnVersion.Id);
                var dataReturnVersionBuilderResult = new DataReturnVersionBuilderResult(dbDataReturnVersion, A.Dummy<List<ErrorData>>());

                A.CallTo(() => builder.DataReturnVersionFromXmlBuilder.Build(A<SchemeReturn>._))
                    .Returns(dataReturnVersionBuilderResult);

                // Act
                var dataReturnUploadId = await builder.InvokeHandleAsync(organisation.Id, fileName: "XML file name");

                // Assert
                var dataReturnUpload = domainHelper.GetDataReturnUpload(dataReturnUploadId);

                Assert.Equal(scheme.Id, dataReturnUpload.Scheme.Id);
                Assert.Equal("Test XML string", dataReturnUpload.RawData.Data);
                Assert.Equal("XML file name", dataReturnUpload.FileName);
                Assert.Equal(2016, dataReturnUpload.ComplianceYear);
                Assert.Equal(Convert.ToInt32(QuarterType.Q3), dataReturnUpload.Quarter);
                Assert.NotEqual(TimeSpan.Zero, dataReturnUpload.ProcessTime);
            }
        }