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); }
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); }