public async Task Build_ExistingLatestSubmittedDataReturnVersion_WithAllExistingWeeeCollectedAmounts_ReturnsDataReturnVersionWithExistingWeeeCollectedReturnVersion()
        {
            var weeeCollectedReturnVersion = new WeeeCollectedReturnVersion();

            weeeCollectedReturnVersion.AddWeeeCollectedAmount(
                new WeeeCollectedAmount(WeeeCollectedAmountSourceType.Dcf, ObligationType.B2C, WeeeCategory.ConsumerEquipment, 100));

            var dataReturn        = new DataReturn(A.Dummy <Scheme>(), A.Dummy <Quarter>());
            var dataReturnVersion = new DataReturnVersion(dataReturn, weeeCollectedReturnVersion,
                                                          A.Dummy <WeeeDeliveredReturnVersion>(), A.Dummy <EeeOutputReturnVersion>());

            dataReturn.SetCurrentVersion(dataReturnVersion);

            var helper = new DataReturnVersionBuilderHelper();

            A.CallTo(() => helper.DataAccess.FetchDataReturnOrDefault())
            .Returns(dataReturn);

            var builder = helper.Create();
            await builder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.Dcf, WeeeCategory.ConsumerEquipment, ObligationType.B2C, 100);

            var result = await builder.Build();

            Assert.Same(weeeCollectedReturnVersion, result.DataReturnVersion.WeeeCollectedReturnVersion);
        }
        public void AddWeeeCollectedAmount_AddsToWeeeCollectedAmounts()
        {
            // Arrange
            var collectedReturnVersion = new WeeeCollectedReturnVersion();
            var amount = new WeeeCollectedAmount(
                A.Dummy <WeeeCollectedAmountSourceType>(), ObligationType.B2B, A.Dummy <WeeeCategory>(), A.Dummy <decimal>());

            // Act
            collectedReturnVersion.AddWeeeCollectedAmount(amount);

            // Assert
            Assert.Contains(amount, collectedReturnVersion.WeeeCollectedAmounts);
        }
        private WeeeCollectedReturnVersion BuildWeeeCollectedReturnVersion(DataReturnVersion submittedDataReturnVersion)
        {
            WeeeCollectedReturnVersion weeeCollectedReturnVersion = null;

            // Unchanged data from the latest submitted data return version can be reused. Check whether all or some of them can be reused.
            if (weeeCollectedAmounts.Any())
            {
                ICollection <WeeeCollectedAmount> mergedWeeeCollectedAmounts;
                bool reuseLatestWeeeCollectedReturnVersion = false;

                if (submittedDataReturnVersion != null &&
                    submittedDataReturnVersion.WeeeCollectedReturnVersion != null)
                {
                    reuseLatestWeeeCollectedReturnVersion =
                        ReuseEqualItems(weeeCollectedAmounts, submittedDataReturnVersion.WeeeCollectedReturnVersion.WeeeCollectedAmounts, out mergedWeeeCollectedAmounts);
                }
                else
                {
                    mergedWeeeCollectedAmounts = weeeCollectedAmounts;
                }

                if (reuseLatestWeeeCollectedReturnVersion)
                {
                    weeeCollectedReturnVersion = submittedDataReturnVersion.WeeeCollectedReturnVersion;
                }
                else
                {
                    weeeCollectedReturnVersion = new WeeeCollectedReturnVersion();
                    foreach (var weeeCollectedAmount in mergedWeeeCollectedAmounts)
                    {
                        weeeCollectedReturnVersion.AddWeeeCollectedAmount(weeeCollectedAmount);
                    }
                }
            }

            return(weeeCollectedReturnVersion);
        }
        public async Task Build_ExistingLatestSubmittedDataReturnVersion_WithSomeExistingWeeeCollectedAmounts_ReturnsDataReturnVersionWithExistingWeeeCollectedAmounts()
        {
            var weeeCollectedAmount1 = new WeeeCollectedAmount(WeeeCollectedAmountSourceType.Dcf, ObligationType.B2C, WeeeCategory.DisplayEquipment, 100);
            var weeeCollectedAmount2 = new WeeeCollectedAmount(WeeeCollectedAmountSourceType.Dcf, ObligationType.B2C, WeeeCategory.ConsumerEquipment, 100);
            var weeeCollectedAmount3 = new WeeeCollectedAmount(WeeeCollectedAmountSourceType.Distributor, ObligationType.B2C, WeeeCategory.ConsumerEquipment, 100);
            var weeeCollectedAmount4 = new WeeeCollectedAmount(WeeeCollectedAmountSourceType.FinalHolder, ObligationType.B2C, WeeeCategory.ConsumerEquipment, 100);

            var weeeCollectedReturnVersion = new WeeeCollectedReturnVersion();
            weeeCollectedReturnVersion.AddWeeeCollectedAmount(weeeCollectedAmount1);
            weeeCollectedReturnVersion.AddWeeeCollectedAmount(weeeCollectedAmount2);
            weeeCollectedReturnVersion.AddWeeeCollectedAmount(weeeCollectedAmount3);
            weeeCollectedReturnVersion.AddWeeeCollectedAmount(weeeCollectedAmount4);

            var dataReturn = new DataReturn(A.Dummy<Scheme>(), A.Dummy<Quarter>());
            var dataReturnVersion = new DataReturnVersion(dataReturn, weeeCollectedReturnVersion,
                A.Dummy<WeeeDeliveredReturnVersion>(), A.Dummy<EeeOutputReturnVersion>());
            dataReturn.SetCurrentVersion(dataReturnVersion);

            var helper = new DataReturnVersionBuilderHelper();

            A.CallTo(() => helper.DataAccess.FetchDataReturnOrDefault())
               .Returns(dataReturn);

            var builder = helper.Create();
            await builder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.Dcf, WeeeCategory.ConsumerEquipment, ObligationType.B2C, 100);
            await builder.AddWeeeCollectedAmount(WeeeCollectedAmountSourceType.Distributor, WeeeCategory.ConsumerEquipment, ObligationType.B2C, 100);

            var result = await builder.Build();

            Assert.NotSame(weeeCollectedReturnVersion, result.DataReturnVersion.WeeeCollectedReturnVersion);
            Assert.Collection(result.DataReturnVersion.WeeeCollectedReturnVersion.WeeeCollectedAmounts,
                r1 => Assert.Same(weeeCollectedAmount2, r1),
                r2 => Assert.Same(weeeCollectedAmount3, r2));
        }