private async Task <string> GetCsv(IReportServiceContext reportServiceContext, CancellationToken cancellationToken) { Task <IMessage> ilrFileTask = _ilrProviderService.GetIlrFile(reportServiceContext, cancellationToken); Task <List <string> > validLearnersTask = _validLearnersService.GetLearnersAsync(reportServiceContext, cancellationToken); Task <FM25Global> fm25Task = _fm25ProviderService.GetFM25Data(reportServiceContext, cancellationToken); await Task.WhenAll(ilrFileTask, validLearnersTask, fm25Task); if (cancellationToken.IsCancellationRequested) { return(null); } List <string> ilrError = new List <string>(); List <MathsAndEnglishModel> mathsAndEnglishModels = new List <MathsAndEnglishModel>(); if (fm25Task.Result?.Learners != null) { foreach (string validLearnerRefNum in validLearnersTask.Result) { ILearner learner = ilrFileTask.Result?.Learners?.SingleOrDefault(x => x.LearnRefNumber == validLearnerRefNum); FM25Learner fm25Learner = fm25Task.Result.Learners.SingleOrDefault(x => x.LearnRefNumber == validLearnerRefNum); if (learner == null || fm25Learner == null) { ilrError.Add(validLearnerRefNum); continue; } if (!_mathsAndEnglishFm25Rules.IsApplicableLearner(fm25Learner)) { continue; } mathsAndEnglishModels.Add(_mathsAndEnglishModelBuilder.BuildModel(learner, fm25Learner)); } } if (ilrError.Any()) { _logger.LogWarning($"Failed to get one or more ILR learners while generating {nameof(MathsAndEnglishReport)}: {_stringUtilitiesService.JoinWithMaxLength(ilrError)}"); } mathsAndEnglishModels.Sort(MathsAndEnglishModelComparer); using (MemoryStream ms = new MemoryStream()) { UTF8Encoding utF8Encoding = new UTF8Encoding(false, true); using (TextWriter textWriter = new StreamWriter(ms, utF8Encoding)) { using (CsvWriter csvWriter = new CsvWriter(textWriter)) { WriteCsvRecords <MathsAndEnglishMapper, MathsAndEnglishModel>(csvWriter, mathsAndEnglishModels); csvWriter.Flush(); textWriter.Flush(); return(Encoding.UTF8.GetString(ms.ToArray())); } } } }
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 async Task GenerateReport(IReportServiceContext reportServiceContext, ZipArchive archive, bool isFis, CancellationToken cancellationToken) { Task <IMessage> ilrFileTask = _ilrProviderService.GetIlrFile(reportServiceContext, cancellationToken); Task <FM25Global> fm25DataTask = _fm25ProviderService.GetFM25Data(reportServiceContext, cancellationToken); Task <string> providerNameTask = _orgProviderService.GetProviderName(reportServiceContext, cancellationToken); Task <decimal?> cofRemovalTask = _orgProviderService.GetCofRemoval(reportServiceContext, cancellationToken); Task <ILRSourceFileInfo> lastSubmittedIlrFileTask = _ilrProviderService.GetLastSubmittedIlrFile(reportServiceContext, cancellationToken); await Task.WhenAll(ilrFileTask, fm25DataTask, providerNameTask, cofRemovalTask, lastSubmittedIlrFileTask); FundingClaim1619HeaderModel fundingSummaryHeaderModel = await GetHeaderAsync(reportServiceContext, ilrFileTask, lastSubmittedIlrFileTask, providerNameTask, cancellationToken, isFis); FundingClaim1619FooterModel fundingSummaryFooterModel = await GetFooterAsync(ilrFileTask, lastSubmittedIlrFileTask, cancellationToken); string[] applicableFundingLineTypes = _applicableFundingLineTypes.Values.SelectMany(x => x).ToArray(); // Funding factors are at provider level but are output by the funding calculation against every learner record. // All learners in one provider will have the same funding factor value so the report can pull the minimum value // of each factor from the funding calc output at provider level to populate the factors table. FundingClaim1619FundingFactorModel fundingClaim1619FundingFactorModel = null; Dictionary <string, List <FundingClaim1619Model> > fundLineAndRateBandData = new Dictionary <string, List <FundingClaim1619Model> >(); foreach (ILearner learner in ilrFileTask.Result.Learners) { FM25Learner learnerFm25Data = fm25DataTask.Result?.Learners?.SingleOrDefault(l => string.Equals(l.LearnRefNumber, learner.LearnRefNumber, StringComparison.OrdinalIgnoreCase)); if (learnerFm25Data == null) { continue; } if (!ApplicableLearner(learnerFm25Data, applicableFundingLineTypes)) { continue; } if (fundingClaim1619FundingFactorModel == null) { fundingClaim1619FundingFactorModel = new FundingClaim1619FundingFactorModel { AreaCostFact1618Hist = learnerFm25Data.AreaCostFact1618Hist.GetValueOrDefault(0).ToString("N5"), ProgWeightHist = learnerFm25Data.ProgWeightHist.GetValueOrDefault(0).ToString("N5"), PrvDisadvPropnHist = learnerFm25Data.PrvDisadvPropnHist.GetValueOrDefault(0).ToString("N5"), PrvHistLrgProgPropn = learnerFm25Data.PrvHistLrgProgPropn.GetValueOrDefault(0).ToString("N5"), PrvRetentFactHist = learnerFm25Data.PrvRetentFactHist.GetValueOrDefault(0).ToString("N5") }; } if (learner.LearningDeliveries.Any(ApplicableLearningDelivery)) { GetFundLineAndBandRateData(learnerFm25Data, ref fundLineAndRateBandData); } } // probably don't need this as this will be calculated automatically through the template //FundingClaim1619Model subTotal = TotalFundLineAndBandRateData(ref fundLineAndRateBandData); // probably don't need this as this will be calculated automatically through the template //FundingClaim1619Model total = new FundingClaim1619Model //{ // StudentNumber = subTotal.StudentNumber, // TotalFunding = 0 // Todo //}; if (cancellationToken.IsCancellationRequested) { return; } long jobId = reportServiceContext.JobId; string ukPrn = reportServiceContext.Ukprn.ToString(); var externalFileName = GetExternalFilename(ukPrn, jobId, reportServiceContext.SubmissionDateTimeUtc); var fileName = GetFilename(ukPrn, jobId, reportServiceContext.SubmissionDateTimeUtc); var assembly = Assembly.GetExecutingAssembly(); string resourceName = assembly.GetManifestResourceNames().Single(str => str.EndsWith("1619FundingClaimReportTemplate.xlsx")); var manifestResourceStream = assembly.GetManifestResourceStream(resourceName); Workbook workbook = new Workbook(manifestResourceStream); Worksheet worksheet = workbook.Worksheets[0]; Cells cells = worksheet.Cells; InsertHeaderFooter(workbook, fundingSummaryHeaderModel, fundingSummaryFooterModel); PopulateAllocationValues(cells, fundingClaim1619FundingFactorModel); PopulateMainData(cells, fundLineAndRateBandData); PopulateCofRemoval(cells, cofRemovalTask.Result); workbook.CalculateFormula(); using (MemoryStream ms = new MemoryStream()) { workbook.Save(ms, SaveFormat.Xlsx); await _streamableKeyValuePersistenceService.SaveAsync($"{externalFileName}.xlsx", ms, cancellationToken); await WriteZipEntry(archive, $"{fileName}.xlsx", ms, cancellationToken); } }
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); }
private async Task <string> GetCsv(IReportServiceContext reportServiceContext, CancellationToken cancellationToken) { Task <IMessage> ilrFileTask = _ilrProviderService.GetIlrFile(reportServiceContext, cancellationToken); Task <List <string> > validLearnersTask = _validLearnersService.GetLearnersAsync(reportServiceContext, cancellationToken); Task <FM25Global> fm25Task = _fm25ProviderService.GetFM25Data(reportServiceContext, cancellationToken); await Task.WhenAll(ilrFileTask, validLearnersTask, fm25Task); if (cancellationToken.IsCancellationRequested) { return(null); } List <string> ilrError = new List <string>(); List <SummaryOfFunding1619Model> summaryOfFunding1619Models = new List <SummaryOfFunding1619Model>(validLearnersTask.Result.Count); foreach (string validLearnerRefNum in validLearnersTask.Result) { var learner = ilrFileTask.Result?.Learners?.SingleOrDefault(x => x.LearnRefNumber == validLearnerRefNum); var fm25Learner = fm25Task.Result?.Learners?.SingleOrDefault(x => x.LearnRefNumber == validLearnerRefNum); if (learner == null || fm25Learner == null) { ilrError.Add(validLearnerRefNum); continue; } summaryOfFunding1619Models.Add(new SummaryOfFunding1619Model { FundLine = fm25Learner.FundLine, LearnRefNumber = learner.LearnRefNumber, FamilyName = learner.FamilyName, GivenNames = learner.GivenNames, DateOfBirth = learner.DateOfBirthNullable?.ToString("dd/MM/yyyy"), CampId = learner.CampId, PlanLearnHours = learner.PlanLearnHoursNullable, PlanEepHours = learner.PlanEEPHoursNullable, TotalPlannedHours = (learner.PlanLearnHoursNullable ?? 0) + (learner.PlanEEPHoursNullable ?? 0), RateBand = fm25Learner.RateBand, StartFund = fm25Learner.StartFund ?? false, OnProgPayment = fm25Learner.OnProgPayment }); } summaryOfFunding1619Models.Sort(SummaryOfFunding1619ModelComparer); if (ilrError.Any()) { _logger.LogWarning($"Failed to get one or more ILR learners while generating S{nameof(MathsAndEnglishReport)}: {_stringUtilitiesService.JoinWithMaxLength(ilrError)}"); } using (MemoryStream ms = new MemoryStream()) { UTF8Encoding utF8Encoding = new UTF8Encoding(false, true); using (TextWriter textWriter = new StreamWriter(ms, utF8Encoding)) { using (CsvWriter csvWriter = new CsvWriter(textWriter)) { WriteCsvRecords <SummaryOfFunding1619Mapper, SummaryOfFunding1619Model>(csvWriter, summaryOfFunding1619Models); csvWriter.Flush(); textWriter.Flush(); return(Encoding.UTF8.GetString(ms.ToArray())); } } } }