public async Task CreateCustomerFile_WithFileID_CreatesFileWithCorrectFileID()
        {
            // Arrange
            var authority = A.Dummy <UKCompetentAuthority>();

            var address = new Address(
                "1 High Street",
                null,
                "Some town",
                "Some county",
                "Post code",
                new Country(Guid.NewGuid(), "UK - England"),
                "01234 567890",
                "*****@*****.**");

            var contact = new Contact("John", "Smith", "Manager");

            var organisation = Organisation.CreateSoleTrader("Test organisation");
            var scheme       = new Scheme(organisation);

            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy <ObligationType>(),
                authority);

            scheme.AddOrUpdateMainContactPerson(contact);
            scheme.AddOrUpdateAddress(address);

            var complianceYear = A.Dummy <int>();

            var memberUpload = new MemberUpload(
                A.Dummy <Guid>(),
                A.Dummy <string>(),
                A.Dummy <List <MemberUploadError> >(),
                A.Dummy <decimal>(),
                complianceYear,
                scheme,
                A.Dummy <string>());

            memberUpload.Submit(A.Dummy <User>());

            var memberUploads = new List <MemberUpload> {
                memberUpload
            };

            var invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            var   generator = new BySchemeCustomerFileGenerator();
            ulong id        = 12345;

            // Act
            var result = await generator.CreateAsync(id, invoiceRun);

            var customerFile = result.IbisFile;

            // Assert
            Assert.Equal((ulong)12345, customerFile.FileID);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Assigns the member upload to the specified invoice run.
        /// </summary>
        /// <param name="invoiceRun"></param>
        internal void AssignToInvoiceRun(InvoiceRun invoiceRun)
        {
            Guard.ArgumentNotNull(() => invoiceRun, invoiceRun);

            if (InvoiceRun != null)
            {
                string errorMessage = "Once a member upload has been assigned to an invoice run, it cannot be reassigned.";
                throw new InvalidOperationException(errorMessage);
            }

            if (!IsSubmitted)
            {
                string errorMessage = "An unsubmitted member upload cannot be assigned to an invoice run.";
                throw new InvalidOperationException(errorMessage);
            }

            InvoiceRun = invoiceRun;

            foreach (var producer in ProducerSubmissions)
            {
                if (!producer.RegisteredProducer.Removed)
                {
                    producer.SetAsInvoiced();
                }
            }
        }
Ejemplo n.º 3
0
        public async Task FetchInvoiceRunsAsync_Always_ReturnsResultsOrderedByIssuedDateDescending()
        {
            using (DatabaseWrapper wrapper = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper helper = new ModelHelper(wrapper.Model);
                AspNetUser  user   = helper.GetOrCreateUser("TestUser");

                Weee.Tests.Core.Model.Country country = new Weee.Tests.Core.Model.Country();
                country.Id   = new Guid("FA20ED45-5488-491D-A117-DFC09C9C1BA2");
                country.Name = "Test Country";

                CompetentAuthority databaseAuthority = new CompetentAuthority();
                databaseAuthority.Id                 = new Guid("DDE398F6-809E-416D-B70D-B36606F221FC");
                databaseAuthority.Name               = "Test Authority 1";
                databaseAuthority.Abbreviation       = "T1";
                databaseAuthority.Country            = country;
                databaseAuthority.Email              = "TestEmailAddress";
                databaseAuthority.AnnualChargeAmount = 0;
                wrapper.Model.CompetentAuthorities.Add(databaseAuthority);

                InvoiceRun invoiceRun1 = new InvoiceRun();
                invoiceRun1.Id = new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872");
                invoiceRun1.CompetentAuthority = databaseAuthority;
                invoiceRun1.IssuedByUserId     = user.Id;
                invoiceRun1.IssuedDate         = new DateTime(2015, 1, 2);
                wrapper.Model.InvoiceRuns.Add(invoiceRun1);

                InvoiceRun invoiceRun2 = new InvoiceRun();
                invoiceRun2.Id = new Guid("728CDF55-1C3C-4BE0-80CB-0BC82CC9DFA3");
                invoiceRun2.CompetentAuthority = databaseAuthority;
                invoiceRun2.IssuedByUserId     = user.Id;
                invoiceRun2.IssuedDate         = new DateTime(2015, 1, 1);
                wrapper.Model.InvoiceRuns.Add(invoiceRun2);

                InvoiceRun invoiceRun3 = new InvoiceRun();
                invoiceRun3.Id = new Guid("B235CD4F-8188-4BC0-ADA2-55FD6B34BC01");
                invoiceRun3.CompetentAuthority = databaseAuthority;
                invoiceRun3.IssuedByUserId     = user.Id;
                invoiceRun3.IssuedDate         = new DateTime(2015, 1, 3);
                wrapper.Model.InvoiceRuns.Add(invoiceRun3);

                wrapper.Model.SaveChanges();

                UKCompetentAuthority domainAuthority = wrapper.WeeeContext.UKCompetentAuthorities.Find(databaseAuthority.Id);

                FetchInvoiceRunsDataAccess dataAccess = new FetchInvoiceRunsDataAccess(wrapper.WeeeContext);

                // Act
                IReadOnlyList <Domain.Charges.InvoiceRun> results = await dataAccess.FetchInvoiceRunsAsync(domainAuthority);

                // Assert
                Assert.NotNull(results);
                Assert.Equal(3, results.Count);
                Assert.Collection(results,
                                  r1 => Assert.Equal(new DateTime(2015, 1, 3), r1.IssuedDate),
                                  r2 => Assert.Equal(new DateTime(2015, 1, 2), r2.IssuedDate),
                                  r3 => Assert.Equal(new DateTime(2015, 1, 1), r3.IssuedDate));
            }
        }
        public async Task<IbisFileGeneratorResult<TransactionFile>> CreateAsync(ulong fileID, InvoiceRun invoiceRun)
        {
            TransactionFile transactionFile = new TransactionFile("WEE", fileID);

            var errors = new List<Exception>();
            var groups = invoiceRun.MemberUploads.GroupBy(mu => mu.Scheme);

            foreach (var group in groups)
            {
                List<InvoiceLineItem> lineItems = new List<InvoiceLineItem>();
                var lineItemErrors = new List<Exception>();

                foreach (MemberUpload memberUpload in group)
                {
                    DateTime submittedDate = memberUpload.SubmittedDate.Value;

                    string description = string.Format("Charge for producer registration submission made on {0:dd MMM yyyy}.",
                        submittedDate);

                    try
                    {
                        InvoiceLineItem lineItem = new InvoiceLineItem(
                            memberUpload.TotalCharges,
                            description);

                        lineItems.Add(lineItem);
                    }
                    catch (Exception ex)
                    {
                        lineItemErrors.Add(new SchemeFieldException(group.Key, ex));
                    }
                }

                errors.AddRange(lineItemErrors);

                string transactionReference = await transactionReferenceGenerator.GetNextTransactionReferenceAsync();

                if (lineItemErrors.Count == 0)
                {
                    try
                    {
                        Invoice invoice = new Invoice(
                            group.Key.IbisCustomerReference,
                            invoiceRun.IssuedDate,
                            TransactionType.Invoice,
                            transactionReference,
                            lineItems);

                        transactionFile.AddInvoice(invoice);
                    }
                    catch (Exception ex)
                    {
                        errors.Add(new SchemeFieldException(group.Key, ex));
                    }
                }
            }

            return new IbisFileGeneratorResult<TransactionFile>(errors.Count == 0 ? transactionFile : null, errors);
        }
Ejemplo n.º 5
0
        public async Task FetchInvoiceRunsAsync_WithSpecifiedAuthority_OnlyReturnsInvoiceRunsForTheSpecifiedAuthority()
        {
            using (DatabaseWrapper wrapper = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper helper = new ModelHelper(wrapper.Model);
                AspNetUser  user   = helper.GetOrCreateUser("TestUser");

                Weee.Tests.Core.Model.Country country = new Weee.Tests.Core.Model.Country();
                country.Id   = new Guid("FA20ED45-5488-491D-A117-DFC09C9C1BA2");
                country.Name = "Test Country";

                CompetentAuthority databaseAuthority1 = new CompetentAuthority();
                databaseAuthority1.Id                 = new Guid("DDE398F6-809E-416D-B70D-B36606F221FC");
                databaseAuthority1.Name               = "Test Authority 1";
                databaseAuthority1.Abbreviation       = "T1";
                databaseAuthority1.Country            = country;
                databaseAuthority1.Email              = "TestEmailAddress";
                databaseAuthority1.AnnualChargeAmount = 0;
                wrapper.Model.CompetentAuthorities.Add(databaseAuthority1);

                CompetentAuthority databaseAuthority2 = new CompetentAuthority();
                databaseAuthority2.Id                 = new Guid("FBCEDC2F-0825-4066-B24E-86D3A2FD892B");
                databaseAuthority2.Name               = "Test Authority 2";
                databaseAuthority2.Abbreviation       = "T2";
                databaseAuthority2.Country            = country;
                databaseAuthority2.Email              = "TestEmailAddress2";
                databaseAuthority2.AnnualChargeAmount = 0;
                wrapper.Model.CompetentAuthorities.Add(databaseAuthority2);

                InvoiceRun invoiceRunForAuthority1 = new InvoiceRun();
                invoiceRunForAuthority1.Id = new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872");
                invoiceRunForAuthority1.CompetentAuthority = databaseAuthority1;
                invoiceRunForAuthority1.IssuedByUserId     = user.Id;
                invoiceRunForAuthority1.IssuedDate         = new DateTime(2015, 1, 1);
                wrapper.Model.InvoiceRuns.Add(invoiceRunForAuthority1);

                InvoiceRun invoiceRunForAuthority2 = new InvoiceRun();
                invoiceRunForAuthority2.Id = new Guid("728CDF55-1C3C-4BE0-80CB-0BC82CC9DFA3");
                invoiceRunForAuthority2.CompetentAuthority = databaseAuthority2;
                invoiceRunForAuthority2.IssuedByUserId     = user.Id;
                invoiceRunForAuthority2.IssuedDate         = new DateTime(2015, 1, 1);
                wrapper.Model.InvoiceRuns.Add(invoiceRunForAuthority2);

                wrapper.Model.SaveChanges();

                UKCompetentAuthority domainAuthority1 = wrapper.WeeeContext.UKCompetentAuthorities.Find(databaseAuthority1.Id);

                FetchInvoiceRunsDataAccess dataAccess = new FetchInvoiceRunsDataAccess(wrapper.WeeeContext);

                // Act
                IReadOnlyList <Domain.Charges.InvoiceRun> results = await dataAccess.FetchInvoiceRunsAsync(domainAuthority1);

                // Assert
                Assert.NotNull(results);
                Assert.Equal(1, results.Count);
                Assert.Equal(new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872"), results[0].Id);
            }
        }
        public async Task FetchInvoiceRunsAsync_WithSpecifiedAuthority_OnlyReturnsInvoiceRunsForTheSpecifiedAuthority()
        {
            using (DatabaseWrapper wrapper = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper helper = new ModelHelper(wrapper.Model);
                AspNetUser user = helper.GetOrCreateUser("TestUser");

                Weee.Tests.Core.Model.Country country = new Weee.Tests.Core.Model.Country();
                country.Id = new Guid("FA20ED45-5488-491D-A117-DFC09C9C1BA2");
                country.Name = "Test Country";

                CompetentAuthority databaseAuthority1 = new CompetentAuthority();
                databaseAuthority1.Id = new Guid("DDE398F6-809E-416D-B70D-B36606F221FC");
                databaseAuthority1.Name = "Test Authority 1";
                databaseAuthority1.Abbreviation = "T1";
                databaseAuthority1.Country = country;
                databaseAuthority1.Email = "TestEmailAddress";
                wrapper.Model.CompetentAuthorities.Add(databaseAuthority1);

                CompetentAuthority databaseAuthority2 = new CompetentAuthority();
                databaseAuthority2.Id = new Guid("FBCEDC2F-0825-4066-B24E-86D3A2FD892B");
                databaseAuthority2.Name = "Test Authority 2";
                databaseAuthority2.Abbreviation = "T2";
                databaseAuthority2.Country = country;
                databaseAuthority2.Email = "TestEmailAddress2";
                wrapper.Model.CompetentAuthorities.Add(databaseAuthority2);

                InvoiceRun invoiceRunForAuthority1 = new InvoiceRun();
                invoiceRunForAuthority1.Id = new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872");
                invoiceRunForAuthority1.CompetentAuthority = databaseAuthority1;
                invoiceRunForAuthority1.IssuedByUserId = user.Id;
                invoiceRunForAuthority1.IssuedDate = new DateTime(2015, 1, 1);
                wrapper.Model.InvoiceRuns.Add(invoiceRunForAuthority1);

                InvoiceRun invoiceRunForAuthority2 = new InvoiceRun();
                invoiceRunForAuthority2.Id = new Guid("728CDF55-1C3C-4BE0-80CB-0BC82CC9DFA3");
                invoiceRunForAuthority2.CompetentAuthority = databaseAuthority2;
                invoiceRunForAuthority2.IssuedByUserId = user.Id;
                invoiceRunForAuthority2.IssuedDate = new DateTime(2015, 1, 1);
                wrapper.Model.InvoiceRuns.Add(invoiceRunForAuthority2);

                wrapper.Model.SaveChanges();

                UKCompetentAuthority domainAuthority1 = wrapper.WeeeContext.UKCompetentAuthorities.Find(databaseAuthority1.Id);

                FetchInvoiceRunsDataAccess dataAccess = new FetchInvoiceRunsDataAccess(wrapper.WeeeContext);

                // Act
                IReadOnlyList<Domain.Charges.InvoiceRun> results = await dataAccess.FetchInvoiceRunsAsync(domainAuthority1);

                // Assert
                Assert.NotNull(results);
                Assert.Equal(1, results.Count);
                Assert.Equal(new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872"), results[0].Id);
            }
        }
        public async Task CreateCustomerFile_WithFileID_CreatesFileWithCorrectFileID()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Address address = new Address(
                "1 High Street",
                null,
                "Some town",
                "Some county",
                "Post code",
                new Country(Guid.NewGuid(), "UK - England"),
                "01234 567890",
                "*****@*****.**");

            Contact contact = new Contact("John", "Smith", "Manager");

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");
            organisation.AddOrUpdateAddress(AddressType.OrganisationAddress, address);
            organisation.AddOrUpdateMainContactPerson(contact);

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                A.Dummy<decimal>(),
                complianceYear,
                scheme,
                A.Dummy<string>());

            memberUpload.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            BySchemeCustomerFileGenerator generator = new BySchemeCustomerFileGenerator();
            ulong id = 12345;

            // Act
            var result = await generator.CreateAsync(id, invoiceRun);
            CustomerFile customerFile = result.IbisFile;

            // Assert
            Assert.Equal((ulong)12345, customerFile.FileID);
        }
Ejemplo n.º 8
0
        public async Task HandleAysnc_HappyPath_ReturnsFileInfoWithCorrectFileName()
        {
            // Arrange
            IWeeeAuthorization authorization = AuthorizationBuilder.CreateUserWithAllRights();

            UKCompetentAuthority authority = new UKCompetentAuthority(
                A.Dummy <Guid>(),
                "Environment Agency",
                "EA",
                A.Dummy <Country>(),
                "*****@*****.**",
                0);

            Scheme scheme = A.Dummy <Scheme>();

            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy <Guid>(),
                scheme,
                A.Dummy <string>(),
                A.Dummy <string>());

            memberUpload.Submit(A.Dummy <User>());

            List <MemberUpload> memberUploads = new List <MemberUpload>();

            memberUploads.Add(memberUpload);

            SystemTime.Freeze(new DateTime(2015, 12, 31));
            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            SystemTime.Unfreeze();

            ulong fileID = 123;

            IbisFileData ibisFileData = new IbisFileData(fileID, "Customer File.dat", "data", "Transaction File.dat", "data");

            invoiceRun.SetIbisFileData(ibisFileData);

            ICommonDataAccess dataAccess = A.Fake <ICommonDataAccess>();

            A.CallTo(() => dataAccess.FetchInvoiceRunAsync(A <Guid> ._)).Returns(invoiceRun);

            FetchInvoiceRunIbisZipFileHandler handler = new FetchInvoiceRunIbisZipFileHandler(
                authorization,
                dataAccess);

            // Act
            FileInfo fileInfo = await handler.HandleAsync(A.Dummy <Requests.Charges.FetchInvoiceRunIbisZipFile>());

            // Assert
            Assert.NotNull(fileInfo);
            Assert.Equal("WEEE invoice files 00123 2015-12-31.zip", fileInfo.FileName);
        }
        public async Task FetchInvoicedProducerSubmissionsAsync_ReturnsProducerSubmissionsForRemovedProducer_WhenProducerHasBeenInvoiced()
        {
            using (DatabaseWrapper database = new DatabaseWrapper())
            {
                var helper       = new ModelHelper(database.Model);
                var domainHelper = new DomainHelper(database.WeeeContext);

                // At least one user is required in the database.
                var user = helper.GetOrCreateUser("A user");

                Weee.Tests.Core.Model.Country country = new Weee.Tests.Core.Model.Country();
                country.Id   = new Guid("FA20ED45-5488-491D-A117-DFC09C9C1BA2");
                country.Name = "Test Country";

                CompetentAuthority competentAuthority = new CompetentAuthority();
                competentAuthority.Id                 = new Guid("DDE398F6-809E-416D-B70D-B36606F221FC");
                competentAuthority.Name               = "Test Authority 1";
                competentAuthority.Abbreviation       = "T1";
                competentAuthority.Country            = country;
                competentAuthority.Email              = "TestEmailAddress";
                competentAuthority.AnnualChargeAmount = 0;
                database.Model.CompetentAuthorities.Add(competentAuthority);

                InvoiceRun invoiceRunForAuthority = new InvoiceRun();
                invoiceRunForAuthority.Id = new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872");
                invoiceRunForAuthority.CompetentAuthority = competentAuthority;
                invoiceRunForAuthority.IssuedByUserId     = user.Id;
                invoiceRunForAuthority.IssuedDate         = new DateTime(2000, 12, 1);
                database.Model.InvoiceRuns.Add(invoiceRunForAuthority);

                var    scheme             = helper.CreateScheme();
                string registrationNumber = "AAAA";

                scheme.CompetentAuthorityId = competentAuthority.Id;
                var memberUpload = helper.CreateSubmittedMemberUpload(scheme, invoiceRunForAuthority);
                memberUpload.ComplianceYear = 2000;

                var producerSubmission = helper.CreateInvoicedProducer(memberUpload, registrationNumber);
                producerSubmission.RegisteredProducer.Removed = true;

                database.Model.SaveChanges();

                UKCompetentAuthority            domainAuthority = domainHelper.GetCompetentAuthority(competentAuthority.Id);
                FetchIssuedChargesCsvDataAccess dataAccess      = new FetchIssuedChargesCsvDataAccess(database.WeeeContext);

                // Act
                var results = await dataAccess.FetchInvoicedProducerSubmissionsAsync(domainAuthority, 2000, scheme.Id);

                // Assert
                Assert.Equal(1, results.Count());

                var producerResult = results.Single();
                Assert.Equal(producerSubmission.Id, producerResult.Id);
            }
        }
        public async Task CreateTransactionFile_ProducerSubmissionMarkedAsNotInvoiced_NotIncludedInTransactionFile()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy <UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);

            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy <ObligationType>(),
                authority);

            int complianceYear = A.Dummy <int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy <Guid>(),
                A.Dummy <string>(),
                A.Dummy <List <MemberUploadError> >(),
                A.Dummy <decimal>(),
                complianceYear,
                scheme,
                A.Dummy <string>());

            var producerSubmission = A.Fake <ProducerSubmission>();

            A.CallTo(() => producerSubmission.ChargeThisUpdate)
            .Returns(123.45m);
            A.CallTo(() => producerSubmission.Invoiced)
            .Returns(false);

            memberUpload.ProducerSubmissions.Add(producerSubmission);
            memberUpload.Submit(A.Dummy <User>());

            List <MemberUpload> memberUploads = new List <MemberUpload>();

            memberUploads.Add(memberUpload);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            ByChargeValueTransactionFileGenerator generator = new ByChargeValueTransactionFileGenerator(
                A.Dummy <ITransactionReferenceGenerator>());

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);

            TransactionFile transactionFile = result.IbisFile;

            // Assert
            Assert.NotNull(transactionFile);
            Assert.Equal(0, transactionFile.Invoices.Count);
        }
        public async Task FetchInvoicedProducerSubmissionsAsync_WithSpecifiedAuthorityYearAndSchemeName_OnlyReturnsProducerSubmissions()
        {
            using (DatabaseWrapper database = new DatabaseWrapper())
            {
                var helper = new ModelHelper(database.Model);
                // At least one user is required in the database.
                var user = helper.GetOrCreateUser("A user");

                Weee.Tests.Core.Model.Country country = new Weee.Tests.Core.Model.Country();
                country.Id   = new Guid("FA20ED45-5488-491D-A117-DFC09C9C1BA2");
                country.Name = "Test Country";

                CompetentAuthority databaseAuthority1 = new CompetentAuthority();
                databaseAuthority1.Id                 = new Guid("DDE398F6-809E-416D-B70D-B36606F221FC");
                databaseAuthority1.Name               = "Test Authority 1";
                databaseAuthority1.Abbreviation       = "T1";
                databaseAuthority1.Country            = country;
                databaseAuthority1.Email              = "TestEmailAddress";
                databaseAuthority1.AnnualChargeAmount = 0;
                database.Model.CompetentAuthorities.Add(databaseAuthority1);

                InvoiceRun invoiceRunForAuthority1 = new InvoiceRun();
                invoiceRunForAuthority1.Id = new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872");
                invoiceRunForAuthority1.CompetentAuthority = databaseAuthority1;
                invoiceRunForAuthority1.IssuedByUserId     = user.Id;
                invoiceRunForAuthority1.IssuedDate         = new DateTime(2016, 12, 1);
                database.Model.InvoiceRuns.Add(invoiceRunForAuthority1);

                var    scheme             = helper.CreateScheme();
                string registrationNumber = "AAAA";

                scheme.CompetentAuthorityId = databaseAuthority1.Id;
                var memberUpload = helper.CreateSubmittedMemberUpload(scheme, invoiceRunForAuthority1);

                var producerSubmission = helper.CreateInvoicedProducer(memberUpload, registrationNumber);

                database.Model.SaveChanges();
                UKCompetentAuthority            domainAuthority1 = database.WeeeContext.UKCompetentAuthorities.Find(databaseAuthority1.Id);
                FetchIssuedChargesCsvDataAccess dataAccess       = new FetchIssuedChargesCsvDataAccess(database.WeeeContext);

                // Act
                IEnumerable <Domain.Producer.ProducerSubmission> results = await dataAccess.FetchInvoicedProducerSubmissionsAsync(domainAuthority1, 2016, scheme.Id);

                List <Domain.Producer.ProducerSubmission> producerSubmissionList = results.ToList();

                Domain.Producer.ProducerSubmission producer = results.FirstOrDefault(p => p.RegisteredProducer.ProducerRegistrationNumber == registrationNumber);
                // Assert
                Assert.NotNull(producer);
                Assert.Equal(producerSubmission.RegisteredProducer.ProducerRegistrationNumber, producer.RegisteredProducer.ProducerRegistrationNumber);
                Assert.Equal(1, producerSubmissionList.Count);
            }
        }
        public async Task CreateTransactionFile_WithFileID_CreatesFileWithCorrectFileID()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy <UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);

            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy <ObligationType>(),
                authority);

            int complianceYear = A.Dummy <int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy <Guid>(),
                A.Dummy <string>(),
                A.Dummy <List <MemberUploadError> >(),
                123.45m,
                complianceYear,
                scheme,
                A.Dummy <string>());

            memberUpload.Submit(A.Dummy <User>());

            List <MemberUpload> memberUploads = new List <MemberUpload>();

            memberUploads.Add(memberUpload);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            ITransactionReferenceGenerator transactionReferenceGenerator = A.Fake <ITransactionReferenceGenerator>();

            A.CallTo(() => transactionReferenceGenerator.GetNextTransactionReferenceAsync()).Returns("WEE800001H");

            ByChargeValueTransactionFileGenerator generator = new ByChargeValueTransactionFileGenerator(transactionReferenceGenerator);

            ulong id = 12345;

            // Act
            var result = await generator.CreateAsync(id, invoiceRun);

            TransactionFile transactionFile = result.IbisFile;

            // Assert
            Assert.Equal((ulong)12345, transactionFile.FileID);
        }
        public async Task CreateTransactionFile_WithExceptionThrown_ReturnsError_AndNoTransactionFile()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy <UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);

            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy <ObligationType>(),
                authority);

            int complianceYear = A.Dummy <int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy <Guid>(),
                A.Dummy <string>(),
                A.Dummy <List <MemberUploadError> >(),
                123.45m,
                complianceYear,
                scheme,
                A.Dummy <string>(),
                A.Dummy <string>(),
                false);

            memberUpload.Submit(A.Dummy <User>());

            List <MemberUpload> memberUploads = new List <MemberUpload>();

            memberUploads.Add(memberUpload);

            ITransactionReferenceGenerator transactionReferenceGenerator = A.Fake <ITransactionReferenceGenerator>();

            A.CallTo(() => transactionReferenceGenerator.GetNextTransactionReferenceAsync()).Returns((string)null); // A null value will cause the Ibis object to throw an exception.

            BySubmissionTransactionFileGenerator generator = new BySubmissionTransactionFileGenerator(transactionReferenceGenerator);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);

            // Assert
            Assert.Null(result.IbisFile);
            Assert.NotEmpty(result.Errors);
        }
        public async Task CreateTransactionFile_WithFileID_CreatesFileWithCorrectFileID()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                123.45m,
                complianceYear,
                scheme,
                A.Dummy<string>());

            memberUpload.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            ITransactionReferenceGenerator transactionReferenceGenerator = A.Fake<ITransactionReferenceGenerator>();
            A.CallTo(() => transactionReferenceGenerator.GetNextTransactionReferenceAsync()).Returns("WEE800001H");

            BySchemeTransactionFileGenerator generator = new BySchemeTransactionFileGenerator(
                transactionReferenceGenerator);

            ulong id = 12345;

            // Act
            var result = await generator.CreateAsync(id, invoiceRun);
            TransactionFile transactionFile = result.IbisFile;

            // Assert
            Assert.Equal((ulong)12345, transactionFile.FileID);
        }
Ejemplo n.º 15
0
        public async Task FetchnvoicedMemberUploadsAsync_WithSpecifiedAuthority_OOnlyReturnsInvoicedMemberUploadsForTheSpecifiedAuthority()
        {
            using (DatabaseWrapper wrapper = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper helper = new ModelHelper(wrapper.Model);
                AspNetUser  user   = helper.GetOrCreateUser("TestUser");

                Weee.Tests.Core.Model.Country country = new Weee.Tests.Core.Model.Country();
                country.Id   = new Guid("FA20ED45-5488-491D-A117-DFC09C9C1BA2");
                country.Name = "Test Country";

                CompetentAuthority databaseAuthority1 = new CompetentAuthority();
                databaseAuthority1.Id                 = new Guid("DDE398F6-809E-416D-B70D-B36606F221FC");
                databaseAuthority1.Name               = "Test Authority 1";
                databaseAuthority1.Abbreviation       = "T1";
                databaseAuthority1.Country            = country;
                databaseAuthority1.Email              = "TestEmailAddress";
                databaseAuthority1.AnnualChargeAmount = 0;
                wrapper.Model.CompetentAuthorities.Add(databaseAuthority1);

                InvoiceRun invoiceRunForAuthority1 = new InvoiceRun();
                invoiceRunForAuthority1.Id = new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872");
                invoiceRunForAuthority1.CompetentAuthority = databaseAuthority1;
                invoiceRunForAuthority1.IssuedByUserId     = user.Id;
                invoiceRunForAuthority1.IssuedDate         = new DateTime(2015, 1, 1);
                wrapper.Model.InvoiceRuns.Add(invoiceRunForAuthority1);

                var scheme = helper.CreateScheme();
                scheme.CompetentAuthorityId = databaseAuthority1.Id;
                var memberUpload = helper.CreateSubmittedMemberUpload(scheme, invoiceRunForAuthority1);

                wrapper.Model.SaveChanges();

                UKCompetentAuthority domainAuthority1 = wrapper.WeeeContext.UKCompetentAuthorities.Find(databaseAuthority1.Id);

                CommonDataAccess dataAccess = new CommonDataAccess(wrapper.WeeeContext);

                // Act
                IReadOnlyList <Domain.Scheme.MemberUpload> results = await dataAccess.FetchInvoicedMemberUploadsAsync(domainAuthority1);

                // Assert
                Assert.NotNull(results);
                Assert.Equal(1, results.Count);
                Assert.Equal(memberUpload.Id, results[0].Id);
            }
        }
        public async Task FetchnvoicedMemberUploadsAsync_WithSpecifiedAuthority_OOnlyReturnsInvoicedMemberUploadsForTheSpecifiedAuthority()
        {
            using (DatabaseWrapper wrapper = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper helper = new ModelHelper(wrapper.Model);
                AspNetUser user = helper.GetOrCreateUser("TestUser");

                Weee.Tests.Core.Model.Country country = new Weee.Tests.Core.Model.Country();
                country.Id = new Guid("FA20ED45-5488-491D-A117-DFC09C9C1BA2");
                country.Name = "Test Country";

                CompetentAuthority databaseAuthority1 = new CompetentAuthority();
                databaseAuthority1.Id = new Guid("DDE398F6-809E-416D-B70D-B36606F221FC");
                databaseAuthority1.Name = "Test Authority 1";
                databaseAuthority1.Abbreviation = "T1";
                databaseAuthority1.Country = country;
                databaseAuthority1.Email = "TestEmailAddress";
                wrapper.Model.CompetentAuthorities.Add(databaseAuthority1);

                InvoiceRun invoiceRunForAuthority1 = new InvoiceRun();
                invoiceRunForAuthority1.Id = new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872");
                invoiceRunForAuthority1.CompetentAuthority = databaseAuthority1;
                invoiceRunForAuthority1.IssuedByUserId = user.Id;
                invoiceRunForAuthority1.IssuedDate = new DateTime(2015, 1, 1);
                wrapper.Model.InvoiceRuns.Add(invoiceRunForAuthority1);

                var scheme = helper.CreateScheme();
                scheme.CompetentAuthorityId = databaseAuthority1.Id;
                var memberUpload = helper.CreateSubmittedMemberUpload(scheme, invoiceRunForAuthority1);

                wrapper.Model.SaveChanges();

                UKCompetentAuthority domainAuthority1 = wrapper.WeeeContext.UKCompetentAuthorities.Find(databaseAuthority1.Id);

                CommonDataAccess dataAccess = new CommonDataAccess(wrapper.WeeeContext);

                // Act
                IReadOnlyList<Domain.Scheme.MemberUpload> results = await dataAccess.FetchInvoicedMemberUploadsAsync(domainAuthority1);

                // Assert
                Assert.NotNull(results);
                Assert.Equal(1, results.Count);
                Assert.Equal(memberUpload.Id, results[0].Id);
            }
        }
Ejemplo n.º 17
0
        /// <summary>
        /// Returns th invoice run with the specified ID.
        /// The 1B1S file data domain object will be pre-loaded where it is available.
        /// </summary>
        /// <param name="invoiceRunId"></param>
        /// <returns></returns>
        public async Task <InvoiceRun> FetchInvoiceRunAsync(Guid invoiceRunId)
        {
            InvoiceRun invoiceRun = await Context.InvoiceRuns
                                    .Include(ir => ir.IbisFileData)
                                    .SingleOrDefaultAsync(ir => ir.Id == invoiceRunId);

            if (invoiceRun == null)
            {
                string errorMessage = string.Format(
                    "No invoice run with ID \"{0}\" was found in the database",
                    invoiceRunId);

                throw new Exception(errorMessage);
            }

            return(invoiceRun);
        }
        public async Task CreateCustomerFile_WithExceptionThrown_ReturnsError_AndNoCustomerFile()
        {
            // Arrange
            var authority = A.Dummy <UKCompetentAuthority>();

            var organisation = Organisation.CreateSoleTrader("Test organisation");

            var scheme = new Scheme(organisation);

            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy <ObligationType>(),
                authority);

            var complianceYear = A.Dummy <int>();

            var memberUpload = new MemberUpload(
                A.Dummy <Guid>(),
                A.Dummy <string>(),
                A.Dummy <List <MemberUploadError> >(),
                A.Dummy <decimal>(),
                complianceYear,
                scheme,
                A.Dummy <string>(),
                A.Dummy <string>(),
                false);

            memberUpload.Submit(A.Dummy <User>());

            var memberUploads = new List <MemberUpload> {
                memberUpload
            };

            var invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            var generator = new BySchemeCustomerFileGenerator();

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);

            // Assert
            Assert.Null(result.IbisFile);
            Assert.NotEmpty(result.Errors);
        }
Ejemplo n.º 19
0
        public async Task FetchInvoiceRunsAsync_Always_EagerLoadsIssuedByUser()
        {
            using (DatabaseWrapper wrapper = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper helper = new ModelHelper(wrapper.Model);
                AspNetUser  user   = helper.GetOrCreateUser("TestUser");

                Weee.Tests.Core.Model.Country country = new Weee.Tests.Core.Model.Country();
                country.Id   = new Guid("FA20ED45-5488-491D-A117-DFC09C9C1BA2");
                country.Name = "Test Country";

                CompetentAuthority databaseAuthority = new CompetentAuthority();
                databaseAuthority.Id                 = new Guid("DDE398F6-809E-416D-B70D-B36606F221FC");
                databaseAuthority.Name               = "Test Authority 1";
                databaseAuthority.Abbreviation       = "T1";
                databaseAuthority.Country            = country;
                databaseAuthority.Email              = "TestEmailAddress";
                databaseAuthority.AnnualChargeAmount = 0;
                wrapper.Model.CompetentAuthorities.Add(databaseAuthority);

                InvoiceRun invoiceRun = new InvoiceRun();
                invoiceRun.Id = new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872");
                invoiceRun.CompetentAuthority = databaseAuthority;
                invoiceRun.IssuedByUserId     = user.Id;
                invoiceRun.IssuedDate         = new DateTime(2015, 1, 2);
                wrapper.Model.InvoiceRuns.Add(invoiceRun);

                wrapper.Model.SaveChanges();

                UKCompetentAuthority domainAuthority = wrapper.WeeeContext.UKCompetentAuthorities.Find(databaseAuthority.Id);

                FetchInvoiceRunsDataAccess dataAccess = new FetchInvoiceRunsDataAccess(wrapper.WeeeContext);

                // Act
                IReadOnlyList <Domain.Charges.InvoiceRun> results = await dataAccess.FetchInvoiceRunsAsync(domainAuthority);

                // Assert
                Assert.NotNull(results);
                Assert.Equal(1, results.Count);
                Assert.NotNull(results[0].IssuedByUser);
            }
        }
        public Task<IbisFileGeneratorResult<CustomerFile>> CreateAsync(ulong fileID, InvoiceRun invoiceRun)
        {
            CustomerFile customerFile = new CustomerFile("WEE", fileID);

            var errors = new List<Exception>();

            IEnumerable<Scheme> schemes = invoiceRun.MemberUploads
                .Select(mu => mu.Scheme)
                .Distinct();

            foreach (Scheme scheme in schemes)
            {
                try
                {
                    var postCode = GetIbisPostCode(scheme.Organisation.OrganisationAddress);

                    Address address = new Address(
                        scheme.Organisation.Contact.FullName,
                        scheme.Organisation.OrganisationAddress.Address1,
                        scheme.Organisation.OrganisationAddress.Address2,
                        null,
                        scheme.Organisation.OrganisationAddress.TownOrCity,
                        scheme.Organisation.OrganisationAddress.CountyOrRegion,
                        postCode);

                    Customer customer = new Customer(
                            scheme.IbisCustomerReference,
                            scheme.Organisation.OrganisationName,
                            address);

                    customerFile.AddCustomer(customer);
                }
                catch (Exception ex)
                {
                    errors.Add(new SchemeFieldException(scheme, ex));
                }
            }

            var ibisFileGeneratorResult = new IbisFileGeneratorResult<CustomerFile>(errors.Count == 0 ? customerFile : null, errors);
            return Task.FromResult(ibisFileGeneratorResult);
        }
Ejemplo n.º 21
0
        public void Constructor_Always_AssignsMemberUploadsToInvoiceRun()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy <UKCompetentAuthority>();

            Scheme scheme = A.Fake <Scheme>();

            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            List <MemberUpload> memberUploads = new List <MemberUpload>();
            MemberUpload        memberUpload1 = new MemberUpload(new Guid("A2A01A99-A97D-4219-9060-D7CDF7435114"), scheme, "data", "filename");

            memberUpload1.Submit(A.Dummy <User>());
            memberUploads.Add(memberUpload1);

            // Act
            InvoiceRun result = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            // Assert
            Assert.Equal(result, memberUpload1.InvoiceRun);
        }
Ejemplo n.º 22
0
        public void Constructor_WithMemberUploadAlreadyAssignedToInvoiceRun_ThrowsInvalidOperationException()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Scheme scheme = A.Fake<Scheme>();
            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            MemberUpload memberUpload1 = new MemberUpload(new Guid("A2A01A99-A97D-4219-9060-D7CDF7435114"), scheme, "data", "filename");
            memberUpload1.Submit(A.Dummy<User>());
            memberUploads.Add(memberUpload1);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            // Act
            Func<InvoiceRun> testCode = () => new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            // Assert
            Assert.Throws<InvalidOperationException>(testCode);
        }
Ejemplo n.º 23
0
        public async Task <IssuePendingChargesResult> HandleAsync(Requests.Charges.IssuePendingCharges message)
        {
            authorization.EnsureCanAccessInternalArea(true);
            authorization.EnsureUserInRole(Roles.InternalAdmin);

            UKCompetentAuthority authority = await dataAccess.FetchCompetentAuthority(message.Authority);

            IReadOnlyList <MemberUpload> memberUploads = await dataAccess.FetchSubmittedNonInvoicedMemberUploadsAsync(authority);

            User issuingUser = await domainUserContext.GetCurrentUserAsync();

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, issuingUser);

            var result = new IssuePendingChargesResult();

            result.Errors = new List <string>();

            if (authority.Name == "Environment Agency")
            {
                ulong fileId = await GetNextIbisFileId();

                IbisFileDataGeneratorResult ibisFileDataGeneratorResult = await ibisFileDataGenerator.CreateFileDataAsync(fileId, invoiceRun);

                result.Errors.AddRange(ibisFileDataGeneratorResult.Errors);
                if (result.Errors.Count == 0)
                {
                    IbisFileData ibisFileData = ibisFileDataGeneratorResult.IbisFileData;
                    invoiceRun.SetIbisFileData(ibisFileData);
                }
            }

            if (result.Errors.Count == 0)
            {
                await dataAccess.SaveAsync(invoiceRun);

                result.InvoiceRunId = invoiceRun.Id;
            }

            return(result);
        }
Ejemplo n.º 24
0
        public async Task HandleAsync_WithInvoiceRunWithout1B1SFileData_ThrowsInvalidOperationException()
        {
            // Arrange
            IWeeeAuthorization authorization = AuthorizationBuilder.CreateUserWithAllRights();

            UKCompetentAuthority authority = A.Dummy <UKCompetentAuthority>();

            Scheme scheme = A.Dummy <Scheme>();

            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy <Guid>(),
                scheme,
                A.Dummy <string>(),
                A.Dummy <string>());

            memberUpload.Submit(A.Dummy <User>());

            List <MemberUpload> memberUploads = new List <MemberUpload>();

            memberUploads.Add(memberUpload);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            ICommonDataAccess dataAccess = A.Fake <ICommonDataAccess>();

            A.CallTo(() => dataAccess.FetchInvoiceRunAsync(A <Guid> ._)).Returns(invoiceRun);

            FetchInvoiceRunIbisZipFileHandler handler = new FetchInvoiceRunIbisZipFileHandler(
                authorization,
                dataAccess);

            // Act
            Func <Task <FileInfo> > testCode = async() => await handler.HandleAsync(A.Dummy <Requests.Charges.FetchInvoiceRunIbisZipFile>());

            // Assert
            await Assert.ThrowsAsync <InvalidOperationException>(testCode);
        }
Ejemplo n.º 25
0
        public async void CreateTransactionFile_GivenMemberUploadSchemeHasNoAnnualAmount_DescriptionShouldNotContainAnnualCharge()
        {
            var organisation = A.Fake <Organisation>();
            var authority    = A.Fake <UKCompetentAuthority>();
            var scheme       = A.Fake <Scheme>();

            var memberUpload = new MemberUpload(
                A.Dummy <Guid>(),
                A.Dummy <string>(),
                A.Dummy <List <MemberUploadError> >(),
                123.45m,
                A.Dummy <int>(),
                scheme,
                A.Dummy <string>(),
                A.Dummy <string>(),
                false);

            SystemTime.Freeze(new DateTime(2019, 1, 1));
            memberUpload.Submit(A.Dummy <User>());
            SystemTime.Unfreeze();

            A.CallTo(() => authority.AnnualChargeAmount).Returns(0);
            A.CallTo(() => scheme.IbisCustomerReference).Returns("WEE00000002");
            A.CallTo(() => scheme.Organisation).Returns(organisation);
            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);
            A.CallTo(() => transactionReferenceGenerator.GetNextTransactionReferenceAsync()).Returns("WEE800001H");

            var memberUploads = new List <MemberUpload>()
            {
                memberUpload
            };

            var invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            var result = await generator.CreateAsync(0, invoiceRun);

            Assert.Equal(result.IbisFile.Invoices[0].LineItems[0].Description, "Charge for producer registration submission made on 01 Jan 2019.");
        }
Ejemplo n.º 26
0
        public void Constructor_WithMemberUploadAlreadyAssignedToInvoiceRun_ThrowsInvalidOperationException()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy <UKCompetentAuthority>();

            Scheme scheme = A.Fake <Scheme>();

            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            List <MemberUpload> memberUploads = new List <MemberUpload>();
            MemberUpload        memberUpload1 = new MemberUpload(new Guid("A2A01A99-A97D-4219-9060-D7CDF7435114"), scheme, "data", "filename");

            memberUpload1.Submit(A.Dummy <User>());
            memberUploads.Add(memberUpload1);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            // Act
            Func <InvoiceRun> testCode = () => new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            // Assert
            Assert.Throws <InvalidOperationException>(testCode);
        }
Ejemplo n.º 27
0
        public void Constuctor_Always_SetsIssuedByUserToIssuingUser()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy <UKCompetentAuthority>();

            Scheme scheme = A.Fake <Scheme>();

            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            List <MemberUpload> memberUploads = new List <MemberUpload>();
            MemberUpload        memberUpload1 = new MemberUpload(new Guid("A2A01A99-A97D-4219-9060-D7CDF7435114"), scheme, "data", "filename");

            memberUpload1.Submit(A.Dummy <User>());
            memberUploads.Add(memberUpload1);

            User user = A.Dummy <User>();

            // Act
            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, user);

            // Assert
            Assert.Equal(user, invoiceRun.IssuedByUser);
        }
        public async Task <FileInfo> HandleAsync(Requests.Charges.FetchInvoiceRunIbisZipFile message)
        {
            authorization.EnsureCanAccessInternalArea(true);

            InvoiceRun invoiceRun = await dataAccess.FetchInvoiceRunAsync(message.InvoiceRunId);

            if (invoiceRun.IbisFileData == null)
            {
                string errorMessage = string.Format(
                    "The invoice run 1B1S zip file cannot be fetched for the invoice run " +
                    "with ID \"{0}\" as it does not have 1B1S file data.",
                    message.InvoiceRunId);

                throw new InvalidOperationException(errorMessage);
            }

            string fileName = string.Format(
                "WEEE invoice files {0:D5} {1:yyyy-MM-dd}.zip",
                invoiceRun.IbisFileData.FileId,
                invoiceRun.IssuedDate);

            byte[] data = null;
            using (var stream = new System.IO.MemoryStream())
            {
                using (ZipFile zip = new ZipFile())
                {
                    zip.AddEntry(invoiceRun.IbisFileData.CustomerFileName, invoiceRun.IbisFileData.CustomerFileData);
                    zip.AddEntry(invoiceRun.IbisFileData.TransactionFileName, invoiceRun.IbisFileData.TransactionFileData);
                    zip.Save(stream);

                    data = stream.ToArray();
                }
            }

            return(new FileInfo(fileName, data));
        }
Ejemplo n.º 29
0
        public void Constuctor_Always_SetsIssuedDateToNowUtc()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy <UKCompetentAuthority>();

            Scheme scheme = A.Fake <Scheme>();

            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            List <MemberUpload> memberUploads = new List <MemberUpload>();
            MemberUpload        memberUpload1 = new MemberUpload(new Guid("A2A01A99-A97D-4219-9060-D7CDF7435114"), scheme, "data", "filename");

            memberUpload1.Submit(A.Dummy <User>());
            memberUploads.Add(memberUpload1);

            // Act
            SystemTime.Freeze(new DateTime(2015, 1, 1));
            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            SystemTime.Unfreeze();

            // Assert
            Assert.Equal(new DateTime(2015, 1, 1), invoiceRun.IssuedDate);
        }
        public async Task HandleAsync_WithInvoiceRunWithout1B1SFileData_ThrowsInvalidOperationException()
        {
            // Arrange
            IWeeeAuthorization authorization = AuthorizationBuilder.CreateUserWithAllRights();

            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Scheme scheme = A.Dummy<Scheme>();
            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                scheme,
                A.Dummy<string>(),
                A.Dummy<string>());

            memberUpload.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            ICommonDataAccess dataAccess = A.Fake<ICommonDataAccess>();
            A.CallTo(() => dataAccess.FetchInvoiceRunAsync(A<Guid>._)).Returns(invoiceRun);

            FetchInvoiceRunIbisZipFileHandler handler = new FetchInvoiceRunIbisZipFileHandler(
                authorization,
                dataAccess);

            // Act
            Func<Task<FileInfo>> testCode = async () => await handler.HandleAsync(A.Dummy<Requests.Charges.FetchInvoiceRunIbisZipFile>());

            // Assert
            await Assert.ThrowsAsync<InvalidOperationException>(testCode);
        }
 /// <summary>
 /// Adds the specified invoice run to the database and saves changes.
 /// </summary>
 /// <param name="invoiceRun"></param>
 /// <returns></returns>
 public async Task SaveAsync(InvoiceRun invoiceRun)
 {
     Context.InvoiceRuns.Add(invoiceRun);
     await Context.SaveChangesAsync();
 }
        public async Task<IbisFileGeneratorResult<TransactionFile>> CreateAsync(ulong fileID, InvoiceRun invoiceRun)
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");

            var errors = new List<Exception>();
            TransactionFile transactionFile = new TransactionFile("WEE", fileID);

            foreach (MemberUpload memberUpload in invoiceRun.MemberUploads)
            {
                List<InvoiceLineItem> lineItems = new List<InvoiceLineItem>();

                var lineItemGroups = memberUpload.ProducerSubmissions
                    .Where(ps => ps.ChargeThisUpdate != 0)
                    .Where(ps => ps.Invoiced)
                    .GroupBy(ps => ps.ChargeThisUpdate)
                    .OrderBy(g => g.Key)
                    .Select(g => new { Charge = g.Key, Quantity = g.Count() })
                    .ToList();

                if (lineItemGroups.Count > 0)
                {
                    var lineItemErrors = new List<Exception>();

                    foreach (var lineItemGroup in lineItemGroups)
                    {
                        decimal amount = lineItemGroup.Charge * lineItemGroup.Quantity;

                        string description = string.Format("{0} producer registration charge{1} at {2:C}.",
                            lineItemGroup.Quantity,
                            lineItemGroup.Quantity != 1 ? "s" : string.Empty,
                            lineItemGroup.Charge);

                        InvoiceLineItem lineItem;
                        try
                        {
                            lineItem = new InvoiceLineItem(
                                amount,
                                description);

                            lineItems.Add(lineItem);
                        }
                        catch (Exception ex)
                        {
                            lineItemErrors.Add(ex);
                        }
                    }

                    errors.AddRange(lineItemErrors);

                    if (lineItemErrors.Count == 0)
                    {
                        string transactionReference = await transactionReferenceGenerator.GetNextTransactionReferenceAsync();

                        try
                        {
                            Invoice invoice = new Invoice(
                                memberUpload.Scheme.IbisCustomerReference,
                                invoiceRun.IssuedDate,
                                TransactionType.Invoice,
                                transactionReference,
                                lineItems);

                            transactionFile.AddInvoice(invoice);
                        }
                        catch (Exception ex)
                        {
                            errors.Add(ex);
                        }
                    }
                }
            }

            return new IbisFileGeneratorResult<TransactionFile>(errors.Count == 0 ? transactionFile : null, errors);
        }
        public async Task HandleAysnc_HappyPath_ReturnsFileInfoWithCorrectFileName()
        {
            // Arrange
            IWeeeAuthorization authorization = AuthorizationBuilder.CreateUserWithAllRights();

            UKCompetentAuthority authority = new UKCompetentAuthority(
                A.Dummy<Guid>(),
                "Environment Agency",
                "EA",
                A.Dummy<Country>(),
                "*****@*****.**");

            Scheme scheme = A.Dummy<Scheme>();
            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                scheme,
                A.Dummy<string>(),
                A.Dummy<string>());

            memberUpload.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            SystemTime.Freeze(new DateTime(2015, 12, 31));
            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());
            SystemTime.Unfreeze();

            ulong fileID = 123;

            IbisFileData ibisFileData = new IbisFileData(fileID, "Customer File.dat", "data", "Transaction File.dat", "data");
            invoiceRun.SetIbisFileData(ibisFileData);

            ICommonDataAccess dataAccess = A.Fake<ICommonDataAccess>();
            A.CallTo(() => dataAccess.FetchInvoiceRunAsync(A<Guid>._)).Returns(invoiceRun);

            FetchInvoiceRunIbisZipFileHandler handler = new FetchInvoiceRunIbisZipFileHandler(
                authorization,
                dataAccess);

            // Act
            FileInfo fileInfo = await handler.HandleAsync(A.Dummy<Requests.Charges.FetchInvoiceRunIbisZipFile>());

            // Assert
            Assert.NotNull(fileInfo);
            Assert.Equal("WEEE invoice files 00123 2015-12-31.zip", fileInfo.FileName);
        }
        public async Task CreateTransactionFile_WithOneMemberUpload_CreatesOneInvoiceWithOneLineItem()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                123.45m,
                complianceYear,
                scheme,
                A.Dummy<string>());

            SystemTime.Freeze(new DateTime(2015, 1, 1));
            memberUpload.Submit(A.Dummy<User>());
            SystemTime.Unfreeze();

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            ITransactionReferenceGenerator transactionReferenceGenerator = A.Fake<ITransactionReferenceGenerator>();
            A.CallTo(() => transactionReferenceGenerator.GetNextTransactionReferenceAsync()).Returns("WEE800001H");

            BySubmissionTransactionFileGenerator generator = new BySubmissionTransactionFileGenerator(transactionReferenceGenerator);

            SystemTime.Freeze(new DateTime(2015, 12, 31));
            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());
            SystemTime.Unfreeze();

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);
            TransactionFile transactionFile = result.IbisFile;

            // Assert
            Assert.NotNull(transactionFile);
            Assert.Equal(1, transactionFile.Invoices.Count);

            Invoice invoice = transactionFile.Invoices[0];
            Assert.NotNull(invoice);

            Assert.Equal(TransactionType.Invoice, invoice.TransactionType);
            Assert.Equal("WEE800001H", invoice.TransactionReference);
            Assert.Equal(123.45m, invoice.TransactionTotal);
            Assert.Equal(null, invoice.TransactionHeaderNarrative);
            Assert.Equal(new DateTime(2015, 12, 31), invoice.TransactionDate);
            Assert.Equal(null, invoice.RelatedTransactionReference);
            Assert.Equal(CurrencyCode.GBP, invoice.CurrencyCode);
            Assert.Equal("WEE00000001", invoice.CustomerReference);

            Assert.NotNull(invoice.LineItems);
            Assert.Equal(1, invoice.LineItems.Count);

            InvoiceLineItem lineItem = invoice.LineItems[0];
            Assert.NotNull(lineItem);

            Assert.Equal(123.45m, lineItem.AmountExcludingVAT);
            Assert.Equal("Charge for producer registration submission made on 01 Jan 2015.", lineItem.Description);
            Assert.Equal("H", lineItem.AreaCode);
            Assert.Equal("H", lineItem.ContextCode);
            Assert.Equal("W", lineItem.IncomeStreamCode);
            Assert.Equal((ulong)1, lineItem.Quantity);
            Assert.Equal(UnitOfMeasure.Each, lineItem.UnitOfMeasure);
            Assert.Equal(null, lineItem.VatCode);
        }
        public async Task CreateTransactionFile_WithExceptionThrown_ReturnsError_AndNoTransactionFile()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                A.Dummy<decimal>(),
                complianceYear,
                scheme,
                A.Dummy<string>());

            RegisteredProducer registeredProducer = new RegisteredProducer("WEE/11AAAA11", complianceYear, scheme);

            ProducerSubmission producerSubmission = new ProducerSubmission(
                registeredProducer,
                memberUpload,
                A.Dummy<ProducerBusiness>(),
                A.Dummy<AuthorisedRepresentative>(),
                A.Dummy<DateTime>(),
                A.Dummy<decimal>(),
                A.Dummy<bool>(),
                A.Dummy<DateTime?>(),
                A.Dummy<string>(),
                A.Dummy<EEEPlacedOnMarketBandType>(),
                A.Dummy<SellingTechniqueType>(),
                A.Dummy<ObligationType>(),
                A.Dummy<AnnualTurnOverBandType>(),
                A.Dummy<List<BrandName>>(),
                A.Dummy<List<SICCode>>(),
                A.Dummy<Domain.Lookup.ChargeBandAmount>(),
                100M);

            memberUpload.ProducerSubmissions.Add(producerSubmission);

            memberUpload.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            ITransactionReferenceGenerator transactionReferenceGenerator = A.Fake<ITransactionReferenceGenerator>();
            A.CallTo(() => transactionReferenceGenerator.GetNextTransactionReferenceAsync()).Returns((string)null); // A null value will cause the Ibis object to throw an exception.

            ByChargeValueTransactionFileGenerator generator = new ByChargeValueTransactionFileGenerator(
                transactionReferenceGenerator);

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);

            // Assert
            Assert.Null(result.IbisFile);
            Assert.NotEmpty(result.Errors);
        }
        public async Task FetchInvoiceRunsAsync_Always_ReturnsResultsOrderedByIssuedDateDescending()
        {
            using (DatabaseWrapper wrapper = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper helper = new ModelHelper(wrapper.Model);
                AspNetUser user = helper.GetOrCreateUser("TestUser");

                Weee.Tests.Core.Model.Country country = new Weee.Tests.Core.Model.Country();
                country.Id = new Guid("FA20ED45-5488-491D-A117-DFC09C9C1BA2");
                country.Name = "Test Country";

                CompetentAuthority databaseAuthority = new CompetentAuthority();
                databaseAuthority.Id = new Guid("DDE398F6-809E-416D-B70D-B36606F221FC");
                databaseAuthority.Name = "Test Authority 1";
                databaseAuthority.Abbreviation = "T1";
                databaseAuthority.Country = country;
                databaseAuthority.Email = "TestEmailAddress";
                wrapper.Model.CompetentAuthorities.Add(databaseAuthority);

                InvoiceRun invoiceRun1 = new InvoiceRun();
                invoiceRun1.Id = new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872");
                invoiceRun1.CompetentAuthority = databaseAuthority;
                invoiceRun1.IssuedByUserId = user.Id;
                invoiceRun1.IssuedDate = new DateTime(2015, 1, 2);
                wrapper.Model.InvoiceRuns.Add(invoiceRun1);

                InvoiceRun invoiceRun2 = new InvoiceRun();
                invoiceRun2.Id = new Guid("728CDF55-1C3C-4BE0-80CB-0BC82CC9DFA3");
                invoiceRun2.CompetentAuthority = databaseAuthority;
                invoiceRun2.IssuedByUserId = user.Id;
                invoiceRun2.IssuedDate = new DateTime(2015, 1, 1);
                wrapper.Model.InvoiceRuns.Add(invoiceRun2);

                InvoiceRun invoiceRun3 = new InvoiceRun();
                invoiceRun3.Id = new Guid("B235CD4F-8188-4BC0-ADA2-55FD6B34BC01");
                invoiceRun3.CompetentAuthority = databaseAuthority;
                invoiceRun3.IssuedByUserId = user.Id;
                invoiceRun3.IssuedDate = new DateTime(2015, 1, 3);
                wrapper.Model.InvoiceRuns.Add(invoiceRun3);

                wrapper.Model.SaveChanges();

                UKCompetentAuthority domainAuthority = wrapper.WeeeContext.UKCompetentAuthorities.Find(databaseAuthority.Id);

                FetchInvoiceRunsDataAccess dataAccess = new FetchInvoiceRunsDataAccess(wrapper.WeeeContext);

                // Act
                IReadOnlyList<Domain.Charges.InvoiceRun> results = await dataAccess.FetchInvoiceRunsAsync(domainAuthority);

                // Assert
                Assert.NotNull(results);
                Assert.Equal(3, results.Count);
                Assert.Collection(results,
                    r1 => Assert.Equal(new DateTime(2015, 1, 3), r1.IssuedDate),
                    r2 => Assert.Equal(new DateTime(2015, 1, 2), r2.IssuedDate),
                    r3 => Assert.Equal(new DateTime(2015, 1, 1), r3.IssuedDate));
            }
        }
        public async Task CreateTransactionFile_WithTwoMemberUploads_CreatesTwoInvoices()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload1 = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                A.Dummy<decimal>(),
                complianceYear,
                scheme,
                A.Dummy<string>());

            RegisteredProducer registeredProducer1 = new RegisteredProducer("WEE/11AAAA11", complianceYear, scheme);

            ProducerSubmission producerSubmission1 = new ProducerSubmission(
                registeredProducer1,
                memberUpload1,
                A.Dummy<ProducerBusiness>(),
                A.Dummy<AuthorisedRepresentative>(),
                A.Dummy<DateTime>(),
                A.Dummy<decimal>(),
                A.Dummy<bool>(),
                A.Dummy<DateTime?>(),
                A.Dummy<string>(),
                A.Dummy<EEEPlacedOnMarketBandType>(),
                A.Dummy<SellingTechniqueType>(),
                A.Dummy<ObligationType>(),
                A.Dummy<AnnualTurnOverBandType>(),
                A.Dummy<List<BrandName>>(),
                A.Dummy<List<SICCode>>(),
                A.Dummy<Domain.Lookup.ChargeBandAmount>(),
                100m);

            memberUpload1.ProducerSubmissions.Add(producerSubmission1);

            memberUpload1.Submit(A.Dummy<User>());

            MemberUpload memberUpload2 = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                A.Dummy<decimal>(),
                complianceYear,
                scheme,
                A.Dummy<string>());

            RegisteredProducer registeredProducer2 = new RegisteredProducer("WEE/22BBBB22", complianceYear, scheme);

            ProducerSubmission producerSubmission2 = new ProducerSubmission(
                registeredProducer2,
                memberUpload2,
                A.Dummy<ProducerBusiness>(),
                A.Dummy<AuthorisedRepresentative>(),
                A.Dummy<DateTime>(),
                A.Dummy<decimal>(),
                A.Dummy<bool>(),
                A.Dummy<DateTime?>(),
                A.Dummy<string>(),
                A.Dummy<EEEPlacedOnMarketBandType>(),
                A.Dummy<SellingTechniqueType>(),
                A.Dummy<ObligationType>(),
                A.Dummy<AnnualTurnOverBandType>(),
                A.Dummy<List<BrandName>>(),
                A.Dummy<List<SICCode>>(),
                A.Dummy<Domain.Lookup.ChargeBandAmount>(),
                100m);

            memberUpload2.ProducerSubmissions.Add(producerSubmission2);

            memberUpload2.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload1);
            memberUploads.Add(memberUpload2);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            ITransactionReferenceGenerator transactionReferenceGenerator = A.Fake<ITransactionReferenceGenerator>();
            A.CallTo(() => transactionReferenceGenerator.GetNextTransactionReferenceAsync()).Returns("WEE800001H");

            ByChargeValueTransactionFileGenerator generator = new ByChargeValueTransactionFileGenerator(transactionReferenceGenerator);

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);
            TransactionFile transactionFile = result.IbisFile;

            // Assert
            Assert.NotNull(transactionFile);
            Assert.Equal(2, transactionFile.Invoices.Count);

            Invoice invoice1 = transactionFile.Invoices[0];
            Assert.NotNull(invoice1);
            Assert.Equal(100m, invoice1.TransactionTotal);

            Invoice invoice2 = transactionFile.Invoices[1];
            Assert.NotNull(invoice2);
            Assert.Equal(100m, invoice2.TransactionTotal);
        }
        public async Task CreateTransactionFile_ProducerSubmissionMarkedAsNotInvoiced_NotIncludedInTransactionFile()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                A.Dummy<decimal>(),
                complianceYear,
                scheme,
                A.Dummy<string>());

            var producerSubmission = A.Fake<ProducerSubmission>();
            A.CallTo(() => producerSubmission.ChargeThisUpdate)
                .Returns(123.45m);
            A.CallTo(() => producerSubmission.Invoiced)
                .Returns(false);

            memberUpload.ProducerSubmissions.Add(producerSubmission);
            memberUpload.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            ByChargeValueTransactionFileGenerator generator = new ByChargeValueTransactionFileGenerator(
                A.Dummy<ITransactionReferenceGenerator>());

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);
            TransactionFile transactionFile = result.IbisFile;

            // Assert
            Assert.NotNull(transactionFile);
            Assert.Equal(0, transactionFile.Invoices.Count);
        }
        public async Task CreateCustomerFile_WithOneMemberUpload_CreatesOneCustomer()
        {
            // Arrange
            var authority = A.Dummy <UKCompetentAuthority>();

            var address = new Address(
                "1 High Street",
                null,
                "Some town",
                "Some county",
                "Post code",
                new Country(Guid.NewGuid(), "UK - England"),
                "01234 567890",
                "*****@*****.**");

            var contact = new Contact("John", "Smith", "Manager");

            var organisation = Organisation.CreateSoleTrader("Test organisation");

            var scheme = new Scheme(organisation);

            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy <ObligationType>(),
                authority);
            scheme.AddOrUpdateAddress(address);
            scheme.AddOrUpdateMainContactPerson(contact);

            var complianceYear = A.Dummy <int>();

            var memberUpload = new MemberUpload(
                A.Dummy <Guid>(),
                A.Dummy <string>(),
                A.Dummy <List <MemberUploadError> >(),
                A.Dummy <decimal>(),
                complianceYear,
                scheme,
                A.Dummy <string>(),
                A.Dummy <string>(),
                false);

            memberUpload.Submit(A.Dummy <User>());

            var memberUploads = new List <MemberUpload> {
                memberUpload
            };

            var invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            var generator = new BySchemeCustomerFileGenerator();

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);

            var customerFile = result.IbisFile;

            // Assert
            Assert.NotNull(customerFile);
            Assert.Equal(1, customerFile.Customers.Count);

            var customer = customerFile.Customers[0];

            Assert.NotNull(customer);
            Assert.Equal("WEE00000001", customer.CustomerReference);
            Assert.Equal("Test organisation", customer.Name);

            Assert.NotNull(customer.Address);
            Assert.Equal("John Smith", customer.Address.AddressLine1);
            Assert.Equal("1 High Street", customer.Address.AddressLine2);
            Assert.Equal(null, customer.Address.AddressLine3);
            Assert.Equal(null, customer.Address.AddressLine4);
            Assert.Equal("Some town", customer.Address.AddressLine5);
            Assert.Equal("Some county", customer.Address.AddressLine6);
            Assert.Equal("Post code", customer.Address.PostCode);
        }
        public async Task CreateCustomerFile_WithTwoMemberUploadsForDifferentSchemes_CreatesTwoCustomers()
        {
            // Arrange
            var authority = A.Dummy <UKCompetentAuthority>();

            var address1 = new Address(
                "1 High Street",
                null,
                "Some town",
                "Some county",
                "Post code",
                new Country(Guid.NewGuid(), "UK - England"),
                "01234 567890",
                "*****@*****.**");

            var organisation1 = Organisation.CreateSoleTrader("Test organisation 1");

            var scheme1 = new Scheme(organisation1);

            scheme1.UpdateScheme(
                "Test scheme 2",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy <ObligationType>(),
                authority);
            scheme1.AddOrUpdateMainContactPerson(A.Fake <Contact>());
            scheme1.AddOrUpdateAddress(address1);

            var complianceYear1 = A.Dummy <int>();

            var memberUpload1 = new MemberUpload(
                A.Dummy <Guid>(),
                A.Dummy <string>(),
                A.Dummy <List <MemberUploadError> >(),
                A.Dummy <decimal>(),
                complianceYear1,
                scheme1,
                A.Dummy <string>(),
                A.Dummy <string>(),
                false);

            memberUpload1.Submit(A.Dummy <User>());

            var address2 = new Address(
                "2 High Street",
                null,
                "Some town",
                "Some county",
                "Post code",
                new Country(Guid.NewGuid(), "UK - England"),
                "01234 567890",
                "*****@*****.**");

            var organisation2 = Organisation.CreateSoleTrader("Test organisation 2");

            var scheme2 = new Scheme(organisation2);

            scheme2.UpdateScheme(
                "Test scheme 2",
                "WEE/BB2222BB/SCH",
                "WEE00000002",
                A.Dummy <ObligationType>(),
                authority);
            scheme2.AddOrUpdateAddress(address2);
            scheme2.AddOrUpdateMainContactPerson(A.Fake <Contact>());

            var complianceYear2 = A.Dummy <int>();

            var memberUpload2 = new MemberUpload(
                A.Dummy <Guid>(),
                A.Dummy <string>(),
                A.Dummy <List <MemberUploadError> >(),
                A.Dummy <decimal>(),
                complianceYear2,
                scheme2,
                A.Dummy <string>(),
                A.Dummy <string>(),
                false);

            memberUpload2.Submit(A.Dummy <User>());

            var memberUploads = new List <MemberUpload> {
                memberUpload1, memberUpload2
            };

            var invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy <User>());

            var generator = new BySchemeCustomerFileGenerator();

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);

            var customerFile = result.IbisFile;

            // Assert
            Assert.NotNull(customerFile);
            Assert.Equal(2, customerFile.Customers.Count);

            var customer1 = customerFile.Customers[0];

            Assert.NotNull(customer1);
            Assert.Equal("WEE00000001", customer1.CustomerReference);

            var customer2 = customerFile.Customers[1];

            Assert.NotNull(customer2);
            Assert.Equal("WEE00000002", customer2.CustomerReference);
        }
        public async Task CreateTransactionFile_WithOneProducerSubmission_CreatesOneInvoiceWithOneLineItem()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                A.Dummy<decimal>(),
                complianceYear,
                scheme,
                A.Dummy<string>());

            RegisteredProducer registeredProducer = new RegisteredProducer("WEE/11AAAA11", complianceYear, scheme);

            ProducerSubmission producerSubmission = new ProducerSubmission(
                registeredProducer,
                memberUpload,
                A.Dummy<ProducerBusiness>(),
                A.Dummy<AuthorisedRepresentative>(),
                A.Dummy<DateTime>(),
                A.Dummy<decimal>(),
                A.Dummy<bool>(),
                A.Dummy<DateTime?>(),
                A.Dummy<string>(),
                A.Dummy<EEEPlacedOnMarketBandType>(),
                A.Dummy<SellingTechniqueType>(),
                A.Dummy<ObligationType>(),
                A.Dummy<AnnualTurnOverBandType>(),
                A.Dummy<List<BrandName>>(),
                A.Dummy<List<SICCode>>(),
                A.Dummy<Domain.Lookup.ChargeBandAmount>(),
                123.45m);

            memberUpload.ProducerSubmissions.Add(producerSubmission);

            memberUpload.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            SystemTime.Freeze(new DateTime(2015, 12, 31));
            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());
            SystemTime.Unfreeze();

            ITransactionReferenceGenerator transactionReferenceGenerator = A.Fake<ITransactionReferenceGenerator>();
            A.CallTo(() => transactionReferenceGenerator.GetNextTransactionReferenceAsync()).Returns("WEE800001H");

            ByChargeValueTransactionFileGenerator generator = new ByChargeValueTransactionFileGenerator(transactionReferenceGenerator);

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);
            TransactionFile transactionFile = result.IbisFile;

            // Assert
            Assert.NotNull(transactionFile);
            Assert.Equal(1, transactionFile.Invoices.Count);

            Invoice invoice = transactionFile.Invoices[0];
            Assert.NotNull(invoice);

            Assert.Equal(TransactionType.Invoice, invoice.TransactionType);
            Assert.Equal("WEE800001H", invoice.TransactionReference);
            Assert.Equal(123.45m, invoice.TransactionTotal);
            Assert.Equal(null, invoice.TransactionHeaderNarrative);
            Assert.Equal(new DateTime(2015, 12, 31), invoice.TransactionDate);
            Assert.Equal(null, invoice.RelatedTransactionReference);
            Assert.Equal(CurrencyCode.GBP, invoice.CurrencyCode);
            Assert.Equal("WEE00000001", invoice.CustomerReference);

            Assert.NotNull(invoice.LineItems);
            Assert.Equal(1, invoice.LineItems.Count);

            InvoiceLineItem lineItem = invoice.LineItems[0];
            Assert.NotNull(lineItem);

            Assert.Equal(123.45m, lineItem.AmountExcludingVAT);
            Assert.Equal("1 producer registration charge at £123.45.", lineItem.Description);
            Assert.Equal("H", lineItem.AreaCode);
            Assert.Equal("H", lineItem.ContextCode);
            Assert.Equal("W", lineItem.IncomeStreamCode);
            Assert.Equal((ulong)1, lineItem.Quantity);
            Assert.Equal(UnitOfMeasure.Each, lineItem.UnitOfMeasure);
            Assert.Equal(null, lineItem.VatCode);
        }
Ejemplo n.º 42
0
        public void Constructor_Always_AssignsMemberUploadsToInvoiceRun()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Scheme scheme = A.Fake<Scheme>();
            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            MemberUpload memberUpload1 = new MemberUpload(new Guid("A2A01A99-A97D-4219-9060-D7CDF7435114"), scheme, "data", "filename");
            memberUpload1.Submit(A.Dummy<User>());
            memberUploads.Add(memberUpload1);

            // Act
            InvoiceRun result = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            // Assert
            Assert.Equal(result, memberUpload1.InvoiceRun);
        }
        public async Task FetchInvoiceRunsAsync_Always_EagerLoadsIssuedByUser()
        {
            using (DatabaseWrapper wrapper = new DatabaseWrapper())
            {
                // Arrange
                ModelHelper helper = new ModelHelper(wrapper.Model);
                AspNetUser user = helper.GetOrCreateUser("TestUser");

                Weee.Tests.Core.Model.Country country = new Weee.Tests.Core.Model.Country();
                country.Id = new Guid("FA20ED45-5488-491D-A117-DFC09C9C1BA2");
                country.Name = "Test Country";

                CompetentAuthority databaseAuthority = new CompetentAuthority();
                databaseAuthority.Id = new Guid("DDE398F6-809E-416D-B70D-B36606F221FC");
                databaseAuthority.Name = "Test Authority 1";
                databaseAuthority.Abbreviation = "T1";
                databaseAuthority.Country = country;
                databaseAuthority.Email = "TestEmailAddress";
                wrapper.Model.CompetentAuthorities.Add(databaseAuthority);

                InvoiceRun invoiceRun = new InvoiceRun();
                invoiceRun.Id = new Guid("CE7A2617-AE16-403E-A7BF-BF01AD223872");
                invoiceRun.CompetentAuthority = databaseAuthority;
                invoiceRun.IssuedByUserId = user.Id;
                invoiceRun.IssuedDate = new DateTime(2015, 1, 2);
                wrapper.Model.InvoiceRuns.Add(invoiceRun);

                wrapper.Model.SaveChanges();

                UKCompetentAuthority domainAuthority = wrapper.WeeeContext.UKCompetentAuthorities.Find(databaseAuthority.Id);

                FetchInvoiceRunsDataAccess dataAccess = new FetchInvoiceRunsDataAccess(wrapper.WeeeContext);

                // Act
                IReadOnlyList<Domain.Charges.InvoiceRun> results = await dataAccess.FetchInvoiceRunsAsync(domainAuthority);

                // Assert
                Assert.NotNull(results);
                Assert.Equal(1, results.Count);
                Assert.NotNull(results[0].IssuedByUser);
            }
        }
        public async Task CreateTransactionFile_WithTwoMemberUploads_CreatesTwoInvoices()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload1 = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                100,
                complianceYear,
                scheme,
                A.Dummy<string>());

            memberUpload1.Submit(A.Dummy<User>());

            MemberUpload memberUpload2 = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                200,
                complianceYear,
                scheme,
                A.Dummy<string>());

            memberUpload2.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload1);
            memberUploads.Add(memberUpload2);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            ITransactionReferenceGenerator transactionReferenceGenerator = A.Fake<ITransactionReferenceGenerator>();
            A.CallTo(() => transactionReferenceGenerator.GetNextTransactionReferenceAsync()).Returns("WEE800001H");

            BySubmissionTransactionFileGenerator generator = new BySubmissionTransactionFileGenerator(transactionReferenceGenerator);

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);
            TransactionFile transactionFile = result.IbisFile;

            // Assert
            Assert.NotNull(transactionFile);
            Assert.Equal(2, transactionFile.Invoices.Count);

            Invoice invoice1 = transactionFile.Invoices[0];
            Assert.NotNull(invoice1);
            Assert.Equal(100m, invoice1.TransactionTotal);

            Invoice invoice2 = transactionFile.Invoices[1];
            Assert.NotNull(invoice2);
            Assert.Equal(200m, invoice2.TransactionTotal);
        }
        public async Task GetAllInvoicedSchemesHandler_ReturnsSchemes()
        {
            // Arrange
            UKCompetentAuthority competentAuthority =
                new UKCompetentAuthority(Guid.NewGuid(), "Environment Agency", "EA", new Country(Guid.NewGuid(), "UK - England"), "*****@*****.**", 0);
            var scheme1 = A.Fake <Scheme>();

            A.CallTo(() => scheme1.CompetentAuthority).Returns(competentAuthority);
            var scheme2 = A.Fake <Scheme>();

            A.CallTo(() => scheme2.CompetentAuthority).Returns(competentAuthority);
            var scheme3 = A.Fake <Scheme>();

            A.CallTo(() => scheme3.CompetentAuthority).Returns(competentAuthority);

            InvoiceRun invoice = A.Fake <InvoiceRun>();

            var memberUpload1 = A.Fake <MemberUpload>();

            A.CallTo(() => memberUpload1.ComplianceYear).Returns(2015);
            A.CallTo(() => memberUpload1.Scheme).Returns(scheme1);
            A.CallTo(() => memberUpload1.InvoiceRun).Returns(invoice);

            var memberUpload2 = A.Fake <MemberUpload>();

            A.CallTo(() => memberUpload2.ComplianceYear).Returns(2017);
            A.CallTo(() => memberUpload2.Scheme).Returns(scheme2);
            A.CallTo(() => memberUpload2.InvoiceRun).Returns(invoice);

            var memberUpload3 = A.Fake <MemberUpload>();

            A.CallTo(() => memberUpload3.ComplianceYear).Returns(2016);
            A.CallTo(() => memberUpload3.Scheme).Returns(scheme3);
            A.CallTo(() => memberUpload3.InvoiceRun).Returns(invoice);

            var schemeData1 = A.Fake <SchemeData>();
            var schemeData2 = A.Fake <SchemeData>();
            var schemeData3 = A.Fake <SchemeData>();

            ICommonDataAccess dataAccess = A.Fake <ICommonDataAccess>();

            A.CallTo(() => dataAccess.FetchInvoicedMemberUploadsAsync(competentAuthority))
            .Returns(new List <MemberUpload>()
            {
                memberUpload1,
                memberUpload2,
                memberUpload3
            });

            IWeeeAuthorization authorization = AuthorizationBuilder.CreateUserWithAllRights();
            var schemeMap = A.Fake <IMap <Scheme, SchemeData> >();

            A.CallTo(() => schemeMap.Map(memberUpload1.Scheme)).Returns(schemeData1);
            A.CallTo(() => schemeMap.Map(memberUpload2.Scheme)).Returns(schemeData2);
            A.CallTo(() => schemeMap.Map(memberUpload3.Scheme)).Returns(schemeData3);

            FetchSchemesWithInvoicesHandler handler = new FetchSchemesWithInvoicesHandler(
                authorization,
                dataAccess,
                schemeMap);

            FetchSchemesWithInvoices request = new FetchSchemesWithInvoices(CompetentAuthority.England);

            A.CallTo(() => dataAccess.FetchCompetentAuthority(CompetentAuthority.England)).Returns(competentAuthority);
            // Act
            var schemesList = await handler.HandleAsync(request);

            //Assert
            Assert.NotNull(schemesList);
            Assert.Equal(3, schemesList.Count);
            Assert.Collection(schemesList,
                              r1 => Assert.Equal(r1, schemeData1),
                              r2 => Assert.Equal(r2, schemeData2),
                              r3 => Assert.Equal(r3, schemeData3));
        }
Ejemplo n.º 46
0
        /// <summary>
        /// Retrieve all invoice runs from the system.        
        /// </summary>
        /// <returns>List of all invoice runs</returns>
        /// <remarks>
        /// This returns a list of all Invoice Runs performed, include the date the run was performed.
        /// </remarks>
        public IList<InvoiceRun> GetAllInvoiceRuns()
        {
            IList<Invoice> invoices = _invoiceRepository.GetAllInvoices();
            IList<InvoiceRun> runs = new List<InvoiceRun>();

            var groups = invoices.GroupBy(i => i.InvoiceRunNumber);

            foreach (var group in groups)
            {
                // Every invoice with the same run number will have the same invoice date,
                // as they're all invoiced at the same time (same run).
                // We can use the first invoice (there must be one or the group would not exist)
                // to get the Invoice Date.
                var run = new InvoiceRun
                            {
                                RunNumber = group.Key,
                                RunDate = group.ElementAt(0).ToDate,
                                NumberOfInvoices = group.Count()
                            };
                runs.Add(run);
            }

            return runs;
        }
        public async Task CreateCustomerFile_WithTwoMemberUploadsForDifferentSchemes_CreatesTwoCustomers()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Address address1 = new Address(
                "1 High Street",
                null,
                "Some town",
                "Some county",
                "Post code",
                new Country(Guid.NewGuid(), "UK - England"),
                "01234 567890",
                "*****@*****.**");

            Organisation organisation1 = Organisation.CreateSoleTrader("Test organisation 1");
            organisation1.AddOrUpdateAddress(AddressType.OrganisationAddress, address1);
            organisation1.AddOrUpdateMainContactPerson(A.Dummy<Contact>());

            Scheme scheme1 = new Scheme(organisation1);
            scheme1.UpdateScheme(
                "Test scheme 2",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear1 = A.Dummy<int>();

            MemberUpload memberUpload1 = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                A.Dummy<decimal>(),
                complianceYear1,
                scheme1,
                A.Dummy<string>());

            memberUpload1.Submit(A.Dummy<User>());

            Address address2 = new Address(
                "2 High Street",
                null,
                "Some town",
                "Some county",
                "Post code",
                new Country(Guid.NewGuid(), "UK - England"),
                "01234 567890",
                "*****@*****.**");

            Organisation organisation2 = Organisation.CreateSoleTrader("Test organisation 2");
            organisation2.AddOrUpdateAddress(AddressType.OrganisationAddress, address2);
            organisation2.AddOrUpdateMainContactPerson(A.Dummy<Contact>());

            Scheme scheme2 = new Scheme(organisation2);
            scheme2.UpdateScheme(
                "Test scheme 2",
                "WEE/BB2222BB/SCH",
                "WEE00000002",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear2 = A.Dummy<int>();

            MemberUpload memberUpload2 = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                A.Dummy<decimal>(),
                complianceYear2,
                scheme2,
                A.Dummy<string>());

            memberUpload2.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload1);
            memberUploads.Add(memberUpload2);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            BySchemeCustomerFileGenerator generator = new BySchemeCustomerFileGenerator();

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);
            CustomerFile customerFile = result.IbisFile;

            // Assert
            Assert.NotNull(customerFile);
            Assert.Equal(2, customerFile.Customers.Count);

            Customer customer1 = customerFile.Customers[0];
            Assert.NotNull(customer1);
            Assert.Equal("WEE00000001", customer1.CustomerReference);

            Customer customer2 = customerFile.Customers[1];
            Assert.NotNull(customer2);
            Assert.Equal("WEE00000002", customer2.CustomerReference);
        }
        public async Task <IbisFileGeneratorResult <TransactionFile> > CreateAsync(ulong fileID, InvoiceRun invoiceRun)
        {
            TransactionFile transactionFile = new TransactionFile("WEE", fileID);
            var             errors          = new List <Exception>();

            foreach (MemberUpload memberUpload in invoiceRun.MemberUploads)
            {
                DateTime submittedDate = memberUpload.SubmittedDate.Value;

                string description = string.Format("Charge for producer registration submission made on {0:dd MMM yyyy}.",
                                                   submittedDate);
                try
                {
                    InvoiceLineItem lineItem = new InvoiceLineItem(
                        memberUpload.TotalCharges,
                        description);

                    string transactionReference = await transactionReferenceGenerator.GetNextTransactionReferenceAsync();

                    Invoice invoice = new Invoice(
                        memberUpload.Scheme.IbisCustomerReference,
                        invoiceRun.IssuedDate,
                        TransactionType.Invoice,
                        transactionReference,
                        new List <InvoiceLineItem>()
                    {
                        lineItem
                    });

                    transactionFile.AddInvoice(invoice);
                }
                catch (Exception ex)
                {
                    errors.Add(ex);
                }
            }

            return(new IbisFileGeneratorResult <TransactionFile>(errors.Count == 0 ? transactionFile : null, errors));
        }
        public async Task CreateTransactionFile_WithExceptionThrown_ReturnsError_AndNoTransactionFile()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                123.45m,
                complianceYear,
                scheme,
                A.Dummy<string>());

            memberUpload.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            ITransactionReferenceGenerator transactionReferenceGenerator = A.Fake<ITransactionReferenceGenerator>();
            A.CallTo(() => transactionReferenceGenerator.GetNextTransactionReferenceAsync()).Returns((string)null); // A null value will cause the Ibis object to throw an exception.

            BySubmissionTransactionFileGenerator generator = new BySubmissionTransactionFileGenerator(transactionReferenceGenerator);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);

            // Assert
            Assert.Null(result.IbisFile);
            Assert.NotEmpty(result.Errors);
        }
        public async Task CreateCustomerFile_WithExceptionThrown_ReturnsError_AndNoCustomerFile()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Address address = new Address(
                "1 High Street",
                null,
                "Some town",
                "Some county",
                null, // A null value will cause the Ibis class to throw an exception.
                new Country(Guid.NewGuid(), "UK - England"),
                "01234 567890",
                "*****@*****.**");

            Contact contact = new Contact("John", "Smith", "Manager");

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");
            organisation.AddOrUpdateAddress(AddressType.OrganisationAddress, address);
            organisation.AddOrUpdateMainContactPerson(contact);

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                A.Dummy<decimal>(),
                complianceYear,
                scheme,
                A.Dummy<string>());

            memberUpload.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            BySchemeCustomerFileGenerator generator = new BySchemeCustomerFileGenerator();

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);

            // Assert
            Assert.Null(result.IbisFile);
            Assert.NotEmpty(result.Errors);
        }
Ejemplo n.º 51
0
        public async Task <IbisFileGeneratorResult <TransactionFile> > CreateAsync(ulong fileID, InvoiceRun invoiceRun)
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");

            var             errors          = new List <Exception>();
            TransactionFile transactionFile = new TransactionFile("WEE", fileID);

            foreach (MemberUpload memberUpload in invoiceRun.MemberUploads)
            {
                List <InvoiceLineItem> lineItems = new List <InvoiceLineItem>();

                var lineItemGroups = memberUpload.ProducerSubmissions
                                     .Where(ps => ps.ChargeThisUpdate != 0)
                                     .Where(ps => ps.Invoiced)
                                     .GroupBy(ps => ps.ChargeThisUpdate)
                                     .OrderBy(g => g.Key)
                                     .Select(g => new { Charge = g.Key, Quantity = g.Count() })
                                     .ToList();

                if (lineItemGroups.Count > 0)
                {
                    var lineItemErrors = new List <Exception>();

                    foreach (var lineItemGroup in lineItemGroups)
                    {
                        decimal amount = lineItemGroup.Charge * lineItemGroup.Quantity;

                        string description = string.Format("{0} producer registration charge{1} at {2:C}.",
                                                           lineItemGroup.Quantity,
                                                           lineItemGroup.Quantity != 1 ? "s" : string.Empty,
                                                           lineItemGroup.Charge);

                        InvoiceLineItem lineItem;
                        try
                        {
                            lineItem = new InvoiceLineItem(
                                amount,
                                description);

                            lineItems.Add(lineItem);
                        }
                        catch (Exception ex)
                        {
                            lineItemErrors.Add(ex);
                        }
                    }

                    errors.AddRange(lineItemErrors);

                    if (lineItemErrors.Count == 0)
                    {
                        string transactionReference = await transactionReferenceGenerator.GetNextTransactionReferenceAsync();

                        try
                        {
                            Invoice invoice = new Invoice(
                                memberUpload.Scheme.IbisCustomerReference,
                                invoiceRun.IssuedDate,
                                TransactionType.Invoice,
                                transactionReference,
                                lineItems);

                            transactionFile.AddInvoice(invoice);
                        }
                        catch (Exception ex)
                        {
                            errors.Add(ex);
                        }
                    }
                }
            }

            return(new IbisFileGeneratorResult <TransactionFile>(errors.Count == 0 ? transactionFile : null, errors));
        }
        public async Task CreateTransactionFile_ProducerSubmissionWithNoCharge_NotIncludedInTransactionFile()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                A.Dummy<decimal>(),
                complianceYear,
                scheme,
                A.Dummy<string>());

            RegisteredProducer registeredProducer = new RegisteredProducer("WEE/11AAAA11", complianceYear, scheme);

            ProducerSubmission producerSubmission = new ProducerSubmission(
                registeredProducer,
                memberUpload,
                A.Dummy<ProducerBusiness>(),
                A.Dummy<AuthorisedRepresentative>(),
                A.Dummy<DateTime>(),
                A.Dummy<decimal>(),
                A.Dummy<bool>(),
                A.Dummy<DateTime?>(),
                A.Dummy<string>(),
                A.Dummy<EEEPlacedOnMarketBandType>(),
                A.Dummy<SellingTechniqueType>(),
                A.Dummy<ObligationType>(),
                A.Dummy<AnnualTurnOverBandType>(),
                A.Dummy<List<BrandName>>(),
                A.Dummy<List<SICCode>>(),
                A.Dummy<Domain.Lookup.ChargeBandAmount>(),
                0);

            memberUpload.ProducerSubmissions.Add(producerSubmission);

            memberUpload.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            ByChargeValueTransactionFileGenerator generator = new ByChargeValueTransactionFileGenerator(
                A.Dummy<ITransactionReferenceGenerator>());

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);
            TransactionFile transactionFile = result.IbisFile;

            // Assert
            Assert.NotNull(transactionFile);
            Assert.Equal(0, transactionFile.Invoices.Count);
        }
Ejemplo n.º 53
0
        public async Task GetAllComplianceYearsHandler_ReturnsYearsInDescendingOrder()
        {
            // Arrange
            UKCompetentAuthority competentAuthority =
                new UKCompetentAuthority(Guid.NewGuid(), "Environment Agency", "EA", new Country(Guid.NewGuid(), "UK - England"), "*****@*****.**", 0);
            var scheme1 = A.Fake <Scheme>();

            A.CallTo(() => scheme1.SchemeName).Returns("Test1");
            A.CallTo(() => scheme1.CompetentAuthority).Returns(competentAuthority);
            var scheme2 = A.Fake <Scheme>();

            A.CallTo(() => scheme2.SchemeName).Returns("Test2");
            A.CallTo(() => scheme2.CompetentAuthority).Returns(competentAuthority);
            var scheme3 = A.Fake <Scheme>();

            A.CallTo(() => scheme3.SchemeName).Returns("Test3");
            A.CallTo(() => scheme3.CompetentAuthority).Returns(competentAuthority);

            InvoiceRun invoice = A.Fake <InvoiceRun>();

            var memberUpload1 = A.Fake <MemberUpload>();

            A.CallTo(() => memberUpload1.ComplianceYear).Returns(2015);
            A.CallTo(() => memberUpload1.Scheme).Returns(scheme1);
            A.CallTo(() => memberUpload1.InvoiceRun).Returns(invoice);

            var memberUpload2 = A.Fake <MemberUpload>();

            A.CallTo(() => memberUpload2.ComplianceYear).Returns(2017);
            A.CallTo(() => memberUpload2.Scheme).Returns(scheme2);
            A.CallTo(() => memberUpload2.InvoiceRun).Returns(invoice);

            var memberUpload3 = A.Fake <MemberUpload>();

            A.CallTo(() => memberUpload3.ComplianceYear).Returns(2016);
            A.CallTo(() => memberUpload3.Scheme).Returns(scheme3);
            A.CallTo(() => memberUpload3.InvoiceRun).Returns(invoice);

            ICommonDataAccess dataAccess = A.Fake <ICommonDataAccess>();

            A.CallTo(() => dataAccess.FetchInvoicedMemberUploadsAsync(competentAuthority))
            .Returns(new List <MemberUpload>()
            {
                memberUpload1,
                memberUpload2,
                memberUpload3
            });
            IWeeeAuthorization authorization = AuthorizationBuilder.CreateUserWithAllRights();

            FetchComplianceYearsWithInvoicesHandler handler = new FetchComplianceYearsWithInvoicesHandler(authorization, dataAccess);

            Requests.Charges.FetchComplianceYearsWithInvoices request = new Requests.Charges.FetchComplianceYearsWithInvoices(CompetentAuthority.England);
            A.CallTo(() => dataAccess.FetchCompetentAuthority(CompetentAuthority.England)).Returns(competentAuthority);

            // Act
            var yearsList = await handler.HandleAsync(request);

            Assert.NotNull(yearsList);
            Assert.Equal(3, yearsList.Count);
            Assert.Collection(yearsList,
                              r1 => Assert.Equal("2017", r1.ToString()),
                              r2 => Assert.Equal("2016", r2.ToString()),
                              r3 => Assert.Equal("2015", r3.ToString()));
        }
        public async Task <IbisFileGeneratorResult <TransactionFile> > CreateAsync(ulong fileID, InvoiceRun invoiceRun)
        {
            TransactionFile transactionFile = new TransactionFile("WEE", fileID);

            var errors = new List <Exception>();
            var groups = invoiceRun.MemberUploads.GroupBy(mu => mu.Scheme);

            foreach (var group in groups)
            {
                List <InvoiceLineItem> lineItems = new List <InvoiceLineItem>();
                var lineItemErrors = new List <Exception>();

                foreach (MemberUpload memberUpload in group)
                {
                    var submittedDate = memberUpload.SubmittedDate.Value;
                    var competantAuthorityAnnualChargeAmount = memberUpload.Scheme.CompetentAuthority.AnnualChargeAmount;

                    var description = string.Format("{0}.", CommonMessage(submittedDate));

                    if (memberUpload.HasAnnualCharge && competantAuthorityAnnualChargeAmount > 0)
                    {
                        description = string.Format("{0} and the {1} annual charge.", CommonMessage(submittedDate), competantAuthorityAnnualChargeAmount.Value.ToString("#,##0.00"));
                    }

                    try
                    {
                        InvoiceLineItem lineItem = new InvoiceLineItem(
                            memberUpload.TotalCharges,
                            description);

                        lineItems.Add(lineItem);
                    }
                    catch (Exception ex)
                    {
                        lineItemErrors.Add(new SchemeFieldException(group.Key, ex));
                    }
                }

                errors.AddRange(lineItemErrors);

                string transactionReference = await transactionReferenceGenerator.GetNextTransactionReferenceAsync();

                if (lineItemErrors.Count == 0)
                {
                    try
                    {
                        Invoice invoice = new Invoice(
                            group.Key.IbisCustomerReference,
                            invoiceRun.IssuedDate,
                            TransactionType.Invoice,
                            transactionReference,
                            lineItems);

                        transactionFile.AddInvoice(invoice);
                    }
                    catch (Exception ex)
                    {
                        errors.Add(new SchemeFieldException(group.Key, ex));
                    }
                }
            }

            return(new IbisFileGeneratorResult <TransactionFile>(errors.Count == 0 ? transactionFile : null, errors));
        }
Ejemplo n.º 55
0
        public void Constuctor_Always_SetsIssuedDateToNowUtc()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Scheme scheme = A.Fake<Scheme>();
            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            MemberUpload memberUpload1 = new MemberUpload(new Guid("A2A01A99-A97D-4219-9060-D7CDF7435114"), scheme, "data", "filename");
            memberUpload1.Submit(A.Dummy<User>());
            memberUploads.Add(memberUpload1);

            // Act
            SystemTime.Freeze(new DateTime(2015, 1, 1));
            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());
            SystemTime.Unfreeze();

            // Assert
            Assert.Equal(new DateTime(2015, 1, 1), invoiceRun.IssuedDate);
        }
        public async Task CreateCustomerFile_WithNonUkAddress_ConcatenatesPostCodeAndCountry()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Address address = new Address(
                "1 High Street",
                null,
                "Some town",
                "Some county",
                "AABB",
                new Country(Guid.NewGuid(), "Netherlands"),
                "01234 567890",
                "*****@*****.**");

            Contact contact = new Contact("John", "Smith", "Manager");

            Organisation organisation = Organisation.CreateSoleTrader("Test organisation");
            organisation.AddOrUpdateAddress(AddressType.OrganisationAddress, address);
            organisation.AddOrUpdateMainContactPerson(contact);

            Scheme scheme = new Scheme(organisation);
            scheme.UpdateScheme(
                "Test scheme",
                "WEE/AA1111AA/SCH",
                "WEE00000001",
                A.Dummy<ObligationType>(),
                authority);

            int complianceYear = A.Dummy<int>();

            MemberUpload memberUpload = new MemberUpload(
                A.Dummy<Guid>(),
                A.Dummy<string>(),
                A.Dummy<List<MemberUploadError>>(),
                A.Dummy<decimal>(),
                complianceYear,
                scheme,
                A.Dummy<string>());

            memberUpload.Submit(A.Dummy<User>());

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            memberUploads.Add(memberUpload);

            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, A.Dummy<User>());

            BySchemeCustomerFileGenerator generator = new BySchemeCustomerFileGenerator();

            // Act
            var result = await generator.CreateAsync(0, invoiceRun);
            CustomerFile customerFile = result.IbisFile;

            // Assert
            Assert.NotNull(customerFile);
            Assert.Equal(1, customerFile.Customers.Count);

            Customer customer = customerFile.Customers[0];
            Assert.Equal("AABB  Netherlands", customer.Address.PostCode);
        }
Ejemplo n.º 57
0
        public void Constuctor_Always_SetsIssuedByUserToIssuingUser()
        {
            // Arrange
            UKCompetentAuthority authority = A.Dummy<UKCompetentAuthority>();

            Scheme scheme = A.Fake<Scheme>();
            A.CallTo(() => scheme.CompetentAuthority).Returns(authority);

            List<MemberUpload> memberUploads = new List<MemberUpload>();
            MemberUpload memberUpload1 = new MemberUpload(new Guid("A2A01A99-A97D-4219-9060-D7CDF7435114"), scheme, "data", "filename");
            memberUpload1.Submit(A.Dummy<User>());
            memberUploads.Add(memberUpload1);

            User user = A.Dummy<User>();

            // Act
            InvoiceRun invoiceRun = new InvoiceRun(authority, memberUploads, user);

            // Assert
            Assert.Equal(user, invoiceRun.IssuedByUser);
        }
Ejemplo n.º 58
0
        /// <summary>
        /// Assigns the member upload to the specified invoice run.
        /// </summary>
        /// <param name="invoiceRun"></param>
        internal void AssignToInvoiceRun(InvoiceRun invoiceRun)
        {
            Guard.ArgumentNotNull(() => invoiceRun, invoiceRun);

            if (InvoiceRun != null)
            {
                string errorMessage = "Once a member upload has been assigned to an invoice run, it cannot be reassigned.";
                throw new InvalidOperationException(errorMessage);
            }

            if (!IsSubmitted)
            {
                string errorMessage = "An unsubmitted member upload cannot be assigned to an invoice run.";
                throw new InvalidOperationException(errorMessage);
            }

            InvoiceRun = invoiceRun;

            foreach (var producer in ProducerSubmissions)
            {
                if (!producer.RegisteredProducer.Removed)
                {
                    producer.SetAsInvoiced();
                }
            }
        }