- Enhanching errors if wrong sheet is uploaded

This commit is contained in:
Jan 2025-09-30 20:42:16 +02:00
parent fd8226d4c1
commit cb51789a84
6 changed files with 84 additions and 5 deletions

View file

@ -58,9 +58,16 @@ public class BulkImportService {
try (Workbook workbook = new XSSFWorkbook(in)) { try (Workbook workbook = new XSSFWorkbook(in)) {
Sheet sheet = workbook.getSheet(BulkFileTypes.valueOf(type.name()).getSheetName()); Sheet sheet = workbook.getSheet(BulkFileTypes.valueOf(type.name()).getSheetName());
if(sheet == null) if (sheet == null) {
BulkFileTypes foundType = findSheetType(workbook.getSheetAt(0));
if(foundType != null && !foundType.equals(BulkFileTypes.valueOf(type.name())))
throw new ExcelValidationError("Unable to import " + op.getFileType().getFileType() + ", because " + foundType.getSheetName() + " template was found");
throw new ExcelValidationError("Unable to import " + op.getFileType().getFileType() + ", because \"" + BulkFileTypes.valueOf(type.name()).getSheetName() + "\" sheet is missing. Please use correct template."); throw new ExcelValidationError("Unable to import " + op.getFileType().getFileType() + ", because \"" + BulkFileTypes.valueOf(type.name()).getSheetName() + "\" sheet is missing. Please use correct template.");
}
switch (type) { switch (type) {
case CONTAINER_RATE: case CONTAINER_RATE:
@ -92,5 +99,25 @@ public class BulkImportService {
} }
private BulkFileTypes findSheetType(Sheet sheet) {
if(containerRateExcelMapper.isSheet(sheet))
return BulkFileTypes.CONTAINER_RATE;
if(matrixRateExcelMapper.isSheet(sheet))
return BulkFileTypes.COUNTRY_MATRIX;
if(materialExcelMapper.isSheet(sheet))
return BulkFileTypes.MATERIAL;
if(packagingExcelMapper.isSheet(sheet))
return BulkFileTypes.PACKAGING;
if(nodeExcelMapper.isSheet(sheet))
return BulkFileTypes.NODE;
return null;
}
} }

View file

@ -64,6 +64,15 @@ public class ContainerRateExcelMapper {
} }
public boolean isSheet(Sheet sheet) {
try {
headerGenerator.validateHeader(sheet, ContainerRateHeader.class);
} catch (ExcelValidationError e) {
return false;
}
return true;
}
public List<ContainerRate> extractSheet(Sheet sheet) { public List<ContainerRate> extractSheet(Sheet sheet) {
headerGenerator.validateHeader(sheet, ContainerRateHeader.class); headerGenerator.validateHeader(sheet, ContainerRateHeader.class);
@ -108,12 +117,12 @@ public class ContainerRateExcelMapper {
var fromNode = nodeRepository.getByExternalMappingId(row.getCell(ContainerRateHeader.FROM_NODE.ordinal()).getStringCellValue()); var fromNode = nodeRepository.getByExternalMappingId(row.getCell(ContainerRateHeader.FROM_NODE.ordinal()).getStringCellValue());
var toNode = nodeRepository.getByExternalMappingId(row.getCell(ContainerRateHeader.TO_NODE.ordinal()).getStringCellValue()); var toNode = nodeRepository.getByExternalMappingId(row.getCell(ContainerRateHeader.TO_NODE.ordinal()).getStringCellValue());
if(fromNode.isEmpty() || fromNode.get().getDeprecated()) { if (fromNode.isEmpty() || fromNode.get().getDeprecated()) {
throw new ExcelValidationError("Unable to validate row " + (row.getRowNum() + 1) + " column " + toExcelLetter( ContainerRateHeader.FROM_NODE.ordinal()) + ": Node with mapping id " + row.getCell(ContainerRateHeader.FROM_NODE.ordinal()).getStringCellValue() + " not found."); throw new ExcelValidationError("Unable to validate row " + (row.getRowNum() + 1) + " column " + toExcelLetter(ContainerRateHeader.FROM_NODE.ordinal()) + ": Node with mapping id " + row.getCell(ContainerRateHeader.FROM_NODE.ordinal()).getStringCellValue() + " not found.");
} }
if(toNode.isEmpty() || toNode.get().getDeprecated()) { if (toNode.isEmpty() || toNode.get().getDeprecated()) {
throw new ExcelValidationError("Unable to validate row " + (row.getRowNum() + 1) + " column " + toExcelLetter( ContainerRateHeader.TO_NODE.ordinal()) + ": Node with mapping id " + row.getCell(ContainerRateHeader.TO_NODE.ordinal()).getStringCellValue() + " not found."); throw new ExcelValidationError("Unable to validate row " + (row.getRowNum() + 1) + " column " + toExcelLetter(ContainerRateHeader.TO_NODE.ordinal()) + ": Node with mapping id " + row.getCell(ContainerRateHeader.TO_NODE.ordinal()).getStringCellValue() + " not found.");
} }
entity.setFromNodeId(fromNode.orElseThrow().getId()); entity.setFromNodeId(fromNode.orElseThrow().getId());

View file

@ -3,11 +3,13 @@ package de.avatic.lcc.service.excelMapper;
import de.avatic.lcc.model.bulk.BulkInstruction; import de.avatic.lcc.model.bulk.BulkInstruction;
import de.avatic.lcc.model.bulk.BulkInstructionType; import de.avatic.lcc.model.bulk.BulkInstructionType;
import de.avatic.lcc.model.bulk.header.MaterialHeader; import de.avatic.lcc.model.bulk.header.MaterialHeader;
import de.avatic.lcc.model.bulk.header.MatrixRateHeader;
import de.avatic.lcc.model.bulk.header.NodeHeader; import de.avatic.lcc.model.bulk.header.NodeHeader;
import de.avatic.lcc.model.materials.Material; import de.avatic.lcc.model.materials.Material;
import de.avatic.lcc.repositories.MaterialRepository; import de.avatic.lcc.repositories.MaterialRepository;
import de.avatic.lcc.service.bulk.helper.ConstraintGenerator; import de.avatic.lcc.service.bulk.helper.ConstraintGenerator;
import de.avatic.lcc.service.bulk.helper.HeaderGenerator; import de.avatic.lcc.service.bulk.helper.HeaderGenerator;
import de.avatic.lcc.util.exception.internalerror.ExcelValidationError;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -53,6 +55,15 @@ public class MaterialExcelMapper {
} }
public boolean isSheet(Sheet sheet) {
try {
headerGenerator.validateHeader(sheet, MaterialHeader.class);
} catch (ExcelValidationError e) {
return false;
}
return true;
}
public List<BulkInstruction<Material>> extractSheet(Sheet sheet) { public List<BulkInstruction<Material>> extractSheet(Sheet sheet) {
headerGenerator.validateHeader(sheet, MaterialHeader.class); headerGenerator.validateHeader(sheet, MaterialHeader.class);

View file

@ -1,6 +1,7 @@
package de.avatic.lcc.service.excelMapper; package de.avatic.lcc.service.excelMapper;
import de.avatic.lcc.model.bulk.HiddenTableType; import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.model.bulk.header.ContainerRateHeader;
import de.avatic.lcc.model.bulk.header.HiddenCountryHeader; import de.avatic.lcc.model.bulk.header.HiddenCountryHeader;
import de.avatic.lcc.model.bulk.header.MatrixRateHeader; import de.avatic.lcc.model.bulk.header.MatrixRateHeader;
import de.avatic.lcc.model.country.IsoCode; import de.avatic.lcc.model.country.IsoCode;
@ -9,6 +10,7 @@ import de.avatic.lcc.repositories.country.CountryRepository;
import de.avatic.lcc.repositories.rates.MatrixRateRepository; import de.avatic.lcc.repositories.rates.MatrixRateRepository;
import de.avatic.lcc.service.bulk.helper.ConstraintGenerator; import de.avatic.lcc.service.bulk.helper.ConstraintGenerator;
import de.avatic.lcc.service.bulk.helper.HeaderGenerator; import de.avatic.lcc.service.bulk.helper.HeaderGenerator;
import de.avatic.lcc.util.exception.internalerror.ExcelValidationError;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -37,6 +39,15 @@ public class MatrixRateExcelMapper {
headerGenerator.fixWidth(sheet, MatrixRateHeader.class); headerGenerator.fixWidth(sheet, MatrixRateHeader.class);
} }
public boolean isSheet(Sheet sheet) {
try {
headerGenerator.validateHeader(sheet, MatrixRateHeader.class);
} catch (ExcelValidationError e) {
return false;
}
return true;
}
public List<MatrixRate> extractSheet(Sheet sheet) { public List<MatrixRate> extractSheet(Sheet sheet) {
headerGenerator.validateHeader(sheet, MatrixRateHeader.class); headerGenerator.validateHeader(sheet, MatrixRateHeader.class);

View file

@ -6,6 +6,7 @@ import de.avatic.lcc.model.bulk.BulkInstructionType;
import de.avatic.lcc.model.bulk.HiddenTableType; import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.model.bulk.header.HiddenCountryHeader; import de.avatic.lcc.model.bulk.header.HiddenCountryHeader;
import de.avatic.lcc.model.bulk.header.NodeHeader; import de.avatic.lcc.model.bulk.header.NodeHeader;
import de.avatic.lcc.model.bulk.header.PackagingHeader;
import de.avatic.lcc.model.country.Country; import de.avatic.lcc.model.country.Country;
import de.avatic.lcc.model.country.IsoCode; import de.avatic.lcc.model.country.IsoCode;
import de.avatic.lcc.model.nodes.Node; import de.avatic.lcc.model.nodes.Node;
@ -93,6 +94,15 @@ public class NodeExcelMapper {
} }
public boolean isSheet(Sheet sheet) {
try {
headerGenerator.validateHeader(sheet, NodeHeader.class);
} catch (ExcelValidationError e) {
return false;
}
return true;
}
public List<BulkInstruction<ExcelNode>> extractSheet(Sheet sheet) { public List<BulkInstruction<ExcelNode>> extractSheet(Sheet sheet) {
headerGenerator.validateHeader(sheet, NodeHeader.class); headerGenerator.validateHeader(sheet, NodeHeader.class);

View file

@ -6,6 +6,7 @@ import de.avatic.lcc.model.bulk.BulkInstruction;
import de.avatic.lcc.model.bulk.BulkInstructionType; import de.avatic.lcc.model.bulk.BulkInstructionType;
import de.avatic.lcc.model.bulk.HiddenTableType; import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.model.bulk.header.HiddenNodeHeader; import de.avatic.lcc.model.bulk.header.HiddenNodeHeader;
import de.avatic.lcc.model.bulk.header.MaterialHeader;
import de.avatic.lcc.model.bulk.header.PackagingHeader; import de.avatic.lcc.model.bulk.header.PackagingHeader;
import de.avatic.lcc.model.packaging.Packaging; import de.avatic.lcc.model.packaging.Packaging;
import de.avatic.lcc.model.packaging.PackagingDimension; import de.avatic.lcc.model.packaging.PackagingDimension;
@ -19,6 +20,7 @@ import de.avatic.lcc.repositories.packaging.PackagingPropertiesRepository;
import de.avatic.lcc.repositories.packaging.PackagingRepository; import de.avatic.lcc.repositories.packaging.PackagingRepository;
import de.avatic.lcc.service.bulk.helper.ConstraintGenerator; import de.avatic.lcc.service.bulk.helper.ConstraintGenerator;
import de.avatic.lcc.service.bulk.helper.HeaderGenerator; import de.avatic.lcc.service.bulk.helper.HeaderGenerator;
import de.avatic.lcc.util.exception.internalerror.ExcelValidationError;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -132,6 +134,15 @@ public class PackagingExcelMapper {
} }
public boolean isSheet(Sheet sheet) {
try {
headerGenerator.validateHeader(sheet, PackagingHeader.class);
} catch (ExcelValidationError e) {
return false;
}
return true;
}
public List<BulkInstruction<ExcelPackaging>> extractSheet(Sheet sheet) { public List<BulkInstruction<ExcelPackaging>> extractSheet(Sheet sheet) {
headerGenerator.validateHeader(sheet, PackagingHeader.class); headerGenerator.validateHeader(sheet, PackagingHeader.class);
Map<Integer, String> propertyMappingIds = getPropertyHeaders(sheet.getRow(0)); Map<Integer, String> propertyMappingIds = getPropertyHeaders(sheet.getRow(0));