private static TouchpointProviderFundingData TestProvider()
        {
            var provider = new TouchpointProviderFundingData
            {
                Provider = new TouchpointProvider {
                    UKPRN = 10001647, TouchpointId = "0000000101"
                },
                FundingValues = TestFundingValues()
            };

            return(provider);
        }
        public ICollection <SummarisedActual> Summarise(
            ICollection <FundingStream> fundingStreams,
            TouchpointProviderFundingData provider,
            ICollection <FcsContractAllocation> allocations,
            ICollection <CollectionPeriod> collectionPeriods)
        {
            var summarisedActuals = new List <SummarisedActual>();

            foreach (var fs in fundingStreams)
            {
                var fundingStreamSummarisedActuals = Summarise(fs, provider, allocations, collectionPeriods);

                summarisedActuals.AddRange(fundingStreamSummarisedActuals);
            }

            return(summarisedActuals);
        }
        public ICollection <SummarisedActual> Summarise(
            FundingStream fundingStream,
            TouchpointProviderFundingData providerFundingData,
            ICollection <FcsContractAllocation> allocations,
            ICollection <CollectionPeriod> collectionPeriods)
        {
            var summarisedActuals = new List <SummarisedActual>();

            var fcsAllocation = allocations.FirstOrDefault(a => a.DeliveryUkprn == providerFundingData.Provider.UKPRN &&
                                                           a.UoPcode.Equals(providerFundingData.Provider.TouchpointId, StringComparison.OrdinalIgnoreCase) &&
                                                           a.FundingStreamPeriodCode.Equals(fundingStream.PeriodCode, StringComparison.OrdinalIgnoreCase));

            if (fcsAllocation == null)
            {
                return(summarisedActuals);
            }

            foreach (var outcomeType in fundingStream.OutcomeTypes)
            {
                var fundingValues = providerFundingData
                                    .FundingValues
                                    .Where(ld => ld.OutcomeType == outcomeType).ToList();

                summarisedActuals.AddRange(SummarisePeriods(fundingValues, collectionPeriods));
            }

            return(summarisedActuals
                   .GroupBy(grp => grp.Period)
                   .Select(g =>
                           new SummarisedActual
            {
                OrganisationId = fcsAllocation.DeliveryOrganisation,
                UoPCode = fcsAllocation.UoPcode,
                DeliverableCode = fundingStream.DeliverableLineCode,
                FundingStreamPeriodCode = fundingStream.PeriodCode,
                Period = g.Key,
                ActualValue = Math.Round(g.Sum(x => x.ActualValue), 2),
                ContractAllocationNumber = fcsAllocation.ContractAllocationNumber,
                PeriodTypeCode = PeriodTypeCodeConstants.CalendarMonth
            }).ToList());
        }