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);
        }
Пример #2
0
        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);
        }
    }
Пример #3
0
        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());
        }
Пример #4
0
 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();
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #11
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);
        }
Пример #12
0
        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);
        }
Пример #13
0
        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);
        }
Пример #19
0
        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());
        }
Пример #21
0
        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);
        }
Пример #22
0
        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);
        }
Пример #23
0
 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);
        }
Пример #25
0
        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);
        }
Пример #28
0
        public IList <SubmittedLearnerAimModel> Build(ProcessLearnerCommand processLearnerCommand)
        {
            var intermediateAims = InitialLearnerTransform(processLearnerCommand, null);

            return(intermediateAims.Select(mapper.Map <SubmittedLearnerAimModel>).ToList());
        }
Пример #29
0
        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);
        }