Refactor hidden sheet creation logic in export services

Consolidated hidden sheet creation logic into a unified structure to improve code maintainability and reduce duplication. Adjusted mappers to ensure bulk file-specific hidden sheets are created, styled, and protected consistently. Added support for a configurable sheet password and introduced a new method in BulkExportService for enhanced period handling.
This commit is contained in:
Jan 2025-04-16 11:25:55 +02:00
parent af76f6821b
commit 1a57d7dc3d
2 changed files with 63 additions and 27 deletions

View file

@ -2,12 +2,16 @@ package de.avatic.lcc.service.bulk;
import de.avatic.lcc.dto.bulk.BulkFileType; import de.avatic.lcc.dto.bulk.BulkFileType;
import de.avatic.lcc.model.bulk.BulkFileTypes; import de.avatic.lcc.model.bulk.BulkFileTypes;
import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.repositories.rates.ValidityPeriodRepository;
import de.avatic.lcc.service.bulk.helper.HeaderCellStyleProvider; import de.avatic.lcc.service.bulk.helper.HeaderCellStyleProvider;
import de.avatic.lcc.service.bulk.mapper.ContainerRateExcelMapper; import de.avatic.lcc.service.bulk.mapper.*;
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.SheetVisibility;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.InputStreamSource; import org.springframework.core.io.InputStreamSource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -16,37 +20,73 @@ public class BulkExportService {
private final HeaderCellStyleProvider headerCellStyleProvider; private final HeaderCellStyleProvider headerCellStyleProvider;
private final ContainerRateExcelMapper containerRateExcelMapper; private final ContainerRateExcelMapper containerRateExcelMapper;
private final ValidityPeriodRepository validityPeriodRepository;
private final MatrixRateExcelMapper matrixRateExcelMapper;
private final MaterialExcelMapper materialExcelMapper;
private final PackagingExcelMapper packagingExcelMapper;
private final NodeExcelMapper nodeExcelMapper;
private final HiddenNodeExcelMapper hiddenNodeExcelMapper;
private final HiddenCountryExcelMapper hiddenCountryExcelMapper;
private final String sheetPassword;
public BulkExportService(HeaderCellStyleProvider headerCellStyleProvider, ContainerRateExcelMapper containerRateExcelMapper) { public BulkExportService(@Value("${lcc.bulk.sheet_password}") String sheetPassword, HeaderCellStyleProvider headerCellStyleProvider, ContainerRateExcelMapper containerRateExcelMapper, ValidityPeriodRepository validityPeriodRepository, MatrixRateExcelMapper matrixRateExcelMapper, MaterialExcelMapper materialExcelMapper, PackagingExcelMapper packagingExcelMapper, NodeExcelMapper nodeExcelMapper, HiddenNodeExcelMapper hiddenNodeExcelMapper, HiddenCountryExcelMapper hiddenCountryExcelMapper) {
this.headerCellStyleProvider = headerCellStyleProvider; this.headerCellStyleProvider = headerCellStyleProvider;
this.containerRateExcelMapper = containerRateExcelMapper; this.containerRateExcelMapper = containerRateExcelMapper;
this.validityPeriodRepository = validityPeriodRepository;
this.matrixRateExcelMapper = matrixRateExcelMapper;
this.materialExcelMapper = materialExcelMapper;
this.packagingExcelMapper = packagingExcelMapper;
this.nodeExcelMapper = nodeExcelMapper;
this.hiddenNodeExcelMapper = hiddenNodeExcelMapper;
this.hiddenCountryExcelMapper = hiddenCountryExcelMapper;
this.sheetPassword = sheetPassword;
} }
public InputStreamSource generateExport(BulkFileType bulkFileType) { public InputStreamSource generateExport(BulkFileType bulkFileType) {
return generateExport(bulkFileType, validityPeriodRepository.getValidPeriodId());
}
public InputStreamSource generateExport(BulkFileType bulkFileType, Integer periodId) {
Workbook workbook = new XSSFWorkbook(); Workbook workbook = new XSSFWorkbook();
Sheet worksheet = workbook.createSheet(BulkFileTypes.valueOf(bulkFileType.name()).getSheetName()); Sheet worksheet = workbook.createSheet(BulkFileTypes.valueOf(bulkFileType.name()).getSheetName());
CellStyle style = headerCellStyleProvider.createHeaderCellStyle(workbook); CellStyle style = headerCellStyleProvider.createHeaderCellStyle(workbook);
if(bulkFileType.equals(BulkFileType.COUNTRY_MATRIX) || bulkFileType.equals(BulkFileType.NODE))
{
var hiddenCountrySheet = workbook.createSheet(HiddenTableType.COUNTRY_HIDDEN_TABLE.getSheetName());
hiddenCountryExcelMapper.fillSheet(hiddenCountrySheet, style);
hiddenCountrySheet.protectSheet(sheetPassword);
workbook.setSheetVisibility(workbook.getSheetIndex(hiddenCountrySheet), SheetVisibility.VERY_HIDDEN);
}
else if(bulkFileType.equals(BulkFileType.CONTAINER_RATE) || bulkFileType.equals(BulkFileType.PACKAGING))
{
var hiddenNodeSheet = workbook.createSheet(HiddenTableType.NODE_HIDDEN_TABLE.getSheetName());
hiddenNodeExcelMapper.fillSheet(hiddenNodeSheet, style, BulkFileType.PACKAGING.equals(bulkFileType));
hiddenNodeSheet.protectSheet(sheetPassword);
workbook.setSheetVisibility(workbook.getSheetIndex(hiddenNodeSheet), SheetVisibility.VERY_HIDDEN);
}
// Create headers based on the bulk file type // Create headers based on the bulk file type
switch (bulkFileType) { switch (bulkFileType) {
case CONTAINER_RATE: case CONTAINER_RATE:
containerRateExcelMapper.fillSheet(); containerRateExcelMapper.fillSheet(worksheet, style, periodId);
break; break;
case COUNTRY_MATRIX: case COUNTRY_MATRIX:
matrixRateExcelMapper.fillSheet(worksheet, style, periodId);
break; break;
case MATERIAL: case MATERIAL:
materialExcelMapper.fillSheet(worksheet, style);
break; break;
case PACKAGING: case PACKAGING:
packagingExcelMapper.fillSheet(worksheet, style);
break; break;
case NODE: case NODE:
nodeExcelMapper.fillSheet(worksheet, style);
break; break;
} }
return null; return null;
} }
public InputStreamSource generateExport(BulkFileType bulkFileType, Integer validityPeriodId) {
return null;
}
} }

View file

@ -51,7 +51,22 @@ public class TemplateExportService {
Sheet sheet = workbook.createSheet(BulkFileTypes.valueOf(bulkFileType.name()).getSheetName()); Sheet sheet = workbook.createSheet(BulkFileTypes.valueOf(bulkFileType.name()).getSheetName());
CellStyle style = headerCellStyleProvider.createHeaderCellStyle(workbook); CellStyle style = headerCellStyleProvider.createHeaderCellStyle(workbook);
Sheet hiddenSheet = null;
if(bulkFileType.equals(BulkFileType.COUNTRY_MATRIX) || bulkFileType.equals(BulkFileType.NODE))
{
var hiddenCountrySheet = workbook.createSheet(HiddenTableType.COUNTRY_HIDDEN_TABLE.getSheetName());
hiddenCountryExcelMapper.fillSheet(hiddenCountrySheet, style);
hiddenCountrySheet.protectSheet(sheetPassword);
workbook.setSheetVisibility(workbook.getSheetIndex(hiddenCountrySheet), SheetVisibility.VERY_HIDDEN);
}
else if(bulkFileType.equals(BulkFileType.CONTAINER_RATE) || bulkFileType.equals(BulkFileType.PACKAGING))
{
var hiddenNodeSheet = workbook.createSheet(HiddenTableType.NODE_HIDDEN_TABLE.getSheetName());
hiddenNodeExcelMapper.fillSheet(hiddenNodeSheet, style, BulkFileType.PACKAGING.equals(bulkFileType));
hiddenNodeSheet.protectSheet(sheetPassword);
workbook.setSheetVisibility(workbook.getSheetIndex(hiddenNodeSheet), SheetVisibility.VERY_HIDDEN);
}
// Create headers and constraints based on the bulk file type // Create headers and constraints based on the bulk file type
switch (bulkFileType) { switch (bulkFileType) {
@ -79,25 +94,6 @@ public class TemplateExportService {
throw new IllegalArgumentException("Unsupported bulk file type: " + bulkFileType); throw new IllegalArgumentException("Unsupported bulk file type: " + bulkFileType);
} }
switch (bulkFileType) {
case CONTAINER_RATE:
case PACKAGING:
var hiddenNodeSheet = workbook.createSheet(HiddenTableType.NODE_HIDDEN_TABLE.getSheetName());
hiddenNodeExcelMapper.fillSheet(hiddenNodeSheet, style, BulkFileType.PACKAGING.equals(bulkFileType));
hiddenNodeSheet.protectSheet(sheetPassword);
workbook.createName().setNameName(HiddenTableType.NODE_HIDDEN_TABLE.getSheetName()+"_ref");
break;
case COUNTRY_MATRIX:
case NODE:
var hiddenCountrySheet = workbook.createSheet(HiddenTableType.COUNTRY_HIDDEN_TABLE.getSheetName());
hiddenCountryExcelMapper.fillSheet(hiddenCountrySheet, style);
hiddenCountrySheet.protectSheet(sheetPassword);
workbook.setSheetVisibility(workbook.getSheetIndex(hiddenCountrySheet), SheetVisibility.VERY_HIDDEN);
break;
default:
break;
}
// Return the Excel file as an InputStreamSource // Return the Excel file as an InputStreamSource
return new ByteArrayResource(outputStream.toByteArray()); return new ByteArrayResource(outputStream.toByteArray());
} catch (IOException e) { } catch (IOException e) {