public List <ApprenticeshipContractTypeEarningsEvent> Build(ProcessLearnerCommand learnerSubmission) { var intermediateResults = InitialLearnerTransform(learnerSubmission, true); var results = new List <ApprenticeshipContractTypeEarningsEvent>(); foreach (var intermediateLearningAim in intermediateResults) { var episodesByContractType = intermediateLearningAim.PriceEpisodes.GroupBy(x => x.PriceEpisodeValues.PriceEpisodeContractType); foreach (var priceEpisodes in episodesByContractType) { var learnerWithSortedPriceEpisodes = intermediateLearningAim.CopyReplacingPriceEpisodes(priceEpisodes); var earningEvent = factory.Create(priceEpisodes.Key); if (!earningEvent.IsPayable) { continue; } mapper.Map(learnerWithSortedPriceEpisodes, earningEvent); results.Add(earningEvent); } } return(results); }
private static List <IntermediateLearningAim> GetMathsAndEnglishAim(ProcessLearnerCommand learnerSubmission, List <LearningDelivery> learningDeliveries, bool singleContractType) { if (singleContractType) { return new List <IntermediateLearningAim> { new IntermediateLearningAim(learnerSubmission, new List <PriceEpisode>(), learningDeliveries) } } ; var results = new List <IntermediateLearningAim>(); var contractTypes = learningDeliveries.GetContractTypesForLearningDeliveries(); var distinctContractTypes = contractTypes.Distinct().ToList(); distinctContractTypes.ForEach(c => { var mathsAndEnglishAim = new IntermediateLearningAim(learnerSubmission, new List <PriceEpisode>(), learningDeliveries) { ContractType = c }; results.Add(mathsAndEnglishAim); }); return(results); } }
public IList <SubmittedLearnerAimModel> Build(ProcessLearnerCommand processLearnerCommand) { var intermediateAims = InitialLearnerTransform(processLearnerCommand, null); var validIntermediateAims = intermediateAims.Where(x => x.ContractType != ContractType.None); return(validIntermediateAims.Select(mapper.Map <SubmittedLearnerAimModel>).ToList()); }
public LearnerKey(ProcessLearnerCommand processLearnerCommand) { JobId = processLearnerCommand.JobId; AcademicYear = processLearnerCommand.CollectionYear; CollectionPeriod = processLearnerCommand.CollectionPeriod; LearnerUln = processLearnerCommand.Learner.ULN; LearnerRefNo = processLearnerCommand.Learner.LearnRefNumber; Ukprn = processLearnerCommand.Ukprn; }
public void When_DoNotGenerateACT1TransactionType4To16Payments_Is_True_Payments_Are_Generated_Correctly() { // arrange var learnerSubmission = new ProcessLearnerCommand { Learner = learner, CollectionYear = 1819, CollectionPeriod = 1, Ukprn = 12345, JobId = 1 }; var actEarnings = new List <ApprenticeshipContractTypeEarningsEvent> { new ApprenticeshipContractType1EarningEvent { OnProgrammeEarnings = new List <OnProgrammeEarning> { new OnProgrammeEarning() }, IncentiveEarnings = new List <IncentiveEarning> { new IncentiveEarning(), new IncentiveEarning() } }, new ApprenticeshipContractType2EarningEvent(), }; var functionalSkillEarnings = new List <FunctionalSkillEarningsEvent> { new Act2FunctionalSkillEarningsEvent(), new Act1FunctionalSkillEarningsEvent() }; configurationHelper .Setup(x => x.GetSetting("Settings", "DoNotGenerateACT1TransactionType4To16Payments")) .Returns("true"); actBuilder.Setup(b => b.Build(learnerSubmission)).Returns(actEarnings).Verifiable(); functionalSkillBuilder.Setup(b => b.Build(learnerSubmission)).Returns(functionalSkillEarnings).Verifiable(); // act var result = mocker.Create <LearnerSubmissionProcessor>().GenerateEarnings(learnerSubmission); // assert result.EarningEvents.Should().HaveCount(3); var act1Payments = result.EarningEvents.OfType <ApprenticeshipContractType1EarningEvent>().ToList(); act1Payments.Should().HaveCount(1); act1Payments.First().IncentiveEarnings.Should().BeEmpty(); result.EarningEvents.OfType <Act1FunctionalSkillEarningsEvent>().Should().BeEmpty(); }
protected static List <IntermediateLearningAim> InitialLearnerTransform(ProcessLearnerCommand learnerSubmission, bool?mainAim) { var results = new List <IntermediateLearningAim>(); var groupedLearningDeliveries = learnerSubmission.Learner.LearningDeliveries .GroupBy(ld => new { ld.LearningDeliveryValues.LearnAimRef, ld.LearningDeliveryValues.FworkCode, ld.LearningDeliveryValues.ProgType, ld.LearningDeliveryValues.PwayCode, ld.LearningDeliveryValues.StdCode }); foreach (var groupedLearningDelivery in groupedLearningDeliveries) { var orderedGroupedLearningDelivery = groupedLearningDelivery.OrderByDescending(x => x.LearningDeliveryValues.LearnStartDate).ToList(); var learningDelivery = orderedGroupedLearningDelivery.First(); if (mainAim.HasValue && mainAim.Value != learningDelivery.IsMainAim()) { continue; } var priceEpisodes = learnerSubmission.Learner.PriceEpisodes .Where(x => orderedGroupedLearningDelivery.Any(g => g.AimSeqNumber == x.PriceEpisodeValues.PriceEpisodeAimSeqNumber)) .ToList(); if (!learningDelivery.IsMainAim()) { // Maths & English var mathsAndEnglishAims = GetMathsAndEnglishAim(learnerSubmission, orderedGroupedLearningDelivery, mainAim.HasValue); results.AddRange(mathsAndEnglishAims); continue; } var group = priceEpisodes.Where(pe => IsCurrentAcademicYear(pe.PriceEpisodeValues, learnerSubmission.CollectionYear)) .GroupBy(p => p.PriceEpisodeValues.PriceEpisodeContractType); foreach (var episodes in group) { var intermediateAim = new IntermediateLearningAim(learnerSubmission, episodes, orderedGroupedLearningDelivery) { ContractType = MappingExtensions.GetContractType(episodes.Key) }; results.Add(intermediateAim); } } return(results); }
public void TestAct1EarningIsDetected() { // arrange var fm36Learner = new FM36Learner { PriceEpisodes = new List <PriceEpisode>() { new PriceEpisode { PriceEpisodeIdentifier = "1", PriceEpisodeValues = new PriceEpisodeValues { PriceEpisodeContractType = "Non-Levy Contract", EpisodeStartDate = new DateTime(2018, 8, 6), PriceEpisodeAimSeqNumber = 4 }, PriceEpisodePeriodisedValues = new List <PriceEpisodePeriodisedValues>() } }, LearningDeliveries = new List <LearningDelivery> { new LearningDelivery { AimSeqNumber = 4, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "ld1" } } } }; var processLearnerCommand = new ProcessLearnerCommand { Learner = fm36Learner, CollectionYear = 1819, Ukprn = 12345, JobId = 69, CollectionPeriod = 1, IlrSubmissionDateTime = DateTime.UtcNow, SubmissionDate = DateTime.UtcNow }; var learningAim = new IntermediateLearningAim(processLearnerCommand, fm36Learner.PriceEpisodes, fm36Learner.LearningDeliveries); // act var earningEvent = mapper.Map <IntermediateLearningAim, ApprenticeshipContractType1EarningEvent>(learningAim); // assert earningEvent.PriceEpisodes.Single().Identifier.Should().Be("1"); }
public IntermediateLearningAim( ProcessLearnerCommand command, IEnumerable <PriceEpisode> priceEpisodes, LearningDelivery aim) { Aim = aim; PriceEpisodes.AddRange(FilterPriceEpisodes(priceEpisodes, command.CollectionYear)); Learner = command.Learner; Ukprn = command.Ukprn; AcademicYear = command.CollectionYear; CollectionPeriod = command.CollectionPeriod; IlrSubmissionDateTime = command.IlrSubmissionDateTime; IlrFileName = command.IlrFileName; JobId = command.JobId; }
public ProcessLearnerCommandBuilder() { learnerCommand = new ProcessLearnerCommand { Ukprn = 1, JobId = 1, CollectionPeriod = 1, CollectionYear = 1920, IlrSubmissionDateTime = DateTime.Today, SubmissionDate = DateTime.Today, Learner = new FM36Learner { LearnRefNumber = "learner-a", ULN = 1234678, PriceEpisodes = new List <PriceEpisode> { new PriceEpisode { PriceEpisodeIdentifier = "PE-1", PriceEpisodeValues = new PriceEpisodeValues { EpisodeStartDate = new DateTime(2019, 8, 1), PriceEpisodeActualEndDate = new DateTime(2020, 7, 31), PriceEpisodeAimSeqNumber = 1, PriceEpisodeContractType = "Contract for services with the employer" }, PriceEpisodePeriodisedValues = new List <PriceEpisodePeriodisedValues>() } }, LearningDeliveries = new List <LearningDelivery> { new LearningDelivery { AimSeqNumber = 1, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "ZPROG001", StdCode = 50, ProgType = 25 }, LearningDeliveryPeriodisedValues = new List <LearningDeliveryPeriodisedValues>(), LearningDeliveryPeriodisedTextValues = new List <LearningDeliveryPeriodisedTextValues>() } } } }; }
public void PriorAcademicYearAimsAreExcluded() { var plc = new ProcessLearnerCommand { CollectionPeriod = 3, CollectionYear = 1920, Ukprn = 1234, Learner = new FM36Learner { LearnRefNumber = "learner-a", ULN = 123, PriceEpisodes = new List <PriceEpisode> { new PriceEpisode { PriceEpisodeIdentifier = "25-17-01/01/2019", PriceEpisodeValues = new PriceEpisodeValues { EpisodeStartDate = DateTime.Parse("2019-01-01T00:00:00+00:00"), PriceEpisodeActualEndDate = DateTime.Parse("2019-07-31T00:00:00+00:00"), PriceEpisodeAimSeqNumber = 1, PriceEpisodeContractType = "Contract for services with the ESFA" } } }, LearningDeliveries = new List <LearningDelivery> { new LearningDelivery { AimSeqNumber = 1, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "ZPROG001", LearnStartDate = DateTime.Parse("2019-01-01T00:00:00+00:00") } } } } }; var builder = new SubmittedLearnerAimBuilder(mapper); var submittedAims = builder.Build(plc); submittedAims.Should().HaveCount(0); }
public async Task <bool> IsDuplicate(ProcessLearnerCommand processLearnerCommand, CancellationToken cancellationToken) { logger.LogDebug($"Checking if command of type {processLearnerCommand.GetType().Name} with guid: {processLearnerCommand.CommandId} has already been received."); var learnerKey = new LearnerKey(processLearnerCommand); logger.LogDebug($"learner key: {learnerKey.LogSafeKey}"); if (await cache.Contains(learnerKey.Key, cancellationToken).ConfigureAwait(false)) { logger.LogWarning($"Key: {learnerKey.LogSafeKey} found in the cache and is probably a duplicate."); return(true); } logger.LogDebug($"New learner command. Command key: {learnerKey.LogSafeKey}, command id: {processLearnerCommand.CommandId}"); await cache.Add(learnerKey.Key, learnerKey, cancellationToken); logger.LogInfo($"Added new earnings event to cache. Key: {learnerKey.LogSafeKey}"); return(false); }
public async Task <List <EarningEvent> > CreateLearnerEarningEvents(ProcessLearnerCommand processLearnerCommand) { var earningEvents = new List <EarningEvent>(); if (await duplicateLearnerService.IsDuplicate(processLearnerCommand, CancellationToken.None)) { return(earningEvents); } logger.LogDebug($"Handling ILR learner submission. Job: {processLearnerCommand.JobId}, Collection year: {processLearnerCommand.CollectionYear}, Learner: {processLearnerCommand.Learner.LearnRefNumber}"); var processorResult = learnerSubmissionProcessor.GenerateEarnings(processLearnerCommand); if (processorResult.Validation.Failed) { logger.LogInfo($"ILR Learner Submission failed validation. Job: {processLearnerCommand.JobId}, Collection year: {processLearnerCommand.CollectionYear}, Learner: {processLearnerCommand.Learner.LearnRefNumber}"); return(earningEvents); } earningEvents = processorResult.EarningEvents; return(earningEvents); }
public async Task WhenAProcessLearnerCommandIsHandledByTheProcessLearnerService() { var command = new ProcessLearnerCommand { JobId = TestSession.GenerateId(100000), CollectionPeriod = 1, CollectionYear = 1920, CommandId = Guid.NewGuid(), IlrFileName = "SomeFile", IlrSubmissionDateTime = DateTime.Now, Ukprn = TestSession.GenerateId(), Learner = GetFm36Learner() }; Context.Add(ProcessLearnerCommand, command); Context.Add(JobIds, new List <long> { command.JobId }); await MessageSession.Send(command); }
public List <ApprenticeshipContractTypeEarningsEvent> Build(ProcessLearnerCommand learnerSubmission) { var intermediateResults = InitialLearnerTransform(learnerSubmission, true); var results = new List <ApprenticeshipContractTypeEarningsEvent>(); foreach (var intermediateLearningAim in intermediateResults) { var episodesByContractType = intermediateLearningAim.PriceEpisodes.GroupBy(x => x.PriceEpisodeValues.PriceEpisodeContractType); var redundancyDates = intermediateLearningAim.PriceEpisodes .Where(pe => pe.PriceEpisodeValues.PriceEpisodeRedStatusCode == 1 && pe.PriceEpisodeValues.PriceEpisodeRedStartDate.HasValue) .OrderBy(pe => pe.PriceEpisodeValues.PriceEpisodeRedStartDate) .Select(pe => new { pe.PriceEpisodeValues.PriceEpisodeRedStartDate, pe.PriceEpisodeIdentifier }).FirstOrDefault(); foreach (var priceEpisodes in episodesByContractType) { var learnerWithSortedPriceEpisodes = intermediateLearningAim.CopyReplacingPriceEpisodes(priceEpisodes); var earningEvent = factory.Create(priceEpisodes.Key); if (!earningEvent.IsPayable) { continue; } mapper.Map(learnerWithSortedPriceEpisodes, earningEvent); if (redundancyDates != null && earningEvent.PriceEpisodes.Any(pe => pe.Identifier == redundancyDates.PriceEpisodeIdentifier)) { results.AddRange(redundancyEarningService.SplitContractEarningByRedundancyDate(earningEvent, redundancyDates.PriceEpisodeRedStartDate.Value)); } else { results.Add(earningEvent); } } } return(results); }
protected static List <IntermediateLearningAim> InitialLearnerTransform(ProcessLearnerCommand learnerSubmission, bool?mainAim) { var results = new List <IntermediateLearningAim>(); foreach (var learningDelivery in learnerSubmission.Learner.LearningDeliveries) { if (mainAim.HasValue && mainAim.Value != learningDelivery.IsMainAim()) { continue; } var priceEpisodes = learnerSubmission.Learner.PriceEpisodes .Where(x => x.PriceEpisodeValues.PriceEpisodeAimSeqNumber == learningDelivery.AimSeqNumber) .ToList(); if (!learningDelivery.IsMainAim()) { // Maths & English var mathsAndEnglishAims = GetMathsAndEnglishAim(learnerSubmission, learningDelivery, mainAim.HasValue); results.AddRange(mathsAndEnglishAims); continue; } var group = priceEpisodes.GroupBy(p => p.PriceEpisodeValues.PriceEpisodeContractType); foreach (var episodes in group) { var intermediateAim = new IntermediateLearningAim(learnerSubmission, episodes, learningDelivery) { ContractType = MappingExtensions.GetContractType(episodes.Key) }; results.Add(intermediateAim); } } return(results); }
public async Task WhenTheILRIsSubmittedAndTheLearnerEarningsAreSentToTheEarningEventsService() { var command = new ProcessLearnerCommand { Ukprn = TestSession.Ukprn, CollectionYear = CollectionYear, CollectionPeriod = CollectionPeriod, JobId = TestSession.JobId, RequestTime = DateTime.UtcNow, Learner = new FM36Learner { LearnRefNumber = TestSession.Learner.LearnRefNumber, PriceEpisodes = new List <PriceEpisode>(), LearningDeliveries = new List <LearningDelivery>() } }; IlrLearnerEarnings.ForEach(earnings => { AddLearnerEarnings(command.Learner, earnings); }); await MessageSession.Send(command, new SendOptions()); }
public void Fails_If_Validation_Fails() { mocker.Mock <ILearnerValidator>() .Setup(x => x.Validate(It.IsAny <FM36Learner>())) .Returns(new ValidationResult(new List <ValidationRuleResult> { ValidationRuleResult.Failure("some failure") })) .Verifiable(); var learnerSubmission = new ProcessLearnerCommand { Learner = learner, CollectionYear = 1819, CollectionPeriod = 1, Ukprn = 12345, JobId = 1 }; var result = mocker.Create <LearnerSubmissionProcessor>().GenerateEarnings(learnerSubmission); Assert.IsTrue(result.Validation.Failed); Mock.Verify(validatorMock, actBuilder, functionalSkillBuilder); }
public void Generates_Apprenticeship_Contract_Earnings() { // arrange var learnerSubmission = new ProcessLearnerCommand { Learner = learner, CollectionYear = 1819, CollectionPeriod = 1, Ukprn = 12345, JobId = 1 }; var actEarnings = new List <ApprenticeshipContractTypeEarningsEvent> { new ApprenticeshipContractType2EarningEvent(), new ApprenticeshipContractType2EarningEvent() }; var functionalSkillEarnings = new List <FunctionalSkillEarningsEvent> { new Act2FunctionalSkillEarningsEvent(), new Act1FunctionalSkillEarningsEvent() }; actBuilder.Setup(b => b.Build(learnerSubmission)).Returns(actEarnings).Verifiable(); functionalSkillBuilder.Setup(b => b.Build(learnerSubmission)).Returns(functionalSkillEarnings).Verifiable(); // act var result = mocker.Create <LearnerSubmissionProcessor>().GenerateEarnings(learnerSubmission); // assert Assert.IsFalse(result.Validation.Failed); Assert.AreEqual(4, result.EarningEvents.Count); Mock.Verify(validatorMock, actBuilder, functionalSkillBuilder); }
public List <FunctionalSkillEarningsEvent> Build(ProcessLearnerCommand learnerSubmission) { var intermediateResults = InitialLearnerTransform(learnerSubmission, false); var results = new List <FunctionalSkillEarningsEvent>(); foreach (var intermediateLearningAim in intermediateResults) { var redundancyPeriods = CalculateRedundancyPeriods(intermediateLearningAim.PriceEpisodes); if (intermediateLearningAim.Aims.All(x => x.IsMainAim())) { continue; } var contractTypes = intermediateLearningAim.Aims.GetContractTypesForLearningDeliveries(); var distinctContractTypes = contractTypes.Where(x => x != ContractType.None).Distinct().ToList(); foreach (var contractType in distinctContractTypes) { var functionalSkillEarning = GetContractTypeFunctionalSkillEarningEvent(intermediateLearningAim, contractType); foreach (var earning in functionalSkillEarning.Earnings) { earning.Periods = GetEarningPeriodsMatchingContractType(contractTypes, contractType, earning.Periods.ToList()); } if (!functionalSkillEarning.Earnings.SelectMany(x => x.Periods).Any()) { continue; } functionalSkillEarning.LearningAim.FundingLineType = GetFirstMatchingFundingLineTypeForContractType(intermediateLearningAim, functionalSkillEarning); foreach (var earning in functionalSkillEarning.Earnings) { if (!earning.Periods.Any() || earning.Periods.Count == 12) { continue; } var earningPeriods = new List <EarningPeriod>(earning.Periods); var sfaContribution = earning.Periods.First().SfaContributionPercentage; for (byte i = 1; i < 13; i++) { if (earning.Periods.All(x => x.Period != i)) { earningPeriods.Add(new EarningPeriod { Amount = 0.0m, SfaContributionPercentage = sfaContribution, Period = i, }); } } earning.Periods = earningPeriods.AsReadOnly(); } results.AddRange(redundancyEarningService.OriginalAndRedundancyFunctionalSkillEarningEventIfRequired(functionalSkillEarning, redundancyPeriods)); } } return(results.Distinct().ToList()); }
public List <FunctionalSkillEarningsEvent> Build(ProcessLearnerCommand learnerSubmission) { var intermediateResults = InitialLearnerTransform(learnerSubmission, false); var results = new List <FunctionalSkillEarningsEvent>(); foreach (var intermediateLearningAim in intermediateResults) { var redundancyDates = learnerSubmission.Learner.PriceEpisodes .Where(pe => pe.PriceEpisodeValues.PriceEpisodeRedStatusCode == 1 && pe.PriceEpisodeValues.PriceEpisodeRedStartDate.HasValue) .OrderBy(pe => pe.PriceEpisodeValues.PriceEpisodeRedStartDate) .Select(pe => new { pe.PriceEpisodeValues.PriceEpisodeRedStartDate, pe.PriceEpisodeIdentifier }).FirstOrDefault(); if (intermediateLearningAim.Aims.All(x => x.IsMainAim())) { continue; } var contractTypes = intermediateLearningAim.Aims.GetContractTypesForLearningDeliveries(); var distinctContractTypes = contractTypes.Where(x => x != ContractType.None).Distinct().ToList(); foreach (var contractType in distinctContractTypes) { var functionalSkillEarning = GetContractTypeFunctionalSkillEarningEvent(intermediateLearningAim, contractType); foreach (var earning in functionalSkillEarning.Earnings) { earning.Periods = GetEarningPeriodsMatchingContractType(contractTypes, contractType, earning.Periods.ToList()); } if (!functionalSkillEarning.Earnings.SelectMany(x => x.Periods).Any()) { continue; } functionalSkillEarning.LearningAim.FundingLineType = GetFirstMatchingFundingLineTypeForContractType(intermediateLearningAim, functionalSkillEarning); foreach (var earning in functionalSkillEarning.Earnings) { if (!earning.Periods.Any() || earning.Periods.Count == 12) { continue; } var earningPeriods = new List <EarningPeriod>(earning.Periods); var sfaContribution = earning.Periods.First().SfaContributionPercentage; for (byte i = 1; i < 13; i++) { if (earning.Periods.All(x => x.Period != i)) { earningPeriods.Add(new EarningPeriod { Amount = 0.0m, SfaContributionPercentage = sfaContribution, Period = i, }); } } earning.Periods = earningPeriods.AsReadOnly(); } if (redundancyDates != null) { results.AddRange(redundancyEarningService.SplitFunctionSkillEarningByRedundancyDate(functionalSkillEarning, redundancyDates.PriceEpisodeRedStartDate.Value)); } else { results.Add(functionalSkillEarning); } } } return(results.Distinct().ToList()); }
public void FunctionalSkillBuild() { // arrange var builder = new FunctionalSkillEarningEventBuilder(mapper); var learnerSubmissionModel = new ProcessLearnerCommand { CollectionPeriod = 1, CollectionYear = 1920, Learner = new FM36Learner { LearningDeliveries = new EditableList <LearningDelivery> { new LearningDelivery { AimSeqNumber = 1, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "ZPROG001" }, LearningDeliveryPeriodisedValues = new EditableList <LearningDeliveryPeriodisedValues> { new LearningDeliveryPeriodisedValues { AttributeName = "MathEngBalPayment", Period1 = 0.0m, Period2 = 0.0m, Period3 = 0.0m, Period4 = 0.0m, Period5 = 0.0m, Period6 = 0.0m, Period7 = 0.0m, Period8 = 0.0m, Period9 = 0.0m, Period10 = 0.0m, Period11 = 0.0m, Period12 = 0.0m } }, LearningDeliveryPeriodisedTextValues = new EditableList <LearningDeliveryPeriodisedTextValues> { new LearningDeliveryPeriodisedTextValues { AttributeName = "LearnDelContType", Period1 = "Levy Contract", Period2 = "Levy Contract", Period3 = "Levy Contract", Period4 = "Levy Contract", Period5 = "Levy Contract", Period6 = "Levy Contract", Period7 = "Levy Contract", Period8 = "Levy Contract", Period9 = "Levy Contract", Period10 = "Levy Contract", Period11 = "Levy Contract", Period12 = "Levy Contract" }, new LearningDeliveryPeriodisedTextValues { AttributeName = "FundLineType", Period1 = "16-18 Apprenticeship (Employer on App Service)", Period2 = "16-18 Apprenticeship (Employer on App Service)", Period3 = "16-18 Apprenticeship (Employer on App Service)", Period4 = "16-18 Apprenticeship (Employer on App Service)", Period5 = "16-18 Apprenticeship (Employer on App Service)", Period6 = "16-18 Apprenticeship (Employer on App Service)", Period7 = "16-18 Apprenticeship (Employer on App Service)", Period8 = "16-18 Apprenticeship (Employer on App Service)", Period9 = "16-18 Apprenticeship (Employer on App Service)", Period10 = "16-18 Apprenticeship (Employer on App Service)", Period11 = "16-18 Apprenticeship (Employer on App Service)", Period12 = "16-18 Apprenticeship (Employer on App Service)" } } }, new LearningDelivery { AimSeqNumber = 2, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "M&E" }, LearningDeliveryPeriodisedValues = new EditableList <LearningDeliveryPeriodisedValues> { new LearningDeliveryPeriodisedValues { AttributeName = "MathEngBalPayment", Period1 = 1, Period2 = 2, Period3 = 3, Period4 = 4, Period5 = 5, Period6 = 6, Period7 = 7, Period8 = 8, Period9 = 9, Period10 = 10, Period11 = 11, Period12 = 12 } }, LearningDeliveryPeriodisedTextValues = new EditableList <LearningDeliveryPeriodisedTextValues> { new LearningDeliveryPeriodisedTextValues { AttributeName = "LearnDelContType", Period1 = "Levy Contract", Period2 = "Levy Contract", Period3 = "Levy Contract", Period4 = "Levy Contract", Period5 = "Levy Contract", Period6 = "Levy Contract", Period7 = "Levy Contract", Period8 = "Levy Contract", Period9 = "Levy Contract", Period10 = "Levy Contract", Period11 = "Levy Contract", Period12 = "Levy Contract" }, new LearningDeliveryPeriodisedTextValues { AttributeName = "FundLineType", Period1 = "16-18 Apprenticeship (Employer on App Service)", Period2 = "16-18 Apprenticeship (Employer on App Service)", Period3 = "16-18 Apprenticeship (Employer on App Service)", Period4 = "16-18 Apprenticeship (Employer on App Service)", Period5 = "16-18 Apprenticeship (Employer on App Service)", Period6 = "16-18 Apprenticeship (Employer on App Service)", Period7 = "16-18 Apprenticeship (Employer on App Service)", Period8 = "16-18 Apprenticeship (Employer on App Service)", Period9 = "16-18 Apprenticeship (Employer on App Service)", Period10 = "16-18 Apprenticeship (Employer on App Service)", Period11 = "16-18 Apprenticeship (Employer on App Service)", Period12 = "16-18 Apprenticeship (Employer on App Service)" } } } }, PriceEpisodes = new EditableList <PriceEpisode> { new PriceEpisode { PriceEpisodeValues = new PriceEpisodeValues { EpisodeStartDate = DateTime.Today, PriceEpisodeAimSeqNumber = 1, PriceEpisodeContractType = "Levy Contract", }, PriceEpisodePeriodisedValues = new EditableList <PriceEpisodePeriodisedValues> { new PriceEpisodePeriodisedValues { AttributeName = "PriceEpisodeOnProgPayment", Period1 = 10, Period2 = 20 } } } } } }; // act var events = builder.Build(learnerSubmissionModel); // assert events.Should().NotBeNull(); events.Should().HaveCount(1); events[0].ContractType.Should().Be(ContractType.Act1); events[0].Earnings[0].Periods.Should().HaveCount(12); }
public void MultipleLearningDeliveriesMapCorrectContractType() { // arrange var learnerSubmission2 = new ProcessLearnerCommand { CollectionPeriod = 1, CollectionYear = 1920, Learner = new FM36Learner { LearningDeliveries = new EditableList <LearningDelivery> { new LearningDelivery { AimSeqNumber = 1, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "English" }, LearningDeliveryPeriodisedValues = new EditableList <LearningDeliveryPeriodisedValues> { new LearningDeliveryPeriodisedValues { AttributeName = "MathEngBalPayment", Period1 = 1, Period2 = 2, Period3 = 3, Period4 = 4, Period5 = 5, Period6 = 6, Period7 = 7, Period8 = 8, Period9 = 9, Period10 = 10, Period11 = 11, Period12 = 12 } }, LearningDeliveryPeriodisedTextValues = new EditableList <LearningDeliveryPeriodisedTextValues> { new LearningDeliveryPeriodisedTextValues { AttributeName = "LearnDelContType", Period1 = "Levy Contract", Period2 = "Levy Contract", Period3 = "Levy Contract", Period4 = "Levy Contract", Period5 = "Levy Contract", Period6 = "Levy Contract", Period7 = "Levy Contract", Period8 = "Levy Contract", Period9 = "Levy Contract", Period10 = "Levy Contract", Period11 = "Levy Contract", Period12 = "Levy Contract" }, new LearningDeliveryPeriodisedTextValues { AttributeName = "FundLineType", Period1 = "16-18 Apprenticeship (Employer on App Service)", Period2 = "16-18 Apprenticeship (Employer on App Service)", Period3 = "16-18 Apprenticeship (Employer on App Service)", Period4 = "16-18 Apprenticeship (Employer on App Service)", Period5 = "16-18 Apprenticeship (Employer on App Service)", Period6 = "16-18 Apprenticeship (Employer on App Service)", Period7 = "16-18 Apprenticeship (Employer on App Service)", Period8 = "16-18 Apprenticeship (Employer on App Service)", Period9 = "16-18 Apprenticeship (Employer on App Service)", Period10 = "16-18 Apprenticeship (Employer on App Service)", Period11 = "16-18 Apprenticeship (Employer on App Service)", Period12 = "16-18 Apprenticeship (Employer on App Service)" } } }, new LearningDelivery { AimSeqNumber = 2, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "Maths" }, LearningDeliveryPeriodisedValues = new EditableList <LearningDeliveryPeriodisedValues> { new LearningDeliveryPeriodisedValues { AttributeName = "MathEngBalPayment", Period1 = 1, Period2 = 2, Period3 = 3, Period4 = 4, Period5 = 5, Period6 = 6, Period7 = 7, Period8 = 8, Period9 = 9, Period10 = 10, Period11 = 11, Period12 = 12 } }, LearningDeliveryPeriodisedTextValues = new EditableList <LearningDeliveryPeriodisedTextValues> { new LearningDeliveryPeriodisedTextValues { AttributeName = "LearnDelContType", Period1 = "Non-Levy Contract", Period2 = "Non-Levy Contract", Period3 = "Non-Levy Contract", Period4 = "Non-Levy Contract", Period5 = "Non-Levy Contract", Period6 = "Non-Levy Contract", Period7 = "Non-Levy Contract", Period8 = "Non-Levy Contract", Period9 = "Non-Levy Contract", Period10 = "Non-Levy Contract", Period11 = "Non-Levy Contract", Period12 = "Non-Levy Contract" }, new LearningDeliveryPeriodisedTextValues { AttributeName = "FundLineType", Period1 = "16-18 Apprenticeship (Employer on App Service)", Period2 = "16-18 Apprenticeship (Employer on App Service)", Period3 = "16-18 Apprenticeship (Employer on App Service)", Period4 = "16-18 Apprenticeship (Employer on App Service)", Period5 = "16-18 Apprenticeship (Employer on App Service)", Period6 = "16-18 Apprenticeship (Employer on App Service)", Period7 = "16-18 Apprenticeship (Employer on App Service)", Period8 = "16-18 Apprenticeship (Employer on App Service)", Period9 = "16-18 Apprenticeship (Employer on App Service)", Period10 = "16-18 Apprenticeship (Employer on App Service)", Period11 = "16-18 Apprenticeship (Employer on App Service)", Period12 = "16-18 Apprenticeship (Employer on App Service)" } } }, }, PriceEpisodes = new EditableList <PriceEpisode> { } } }; var sut = new FunctionalSkillEarningEventBuilder(mapper); // act var events = sut.Build(learnerSubmission2); // assert events.Should().NotBeNull(); events.Should().HaveCount(2); events[0].Should().BeAssignableTo <Act1FunctionalSkillEarningsEvent>(); events[0].ContractType.Should().Be(ContractType.Act1); events[1].Should().BeAssignableTo <Act2FunctionalSkillEarningsEvent>(); events[1].ContractType.Should().Be(ContractType.Act2); }
public void SetUp() { learnerSubmission = new ProcessLearnerCommand { Ukprn = 1000, CollectionPeriod = 1, CollectionYear = 1920, SubmissionDate = DateTime.Today, JobId = 1, Learner = new FM36Learner { LearningDeliveries = new EditableList <LearningDelivery> { new LearningDelivery { AimSeqNumber = 1, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "5011397X", LearnDelInitialFundLineType = "16-18 Apprenticeship (Employer on App Service)", }, LearningDeliveryPeriodisedValues = new EditableList <LearningDeliveryPeriodisedValues> { new LearningDeliveryPeriodisedValues { AttributeName = "MathEngOnProgPayment", Period1 = 1, Period2 = 2, Period3 = 3, Period4 = 4, Period5 = 5, Period6 = 6, Period7 = 7, Period8 = 8, Period9 = 9, Period10 = 10, Period11 = 11, Period12 = 12 } }, LearningDeliveryPeriodisedTextValues = new EditableList <LearningDeliveryPeriodisedTextValues> { new LearningDeliveryPeriodisedTextValues { AttributeName = "LearnDelContType", Period1 = "None", Period2 = "None", Period3 = "None", Period4 = "None", Period5 = "None", Period6 = "None", Period7 = "None", Period8 = "None", Period9 = "None", Period10 = "None", Period11 = "None", Period12 = "None", }, new LearningDeliveryPeriodisedTextValues { AttributeName = "FundLineType", Period1 = "none", Period2 = "none", Period3 = "none", Period4 = "none", Period5 = "none", Period6 = "none", Period7 = "none", Period8 = "none", Period9 = "none", Period10 = "none", Period11 = "none", Period12 = "none", } } }, new LearningDelivery { AimSeqNumber = 2, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "5022394X", LearnDelInitialFundLineType = "16-18 Apprenticeship (Employer on App Service)", }, LearningDeliveryPeriodisedValues = new EditableList <LearningDeliveryPeriodisedValues> { new LearningDeliveryPeriodisedValues { AttributeName = "MathEngOnProgPayment", Period1 = 1, Period2 = 2, Period3 = 3, Period4 = 4, Period5 = 5, Period6 = 6, Period7 = 7, Period8 = 8, Period9 = 9, Period10 = 10, Period11 = 11, Period12 = 12 } }, LearningDeliveryPeriodisedTextValues = new EditableList <LearningDeliveryPeriodisedTextValues> { new LearningDeliveryPeriodisedTextValues { AttributeName = "LearnDelContType", Period1 = "None", Period2 = "None", Period3 = "None", Period4 = "None", Period5 = "None", Period6 = "None", Period7 = "None", Period8 = "None", Period9 = "None", Period10 = "None", Period11 = "None", Period12 = "None", }, new LearningDeliveryPeriodisedTextValues { AttributeName = "FundLineType", Period1 = "none", Period2 = "none", Period3 = "none", Period4 = "none", Period5 = "none", Period6 = "none", Period7 = "none", Period8 = "none", Period9 = "none", Period10 = "none", Period11 = "none", Period12 = "none", } } }, new LearningDelivery { AimSeqNumber = 3, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "ZPROG001" }, LearningDeliveryPeriodisedValues = new EditableList <LearningDeliveryPeriodisedValues> { new LearningDeliveryPeriodisedValues { AttributeName = "MathEngBalPayment", Period1 = 0.0m, Period2 = 0.0m, Period3 = 0.0m, Period4 = 0.0m, Period5 = 0.0m, Period6 = 0.0m, Period7 = 0.0m, Period8 = 0.0m, Period9 = 0.0m, Period10 = 0.0m, Period11 = 0.0m, Period12 = 0.0m } }, LearningDeliveryPeriodisedTextValues = new EditableList <LearningDeliveryPeriodisedTextValues> { new LearningDeliveryPeriodisedTextValues { AttributeName = "LearnDelContType", Period1 = "Levy Contract", Period2 = "Levy Contract", Period3 = "Levy Contract", Period4 = "Levy Contract", Period5 = "Levy Contract", Period6 = "Levy Contract", Period7 = "Levy Contract", Period8 = "Levy Contract", Period9 = "Levy Contract", Period10 = "Levy Contract", Period11 = "Levy Contract", Period12 = "Levy Contract" }, new LearningDeliveryPeriodisedTextValues { AttributeName = "FundLineType", Period1 = "16-18 Apprenticeship (Employer on App Service)", Period2 = "16-18 Apprenticeship (Employer on App Service)", Period3 = "16-18 Apprenticeship (Employer on App Service)", Period4 = "16-18 Apprenticeship (Employer on App Service)", Period5 = "16-18 Apprenticeship (Employer on App Service)", Period6 = "16-18 Apprenticeship (Employer on App Service)", Period7 = "16-18 Apprenticeship (Employer on App Service)", Period8 = "16-18 Apprenticeship (Employer on App Service)", Period9 = "16-18 Apprenticeship (Employer on App Service)", Period10 = "16-18 Apprenticeship (Employer on App Service)", Period11 = "16-18 Apprenticeship (Employer on App Service)", Period12 = "16-18 Apprenticeship (Employer on App Service)" } } }, new LearningDelivery { AimSeqNumber = 4, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "5011394X", LearnDelInitialFundLineType = "16-18 Apprenticeship (Employer on App Service)", }, LearningDeliveryPeriodisedValues = new EditableList <LearningDeliveryPeriodisedValues> { new LearningDeliveryPeriodisedValues { AttributeName = "MathEngOnProgPayment", Period1 = 1, Period2 = 2, Period3 = 3, Period4 = 4, Period5 = 5, Period6 = 6, Period7 = 7, Period8 = 8, Period9 = 9, Period10 = 10, Period11 = 11, Period12 = 12 } }, LearningDeliveryPeriodisedTextValues = new EditableList <LearningDeliveryPeriodisedTextValues> { new LearningDeliveryPeriodisedTextValues { AttributeName = "LearnDelContType", Period1 = "Non-Levy Contract", Period2 = "Non-Levy Contract", Period3 = "Non-Levy Contract", Period4 = "Non-Levy Contract", Period5 = "None", Period6 = "None", Period7 = "Levy Contract", Period8 = "Levy Contract", Period9 = "Levy Contract", Period10 = "Levy Contract", Period11 = "Levy Contract", Period12 = "Levy Contract" }, new LearningDeliveryPeriodisedTextValues { AttributeName = "FundLineType", Period1 = "16-18 Apprenticeship Non-Levy Contract (procured)", Period2 = "16-18 Apprenticeship Non-Levy Contract (procured)", Period3 = "16-18 Apprenticeship Non-Levy Contract (procured)", Period4 = "16-18 Apprenticeship Non-Levy Contract (procured)", Period5 = "none", Period6 = "none", Period7 = "16-18 Apprenticeship (Employer on App Service)", Period8 = "16-18 Apprenticeship (Employer on App Service)", Period9 = "16-18 Apprenticeship (Employer on App Service)", Period10 = "16-18 Apprenticeship (Employer on App Service)", Period11 = "16-18 Apprenticeship (Employer on App Service)", Period12 = "16-18 Apprenticeship (Employer on App Service)" } } }, }, PriceEpisodes = new EditableList <PriceEpisode> { new PriceEpisode { PriceEpisodeValues = new PriceEpisodeValues { EpisodeStartDate = DateTime.Today, PriceEpisodeAimSeqNumber = 3, PriceEpisodeContractType = "Levy Contract", TNP1 = 2500, PriceEpisodeFundLineType = "16-18 Apprenticeship (Employer on App Service)", }, PriceEpisodePeriodisedValues = new EditableList <PriceEpisodePeriodisedValues> { new PriceEpisodePeriodisedValues { AttributeName = "PriceEpisodeOnProgPayment", Period1 = 10, Period2 = 20 } } } } } }; }
public void TestAimsAreCreatedFromCommand() { var processLearnerCommand = new ProcessLearnerCommand { CollectionPeriod = 2, CollectionYear = 2021, IlrSubmissionDateTime = DateTime.Now, JobId = 3, Ukprn = 4, Learner = new FM36Learner { ULN = 5, LearnRefNumber = "6", LearningDeliveries = new List <LearningDelivery> { new LearningDelivery { AimSeqNumber = 1, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "ZPROG001", FworkCode = 11, PwayCode = 12, ProgType = 13, StdCode = 14 } }, new LearningDelivery { AimSeqNumber = 2, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "M&E", FworkCode = 21, PwayCode = 22, ProgType = 23, StdCode = 24 }, LearningDeliveryPeriodisedValues = new List <LearningDeliveryPeriodisedValues> { new LearningDeliveryPeriodisedValues { AttributeName = "MathEngBalPayment", Period1 = 1, Period2 = 2 } }, LearningDeliveryPeriodisedTextValues = new List <LearningDeliveryPeriodisedTextValues> { new LearningDeliveryPeriodisedTextValues { AttributeName = "LearnDelContType", Period1 = "Levy Contract", Period2 = "Levy Contract", Period3 = "Levy Contract", Period4 = "Levy Contract", Period5 = "Levy Contract", Period6 = "Levy Contract", Period7 = "Levy Contract", Period8 = "Levy Contract", Period9 = "Levy Contract", Period10 = "Levy Contract", Period11 = "Levy Contract", Period12 = "Levy Contract" } }, } }, PriceEpisodes = new List <PriceEpisode> { new PriceEpisode { PriceEpisodeValues = new PriceEpisodeValues { PriceEpisodeAimSeqNumber = 1, PriceEpisodeContractType = "Levy Contract", EpisodeStartDate = DateTime.Today, }, PriceEpisodePeriodisedValues = new List <PriceEpisodePeriodisedValues> { new PriceEpisodePeriodisedValues { AttributeName = "PriceEpisodeOnProgPayment", Period1 = 10, Period2 = 20 } } } } } }; var builder = new SubmittedLearnerAimBuilder(mapper); var submittedAims = builder.Build(processLearnerCommand); submittedAims.Should().HaveCount(2); var mainAim = submittedAims.Single(aim => aim.LearningAimReference == "ZPROG001"); var mathsAndEnglishAim = submittedAims.Single(aim => aim.LearningAimReference != "ZPROG001"); mainAim.AcademicYear.Should().Be(processLearnerCommand.CollectionYear); mainAim.CollectionPeriod.Should().Be((byte)processLearnerCommand.CollectionPeriod); mainAim.IlrSubmissionDateTime.Should().Be(processLearnerCommand.IlrSubmissionDateTime); mainAim.JobId.Should().Be(processLearnerCommand.JobId); mainAim.LearnerReferenceNumber.Should().Be(processLearnerCommand.Learner.LearnRefNumber); mainAim.LearnerUln.Should().Be(processLearnerCommand.Learner.ULN); mainAim.LearningAimFrameworkCode.Should().Be(processLearnerCommand.Learner.LearningDeliveries[0].LearningDeliveryValues.FworkCode); mainAim.LearningAimPathwayCode.Should().Be(processLearnerCommand.Learner.LearningDeliveries[0].LearningDeliveryValues.PwayCode); mainAim.LearningAimProgrammeType.Should().Be(processLearnerCommand.Learner.LearningDeliveries[0].LearningDeliveryValues.ProgType); mainAim.LearningAimStandardCode.Should().Be(processLearnerCommand.Learner.LearningDeliveries[0].LearningDeliveryValues.StdCode); mainAim.Ukprn.Should().Be(processLearnerCommand.Ukprn); mathsAndEnglishAim.AcademicYear.Should().Be(processLearnerCommand.CollectionYear); mathsAndEnglishAim.CollectionPeriod.Should().Be((byte)processLearnerCommand.CollectionPeriod); mathsAndEnglishAim.IlrSubmissionDateTime.Should().Be(processLearnerCommand.IlrSubmissionDateTime); mathsAndEnglishAim.JobId.Should().Be(processLearnerCommand.JobId); mathsAndEnglishAim.LearnerReferenceNumber.Should().Be(processLearnerCommand.Learner.LearnRefNumber); mathsAndEnglishAim.LearnerUln.Should().Be(processLearnerCommand.Learner.ULN); mathsAndEnglishAim.LearningAimFrameworkCode.Should().Be(processLearnerCommand.Learner.LearningDeliveries[1].LearningDeliveryValues.FworkCode); mathsAndEnglishAim.LearningAimPathwayCode.Should().Be(processLearnerCommand.Learner.LearningDeliveries[1].LearningDeliveryValues.PwayCode); mathsAndEnglishAim.LearningAimProgrammeType.Should().Be(processLearnerCommand.Learner.LearningDeliveries[1].LearningDeliveryValues.ProgType); mathsAndEnglishAim.LearningAimStandardCode.Should().Be(processLearnerCommand.Learner.LearningDeliveries[1].LearningDeliveryValues.StdCode); mathsAndEnglishAim.Ukprn.Should().Be(processLearnerCommand.Ukprn); }
public (ValidationResult Validation, List <EarningEvent> EarningEvents) GenerateEarnings(ProcessLearnerCommand learnerSubmission) { var validationResult = learnerValidator.Validate(learnerSubmission.Learner); if (validationResult.Failed) { return(Validation : validationResult, EarningEvents : null); } var earningsEvent = new List <EarningEvent>(); earningsEvent.AddRange(apprenticeshipContractTypeEarningsEventBuilder.Build(learnerSubmission)); earningsEvent.AddRange(functionalSkillEarningsEventBuilder.Build(learnerSubmission)); var validEarningsEvent = FilterEarningsEventBasedOnConfig(earningsEvent); RemoveFuturePeriods(earningsEvent); return(Validation : validationResult, EarningEvents : validEarningsEvent); }
public void BuildFundingLineTypeCorrectly() { var processLearnerCommand = new ProcessLearnerCommand { Ukprn = 1, JobId = 1, CollectionPeriod = 1, CollectionYear = 1920, IlrSubmissionDateTime = DateTime.Today, SubmissionDate = DateTime.Today, Learner = new FM36Learner { LearnRefNumber = "learner-a", LearningDeliveries = new List <LearningDelivery> { new LearningDelivery { AimSeqNumber = 1, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "ZPROG001", StdCode = 100, FworkCode = 200, ProgType = 300, PwayCode = 400, LearnDelInitialFundLineType = "Funding Line Type 1", LearnStartDate = DateTime.Today.AddDays(-5) } }, new LearningDelivery { AimSeqNumber = 2, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "ZPROG001", StdCode = 100, FworkCode = 200, ProgType = 300, PwayCode = 400, LearnDelInitialFundLineType = "Funding Line Type 2", LearnStartDate = DateTime.Today.AddDays(-6) }, } }, PriceEpisodes = new List <PriceEpisode> { new PriceEpisode { PriceEpisodeIdentifier = "pe-1", PriceEpisodeValues = new PriceEpisodeValues { EpisodeStartDate = DateTime.Parse("2019-08-01"), PriceEpisodeActualEndDate = null, PriceEpisodeFundLineType = "19+ Apprenticeship Non-Levy Contract (procured)", EpisodeEffectiveTNPStartDate = DateTime.Parse("2017-05-08T00:00:00+00:00"), PriceEpisodeContractType = "Non-Levy Contract", PriceEpisodeAimSeqNumber = 1, PriceEpisodePlannedEndDate = DateTime.Parse("2019-10-01"), PriceEpisodePlannedInstalments = 12, PriceEpisodeCompletionElement = 3000, PriceEpisodeInstalmentValue = 1000, TNP1 = 15000, TNP2 = 15000, PriceEpisodeCompleted = true, PriceEpisodeCumulativePMRs = 13, PriceEpisodeCompExemCode = 14, PriceEpisodeTotalTNPPrice = 30000 }, PriceEpisodePeriodisedValues = new List <PriceEpisodePeriodisedValues> { new PriceEpisodePeriodisedValues { AttributeName = "PriceEpisodeOnProgPayment", Period1 = 1000, Period2 = 1000, Period3 = 1000, Period4 = 1000, Period5 = 1000, Period6 = 1000, Period7 = 1000, Period8 = 1000, Period9 = 1000, Period10 = 1000, Period11 = 1000, Period12 = 1000, }, new PriceEpisodePeriodisedValues { AttributeName = "PriceEpisodeCompletionPayment", Period1 = 0, Period2 = 0, Period3 = 0, Period4 = 0, Period5 = 0, Period6 = 0, Period7 = 0, Period8 = 0, Period9 = 0, Period10 = 0, Period11 = 0, Period12 = 3000, }, new PriceEpisodePeriodisedValues { AttributeName = "PriceEpisodeBalancePayment", Period1 = 0, Period2 = 0, Period3 = 0, Period4 = 0, Period5 = 0, Period6 = 0, Period7 = 0, Period8 = 0, Period9 = 0, Period10 = 0, Period11 = 0, Period12 = 3000, }, } }, new PriceEpisode { PriceEpisodeIdentifier = "pe-2", PriceEpisodeValues = new PriceEpisodeValues { EpisodeStartDate = new DateTime(2019, 10, 1), PriceEpisodeActualEndDate = null, PriceEpisodeFundLineType = "19+ Apprenticeship Levy Contract (procured)", EpisodeEffectiveTNPStartDate = new DateTime(2017, 05, 1), PriceEpisodeContractType = "Levy Contract", PriceEpisodeAimSeqNumber = 2, PriceEpisodePlannedEndDate = new DateTime(2019, 12, 1), PriceEpisodePlannedInstalments = 12, PriceEpisodeCompletionElement = 3000, PriceEpisodeInstalmentValue = 1000, TNP1 = 15000, TNP2 = 15000, PriceEpisodeCompleted = true, PriceEpisodeCumulativePMRs = 13, PriceEpisodeCompExemCode = 14, PriceEpisodeTotalTNPPrice = 30000 }, PriceEpisodePeriodisedValues = new List <PriceEpisodePeriodisedValues> { new PriceEpisodePeriodisedValues { AttributeName = "PriceEpisodeOnProgPayment", Period1 = 1000, Period2 = 1000, Period3 = 1000, Period4 = 1000, Period5 = 1000, Period6 = 1000, Period7 = 1000, Period8 = 1000, Period9 = 1000, Period10 = 1000, Period11 = 1000, Period12 = 1000, }, new PriceEpisodePeriodisedValues { AttributeName = "PriceEpisodeCompletionPayment", Period1 = 0, Period2 = 0, Period3 = 0, Period4 = 0, Period5 = 0, Period6 = 0, Period7 = 0, Period8 = 0, Period9 = 0, Period10 = 0, Period11 = 0, Period12 = 3000, }, new PriceEpisodePeriodisedValues { AttributeName = "PriceEpisodeBalancePayment", Period1 = 0, Period2 = 0, Period3 = 0, Period4 = 0, Period5 = 0, Period6 = 0, Period7 = 0, Period8 = 0, Period9 = 0, Period10 = 0, Period11 = 0, Period12 = 3000, }, } }, } } }; var builder = new ApprenticeshipContractTypeEarningsEventBuilder(new ApprenticeshipContractTypeEarningsEventFactory(), mapper); var events = builder.Build(processLearnerCommand); events.Should().NotBeNull(); events[0].PriceEpisodes[0].FundingLineType.Should().Be(processLearnerCommand.Learner.PriceEpisodes[0].PriceEpisodeValues.PriceEpisodeFundLineType); events[1].PriceEpisodes[0].FundingLineType.Should().Be(processLearnerCommand.Learner.PriceEpisodes[1].PriceEpisodeValues.PriceEpisodeFundLineType); }
public void RemovesFuturePeriodsForAct1() { // arrange var learnerSubmission = new ProcessLearnerCommand { Learner = learner, CollectionYear = 1819, CollectionPeriod = 1, Ukprn = 12345, JobId = 1 }; var actEarnings = new List <ApprenticeshipContractTypeEarningsEvent> { new ApprenticeshipContractType1EarningEvent { CollectionPeriod = new CollectionPeriod { AcademicYear = 1, Period = 1 }, IncentiveEarnings = new List <IncentiveEarning> { new IncentiveEarning { Type = IncentiveEarningType.Balancing16To18FrameworkUplift, Periods = new List <EarningPeriod> { new EarningPeriod { Period = 1 }, new EarningPeriod { Period = 2 } }.AsReadOnly() }, new IncentiveEarning { Type = IncentiveEarningType.Balancing16To18FrameworkUplift, Periods = new List <EarningPeriod> { new EarningPeriod { Period = 3 }, new EarningPeriod { Period = 4 } }.AsReadOnly() } }, OnProgrammeEarnings = new EditableList <OnProgrammeEarning> { new OnProgrammeEarning { Periods = new List <EarningPeriod> { new EarningPeriod { Period = 1 }, new EarningPeriod { Period = 2 } }.AsReadOnly() }, new OnProgrammeEarning { Periods = new List <EarningPeriod> { new EarningPeriod { Period = 3 }, new EarningPeriod { Period = 4 } }.AsReadOnly() } } } }; var functionalSkillEarnings = new List <FunctionalSkillEarningsEvent> { new Act1FunctionalSkillEarningsEvent { CollectionPeriod = new CollectionPeriod { AcademicYear = 1, Period = 1 }, Earnings = new List <FunctionalSkillEarning> { new FunctionalSkillEarning { Periods = new List <EarningPeriod> { new EarningPeriod { Period = 1 }, new EarningPeriod { Period = 2 } }.AsReadOnly() } }.AsReadOnly() } }; actBuilder.Setup(b => b.Build(learnerSubmission)).Returns(actEarnings).Verifiable(); functionalSkillBuilder.Setup(b => b.Build(learnerSubmission)).Returns(functionalSkillEarnings).Verifiable(); // act var result = mocker.Create <LearnerSubmissionProcessor>().GenerateEarnings(learnerSubmission); // assert Assert.AreEqual(2, result.EarningEvents.Count); Assert.IsInstanceOf <ApprenticeshipContractTypeEarningsEvent>(result.EarningEvents[0]); var act2Earning = (ApprenticeshipContractTypeEarningsEvent)result.EarningEvents[0]; Assert.AreEqual(1, act2Earning.IncentiveEarnings.Count); Assert.AreEqual(1, act2Earning.IncentiveEarnings[0].Periods.Count); Assert.AreEqual(1, act2Earning.IncentiveEarnings[0].Periods[0].Period); Assert.AreEqual(1, act2Earning.OnProgrammeEarnings.Count); Assert.AreEqual(1, act2Earning.OnProgrammeEarnings[0].Periods.Count); Assert.AreEqual(1, act2Earning.OnProgrammeEarnings[0].Periods[0].Period); Assert.IsInstanceOf <FunctionalSkillEarningsEvent>(result.EarningEvents[1]); var mathsEarning = (FunctionalSkillEarningsEvent)result.EarningEvents[1]; Assert.AreEqual(1, mathsEarning.Earnings.Count); Assert.AreEqual(1, mathsEarning.Earnings[0].Periods.Count); Assert.AreEqual(1, mathsEarning.Earnings[0].Periods[0].Period); Mock.Verify(validatorMock, actBuilder, functionalSkillBuilder); }
public IList <SubmittedLearnerAimModel> Build(ProcessLearnerCommand processLearnerCommand) { var intermediateAims = InitialLearnerTransform(processLearnerCommand, null); return(intermediateAims.Select(mapper.Map <SubmittedLearnerAimModel>).ToList()); }
public void TestBuild() { // arrange var expectedResult = new Act1FunctionalSkillEarningsEvent { Earnings = new List <FunctionalSkillEarning>().AsReadOnly() }; var builder = new FunctionalSkillEarningEventBuilder(mapper, redundancyEarningService.Object); var learnerSubmissionModel = new ProcessLearnerCommand { CollectionPeriod = 1, CollectionYear = 1920, Learner = new FM36Learner { LearningDeliveries = new EditableList <LearningDelivery> { new LearningDelivery { AimSeqNumber = 1, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "ZPROG001" } }, new LearningDelivery { AimSeqNumber = 2, LearningDeliveryValues = new LearningDeliveryValues { LearnAimRef = "M&E", LearnDelInitialFundLineType = "Non-Levy Contract" }, LearningDeliveryPeriodisedValues = new EditableList <LearningDeliveryPeriodisedValues> { new LearningDeliveryPeriodisedValues { AttributeName = "MathEngBalPayment", Period1 = 1, Period2 = 2 } }, LearningDeliveryPeriodisedTextValues = new EditableList <LearningDeliveryPeriodisedTextValues> { new LearningDeliveryPeriodisedTextValues { AttributeName = "LearnDelContType", Period1 = "Levy Contract", Period2 = "Levy Contract", Period3 = "Levy Contract", Period4 = "Levy Contract", Period5 = "Levy Contract", Period6 = "Levy Contract", Period7 = "Levy Contract", Period8 = "Levy Contract", Period9 = "Levy Contract", Period10 = "Levy Contract", Period11 = "Levy Contract", Period12 = "Levy Contract" }, new LearningDeliveryPeriodisedTextValues { AttributeName = "FundLineType", Period1 = "16-18 Apprenticeship (Employer on App Service)", Period2 = "16-18 Apprenticeship (Employer on App Service)", Period3 = "16-18 Apprenticeship (Employer on App Service)", Period4 = "16-18 Apprenticeship (Employer on App Service)", Period5 = "16-18 Apprenticeship (Employer on App Service)", Period6 = "16-18 Apprenticeship (Employer on App Service)", Period7 = "16-18 Apprenticeship (Employer on App Service)", Period8 = "16-18 Apprenticeship (Employer on App Service)", Period9 = "16-18 Apprenticeship (Employer on App Service)", Period10 = "16-18 Apprenticeship (Employer on App Service)", Period11 = "16-18 Apprenticeship (Employer on App Service)", Period12 = "16-18 Apprenticeship (Employer on App Service)" } } } }, PriceEpisodes = new EditableList <PriceEpisode> { new PriceEpisode { PriceEpisodeValues = new PriceEpisodeValues { EpisodeStartDate = DateTime.Today, PriceEpisodeAimSeqNumber = 1, PriceEpisodeContractType = "Levy Contract", }, PriceEpisodePeriodisedValues = new EditableList <PriceEpisodePeriodisedValues> { new PriceEpisodePeriodisedValues { AttributeName = "PriceEpisodeOnProgPayment", Period1 = 10, Period2 = 20 } } } } } }; // act var events = builder.Build(learnerSubmissionModel); // assert events.Should().NotBeNull(); events.Should().HaveCount(1); }