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, }); }
/// <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; } }
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 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); }