예제 #1
0
        public (List <ApprenticeshipModel> validApprenticeships, List <DataLockFailure> dataLockFailures) Validate
            (PriceEpisode ilrPriceEpisode, List <ApprenticeshipModel> apprenticeships, TransactionType transactionType)
        {
            // Only deal with Transaction Type 2 & 3 (Completion and balancing)
            if (transactionType != TransactionType.Completion && transactionType != TransactionType.Balancing)
            {
                return(apprenticeships, new List <DataLockFailure>());
            }

            var matchedApprenticeships = apprenticeships
                                         .Where(a =>
            {
                if (a.Status != ApprenticeshipStatus.Stopped)
                {
                    return(true);
                }
                return(ilrPriceEpisode.ActualEndDate <= a.StopDate);
            }).ToList();

            if (matchedApprenticeships.Any())
            {
                return(matchedApprenticeships, new List <DataLockFailure>());
            }

            var dataLockFailures = apprenticeships.Select(a => new DataLockFailure
            {
                ApprenticeshipId = a.Id,
                ApprenticeshipPriceEpisodeIds = a.ApprenticeshipPriceEpisodes
                                                .Where(o => !o.Removed)
                                                .Select(x => x.Id).ToList(),
                DataLockError = DataLockErrorCode.DLOCK_10
            }).ToList();

            return(new List <ApprenticeshipModel>(), dataLockFailures);
        }
        public void ScenariosThatDoNotCreateDlockErrors(string errorMessage, TransactionType transactionType, DateTime ilrDate, DateTime commitmentDate)
        {
            var priceEpisode = new PriceEpisode
            {
                Identifier    = PriceEpisodeIdentifier,
                ActualEndDate = ilrDate,
            };
            var apprenticeships = new List <ApprenticeshipModel>
            {
                new ApprenticeshipModel
                {
                    Id     = 2,
                    Status = ApprenticeshipStatus.Stopped,
                    ApprenticeshipPriceEpisodes = new List <ApprenticeshipPriceEpisodeModel>
                    {
                        new ApprenticeshipPriceEpisodeModel
                        {
                            Id = 200,
                        }
                    },
                    StopDate = commitmentDate,
                },
            };

            var validator = new CompletionStoppedValidator();
            var result    = validator.Validate(priceEpisode, apprenticeships, transactionType);

            result.dataLockFailures.Should().BeEmpty();
            result.validApprenticeships[0].Id.Should().Be(2);
            result.validApprenticeships[0].ApprenticeshipPriceEpisodes[0].Id.Should().Be(200);
        }
예제 #3
0
        public void ValidCommitmentsShouldBeCommitmentsThatStartOnOrBeforePriceEpisode(
            List <ApprenticeshipModel> apprenticeshipModels, PriceEpisode priceEpisode)
        {
            priceEpisode.EffectiveTotalNegotiatedPriceStartDate = new DateTime(2018, 8, 1);

            apprenticeshipModels[0].ApprenticeshipPriceEpisodes[0].StartDate = new DateTime(2018, 6, 1);
            apprenticeshipModels[0].ApprenticeshipPriceEpisodes[0].EndDate   = new DateTime(2018, 8, 1);
            apprenticeshipModels[0].ApprenticeshipPriceEpisodes[0].Removed   = false;
            apprenticeshipModels[0].ApprenticeshipPriceEpisodes.RemoveRange(1, 2);

            apprenticeshipModels[1].ApprenticeshipPriceEpisodes[0].StartDate = new DateTime(2018, 8, 1);
            apprenticeshipModels[1].ApprenticeshipPriceEpisodes[0].EndDate   = new DateTime(2019, 8, 30);
            apprenticeshipModels[1].ApprenticeshipPriceEpisodes[0].Removed   = false;
            apprenticeshipModels[1].ApprenticeshipPriceEpisodes.RemoveRange(1, 2);

            apprenticeshipModels[2].ApprenticeshipPriceEpisodes[0].StartDate = new DateTime(2019, 9, 1);
            apprenticeshipModels[2].ApprenticeshipPriceEpisodes[0].EndDate   = new DateTime(2020, 9, 30);
            apprenticeshipModels[2].ApprenticeshipPriceEpisodes[0].Removed   = false;
            apprenticeshipModels[2].ApprenticeshipPriceEpisodes.RemoveRange(1, 2);

            var validator = new StartDateValidator(false);
            var result    = validator.Validate(priceEpisode, apprenticeshipModels);

            result.dataLockFailures.Should().BeEmpty();
            result.validApprenticeships.Should().HaveCount(2);
            result.validApprenticeships.Any(x => x.Id == apprenticeshipModels[0].Id).Should().BeTrue();
            result.validApprenticeships.Any(x => x.Id == apprenticeshipModels[1].Id).Should().BeTrue();
        }
        public void MapPriceEpisodeToLearningAimFundingLineType()
        {
            var priceEpisode = new PriceEpisode
            {
                EffectiveTotalNegotiatedPriceStartDate = DateTime.UtcNow,
                PlannedEndDate      = DateTime.UtcNow,
                ActualEndDate       = DateTime.UtcNow,
                CompletionAmount    = 100M,
                InstalmentAmount    = 200M,
                NumberOfInstalments = 16,
                FundingLineType     = "19+ Apprenticeship Non Levy Contract (procured)"
            };

            var learningAim = new LearningAim
            {
                FundingLineType = "flt",
                PathwayCode     = 3,
                StandardCode    = 4,
                ProgrammeType   = 5,
                FrameworkCode   = 6,
                Reference       = "7"
            };

            mapper.Map(priceEpisode, learningAim);

            learningAim.FundingLineType.Should().Be(priceEpisode.FundingLineType);
        }
예제 #5
0
        Validate(PriceEpisode ilrPriceEpisode, List <ApprenticeshipModel> apprenticeships)
        {
            if (disableDatalocks)
            {
                return(apprenticeships, new List <DataLockFailure>());
            }

            var dataLockFailures = new List <DataLockFailure>();

            var matchedApprenticeships = apprenticeships.Where(x => x.ApprenticeshipPriceEpisodes
                                                               .Any(priceEpisode => priceEpisode.StartDate <= ilrPriceEpisode.EffectiveTotalNegotiatedPriceStartDate && !priceEpisode.Removed))
                                         .ToList();

            if (matchedApprenticeships.Any())
            {
                return(matchedApprenticeships, dataLockFailures);
            }

            dataLockFailures = apprenticeships.Select(a => new DataLockFailure
            {
                ApprenticeshipId = a.Id,
                ApprenticeshipPriceEpisodeIds = a.ApprenticeshipPriceEpisodes
                                                .Where(o => !o.Removed)
                                                .Select(x => x.Id)
                                                .ToList(),
                DataLockError = DataLockErrorCode.DLOCK_09
            }).ToList();

            return(matchedApprenticeships, dataLockFailures);
        }
        public AppsIndicativeEarningsReportModel BuildLineModel(
            ILearner learner,
            ILearningDelivery learningDelivery,
            LearningDelivery fm36DeliveryAttribute,
            PriceEpisode fm36EpisodeAttribute,
            LARSLearningDelivery larsLearningDelivery,
            string notionalEndLevel,
            bool earliestEpisode,
            bool hasPriceEpisodes)
        {
            DateTime employmentStatusDate = learner.LearnerEmploymentStatuses?
                                            .Where(x => x.DateEmpStatApp <= learningDelivery.LearnStartDate).Select(x => x.DateEmpStatApp)
                                            .DefaultIfEmpty(DateTime.MinValue).Max() ?? DateTime.MinValue;

            var model = new AppsIndicativeEarningsReportModel
            {
                Learner = learner,
                ProviderSpecLearnerMonitoring =
                    _ilrModelMapper.MapProviderSpecLearnerMonitorings(learner.ProviderSpecLearnerMonitorings),
                ProviderSpecDeliveryMonitoring =
                    _ilrModelMapper.MapProviderSpecDeliveryMonitorings(learningDelivery
                                                                       .ProviderSpecDeliveryMonitorings),
                LearningDeliveryFAMs = _ilrModelMapper.MapLearningDeliveryFAMs(learningDelivery.LearningDeliveryFAMs),
                LearningDelivery     = learningDelivery,
                LarsLearningDelivery = larsLearningDelivery,
                EmploymentStatus     =
                    learner.LearnerEmploymentStatuses?.SingleOrDefault(x => x.DateEmpStatApp == employmentStatusDate),
                PriceEpisodeValues       = fm36EpisodeAttribute?.PriceEpisodeValues,
                StandardNotionalEndLevel = notionalEndLevel
            };

            model.EmpStatusMonitoringSmallEmployer = model.EmploymentStatus?.EmploymentStatusMonitorings
                                                     ?.FirstOrDefault(x => string.Equals(x.ESMType, ReportingConstants.EmploymentStatusMonitoringTypeSEM,
                                                                                         StringComparison.OrdinalIgnoreCase))?.ESMCode;
            model.FundingLineType      = GetFundingType(fm36DeliveryAttribute?.LearningDeliveryValues, fm36EpisodeAttribute?.PriceEpisodeValues);
            model.Fm36LearningDelivery = fm36DeliveryAttribute?.LearningDeliveryValues;

            if (learningDelivery?.LearningDeliveryFAMs != null)
            {
                CalculateApprenticeshipContractTypeFields(
                    learningDelivery,
                    model,
                    fm36DeliveryAttribute,
                    fm36EpisodeAttribute,
                    hasPriceEpisodes);
            }

            if (earliestEpisode || !hasPriceEpisodes)
            {
                CalculateAppFinTotals(model, learningDelivery);
            }

            var isMathsEngLearningDelivery = fm36DeliveryAttribute?.LearningDeliveryValues?.LearnDelMathEng ?? false;

            model.PeriodisedValues = BuildPeriodisedValuesModel(fm36EpisodeAttribute?.PriceEpisodePeriodisedValues,
                                                                fm36DeliveryAttribute?.LearningDeliveryPeriodisedValues, isMathsEngLearningDelivery);
            return(model);
        }
예제 #7
0
        private void VerifyDataLockCommitmentMatchesForPeriod(PriceEpisode priceEpisode, TableRow commitmentMatchesRow, DataLockMatch[] periodMatches, string period)
        {
            if (commitmentMatchesRow == null)
            {
                return;
            }

            if (commitmentMatchesRow.ContainsKey(priceEpisode.DataLockMatchKey))
            {
                if (ExpectingDataLockMatchForPriceEpisode(priceEpisode.DataLockMatchKey, commitmentMatchesRow))
                {
                    var matchingValue = commitmentMatchesRow[priceEpisode.DataLockMatchKey];

                    var priceEpisodeActualMatches = periodMatches
                                                    .Where(
                        m =>
                        m.PriceEpisodeId == priceEpisode.Id)
                                                    .ToArray();

                    Assert.AreEqual(1, priceEpisodeActualMatches.Length,
                                    $"Expecting to find a data lock match for employer {matchingValue} in period {period} and the price episode that spans {priceEpisode.DataLockMatchKey}.");

                    var commitments = StepDefinitionsContext.ReferenceDataContext.Commitments
                                      .Where(c => c.Id == priceEpisodeActualMatches[0].CommitmentId)
                                      .Select(c => new { Id = c.Id, Employer = c.Employer })
                                      .Distinct()
                                      .ToArray();

                    Assert.AreEqual(1, commitments.Length,
                                    $"Expecting to find a matching commitment for period {period} and the price episode that spans {priceEpisode.DataLockMatchKey}.");

                    long matchingValueLong;
                    if (long.TryParse(matchingValue, out matchingValueLong))
                    {
                        Assert.AreEqual(matchingValueLong, commitments[0].Id,
                                        $"Expecting to find a matching commitment for commitment id  {matchingValue} in period {period} for a price episode that spans {priceEpisode.DataLockMatchKey}.");
                    }
                    else
                    {
                        Assert.AreEqual(matchingValue, commitments[0].Employer,
                                        $"Expecting to find a matching commitment for employer {matchingValue} in period {period} for a price episode that spans {priceEpisode.DataLockMatchKey}.");
                    }
                }
                else
                {
                    var priceEpisodeActualMatches = periodMatches
                                                    .Where(
                        m =>
                        m.PriceEpisodeId == priceEpisode.Id)
                                                    .ToArray();

                    Assert.AreEqual(0, priceEpisodeActualMatches.Length,
                                    $"Expecting no data lock match for period {period} for a price episode that spans {priceEpisode.DataLockMatchKey}.");
                }
            }
        }
예제 #8
0
        public bool ShouldHoldBackCompletionPayment(decimal expectedContribution, PriceEpisode priceEpisode)
        {
            var reportedContribution            = priceEpisode.EmployerContribution ?? 0;
            var completionHoldBackExemptionCode = priceEpisode.CompletionHoldBackExemptionCode ?? 0;

            if (completionHoldBackExemptionCode > 0)
            {
                return(false);
            }

            return(reportedContribution < expectedContribution);
        }
        public void PriceEpisodesAreDistinctByIdentifier()
        {
            var episode1 = new PriceEpisode {
                Identifier = "hi"
            };
            var episode2 = new PriceEpisode {
                Identifier = "hi"
            };
            var list = new[] { episode1, episode2 };

            list.Distinct().Should().HaveCount(1);
        }
예제 #10
0
 public AEC_ApprenticeshipPriceEpisode BuildPriceEpisode(PriceEpisode pe, int ukprn, string learnRefNumber)
 {
     return(new AEC_ApprenticeshipPriceEpisode
     {
         UKPRN = ukprn,
         LearnRefNumber = learnRefNumber,
         PriceEpisodeIdentifier = pe.PriceEpisodeIdentifier,
         TNP4 = pe.PriceEpisodeValues.TNP4,
         TNP1 = pe.PriceEpisodeValues.TNP1,
         EpisodeStartDate = pe.PriceEpisodeValues.EpisodeStartDate,
         TNP2 = pe.PriceEpisodeValues.TNP2,
         TNP3 = pe.PriceEpisodeValues.TNP3,
         PriceEpisodeUpperBandLimit = pe.PriceEpisodeValues.PriceEpisodeUpperBandLimit,
         PriceEpisodePlannedEndDate = pe.PriceEpisodeValues.PriceEpisodePlannedEndDate,
         PriceEpisodeActualEndDate = pe.PriceEpisodeValues.PriceEpisodeActualEndDate,
         PriceEpisodeTotalTNPPrice = pe.PriceEpisodeValues.PriceEpisodeTotalTNPPrice,
         PriceEpisodeUpperLimitAdjustment = pe.PriceEpisodeValues.PriceEpisodeUpperLimitAdjustment,
         PriceEpisodePlannedInstalments = pe.PriceEpisodeValues.PriceEpisodePlannedInstalments,
         PriceEpisodeActualInstalments = pe.PriceEpisodeValues.PriceEpisodeActualInstalments,
         PriceEpisodeCompletionElement = pe.PriceEpisodeValues.PriceEpisodeCompletionElement,
         PriceEpisodePreviousEarnings = pe.PriceEpisodeValues.PriceEpisodePreviousEarnings,
         PriceEpisodeInstalmentValue = pe.PriceEpisodeValues.PriceEpisodeInstalmentValue,
         PriceEpisodeTotalEarnings = pe.PriceEpisodeValues.PriceEpisodeTotalEarnings,
         PriceEpisodeCompleted = pe.PriceEpisodeValues.PriceEpisodeCompleted,
         PriceEpisodeRemainingTNPAmount = pe.PriceEpisodeValues.PriceEpisodeRemainingTNPAmount,
         PriceEpisodeRemainingAmountWithinUpperLimit = pe.PriceEpisodeValues.PriceEpisodeRemainingAmountWithinUpperLimit,
         PriceEpisodeCappedRemainingTNPAmount = pe.PriceEpisodeValues.PriceEpisodeCappedRemainingTNPAmount,
         PriceEpisodeExpectedTotalMonthlyValue = pe.PriceEpisodeValues.PriceEpisodeExpectedTotalMonthlyValue,
         PriceEpisodeAimSeqNumber = pe.PriceEpisodeValues.PriceEpisodeAimSeqNumber.Value,
         PriceEpisodeFundLineType = pe.PriceEpisodeValues.PriceEpisodeFundLineType,
         EpisodeEffectiveTNPStartDate = pe.PriceEpisodeValues.EpisodeEffectiveTNPStartDate,
         PriceEpisodeFirstAdditionalPaymentThresholdDate = pe.PriceEpisodeValues.PriceEpisodeFirstAdditionalPaymentThresholdDate,
         PriceEpisodeSecondAdditionalPaymentThresholdDate = pe.PriceEpisodeValues.PriceEpisodeSecondAdditionalPaymentThresholdDate,
         PriceEpisodeContractType = pe.PriceEpisodeValues.PriceEpisodeContractType,
         PriceEpisodePreviousEarningsSameProvider = pe.PriceEpisodeValues.PriceEpisodePreviousEarningsSameProvider,
         PriceEpisodeTotalPMRs = pe.PriceEpisodeValues.PriceEpisodeTotalPMRs,
         PriceEpisodeCumulativePMRs = pe.PriceEpisodeValues.PriceEpisodeCumulativePMRs,
         PriceEpisodeCompExemCode = pe.PriceEpisodeValues.PriceEpisodeCompExemCode,
         PriceEpisodeLearnerAdditionalPaymentThresholdDate = pe.PriceEpisodeValues.PriceEpisodeLearnerAdditionalPaymentThresholdDate,
         PriceEpisodeRedStartDate = pe.PriceEpisodeValues.PriceEpisodeRedStartDate,
         PriceEpisodeRedStatusCode = pe.PriceEpisodeValues.PriceEpisodeRedStatusCode,
         PriceEpisodeActualEndDateIncEPA = pe.PriceEpisodeValues.PriceEpisodeActualEndDateIncEPA,
         PriceEpisode1618FUBalValue = pe.PriceEpisodeValues.PriceEpisode1618FUBalValue,
         PriceEpisodeApplic1618FrameworkUpliftCompElement = pe.PriceEpisodeValues.PriceEpisodeApplic1618FrameworkUpliftCompElement,
         PriceEpisode1618FrameworkUpliftTotPrevEarnings = pe.PriceEpisodeValues.PriceEpisode1618FrameworkUpliftTotPrevEarnings,
         PriceEpisode1618FrameworkUpliftRemainingAmount = pe.PriceEpisodeValues.PriceEpisode1618FrameworkUpliftRemainingAmount,
         PriceEpisode1618FUMonthInstValue = pe.PriceEpisodeValues.PriceEpisode1618FUMonthInstValue,
         PriceEpisode1618FUTotEarnings = pe.PriceEpisodeValues.PriceEpisode1618FUTotEarnings
     });
 }
예제 #11
0
        public void CompletionPaymentIsNotHeldWhenPaymentsSufficient(decimal paymentHistory)
        {
            // arrange
            var priceEpisode = new PriceEpisode
            {
                EmployerContribution            = 10,
                CompletionHoldBackExemptionCode = 0
            };

            // act
            var result = service.ShouldHoldBackCompletionPayment(paymentHistory, priceEpisode);

            // assert
            result.Should().BeFalse();
        }
예제 #12
0
        public void CompletionPaymentIsHeldWhenExemptCodeIsNull()
        {
            // arrange
            var paymentHistory = 12;
            var priceEpisode   = new PriceEpisode
            {
                EmployerContribution            = 11,
                CompletionHoldBackExemptionCode = null
            };

            // act
            var result = service.ShouldHoldBackCompletionPayment(paymentHistory, priceEpisode);

            // assert
            result.Should().BeTrue();
        }
예제 #13
0
        public void CompletionPaymentIsNotHeldWhenExemptCodeIsSet(int exemptionCode)
        {
            // arrange
            var paymentHistory = 9;
            var priceEpisode   = new PriceEpisode
            {
                EmployerContribution            = 10,
                CompletionHoldBackExemptionCode = exemptionCode
            };

            // act
            var result = service.ShouldHoldBackCompletionPayment(paymentHistory, priceEpisode);

            // assert
            result.Should().BeFalse();
        }
예제 #14
0
        private void VerifyDataLockPriceMatchesForPeriod(PriceEpisode priceEpisode, TableRow priceMatchesRow, DataLockMatch[] periodMatches, string period)
        {
            if (priceMatchesRow == null)
            {
                return;
            }

            if (priceMatchesRow.ContainsKey(priceEpisode.DataLockMatchKey))
            {
                if (ExpectingDataLockMatchForPriceEpisode(priceEpisode.DataLockMatchKey, priceMatchesRow))
                {
                    var matchingValue = decimal.Parse(priceMatchesRow[priceEpisode.DataLockMatchKey]);

                    var priceEpisodeActualMatches = periodMatches
                                                    .Where(
                        m =>
                        m.PriceEpisodeId == priceEpisode.Id)
                                                    .ToArray();

                    Assert.AreEqual(1, priceEpisodeActualMatches.Length,
                                    $"Expecting to find a data lock match for employer {matchingValue} in period {period} and the price episode that spans {priceEpisode.DataLockMatchKey}.");

                    var commitments = StepDefinitionsContext.ReferenceDataContext.Commitments
                                      .Where(c => c.Id == priceEpisodeActualMatches[0].CommitmentId && c.AgreedPrice == priceEpisodeActualMatches[0].Price)
                                      .Select(c => new { Price = c.AgreedPrice })
                                      .Distinct()
                                      .ToArray();

                    Assert.AreEqual(1, commitments.Length,
                                    $"Expecting to find a matching commitment for period {period} and the price episode that spans {priceEpisode.DataLockMatchKey}.");

                    Assert.AreEqual(matchingValue, commitments[0].Price,
                                    $"Expecting to find a matching commitment for employer {matchingValue} in period {period} for a price episode that spans {priceEpisode.DataLockMatchKey}.");
                }
                else
                {
                    var priceEpisodeActualMatches = periodMatches
                                                    .Where(
                        m =>
                        m.PriceEpisodeId == priceEpisode.Id)
                                                    .ToArray();

                    Assert.AreEqual(0, priceEpisodeActualMatches.Length,
                                    $"Expecting no data lock match for period {period} for a price episode that spans {priceEpisode.DataLockMatchKey}.");
                }
            }
        }
예제 #15
0
        public void When_price_episode_cannot_be_found_then_return_New(
            PriceEpisode priceEpisode,
            PriceEpisodeStatusCalculator sut)
        {
            var currentPriceEpisodes = new[]
            {
                new CurrentPriceEpisode
                {
                    PriceEpisodeIdentifier = "something else",
                    AgreedPrice            = priceEpisode.AgreedPrice,
                }
            };

            var r = sut.Match(currentPriceEpisodes, priceEpisode);

            r.Should().Be(PriceEpisodeStatus.New);
        }
예제 #16
0
        public void When_price_episode_price_changes_then_return_Updated(
            PriceEpisode priceEpisode,
            PriceEpisodeStatusCalculator sut)
        {
            var currentPriceEpisodes = new[]
            {
                new CurrentPriceEpisode
                {
                    PriceEpisodeIdentifier = priceEpisode.Identifier,
                    AgreedPrice            = 999,
                }
            };

            var r = sut.Match(currentPriceEpisodes, priceEpisode);

            r.Should().Be(PriceEpisodeStatus.Updated);
        }
예제 #17
0
        /// <summary>
        /// Learning delivery funding and monitoring type – apprenticeship contract type
        /// Learning delivery funding and monitoring type – ACT date applies from
        /// Learning delivery funding and monitoring type – ACT date applies to
        /// </summary>
        /// <param name="learningDelivery">The learning delivery which is not null along with the LearningDeliveryFAMs</param>
        /// <param name="model">The row model.</param>
        /// <param name="fm36DeliveryAttribute">The Fm36 delivery attribute.</param>
        /// <param name="fm36PriceEpisodeAttribute">The Fm36 price episode attribute.</param>
        /// <param name="hasPriceEpisodes">Flag indicating whether there are price episodes.</param>
        private void CalculateApprenticeshipContractTypeFields(
            ILearningDelivery learningDelivery,
            AppsIndicativeEarningsModel model,
            LearningDelivery fm36DeliveryAttribute,
            PriceEpisode fm36PriceEpisodeAttribute,
            bool hasPriceEpisodes)
        {
            bool learnDelMathEng          = fm36DeliveryAttribute?.LearningDeliveryValues?.LearnDelMathEng ?? false;
            bool useDeliveryAttributeDate = learnDelMathEng || !hasPriceEpisodes;

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

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

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

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

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

            if (contractAppliesTo == DateTime.MinValue)
            {
                model.LearningDeliveryFAMTypeApprenticeshipContractType = acts.FirstOrDefault(x => x.LearnDelFAMDateToNullable == null)?.LearnDelFAMCode;
            }
            else
            {
                model.LearningDeliveryFAMTypeApprenticeshipContractType = acts.FirstOrDefault(x =>
                                                                                              x.LearnDelFAMDateFromNullable == contractAppliesFrom &&
                                                                                              x.LearnDelFAMDateToNullable == contractAppliesTo)?.LearnDelFAMCode;
            }
        }
예제 #18
0
        public void When_price_episode_is_stored_and_has_not_changed_then_return_New(
            PriceEpisode priceEpisode,
            PriceEpisodeStatusCalculator sut)
        {
            var currentPriceEpisodes = new[]
            {
                new CurrentPriceEpisode
                {
                    PriceEpisodeIdentifier = priceEpisode.Identifier,
                    AgreedPrice            = priceEpisode.AgreedPrice,
                }
            };

            var r = sut.Match(currentPriceEpisodes, priceEpisode);

            r.Should().Be(PriceEpisodeStatus.New);
        }
예제 #19
0
        public PriceEpisodeStatus Match(
            IEnumerable <CurrentPriceEpisode> recordedPriceEpisodes,
            PriceEpisode newPriceEpisode)
        {
            var previous = recordedPriceEpisodes.FirstOrDefault(MatchById(newPriceEpisode));

            if (previous == null)
            {
                return(PriceEpisodeStatus.New);
            }

            if (previous.AgreedPrice == newPriceEpisode.AgreedPrice)
            {
                return(PriceEpisodeStatus.New);
            }

            return(PriceEpisodeStatus.Updated);
        }
        public async Task When_job_succeeded_builds_approval_event_for_new_and_updated_price_episodes(
            ICurrentPriceEpisodeForJobStore currentContext,
            IReceivedDataLockEventStore receivedContext,
            TestCaseData testCaseData,
            PriceEpisode newPriceEpisode,
            EarningPeriod newPeriod,
            PriceEpisodesReceivedService sut)
        {
            // Given
            testCaseData.earning.PriceEpisodes.Add(newPriceEpisode);

            newPeriod.ApprenticeshipId       = testCaseData.apprenticeship.Id;
            newPeriod.AccountId              = testCaseData.apprenticeship.AccountId;
            newPeriod.PriceEpisodeIdentifier = newPriceEpisode.Identifier;
            testCaseData.earning.OnProgrammeEarnings[0].Periods =
                testCaseData.earning.OnProgrammeEarnings[0].Periods.Append(newPeriod).ToList().AsReadOnly();

            await currentContext.Add(CreateCurrentPriceEpisodeFor(testCaseData.earning));

            await testCaseData.AddDataLockEventToContext(receivedContext);

            // When
            var changeMessages = await sut.GetPriceEpisodeChanges(testCaseData.earning.JobId, testCaseData.earning.Ukprn, testCaseData.earning.CollectionYear);

            // Then
            changeMessages.Should().ContainEquivalentOf(
                new
            {
                DataLock = new
                {
                    PriceEpisodeIdentifier = testCaseData.earning.PriceEpisodes[0].Identifier,
                    Status = PriceEpisodeStatus.Updated,
                },
            });
            changeMessages.Should().ContainEquivalentOf(
                new
            {
                DataLock = new
                {
                    PriceEpisodeIdentifier = newPriceEpisode.Identifier,
                    Status = PriceEpisodeStatus.New,
                },
            });
        }
        public void CalculateApprenticeshipContractTypeFields(
            ILearningDelivery learningDelivery,
            AppsIndicativeEarningsReportModel model,
            LearningDelivery fm36DeliveryAttribute,
            PriceEpisode fm36PriceEpisodeAttribute,
            bool hasPriceEpisodes)
        {
            bool learnDelMathEng          = fm36DeliveryAttribute?.LearningDeliveryValues?.LearnDelMathEng ?? false;
            bool useDeliveryAttributeDate = learnDelMathEng || !hasPriceEpisodes;

            ILearningDeliveryFAM[] acts = learningDelivery.LearningDeliveryFAMs.Where(x => x.LearnDelFAMType.CaseInsensitiveEquals(LearningDeliveryFAMTypeConstants.ACT)).ToArray();

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


            model.LearningDeliveryFAMTypeACTDateAppliesFrom = acts.Where(x =>
                                                                         (useDeliveryAttributeDate && learningDelivery.LearnStartDate >= x.LearnDelFAMDateFromNullable) ||
                                                                         (!useDeliveryAttributeDate && fm36PriceEpisodeAttribute?.PriceEpisodeValues.EpisodeStartDate >=
                                                                          x.LearnDelFAMDateFromNullable))
                                                              .Select(x => x.LearnDelFAMDateFromNullable)
                                                              .MaxOrDefault();

            model.LearningDeliveryFAMTypeACTDateAppliesTo = acts.Where(x =>
                                                                       (useDeliveryAttributeDate && learningDelivery.LearnStartDate <= x.LearnDelFAMDateToNullable) ||
                                                                       (!useDeliveryAttributeDate && fm36PriceEpisodeAttribute?.PriceEpisodeValues.EpisodeStartDate <= x.LearnDelFAMDateToNullable))
                                                            .Select(x => x.LearnDelFAMDateToNullable)
                                                            .MinOrDefault();

            if (model.LearningDeliveryFAMTypeACTDateAppliesTo == null)
            {
                model.LearningDeliveryFAMTypeApprenticeshipContractType = acts.FirstOrDefault(x => x.LearnDelFAMDateToNullable == null)?.LearnDelFAMCode;
            }
            else
            {
                model.LearningDeliveryFAMTypeApprenticeshipContractType = acts.FirstOrDefault(x =>
                                                                                              x.LearnDelFAMDateFromNullable == model.LearningDeliveryFAMTypeACTDateAppliesFrom &&
                                                                                              x.LearnDelFAMDateToNullable == model.LearningDeliveryFAMTypeACTDateAppliesTo)?.LearnDelFAMCode;
            }
        }
        public void ScenariosThatCreateDlockErrors(string errorMessage, TransactionType transactionType, DateTime ilrDate, DateTime commitmentDate)
        {
            var priceEpisode = new PriceEpisode
            {
                Identifier    = PriceEpisodeIdentifier,
                ActualEndDate = ilrDate,
            };
            var apprenticeships = new List <ApprenticeshipModel>
            {
                new ApprenticeshipModel
                {
                    Id = 1,
                    ApprenticeshipPriceEpisodes = new List <ApprenticeshipPriceEpisodeModel>
                    {
                        new ApprenticeshipPriceEpisodeModel
                        {
                            Id = 100,
                        },
                        new ApprenticeshipPriceEpisodeModel
                        {
                            Id      = 200,
                            Removed = true
                        },
                    },
                    StopDate = commitmentDate, // Last day of 1819
                    Status   = ApprenticeshipStatus.Stopped,
                }
            };

            var validator = new CompletionStoppedValidator();
            var result    = validator.Validate(priceEpisode, apprenticeships, transactionType);

            result.validApprenticeships.Should().BeEmpty(errorMessage);
            result.dataLockFailures.Should().HaveCount(1);
            result.dataLockFailures[0].DataLockError.Should().Be(DataLockErrorCode.DLOCK_10);
            result.dataLockFailures[0].ApprenticeshipId.Should().Be(1);

            result.dataLockFailures[0].ApprenticeshipPriceEpisodeIds.Should().HaveCount(1);
            result.dataLockFailures[0].ApprenticeshipPriceEpisodeIds[0].Should().Be(100);
        }
예제 #23
0
        public FM36PriceEpisodeValue BuildNonContractedPriceEpisode(PriceEpisode priceEpisode, string learnRefNumber, ICollection <string> fundingStreamPeriodCodes)
        {
            if (priceEpisode?.PriceEpisodeValues.PriceEpisodeFundLineType != null)
            {
                var fspCodesForFundLineType = ValidContractsDictionary.GetValueOrDefault(priceEpisode?.PriceEpisodeValues.PriceEpisodeFundLineType);

                if (fspCodesForFundLineType != null && !fspCodesForFundLineType.Any(x => fundingStreamPeriodCodes.Contains(x)))
                {
                    return(new FM36PriceEpisodeValue
                    {
                        PriceEpisodeValue = priceEpisode?.PriceEpisodeValues,
                        FundLineValues = new FundLineValue
                        {
                            FundLineType = priceEpisode?.PriceEpisodeValues.PriceEpisodeFundLineType,
                            ReportTotals = BuildPriceEpisodeReportTotals(priceEpisode.PriceEpisodePeriodisedValues, learnRefNumber, priceEpisode.PriceEpisodeValues.PriceEpisodeAimSeqNumber.Value)
                        }
                    });
                }
            }

            return(null);
        }
        public void PriceEpisodeMapsEarningsInfo(Type requiredPaymentEventType)
        {
            var priceEpisode = new PriceEpisode
            {
                EffectiveTotalNegotiatedPriceStartDate = DateTime.UtcNow,
                PlannedEndDate      = DateTime.UtcNow,
                ActualEndDate       = DateTime.UtcNow,
                CompletionAmount    = 100M,
                InstalmentAmount    = 200M,
                NumberOfInstalments = 16,
            };

            var requiredPaymentEvent = Activator.CreateInstance(requiredPaymentEventType) as PeriodisedRequiredPaymentEvent;

            mapper.Map(priceEpisode, requiredPaymentEvent);
            requiredPaymentEvent.StartDate.Should().Be(priceEpisode.EffectiveTotalNegotiatedPriceStartDate);
            requiredPaymentEvent.PlannedEndDate.Should().Be(priceEpisode.PlannedEndDate);
            requiredPaymentEvent.ActualEndDate.Should().Be(priceEpisode.ActualEndDate);
            requiredPaymentEvent.CompletionStatus.Should().Be(0);
            requiredPaymentEvent.CompletionAmount.Should().Be(priceEpisode.CompletionAmount);
            requiredPaymentEvent.InstalmentAmount.Should().Be(priceEpisode.InstalmentAmount);
            requiredPaymentEvent.NumberOfInstalments.Should().Be((short)priceEpisode.NumberOfInstalments);
        }
예제 #25
0
        public AppsIndicativeEarningsModel BuildModel(
            ILearner learner,
            ILearningDelivery learningDelivery,
            LearningDelivery fm36DeliveryAttribute,
            PriceEpisode fm36EpisodeAttribute,
            LarsLearningDelivery larsLearningDelivery,
            string notionalEndLevel,
            bool earliestEpisode,
            bool hasPriceEpisodes)
        {
            DateTime employmentStatusDate = learner.LearnerEmploymentStatuses?
                                            .Where(x => x.DateEmpStatApp <= learningDelivery.LearnStartDate).Select(x => x.DateEmpStatApp)
                                            .DefaultIfEmpty(DateTime.MinValue).Max() ?? DateTime.MinValue;
            ILearnerEmploymentStatus employmentStatus =
                learner.LearnerEmploymentStatuses?.SingleOrDefault(x => x.DateEmpStatApp == employmentStatusDate);

            LearningDeliveryFamSimple[] learningDeliveryFams = GetLearningDeliveryFams(learningDelivery);
            string fundingLineType = GetFundingType(fm36DeliveryAttribute?.LearningDeliveryValues, fm36EpisodeAttribute?.PriceEpisodeValues);
            var    ldms            = _stringUtilitiesService.GetArrayEntries(learningDelivery.LearningDeliveryFAMs?.Where(x => string.Equals(x.LearnDelFAMType, Constants.LearningDeliveryFAMCodeLDM, StringComparison.OrdinalIgnoreCase)), 4);

            var model = new AppsIndicativeEarningsModel
            {
                LearnRefNumber                      = learner.LearnRefNumber,
                UniqueLearnerNumber                 = learner.ULN,
                DateOfBirth                         = learner.DateOfBirthNullable?.ToString("dd/MM/yyyy"),
                PostcodePriorToEnrollment           = learner.PostcodePrior,
                CampusIdentifier                    = learner.CampId,
                ProviderSpecifiedLearnerMonitoringA = learner.ProviderSpecLearnerMonitorings
                                                      ?.SingleOrDefault(x => string.Equals(x.ProvSpecLearnMonOccur, "A", StringComparison.OrdinalIgnoreCase))?.ProvSpecLearnMon,
                ProviderSpecifiedLearnerMonitoringB = learner.ProviderSpecLearnerMonitorings
                                                      ?.SingleOrDefault(x => string.Equals(x.ProvSpecLearnMonOccur, "B", StringComparison.OrdinalIgnoreCase))?.ProvSpecLearnMon,
                AimSeqNumber                  = learningDelivery.AimSeqNumber,
                LearningAimReference          = learningDelivery.LearnAimRef,
                LearningAimTitle              = larsLearningDelivery?.LearningAimTitle,
                SoftwareSupplierAimIdentifier = learningDelivery.SWSupAimId,
                LARS1618FrameworkUplift       = fm36DeliveryAttribute?.LearningDeliveryValues
                                                ?.LearnDelApplicProv1618FrameworkUplift,
                NotionalNVQLevel         = larsLearningDelivery?.NotionalNvqLevel,
                StandardNotionalEndLevel = notionalEndLevel,
                Tier2SectorSubjectArea   = larsLearningDelivery?.Tier2SectorSubjectArea,
                ProgrammeType            = learningDelivery.ProgTypeNullable,
                StandardCode             = learningDelivery.StdCodeNullable,
                FrameworkCode            = learningDelivery.FworkCodeNullable,
                ApprenticeshipPathway    = learningDelivery.PwayCodeNullable,
                AimType                                       = learningDelivery.AimType,
                CommonComponentCode                           = larsLearningDelivery?.FrameworkCommonComponent,
                FundingModel                                  = learningDelivery.FundModel,
                OriginalLearningStartDate                     = learningDelivery.OrigLearnStartDateNullable?.ToString("dd/MM/yyyy"),
                LearningStartDate                             = learningDelivery.LearnStartDate.ToString("dd/MM/yyyy"),
                LearningPlannedEndDate                        = learningDelivery.LearnPlanEndDate.ToString("dd/MM/yyyy"),
                CompletionStatus                              = learningDelivery.CompStatus,
                LearningActualEndDate                         = learningDelivery.LearnActEndDateNullable?.ToString("dd/MM/yyyy"),
                Outcome                                       = learningDelivery.OutcomeNullable,
                FundingAdjustmentForPriorLearning             = learningDelivery.PriorLearnFundAdjNullable,
                OtherFundingAdjustment                        = learningDelivery.OtherFundAdjNullable,
                LearningDeliveryFAMTypeLearningSupportFunding = learningDeliveryFams.Select(x => x.Code).Max(),
                LearningDeliveryFAMTypeLSFDateAppliesFrom     =
                    learningDeliveryFams.Select(x => x.From).Min() == DateTime.MinValue ? string.Empty : learningDeliveryFams.Select(x => x.From).Min().ToString("dd/MM/yyyy"),
                LearningDeliveryFAMTypeLSFDateAppliesTo =
                    learningDeliveryFams.Select(x => x.To).Max() == DateTime.MinValue ? string.Empty : learningDeliveryFams.Select(x => x.To).Max().ToString("dd/MM/yyyy"),
                LearningDeliveryFAMTypeLearningDeliveryMonitoringA = ldms[0],
                LearningDeliveryFAMTypeLearningDeliveryMonitoringB = ldms[1],
                LearningDeliveryFAMTypeLearningDeliveryMonitoringC = ldms[2],
                LearningDeliveryFAMTypeLearningDeliveryMonitoringD = ldms[3],
                LearningDeliveryFAMRestartIndicator = learningDelivery.LearningDeliveryFAMs
                                                      ?.SingleOrDefault(x => string.Equals(x.LearnDelFAMType, Constants.LearningDeliveryFAMCodeRES, StringComparison.OrdinalIgnoreCase))?.LearnDelFAMCode,
                ProviderSpecifiedDeliveryMonitoringA = learningDelivery.ProviderSpecDeliveryMonitorings
                                                       ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "A", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                ProviderSpecifiedDeliveryMonitoringB = learningDelivery.ProviderSpecDeliveryMonitorings
                                                       ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "B", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                ProviderSpecifiedDeliveryMonitoringC = learningDelivery.ProviderSpecDeliveryMonitorings
                                                       ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "C", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                ProviderSpecifiedDeliveryMonitoringD = learningDelivery.ProviderSpecDeliveryMonitorings
                                                       ?.SingleOrDefault(x => string.Equals(x.ProvSpecDelMonOccur, "D", StringComparison.OrdinalIgnoreCase))?.ProvSpecDelMon,
                EndPointAssessmentOrganisation           = learningDelivery.EPAOrgID,
                PlannedNoOfOnProgrammeInstallmentsForAim =
                    fm36DeliveryAttribute?.LearningDeliveryValues?.PlannedNumOnProgInstalm,
                SubContractedOrPartnershipUKPRN = learningDelivery.PartnerUKPRNNullable,
                DeliveryLocationPostcode        = learningDelivery.DelLocPostCode,
                EmployerIdentifier               = employmentStatus?.EmpIdNullable,
                AgreementIdentifier              = fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeAgreeId,
                EmploymentStatus                 = employmentStatus?.EmpStat,
                EmploymentStatusDate             = employmentStatus?.DateEmpStatApp.ToString("dd/MM/yyyy"),
                EmpStatusMonitoringSmallEmployer = employmentStatus?.EmploymentStatusMonitorings
                                                   ?.SingleOrDefault(x => string.Equals(x.ESMType, Constants.EmploymentStatusMonitoringTypeSEM, StringComparison.OrdinalIgnoreCase))?.ESMCode,
                PriceEpisodeStartDate =
                    fm36EpisodeAttribute?.PriceEpisodeValues?.EpisodeStartDate,
                PriceEpisodeActualEndDate =
                    fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeActualEndDate?.ToString("dd/MM/yyyy"),
                FundingLineType = fundingLineType,
                TotalPriceApplicableToThisEpisode =
                    fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeTotalTNPPrice,
                FundingBandUpperLimit            = fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeUpperBandLimit,
                PriceAmountAboveFundingBandLimit =
                    fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeUpperLimitAdjustment,
                PriceAmountRemainingStartOfEpisode = fm36EpisodeAttribute?.PriceEpisodeValues
                                                     ?.PriceEpisodeCappedRemainingTNPAmount,
                CompletionElement = fm36EpisodeAttribute?.PriceEpisodeValues?.PriceEpisodeCompletionElement
            };

            if (learningDelivery?.LearningDeliveryFAMs != null)
            {
                CalculateApprenticeshipContractTypeFields(
                    learningDelivery,
                    model,
                    fm36DeliveryAttribute,
                    fm36EpisodeAttribute,
                    hasPriceEpisodes);
            }

            if (earliestEpisode)
            {
                CalculateAppFinTotals(model, learningDelivery);
            }

            foreach (var command in _commands)
            {
                command.Execute(model, fm36DeliveryAttribute, fm36EpisodeAttribute);
            }

            GetTotals(model);

            return(model);
        }
        public void Execute(AppsIndicativeEarningsModel model, LearningDelivery LearningDelivery, PriceEpisode episodeAttribute)
        {
            model.FebruaryOnProgrammeEarnings =
                episodeAttribute?.PriceEpisodePeriodisedValues
                ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeOnProgPaymentAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0;

            model.FebruaryBalancingPaymentEarnings =
                episodeAttribute?.PriceEpisodePeriodisedValues
                ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm3PriceEpisodeBalancePaymentAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0;

            model.FebruaryAimCompletionEarnings =
                episodeAttribute?.PriceEpisodePeriodisedValues
                ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeCompletionPaymentAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0;

            model.FebruaryLearningSupportEarnings = LearningDelivery?.LearningDeliveryValues?.LearnDelMathEng ?? false
                    ? LearningDelivery.LearningDeliveryPeriodisedValues
                                                    ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36LearnSuppFundCashAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0
                    : episodeAttribute?.PriceEpisodePeriodisedValues
                                                    ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeLSFCashAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0;

            model.FebruaryEnglishMathsOnProgrammeEarnings =
                LearningDelivery?.LearningDeliveryPeriodisedValues
                ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36MathEngOnProgPaymentAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0;

            model.FebruaryEnglishMathsBalancingPaymentEarnings =
                LearningDelivery?.LearningDeliveryPeriodisedValues
                ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36MathEngBalPayment, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0;

            model.FebruaryDisadvantageEarnings =
                (episodeAttribute?.PriceEpisodePeriodisedValues
                 ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeFirstDisadvantagePaymentAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0)
                + (episodeAttribute?.PriceEpisodePeriodisedValues
                   ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeSecondDisadvantagePaymentAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0);

            model.February1618AdditionalPaymentForEmployers =
                (episodeAttribute?.PriceEpisodePeriodisedValues
                 ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeFirstEmp1618PayAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0)
                + (episodeAttribute?.PriceEpisodePeriodisedValues
                   ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeSecondEmp1618PayAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0);

            model.February1618AdditionalPaymentForProviders =
                (episodeAttribute?.PriceEpisodePeriodisedValues
                 ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeFirstProv1618PayAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0)
                + (episodeAttribute?.PriceEpisodePeriodisedValues
                   ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeSecondProv1618PayAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0);

            model.FebruaryAdditionalPaymentsForApprentices =
                episodeAttribute?.PriceEpisodePeriodisedValues
                ?.SingleOrDefault(att => string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeLearnerAdditionalPaymentAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0;

            model.February1618FrameworkUpliftOnProgrammePayment =
                episodeAttribute?.PriceEpisodePeriodisedValues
                ?.SingleOrDefault(att =>
                                  string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeApplic1618FrameworkUpliftOnProgPaymentAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0;

            model.February1618FrameworkUpliftBalancingPayment =
                episodeAttribute?.PriceEpisodePeriodisedValues
                ?.SingleOrDefault(att =>
                                  string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeApplic1618FrameworkUpliftBalancingAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0;

            model.February1618FrameworkUpliftCompletionPayment =
                episodeAttribute?.PriceEpisodePeriodisedValues
                ?.SingleOrDefault(att =>
                                  string.Equals(att.AttributeName, Constants.Fm36PriceEpisodeApplic1618FrameworkUpliftCompletionPaymentAttributeName, StringComparison.OrdinalIgnoreCase))?.Period7 ?? 0;
        }
예제 #27
0
        public void ReturnsDLock09WhenNoCommitmentsStartOnOrBeforePriceEpisode(ApprenticeshipModel apprenticeshipA, ApprenticeshipModel apprenticeshipB, PriceEpisode priceEpisode)
        {
            priceEpisode.EffectiveTotalNegotiatedPriceStartDate = new DateTime(2018, 8, 1);

            apprenticeshipA.ApprenticeshipPriceEpisodes.ForEach(x => x.Removed = true);
            apprenticeshipA.ApprenticeshipPriceEpisodes[0].StartDate           = new DateTime(2018, 9, 1);
            apprenticeshipA.ApprenticeshipPriceEpisodes[0].EndDate             = new DateTime(2019, 9, 30);
            apprenticeshipA.ApprenticeshipPriceEpisodes[0].Removed             = false;

            apprenticeshipB.ApprenticeshipPriceEpisodes.ForEach(x => x.Removed = true);
            apprenticeshipB.ApprenticeshipPriceEpisodes[0].StartDate           = new DateTime(2019, 9, 1);
            apprenticeshipB.ApprenticeshipPriceEpisodes[0].EndDate             = new DateTime(2020, 9, 30);
            apprenticeshipB.ApprenticeshipPriceEpisodes[0].Removed             = false;

            List <ApprenticeshipModel> apprenticeshipModels = new List <ApprenticeshipModel> {
                apprenticeshipA, apprenticeshipB
            };

            var validator = new StartDateValidator(false);
            var result    = validator.Validate(priceEpisode, apprenticeshipModels);

            result.validApprenticeships.Should().BeEmpty();
            result.dataLockFailures.Should().HaveCount(2);
            result.dataLockFailures.Should().ContainEquivalentOf(
                new
            {
                ApprenticeshipId = apprenticeshipA.Id,
                ApprenticeshipPriceEpisodeIds = new List <long>()
                {
                    apprenticeshipA.ApprenticeshipPriceEpisodes[0].Id
                },
                DataLockError = DataLockErrorCode.DLOCK_09,
            });

            result.dataLockFailures.Should().ContainEquivalentOf(
                new
            {
                ApprenticeshipId = apprenticeshipB.Id,
                ApprenticeshipPriceEpisodeIds = new List <long>()
                {
                    apprenticeshipB.ApprenticeshipPriceEpisodes[0].Id
                },
                DataLockError = DataLockErrorCode.DLOCK_09,
            });
        }
        public void ReturnsOnlyCommitmentsThatAreNotStopped(ApprenticeshipModel apprenticeshipA, ApprenticeshipModel apprenticeshipB, PriceEpisode priceEpisode)
        {
            priceEpisode.EffectiveTotalNegotiatedPriceStartDate = new DateTime(2018, 8, 1);
            priceEpisode.ActualEndDate = new DateTime(2020, 8, 30);

            apprenticeshipA.StopDate = new DateTime(2019, 8, 1);
            apprenticeshipA.Status   = ApprenticeshipStatus.Stopped;
            apprenticeshipA.ApprenticeshipPriceEpisodes[0].StartDate = new DateTime(2018, 8, 1);
            apprenticeshipA.ApprenticeshipPriceEpisodes[0].EndDate   = new DateTime(2019, 8, 30);

            apprenticeshipB.Status = ApprenticeshipStatus.Active;
            apprenticeshipB.ApprenticeshipPriceEpisodes[0].StartDate = new DateTime(2019, 8, 1);
            apprenticeshipB.ApprenticeshipPriceEpisodes[0].EndDate   = new DateTime(2020, 8, 30);

            var apprenticeships = new List <ApprenticeshipModel> {
                apprenticeshipA, apprenticeshipB
            };

            var validator = new CompletionStoppedValidator();
            var result    = validator.Validate(priceEpisode, apprenticeships, TransactionType.Completion);

            result.dataLockFailures.Should().BeEmpty();
            result.validApprenticeships.Should().NotBeNull();
            result.validApprenticeships.All(x => x.Id == apprenticeshipB.Id).Should().BeTrue();
        }
예제 #29
0
        public void ReturnsAllCommitmentsWhenDisableDatalocksAreOn(ApprenticeshipModel apprenticeshipA, ApprenticeshipModel apprenticeshipB, PriceEpisode priceEpisode)
        {
            priceEpisode.EffectiveTotalNegotiatedPriceStartDate = new DateTime(1930, 8, 1);
            var apprenticeshipModels = new List <ApprenticeshipModel> {
                apprenticeshipA, apprenticeshipB
            };

            var validator = new StartDateValidator(true);
            var result    = validator.Validate(priceEpisode, apprenticeshipModels);

            result.validApprenticeships.Should().BeEquivalentTo(apprenticeshipModels);
        }
예제 #30
0
 private Func <CurrentPriceEpisode, bool> MatchById(PriceEpisode find) =>
 x => x.PriceEpisodeIdentifier.Equals(find.Identifier, StringComparison.InvariantCultureIgnoreCase);