예제 #1
0
 public AEC_LearningDelivery BuildLearningDelivery(LearningDelivery learningDelivery, int ukprn, string learnRefNumber)
 {
     return(new AEC_LearningDelivery
     {
         UKPRN = ukprn,
         LearnRefNumber = learnRefNumber,
         AimSeqNumber = learningDelivery.AimSeqNumber,
         ActualDaysIL = learningDelivery.LearningDeliveryValues.ActualDaysIL,
         ActualNumInstalm = learningDelivery.LearningDeliveryValues.ActualNumInstalm,
         AdjStartDate = learningDelivery.LearningDeliveryValues.AdjStartDate,
         AgeAtProgStart = learningDelivery.LearningDeliveryValues.AgeAtProgStart,
         AppAdjLearnStartDate = learningDelivery.LearningDeliveryValues.AppAdjLearnStartDate,
         AppAdjLearnStartDateMatchPathway = learningDelivery.LearningDeliveryValues.AppAdjLearnStartDateMatchPathway,
         ApplicCompDate = learningDelivery.LearningDeliveryValues.ApplicCompDate,
         CombinedAdjProp = learningDelivery.LearningDeliveryValues.CombinedAdjProp,
         Completed = learningDelivery.LearningDeliveryValues.Completed,
         FirstIncentiveThresholdDate = learningDelivery.LearningDeliveryValues.FirstIncentiveThresholdDate,
         FundStart = learningDelivery.LearningDeliveryValues.FundStart,
         LDApplic1618FrameworkUpliftTotalActEarnings = learningDelivery.LearningDeliveryValues.LDApplic1618FrameworkUpliftTotalActEarnings,
         LearnAimRef = learningDelivery.LearningDeliveryValues.LearnAimRef,
         LearnDel1618AtStart = learningDelivery.LearningDeliveryValues.LearnDel1618AtStart,
         LearnDelAccDaysILCareLeavers = learningDelivery.LearningDeliveryValues.LearnDelAccDaysILCareLeavers,
         LearnDelAppAccDaysIL = learningDelivery.LearningDeliveryValues.LearnDelAppAccDaysIL,
         LearnDelApplicCareLeaverIncentive = learningDelivery.LearningDeliveryValues.LearnDelApplicCareLeaverIncentive,
         LearnDelApplicDisadvAmount = learningDelivery.LearningDeliveryValues.LearnDelApplicDisadvAmount,
         LearnDelApplicEmp1618Incentive = learningDelivery.LearningDeliveryValues.LearnDelApplicEmp1618Incentive,
         LearnDelApplicEmpDate = learningDelivery.LearningDeliveryValues.LearnDelApplicEmpDate,
         LearnDelApplicProv1618FrameworkUplift = learningDelivery.LearningDeliveryValues.LearnDelApplicProv1618FrameworkUplift,
         LearnDelApplicProv1618Incentive = learningDelivery.LearningDeliveryValues.LearnDelApplicProv1618Incentive,
         LearnDelAppPrevAccDaysIL = learningDelivery.LearningDeliveryValues.LearnDelAppPrevAccDaysIL,
         LearnDelDaysIL = learningDelivery.LearningDeliveryValues.LearnDelDaysIL,
         LearnDelDisadAmount = learningDelivery.LearningDeliveryValues.LearnDelDisadAmount,
         LearnDelEligDisadvPayment = learningDelivery.LearningDeliveryValues.LearnDelEligDisadvPayment,
         LearnDelEmpIdFirstAdditionalPaymentThreshold = learningDelivery.LearningDeliveryValues.LearnDelEmpIdFirstAdditionalPaymentThreshold,
         LearnDelEmpIdSecondAdditionalPaymentThreshold = learningDelivery.LearningDeliveryValues.LearnDelEmpIdSecondAdditionalPaymentThreshold,
         LearnDelHistDaysCareLeavers = learningDelivery.LearningDeliveryValues.LearnDelHistDaysCareLeavers,
         LearnDelHistDaysThisApp = learningDelivery.LearningDeliveryValues.LearnDelHistDaysThisApp,
         LearnDelHistProgEarnings = learningDelivery.LearningDeliveryValues.LearnDelHistProgEarnings,
         LearnDelInitialFundLineType = learningDelivery.LearningDeliveryValues.LearnDelInitialFundLineType,
         LearnDelLearnerAddPayThresholdDate = learningDelivery.LearningDeliveryValues.LearnDelLearnerAddPayThresholdDate,
         LearnDelMathEng = learningDelivery.LearningDeliveryValues.LearnDelMathEng,
         LearnDelNonLevyProcured = learningDelivery.LearningDeliveryValues.LearnDelNonLevyProcured,
         LearnDelPrevAccDaysILCareLeavers = learningDelivery.LearningDeliveryValues.LearnDelPrevAccDaysILCareLeavers,
         LearnDelProgEarliestACT2Date = learningDelivery.LearningDeliveryValues.LearnDelProgEarliestACT2Date,
         LearnDelRedCode = learningDelivery.LearningDeliveryValues.LearnDelRedCode,
         LearnDelRedStartDate = learningDelivery.LearningDeliveryValues.LearnDelRedStartDate,
         MathEngAimValue = learningDelivery.LearningDeliveryValues.MathEngAimValue,
         OutstandNumOnProgInstalm = learningDelivery.LearningDeliveryValues.OutstandNumOnProgInstalm,
         PlannedNumOnProgInstalm = learningDelivery.LearningDeliveryValues.PlannedNumOnProgInstalm,
         PlannedTotalDaysIL = learningDelivery.LearningDeliveryValues.PlannedTotalDaysIL,
         SecondIncentiveThresholdDate = learningDelivery.LearningDeliveryValues.SecondIncentiveThresholdDate,
         ThresholdDays = learningDelivery.LearningDeliveryValues.ThresholdDays,
     });
 }
예제 #2
0
        /// <summary>
        /// Learning delivery funding and monitoring type – apprenticeship contract type
        /// Learning delivery funding and monitoring type – ACT date applies from
        /// Learning delivery funding and monitoring type – ACT date applies to
        /// </summary>
        /// <param name="learningDelivery">The learning delivery which is not null along with the LearningDeliveryFAMs</param>
        /// <param name="model">The row model.</param>
        /// <param name="fm36DeliveryAttribute">The Fm36 delivery attribute.</param>
        /// <param name="fm36PriceEpisodeAttribute">The Fm36 price episode attribute.</param>
        /// <param name="hasPriceEpisodes">Flag indicating whether there are price episodes.</param>
        private void CalculateApprenticeshipContractTypeFields(
            ILearningDelivery learningDelivery,
            AppsIndicativeEarningsModel model,
            LearningDelivery fm36DeliveryAttribute,
            PriceEpisode fm36PriceEpisodeAttribute,
            bool hasPriceEpisodes)
        {
            bool learnDelMathEng          = fm36DeliveryAttribute?.LearningDeliveryValues?.LearnDelMathEng ?? false;
            bool useDeliveryAttributeDate = learnDelMathEng || !hasPriceEpisodes;

            ILearningDeliveryFAM[] acts = learningDelivery.LearningDeliveryFAMs.Where(x =>
                                                                                      string.Equals(x.LearnDelFAMType, Constants.LearningDeliveryFAMCodeACT, StringComparison.OrdinalIgnoreCase)).ToArray();

            if (acts.All(x => x.LearnDelFAMDateFromNullable == null))
            {
                return;
            }

            DateTime contractAppliesFrom = acts.Where(x =>
                                                      (useDeliveryAttributeDate && learningDelivery.LearnStartDate >= x.LearnDelFAMDateFromNullable) ||
                                                      (!useDeliveryAttributeDate && fm36PriceEpisodeAttribute?.PriceEpisodeValues.EpisodeStartDate >= x.LearnDelFAMDateFromNullable))
                                           .Select(x => x.LearnDelFAMDateFromNullable ?? DateTime.MinValue)
                                           .DefaultIfEmpty(DateTime.MinValue)
                                           .Max();

            DateTime contractAppliesTo = acts.Where(x =>
                                                    (useDeliveryAttributeDate && learningDelivery.LearnStartDate <= x.LearnDelFAMDateToNullable) ||
                                                    (!useDeliveryAttributeDate && fm36PriceEpisodeAttribute?.PriceEpisodeValues.EpisodeStartDate <= x.LearnDelFAMDateToNullable))
                                         .Select(x => x.LearnDelFAMDateToNullable ?? DateTime.MinValue)
                                         .DefaultIfEmpty(DateTime.MinValue)
                                         .Min();

            model.LearningDeliveryFAMTypeACTDateAppliesFrom = contractAppliesFrom == DateTime.MinValue ? $"" : contractAppliesFrom.ToString("dd/MM/yyyy");
            model.LearningDeliveryFAMTypeACTDateAppliesTo   = contractAppliesTo == DateTime.MinValue ? $"" : contractAppliesTo.ToString("dd/MM/yyyy");

            if (contractAppliesTo == DateTime.MinValue)
            {
                model.LearningDeliveryFAMTypeApprenticeshipContractType = acts.FirstOrDefault(x => x.LearnDelFAMDateToNullable == null)?.LearnDelFAMCode;
            }
            else
            {
                model.LearningDeliveryFAMTypeApprenticeshipContractType = acts.FirstOrDefault(x =>
                                                                                              x.LearnDelFAMDateFromNullable == contractAppliesFrom &&
                                                                                              x.LearnDelFAMDateToNullable == contractAppliesTo)?.LearnDelFAMCode;
            }
        }
예제 #3
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);
        }
예제 #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);
        }