Esempio n. 1
0
        public static DasProviderResultViewModel FromDasProviderResult(DasProviderResult result)
        {
            if (result == null)
            {
                throw new ArgumentNullException(nameof(result));
            }

            return(new DasProviderResultViewModel
            {
                Success = result.Success,
                Result = result.Result,
                Messages = result.Exceptions?.Select(e =>
                                                     e is ProviderExportException && e.InnerException != null
                        ? e.InnerException.Message
                        : e.Message).ToArray()
            });
        }
Esempio n. 2
0
        public async Task <IEnumerable <DasProviderResult> > ApprenticeshipsToDasProviders(List <Apprenticeship> apprenticeships)
        {
            try
            {
                var timer = Stopwatch.StartNew();
                var evt   = new EventTelemetry {
                    Name = "ApprenticeshipsToDasProviders"
                };

                var apprenticeshipsByUKPRN = apprenticeships
                                             .GroupBy(a => a.ProviderUKPRN)
                                             .OrderBy(g => g.Key)
                                             .ToArray();

                var providers = (await _providerServiceClient.GetAllProviders())
                                .ToArray();

                var feChoices = (await _referenceDataServiceClient.GetAllFeChoiceData())
                                .ToArray();

                evt.Metrics.TryAdd("Apprenticeships", apprenticeships.Count);
                evt.Metrics.TryAdd("Providers", apprenticeshipsByUKPRN.Length);

                Console.WriteLine($"[{DateTime.UtcNow:G}] Found {apprenticeships.Count} apprenticeships for {apprenticeshipsByUKPRN.Length} Providers");

                var results = new ConcurrentBag <DasProviderResult>();

                Parallel.ForEach(apprenticeshipsByUKPRN.Select((g, i) =>
                                                               new { UKPRN = g.Key, Index = i, Apprenticeships = g.Where(a => a.RecordStatus == RecordStatus.Live).ToList() }), p =>
                {
                    try
                    {
                        var provider = ExportProvider(
                            p.UKPRN,
                            p.Index + 1000,
                            providers.Where(pp => pp.UnitedKingdomProviderReferenceNumber == p.UKPRN.ToString()),
                            p.Apprenticeships,
                            feChoices.SingleOrDefault(f => f.UKPRN == p.UKPRN));

                        results.Add(DasProviderResult.Succeeded(p.UKPRN, provider));

                        Console.WriteLine($"[{DateTime.UtcNow:G}][INFO] Exported {p.UKPRN} ({p.Index} of {p.Apprenticeships.Count})");
                    }
                    catch (ExportException ex)
                    {
                        results.Add(DasProviderResult.Failed(p.UKPRN, ex));

                        _telemetryClient.TrackException(ex);
                        Console.WriteLine($"[{DateTime.UtcNow:G}][ERROR] Failed to export {p.UKPRN} ({p.Index} of {p.Apprenticeships.Count})");
                    }
                });

                timer.Stop();

                var success = results.Count(r => r.Success);
                var failure = results.Count(r => !r.Success);

                Console.WriteLine($"[{DateTime.UtcNow:G}] Exported {results.Count(r => r.Success)} Providers in {timer.Elapsed.TotalSeconds} seconds.");

                if (failure > 0)
                {
                    Console.WriteLine($"[{DateTime.UtcNow:G}] [WARNING] Encountered {failure} errors that need attention");
                }

                evt.Metrics.TryAdd("Export elapsed time (ms)", timer.ElapsedMilliseconds);
                evt.Metrics.TryAdd("Export success", success);
                evt.Metrics.TryAdd("Export failures", failure);
                _telemetryClient.TrackEvent(evt);

                return(results.OrderBy(r => r.UKPRN).ToList());
            }
            catch (Exception e)
            {
                throw new ProviderServiceException(e);
            }
        }