public async Task <int> BulkImportAsync(ProviderVenueQualificationFileImportDto fileImportDto)
        {
            _logger.LogInformation($"Processing {nameof(ProviderVenueQualificationFileImportDto)}.");

            var readResultDto = _fileReader.ReadData(fileImportDto);

            if (readResultDto?.ProviderVenueQualifications == null || !readResultDto.ProviderVenueQualifications.Any())
            {
                _logger.LogInformation("No Data Imported.");
                return(0);
            }

            var results =
                (await _providerVenueQualificationService.UpdateAsync(readResultDto.ProviderVenueQualifications))
                .ToList();

            // Log errors in data updates
            foreach (var result in results.Where(result => result.HasErrors))
            {
                _logger.LogError(result.Message);
                await _functionLogRepository.CreateAsync(new FunctionLog
                {
                    ErrorMessage = result.Message,
                    FunctionName = nameof(ProviderVenueQualificationFileImportService),
                    RowNumber    = -1
                });
            }

            var updatedCount = results.Count(x => x.HasErrors == false);

            _logger.LogInformation($"{updatedCount} out of {readResultDto.ProviderVenueQualifications.Count} Providers data successfully updated.");

            return(updatedCount);
        }
示例#2
0
        public ProviderVenueQualificationReadResultDto ReadData(ProviderVenueQualificationFileImportDto fileImportDto)
        {
            var providerVenueQualificationReadResult = new ProviderVenueQualificationReadResultDto
            {
                ProviderVenueQualifications = new List <ProviderVenueQualificationDto>()
            };

            try
            {
                var columnProperties = fileImportDto.GetType().GetProperties()
                                       .Where(pr => pr.GetCustomAttribute <ColumnAttribute>(false) != null)
                                       .Select(prop => new
                {
                    ColumnInfo = prop,
                    Index      = prop.GetCustomAttribute <ColumnAttribute>(false)?.Order
                })
                                       .ToList();

                using var document = SpreadsheetDocument.Open(fileImportDto.FileDataStream, false);
                var stringTablePart = document.WorkbookPart.SharedStringTablePart;

                var sheetDatas = document.GetAllSheetData();
                foreach (var sheetData in sheetDatas)
                {
                    var rows = sheetData.GetAllRows(fileImportDto.NumberOfHeaderRows).ToList();

                    var startIndex = fileImportDto.NumberOfHeaderRows ?? 0;

                    foreach (var row in rows)
                    {
                        foreach (var column in columnProperties)
                        {
                            Debug.Assert(column.Index != null, "column.Index != null");
                            var cell = row.GetCellByIndex(column.Index.Value, startIndex);

                            var cellValue = stringTablePart.GetCellValue(cell);

                            column.ColumnInfo.SetValue(fileImportDto, cellValue.Trim());
                        }

                        if (!string.IsNullOrWhiteSpace(fileImportDto.UkPrn))
                        {
                            var dto = _mapper.Map <ProviderVenueQualificationDto>(fileImportDto);
                            providerVenueQualificationReadResult.ProviderVenueQualifications.Add(dto);
                        }

                        startIndex++;
                    }
                }
            }
            catch (Exception ex)
            {
                providerVenueQualificationReadResult.Error = $"{FailedToImportMessage} {ex.Message} {ex.InnerException?.Message}";
            }

            return(providerVenueQualificationReadResult);
        }