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); }
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); }
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); }
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}."); } } }
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); }
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 }); }
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(); }
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(); }
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(); }
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}."); } } }
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); }
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); }
/// <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; } }
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); }
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); }
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); }
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; }
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(); }
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); }
private Func <CurrentPriceEpisode, bool> MatchById(PriceEpisode find) => x => x.PriceEpisodeIdentifier.Equals(find.Identifier, StringComparison.InvariantCultureIgnoreCase);