Пример #1
0
        public void Condense_NullLearners()
        {
            var globalOne = new FM35Global()
            {
                Learners = null
            };

            var globalTwo = new FM35Global()
            {
                Learners = null
            };

            var globalThree = new FM35Global()
            {
                Learners = null
            };

            var fundingOutputs = new List <FM35Global>()
            {
                globalOne,
                globalTwo,
                globalThree,
            };

            var fundingOutput = NewService().Condense(fundingOutputs);

            fundingOutput.Should().Be(globalOne);
            fundingOutput.Learners.Should().BeEmpty();
        }
        private async Task <IList <SummaryOfFm35FundingModel> > GetSummaryOfFm35FundingModels(IReportServiceContext reportServiceContext, CancellationToken cancellationToken)
        {
            Task <FM35Global> fm35Task = _fm35ProviderService.GetFM35Data(reportServiceContext, cancellationToken);

            await Task.WhenAll(fm35Task);

            cancellationToken.ThrowIfCancellationRequested();

            List <SummaryOfFm35FundingModel> summaryOfFm35FundingModels = new List <SummaryOfFm35FundingModel>();

            FM35Global fm35Data = fm35Task.Result;

            if (fm35Data?.Learners == null)
            {
                _logger.LogWarning($"No Fm35 data for {nameof(SummaryOfFm35FundingReport)}");
                return(summaryOfFm35FundingModels);
            }

            foreach (FM35Learner learnerAttribute in fm35Data.Learners)
            {
                foreach (LearningDelivery fundLineData in learnerAttribute.LearningDeliveries)
                {
                    summaryOfFm35FundingModels.AddRange(_summaryOfFm35FundingModelBuilder.BuildModel(fundLineData));
                }
            }

            summaryOfFm35FundingModels.Sort(comparer);
            return(summaryOfFm35FundingModels);
        }
 public IEnumerable <FM35_Learner> MapLearners(FM35Global fm35Global)
 {
     return(fm35Global.Learners.Select(l => new FM35_Learner
     {
         UKPRN = fm35Global.UKPRN,
         LearnRefNumber = l.LearnRefNumber
     }));
 }
Пример #4
0
        public void Condense_EmptyCollection()
        {
            var global = new FM35Global
            {
                UKPRN     = 1,
                CurFundYr = "1920"
            };

            NewService().Condense(Enumerable.Empty <FM35Global>(), 1, "1920").Should().BeEquivalentTo(global);
        }
Пример #5
0
        public async Task <string> Process(FundingDto actorModel, CancellationToken cancellationToken)
        {
            FM35Global results = RunFunding(actorModel, cancellationToken);

            actorModel = null;

            GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true);

            return(BuildFundingOutput(results));
        }
Пример #6
0
        public async Task GetFM35DataTest()
        {
            string fm35OutputKey = "FundingFm35OutputEmpty.json";

            Mock <ILogger> logger = new Mock <ILogger>();
            Mock <IStreamableKeyValuePersistenceService> redis = new Mock <IStreamableKeyValuePersistenceService>();
            IJsonSerializationService jsonSerializationService = new JsonSerializationService();
            IIntUtilitiesService      intUtilitiesService      = new IntUtilitiesService();
            DataStoreConfiguration    dataStoreConfiguration   = new DataStoreConfiguration()
            {
                ILRDataStoreConnectionString      = string.Empty,
                ILRDataStoreValidConnectionString = string.Empty
            };

            IIlr1819ValidContext IlrValidContextFactory()
            {
                var options = new DbContextOptionsBuilder <ILR1819_DataStoreEntitiesValid>().UseSqlServer(dataStoreConfiguration.ILRDataStoreValidConnectionString).Options;

                return(new ILR1819_DataStoreEntitiesValid(options));
            }

            IIlr1819RulebaseContext IlrRulebaseContextFactory()
            {
                var options = new DbContextOptionsBuilder <ILR1819_DataStoreEntities>().UseSqlServer(dataStoreConfiguration.ILRDataStoreConnectionString).Options;

                return(new ILR1819_DataStoreEntities(options));
            }

            Mock <IReportServiceContext> reportServiceContextMock = new Mock <IReportServiceContext>();

            reportServiceContextMock.SetupGet(x => x.JobId).Returns(1);
            reportServiceContextMock.SetupGet(x => x.SubmissionDateTimeUtc).Returns(DateTime.UtcNow);
            reportServiceContextMock.SetupGet(x => x.Ukprn).Returns(10033670);
            reportServiceContextMock.SetupGet(x => x.Filename).Returns("ILR-10033670-1819-20180704-120055-03");
            reportServiceContextMock.SetupGet(x => x.FundingFM35OutputKey).Returns(fm35OutputKey);
            reportServiceContextMock.SetupGet(x => x.CollectionName).Returns("ILR1819");

            redis.Setup(x => x.ContainsAsync(fm35OutputKey, It.IsAny <CancellationToken>())).ReturnsAsync(true);
            redis.Setup(x => x.GetAsync(fm35OutputKey, It.IsAny <Stream>(), It.IsAny <CancellationToken>())).Callback <string, Stream, CancellationToken>((st, sr, ct) => File.OpenRead(@"Service\FundingFm35OutputEmpty.json").CopyTo(sr)).Returns(Task.CompletedTask);

            FM35ProviderService fm35ProviderService = new FM35ProviderService(
                logger.Object,
                redis.Object,
                jsonSerializationService,
                intUtilitiesService,
                IlrValidContextFactory,
                IlrRulebaseContextFactory);

            FM35Global fm35Data = await fm35ProviderService.GetFM35Data(reportServiceContextMock.Object, CancellationToken.None);

            fm35Data.Learners.Should().BeNullOrEmpty();
        }
        public void MapData(IDataStoreCache cache, FM35Global fm35Global)
        {
            var learners = fm35Global?.Learners;

            if (learners == null)
            {
                return;
            }

            var ukprn = fm35Global.UKPRN;

            PopulateDataStoreCache(cache, learners, fm35Global, ukprn);
        }
Пример #8
0
        public void Condense()
        {
            var learnerOne   = new FM35Learner();
            var learnerTwo   = new FM35Learner();
            var learnerThree = new FM35Learner();
            var learnerFour  = new FM35Learner();
            var learnerFive  = new FM35Learner();
            var learnerSix   = new FM35Learner();

            var globalOne = new FM35Global()
            {
                Learners = new List <FM35Learner>()
                {
                    learnerOne,
                    learnerTwo,
                },
            };

            var globalTwo = new FM35Global()
            {
                Learners = new List <FM35Learner>
                {
                    learnerThree,
                    learnerFour,
                },
            };

            var globalThree = new FM35Global()
            {
                Learners = new List <FM35Learner>
                {
                    learnerFive,
                    learnerSix,
                },
            };

            var fundingOutputs = new List <FM35Global>()
            {
                globalOne,
                globalTwo,
                globalThree,
            };

            var fundingOutput = NewService().Condense(fundingOutputs);

            fundingOutput.Should().Be(globalOne);
            fundingOutput.Learners.Should().HaveCount(6);
            fundingOutput.Learners.Should().Contain(new[] { learnerOne, learnerTwo, learnerThree, learnerFour, learnerFive, learnerSix });
        }
        public FM35Data MapData(FM35Global fm35Global)
        {
            var data = new FM35Data();

            if (fm35Global.Learners != null)
            {
                data.Globals                          = MapGlobals(fm35Global).ToList();
                data.Learners                         = MapLearners(fm35Global).ToList();
                data.LearningDeliveries               = MapLearningDeliveries(fm35Global).ToList();
                data.LearningDeliveryPeriods          = MapLearningDeliveryPeriods(fm35Global).ToList();
                data.LearningDeliveryPeriodisedValues = MapLearningDeliveryPeriodisedValues(fm35Global).ToList();
            }

            return(data);
        }
 public IEnumerable <FM35_global> MapGlobals(FM35Global fm35Global)
 {
     return(new List <FM35_global>()
     {
         new FM35_global
         {
             CurFundYr = fm35Global.CurFundYr,
             LARSVersion = fm35Global.LARSVersion,
             UKPRN = fm35Global.UKPRN,
             RulebaseVersion = fm35Global.RulebaseVersion,
             OrgVersion = fm35Global.OrgVersion,
             PostcodeDisadvantageVersion = fm35Global.PostcodeDisadvantageVersion
         }
     });
 }
 public List <FM35_global> BuildGlobals(FM35Global fm35Global, int ukprn)
 {
     return(new List <FM35_global>()
     {
         new FM35_global
         {
             CurFundYr = fm35Global.CurFundYr,
             LARSVersion = fm35Global.LARSVersion,
             UKPRN = ukprn,
             RulebaseVersion = fm35Global.RulebaseVersion,
             OrgVersion = fm35Global.OrgVersion,
             PostcodeDisadvantageVersion = fm35Global.PostcodeDisadvantageVersion
         }
     });
 }
Пример #12
0
        public FundingSummaryModel BuildWithFundLine(string title, FM35Global fm35Global, List <string> validLearners, string[] fundLines, string[] attributes, int period)
        {
            FundingSummaryModel fundingSummaryModel = new FundingSummaryModel(title);

            if (fm35Global?.Learners == null || validLearners == null)
            {
                return(fundingSummaryModel);
            }

            LearningDelivery[] learningDeliveries = _cacheProviderService.Get(fundLines.GetHashCode());
            if (learningDeliveries == null)
            {
                FM35Learner[] learners = fm35Global.Learners.Where(x => validLearners.Contains(x.LearnRefNumber)).ToArray();

                learningDeliveries = learners.SelectMany(x => x.LearningDeliveries).Where(x => fundLines.Contains(x.LearningDeliveryValue.FundLine)).ToArray();

                _cacheProviderService.Set(fundLines.GetHashCode(), learningDeliveries);
            }

            LearningDeliveryPeriodisedValue[] periodisedValues = learningDeliveries.SelectMany(x => x.LearningDeliveryPeriodisedValues)
                                                                 .Where(x => attributes.Contains(x.AttributeName)).ToArray();

            fundingSummaryModel.Period1  = periodisedValues.Sum(x => x.Period1 ?? 0);
            fundingSummaryModel.Period2  = periodisedValues.Sum(x => x.Period2 ?? 0);
            fundingSummaryModel.Period3  = periodisedValues.Sum(x => x.Period3 ?? 0);
            fundingSummaryModel.Period4  = periodisedValues.Sum(x => x.Period4 ?? 0);
            fundingSummaryModel.Period5  = periodisedValues.Sum(x => x.Period5 ?? 0);
            fundingSummaryModel.Period6  = periodisedValues.Sum(x => x.Period6 ?? 0);
            fundingSummaryModel.Period7  = periodisedValues.Sum(x => x.Period7 ?? 0);
            fundingSummaryModel.Period8  = periodisedValues.Sum(x => x.Period8 ?? 0);
            fundingSummaryModel.Period9  = periodisedValues.Sum(x => x.Period9 ?? 0);
            fundingSummaryModel.Period10 = periodisedValues.Sum(x => x.Period10 ?? 0);
            fundingSummaryModel.Period11 = periodisedValues.Sum(x => x.Period11 ?? 0);
            fundingSummaryModel.Period12 = periodisedValues.Sum(x => x.Period12 ?? 0);

            fundingSummaryModel.Period1_8 =
                fundingSummaryModel.Period1 + fundingSummaryModel.Period2 + fundingSummaryModel.Period3 +
                fundingSummaryModel.Period4 + fundingSummaryModel.Period5 + fundingSummaryModel.Period6 +
                fundingSummaryModel.Period7 + fundingSummaryModel.Period8;
            fundingSummaryModel.Period9_12 =
                fundingSummaryModel.Period9 + fundingSummaryModel.Period10 + fundingSummaryModel.Period11 +
                fundingSummaryModel.Period12;

            fundingSummaryModel.YearToDate = GetYearToDate(fundingSummaryModel, period - 1);
            fundingSummaryModel.Total      = GetYearToDate(fundingSummaryModel, 12);

            return(fundingSummaryModel);
        }
 public FM35ProviderService(
     ILogger logger,
     IStreamableKeyValuePersistenceService storage,
     IJsonSerializationService jsonSerializationService,
     IIntUtilitiesService intUtilitiesService,
     Func <IIlr1819ValidContext> ilrValidContextFactory,
     Func <IIlr1819RulebaseContext> ilrRulebaseContextFactory)
 {
     _logger  = logger;
     _storage = storage;
     _jsonSerializationService  = jsonSerializationService;
     _intUtilitiesService       = intUtilitiesService;
     _ilrValidContextFactory    = ilrValidContextFactory;
     _ilrRulebaseContextFactory = ilrRulebaseContextFactory;
     _fundingOutputs            = null;
     _getDataLock = new SemaphoreSlim(1, 1);
 }
Пример #14
0
        public async Task Execute()
        {
            var cancellationToken         = CancellationToken.None;
            var fundingServiceContextMock = new Mock <IFundingServiceContext>();

            fundingServiceContextMock.Setup(f => f.JobId).Returns(1);
            fundingServiceContextMock.Setup(f => f.Container).Returns("Container");
            fundingServiceContextMock.Setup(f => f.FundingFm36OutputKey).Returns("Key");
            fundingServiceContextMock.Setup(f => f.Ukprn).Returns(12345678);
            fundingServiceContextMock.Setup(f => f.Year).Returns("1920");

            IEnumerable <FundingDto> fundingActorDtos = new List <FundingDto>
            {
                new FundingDto()
            };

            var FM35Actor       = new Mock <IFM35Actor>();
            var condenserOutput = new FM35Global();

            var jsonSerializationServiceMock      = new Mock <IJsonSerializationService>();
            var fundingActorProviderMock          = new Mock <IActorProvider <IFM35Actor> >();
            var filePersistanceServiceMock        = new Mock <IFilePersistanceService>();
            var fundingOutputCondenserServiceMock = new Mock <IFundingOutputCondenserService <FM35Global> >();
            var loggerMock = new Mock <ILogger>();

            FM35Actor.Setup(a => a.Process(fundingActorDtos.FirstOrDefault(), cancellationToken)).Returns(() => Task <string> .Factory.StartNew(() => "string"));
            jsonSerializationServiceMock.Setup(sm => sm.Deserialize <FM35Global>(It.IsAny <string>())).Returns(new FM35Global()).Verifiable();
            fundingActorProviderMock.Setup(pm => pm.Provide()).Returns(FM35Actor.Object).Verifiable();
            filePersistanceServiceMock.Setup(sm => sm.PersistAsync(fundingServiceContextMock.Object.FundingFm35OutputKey, fundingServiceContextMock.Object.Container, condenserOutput, cancellationToken)).Returns(Task.CompletedTask).Verifiable();
            fundingOutputCondenserServiceMock.Setup(sm => sm.Condense(
                                                        It.IsAny <IEnumerable <FM35Global> >(),
                                                        fundingServiceContextMock.Object.Ukprn,
                                                        fundingServiceContextMock.Object.Year)).Returns(condenserOutput).Verifiable();

            await NewTask(
                jsonSerializationServiceMock.Object,
                fundingActorProviderMock.Object,
                filePersistanceServiceMock.Object,
                fundingOutputCondenserServiceMock.Object,
                loggerMock.Object,
                "FM35Actor").Execute(fundingActorDtos, fundingServiceContextMock.Object, cancellationToken);

            fundingActorProviderMock.VerifyAll();
            filePersistanceServiceMock.VerifyAll();
            fundingOutputCondenserServiceMock.VerifyAll();
        }
        public void MapFM35()
        {
            var fundLine1 = "FundLine1";
            var fundLine2 = "FundLine2";

            var attribute1 = "Attribute1";
            var attribute2 = "Attribute2";

            var global = new FM35Global()
            {
                Learners = Enumerable.Range(0, 1000)
                           .Select(i => new FM35Learner()
                {
                    LearningDeliveries = Enumerable.Range(0, 3)
                                         .Select(j => new LearningDelivery()
                    {
                        LearningDeliveryValue = new LearningDeliveryValue()
                        {
                            FundLine = j % 2 == 0 ? fundLine1 : fundLine2
                        },
                        LearningDeliveryPeriodisedValues = Enumerable.Range(0, 16)
                                                           .Select(k => new LearningDeliveryPeriodisedValue()
                        {
                            AttributeName = k % 2 == 0 ? attribute1 : attribute2
                        }).ToList(),
                    }).ToList(),
                }).ToList()
            };

            var mapped = NewProvider().BuildFm35Dictionary(global);

            mapped.Should().HaveCount(2);

            mapped[fundLine1].Should().HaveCount(2);
            mapped[fundLine2].Should().HaveCount(2);

            mapped[fundLine1][attribute1].Should().HaveCount(16000);
            mapped[fundLine1][attribute2].Should().HaveCount(16000);

            mapped[fundLine2][attribute1].Should().HaveCount(8000);
            mapped[fundLine2][attribute2].Should().HaveCount(8000);
        }
        public IEnumerable <FM35_LearningDelivery_Period> MapLearningDeliveryPeriods(FM35Global fm35Global)
        {
            var periodisedValues = fm35Global.Learners
                                   .SelectMany(l => l.LearningDeliveries.Select(ld =>
                                                                                new FundModelLearningDeliveryPeriodisedValue <List <LearningDeliveryPeriodisedValue> >(fm35Global.UKPRN, l.LearnRefNumber, ld.AimSeqNumber.Value, ld.LearningDeliveryPeriodisedValues)));

            var learningDeliveryPeriods = new List <FM35_LearningDelivery_Period>();

            for (var i = 1; i < 13; i++)
            {
                learningDeliveryPeriods.AddRange(
                    periodisedValues.Select(pv =>
                                            new FM35_LearningDelivery_Period
                {
                    UKPRN                  = pv.Ukprn,
                    LearnRefNumber         = pv.LearnRefNumber,
                    AimSeqNumber           = pv.AimSeqNumber,
                    Period                 = i,
                    AchievePayPct          = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.AchievePayPct), i),
                    AchievePayPctTrans     = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.AchievePayPctTrans), i),
                    AchievePayment         = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.AchievePayment), i),
                    BalancePayment         = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.BalancePayment), i),
                    BalancePaymentUncapped = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.BalancePaymentUncapped), i),
                    BalancePct             = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.BalancePct), i),
                    BalancePctTrans        = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.BalancePctTrans), i),
                    EmpOutcomePay          = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.EmpOutcomePay), i),
                    EmpOutcomePct          = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.EmpOutcomePct), i),
                    EmpOutcomePctTrans     = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.EmpOutcomePctTrans), i),
                    InstPerPeriod          = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, int?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.InstPerPeriod), i),
                    LearnSuppFund          = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, bool?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.LearnSuppFund), i),
                    LearnSuppFundCash      = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.LearnSuppFundCash), i),
                    OnProgPayment          = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.OnProgPayment), i),
                    OnProgPayPct           = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.OnProgPayPct), i),
                    OnProgPayPctTrans      = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.OnProgPayPctTrans), i),
                    OnProgPaymentUncapped  = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, decimal?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.OnProgPaymentUncapped), i),
                    TransInstPerPeriod     = PeriodisedValueHelper.GetPeriodValue <LearningDeliveryPeriodisedValue, int?>(pv.LearningDeliveryPeriodisedValue.FirstOrDefault(a => a.AttributeName == FM35Constants.TransInstPerPeriod), i)
                }));
            }

            return(learningDeliveryPeriods);
        }
        private static List <FM35LearningDeliveryValues> GetFM35LearningDeliveryPeriodisedValues(FM35Global fm35Global, int ukPrn)
        {
            var result = new List <FM35LearningDeliveryValues>();

            if (fm35Global?.Learners == null)
            {
                return(result);
            }

            foreach (var learner in fm35Global.Learners)
            {
                if (learner.LearningDeliveries == null)
                {
                    continue;
                }

                foreach (var ld in learner.LearningDeliveries)
                {
                    if (ld.LearningDeliveryPeriodisedValues == null)
                    {
                        continue;
                    }

                    foreach (var ldpv in ld.LearningDeliveryPeriodisedValues)
                    {
                        result.Add(new FM35LearningDeliveryValues
                        {
                            AimSeqNumber   = ld.AimSeqNumber ?? 0,
                            LearnRefNumber = learner.LearnRefNumber,
                            AttributeName  = ldpv.AttributeName,
                            Period1        = ldpv.Period1,
                            Period2        = ldpv.Period2,
                            Period3        = ldpv.Period3,
                            Period4        = ldpv.Period4,
                            Period5        = ldpv.Period5,
                            Period6        = ldpv.Period6,
                            Period7        = ldpv.Period7,
                            Period8        = ldpv.Period8,
                            Period9        = ldpv.Period9,
                            Period10       = ldpv.Period10,
                            Period11       = ldpv.Period11,
                            Period12       = ldpv.Period12,
                            UKPRN          = ukPrn,
                            FundLine       = ld.LearningDeliveryValue?.FundLine
                        });
                    }
                }
            }

            return(result);
        }
        public IEnumerable <FM35_LearningDelivery_PeriodisedValue> MapLearningDeliveryPeriodisedValues(FM35Global fm35Global)
        {
            var periodisedValues = fm35Global.Learners
                                   .SelectMany(l => l.LearningDeliveries.Select(ld =>
                                                                                new FundModelLearningDeliveryPeriodisedValue <List <LearningDeliveryPeriodisedValue> >(fm35Global.UKPRN, l.LearnRefNumber, ld.AimSeqNumber.Value, ld.LearningDeliveryPeriodisedValues)));

            return
                (periodisedValues.SelectMany(pv => pv.LearningDeliveryPeriodisedValue
                                             .Select(p =>
                                                     new FM35_LearningDelivery_PeriodisedValue
            {
                UKPRN = pv.Ukprn,
                AimSeqNumber = pv.AimSeqNumber,
                LearnRefNumber = pv.LearnRefNumber,
                AttributeName = p.AttributeName,
                Period_1 = p.Period1,
                Period_2 = p.Period2,
                Period_3 = p.Period3,
                Period_4 = p.Period4,
                Period_5 = p.Period5,
                Period_6 = p.Period6,
                Period_7 = p.Period7,
                Period_8 = p.Period8,
                Period_9 = p.Period9,
                Period_10 = p.Period10,
                Period_11 = p.Period11,
                Period_12 = p.Period12
            })));
        }
        public AdultFundingClaimModel BuildAdultFundingClaimModel(
            ILogger logger,
            IReportServiceContext reportServiceContext,
            FM35Global fm35Global,
            List <EasSubmissionValues> easSubmissionValues,
            ALBGlobal albGlobal,
            string providerName,
            ILRSourceFileInfo ilrSourceFileInfo,
            IDateTimeProvider dateTimeProvider,
            IIntUtilitiesService intUtilitiesService,
            IMessage message,
            IVersionInfo versionInfo,
            string orgData,
            string largeEmployersData,
            string postcodeData,
            string larsData)
        {
            var adultFundingClaimModel = new AdultFundingClaimModel();

            try
            {
                var ilrfileName = reportServiceContext.OriginalFilename ?? reportServiceContext.Filename;

                // FM35
                decimal otherLearningProgramFunding6MonthsFm35       = 0;
                decimal otherLearningProgramFunding12MonthsFm35      = 0;
                decimal otherLearningSupport6MonthsFm35              = 0;
                decimal otherLearningSupport12MonthsFm35             = 0;
                decimal traineeShips1924ProgrammeFunding6MonthsFm35  = 0;
                decimal traineeShips1924ProgrammeFunding12MonthsFm35 = 0;
                decimal traineeShips1924LearningSupport6MonthsFm35   = 0;
                decimal traineeShips1924LearningSupport12MonthsFm35  = 0;

                // EAS
                decimal otherLearningProgramFunding6MonthsEas       = 0;
                decimal otherLearningProgramFunding12MonthsEas      = 0;
                decimal otherLearningSupport6MonthsEas              = 0;
                decimal otherLearningSupport12MonthsEas             = 0;
                decimal traineeShips1924ProgrammeFunding6MonthsEas  = 0;
                decimal traineeShips1924ProgrammeFunding12MonthsEas = 0;
                decimal traineeShips1924LearningSupport6MonthsEas   = 0;
                decimal traineeShips1924LearningSupport12MonthsEas  = 0;
                decimal traineeShips1924LearnerSupport6MonthsEas    = 0;
                decimal traineeShips1924LearnerSupport12MonthsEas   = 0;
                decimal loansAreasCosts6MonthsEas     = 0;
                decimal loansAreasCosts12MonthsEas    = 0;
                decimal loansExcessSupport6MonthsEas  = 0;
                decimal loansExcessSupport12MonthsEas = 0;

                // ALB
                decimal loansBursaryFunding6Months  = 0;
                decimal loansBursaryFunding12Months = 0;
                decimal loansAreaCosts6Months       = 0;
                decimal loansAreaCosts12Months      = 0;

                var ukPrn = reportServiceContext.Ukprn;

                // FM35
                var fm35LearningDeliveryPeriodisedValues = GetFM35LearningDeliveryPeriodisedValues(fm35Global, ukPrn);
                otherLearningProgramFunding6MonthsFm35       = Fm35DeliveryValues6Months(fm35LearningDeliveryPeriodisedValues, new[] { "OnProgPayment", "BalancePayment", "AchievePayment", "EmpOutcomePay" }, new[] { "AEB - Other Learning", "AEB - Other Learning (non-procured)" });
                otherLearningProgramFunding12MonthsFm35      = Fm35DeliveryValues12Months(fm35LearningDeliveryPeriodisedValues, new[] { "OnProgPayment", "BalancePayment", "AchievePayment", "EmpOutcomePay" }, new[] { "AEB - Other Learning", "AEB - Other Learning (non-procured)" });
                otherLearningSupport6MonthsFm35              = Fm35DeliveryValues6Months(fm35LearningDeliveryPeriodisedValues, new[] { "LearnSuppFundCash" }, new[] { "AEB - Other Learning", "AEB - Other Learning (non-procured)" });
                otherLearningSupport12MonthsFm35             = Fm35DeliveryValues12Months(fm35LearningDeliveryPeriodisedValues, new[] { "LearnSuppFundCash" }, new[] { "AEB - Other Learning", "AEB - Other Learning (non-procured)" });
                traineeShips1924ProgrammeFunding6MonthsFm35  = Fm35DeliveryValues6Months(fm35LearningDeliveryPeriodisedValues, new[] { "OnProgPayment", "BalancePayment", "AchievePayment", "EmpOutcomePay" }, new[] { "19-24 Traineeship’", "19-24 Traineeship (non-procured)" });
                traineeShips1924ProgrammeFunding12MonthsFm35 = Fm35DeliveryValues12Months(fm35LearningDeliveryPeriodisedValues, new[] { "OnProgPayment", "BalancePayment", "AchievePayment", "EmpOutcomePay" }, new[] { "19-24 Traineeship’", "19-24 Traineeship (non-procured)" });
                traineeShips1924LearningSupport6MonthsFm35   = Fm35DeliveryValues6Months(fm35LearningDeliveryPeriodisedValues, new[] { "LearnSuppFundCash" }, new[] { "19-24 Traineeship’", "19-24 Traineeship (non-procured)" });
                traineeShips1924LearningSupport12MonthsFm35  = Fm35DeliveryValues12Months(fm35LearningDeliveryPeriodisedValues, new[] { "LearnSuppFundCash" }, new[] { "19-24 Traineeship’", "19-24 Traineeship (non-procured)" });

                // ALB
                var albLearningDeliveryPeriodisedValues = GetAlbLearningDeliveryPeriodisedValues(albGlobal, ukPrn);
                loansBursaryFunding6Months  = AlbDeliveryValues6Months(albLearningDeliveryPeriodisedValues, new[] { "ALBSupportPayment" }, new[] { "Advanced Learner Loans Bursary" });
                loansBursaryFunding12Months = AlbDeliveryValues12Months(albLearningDeliveryPeriodisedValues, new[] { "ALBSupportPayment" }, new[] { "Advanced Learner Loans Bursary" });
                loansAreaCosts6Months       = AlbDeliveryValues6Months(albLearningDeliveryPeriodisedValues, new[] { "AreaUpliftBalPayment", "AreaUpliftOnProgPayment" }, new[] { "Advanced Learner Loans Bursary" });
                loansAreaCosts12Months      = AlbDeliveryValues12Months(albLearningDeliveryPeriodisedValues, new[] { "AreaUpliftBalPayment", "AreaUpliftOnProgPayment" }, new[] { "Advanced Learner Loans Bursary" });

                // EAS

                otherLearningProgramFunding6MonthsEas = easSubmissionValues.Where(x => new[] { "Authorised Claims: AEB-Other Learning", "Princes Trust: AEB-Other Learning" }.Contains(x.PaymentTypeName) &&
                                                                                  First6MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);
                otherLearningProgramFunding12MonthsEas = easSubmissionValues.Where(x => new[] { "Authorised Claims: AEB-Other Learning", "Princes Trust: AEB-Other Learning" }.Contains(x.PaymentTypeName) &&
                                                                                   First12MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);

                otherLearningSupport6MonthsEas = easSubmissionValues.Where(x => new[] { "Excess Learning Support: AEB-Other Learning" }.Contains(x.PaymentTypeName) &&
                                                                           First6MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);
                otherLearningSupport12MonthsEas = easSubmissionValues.Where(x => new[] { "Excess Learning Support: AEB-Other Learning" }.Contains(x.PaymentTypeName) &&
                                                                            First12MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);

                traineeShips1924ProgrammeFunding6MonthsEas = easSubmissionValues.Where(x => new[] { "Authorised Claims: 19-24 Traineeships" }.Contains(x.PaymentTypeName) &&
                                                                                       First6MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);
                traineeShips1924ProgrammeFunding12MonthsEas = easSubmissionValues.Where(x => new[] { "Authorised Claims: 19-24 Traineeships" }.Contains(x.PaymentTypeName) &&
                                                                                        First12MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);

                traineeShips1924LearningSupport6MonthsEas = easSubmissionValues.Where(x => new[] { "Excess Learning Support: 19-24 Traineeships" }.Contains(x.PaymentTypeName) &&
                                                                                      First6MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);
                traineeShips1924LearningSupport12MonthsEas = easSubmissionValues.Where(x => new[] { "Excess Learning Support: 19-24 Traineeships" }.Contains(x.PaymentTypeName) &&
                                                                                       First12MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);

                traineeShips1924LearnerSupport6MonthsEas = easSubmissionValues.Where(x => new[] { "Learner Support: 19-24 Traineeships" }.Contains(x.PaymentTypeName) &&
                                                                                     First6MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);
                traineeShips1924LearnerSupport12MonthsEas = easSubmissionValues.Where(x => new[] { "Learner Support: 19-24 Traineeships" }.Contains(x.PaymentTypeName) &&
                                                                                      First12MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);

                loansAreasCosts6MonthsEas = easSubmissionValues.Where(x => new[] { "Authorised Claims: Advanced Learner Loans Bursary" }.Contains(x.PaymentTypeName) &&
                                                                      First6MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);
                loansAreasCosts12MonthsEas = easSubmissionValues.Where(x => new[] { "Authorised Claims: Advanced Learner Loans Bursary" }.Contains(x.PaymentTypeName) &&
                                                                       First12MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);
                loansExcessSupport6MonthsEas = easSubmissionValues.Where(x => new[] { "Excess Support: Advanced Learner Loans Bursary" }.Contains(x.PaymentTypeName) &&
                                                                         First6MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);
                loansExcessSupport12MonthsEas = easSubmissionValues.Where(x => new[] { "Excess Support: Advanced Learner Loans Bursary" }.Contains(x.PaymentTypeName) &&
                                                                          First12MonthsArray.Contains(x.CollectionPeriod)).Sum(y => y.PaymentValue);
                adultFundingClaimModel.OtherLearningProgrammeFunding6Months     = otherLearningProgramFunding6MonthsFm35 + otherLearningProgramFunding6MonthsEas;
                adultFundingClaimModel.OtherLearningProgrammeFunding12Months    = otherLearningProgramFunding12MonthsFm35 + otherLearningProgramFunding12MonthsEas;
                adultFundingClaimModel.OtherLearningLearningSupport6Months      = otherLearningSupport6MonthsFm35 + otherLearningSupport6MonthsEas;
                adultFundingClaimModel.OtherLearningLearningSupport12Months     = otherLearningSupport12MonthsFm35 + otherLearningSupport12MonthsEas;
                adultFundingClaimModel.Traineeships1924ProgrammeFunding6Months  = traineeShips1924ProgrammeFunding6MonthsFm35 + traineeShips1924ProgrammeFunding6MonthsEas;
                adultFundingClaimModel.Traineeships1924ProgrammeFunding12Months = traineeShips1924ProgrammeFunding12MonthsFm35 + traineeShips1924ProgrammeFunding12MonthsEas;
                adultFundingClaimModel.Traineeships1924LearningSupport6Months   = traineeShips1924LearningSupport6MonthsFm35 + traineeShips1924LearningSupport6MonthsEas;
                adultFundingClaimModel.Traineeships1924LearningSupport12Months  = traineeShips1924LearningSupport12MonthsFm35 + traineeShips1924LearningSupport12MonthsEas;
                adultFundingClaimModel.Traineeships1924LearnerSupport6Months    = traineeShips1924LearnerSupport6MonthsEas;
                adultFundingClaimModel.Traineeships1924LearnerSupport12Months   = traineeShips1924LearnerSupport12MonthsEas;

                adultFundingClaimModel.LoansBursaryFunding6Months  = loansBursaryFunding6Months;
                adultFundingClaimModel.LoansBursaryFunding12Months = loansBursaryFunding12Months;
                adultFundingClaimModel.LoansAreaCosts6Months       = loansAreaCosts6Months + loansAreasCosts6MonthsEas;
                adultFundingClaimModel.LoansAreaCosts12Months      = loansAreaCosts12Months + loansAreasCosts12MonthsEas;
                adultFundingClaimModel.LoansExcessSupport6Months   = loansExcessSupport6MonthsEas;
                adultFundingClaimModel.LoansExcessSupport12Months  = loansExcessSupport12MonthsEas;

                adultFundingClaimModel.ProviderName      = providerName ?? "Unknown";
                adultFundingClaimModel.Ukprn             = ukPrn;
                adultFundingClaimModel.ReportGeneratedAt = "Report generated at: " + dateTimeProvider.GetNowUtc().ToString("hh:mm:ss tt") + " on " +
                                                           dateTimeProvider.GetNowUtc().ToString("dd/MM/yyyy");

                if (message == null) // NON - ILR Submission.
                {
                    if (ilrSourceFileInfo.Filename == null)
                    {
                        adultFundingClaimModel.IlrFile             = "NA";
                        adultFundingClaimModel.FilePreparationDate = "NA";
                    }
                    else
                    {
                        adultFundingClaimModel.IlrFile             = ilrSourceFileInfo.Filename;
                        adultFundingClaimModel.FilePreparationDate = ilrSourceFileInfo.FilePreparationDate.GetValueOrDefault().ToString("dd/MM/yyyy");
                    }
                }
                else
                {
                    adultFundingClaimModel.IlrFile             = ilrfileName;
                    adultFundingClaimModel.FilePreparationDate =
                        message.HeaderEntity.CollectionDetailsEntity.FilePreparationDate.ToString("dd/MM/yyyy");
                }

                adultFundingClaimModel.ApplicationVersion  = versionInfo.ServiceReleaseVersion;
                adultFundingClaimModel.ComponentSetVersion = "NA";
                adultFundingClaimModel.LargeEmployerData   = largeEmployersData;
                adultFundingClaimModel.OrganisationData    = orgData;
                adultFundingClaimModel.PostcodeData        = postcodeData;
                adultFundingClaimModel.LarsData            = larsData;
            }
            catch (Exception ex)
            {
                logger.LogError($"Failed building Adult funding claim report, ex: {ex}");
                throw;
            }

            return(adultFundingClaimModel);
        }
 public void MapFM35Data(IDataStoreCache cache, FM35Global fm35Global) => _fm35Mapper.MapData(cache, fm35Global);
 public Dictionary <string, Dictionary <string, decimal?[][]> > BuildFm35Dictionary(FM35Global fm35Global)
 {
     return(fm35Global?
            .Learners?
            .SelectMany(l => l.LearningDeliveries)
            .GroupBy(ld => ld.LearningDeliveryValue.FundLine, StringComparer.OrdinalIgnoreCase)
            .ToDictionary(k => k.Key,
                          v => v.SelectMany(ld => ld.LearningDeliveryPeriodisedValues)
                          .GroupBy(ldpv => ldpv.AttributeName, StringComparer.OrdinalIgnoreCase)
                          .ToDictionary(k => k.Key, value =>
                                        value.Select(pvGroup => new decimal?[]
     {
         pvGroup.Period1,
         pvGroup.Period2,
         pvGroup.Period3,
         pvGroup.Period4,
         pvGroup.Period5,
         pvGroup.Period6,
         pvGroup.Period7,
         pvGroup.Period8,
         pvGroup.Period9,
         pvGroup.Period10,
         pvGroup.Period11,
         pvGroup.Period12,
     }).ToArray(),
                                        StringComparer.OrdinalIgnoreCase),
                          StringComparer.OrdinalIgnoreCase)
            ?? new Dictionary <string, Dictionary <string, decimal?[][]> >());
 }
 public FM35Data MapFM35Data(FM35Global fm35Global) => _fm35Mapper.MapData(fm35Global);
Пример #23
0
 protected IDictionary <string, Dictionary <int, LearningDelivery> > BuildFm35LearningDeliveryDictionary(FM35Global fm35Global)
 {
     return(fm35Global?
            .Learners?
            .ToDictionary(
                l => l.LearnRefNumber,
                l => l.LearningDeliveries
                .Where(ld => ld.AimSeqNumber.HasValue)
                .ToDictionary(
                    ld => ld.AimSeqNumber.Value,
                    ld => ld),
                StringComparer.OrdinalIgnoreCase)
            ?? new Dictionary <string, Dictionary <int, LearningDelivery> >());
 }
 public IEnumerable <FM35_LearningDelivery> MapLearningDeliveries(FM35Global fm35Global)
 {
     return(fm35Global.Learners
            .SelectMany(l => l.LearningDeliveries.Select(ld =>
                                                         new FM35_LearningDelivery
     {
         UKPRN = fm35Global.UKPRN,
         LearnRefNumber = l.LearnRefNumber,
         AimSeqNumber = ld.AimSeqNumber.Value,
         AchApplicDate = ld.LearningDeliveryValue.AchApplicDate,
         Achieved = ld.LearningDeliveryValue.Achieved,
         AchieveElement = ld.LearningDeliveryValue.AchieveElement,
         AchievePayElig = ld.LearningDeliveryValue.AchievePayElig,
         AchievePayPctPreTrans = ld.LearningDeliveryValue.AchievePayPctPreTrans,
         AchPayTransHeldBack = ld.LearningDeliveryValue.AchPayTransHeldBack,
         ActualDaysIL = ld.LearningDeliveryValue.ActualDaysIL,
         ActualNumInstalm = ld.LearningDeliveryValue.ActualNumInstalm,
         ActualNumInstalmPreTrans = ld.LearningDeliveryValue.ActualNumInstalmPreTrans,
         ActualNumInstalmTrans = ld.LearningDeliveryValue.ActualNumInstalmTrans,
         AdjLearnStartDate = ld.LearningDeliveryValue.AdjLearnStartDate,
         AdltLearnResp = ld.LearningDeliveryValue.AdltLearnResp,
         AgeAimStart = ld.LearningDeliveryValue.AgeAimStart,
         AimValue = ld.LearningDeliveryValue.AimValue,
         AppAdjLearnStartDate = ld.LearningDeliveryValue.AppAdjLearnStartDate,
         AppAgeFact = ld.LearningDeliveryValue.AppAgeFact,
         AppATAGTA = ld.LearningDeliveryValue.AppATAGTA,
         AppCompetency = ld.LearningDeliveryValue.AppCompetency,
         AppFuncSkill = ld.LearningDeliveryValue.AppFuncSkill,
         AppFuncSkill1618AdjFact = ld.LearningDeliveryValue.AppFuncSkill1618AdjFact,
         AppKnowl = ld.LearningDeliveryValue.AppKnowl,
         AppLearnStartDate = ld.LearningDeliveryValue.AppLearnStartDate,
         ApplicEmpFactDate = ld.LearningDeliveryValue.ApplicEmpFactDate,
         ApplicFactDate = ld.LearningDeliveryValue.ApplicFactDate,
         ApplicFundRateDate = ld.LearningDeliveryValue.ApplicFundRateDate,
         ApplicProgWeightFact = ld.LearningDeliveryValue.ApplicProgWeightFact,
         ApplicUnweightFundRate = ld.LearningDeliveryValue.ApplicUnweightFundRate,
         ApplicWeightFundRate = ld.LearningDeliveryValue.ApplicWeightFundRate,
         AppNonFund = ld.LearningDeliveryValue.AppNonFund,
         AreaCostFactAdj = ld.LearningDeliveryValue.AreaCostFactAdj,
         BalInstalmPreTrans = ld.LearningDeliveryValue.BalInstalmPreTrans,
         BaseValueUnweight = ld.LearningDeliveryValue.BaseValueUnweight,
         CapFactor = ld.LearningDeliveryValue.CapFactor,
         DisUpFactAdj = ld.LearningDeliveryValue.DisUpFactAdj,
         EmpOutcomePayElig = ld.LearningDeliveryValue.EmpOutcomePayElig,
         EmpOutcomePctHeldBackTrans = ld.LearningDeliveryValue.EmpOutcomePctHeldBackTrans,
         EmpOutcomePctPreTrans = ld.LearningDeliveryValue.EmpOutcomePctPreTrans,
         EmpRespOth = ld.LearningDeliveryValue.EmpRespOth,
         ESOL = ld.LearningDeliveryValue.ESOL,
         FullyFund = ld.LearningDeliveryValue.FullyFund,
         FundLine = ld.LearningDeliveryValue.FundLine,
         FundStart = ld.LearningDeliveryValue.FundStart,
         LargeEmployerID = ld.LearningDeliveryValue.LargeEmployerID,
         LargeEmployerFM35Fctr = ld.LearningDeliveryValue.LargeEmployerFM35Fctr,
         LargeEmployerStatusDate = ld.LearningDeliveryValue.LargeEmployerStatusDate,
         LTRCUpliftFctr = ld.LearningDeliveryValue.LTRCUpliftFctr,
         NonGovCont = ld.LearningDeliveryValue.NonGovCont,
         OLASSCustody = ld.LearningDeliveryValue.OLASSCustody,
         OnProgPayPctPreTrans = ld.LearningDeliveryValue.OnProgPayPctPreTrans,
         OutstndNumOnProgInstalm = ld.LearningDeliveryValue.OutstndNumOnProgInstalm,
         OutstndNumOnProgInstalmTrans = ld.LearningDeliveryValue.OutstndNumOnProgInstalmTrans,
         PlannedNumOnProgInstalm = ld.LearningDeliveryValue.PlannedNumOnProgInstalm,
         PlannedNumOnProgInstalmTrans = ld.LearningDeliveryValue.PlannedNumOnProgInstalmTrans,
         PlannedTotalDaysIL = ld.LearningDeliveryValue.PlannedTotalDaysIL,
         PlannedTotalDaysILPreTrans = ld.LearningDeliveryValue.PlannedTotalDaysILPreTrans,
         PropFundRemain = ld.LearningDeliveryValue.PropFundRemain,
         PropFundRemainAch = ld.LearningDeliveryValue.PropFundRemainAch,
         PrscHEAim = ld.LearningDeliveryValue.PrscHEAim,
         Residential = ld.LearningDeliveryValue.Residential,
         Restart = ld.LearningDeliveryValue.Restart,
         SpecResUplift = ld.LearningDeliveryValue.SpecResUplift,
         StartPropTrans = ld.LearningDeliveryValue.StartPropTrans,
         ThresholdDays = ld.LearningDeliveryValue.ThresholdDays,
         Traineeship = ld.LearningDeliveryValue.Traineeship,
         Trans = ld.LearningDeliveryValue.Trans,
         TrnAdjLearnStartDate = ld.LearningDeliveryValue.TrnAdjLearnStartDate,
         TrnWorkPlaceAim = ld.LearningDeliveryValue.TrnWorkPlaceAim,
         TrnWorkPrepAim = ld.LearningDeliveryValue.TrnWorkPrepAim,
         UnWeightedRateFromESOL = ld.LearningDeliveryValue.UnWeightedRateFromESOL,
         UnweightedRateFromLARS = ld.LearningDeliveryValue.UnweightedRateFromLARS,
         WeightedRateFromESOL = ld.LearningDeliveryValue.WeightedRateFromESOL,
         WeightedRateFromLARS = ld.LearningDeliveryValue.WeightedRateFromLARS
     })));
 }
        public async Task <FM35Global> GetFM35Data(
            IReportServiceContext reportServiceContext,
            CancellationToken cancellationToken)
        {
            await _getDataLock.WaitAsync(cancellationToken);

            try
            {
                if (_loadedDataAlready)
                {
                    return(_fundingOutputs);
                }

                cancellationToken.ThrowIfCancellationRequested();

                _loadedDataAlready = true;
                int ukPrn = reportServiceContext.Ukprn;

                if (string.Equals(reportServiceContext.CollectionName, "ILR1819", StringComparison.OrdinalIgnoreCase))
                {
                    string fm35Filename = reportServiceContext.FundingFM35OutputKey;
                    _logger.LogWarning($"Reading {fm35Filename}; Storage is {_storage}; CancellationToken is {cancellationToken}");
                    if (await _storage.ContainsAsync(fm35Filename, cancellationToken))
                    {
                        _logger.LogWarning($"Available {fm35Filename}");
                        using (MemoryStream ms = new MemoryStream())
                        {
                            await _storage.GetAsync(fm35Filename, ms, cancellationToken);

                            _logger.LogWarning($"Deserialising {fm35Filename} with {ms.Length}");
                            _fundingOutputs = _jsonSerializationService.Deserialize <FM35Global>(ms);
                        }
                    }

                    _logger.LogWarning($"Finished {fm35Filename}");
                }
                else
                {
                    FM35Global fm35Global = new FM35Global();
                    using (var ilrContext = _ilrRulebaseContextFactory())
                    {
                        var fm35GlobalDb = await ilrContext.FM35_globals.FirstOrDefaultAsync(x => x.UKPRN == ukPrn, cancellationToken);

                        FM35_LearningDelivery[] res = await ilrContext.FM35_LearningDeliveries.Where(x => x.UKPRN == ukPrn)
                                                      .Include(x => x.FM35_LearningDelivery_PeriodisedValues).ToArrayAsync(cancellationToken);

                        IGrouping <string, FM35_LearningDelivery>[] learners = res.GroupBy(x => x.LearnRefNumber).ToArray();

                        fm35Global.Learners = new List <FM35Learner>();

                        foreach (IGrouping <string, FM35_LearningDelivery> fm35LearningDeliveries in learners)
                        {
                            var learningDeliveryDto = new List <LearningDelivery>();
                            foreach (var ld in fm35LearningDeliveries)
                            {
                                var ldPeriodisedValues = ld.FM35_LearningDelivery_PeriodisedValues.Select(ldpv => new LearningDeliveryPeriodisedValue()
                                {
                                    AttributeName = ldpv.AttributeName,
                                    Period1       = ldpv.Period_1,
                                    Period2       = ldpv.Period_2,
                                    Period3       = ldpv.Period_3,
                                    Period4       = ldpv.Period_4,
                                    Period5       = ldpv.Period_5,
                                    Period6       = ldpv.Period_6,
                                    Period7       = ldpv.Period_7,
                                    Period8       = ldpv.Period_8,
                                    Period9       = ldpv.Period_9,
                                    Period10      = ldpv.Period_10,
                                    Period11      = ldpv.Period_11,
                                    Period12      = ldpv.Period_12
                                }).ToList();

                                learningDeliveryDto.Add(new LearningDelivery()
                                {
                                    AimSeqNumber = ld.AimSeqNumber,
                                    LearningDeliveryPeriodisedValues = ldPeriodisedValues,
                                    LearningDeliveryValue            = new LearningDeliveryValue()
                                    {
                                        FundLine      = ld.FundLine,
                                        AchApplicDate = ld.AchApplicDate // todo: finish the entire LearningDeliveryValue here
                                    }
                                });
                            }

                            FM35Learner learner = new FM35Learner()
                            {
                                LearnRefNumber     = fm35LearningDeliveries.Key,
                                LearningDeliveries = learningDeliveryDto
                            };

                            fm35Global.Learners.Add(learner);
                        }

                        if (fm35GlobalDb != null)
                        {
                            fm35Global.LARSVersion = fm35GlobalDb.LARSVersion;
                            fm35Global.OrgVersion  = fm35GlobalDb.OrgVersion;
                            fm35Global.PostcodeDisadvantageVersion = fm35GlobalDb.PostcodeDisadvantageVersion;
                            fm35Global.RulebaseVersion             = fm35GlobalDb.RulebaseVersion;
                            fm35Global.UKPRN = fm35GlobalDb.UKPRN;
                        }
                    }

                    _fundingOutputs = fm35Global;
                }
            }
            finally
            {
                _getDataLock.Release();
            }

            return(_fundingOutputs);
        }
Пример #26
0
        public void GetFM35LearningDeliveryPeriodisedValues()
        {
            var learner1 = new FM35Learner
            {
                LearnRefNumber     = "Learner1",
                LearningDeliveries = new List <LearningDelivery>
                {
                    new LearningDelivery
                    {
                        AimSeqNumber          = 1,
                        LearningDeliveryValue = new LearningDeliveryValue
                        {
                            FundLine = FundLineConstants.Apprenticeship1618
                        },
                        LearningDeliveryPeriodisedValues = new List <LearningDeliveryPeriodisedValue>
                        {
                            BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35BalancePayment),
                            BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35LearnSuppFundCash),
                        }
                    },
                    new LearningDelivery
                    {
                        AimSeqNumber          = 2,
                        LearningDeliveryValue = new LearningDeliveryValue
                        {
                            FundLine = FundLineConstants.Apprenticeship1923
                        },
                        LearningDeliveryPeriodisedValues = new List <LearningDeliveryPeriodisedValue>
                        {
                            BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35EmpOutcomePay),
                            BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35OnProgPayment),
                        }
                    },
                }
            };

            var learner2 = new FM35Learner
            {
                LearnRefNumber     = "Learner2",
                LearningDeliveries = new List <LearningDelivery>
                {
                    new LearningDelivery
                    {
                        AimSeqNumber          = 1,
                        LearningDeliveryValue = new LearningDeliveryValue
                        {
                            FundLine = FundLineConstants.Apprenticeship1618
                        },
                        LearningDeliveryPeriodisedValues = new List <LearningDeliveryPeriodisedValue>
                        {
                            BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35BalancePayment),
                            BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35LearnSuppFundCash),
                        }
                    },
                    new LearningDelivery
                    {
                        AimSeqNumber          = 2,
                        LearningDeliveryValue = new LearningDeliveryValue
                        {
                            FundLine = FundLineConstants.Apprenticeship1923
                        },
                        LearningDeliveryPeriodisedValues = new List <LearningDeliveryPeriodisedValue>
                        {
                            BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35EmpOutcomePay),
                            BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35OnProgPayment),
                        }
                    },
                }
            };

            var global = new FM35Global
            {
                Learners = new List <FM35Learner>
                {
                    learner1,
                    learner2
                }
            };

            var expectedModel = new List <FM35LearningDeliveryValues>
            {
                BuildFM35PeriodisedValuesForAttribute(1, "Learner1", 1, FundLineConstants.Apprenticeship1618, AttributeConstants.Fm35BalancePayment),
                BuildFM35PeriodisedValuesForAttribute(1, "Learner1", 1, FundLineConstants.Apprenticeship1618, AttributeConstants.Fm35LearnSuppFundCash),
                BuildFM35PeriodisedValuesForAttribute(1, "Learner1", 2, FundLineConstants.Apprenticeship1923, AttributeConstants.Fm35EmpOutcomePay),
                BuildFM35PeriodisedValuesForAttribute(1, "Learner1", 2, FundLineConstants.Apprenticeship1923, AttributeConstants.Fm35OnProgPayment),
                BuildFM35PeriodisedValuesForAttribute(1, "Learner2", 1, FundLineConstants.Apprenticeship1618, AttributeConstants.Fm35BalancePayment),
                BuildFM35PeriodisedValuesForAttribute(1, "Learner2", 1, FundLineConstants.Apprenticeship1618, AttributeConstants.Fm35LearnSuppFundCash),
                BuildFM35PeriodisedValuesForAttribute(1, "Learner2", 2, FundLineConstants.Apprenticeship1923, AttributeConstants.Fm35EmpOutcomePay),
                BuildFM35PeriodisedValuesForAttribute(1, "Learner2", 2, FundLineConstants.Apprenticeship1923, AttributeConstants.Fm35OnProgPayment),
            };

            NewBuilder().GetFM35LearningDeliveryPeriodisedValues(global, 1).Should().BeEquivalentTo(expectedModel);
        }
Пример #27
0
        public async Task GenerateReport(IReportServiceContext reportServiceContext, ZipArchive archive, bool isFis, CancellationToken cancellationToken)
        {
            Task <IMessage>       ilrFileTask       = _ilrProviderService.GetIlrFile(reportServiceContext, cancellationToken);
            Task <FM25Global>     fm25Task          = _fm25ProviderService.GetFM25Data(reportServiceContext, cancellationToken);
            Task <FM35Global>     fm35Task          = _fm35ProviderService.GetFM35Data(reportServiceContext, cancellationToken);
            Task <List <string> > validLearnersTask = _validLearnersService.GetLearnersAsync(reportServiceContext, cancellationToken);

            await Task.WhenAll(ilrFileTask, fm25Task, fm35Task, validLearnersTask);

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            List <ILearner> learners =
                ilrFileTask.Result?.Learners?.Where(x => validLearnersTask.Result.Contains(x.LearnRefNumber)).ToList();

            if (learners == null)
            {
                _logger.LogWarning("Failed to get learners for Main Occupancy Report");
                return;
            }

            string[] learnAimRefs = learners.SelectMany(x => x.LearningDeliveries).Select(x => x.LearnAimRef).Distinct().ToArray();

            Task <Dictionary <string, LarsLearningDelivery> > larsLearningDeliveriesTask = _larsProviderService.GetLearningDeliveriesAsync(learnAimRefs, cancellationToken);
            Task <List <LearnerAndDeliveries> > larsFrameworkAimsTask = _larsProviderService.GetFrameworkAimsAsync(learnAimRefs, learners, cancellationToken);

            await Task.WhenAll(larsLearningDeliveriesTask, larsFrameworkAimsTask);

            if (larsLearningDeliveriesTask.Result == null || larsFrameworkAimsTask.Result == null)
            {
                _logger.LogWarning("Failed to get LARS data for Main Occupancy Report");
                return;
            }

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            List <string> larsErrors = new List <string>();

            List <MainOccupancyModel> mainOccupancyModels = new List <MainOccupancyModel>();

            foreach (var learner in learners)
            {
                if (learner.LearningDeliveries == null)
                {
                    continue;
                }

                FM25Global fm25Data = fm25Task.Result;
                FM35Global fm35Data = fm35Task.Result;

                foreach (ILearningDelivery learningDelivery in learner.LearningDeliveries)
                {
                    if (!CheckIsApplicableLearner(learningDelivery))
                    {
                        continue;
                    }

                    if (!larsLearningDeliveriesTask.Result.TryGetValue(learningDelivery.LearnAimRef, out LarsLearningDelivery larsModel))
                    {
                        larsErrors.Add(learningDelivery.LearnAimRef);
                        continue;
                    }

                    LearningDelivery frameworkAim = larsFrameworkAimsTask.Result?.SingleOrDefault(x => string.Equals(x.LearnerLearnRefNumber, learner.LearnRefNumber, StringComparison.OrdinalIgnoreCase))
                                                    ?.LearningDeliveries?.SingleOrDefault(x => string.Equals(x.LearningDeliveryLearnAimRef, learningDelivery.LearnAimRef, StringComparison.OrdinalIgnoreCase) &&
                                                                                          x.LearningDeliveryAimSeqNumber == learningDelivery.AimSeqNumber);
                    if (frameworkAim == null)
                    {
                        larsErrors.Add(learningDelivery.LearnAimRef);
                        continue;
                    }

                    if (learningDelivery.FundModel == 35)
                    {
                        ILR.FundingService.FM35.FundingOutput.Model.Output.LearningDelivery learnerFm35Data = fm35Data
                                                                                                              ?.Learners?.SingleOrDefault(l => string.Equals(l.LearnRefNumber, learner.LearnRefNumber, StringComparison.OrdinalIgnoreCase))
                                                                                                              ?.LearningDeliveries?.SingleOrDefault(l => l.AimSeqNumber == learningDelivery.AimSeqNumber);

                        if (learnerFm35Data != null)
                        {
                            mainOccupancyModels.Add(_mainOccupancyReportModelBuilder.BuildFm35Model(
                                                        learner,
                                                        learningDelivery,
                                                        larsModel,
                                                        frameworkAim,
                                                        learnerFm35Data,
                                                        _stringUtilitiesService));
                        }
                    }

                    if (learningDelivery.FundModel != 25)
                    {
                        continue;
                    }

                    FM25Learner learnerFm25Data =
                        fm25Data?.Learners?.SingleOrDefault(l => string.Equals(l.LearnRefNumber, learner.LearnRefNumber, StringComparison.OrdinalIgnoreCase));

                    mainOccupancyModels.Add(_mainOccupancyReportModelBuilder.BuildFm25Model(
                                                learner,
                                                learningDelivery,
                                                learnerFm25Data));
                }
            }

            LogWarnings(larsErrors);

            mainOccupancyModels.Sort(MainOccupancyModelComparer);

            string csv = GetReportCsv(mainOccupancyModels);

            var jobId            = reportServiceContext.JobId;
            var ukPrn            = reportServiceContext.Ukprn.ToString();
            var externalFileName = GetExternalFilename(ukPrn, jobId, reportServiceContext.SubmissionDateTimeUtc);
            var fileName         = GetFilename(ukPrn, jobId, reportServiceContext.SubmissionDateTimeUtc);

            await _streamableKeyValuePersistenceService.SaveAsync($"{externalFileName}.csv", csv, cancellationToken);

            await WriteZipEntry(archive, $"{fileName}.csv", csv);
        }
Пример #28
0
        public void Build()
        {
            ICollection <string> _attributes = new HashSet <string>
            {
                AttributeConstants.Fm35OnProgPayment,
                AttributeConstants.Fm35BalancePayment,
                AttributeConstants.Fm35EmpOutcomePay,
                AttributeConstants.Fm35AchievePayment,
                AttributeConstants.Fm35LearnSuppFundCash
            };

            var learningDeliveryPeriodisedValues = new List <LearningDeliveryPeriodisedValue>
            {
                BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35OnProgPayment),
                BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35BalancePayment),
                BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35EmpOutcomePay),
                BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35AchievePayment),
                BuildPeriodisedValuesForAttribute(AttributeConstants.Fm35LearnSuppFundCash),
            };

            var learner1 = new FM35Learner
            {
                LearnRefNumber     = "Learner1",
                LearningDeliveries = new List <LearningDelivery>
                {
                    new LearningDelivery
                    {
                        AimSeqNumber          = 1,
                        LearningDeliveryValue = new LearningDeliveryValue
                        {
                            FundLine = FundLineConstants.Apprenticeship1618
                        },
                        LearningDeliveryPeriodisedValues = learningDeliveryPeriodisedValues
                    },
                    new LearningDelivery
                    {
                        AimSeqNumber          = 2,
                        LearningDeliveryValue = new LearningDeliveryValue
                        {
                            FundLine = FundLineConstants.Apprenticeship1923
                        },
                        LearningDeliveryPeriodisedValues = learningDeliveryPeriodisedValues
                    },
                }
            };

            var learner2 = new FM35Learner
            {
                LearnRefNumber     = "Learner2",
                LearningDeliveries = new List <LearningDelivery>
                {
                    new LearningDelivery
                    {
                        AimSeqNumber          = 1,
                        LearningDeliveryValue = new LearningDeliveryValue
                        {
                            FundLine = FundLineConstants.Apprenticeship1618
                        },
                        LearningDeliveryPeriodisedValues = learningDeliveryPeriodisedValues
                    },
                    new LearningDelivery
                    {
                        AimSeqNumber          = 2,
                        LearningDeliveryValue = new LearningDeliveryValue
                        {
                            FundLine = FundLineConstants.Apprenticeship1923
                        },
                        LearningDeliveryPeriodisedValues = learningDeliveryPeriodisedValues
                    },
                }
            };

            var global = new FM35Global
            {
                Learners = new List <FM35Learner>
                {
                    learner1,
                    learner2
                }
            };

            var context = new Mock <IReportServiceContext>();
            var reportServiceDependentData = new Mock <IReportServiceDependentData>();

            context.Setup(c => c.Ukprn).Returns(1);

            reportServiceDependentData.Setup(r => r.Get <FM35Global>()).Returns(global);

            var result = NewBuilder().Build(context.Object, reportServiceDependentData.Object);

            result.Should().HaveCount(84);
            result.Select(f => f.FundingLineType).Distinct().Should().BeEquivalentTo(NewBuilder().FundLines);
            result.Where(f => f.FundingLineType == FundLineConstants.Apprenticeship1618 && f.Period == 1).FirstOrDefault().Total.Should().Be(11.11m);
        }
Пример #29
0
        public void BuildTest()
        {
            var dependentDataMock = new Mock <IReportServiceDependentData>();

            var referenceDataRoot = new ReferenceDataRoot()
            {
                Organisations = new List <Organisation>()
                {
                    new Organisation()
                    {
                        UKPRN = 987654321,
                        Name  = "Provider XYZ",
                        OrganisationCoFRemovals = new List <OrganisationCoFRemoval>()
                        {
                            new OrganisationCoFRemoval()
                            {
                                EffectiveFrom = new DateTime(2019, 01, 01),
                                CoFRemoval    = (decimal)4500.12
                            }
                        },
                    }
                },
                MetaDatas = new MetaData()
                {
                    ReferenceDataVersions = new ReferenceDataVersion()
                    {
                        OrganisationsVersion = new OrganisationsVersion {
                            Version = "1.1.1.1"
                        },
                        Employers = new EmployersVersion {
                            Version = "2.2.2.2"
                        },
                        LarsVersion = new LarsVersion {
                            Version = "3.3.3.3"
                        },
                        PostcodesVersion = new PostcodesVersion {
                            Version = "4.4.4.4"
                        },
                        CampusIdentifierVersion = new CampusIdentifierVersion()
                        {
                            Version = "5.5.5.5"
                        },
                        EasFileDetails = new EasFileDetails {
                            UploadDateTime = new DateTime(2020, 1, 1, 1, 1, 1)
                        }
                    }
                }
            };

            var easFundingLines = BuildEasFundingLines();

            var fm35Learner = new FM35Learner
            {
                LearnRefNumber     = "Learner1",
                LearningDeliveries = BuildFm35LearningDeliveries()
            };

            var fm35Global = new FM35Global()
            {
                Learners = new List <FM35Learner>()
                {
                    fm35Learner
                }
            };

            var albLearner = new ALBLearner()
            {
                LearnRefNumber     = "Learner1",
                LearningDeliveries = BuildAlbLearningDeliveries()
            };
            var albGlobal = new ALBGlobal()
            {
                Learners = new List <ALBLearner>()
                {
                    albLearner
                }
            };

            dependentDataMock.Setup(d => d.Get <ReferenceDataRoot>()).Returns(referenceDataRoot);
            dependentDataMock.Setup(d => d.Get <FM35Global>()).Returns(fm35Global);
            dependentDataMock.Setup(d => d.Get <ALBGlobal>()).Returns(albGlobal);
            dependentDataMock.Setup(d => d.Get <List <EasFundingLine> >()).Returns(easFundingLines);

            var submissionDateTime       = new DateTime(2020, 1, 1, 1, 1, 1);
            var ukDateTime               = new DateTime(2020, 1, 1, 1, 1, 1);
            var dateTimeProvider         = new Mock <IDateTimeProvider>();
            var reportServiceContextMock = new Mock <IReportServiceContext>();

            reportServiceContextMock.SetupGet(c => c.Ukprn).Returns(987654321);
            reportServiceContextMock.SetupGet(c => c.SubmissionDateTimeUtc).Returns(submissionDateTime);
            reportServiceContextMock.SetupGet(c => c.ServiceReleaseVersion).Returns("11.22.3300.4321");
            reportServiceContextMock.SetupGet(c => c.IlrReportingFilename).Returns("ILR-12345678-2021-20201005-151322-01.xml");
            reportServiceContextMock.SetupGet(c => c.EasReportingFilename).Returns("EAS-12345678-2021-20201005-151322-01.csv");


            dateTimeProvider.Setup(p => p.GetNowUtc()).Returns(submissionDateTime);
            dateTimeProvider.SetupSequence(p => p.ConvertUtcToUk(It.IsAny <DateTime>()))
            .Returns(ukDateTime)
            .Returns(new DateTime(2020, 1, 1, 1, 1, 1));


            var result = NewBuilder(dateTimeProvider.Object).Build(reportServiceContextMock.Object, dependentDataMock.Object);

            result.ProviderName.Should().Be("Provider XYZ");
            result.Ukprn.Should().Be("987654321");
            result.IlrFile.Should().Be("ILR-12345678-2021-20201005-151322-01.xml");
            result.EasFile.Should().Be("EAS-12345678-2021-20201005-151322-01.csv");
            result.Year.Should().Be("2020/21");
            result.ReportGeneratedAt.Should().Be("Report generated at: 01:01:01 on 01/01/2020");
            result.ApplicationVersion.Should().Be("11.22.3300.4321");
            result.LarsData.Should().Be("3.3.3.3");
            result.OrganisationData.Should().Be("1.1.1.1");
            result.PostcodeData.Should().Be("4.4.4.4");
            result.CampusIdData.Should().Be("5.5.5.5");

            result.AEBProgrammeFunding.MidYearClaims.Should().Be(135.324m);
            result.AEBProgrammeFunding.YearEndClaims.Should().Be(350.384m);
            result.AEBProgrammeFunding.FinalClaims.Should().Be(489.3132m);

            result.AEBLearningSupport.MidYearClaims.Should().Be(44.331m);
            result.AEBLearningSupport.YearEndClaims.Should().Be(115.096m);
            result.AEBLearningSupport.FinalClaims.Should().Be(161.3283m);

            result.AEBProgrammeFunding1924.MidYearClaims.Should().Be(114.324m);
            result.AEBProgrammeFunding1924.YearEndClaims.Should().Be(295.384m);
            result.AEBProgrammeFunding1924.FinalClaims.Should().Be(411.3132m);

            result.AEBLearningSupport1924.MidYearClaims.Should().Be(44.331m);
            result.AEBLearningSupport1924.YearEndClaims.Should().Be(115.096m);
            result.AEBLearningSupport1924.FinalClaims.Should().Be(161.3283m);

            result.ALBBursaryFunding.MidYearClaims.Should().Be(23.331m);
            result.ALBBursaryFunding.YearEndClaims.Should().Be(60.096m);
            result.ALBBursaryFunding.FinalClaims.Should().Be(83.3283m);

            result.ALBAreaCosts.MidYearClaims.Should().Be(67.662m);
            result.ALBAreaCosts.YearEndClaims.Should().Be(175.192m);
            result.ALBAreaCosts.FinalClaims.Should().Be(244.6566m);

            result.ALBExcessSupport.MidYearClaims.Should().Be(21m);
            result.ALBExcessSupport.YearEndClaims.Should().Be(55m);
            result.ALBExcessSupport.FinalClaims.Should().Be(78m);
        }
        private void PopulateDataStoreCache(IDataStoreCache cache, IEnumerable <FM35Learner> learners, FM35Global fm35Global, int ukprn)
        {
            cache.AddRange(BuildGlobals(fm35Global, ukprn));

            learners.NullSafeForEach(learner =>
            {
                var learnRefNumber = learner.LearnRefNumber;

                cache.Add(BuildLearner(ukprn, learnRefNumber));

                learner.LearningDeliveries.NullSafeForEach(learningDelivery => cache.Add(BuildLearningDelivery(learningDelivery, ukprn, learnRefNumber)));
            });

            var learningDeliveryPeriodisedValues = learners.SelectMany(l => l.LearningDeliveries.Select(ld =>
                                                                                                        new FundModelLearningDeliveryPeriodisedValue <List <LearningDeliveryPeriodisedValue> >(ukprn, l.LearnRefNumber, ld.AimSeqNumber.Value, ld.LearningDeliveryPeriodisedValues)));

            cache.AddRange(BuildLearningDeliveryPeriods(learningDeliveryPeriodisedValues));

            learningDeliveryPeriodisedValues.NullSafeForEach(ldpv => ldpv.LearningDeliveryPeriodisedValue.NullSafeForEach(learningDeliveryPeriodisedValue => cache.Add(BuildLearningDeliveryPeriodisedValues(learningDeliveryPeriodisedValue, ldpv.AimSeqNumber, ukprn, ldpv.LearnRefNumber))));
        }