Ejemplo n.º 1
0
        private async Task GenerateRowsAsync(IMessage ilrFile, FM36Global fm36Data, List <string> validLearners, List <AppsIndicativeEarningsModel> appsIndicativeEarningsModels, CancellationToken cancellationToken)
        {
            ILearner[] learners     = ilrFile.Learners.Where(x => validLearners.Contains(x.LearnRefNumber)).ToArray();
            string[]   learnAimRefs = learners.SelectMany(x => x.LearningDeliveries).Select(x => x.LearnAimRef).Distinct().ToArray();
            Dictionary <string, LarsLearningDelivery> larsLearningDeliveries = await _larsProviderService.GetLearningDeliveriesAsync(learnAimRefs, cancellationToken);

            foreach (ILearner learner in learners)
            {
                FM36Learner fm36Learner = fm36Data?.Learners?.SingleOrDefault(x => string.Equals(x.LearnRefNumber, learner.LearnRefNumber, StringComparison.OrdinalIgnoreCase));

                foreach (ILearningDelivery learningDelivery in learner.LearningDeliveries)
                {
                    if (learningDelivery.FundModel != 36)
                    {
                        continue;
                    }

                    string larsStandard = null;
                    if (learningDelivery.StdCodeNullable != null)
                    {
                        larsStandard = await _larsProviderService.GetStandardAsync(
                            learningDelivery.StdCodeNullable.Value,
                            cancellationToken);
                    }

                    LarsLearningDelivery larsDelivery = larsLearningDeliveries.SingleOrDefault(x => string.Equals(x.Key, learningDelivery.LearnAimRef, StringComparison.OrdinalIgnoreCase)).Value;

                    LearningDelivery fm36LearningDelivery = fm36Learner?.LearningDeliveries
                                                            ?.SingleOrDefault(x => x.AimSeqNumber == learningDelivery.AimSeqNumber);

                    if (fm36Learner?.PriceEpisodes.Any() ?? false)
                    {
                        List <PriceEpisode> episodesInRange = fm36Learner.PriceEpisodes
                                                              .Where(p => p.PriceEpisodeValues.EpisodeStartDate >= Constants.BeginningOfYear &&
                                                                     p.PriceEpisodeValues.EpisodeStartDate <= Constants.EndOfYear &&
                                                                     learningDelivery.AimSeqNumber == p.PriceEpisodeValues.PriceEpisodeAimSeqNumber).ToList();

                        if (episodesInRange.Any())
                        {
                            DateTime earliestEpisodeDate = episodesInRange.Select(x => x.PriceEpisodeValues.EpisodeStartDate ?? DateTime.MaxValue).Min();

                            bool earliestEpisode = false;
                            foreach (PriceEpisode episodeAttribute in episodesInRange)
                            {
                                if (episodeAttribute.PriceEpisodeValues.EpisodeStartDate == earliestEpisodeDate)
                                {
                                    earliestEpisode = true;
                                }

                                appsIndicativeEarningsModels.Add(
                                    _modelBuilder.BuildModel(
                                        learner,
                                        learningDelivery,
                                        fm36LearningDelivery,
                                        episodeAttribute,
                                        larsDelivery,
                                        larsStandard,
                                        earliestEpisode,
                                        true));

                                earliestEpisode = false;
                            }

                            continue;
                        }
                    }

                    appsIndicativeEarningsModels.Add(
                        _modelBuilder.BuildModel(
                            learner,
                            learningDelivery,
                            fm36LearningDelivery,
                            null,
                            larsDelivery,
                            larsStandard,
                            false,
                            false));
                }
            }

            appsIndicativeEarningsModels.Sort(AppsIndicativeEarningsModelComparer);
        }
        public async Task GenerateReport(IReportServiceContext reportServiceContext, ZipArchive archive, bool isFis, CancellationToken cancellationToken)
        {
            Task <IMessage>   ilrFileTask = _ilrProviderService.GetIlrFile(reportServiceContext, cancellationToken);
            Task <FM81Global> fm81Task    =
                _fm81TrailBlazerProviderService.GetFM81Data(reportServiceContext, cancellationToken);
            Task <List <string> > validLearnersTask =
                _validLearnersService.GetLearnersAsync(reportServiceContext, cancellationToken);

            await Task.WhenAll(ilrFileTask, fm81Task, 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 Trailblazer Apprenticeships Occupancy Report");
                return;
            }

            string[] learnAimRefs = learners.SelectMany(x => x.LearningDeliveries).Select(x => x.LearnAimRef).Distinct().ToArray();
            Dictionary <string, LarsLearningDelivery> larsLearningDeliveries = await _larsProviderService.GetLearningDeliveriesAsync(learnAimRefs, cancellationToken);

            var fm81Data = fm81Task.Result;
            var trailblazerAppsOccupancyModels = new List <TrailblazerAppsOccupancyModel>();

            foreach (var learner in learners)
            {
                FM81Learner fm81Learner = fm81Data?.Learners?.SingleOrDefault(x => string.Equals(x.LearnRefNumber, learner.LearnRefNumber, StringComparison.OrdinalIgnoreCase));
                foreach (ILearningDelivery learningDelivery in learner.LearningDeliveries)
                {
                    if (!CheckIsApplicableLearner(learningDelivery))
                    {
                        continue;
                    }

                    LarsLearningDelivery larsDelivery             = larsLearningDeliveries.SingleOrDefault(x => string.Equals(x.Key, learningDelivery.LearnAimRef, StringComparison.OrdinalIgnoreCase)).Value;
                    LearningDelivery     ruleBaseLearningDelivery = fm81Learner?.LearningDeliveries
                                                                    ?.SingleOrDefault(x => x.AimSeqNumber == learningDelivery.AimSeqNumber);
                    trailblazerAppsOccupancyModels.Add(_trailblazerAppsOccupancyModelBuilder
                                                       .BuildTrailblazerAppsOccupancyModel(
                                                           learner,
                                                           learningDelivery,
                                                           larsDelivery,
                                                           ruleBaseLearningDelivery));
                }
            }

            trailblazerAppsOccupancyModels.Sort(new TrailblazerAppsOccupancyModelComparer());

            var csv = GetReportCsv(trailblazerAppsOccupancyModels);

            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);
        }
Ejemplo n.º 3
0
        public TrailblazerAppsOccupancyModel BuildTrailblazerAppsOccupancyModel(
            ILearner learner,
            ILearningDelivery learningDelivery,
            LarsLearningDelivery larsModel,
            LearningDelivery ruleBaseLearningDelivery)
        {
            List <IAppFinRecord> currentYearData = learningDelivery.AppFinRecords?
                                                   .Where(x => x.AFinDate >= Constants.BeginningOfYear && x.AFinDate <= Constants.EndOfYear &&
                                                          string.Equals(x.AFinType, "PMR", StringComparison.OrdinalIgnoreCase)).ToList();

            List <IAppFinRecord> previousYearData = learningDelivery.AppFinRecords?
                                                    .Where(x => x.AFinDate <= Constants.BeginningOfYear &&
                                                           string.Equals(x.AFinType, "PMR", StringComparison.OrdinalIgnoreCase)).ToList();

            var returnModel = new TrailblazerAppsOccupancyModel()
            {
                LearnRefNumber      = learner.LearnRefNumber,
                UniqueLearnerNumber = learner.ULN,
                DateOfBirth         = learner.DateOfBirthNullable?.ToString("dd/MM/yyyy"),
                PMUkPrn             = learner.PMUKPRNNullable,
                CampId            = learner.CampId,
                ProvSpecLearnMonA = learner.ProviderSpecLearnerMonitorings
                                    ?.SingleOrDefault(x =>
                                                      string.Equals(x.ProvSpecLearnMonOccur, "A", StringComparison.OrdinalIgnoreCase))
                                    ?.ProvSpecLearnMon,
                ProvSpecLearnMonB = learner.ProviderSpecLearnerMonitorings
                                    ?.SingleOrDefault(x =>
                                                      string.Equals(x.ProvSpecLearnMonOccur, "B", StringComparison.OrdinalIgnoreCase))
                                    ?.ProvSpecLearnMon,
                AimSeqNumber       = learningDelivery.AimSeqNumber,
                LearnAimRef        = learningDelivery.LearnAimRef,
                LearnAimRefTitle   = larsModel.LearningAimTitle,
                SwSupAimId         = learningDelivery.SWSupAimId,
                NotionalNvqLevelV2 =
                    larsModel.NotionalNvqLevel,
                AimType            = learningDelivery.AimType,
                StdCode            = learningDelivery.StdCodeNullable,
                FundModel          = learningDelivery.FundModel,
                PriorLearnFundAdj  = learningDelivery.PriorLearnFundAdjNullable,
                OtherFundAdj       = learningDelivery.OtherFundAdjNullable,
                OrigLearnStartDate = learningDelivery.OrigLearnStartDateNullable,
                LearnStartDate     = learningDelivery.LearnStartDate,
                LearnPlanEndDate   = learningDelivery.LearnPlanEndDate,
                CompStatus         = learningDelivery.CompStatus,
                LearnActEndDate    = learningDelivery.LearnActEndDateNullable,
                Outcome            = learningDelivery.OutcomeNullable,
                AchDate            = learningDelivery.AchDateNullable,
                LearnDelFamCodeSof = learningDelivery.LearningDeliveryFAMs
                                     ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, Constants.LearningDeliveryFAMCodeSOF, StringComparison.OrdinalIgnoreCase))
                                     ?.LearnDelFAMCode,
                LearnDelFamCodeEef = learningDelivery.LearningDeliveryFAMs
                                     ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, "EEF", StringComparison.OrdinalIgnoreCase))
                                     ?.LearnDelFAMCode,
                LearnDelFamCodeLsfHighest = learningDelivery.LearningDeliveryFAMs
                                            ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, Constants.LearningDeliveryFAMCodeLSF, StringComparison.OrdinalIgnoreCase))
                                            ?.LearnDelFAMCode,
                LearnDelFamCodeLsfEarliest = learningDelivery.LearningDeliveryFAMs
                                             ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, Constants.LearningDeliveryFAMCodeLSF, StringComparison.OrdinalIgnoreCase))
                                             ?.LearnDelFAMDateFromNullable,
                LearnDelFamCodeLsfLatest = learningDelivery.LearningDeliveryFAMs
                                           ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, Constants.LearningDeliveryFAMCodeLSF, StringComparison.OrdinalIgnoreCase))
                                           ?.LearnDelFAMDateToNullable,
                LearnDelMonA = learningDelivery.LearningDeliveryFAMs
                               ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, "LDM1", StringComparison.OrdinalIgnoreCase))
                               ?.LearnDelFAMCode,
                LearnDelMonB = learningDelivery.LearningDeliveryFAMs
                               ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, "LDM2", StringComparison.OrdinalIgnoreCase))
                               ?.LearnDelFAMCode,
                LearnDelMonC = learningDelivery.LearningDeliveryFAMs
                               ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, "LDM3", StringComparison.OrdinalIgnoreCase))
                               ?.LearnDelFAMCode,
                LearnDelMonD = learningDelivery.LearningDeliveryFAMs
                               ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, "LDM4", StringComparison.OrdinalIgnoreCase))
                               ?.LearnDelFAMCode,
                LearnDelMonRestartIndicator = learningDelivery.LearningDeliveryFAMs
                                              ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, "RES", StringComparison.OrdinalIgnoreCase))
                                              ?.LearnDelFAMCode,
                ProvSpecDelMonA = learningDelivery.ProviderSpecDeliveryMonitorings
                                  ?.SingleOrDefault(
                    x => string.Equals(x.ProvSpecDelMonOccur, "A", StringComparison.OrdinalIgnoreCase))
                                  ?.ProvSpecDelMon,
                ProvSpecDelMonB = learningDelivery.ProviderSpecDeliveryMonitorings
                                  ?.SingleOrDefault(
                    x => string.Equals(x.ProvSpecDelMonOccur, "B", StringComparison.OrdinalIgnoreCase))
                                  ?.ProvSpecDelMon,
                ProvSpecDelMonC = learningDelivery.ProviderSpecDeliveryMonitorings
                                  ?.SingleOrDefault(
                    x => string.Equals(x.ProvSpecDelMonOccur, "C", StringComparison.OrdinalIgnoreCase))
                                  ?.ProvSpecDelMon,
                ProvSpecDelMonD = learningDelivery.ProviderSpecDeliveryMonitorings
                                  ?.SingleOrDefault(
                    x => string.Equals(x.ProvSpecDelMonOccur, "D", StringComparison.OrdinalIgnoreCase))
                                  ?.ProvSpecDelMon,
                EpaOrgID                = learningDelivery.EPAOrgID,
                PartnerUKPRN            = learningDelivery.PartnerUKPRNNullable,
                DelLocPostCode          = learningDelivery.DelLocPostCode,
                CoreGovContCapApplicVal = ruleBaseLearningDelivery?.LearningDeliveryValues?.CoreGovContCapApplicVal,
                SmallBusApplicVal       = ruleBaseLearningDelivery?.LearningDeliveryValues?.SmallBusApplicVal,
                YoungAppApplicVal       = ruleBaseLearningDelivery?.LearningDeliveryValues?.YoungAppApplicVal,
                AchievementApplicVal    = ruleBaseLearningDelivery?.LearningDeliveryValues?.AchievementApplicVal,
                ApplicFundValDate       = ruleBaseLearningDelivery?.LearningDeliveryValues?.ApplicFundValDate,
                FundLine                = ruleBaseLearningDelivery?.LearningDeliveryValues?.FundLine,
                EmpIdFirstDayStandard   = ruleBaseLearningDelivery?.LearningDeliveryValues?.EmpIdFirstDayStandard,
                EmpIdSmallBusDate       = ruleBaseLearningDelivery?.LearningDeliveryValues?.EmpIdSmallBusDate,
                EmpIdFirstYoungAppDate  = ruleBaseLearningDelivery?.LearningDeliveryValues?.EmpIdFirstYoungAppDate,
                EmpIdSecondYoungAppDate = ruleBaseLearningDelivery?.LearningDeliveryValues?.EmpIdSecondYoungAppDate,
                EmpIdAchDate            = ruleBaseLearningDelivery?.LearningDeliveryValues?.EmpIdAchDate,
                MathEngLSFFundStart     = ruleBaseLearningDelivery?.LearningDeliveryValues?.MathEngLSFFundStart,
                AgeStandardStart        = ruleBaseLearningDelivery?.LearningDeliveryValues?.AgeStandardStart,
                YoungAppEligible        = ruleBaseLearningDelivery?.LearningDeliveryValues?.YoungAppEligible,
                SmallBusEligible        = ruleBaseLearningDelivery?.LearningDeliveryValues?.SmallBusEligible,
                AchApplicDate           = ruleBaseLearningDelivery?.LearningDeliveryValues?.AchApplicDate
            };

            if (learningDelivery.AimType == 1)
            {
                returnModel.TotalNegotiatedPrice1 = learningDelivery.AppFinRecords?
                                                    .Where(x => string.Equals(x.AFinType, "TNP", StringComparison.OrdinalIgnoreCase) &&
                                                           x.AFinCode == 1).OrderByDescending(x => x.AFinDate).FirstOrDefault().AFinAmount;

                returnModel.TotalNegotiatedPrice1 = learningDelivery.AppFinRecords?
                                                    .Where(x => string.Equals(x.AFinType, "TNP", StringComparison.OrdinalIgnoreCase) &&
                                                           x.AFinCode == 2).OrderByDescending(x => x.AFinDate).FirstOrDefault().AFinAmount;
            }

            returnModel.PMRSumBeforeFundingYear =
                previousYearData?.Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                previousYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            var coreGovContPaymentList   = ruleBaseLearningDelivery?.LearningDeliveryPeriodisedValues.Where(l => string.Equals(l.AttributeName, Constants.Fm81CoreGovContPayment, StringComparison.OrdinalIgnoreCase)).ToList();
            var mathEngOnProgPaymentList = ruleBaseLearningDelivery?.LearningDeliveryPeriodisedValues.Where(l => string.Equals(l.AttributeName, Constants.Fm81MathEngOnProgPayment, StringComparison.OrdinalIgnoreCase)).ToList();
            var mathEngBalPaymentList    = ruleBaseLearningDelivery?.LearningDeliveryPeriodisedValues.Where(l => string.Equals(l.AttributeName, Constants.Fm81MathEngBalPayment, StringComparison.OrdinalIgnoreCase)).ToList();
            var learnSuppFundCashList    = ruleBaseLearningDelivery?.LearningDeliveryPeriodisedValues.Where(l => string.Equals(l.AttributeName, Constants.Fm81LearnSuppFundCash, StringComparison.OrdinalIgnoreCase)).ToList();
            var smallBusPaymentList      = ruleBaseLearningDelivery?.LearningDeliveryPeriodisedValues.Where(l => string.Equals(l.AttributeName, Constants.Fm81MathEngOnProgPayment, StringComparison.OrdinalIgnoreCase)).ToList();
            var youngAppPaymentList      = ruleBaseLearningDelivery?.LearningDeliveryPeriodisedValues.Where(l => string.Equals(l.AttributeName, Constants.Fm81MathEngBalPayment, StringComparison.OrdinalIgnoreCase)).ToList();
            var achPaymentList           = ruleBaseLearningDelivery?.LearningDeliveryPeriodisedValues.Where(l => string.Equals(l.AttributeName, Constants.Fm81MathEngBalPayment, StringComparison.OrdinalIgnoreCase)).ToList();

            returnModel.Period1CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period1) ?? decimal.Zero;
            returnModel.Period1MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period1) ?? decimal.Zero;
            returnModel.Period1MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period1) ?? decimal.Zero;
            returnModel.Period1LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period1) ?? decimal.Zero;
            returnModel.Period1SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period1) ?? decimal.Zero;
            returnModel.Period1YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period1) ?? decimal.Zero;
            returnModel.Period1AchPayment           = achPaymentList?.Sum(x => x.Period1) ?? decimal.Zero;

            returnModel.Period2CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period2) ?? decimal.Zero;
            returnModel.Period2MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period2) ?? decimal.Zero;
            returnModel.Period2MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period2) ?? decimal.Zero;
            returnModel.Period2LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period2) ?? decimal.Zero;
            returnModel.Period2SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period2) ?? decimal.Zero;
            returnModel.Period2YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period2) ?? decimal.Zero;
            returnModel.Period2AchPayment           = achPaymentList?.Sum(x => x.Period2) ?? decimal.Zero;

            returnModel.Period3CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period3) ?? decimal.Zero;
            returnModel.Period3MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period3) ?? decimal.Zero;
            returnModel.Period3MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period3) ?? decimal.Zero;
            returnModel.Period3LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period3) ?? decimal.Zero;
            returnModel.Period3SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period3) ?? decimal.Zero;
            returnModel.Period3YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period3) ?? decimal.Zero;
            returnModel.Period3AchPayment           = achPaymentList?.Sum(x => x.Period3) ?? decimal.Zero;

            returnModel.Period4CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period4) ?? decimal.Zero;
            returnModel.Period4MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period4) ?? decimal.Zero;
            returnModel.Period4MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period4) ?? decimal.Zero;
            returnModel.Period4LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period4) ?? decimal.Zero;
            returnModel.Period4SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period4) ?? decimal.Zero;
            returnModel.Period4YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period4) ?? decimal.Zero;
            returnModel.Period4AchPayment           = achPaymentList?.Sum(x => x.Period4) ?? decimal.Zero;

            returnModel.Period5CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period5) ?? decimal.Zero;
            returnModel.Period5MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period5) ?? decimal.Zero;
            returnModel.Period5MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period5) ?? decimal.Zero;
            returnModel.Period5LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period5) ?? decimal.Zero;
            returnModel.Period5SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period5) ?? decimal.Zero;
            returnModel.Period5YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period5) ?? decimal.Zero;
            returnModel.Period5AchPayment           = achPaymentList?.Sum(x => x.Period5) ?? decimal.Zero;

            returnModel.Period6CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period6) ?? decimal.Zero;
            returnModel.Period6MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period6) ?? decimal.Zero;
            returnModel.Period6MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period6) ?? decimal.Zero;
            returnModel.Period6LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period6) ?? decimal.Zero;
            returnModel.Period6SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period6) ?? decimal.Zero;
            returnModel.Period6YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period6) ?? decimal.Zero;
            returnModel.Period6AchPayment           = achPaymentList?.Sum(x => x.Period6) ?? decimal.Zero;

            returnModel.Period7CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period7) ?? decimal.Zero;
            returnModel.Period7MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period7) ?? decimal.Zero;
            returnModel.Period7MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period7) ?? decimal.Zero;
            returnModel.Period7LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period7) ?? decimal.Zero;
            returnModel.Period7SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period7) ?? decimal.Zero;
            returnModel.Period7YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period7) ?? decimal.Zero;
            returnModel.Period7AchPayment           = achPaymentList?.Sum(x => x.Period7) ?? decimal.Zero;

            returnModel.Period8CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period8) ?? decimal.Zero;
            returnModel.Period8MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period8) ?? decimal.Zero;
            returnModel.Period8MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period8) ?? decimal.Zero;
            returnModel.Period8LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period8) ?? decimal.Zero;
            returnModel.Period8SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period8) ?? decimal.Zero;
            returnModel.Period8YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period8) ?? decimal.Zero;
            returnModel.Period8AchPayment           = achPaymentList?.Sum(x => x.Period8) ?? decimal.Zero;

            returnModel.Period9CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period9) ?? decimal.Zero;
            returnModel.Period9MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period9) ?? decimal.Zero;
            returnModel.Period9MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period9) ?? decimal.Zero;
            returnModel.Period9LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period9) ?? decimal.Zero;
            returnModel.Period9SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period9) ?? decimal.Zero;
            returnModel.Period9YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period9) ?? decimal.Zero;
            returnModel.Period9AchPayment           = achPaymentList?.Sum(x => x.Period9) ?? decimal.Zero;

            returnModel.Period10CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period10) ?? decimal.Zero;
            returnModel.Period10MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period10) ?? decimal.Zero;
            returnModel.Period10MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period10) ?? decimal.Zero;
            returnModel.Period10LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period10) ?? decimal.Zero;
            returnModel.Period10SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period10) ?? decimal.Zero;
            returnModel.Period10YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period10) ?? decimal.Zero;
            returnModel.Period10AchPayment           = achPaymentList?.Sum(x => x.Period10) ?? decimal.Zero;

            returnModel.Period11CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period11) ?? decimal.Zero;
            returnModel.Period11MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period11) ?? decimal.Zero;
            returnModel.Period11MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period11) ?? decimal.Zero;
            returnModel.Period11LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period11) ?? decimal.Zero;
            returnModel.Period11SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period11) ?? decimal.Zero;
            returnModel.Period11YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period11) ?? decimal.Zero;
            returnModel.Period11AchPayment           = achPaymentList?.Sum(x => x.Period11) ?? decimal.Zero;

            returnModel.Period12CoreGovContPayment   = coreGovContPaymentList?.Sum(x => x.Period12) ?? decimal.Zero;
            returnModel.Period12MathEngOnProgPayment = mathEngOnProgPaymentList?.Sum(x => x.Period12) ?? decimal.Zero;
            returnModel.Period12MathEngBalPayment    = mathEngBalPaymentList?.Sum(x => x.Period12) ?? decimal.Zero;
            returnModel.Period12LearnSuppFundCash    = learnSuppFundCashList?.Sum(x => x.Period12) ?? decimal.Zero;
            returnModel.Period12SmallBusPayment      = smallBusPaymentList?.Sum(x => x.Period12) ?? decimal.Zero;
            returnModel.Period12YoungAppPayment      = youngAppPaymentList?.Sum(x => x.Period12) ?? decimal.Zero;
            returnModel.Period12AchPayment           = achPaymentList?.Sum(x => x.Period12) ?? decimal.Zero;

            returnModel.Period1PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 8, Constants.BeginningOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.Period2PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 9, Constants.BeginningOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.Period3PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 10, Constants.BeginningOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.Period4PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 11, Constants.BeginningOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.Period5PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 12, Constants.BeginningOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.Period6PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 1, Constants.EndOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.Period7PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 2, Constants.EndOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.Period8PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 3, Constants.EndOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.Period9PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 4, Constants.EndOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.Period10PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 5, Constants.EndOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.Period11PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 6, Constants.EndOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.Period12PMRSum =
                GetAppFinRecordListByPeriods(learningDelivery, 7, Constants.EndOfYear.Year)?
                .Where(x => x.AFinCode == 1 || x.AFinCode == 2).Sum(x => x.AFinAmount) -
                currentYearData?.Where(x => x.AFinCode == 3).Sum(x => x.AFinAmount);

            returnModel.TotalCoreGovContPayment =
                returnModel.Period1CoreGovContPayment + returnModel.Period2CoreGovContPayment +
                returnModel.Period3CoreGovContPayment + returnModel.Period4CoreGovContPayment +
                returnModel.Period5CoreGovContPayment + returnModel.Period6CoreGovContPayment +
                returnModel.Period7CoreGovContPayment + returnModel.Period8CoreGovContPayment +
                returnModel.Period9CoreGovContPayment + returnModel.Period10CoreGovContPayment +
                returnModel.Period11CoreGovContPayment + returnModel.Period12CoreGovContPayment;

            returnModel.TotalMathEngOnProgPayment =
                returnModel.Period1MathEngOnProgPayment + returnModel.Period2MathEngOnProgPayment +
                returnModel.Period3MathEngOnProgPayment + returnModel.Period4MathEngOnProgPayment +
                returnModel.Period5MathEngOnProgPayment + returnModel.Period6MathEngOnProgPayment +
                returnModel.Period7MathEngOnProgPayment + returnModel.Period8MathEngOnProgPayment +
                returnModel.Period9MathEngOnProgPayment + returnModel.Period10MathEngOnProgPayment +
                returnModel.Period11MathEngOnProgPayment + returnModel.Period12MathEngOnProgPayment;

            returnModel.TotalMathEngBalPayment =
                returnModel.Period1MathEngBalPayment + returnModel.Period2MathEngBalPayment +
                returnModel.Period3MathEngBalPayment + returnModel.Period4MathEngBalPayment +
                returnModel.Period5MathEngBalPayment + returnModel.Period6MathEngBalPayment +
                returnModel.Period7MathEngBalPayment + returnModel.Period8MathEngBalPayment +
                returnModel.Period9MathEngBalPayment + returnModel.Period10MathEngBalPayment +
                returnModel.Period11MathEngBalPayment + returnModel.Period12MathEngBalPayment;

            returnModel.TotalLearnSuppFundCash =
                returnModel.Period1LearnSuppFundCash + returnModel.Period2LearnSuppFundCash +
                returnModel.Period3LearnSuppFundCash + returnModel.Period4LearnSuppFundCash +
                returnModel.Period5LearnSuppFundCash + returnModel.Period6LearnSuppFundCash +
                returnModel.Period7LearnSuppFundCash + returnModel.Period8LearnSuppFundCash +
                returnModel.Period9LearnSuppFundCash + returnModel.Period10LearnSuppFundCash +
                returnModel.Period11LearnSuppFundCash + returnModel.Period12LearnSuppFundCash;

            returnModel.TotalSmallBusPayment =
                returnModel.Period1SmallBusPayment + returnModel.Period2SmallBusPayment +
                returnModel.Period3SmallBusPayment + returnModel.Period4SmallBusPayment +
                returnModel.Period5SmallBusPayment + returnModel.Period6SmallBusPayment +
                returnModel.Period7SmallBusPayment + returnModel.Period8SmallBusPayment +
                returnModel.Period9SmallBusPayment + returnModel.Period10SmallBusPayment +
                returnModel.Period11SmallBusPayment + returnModel.Period12SmallBusPayment;

            returnModel.TotalYoungAppPayment =
                returnModel.Period1YoungAppPayment + returnModel.Period2YoungAppPayment +
                returnModel.Period3YoungAppPayment + returnModel.Period4YoungAppPayment +
                returnModel.Period5YoungAppPayment + returnModel.Period6YoungAppPayment +
                returnModel.Period7YoungAppPayment + returnModel.Period8YoungAppPayment +
                returnModel.Period9YoungAppPayment + returnModel.Period10YoungAppPayment +
                returnModel.Period11YoungAppPayment + returnModel.Period12YoungAppPayment;

            returnModel.TotalAchPayment =
                returnModel.Period1AchPayment + returnModel.Period2AchPayment +
                returnModel.Period3AchPayment + returnModel.Period4AchPayment +
                returnModel.Period5AchPayment + returnModel.Period6AchPayment +
                returnModel.Period7AchPayment + returnModel.Period8AchPayment +
                returnModel.Period9AchPayment + returnModel.Period10AchPayment +
                returnModel.Period11AchPayment + returnModel.Period12AchPayment;

            returnModel.TotalPMRSum =
                returnModel.Period1PMRSum + returnModel.Period2PMRSum +
                returnModel.Period3PMRSum + returnModel.Period4PMRSum +
                returnModel.Period5PMRSum + returnModel.Period6PMRSum +
                returnModel.Period7PMRSum + returnModel.Period8PMRSum +
                returnModel.Period9PMRSum + returnModel.Period10PMRSum +
                returnModel.Period11PMRSum + returnModel.Period12PMRSum;

            return(returnModel);
        }
Ejemplo n.º 4
0
        public AppsIndicativeEarningsModel BuildModel(
            ILearner learner,
            ILearningDelivery learningDelivery,
            LearningDelivery fm36DeliveryAttribute,
            PriceEpisode fm36EpisodeAttribute,
            LarsLearningDelivery larsLearningDelivery,
            string notionalEndLevel,
            bool earliestEpisode,
            bool hasPriceEpisodes)
        {
            DateTime employmentStatusDate = learner.LearnerEmploymentStatuses?
                                            .Where(x => x.DateEmpStatApp <= learningDelivery.LearnStartDate).Select(x => x.DateEmpStatApp)
                                            .DefaultIfEmpty(DateTime.MinValue).Max() ?? DateTime.MinValue;
            ILearnerEmploymentStatus employmentStatus =
                learner.LearnerEmploymentStatuses?.SingleOrDefault(x => x.DateEmpStatApp == employmentStatusDate);

            LearningDeliveryFamSimple[] learningDeliveryFams = GetLearningDeliveryFams(learningDelivery);
            string fundingLineType = GetFundingType(fm36DeliveryAttribute?.LearningDeliveryValues, fm36EpisodeAttribute?.PriceEpisodeValues);
            var    ldms            = _stringUtilitiesService.GetArrayEntries(learningDelivery.LearningDeliveryFAMs?.Where(x => string.Equals(x.LearnDelFAMType, Constants.LearningDeliveryFAMCodeLDM, StringComparison.OrdinalIgnoreCase)), 4);

            var model = new AppsIndicativeEarningsModel
            {
                LearnRefNumber                      = learner.LearnRefNumber,
                UniqueLearnerNumber                 = learner.ULN,
                DateOfBirth                         = learner.DateOfBirthNullable?.ToString("dd/MM/yyyy"),
                PostcodePriorToEnrollment           = learner.PostcodePrior,
                CampusIdentifier                    = learner.CampId,
                ProviderSpecifiedLearnerMonitoringA = learner.ProviderSpecLearnerMonitorings
                                                      ?.SingleOrDefault(x => string.Equals(x.ProvSpecLearnMonOccur, "A", StringComparison.OrdinalIgnoreCase))?.ProvSpecLearnMon,
                ProviderSpecifiedLearnerMonitoringB = learner.ProviderSpecLearnerMonitorings
                                                      ?.SingleOrDefault(x => string.Equals(x.ProvSpecLearnMonOccur, "B", StringComparison.OrdinalIgnoreCase))?.ProvSpecLearnMon,
                AimSeqNumber                  = learningDelivery.AimSeqNumber,
                LearningAimReference          = learningDelivery.LearnAimRef,
                LearningAimTitle              = larsLearningDelivery?.LearningAimTitle,
                SoftwareSupplierAimIdentifier = learningDelivery.SWSupAimId,
                LARS1618FrameworkUplift       = fm36DeliveryAttribute?.LearningDeliveryValues
                                                ?.LearnDelApplicProv1618FrameworkUplift,
                NotionalNVQLevel         = larsLearningDelivery?.NotionalNvqLevel,
                StandardNotionalEndLevel = notionalEndLevel,
                Tier2SectorSubjectArea   = larsLearningDelivery?.Tier2SectorSubjectArea,
                ProgrammeType            = learningDelivery.ProgTypeNullable,
                StandardCode             = learningDelivery.StdCodeNullable,
                FrameworkCode            = learningDelivery.FworkCodeNullable,
                ApprenticeshipPathway    = learningDelivery.PwayCodeNullable,
                AimType                                       = learningDelivery.AimType,
                CommonComponentCode                           = larsLearningDelivery?.FrameworkCommonComponent,
                FundingModel                                  = learningDelivery.FundModel,
                OriginalLearningStartDate                     = learningDelivery.OrigLearnStartDateNullable?.ToString("dd/MM/yyyy"),
                LearningStartDate                             = learningDelivery.LearnStartDate.ToString("dd/MM/yyyy"),
                LearningPlannedEndDate                        = learningDelivery.LearnPlanEndDate.ToString("dd/MM/yyyy"),
                CompletionStatus                              = learningDelivery.CompStatus,
                LearningActualEndDate                         = learningDelivery.LearnActEndDateNullable?.ToString("dd/MM/yyyy"),
                Outcome                                       = learningDelivery.OutcomeNullable,
                FundingAdjustmentForPriorLearning             = learningDelivery.PriorLearnFundAdjNullable,
                OtherFundingAdjustment                        = learningDelivery.OtherFundAdjNullable,
                LearningDeliveryFAMTypeLearningSupportFunding = learningDeliveryFams.Select(x => x.Code).Max(),
                LearningDeliveryFAMTypeLSFDateAppliesFrom     =
                    learningDeliveryFams.Select(x => x.From).Min() == DateTime.MinValue ? string.Empty : learningDeliveryFams.Select(x => x.From).Min().ToString("dd/MM/yyyy"),
                LearningDeliveryFAMTypeLSFDateAppliesTo =
                    learningDeliveryFams.Select(x => x.To).Max() == DateTime.MinValue ? string.Empty : learningDeliveryFams.Select(x => x.To).Max().ToString("dd/MM/yyyy"),
                LearningDeliveryFAMTypeLearningDeliveryMonitoringA = ldms[0],
                LearningDeliveryFAMTypeLearningDeliveryMonitoringB = ldms[1],
                LearningDeliveryFAMTypeLearningDeliveryMonitoringC = ldms[2],
                LearningDeliveryFAMTypeLearningDeliveryMonitoringD = ldms[3],
                LearningDeliveryFAMRestartIndicator = learningDelivery.LearningDeliveryFAMs
                                                      ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, Constants.LearningDeliveryFAMCodeRES, StringComparison.OrdinalIgnoreCase))?.LearnDelFAMCode,
                ProviderSpecifiedDeliveryMonitoringA = learningDelivery.ProviderSpecDeliveryMonitorings
                                                       ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "A", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                ProviderSpecifiedDeliveryMonitoringB = learningDelivery.ProviderSpecDeliveryMonitorings
                                                       ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "B", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                ProviderSpecifiedDeliveryMonitoringC = learningDelivery.ProviderSpecDeliveryMonitorings
                                                       ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "C", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                ProviderSpecifiedDeliveryMonitoringD = learningDelivery.ProviderSpecDeliveryMonitorings
                                                       ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "D", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                EndPointAssessmentOrganisation           = learningDelivery.EPAOrgID,
                PlannedNoOfOnProgrammeInstallmentsForAim =
                    fm36DeliveryAttribute?.LearningDeliveryValues?.PlannedNumOnProgInstalm,
                SubContractedOrPartnershipUKPRN = learningDelivery.PartnerUKPRNNullable,
                DeliveryLocationPostcode        = learningDelivery.DelLocPostCode,
                EmployerIdentifier               = employmentStatus?.EmpIdNullable,
                AgreementIdentifier              = fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeAgreeId,
                EmploymentStatus                 = employmentStatus?.EmpStat,
                EmploymentStatusDate             = employmentStatus?.DateEmpStatApp.ToString("dd/MM/yyyy"),
                EmpStatusMonitoringSmallEmployer = employmentStatus?.EmploymentStatusMonitorings
                                                   ?.SingleOrDefault(x => string.Equals(x.ESMType, Constants.EmploymentStatusMonitoringTypeSEM, StringComparison.OrdinalIgnoreCase))?.ESMCode,
                PriceEpisodeStartDate =
                    fm36EpisodeAttribute?.PriceEpisodeValues?.EpisodeStartDate,
                PriceEpisodeActualEndDate =
                    fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeActualEndDate?.ToString("dd/MM/yyyy"),
                FundingLineType = fundingLineType,
                TotalPriceApplicableToThisEpisode =
                    fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeTotalTNPPrice,
                FundingBandUpperLimit            = fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeUpperBandLimit,
                PriceAmountAboveFundingBandLimit =
                    fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeUpperLimitAdjustment,
                PriceAmountRemainingStartOfEpisode = fm36EpisodeAttribute?.PriceEpisodeValues
                                                     ?.PriceEpisodeCappedRemainingTNPAmount,
                CompletionElement = fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeCompletionElement
            };

            if (learningDelivery?.LearningDeliveryFAMs != null)
            {
                CalculateApprenticeshipContractTypeFields(
                    learningDelivery,
                    model,
                    fm36DeliveryAttribute,
                    fm36EpisodeAttribute,
                    hasPriceEpisodes);
            }

            if (earliestEpisode)
            {
                CalculateAppFinTotals(model, learningDelivery);
            }

            foreach (var command in _commands)
            {
                command.Execute(model, fm36DeliveryAttribute, fm36EpisodeAttribute);
            }

            GetTotals(model);

            return(model);
        }
Ejemplo n.º 5
0
        public MainOccupancyModel BuildFm35Model(
            ILearner learner,
            ILearningDelivery learningDelivery,
            LarsLearningDelivery larsModel,
            LearningDelivery frameworkAim,
            ILR.FundingService.FM35.FundingOutput.Model.Output.LearningDelivery fm35Data,
            IStringUtilitiesService stringUtilitiesService)
        {
            var onProgPayment = fm35Data?.LearningDeliveryPeriodisedValues
                                ?.SingleOrDefault(attr => string.Equals(attr.AttributeName, Constants.Fm35OnProgrammeAttributeName, StringComparison.OrdinalIgnoreCase));
            var balancePayment = fm35Data?.LearningDeliveryPeriodisedValues
                                 ?.SingleOrDefault(attr => string.Equals(attr.AttributeName, Constants.Fm35BalancingAttributeName, StringComparison.OrdinalIgnoreCase));
            var achievePayment = fm35Data?.LearningDeliveryPeriodisedValues
                                 ?.SingleOrDefault(attr => string.Equals(attr.AttributeName, Constants.Fm35AimAchievementAttributeName, StringComparison.OrdinalIgnoreCase));
            var empOutcomePayment = fm35Data?.LearningDeliveryPeriodisedValues
                                    ?.SingleOrDefault(attr => string.Equals(attr.AttributeName, Constants.Fm35JobOutcomeAchievementAttributeName, StringComparison.OrdinalIgnoreCase));
            var learnSuppFundCash = fm35Data?.LearningDeliveryPeriodisedValues
                                    ?.SingleOrDefault(attr => string.Equals(attr.AttributeName, Constants.Fm35LearningSupportAttributeName, StringComparison.OrdinalIgnoreCase));
            var ldms = stringUtilitiesService.GetArrayEntries(learningDelivery.LearningDeliveryFAMs?.Where(x => string.Equals(x.LearnDelFAMType, "LDM", StringComparison.OrdinalIgnoreCase)), 4);

            var totalOnProgPayment = (onProgPayment?.Period1 ?? 0) + (onProgPayment?.Period2 ?? 0) +
                                     (onProgPayment?.Period3 ?? 0) + (onProgPayment?.Period4 ?? 0) +
                                     (onProgPayment?.Period5 ?? 0) + (onProgPayment?.Period6 ?? 0) +
                                     (onProgPayment?.Period7 ?? 0) + (onProgPayment?.Period8 ?? 0) +
                                     (onProgPayment?.Period9 ?? 0) + (onProgPayment?.Period10 ?? 0) +
                                     (onProgPayment?.Period11 ?? 0) + (onProgPayment?.Period12 ?? 0);

            var totalBalancePayment = (balancePayment?.Period1 ?? 0) + (balancePayment?.Period2 ?? 0) +
                                      (balancePayment?.Period3 ?? 0) + (balancePayment?.Period4 ?? 0) +
                                      (balancePayment?.Period5 ?? 0) + (balancePayment?.Period6 ?? 0) +
                                      (balancePayment?.Period7 ?? 0) + (balancePayment?.Period8 ?? 0) +
                                      (balancePayment?.Period9 ?? 0) + (balancePayment?.Period10 ?? 0) +
                                      (balancePayment?.Period11 ?? 0) + (balancePayment?.Period12 ?? 0);

            var totalAchievePayment = (achievePayment?.Period1 ?? 0) + (achievePayment?.Period2 ?? 0) +
                                      (achievePayment?.Period3 ?? 0) + (achievePayment?.Period4 ?? 0) +
                                      (achievePayment?.Period5 ?? 0) + (achievePayment?.Period6 ?? 0) +
                                      (achievePayment?.Period7 ?? 0) + (achievePayment?.Period8 ?? 0) +
                                      (achievePayment?.Period9 ?? 0) + (achievePayment?.Period10 ?? 0) +
                                      (achievePayment?.Period11 ?? 0) + (achievePayment?.Period12 ?? 0);

            var totalEmpOutcomePay = (empOutcomePayment?.Period1 ?? 0) + (empOutcomePayment?.Period2 ?? 0) +
                                     (empOutcomePayment?.Period3 ?? 0) + (empOutcomePayment?.Period4 ?? 0) +
                                     (empOutcomePayment?.Period5 ?? 0) + (empOutcomePayment?.Period6 ?? 0) +
                                     (empOutcomePayment?.Period7 ?? 0) + (empOutcomePayment?.Period8 ?? 0) +
                                     (empOutcomePayment?.Period9 ?? 0) + (empOutcomePayment?.Period10 ?? 0) +
                                     (empOutcomePayment?.Period11 ?? 0) + (empOutcomePayment?.Period12 ?? 0);

            var totalLearnSuppFundCash = (learnSuppFundCash?.Period1 ?? 0) + (learnSuppFundCash?.Period2 ?? 0) +
                                         (learnSuppFundCash?.Period3 ?? 0) + (learnSuppFundCash?.Period4 ?? 0) +
                                         (learnSuppFundCash?.Period5 ?? 0) + (learnSuppFundCash?.Period6 ?? 0) +
                                         (learnSuppFundCash?.Period7 ?? 0) + (learnSuppFundCash?.Period8 ?? 0) +
                                         (learnSuppFundCash?.Period9 ?? 0) + (learnSuppFundCash?.Period10 ?? 0) +
                                         (learnSuppFundCash?.Period11 ?? 0) + (learnSuppFundCash?.Period12 ?? 0);

            LearningDeliveryPeriodisedValue aimPercent = fm35Data?.LearningDeliveryPeriodisedValues?.SingleOrDefault(attr =>
                                                                                                                     string.Equals(attr.AttributeName, Constants.Fm35AimAchievementPercentAttributeName, StringComparison.OrdinalIgnoreCase));

            return(new MainOccupancyModel
            {
                LearnRefNumber = learner.LearnRefNumber,
                Uln = learner.ULN,
                DateOfBirth = learner.DateOfBirthNullable?.ToString("dd/MM/yyyy"),
                PostcodePrior = learner.PostcodePrior,
                PmUkprn = learner.PMUKPRNNullable,
                CampId = learner.CampId,
                ProvSpecLearnMonA = learner.ProviderSpecLearnerMonitorings
                                    ?.SingleOrDefault(x => string.Equals(x.ProvSpecLearnMonOccur, "A", StringComparison.OrdinalIgnoreCase))?.ProvSpecLearnMon,
                ProvSpecLearnMonB = learner.ProviderSpecLearnerMonitorings
                                    ?.SingleOrDefault(x => string.Equals(x.ProvSpecLearnMonOccur, "B", StringComparison.OrdinalIgnoreCase))?.ProvSpecLearnMon,
                AimSeqNumber = learningDelivery.AimSeqNumber,
                LearnAimRef = learningDelivery.LearnAimRef,
                LearnAimRefTitle = larsModel.LearningAimTitle,
                SwSupAimId = learningDelivery.SWSupAimId,
                WeightedRateFromEsol = fm35Data?.LearningDeliveryValue?.WeightedRateFromESOL,
                ApplicWeightFundRate = fm35Data?.LearningDeliveryValue?.ApplicWeightFundRate,
                ApplicProgWeightFact = fm35Data?.LearningDeliveryValue?.ApplicProgWeightFact,
                AimValue = fm35Data?.LearningDeliveryValue?.AimValue,
                NotionalNvqLevelV2 = larsModel.NotionalNvqLevel,
                SectorSubjectAreaTier2 = larsModel.Tier2SectorSubjectArea,
                ProgType = learningDelivery.ProgTypeNullable,
                FworkCode = learningDelivery.FworkCodeNullable,
                PwayCode = learningDelivery.PwayCodeNullable,
                AimType = learningDelivery.AimType,
                FrameworkComponentType = frameworkAim.FrameworkComponentType,
                FundModel = learningDelivery.FundModel,
                PriorLearnFundAdj = learningDelivery.PriorLearnFundAdjNullable,
                OtherFundAdj = learningDelivery.OtherFundAdjNullable,
                OrigLearnStartDate = learningDelivery.OrigLearnStartDateNullable?.ToString("dd/MM/yyyy"),
                LearnStartDate = learningDelivery.LearnStartDate.ToString("dd/MM/yyyy"),
                LearnPlanEndDate = learningDelivery.LearnPlanEndDate.ToString("dd/MM/yyyy"),
                CompStatus = learningDelivery.CompStatus,
                LearnActEndDate = learningDelivery.LearnActEndDateNullable?.ToString("dd/MM/yyyy"),
                Outcome = learningDelivery.OutcomeNullable,
                AchDate = learningDelivery.AchDateNullable?.ToString("dd/MM/yyyy"),
                AddHours = learningDelivery.AddHoursNullable,
                LearnDelFamCodeSof = learningDelivery.LearningDeliveryFAMs
                                     ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, "SOF", StringComparison.OrdinalIgnoreCase))?.LearnDelFAMCode,
                LearnDelFamCodeFfi = learningDelivery.LearningDeliveryFAMs
                                     ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, "FFI", StringComparison.OrdinalIgnoreCase))?.LearnDelFAMCode,
                LearnDelFamCodeEef = learningDelivery.LearningDeliveryFAMs
                                     ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, "EEF", StringComparison.OrdinalIgnoreCase))?.LearnDelFAMCode,
                LearnDelFamCodeLsfHighest = learningDelivery.LearningDeliveryFAMs
                                            ?.Where(x => string.Equals(x.LearnDelFAMType, "LSF", StringComparison.OrdinalIgnoreCase)).Select(x => x.LearnDelFAMCode).DefaultIfEmpty().Max(),
                LearnDelFamCodeLsfEarliest = learningDelivery.LearningDeliveryFAMs
                                             ?.Where(x => string.Equals(x.LearnDelFAMType, "LSF", StringComparison.OrdinalIgnoreCase)).Select(x => x.LearnDelFAMDateFromNullable ?? DateTime.MinValue)
                                             .DefaultIfEmpty(DateTime.MinValue).Min().ToString("dd/MM/yyyy"),
                LearnDelFamCodeLsfLatest = learningDelivery.LearningDeliveryFAMs
                                           ?.Where(x => string.Equals(x.LearnDelFAMType, "LSF", StringComparison.OrdinalIgnoreCase))
                                           .Min(x => x.LearnDelFAMDateToNullable)?.ToString("dd/MM/yyyy"),
                LearnDelFamCodeLdm1 = ldms[0],
                LearnDelFamCodeLdm2 = ldms[1],
                LearnDelFamCodeLdm3 = ldms[2],
                LearnDelFamCodeLdm4 = ldms[3],
                LearnDelFamCodeRes = learningDelivery.LearningDeliveryFAMs
                                     ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, "RES", StringComparison.OrdinalIgnoreCase))?.LearnDelFAMCode,
                ProvSpecDelMonA = learningDelivery.ProviderSpecDeliveryMonitorings
                                  ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "A", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                ProvSpecDelMonB = learningDelivery.ProviderSpecDeliveryMonitorings
                                  ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "B", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                ProvSpecDelMonC = learningDelivery.ProviderSpecDeliveryMonitorings
                                  ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "C", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                ProvSpecDelMonD = learningDelivery.ProviderSpecDeliveryMonitorings
                                  ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "D", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                FundLine = fm35Data?.LearningDeliveryValue?.FundLine,
                PlannedNumOnProgInstalm = fm35Data?.LearningDeliveryValue?.PlannedNumOnProgInstalm,
                PlannedNumOnProgInstalmTrans = fm35Data?.LearningDeliveryValue?.PlannedNumOnProgInstalmTrans,
                StartPropTrans = fm35Data?.LearningDeliveryValue?.StartPropTrans,
                AchieveElement = fm35Data?.LearningDeliveryValue?.AchieveElement,
                AchievePercentage = aimPercent == null ? 0 : GetMaxPeriod(aimPercent),
                NonGovCont = fm35Data?.LearningDeliveryValue?.NonGovCont,
                PartnerUkprn = learningDelivery.PartnerUKPRNNullable,
                DelLocPostCode = learningDelivery.DelLocPostCode,
                AreaCostFactAdj = fm35Data?.LearningDeliveryValue?.AreaCostFactAdj,
                DisUpFactAdj = fm35Data?.LearningDeliveryValue?.DisUpFactAdj,
                LargeEmployerID = fm35Data?.LearningDeliveryValue?.LargeEmployerID,
                LargeEmployerFM35Fctr = fm35Data?.LearningDeliveryValue?.LargeEmployerFM35Fctr,
                CapFactor = fm35Data?.LearningDeliveryValue?.CapFactor,
                TraineeWorkPlacement = (fm35Data?.LearningDeliveryValue?.TrnWorkPlaceAim ?? false) ||
                                       (fm35Data?.LearningDeliveryValue?.TrnWorkPrepAim ?? false),
                HigherApprentishipHeAim = fm35Data?.LearningDeliveryValue?.PrscHEAim ?? false,
                ApplicEmpFactDate = fm35Data?.LearningDeliveryValue?.ApplicEmpFactDate?.ToString("dd/MM/yyyy"),
                ApplicFactDate = fm35Data?.LearningDeliveryValue?.ApplicFactDate?.ToString("dd/MM/yyyy"),

                Period1OnProgPayment = onProgPayment?.Period1,
                Period1BalancePayment = balancePayment?.Period1,
                Period1AchievePayment = achievePayment?.Period1,
                Period1EmpOutcomePay = empOutcomePayment?.Period1,
                Period1LearnSuppFundCash = learnSuppFundCash?.Period1,

                Period2OnProgPayment = onProgPayment?.Period2,
                Period2BalancePayment = balancePayment?.Period2,
                Period2AchievePayment = achievePayment?.Period2,
                Period2EmpOutcomePay = empOutcomePayment?.Period2,
                Period2LearnSuppFundCash = learnSuppFundCash?.Period2,

                Period3OnProgPayment = onProgPayment?.Period3,
                Period3BalancePayment = balancePayment?.Period3,
                Period3AchievePayment = achievePayment?.Period3,
                Period3EmpOutcomePay = empOutcomePayment?.Period3,
                Period3LearnSuppFundCash = learnSuppFundCash?.Period3,

                Period4OnProgPayment = onProgPayment?.Period4,
                Period4BalancePayment = balancePayment?.Period4,
                Period4AchievePayment = achievePayment?.Period4,
                Period4EmpOutcomePay = empOutcomePayment?.Period4,
                Period4LearnSuppFundCash = learnSuppFundCash?.Period4,

                Period5OnProgPayment = onProgPayment?.Period5,
                Period5BalancePayment = balancePayment?.Period5,
                Period5AchievePayment = achievePayment?.Period5,
                Period5EmpOutcomePay = empOutcomePayment?.Period5,
                Period5LearnSuppFundCash = learnSuppFundCash?.Period5,

                Period6OnProgPayment = onProgPayment?.Period6,
                Period6BalancePayment = balancePayment?.Period6,
                Period6AchievePayment = achievePayment?.Period6,
                Period6EmpOutcomePay = empOutcomePayment?.Period6,
                Period6LearnSuppFundCash = learnSuppFundCash?.Period6,

                Period7OnProgPayment = onProgPayment?.Period7,
                Period7BalancePayment = balancePayment?.Period7,
                Period7AchievePayment = achievePayment?.Period7,
                Period7EmpOutcomePay = empOutcomePayment?.Period7,
                Period7LearnSuppFundCash = learnSuppFundCash?.Period7,

                Period8OnProgPayment = onProgPayment?.Period8,
                Period8BalancePayment = balancePayment?.Period8,
                Period8AchievePayment = achievePayment?.Period8,
                Period8EmpOutcomePay = empOutcomePayment?.Period8,
                Period8LearnSuppFundCash = learnSuppFundCash?.Period8,

                Period9OnProgPayment = onProgPayment?.Period9,
                Period9BalancePayment = balancePayment?.Period9,
                Period9AchievePayment = achievePayment?.Period9,
                Period9EmpOutcomePay = empOutcomePayment?.Period9,
                Period9LearnSuppFundCash = learnSuppFundCash?.Period9,

                Period10OnProgPayment = onProgPayment?.Period10,
                Period10BalancePayment = balancePayment?.Period10,
                Period10AchievePayment = achievePayment?.Period10,
                Period10EmpOutcomePay = empOutcomePayment?.Period10,
                Period10LearnSuppFundCash = learnSuppFundCash?.Period10,

                Period11OnProgPayment = onProgPayment?.Period11,
                Period11BalancePayment = balancePayment?.Period11,
                Period11AchievePayment = achievePayment?.Period11,
                Period11EmpOutcomePay = empOutcomePayment?.Period11,
                Period11LearnSuppFundCash = learnSuppFundCash?.Period11,

                Period12OnProgPayment = onProgPayment?.Period12,
                Period12BalancePayment = balancePayment?.Period12,
                Period12AchievePayment = achievePayment?.Period12,
                Period12EmpOutcomePay = empOutcomePayment?.Period12,
                Period12LearnSuppFundCash = learnSuppFundCash?.Period12,

                TotalOnProgPayment = totalOnProgPayment,
                TotalBalancePayment = totalBalancePayment,
                TotalAchievePayment = totalAchievePayment,
                TotalEmpOutcomePay = totalEmpOutcomePay,
                TotalLearnSuppFundCash = totalLearnSuppFundCash,
                TotalEarnedCash = totalOnProgPayment + totalBalancePayment + totalAchievePayment
                                  + totalEmpOutcomePay + totalLearnSuppFundCash
            });
        }