public EarningPeriodsValidationProcessor(ICourseValidationProcessor courseValidationProcessor,
                                          IFunctionalSkillValidationProcessor functionalSkillValidationProcessor,
                                          ICalculatePeriodStartAndEndDate calculatePeriodStartAndEndDate)
 {
     this.courseValidationProcessor          = courseValidationProcessor ?? throw new ArgumentNullException(nameof(courseValidationProcessor));
     this.functionalSkillValidationProcessor = functionalSkillValidationProcessor ?? throw new ArgumentNullException(nameof(functionalSkillValidationProcessor));
     this.calculatePeriodStartAndEndDate     = calculatePeriodStartAndEndDate ?? throw new ArgumentNullException(nameof(calculatePeriodStartAndEndDate));
 }
示例#2
0
 public OnProgrammeAndIncentiveEarningPeriodsValidationProcessor(
     IStartDateValidator startDateValidator,
     IOnProgrammeAndIncentiveStoppedValidator onProgrammeAndIncentiveStoppedValidator,
     ICompletionStoppedValidator completionStoppedValidator,
     ICourseValidationProcessor courseValidationProcessor)
 {
     this.startDateValidator = startDateValidator;
     this.onProgrammeAndIncentiveStoppedValidator = onProgrammeAndIncentiveStoppedValidator;
     this.completionStoppedValidator = completionStoppedValidator;
     this.courseValidationProcessor  = courseValidationProcessor;
 }
        private (List <EarningPeriod> ValidPeriods, List <EarningPeriod> InValidPeriods) ValidateEarningPeriods(
            long ukprn,
            long uln,
            List <PriceEpisode> priceEpisodes,
            List <EarningPeriod> periods,
            TransactionType transactionType,
            List <ApprenticeshipModel> apprenticeships,
            LearningAim aim,
            int academicYear, ICourseValidationProcessor processor)
        {
            var validPeriods   = new List <EarningPeriod>();
            var invalidPeriods = new List <EarningPeriod>();

            foreach (var period in periods)
            {
                if (period.Amount == decimal.Zero)
                {
                    validPeriods.Add(period);
                    continue;
                }

                var apprenticeshipsToUseThisPeriod = GetApprenticeshipsToUseThisPeriod(ukprn, apprenticeships, academicYear, period);
                if (!apprenticeshipsToUseThisPeriod.Any())
                {
                    continue;
                }

                foreach (var apprenticeship in apprenticeshipsToUseThisPeriod)
                {
                    var validationModel = new DataLockValidationModel
                    {
                        EarningPeriod  = period,
                        Apprenticeship = apprenticeship,
                        PriceEpisode   = IsFunctionalSkillTransactionType(transactionType)
                            ? null
                            : priceEpisodes.SingleOrDefault(o =>
                                                            o.Identifier.Equals(period.PriceEpisodeIdentifier, StringComparison.OrdinalIgnoreCase))
                                         ?? throw new InvalidOperationException($"Failed to find price episode: {period.PriceEpisodeIdentifier} for uln: {uln}, earning: {transactionType:G}, period: {period.Period}"),
                                               TransactionType = transactionType,
                                               Aim             = aim,
                                               AcademicYear    = academicYear
                    };

                    var validationResult = processor.ValidateCourse(validationModel);
                    var newEarningPeriod = CreateEarningPeriod(period);
                    if (validationResult.DataLockFailures.Any())
                    {
                        var invalidPeriod = invalidPeriods.FirstOrDefault(x => x.Period == period.Period);

                        if (invalidPeriod == null)
                        {
                            newEarningPeriod.DataLockFailures = validationResult.DataLockFailures;
                            invalidPeriods.Add(newEarningPeriod);
                        }
                        else
                        {
                            invalidPeriod.DataLockFailures.AddRange(validationResult.DataLockFailures);
                        }
                    }
                    else
                    {
                        newEarningPeriod.AccountId                    = apprenticeship.AccountId;
                        newEarningPeriod.ApprenticeshipId             = apprenticeship.Id;
                        newEarningPeriod.ApprenticeshipPriceEpisodeId = validationResult.MatchedPriceEpisode.Id;
                        newEarningPeriod.TransferSenderAccountId      = apprenticeship.TransferSendingEmployerAccountId;
                        newEarningPeriod.Priority     = apprenticeship.Priority;
                        newEarningPeriod.AgreedOnDate = apprenticeship.AgreedOnDate;
                        newEarningPeriod.ApprenticeshipEmployerType = apprenticeship.ApprenticeshipEmployerType;
                        validPeriods.Add(newEarningPeriod);
                    }
                }
            }

            return(validPeriods, invalidPeriods);
        }