public async Task <Response> Handle(Query request, CancellationToken cancellationToken)
        {
            var providerContext = _providerContextProvider.GetProviderContext();

            var apprenticeships = await _sqlQueryDispatcher.ExecuteQuery(new GetApprenticeshipsForProvider()
            {
                ProviderId = providerContext.ProviderInfo.ProviderId
            });

            var allRegions = await _regionCache.GetAllRegions();

            var rows = apprenticeships
                       .OrderBy(x => x.Standard.StandardCode)
                       .ThenBy(x => x.Standard.Version)
                       .SelectMany(app => CsvApprenticeshipRow.FromModel(app, allRegions))
                       .ToList();

            var fileName = FileNameHelper.SanitizeFileName(
                $"{providerContext.ProviderInfo.ProviderName}_apprenticeships_{_clock.UtcNow:yyyyMMddHHmm}.csv");

            return(new Response()
            {
                FileName = fileName,
                Rows = rows
            });
        }
예제 #2
0
        internal async Task <UploadStatus> RevalidateApprenticeshipUploadIfRequired(
            ISqlQueryDispatcher sqlQueryDispatcher,
            Guid apprenticeshipUploadId)
        {
            var apprenticeshipUpload = await sqlQueryDispatcher.ExecuteQuery(new GetApprenticeshipUpload()
            {
                ApprenticeshipUploadId = apprenticeshipUploadId
            });

            if (apprenticeshipUpload == null)
            {
                throw new ArgumentException("Apprenticeship upload does not exist.", nameof(apprenticeshipUploadId));
            }

            var toBeRevalidated = await GetApprenticeshipUploadRowsRequiringRevalidation(sqlQueryDispatcher, apprenticeshipUpload);

            if (toBeRevalidated.Count == 0)
            {
                return(apprenticeshipUpload.UploadStatus);
            }

            var rowsCollection = new ApprenticeshipDataUploadRowInfoCollection(
                toBeRevalidated.Select(r => new ApprenticeshipDataUploadRowInfo(CsvApprenticeshipRow.FromModel(r), r.RowNumber, r.ApprenticeshipId)));

            var(uploadStatus, _) = await ValidateApprenticeshipUploadRows(sqlQueryDispatcher, apprenticeshipUploadId, apprenticeshipUpload.ApprenticeshipUploadId, rowsCollection);

            return(uploadStatus);
        }
        public static ParsedCsvApprenticeshipRow FromCsvApprenticeshipRow(CsvApprenticeshipRow row, IEnumerable <Region> allRegions)
        {
            var parsedRow = row.Adapt(new ParsedCsvApprenticeshipRow());

            parsedRow.ResolvedDeliveryModes    = ResolveDeliveryModes(row.DeliveryModes);
            parsedRow.ResolvedDeliveryMethod   = ResolveDeliveryMethod(row.DeliveryMethod, parsedRow.ResolvedDeliveryModes);
            parsedRow.ResolvedNationalDelivery = ResolveNationalDelivery(row.NationalDelivery, parsedRow.SubRegion, parsedRow.ResolvedDeliveryMethod);
            parsedRow.ResolvedRadius           = ResolveRadius(row.Radius);
            parsedRow.ResolvedSubRegions       = ResolveSubRegions(parsedRow.SubRegion, allRegions);
            return(parsedRow);
        }
예제 #4
0
        public async Task ProcessApprenticeshipFile(Guid apprenticeshipUploadId, Stream stream)
        {
            using (var dispatcher = _sqlQueryDispatcherFactory.CreateDispatcher(System.Data.IsolationLevel.ReadCommitted))
            {
                var setProcessingResult = await dispatcher.ExecuteQuery(new SetApprenticeshipUploadProcessing()
                {
                    ApprenticeshipUploadId = apprenticeshipUploadId,
                    ProcessingStartedOn    = _clock.UtcNow
                });

                if (setProcessingResult != SetApprenticeshipUploadProcessingResult.Success)
                {
                    await DeleteBlob();

                    return;
                }

                await dispatcher.Commit();
            }

            List <CsvApprenticeshipRow> rows;

            using (var streamReader = new StreamReader(stream))
                using (var csvReader = CreateCsvReader(streamReader))
                {
                    rows = await csvReader.GetRecordsAsync <CsvApprenticeshipRow>().ToListAsync();
                }

            var rowsCollection = CreateApprenticeshipDataUploadRowInfoCollection();

            using (var dispatcher = _sqlQueryDispatcherFactory.CreateDispatcher(System.Data.IsolationLevel.ReadCommitted))
            {
                var venueUpload = await dispatcher.ExecuteQuery(new GetApprenticeshipUpload()
                {
                    ApprenticeshipUploadId = apprenticeshipUploadId
                });

                var providerId = venueUpload.ProviderId;

                await AcquireExclusiveApprenticeshipUploadLockForProvider(providerId, dispatcher);
                await ValidateApprenticeshipUploadRows(dispatcher, apprenticeshipUploadId, providerId, rowsCollection);

                await dispatcher.Commit();
            }

            await DeleteBlob();

            Task DeleteBlob()
            {
                var blobName = $"{Constants.ApprenticeshipsFolder}/{apprenticeshipUploadId}.csv";

                return(_blobContainerClient.DeleteBlobIfExistsAsync(blobName));
            }

            ApprenticeshipDataUploadRowInfoCollection CreateApprenticeshipDataUploadRowInfoCollection()
            {
                // N.B. It's important we maintain ordering here; RowNumber needs to match the input

                var grouped = CsvApprenticeshipRow.GroupRows(rows);
                var groupApprenticeshipIds = grouped.Select(g => (ApprenticeshipId: Guid.NewGuid(), Rows: g)).ToArray();

                var rowInfos = new List <ApprenticeshipDataUploadRowInfo>(rows.Count);

                foreach (var row in rows)
                {
                    var apprenticeshipId = groupApprenticeshipIds.Single(g => g.Rows.Contains(row)).ApprenticeshipId;
                    row.ContactPhone = NormalizePhoneNumber(row.ContactPhone);

                    rowInfos.Add(new ApprenticeshipDataUploadRowInfo(row, rowNumber: rowInfos.Count + 2, apprenticeshipId));
                }

                return(new ApprenticeshipDataUploadRowInfoCollection(rowInfos));
            }
        }