public void Condense_NullLearners() { var globalOne = new FM25Global() { Learners = null }; var globalTwo = new FM25Global() { Learners = null }; var globalThree = new FM25Global() { Learners = null }; var fundingOutputs = new List <FM25Global>() { globalOne, globalTwo, globalThree, }; var fundingOutput = NewService().Condense(fundingOutputs, 1, "2021"); fundingOutput.Should().Be(globalOne); fundingOutput.Learners.Should().BeEmpty(); }
public static FM25Global BuildTestModel() { var fm25GlobalObject = new FM25Global(); fm25GlobalObject.LARSVersion = "Lars - 1.0.0.0"; fm25GlobalObject.OrgVersion = "Org - 1.0.0.0"; fm25GlobalObject.PostcodeDisadvantageVersion = "Postcode - 1.0.0.0"; fm25GlobalObject.RulebaseVersion = "Rulebase - 1.0.0.0"; fm25GlobalObject.UKPRN = 10033670; var learners = new List <FM25Learner>(); learners.Add( new FM25Learner { LearnRefNumber = "0fm2501", FundLine = "19-24 Students with an EHCP", StartFund = true, AreaCostFact1618Hist = 10, ProgWeightHist = 10, PrvDisadvPropnHist = 10, PrvHistLrgProgPropn = 10, PrvRetentFactHist = 10, RateBand = "540+ hours (Band 5)", OnProgPayment = 500 }); fm25GlobalObject.Learners = learners; return(fm25GlobalObject); }
public void MapFM25() { var fundLine1 = "FundLine1"; var fundLine2 = "FundLine2"; var attribute1 = "Attribute1"; var attribute2 = "Attribute2"; var global = new FM25Global() { Learners = Enumerable.Range(0, 1000) .Select(i => new FM25Learner() { FundLine = i % 2 == 0 ? fundLine1 : fundLine2, LearnerPeriodisedValues = Enumerable.Range(0, 16) .Select(k => new LearnerPeriodisedValues() { AttributeName = k % 2 == 0 ? attribute1 : attribute2 }).ToList(), }).ToList() }; var mapped = NewProvider().BuildFm25Dictionary(global); mapped.Should().HaveCount(2); mapped[fundLine1].Should().HaveCount(2); mapped[fundLine2].Should().HaveCount(2); mapped[fundLine1][attribute1].Should().HaveCount(4000); mapped[fundLine1][attribute2].Should().HaveCount(4000); mapped[fundLine2][attribute1].Should().HaveCount(4000); mapped[fundLine2][attribute2].Should().HaveCount(4000); }
public IEnumerable <FM25_Learner> MapFM25Learners(FM25Global fm25Global) { return(fm25Global.Learners.Select(l => new FM25_Learner { UKPRN = fm25Global.UKPRN.Value, LearnRefNumber = l.LearnRefNumber, AcadMonthPayment = l.AcadMonthPayment, OnProgPayment = l.OnProgPayment, AcadProg = l.AcadProg, ActualDaysILCurrYear = l.ActualDaysILCurrYear, AreaCostFact1618Hist = l.AreaCostFact1618Hist, Block1DisadvUpliftNew = l.Block1DisadvUpliftNew, Block2DisadvElementsNew = l.Block2DisadvElementsNew, ConditionOfFundingEnglish = l.ConditionOfFundingEnglish, ConditionOfFundingMaths = l.ConditionOfFundingMaths, CoreAimSeqNumber = l.CoreAimSeqNumber, FullTimeEquiv = l.FullTimeEquiv, FundLine = l.FundLine, LearnerActEndDate = l.LearnerActEndDate, LearnerPlanEndDate = l.LearnerPlanEndDate, LearnerStartDate = l.LearnerStartDate, NatRate = l.NatRate, PlannedDaysILCurrYear = l.PlannedDaysILCurrYear, ProgWeightHist = l.ProgWeightHist, ProgWeightNew = l.ProgWeightNew, PrvDisadvPropnHist = l.PrvDisadvPropnHist, PrvHistLrgProgPropn = l.PrvHistLrgProgPropn, PrvRetentFactHist = l.PrvRetentFactHist, RateBand = l.RateBand, RetentNew = l.RetentNew, StartFund = l.StartFund, ThresholdDays = l.ThresholdDays })); }
public void Build_One() { var learner = new TestLearner() { LearnRefNumber = "LearnRefNumber", LearningDeliveries = new List <ILearningDelivery>() { new TestLearningDelivery() { FundModel = 25, LearningDeliveryFAMs = new List <ILearningDeliveryFAM>() { new TestLearningDeliveryFAM() { LearnDelFAMType = "SOF", LearnDelFAMCode = "107", } } } } }; var fm25Learner = new FM25Learner() { LearnRefNumber = "LearnRefNumber", StartFund = true, FundLine = "14-16 Direct Funded Students", }; var message = new TestMessage() { Learners = new List <ILearner>() { learner } }; var fm25Global = new FM25Global() { Learners = new List <FM25Learner>() { fm25Learner } }; var dependentDataMock = new Mock <IReportServiceDependentData>(); dependentDataMock.Setup(d => d.Get <IMessage>()).Returns(message); dependentDataMock.Setup(d => d.Get <FM25Global>()).Returns(fm25Global); var models = NewBuilder().Build(null, dependentDataMock.Object).ToList(); models.Should().HaveCount(1); models[0].Learner.Should().Be(learner); models[0].FM25Learner.Should().Be(fm25Learner); }
public void Condense_EmptyCollection() { var global = new FM25Global { UKPRN = 1 }; NewService().Condense(Enumerable.Empty <FM25Global>(), 1, "2021").Should().BeEquivalentTo(global); }
protected IDictionary <string, FM25Learner> BuildFm25LearnerDictionary(FM25Global fm25Global) { return(fm25Global? .Learners? .ToDictionary( l => l.LearnRefNumber, l => l, StringComparer.OrdinalIgnoreCase) ?? new Dictionary <string, FM25Learner>()); }
public IEnumerable <FM25_FM35_Learner_Period> MapFM25_35_LearnerPeriod(FM25Global fm25Global) { return(fm25Global.Learners.SelectMany(l => l.LearnerPeriods.Select(lp => new FM25_FM35_Learner_Period { UKPRN = fm25Global.UKPRN.Value, LearnRefNumber = l.LearnRefNumber, Period = lp.Period.Value, LnrOnProgPay = lp.LnrOnProgPay }))); }
public List <FM25_FM35_global> BuildFM25_35_Global(FM25Global fm25Global, int ukprn) { return(new List <FM25_FM35_global>() { new FM25_FM35_global { UKPRN = ukprn, RulebaseVersion = fm25Global.RulebaseVersion } }); }
public async Task <string> Process(FundingDto actorModel, CancellationToken cancellationToken) { FM25Global results = RunFunding(actorModel, cancellationToken); actorModel = null; GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true); return(BuildFundingOutput(results)); }
public IEnumerable <FM25_FM35_global> MapFM25_35_Global(FM25Global fm25Global) { return(new List <FM25_FM35_global>() { new FM25_FM35_global { UKPRN = fm25Global.UKPRN.Value, RulebaseVersion = fm25Global.RulebaseVersion } }); }
public void MapData(IDataStoreCache cache, FM25Global fm25Global) { var learners = fm25Global?.Learners; if (learners == null) { return; } var ukprn = fm25Global.UKPRN.Value; PopulateDataStoreCache(cache, learners, fm25Global, ukprn); }
public void BuildGlobal() { var ukprn = 1234; var global = new FM25Global() { UKPRN = ukprn }; var dataEntity = NewService().BuildGlobalDataEntity(global); dataEntity.EntityName.Should().Be("global"); dataEntity.Attributes["UKPRN"].Value.Should().Be(ukprn); }
public List <FM25_global> BuildFM25Global(FM25Global fm25Global, int ukprn) { return(new List <FM25_global>() { new FM25_global { UKPRN = ukprn, LARSVersion = fm25Global.LARSVersion, OrgVersion = fm25Global.OrgVersion, PostcodeDisadvantageVersion = fm25Global.PostcodeDisadvantageVersion, RulebaseVersion = fm25Global.RulebaseVersion } }); }
public IEnumerable <FM25_global> MapFM25Global(FM25Global fm25Global) { return(new List <FM25_global>() { new FM25_global { UKPRN = fm25Global.UKPRN.Value, LARSVersion = fm25Global.LARSVersion, OrgVersion = fm25Global.OrgVersion, PostcodeDisadvantageVersion = fm25Global.PostcodeDisadvantageVersion, RulebaseVersion = fm25Global.RulebaseVersion } }); }
public void Condense() { var learnerOne = new FM25Learner(); var learnerTwo = new FM25Learner(); var learnerThree = new FM25Learner(); var learnerFour = new FM25Learner(); var learnerFive = new FM25Learner(); var learnerSix = new FM25Learner(); var globalOne = new FM25Global() { Learners = new List <FM25Learner>() { learnerOne, learnerTwo, }, }; var globalTwo = new FM25Global() { Learners = new List <FM25Learner> { learnerThree, learnerFour, }, }; var globalThree = new FM25Global() { Learners = new List <FM25Learner> { learnerFive, learnerSix, }, }; var fundingOutputs = new List <FM25Global>() { globalOne, globalTwo, globalThree, }; var fundingOutput = NewService().Condense(fundingOutputs, 1, "2021"); fundingOutput.Should().Be(globalOne); fundingOutput.Learners.Should().HaveCount(6); fundingOutput.Learners.Should().Contain(new[] { learnerOne, learnerTwo, learnerThree, learnerFour, learnerFive, learnerSix }); }
public FM25ProviderService( ILogger logger, IKeyValuePersistenceService storage, IJsonSerializationService jsonSerializationService, IIntUtilitiesService intUtilitiesService, Func <IIlr1819RulebaseContext> ilrRulebaseContextFactory) { _logger = logger; _storage = storage; _jsonSerializationService = jsonSerializationService; _intUtilitiesService = intUtilitiesService; _ilrRulebaseContextFactory = ilrRulebaseContextFactory; _fundingOutputs = null; _getDataLock = new SemaphoreSlim(1, 1); }
public IDataEntity GetDataEntityMapperEntity() { var global = new FM25Global { UKPRN = 12345678, Learners = new List <FM25Learner> { new FM25Learner { } } }; return(new PeriodisationDataEntityMapper().BuildGlobalDataEntity(global)); }
public FM25Data MapData(FM25Global fm25Global) { var data = new FM25Data(); if (fm25Global.Learners != null) { data.Globals = MapFM25Global(fm25Global).ToList(); data.Learners = MapFM25Learners(fm25Global).ToList(); data.Fm25Fm35Globals = MapFM25_35_Global(fm25Global).ToList(); data.Fm25Fm35LearnerPeriods = MapFM25_35_LearnerPeriod(fm25Global).ToList(); data.Fm25Fm35LearnerPeriodisedValues = MapFM25_35_LearnerPeriodisedValues(fm25Global).ToList(); } return(data); }
public void Build_FiftyThousand() { var count = 50000; var message = new TestMessage() { Learners = Enumerable.Range(0, count) .Select(i => new TestLearner() { LearnRefNumber = i.ToString(), LearningDeliveries = new List <ILearningDelivery>() { new TestLearningDelivery() { FundModel = 25, LearningDeliveryFAMs = new List <ILearningDeliveryFAM>() { new TestLearningDeliveryFAM() { LearnDelFAMType = "SOF", LearnDelFAMCode = "107", } } } } }).ToList() }; var fm25Global = new FM25Global() { Learners = Enumerable.Range(0, count) .Select(i => new FM25Learner() { LearnRefNumber = i.ToString(), StartFund = true, FundLine = "14-16 Direct Funded Students", }).ToList() }; var dependentDataMock = new Mock <IReportServiceDependentData>(); dependentDataMock.Setup(d => d.Get <IMessage>()).Returns(message); dependentDataMock.Setup(d => d.Get <FM25Global>()).Returns(fm25Global); var models = NewBuilder().Build(null, dependentDataMock.Object).ToList(); models.Should().HaveCount(count); }
public async Task Execute() { var cancellationToken = CancellationToken.None; var fundingServiceContextMock = new Mock <IFundingServiceContext>(); fundingServiceContextMock.Setup(f => f.JobId).Returns(1); fundingServiceContextMock.Setup(f => f.Container).Returns("Container"); fundingServiceContextMock.Setup(f => f.FundingFm36OutputKey).Returns("Key"); fundingServiceContextMock.Setup(f => f.Ukprn).Returns(12345678); fundingServiceContextMock.Setup(f => f.Year).Returns("1920"); IEnumerable <FundingDto> fundingActorDtos = new List <FundingDto> { new FundingDto() }; var FM25Actor = new Mock <IFM25Actor>(); var condenserOutput = new FM25Global(); var jsonSerializationServiceMock = new Mock <IJsonSerializationService>(); var fundingActorProviderMock = new Mock <IActorProvider <IFM25Actor> >(); var filePersistanceServiceMock = new Mock <IFilePersistanceService>(); var fundingOutputCondenserServiceMock = new Mock <IFM25FundingOutputCondenserService <FM25Global, PeriodisationGlobal> >(); var loggerMock = new Mock <ILogger>(); FM25Actor.Setup(a => a.Process(fundingActorDtos.FirstOrDefault(), cancellationToken)).Returns(() => Task <string> .Factory.StartNew(() => "string")); jsonSerializationServiceMock.Setup(sm => sm.Deserialize <FM25Global>(It.IsAny <string>())).Returns(new FM25Global()).Verifiable(); fundingActorProviderMock.Setup(pm => pm.Provide()).Returns(FM25Actor.Object).Verifiable(); filePersistanceServiceMock.Setup(sm => sm.PersistAsync(fundingServiceContextMock.Object.FundingFm25OutputKey, fundingServiceContextMock.Object.Container, condenserOutput, cancellationToken)).Returns(Task.CompletedTask).Verifiable(); fundingOutputCondenserServiceMock.Setup(sm => sm.Condense( It.IsAny <IEnumerable <FM25Global> >(), fundingServiceContextMock.Object.Ukprn, fundingServiceContextMock.Object.Year)).Returns(condenserOutput).Verifiable(); await NewTask( jsonSerializationServiceMock.Object, fundingActorProviderMock.Object, filePersistanceServiceMock.Object, fundingOutputCondenserServiceMock.Object, loggerMock.Object, "FM25Actor").Execute(fundingActorDtos, fundingServiceContextMock.Object, cancellationToken); fundingActorProviderMock.VerifyAll(); filePersistanceServiceMock.VerifyAll(); fundingOutputCondenserServiceMock.VerifyAll(); }
public FundingSummaryModel BuildWithFundLine( string title, FM25Global fm25Global, List<string> validLearners, string fundLine, int period) { FundingSummaryModel fundingSummaryModel = new FundingSummaryModel(title); if (fm25Global?.Learners == null || validLearners == null) { return fundingSummaryModel; } FM25Learner[] fundLineObject = fm25Global.Learners.Where(x => string.Equals(x.FundLine, fundLine, StringComparison.OrdinalIgnoreCase) && validLearners.Contains(x.LearnRefNumber)).ToArray(); LearnerPeriodisedValues[] periodisedValues = fundLineObject.SelectMany(x => x.LearnerPeriodisedValues) .Where(x => string.Equals(x.AttributeName, "LnrOnProgPay")).ToArray(); fundingSummaryModel.Period1 = periodisedValues.Sum(x => x.Period1 ?? 0); fundingSummaryModel.Period2 = periodisedValues.Sum(x => x.Period2 ?? 0); fundingSummaryModel.Period3 = periodisedValues.Sum(x => x.Period3 ?? 0); fundingSummaryModel.Period4 = periodisedValues.Sum(x => x.Period4 ?? 0); fundingSummaryModel.Period5 = periodisedValues.Sum(x => x.Period5 ?? 0); fundingSummaryModel.Period6 = periodisedValues.Sum(x => x.Period6 ?? 0); fundingSummaryModel.Period7 = periodisedValues.Sum(x => x.Period7 ?? 0); fundingSummaryModel.Period8 = periodisedValues.Sum(x => x.Period8 ?? 0); fundingSummaryModel.Period9 = periodisedValues.Sum(x => x.Period9 ?? 0); fundingSummaryModel.Period10 = periodisedValues.Sum(x => x.Period10 ?? 0); fundingSummaryModel.Period11 = periodisedValues.Sum(x => x.Period11 ?? 0); fundingSummaryModel.Period12 = periodisedValues.Sum(x => x.Period12 ?? 0); fundingSummaryModel.Period1_8 = fundingSummaryModel.Period1 + fundingSummaryModel.Period2 + fundingSummaryModel.Period3 + fundingSummaryModel.Period4 + fundingSummaryModel.Period5 + fundingSummaryModel.Period6 + fundingSummaryModel.Period7 + fundingSummaryModel.Period8; fundingSummaryModel.Period9_12 = fundingSummaryModel.Period9 + fundingSummaryModel.Period10 + fundingSummaryModel.Period11 + fundingSummaryModel.Period12; fundingSummaryModel.YearToDate = GetYearToDate(fundingSummaryModel, period - 1); fundingSummaryModel.Total = GetYearToDate(fundingSummaryModel, 12); return fundingSummaryModel; }
public void BuildTest() { var dependentDataMock = new Mock <IReportServiceDependentData>(); var learningDeliveryFam = new Mock <ILearningDeliveryFAM>(); learningDeliveryFam.SetupGet(fam => fam.LearnDelFAMType).Returns("SOF"); learningDeliveryFam.SetupGet(fam => fam.LearnDelFAMCode).Returns("107"); var albLearningDeliveryFam = new Mock <ILearningDeliveryFAM>(); albLearningDeliveryFam.SetupGet(fam => fam.LearnDelFAMType).Returns("ALB"); var learningDeliveryFams = new List <ILearningDeliveryFAM>() { learningDeliveryFam.Object, albLearningDeliveryFam.Object }; var learningDelivery = new TestLearningDelivery() { FundModel = 25, LearnAimRef = "learnAimRef", AimSeqNumber = 1, LearningDeliveryFAMs = learningDeliveryFams, StdCodeNullable = 1, }; var message = new TestMessage() { Learners = BuildLearners(learningDelivery), HeaderEntity = new TestHeader() { CollectionDetailsEntity = new MessageHeaderCollectionDetails() { FilePreparationDate = new DateTime(2019, 11, 06) } } }; var referenceDataRoot = new ReferenceDataRoot() { Organisations = new List <Organisation>() { new Organisation() { UKPRN = 987654321, Name = "Provider XYZ", OrganisationCoFRemovals = new List <OrganisationCoFRemoval>() { new OrganisationCoFRemoval() { EffectiveFrom = new DateTime(2019, 01, 01), CoFRemoval = (decimal)4500.12 } }, } }, MetaDatas = new MetaData() { ReferenceDataVersions = new ReferenceDataVersion() { OrganisationsVersion = new OrganisationsVersion { Version = "1.1.1.1" }, Employers = new EmployersVersion { Version = "2.2.2.2" }, LarsVersion = new LarsVersion { Version = "3.3.3.3" }, PostcodesVersion = new PostcodesVersion { Version = "4.4.4.4" }, CoFVersion = new CoFVersion() { Version = "5.5.5.5" } } } }; var fm25Global = new FM25Global() { Learners = BuildFm25Learners() }; dependentDataMock.Setup(d => d.Get <IMessage>()).Returns(message); dependentDataMock.Setup(d => d.Get <ReferenceDataRoot>()).Returns(referenceDataRoot); dependentDataMock.Setup(d => d.Get <FM25Global>()).Returns(fm25Global); var submissionDateTime = new DateTime(2019, 1, 1, 1, 1, 1); var ukDateTime = new DateTime(2020, 1, 1, 1, 1, 1); var dateTimeProvider = new Mock <IDateTimeProvider>(); var reportServiceContextMock = new Mock <IReportServiceContext>(); reportServiceContextMock.SetupGet(c => c.Ukprn).Returns(987654321); reportServiceContextMock.SetupGet(c => c.SubmissionDateTimeUtc).Returns(submissionDateTime); reportServiceContextMock.SetupGet(c => c.ServiceReleaseVersion).Returns("11.22.3300.4321"); reportServiceContextMock.SetupGet(c => c.IlrReportingFilename).Returns("ILR-12345678-1920-20191005-151322-01.xml"); dateTimeProvider.Setup(p => p.ConvertUtcToUk(submissionDateTime)).Returns(ukDateTime); dateTimeProvider.Setup(p => p.GetNowUtc()).Returns(submissionDateTime); var result = NewBuilder(dateTimeProvider.Object).Build(reportServiceContextMock.Object, dependentDataMock.Object); result.ApplicationVersion.Should().Be("11.22.3300.4321"); result.ComponentSetVersion.Should().Be("NA"); result.FilePreparationDate.Should().Be("06/11/2019"); result.IlrFile.Should().Be("ILR-12345678-1920-20191005-151322-01.xml"); result.LargeEmployerData.Should().Be("2.2.2.2"); result.LarsData.Should().Be("3.3.3.3"); result.OrganisationData.Should().Be("1.1.1.1"); result.PostcodeData.Should().Be("4.4.4.4"); result.CofRemovalData.Should().Be("5.5.5.5"); result.ProviderName.Should().Be("Provider XYZ"); result.ReportGeneratedAt.Should().Be("Report generated at: 01:01:01 on 01/01/2020"); result.Ukprn.Should().Be("987654321"); result.Year.Should().Be("2020/21"); result.CofRemoval.Should().Be((decimal) - 4500.12); result.ReferenceDate.Should().Be("(ALL)"); result.FundingFactor.PrvRetentFactHist.Should().Be("0.79600"); result.FundingFactor.ProgWeightHist.Should().Be("1.06100"); result.FundingFactor.AreaCostFact1618Hist.Should().Be("1.00000"); result.FundingFactor.PrvDisadvPropnHist.Should().Be("0.34500"); result.FundingFactor.PrvHistLrgProgPropn.Should().Be("0.21300"); result.FundingFactor.PrvHistL3ProgMathEngProp.Should().Be("0.21300"); result.DirectFundingStudents.Band1StudentNumbers.Should().Be(0); result.DirectFundingStudents.Band2StudentNumbers.Should().Be(0); result.DirectFundingStudents.Band3StudentNumbers.Should().Be(0); result.DirectFundingStudents.Band4aStudentNumbers.Should().Be(1); result.DirectFundingStudents.Band4bStudentNumbers.Should().Be(0); result.DirectFundingStudents.Band5StudentNumbers.Should().Be(1); result.DirectFundingStudents.Band6StudentNumbers.Should().Be(0); result.DirectFundingStudents.Band7StudentNumbers.Should().Be(0); result.DirectFundingStudents.Band8StudentNumbers.Should().Be(0); result.DirectFundingStudents.Band9StudentNumbers.Should().Be(0); result.DirectFundingStudents.Band1To5StudentNumbersTLevel.Should().Be(0); result.StudentsIncludingHNS.Band1StudentNumbers.Should().Be(0); result.StudentsIncludingHNS.Band1TotalFunding.Should().Be(0); result.StudentsIncludingHNS.Band2StudentNumbers.Should().Be(0); result.StudentsIncludingHNS.Band2TotalFunding.Should().Be(0); result.StudentsIncludingHNS.Band3StudentNumbers.Should().Be(1); result.StudentsIncludingHNS.Band3TotalFunding.Should().Be((decimal)25815.43); result.StudentsIncludingHNS.Band4aStudentNumbers.Should().Be(0); result.StudentsIncludingHNS.Band4aTotalFunding.Should().Be(0); result.StudentsIncludingHNS.Band4bStudentNumbers.Should().Be(1); result.StudentsIncludingHNS.Band4bTotalFunding.Should().Be((decimal)2589915.43); result.StudentsIncludingHNS.Band5StudentNumbers.Should().Be(0); result.StudentsIncludingHNS.Band5TotalFunding.Should().Be(0); result.StudentsIncludingHNS.Band6StudentNumbers.Should().Be(0); result.StudentsIncludingHNS.Band6TotalFunding.Should().Be(0); result.StudentsIncludingHNS.Band7StudentNumbers.Should().Be(0); result.StudentsIncludingHNS.Band7TotalFunding.Should().Be(0); result.StudentsIncludingHNS.Band8StudentNumbers.Should().Be(0); result.StudentsIncludingHNS.Band8TotalFunding.Should().Be(0); result.StudentsIncludingHNS.Band9StudentNumbers.Should().Be(0); result.StudentsIncludingHNS.Band9TotalFunding.Should().Be(0); result.StudentsIncludingHNS.Band1To5StudentNumbersTLevel.Should().Be(0); result.StudentsIncludingHNS.Band1To5TotalFundingTLevel.Should().Be(0); result.StudentsWithEHCPlan.Band1StudentNumbers.Should().Be(1); result.StudentsWithEHCPlan.Band1TotalFunding.Should().Be((decimal)125.67); result.StudentsWithEHCPlan.Band2StudentNumbers.Should().Be(1); result.StudentsWithEHCPlan.Band2TotalFunding.Should().Be((decimal)555.12); result.StudentsWithEHCPlan.Band3StudentNumbers.Should().Be(0); result.StudentsWithEHCPlan.Band3TotalFunding.Should().Be(0); result.StudentsWithEHCPlan.Band4aStudentNumbers.Should().Be(0); result.StudentsWithEHCPlan.Band4aTotalFunding.Should().Be(0); result.StudentsWithEHCPlan.Band4bStudentNumbers.Should().Be(0); result.StudentsWithEHCPlan.Band4bTotalFunding.Should().Be(0); result.StudentsWithEHCPlan.Band5StudentNumbers.Should().Be(0); result.StudentsWithEHCPlan.Band5TotalFunding.Should().Be(0); result.StudentsWithEHCPlan.Band6StudentNumbers.Should().Be(0); result.StudentsWithEHCPlan.Band6TotalFunding.Should().Be(0); result.StudentsWithEHCPlan.Band7StudentNumbers.Should().Be(1); result.StudentsWithEHCPlan.Band7TotalFunding.Should().Be((decimal)125.67); result.StudentsWithEHCPlan.Band8StudentNumbers.Should().Be(0); result.StudentsWithEHCPlan.Band8TotalFunding.Should().Be(0); result.StudentsWithEHCPlan.Band9StudentNumbers.Should().Be(0); result.StudentsWithEHCPlan.Band9TotalFunding.Should().Be(0); result.StudentsWithEHCPlan.Band1To5StudentNumbersTLevel.Should().Be(0); result.StudentsWithEHCPlan.Band1To5TotalFundingTLevel.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band1StudentNumbers.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band1TotalFunding.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band2StudentNumbers.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band2TotalFunding.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band3StudentNumbers.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band3TotalFunding.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band4aStudentNumbers.Should().Be(1); result.ContinuingStudentsExcludingEHCPlan.Band4aTotalFunding.Should().Be((decimal)855.55); result.ContinuingStudentsExcludingEHCPlan.Band4bStudentNumbers.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band4bTotalFunding.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band5StudentNumbers.Should().Be(1); result.ContinuingStudentsExcludingEHCPlan.Band5TotalFunding.Should().Be((decimal)56425.99); result.ContinuingStudentsExcludingEHCPlan.Band6StudentNumbers.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band6TotalFunding.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band7StudentNumbers.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band7TotalFunding.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band8StudentNumbers.Should().Be(1); result.ContinuingStudentsExcludingEHCPlan.Band8TotalFunding.Should().Be((decimal)56425.99); result.ContinuingStudentsExcludingEHCPlan.Band9StudentNumbers.Should().Be(1); result.ContinuingStudentsExcludingEHCPlan.Band9TotalFunding.Should().Be((decimal)855.55); result.ContinuingStudentsExcludingEHCPlan.Band1To5StudentNumbersTLevel.Should().Be(0); result.ContinuingStudentsExcludingEHCPlan.Band1To5TotalFundingTLevel.Should().Be(0); }
public void Build() { var dependentDataMock = new Mock <IReportServiceDependentData>(); var learningDeliveryFam = new Mock <ILearningDeliveryFAM>(); learningDeliveryFam.SetupGet(fam => fam.LearnDelFAMType).Returns("SOF"); learningDeliveryFam.SetupGet(fam => fam.LearnDelFAMCode).Returns("107"); var albLearningDeliveryFam = new Mock <ILearningDeliveryFAM>(); albLearningDeliveryFam.SetupGet(fam => fam.LearnDelFAMType).Returns("ALB"); var learningDeliveryFams = new List <ILearningDeliveryFAM>() { learningDeliveryFam.Object, albLearningDeliveryFam.Object }; var learningDelivery = new TestLearningDelivery() { FundModel = 25, LearnAimRef = "learnAimRef", AimSeqNumber = 1, LearningDeliveryFAMs = learningDeliveryFams, StdCodeNullable = 1 }; var message = new TestMessage() { Learners = BuildLearners(learningDelivery), HeaderEntity = new TestHeader() { CollectionDetailsEntity = new MessageHeaderCollectionDetails() { FilePreparationDate = new DateTime(2019, 11, 06) } } }; var referenceDataRoot = new ReferenceDataRoot() { Organisations = new List <Organisation>() { new Organisation() { UKPRN = 987654321, Name = "Provider XYZ" } }, MetaDatas = new MetaData() { ReferenceDataVersions = new ReferenceDataVersion() { OrganisationsVersion = new OrganisationsVersion { Version = "1.1.1.1" }, Employers = new EmployersVersion { Version = "2.2.2.2" }, LarsVersion = new LarsVersion { Version = "3.3.3.3" }, PostcodesVersion = new PostcodesVersion { Version = "4.4.4.4" } } } }; var fm25Global = new FM25Global() { Learners = BuildFm25Learners() }; dependentDataMock.Setup(d => d.Get <IMessage>()).Returns(message); dependentDataMock.Setup(d => d.Get <ReferenceDataRoot>()).Returns(referenceDataRoot); dependentDataMock.Setup(d => d.Get <FM25Global>()).Returns(fm25Global); var submissionDateTime = new DateTime(2019, 1, 1, 1, 1, 1); var ukDateTime = new DateTime(2020, 1, 1, 1, 1, 1); var dateTimeProvider = new Mock <IDateTimeProvider>(); var reportServiceContextMock = new Mock <IReportServiceContext>(); reportServiceContextMock.SetupGet(c => c.Ukprn).Returns(987654321); reportServiceContextMock.SetupGet(c => c.SubmissionDateTimeUtc).Returns(submissionDateTime); reportServiceContextMock.SetupGet(c => c.ServiceReleaseVersion).Returns("11.22.3300.4321"); reportServiceContextMock.SetupGet(c => c.IlrReportingFilename).Returns("ILR-12345678-1920-20191005-151322-01.xml"); dateTimeProvider.Setup(p => p.ConvertUtcToUk(submissionDateTime)).Returns(ukDateTime); dateTimeProvider.Setup(p => p.GetNowUtc()).Returns(submissionDateTime); var result = NewBuilder(dateTimeProvider.Object).Build(reportServiceContextMock.Object, dependentDataMock.Object); result.ApplicationVersion.Should().Be("11.22.3300.4321"); result.ComponentSetVersion.Should().Be("NA"); result.FilePreparationDate.Should().Be("06/11/2019"); result.IlrFile.Should().Be("ILR-12345678-1920-20191005-151322-01.xml"); result.LargeEmployerData.Should().Be("2.2.2.2"); result.LarsData.Should().Be("3.3.3.3"); result.OrganisationData.Should().Be("1.1.1.1"); result.PostcodeData.Should().Be("4.4.4.4"); result.ProviderName.Should().Be("Provider XYZ"); result.ReportGeneratedAt.Should().Be("Report generated at: 01:01:01 on 01/01/2020"); result.StudyProgramme.DirectFunded1416StudentsTotal.WithEHCP.Should().Be(1); result.StudyProgramme.DirectFunded1416StudentsTotal.WithoutEHCP.Should().Be(0); result.StudyProgramme.DirectFunded1416StudentsTotal.HNSWithoutEHCP.Should().Be(0); result.StudyProgramme.DirectFunded1416StudentsTotal.EHCPWithHNS.Should().Be(1); result.StudyProgramme.DirectFunded1416StudentsTotal.EHCPWithoutHNS.Should().Be(0); result.StudyProgramme.DirectFunded1416StudentsTotal.TotalFundineStudents.Should().Be(1); result.StudyProgramme.IncludingHNS1619StudentsTotal.WithEHCP.Should().Be(2); result.StudyProgramme.IncludingHNS1619StudentsTotal.WithoutEHCP.Should().Be(0); result.StudyProgramme.IncludingHNS1619StudentsTotal.HNSWithoutEHCP.Should().Be(0); result.StudyProgramme.IncludingHNS1619StudentsTotal.EHCPWithHNS.Should().Be(1); result.StudyProgramme.IncludingHNS1619StudentsTotal.EHCPWithoutHNS.Should().Be(1); result.StudyProgramme.IncludingHNS1619StudentsTotal.TotalFundineStudents.Should().Be(2); result.StudyProgramme.EHCP1924StudentsTotal.WithEHCP.Should().Be(0); result.StudyProgramme.EHCP1924StudentsTotal.WithoutEHCP.Should().Be(0); result.StudyProgramme.EHCP1924StudentsTotal.HNSWithoutEHCP.Should().Be(0); result.StudyProgramme.EHCP1924StudentsTotal.EHCPWithHNS.Should().Be(0); result.StudyProgramme.EHCP1924StudentsTotal.EHCPWithoutHNS.Should().Be(0); result.StudyProgramme.EHCP1924StudentsTotal.TotalFundineStudents.Should().Be(0); result.StudyProgramme.Continuing19PlusExcludingEHCPStudentsTotal.WithEHCP.Should().Be(0); result.StudyProgramme.Continuing19PlusExcludingEHCPStudentsTotal.WithoutEHCP.Should().Be(0); result.StudyProgramme.Continuing19PlusExcludingEHCPStudentsTotal.HNSWithoutEHCP.Should().Be(0); result.StudyProgramme.Continuing19PlusExcludingEHCPStudentsTotal.EHCPWithHNS.Should().Be(0); result.StudyProgramme.Continuing19PlusExcludingEHCPStudentsTotal.EHCPWithoutHNS.Should().Be(0); result.StudyProgramme.Continuing19PlusExcludingEHCPStudentsTotal.TotalFundineStudents.Should().Be(0); result.TLevel.DirectFunded1416StudentsTotal.WithEHCP.Should().Be(1); result.TLevel.DirectFunded1416StudentsTotal.WithoutEHCP.Should().Be(0); result.TLevel.DirectFunded1416StudentsTotal.HNSWithoutEHCP.Should().Be(0); result.TLevel.DirectFunded1416StudentsTotal.EHCPWithHNS.Should().Be(0); result.TLevel.DirectFunded1416StudentsTotal.EHCPWithoutHNS.Should().Be(1); result.TLevel.DirectFunded1416StudentsTotal.TotalFundineStudents.Should().Be(1); result.TLevel.IncludingHNS1619StudentsTotal.WithEHCP.Should().Be(0); result.TLevel.IncludingHNS1619StudentsTotal.WithoutEHCP.Should().Be(0); result.TLevel.IncludingHNS1619StudentsTotal.HNSWithoutEHCP.Should().Be(0); result.TLevel.IncludingHNS1619StudentsTotal.EHCPWithHNS.Should().Be(0); result.TLevel.IncludingHNS1619StudentsTotal.EHCPWithoutHNS.Should().Be(0); result.TLevel.IncludingHNS1619StudentsTotal.TotalFundineStudents.Should().Be(0); result.TLevel.EHCP1924StudentsTotal.WithEHCP.Should().Be(2); result.TLevel.EHCP1924StudentsTotal.WithoutEHCP.Should().Be(0); result.TLevel.EHCP1924StudentsTotal.HNSWithoutEHCP.Should().Be(0); result.TLevel.EHCP1924StudentsTotal.EHCPWithHNS.Should().Be(1); result.TLevel.EHCP1924StudentsTotal.EHCPWithoutHNS.Should().Be(1); result.TLevel.EHCP1924StudentsTotal.TotalFundineStudents.Should().Be(2); result.TLevel.Continuing19PlusExcludingEHCPStudentsTotal.WithEHCP.Should().Be(2); result.TLevel.Continuing19PlusExcludingEHCPStudentsTotal.WithoutEHCP.Should().Be(0); result.TLevel.Continuing19PlusExcludingEHCPStudentsTotal.HNSWithoutEHCP.Should().Be(0); result.TLevel.Continuing19PlusExcludingEHCPStudentsTotal.EHCPWithHNS.Should().Be(1); result.TLevel.Continuing19PlusExcludingEHCPStudentsTotal.EHCPWithoutHNS.Should().Be(1); result.TLevel.Continuing19PlusExcludingEHCPStudentsTotal.TotalFundineStudents.Should().Be(2); result.Ukprn.Should().Be("987654321"); result.Year.Should().Be("2020/21"); }
public async Task GenerateReport(IReportServiceContext reportServiceContext, ZipArchive archive, bool isFis, CancellationToken cancellationToken) { Task <IMessage> ilrFileTask = _ilrProviderService.GetIlrFile(reportServiceContext, cancellationToken); Task <FM25Global> fm25Task = _fm25ProviderService.GetFM25Data(reportServiceContext, cancellationToken); Task <List <string> > validLearnersTask = _validLearnersService.GetLearnersAsync(reportServiceContext, cancellationToken); await Task.WhenAll(ilrFileTask, fm25Task, validLearnersTask); if (cancellationToken.IsCancellationRequested) { return; } List <ILearner> learners = ilrFileTask.Result?.Learners?.Where(x => validLearnersTask.Result.Contains(x.LearnRefNumber)).ToList(); if (learners == null) { _logger.LogWarning("Failed to get learners for High Needs Students Detail Report"); return; } if (cancellationToken.IsCancellationRequested) { return; } List <HNSModel> hnsModels = new List <HNSModel>(); foreach (var learner in learners) { if (learner.LearningDeliveries == null) { continue; } FM25Global fm25Data = fm25Task.Result; foreach (ILearningDelivery learningDelivery in learner.LearningDeliveries) { FM25Learner fm25Learner = fm25Data?.Learners?.SingleOrDefault(l => string.Equals(l.LearnRefNumber, learner.LearnRefNumber, StringComparison.OrdinalIgnoreCase)); if (fm25Learner == null) { continue; } if (!CheckIsApplicableLearner(learningDelivery, fm25Learner)) { continue; } hnsModels.Add(_hnsReportModelBuilder.BuildModel( learner, learningDelivery, fm25Learner)); } } hnsModels.Sort(_hnsModelComparer); string csv = GetReportCsv(hnsModels); var jobId = reportServiceContext.JobId; var ukPrn = reportServiceContext.Ukprn.ToString(); var externalFileName = GetExternalFilename(ukPrn, jobId, reportServiceContext.SubmissionDateTimeUtc); var fileName = GetFilename(ukPrn, jobId, reportServiceContext.SubmissionDateTimeUtc); await _streamableKeyValuePersistenceService.SaveAsync($"{externalFileName}.csv", csv, cancellationToken); await WriteZipEntry(archive, $"{fileName}.csv", csv); }
public FM25Data MapFM25Data(FM25Global fm25Global) => _fm25Mapper.MapData(fm25Global);
public async Task GenerateReport(IReportServiceContext reportServiceContext, ZipArchive archive, bool isFis, CancellationToken cancellationToken) { Task <IMessage> ilrFileTask = _ilrProviderService.GetIlrFile(reportServiceContext, cancellationToken); Task <FM25Global> fm25Task = _fm25ProviderService.GetFM25Data(reportServiceContext, cancellationToken); Task <FM35Global> fm35Task = _fm35ProviderService.GetFM35Data(reportServiceContext, cancellationToken); Task <List <string> > validLearnersTask = _validLearnersService.GetLearnersAsync(reportServiceContext, cancellationToken); await Task.WhenAll(ilrFileTask, fm25Task, fm35Task, validLearnersTask); if (cancellationToken.IsCancellationRequested) { return; } List <ILearner> learners = ilrFileTask.Result?.Learners?.Where(x => validLearnersTask.Result.Contains(x.LearnRefNumber)).ToList(); if (learners == null) { _logger.LogWarning("Failed to get learners for Main Occupancy Report"); return; } string[] learnAimRefs = learners.SelectMany(x => x.LearningDeliveries).Select(x => x.LearnAimRef).Distinct().ToArray(); Task <Dictionary <string, LarsLearningDelivery> > larsLearningDeliveriesTask = _larsProviderService.GetLearningDeliveriesAsync(learnAimRefs, cancellationToken); Task <List <LearnerAndDeliveries> > larsFrameworkAimsTask = _larsProviderService.GetFrameworkAimsAsync(learnAimRefs, learners, cancellationToken); await Task.WhenAll(larsLearningDeliveriesTask, larsFrameworkAimsTask); if (larsLearningDeliveriesTask.Result == null || larsFrameworkAimsTask.Result == null) { _logger.LogWarning("Failed to get LARS data for Main Occupancy Report"); return; } if (cancellationToken.IsCancellationRequested) { return; } List <string> larsErrors = new List <string>(); List <MainOccupancyModel> mainOccupancyModels = new List <MainOccupancyModel>(); foreach (var learner in learners) { if (learner.LearningDeliveries == null) { continue; } FM25Global fm25Data = fm25Task.Result; FM35Global fm35Data = fm35Task.Result; foreach (ILearningDelivery learningDelivery in learner.LearningDeliveries) { if (!CheckIsApplicableLearner(learningDelivery)) { continue; } if (!larsLearningDeliveriesTask.Result.TryGetValue(learningDelivery.LearnAimRef, out LarsLearningDelivery larsModel)) { larsErrors.Add(learningDelivery.LearnAimRef); continue; } LearningDelivery frameworkAim = larsFrameworkAimsTask.Result?.SingleOrDefault(x => string.Equals(x.LearnerLearnRefNumber, learner.LearnRefNumber, StringComparison.OrdinalIgnoreCase)) ?.LearningDeliveries?.SingleOrDefault(x => string.Equals(x.LearningDeliveryLearnAimRef, learningDelivery.LearnAimRef, StringComparison.OrdinalIgnoreCase) && x.LearningDeliveryAimSeqNumber == learningDelivery.AimSeqNumber); if (frameworkAim == null) { larsErrors.Add(learningDelivery.LearnAimRef); continue; } if (learningDelivery.FundModel == 35) { ILR.FundingService.FM35.FundingOutput.Model.Output.LearningDelivery learnerFm35Data = fm35Data ?.Learners?.SingleOrDefault(l => string.Equals(l.LearnRefNumber, learner.LearnRefNumber, StringComparison.OrdinalIgnoreCase)) ?.LearningDeliveries?.SingleOrDefault(l => l.AimSeqNumber == learningDelivery.AimSeqNumber); if (learnerFm35Data != null) { mainOccupancyModels.Add(_mainOccupancyReportModelBuilder.BuildFm35Model( learner, learningDelivery, larsModel, frameworkAim, learnerFm35Data, _stringUtilitiesService)); } } if (learningDelivery.FundModel != 25) { continue; } FM25Learner learnerFm25Data = fm25Data?.Learners?.SingleOrDefault(l => string.Equals(l.LearnRefNumber, learner.LearnRefNumber, StringComparison.OrdinalIgnoreCase)); mainOccupancyModels.Add(_mainOccupancyReportModelBuilder.BuildFm25Model( learner, learningDelivery, learnerFm25Data)); } } LogWarnings(larsErrors); mainOccupancyModels.Sort(MainOccupancyModelComparer); string csv = GetReportCsv(mainOccupancyModels); var jobId = reportServiceContext.JobId; var ukPrn = reportServiceContext.Ukprn.ToString(); var externalFileName = GetExternalFilename(ukPrn, jobId, reportServiceContext.SubmissionDateTimeUtc); var fileName = GetFilename(ukPrn, jobId, reportServiceContext.SubmissionDateTimeUtc); await _streamableKeyValuePersistenceService.SaveAsync($"{externalFileName}.csv", csv, cancellationToken); await WriteZipEntry(archive, $"{fileName}.csv", csv); }
public Dictionary <string, Dictionary <string, decimal?[][]> > BuildFm25Dictionary(FM25Global fm25Global) { return(fm25Global .Learners? .GroupBy(ld => ld.FundLine, StringComparer.OrdinalIgnoreCase) .ToDictionary(k => k.Key, v => v.SelectMany(ld => ld.LearnerPeriodisedValues) .GroupBy(ldpv => ldpv.AttributeName, StringComparer.OrdinalIgnoreCase) .ToDictionary(k => k.Key, value => value.Select(pvGroup => new decimal?[] { pvGroup.Period1, pvGroup.Period2, pvGroup.Period3, pvGroup.Period4, pvGroup.Period5, pvGroup.Period6, pvGroup.Period7, pvGroup.Period8, pvGroup.Period9, pvGroup.Period10, pvGroup.Period11, pvGroup.Period12, }).ToArray(), StringComparer.OrdinalIgnoreCase), StringComparer.OrdinalIgnoreCase) ?? new Dictionary <string, Dictionary <string, decimal?[][]> >()); }
public async Task <FM25Global> GetFM25Data(IReportServiceContext reportServiceContext, CancellationToken cancellationToken) { await _getDataLock.WaitAsync(cancellationToken); try { if (_loadedDataAlready) { return(_fundingOutputs); } cancellationToken.ThrowIfCancellationRequested(); _loadedDataAlready = true; int ukPrn = reportServiceContext.Ukprn; if (string.Equals(reportServiceContext.CollectionName, "ILR1819", StringComparison.OrdinalIgnoreCase)) { string fm25Filename = reportServiceContext.FundingFM25OutputKey; string fm25 = await _storage.GetAsync(fm25Filename, cancellationToken); if (string.IsNullOrEmpty(fm25)) { _fundingOutputs = null; return(_fundingOutputs); } _fundingOutputs = _jsonSerializationService.Deserialize <FM25Global>(fm25); } else { FM25Global fm25Global = new FM25Global(); using (var ilrContext = _ilrRulebaseContextFactory()) { var fm25GlobalDb = await ilrContext.FM25_globals.FirstOrDefaultAsync(x => x.UKPRN == ukPrn, cancellationToken); FM25_Learner[] learners = await ilrContext.FM25_Learners.Where(x => x.UKPRN == ukPrn).Include(x => x.FM25_FM35_Learner_PeriodisedValues).ToArrayAsync(cancellationToken); fm25Global.Learners = new List <FM25Learner>(); foreach (FM25_Learner fm25Learner in learners) { List <LearnerPeriodisedValues> learnerPeriodisedValues = new List <LearnerPeriodisedValues>(); foreach (var learnerPeriodisedValue in fm25Learner.FM25_FM35_Learner_PeriodisedValues) { learnerPeriodisedValues.Add(new LearnerPeriodisedValues { AttributeName = learnerPeriodisedValue.AttributeName, LearnRefNumber = learnerPeriodisedValue.LearnRefNumber, Period1 = learnerPeriodisedValue.Period_1, Period2 = learnerPeriodisedValue.Period_2, Period3 = learnerPeriodisedValue.Period_3, Period4 = learnerPeriodisedValue.Period_4, Period5 = learnerPeriodisedValue.Period_5, Period6 = learnerPeriodisedValue.Period_6, Period7 = learnerPeriodisedValue.Period_7, Period8 = learnerPeriodisedValue.Period_8, Period9 = learnerPeriodisedValue.Period_9, Period10 = learnerPeriodisedValue.Period_10, Period11 = learnerPeriodisedValue.Period_11, Period12 = learnerPeriodisedValue.Period_12 }); } fm25Global.Learners.Add(new FM25Learner { FundLine = fm25Learner.FundLine, LearnerPeriodisedValues = learnerPeriodisedValues }); } if (fm25GlobalDb != null) { fm25Global.LARSVersion = fm25GlobalDb.LARSVersion; fm25Global.OrgVersion = fm25GlobalDb.OrgVersion; fm25Global.PostcodeDisadvantageVersion = fm25GlobalDb.PostcodeDisadvantageVersion; fm25Global.RulebaseVersion = fm25GlobalDb.RulebaseVersion; fm25Global.UKPRN = fm25GlobalDb.UKPRN; } } _fundingOutputs = fm25Global; } } finally { _getDataLock.Release(); } return(_fundingOutputs); }
public void Build_NoLearners() { var dependentDataMock = new Mock <IReportServiceDependentData>(); var message = new TestMessage() { Learners = new List <TestLearner>(), HeaderEntity = new TestHeader() { CollectionDetailsEntity = new MessageHeaderCollectionDetails() { FilePreparationDate = new DateTime(2019, 11, 06) } } }; var referenceDataRoot = new ReferenceDataRoot() { Organisations = new List <Organisation>() { new Organisation() { UKPRN = 987654321, Name = "Provider XYZ", OrganisationCoFRemovals = new List <OrganisationCoFRemoval>() { new OrganisationCoFRemoval() { EffectiveFrom = new DateTime(2019, 01, 01), CoFRemoval = (decimal)4500.12 } }, } }, MetaDatas = new MetaData() { ReferenceDataVersions = new ReferenceDataVersion() { OrganisationsVersion = new OrganisationsVersion { Version = "1.1.1.1" }, Employers = new EmployersVersion { Version = "2.2.2.2" }, LarsVersion = new LarsVersion { Version = "3.3.3.3" }, PostcodesVersion = new PostcodesVersion { Version = "4.4.4.4" }, CoFVersion = new CoFVersion() { Version = "5.5.5.5" } } } }; var fm25Global = new FM25Global() { Learners = new List <FM25Learner>() }; dependentDataMock.Setup(d => d.Get <IMessage>()).Returns(message); dependentDataMock.Setup(d => d.Get <ReferenceDataRoot>()).Returns(referenceDataRoot); dependentDataMock.Setup(d => d.Get <FM25Global>()).Returns(fm25Global); var submissionDateTime = new DateTime(2019, 1, 1, 1, 1, 1); var ukDateTime = new DateTime(2020, 1, 1, 1, 1, 1); var dateTimeProvider = new Mock <IDateTimeProvider>(); var reportServiceContextMock = new Mock <IReportServiceContext>(); reportServiceContextMock.SetupGet(c => c.Ukprn).Returns(987654321); reportServiceContextMock.SetupGet(c => c.SubmissionDateTimeUtc).Returns(submissionDateTime); reportServiceContextMock.SetupGet(c => c.ServiceReleaseVersion).Returns("11.22.3300.4321"); reportServiceContextMock.SetupGet(c => c.IlrReportingFilename).Returns("ILR-12345678-1920-20191005-151322-01.xml"); dateTimeProvider.Setup(p => p.ConvertUtcToUk(submissionDateTime)).Returns(ukDateTime); dateTimeProvider.Setup(p => p.GetNowUtc()).Returns(submissionDateTime); var result = NewBuilder(dateTimeProvider.Object).Build(reportServiceContextMock.Object, dependentDataMock.Object); result.ApplicationVersion.Should().Be("11.22.3300.4321"); result.ComponentSetVersion.Should().Be("NA"); result.FilePreparationDate.Should().Be("06/11/2019"); result.IlrFile.Should().Be("ILR-12345678-1920-20191005-151322-01.xml"); result.LargeEmployerData.Should().Be("2.2.2.2"); result.LarsData.Should().Be("3.3.3.3"); result.OrganisationData.Should().Be("1.1.1.1"); result.PostcodeData.Should().Be("4.4.4.4"); result.CofRemovalData.Should().Be("5.5.5.5"); result.ProviderName.Should().Be("Provider XYZ"); result.ReportGeneratedAt.Should().Be("Report generated at: 01:01:01 on 01/01/2020"); result.Ukprn.Should().Be("987654321"); result.Year.Should().Be("2020/21"); result.CofRemoval.Should().Be((decimal) - 4500.12); }