public IEnumerable <Frm07ReportModel> Build(IReportServiceContext reportServiceContext, IReportData reportData)
        {
            var models       = new List <Frm07ReportModel>();
            var returnPeriod = reportServiceContext.ReturnPeriodName;

            var organisationNameDictionary = reportData.Organisations.ToDictionary(k => k.Ukprn, v => v.Name);
            var learnAimDictionary         = reportData.LARSLearningDeliveries.ToDictionary(k => k.LearnAimRef, v => v, StringComparer.OrdinalIgnoreCase);
            var sofCodeDictionary          = reportData.McaGlaSofLookups.Where(l => DevolvedCodes.Contains(l.SofCode)).ToDictionary(k => k.SofCode, v => v.McaGlaShortCode);
            var mcaDictionary = reportData.McaDevolvedContracts.ToDictionary(k => k.McaGlaShortCode, v => v.Ukprn, StringComparer.OrdinalIgnoreCase);

            var orgName = organisationNameDictionary.GetValueOrDefault(reportServiceContext.Ukprn);

            var pausedDeliveries = reportData.Learners
                                   ?.SelectMany(l => l.LearningDeliveries.Where(ld =>
                                                                                ld.CompStatus == _pausedCompStatus &&
                                                                                !ExcludedDelivery(ld, reportData.LARSLearningDeliveries) &&
                                                                                FundModel99Rule(ld) &&
                                                                                !_excludedFundModel.Contains(ld.FundModel))
                                                .Select(ld => new { Learner = l, LearningDelivery = ld }));

            if (pausedDeliveries == null)
            {
                return(models);
            }

            var learnerDeliveries = pausedDeliveries.GroupBy(x => x.Learner);

            foreach (var deliverySet in learnerDeliveries)
            {
                foreach (var delivery in deliverySet.OrderByDescending(x => x.LearningDelivery.LearnStartDate))
                {
                    var restartDelivery = GetRestartDelivery(delivery.LearningDelivery, delivery.Learner);

                    if (restartDelivery != null)
                    {
                        var pmOrgName   = organisationNameDictionary.GetValueOrDefault(delivery.Learner.PMUKPRN.GetValueOrDefault());
                        var prevOrgName = organisationNameDictionary.GetValueOrDefault(delivery.Learner.PrevUKPRN.GetValueOrDefault());

                        models.Add(BuildModelForLearningDelivery(reportServiceContext, restartDelivery, delivery.Learner, sofCodeDictionary, mcaDictionary, organisationNameDictionary, learnAimDictionary, returnPeriod, orgName, pmOrgName, prevOrgName));
                    }
                }
            }

            return(models);
        }
        public IEnumerable <Frm09ReportModel> Build(IReportServiceContext reportServiceContext, IReportData reportData)
        {
            var models       = new List <Frm09ReportModel>();
            var returnPeriod = reportServiceContext.ReturnPeriodName;

            var organisationNameDictionary = reportData.Organisations.ToDictionary(k => k.Ukprn, v => v.Name);
            var learnAimDictionary         = reportData.LARSLearningDeliveries.ToDictionary(k => k.LearnAimRef, v => v, StringComparer.OrdinalIgnoreCase);
            var sofCodeDictionary          = reportData.McaGlaSofLookups.Where(l => DevolvedCodes.Contains(l.SofCode)).ToDictionary(k => k.SofCode, v => v.McaGlaShortCode);
            var mcaDictionary = reportData.McaDevolvedContracts.ToDictionary(k => k.McaGlaShortCode, v => v.Ukprn, StringComparer.OrdinalIgnoreCase);

            var orgName = organisationNameDictionary.GetValueOrDefault(reportServiceContext.Ukprn);

            var currentReturnEndDate = reportData.ReturnPeriods
                                       .FirstOrDefault(d => d.Period == reportServiceContext.ReturnPeriod).End;

            var withdrawanDeliveries = reportData.Learners
                                       ?.SelectMany(l => l.LearningDeliveries.Where(ld =>
                                                                                    ld.CompStatus == _withdrawnCompStatus &&
                                                                                    ld.WithdrawReason == _withdrawnReasonCode &&
                                                                                    !ExcludedDelivery(ld, reportData.LARSLearningDeliveries) &&
                                                                                    FundModel99Rule(ld) &&
                                                                                    ld.LearnActEndDate <= ReportingConstants.EndOfYear)
                                                    .Select(ld => new { Learner = l, LearningDelivery = ld }));

            if (withdrawanDeliveries == null)
            {
                return(models);
            }

            foreach (var delivery in withdrawanDeliveries)
            {
                if (!HasRestartDelivery(delivery.LearningDelivery, delivery.Learner, reportData.Learners))
                {
                    if (delivery.LearningDelivery.LearnActEndDate != null && DaysBetween(delivery.LearningDelivery.LearnActEndDate.Value, currentReturnEndDate) >= 90)
                    {
                        var pmOrgName   = organisationNameDictionary.GetValueOrDefault(delivery.Learner.PMUKPRN.GetValueOrDefault());
                        var prevOrgName = organisationNameDictionary.GetValueOrDefault(delivery.Learner.PrevUKPRN.GetValueOrDefault());

                        models.Add(BuildModelForLearningDelivery(reportServiceContext, delivery.LearningDelivery, delivery.Learner, sofCodeDictionary, mcaDictionary, organisationNameDictionary, learnAimDictionary, returnPeriod, orgName, pmOrgName, prevOrgName));
                    }
                }
            }

            return(models);
        }