// Constants class for better maintainability
public class TransportConstants {
public static final double AIR_FREIGHT_FULL = 100.0;
public static final double AIR_FREIGHT_NONE = 0.0;
// Country codes
public static final String GERMANY = "DE";
public static final String HUNGARY = "HU";
public static final String GREAT_BRITAIN = "GB";
public static final String UNITED_STATES = "US";
public static final String MEXICO = "MX";
public static final String SOUTH_AFRICA = "ZA";
public static final String CHINA = "CN";
// Plant codes
public static final String OXFORD_PLANT = "OXF";
// Transport modes grouped by type
public static final List<String> AIR_TRANSPORT_MODES = List.of("AIR_BCC", "AIR_DIRECT");
public static final List<String> SEA_TRANSPORT_MODES = List.of("SEA_BCC", "SEA_DIRECT");
public static final List<String> STANDARD_MODES = List.of("BN", "GV", "JIX", "ALV");
public static final List<String> UK_FERRY_MODES = List.of("FN", "GV", "JIX", "ALV");
public static final List<String> NAFTA_MODES = List.of("NAFTA_TRUCK", "NAFTA_FTL");
public static final List<String> SOUTH_AFRICA_MODES = List.of("JIX_ZA", "GB_ZA");
public static final List<String> CHINA_MODES = List.of("LTL_CN", "JIT_CN", "JIS53_CN", "FTL_CN", "JIS50_CN");
}
// Improved validation method
private static void validateSupplierAirFreightAndTransportMode(PlantDTO plantDTO, SupplierDetailsDTO supplier) {
if (supplier.getAirFreight() == null) {
return; // Early return if no air freight specified
}
List<String> allowedTransportModes = determineAllowedTransportModes(plantDTO, supplier);
if (!allowedTransportModes.contains(supplier.getTransportMode())) {
throw new ValidationException(
ExceptionResponse.of(ExceptionCodeEnum.SUPPLIER_AIR_FREIGHT_COUNTRY_TRANSPORT_MODE_MISMATCH)
);
}
}
private static List<String> determineAllowedTransportModes(PlantDTO plantDTO, SupplierDetailsDTO supplier) {
double airFreight = supplier.getAirFreight();
if (airFreight == TransportConstants.AIR_FREIGHT_FULL) {
return TransportConstants.AIR_TRANSPORT_MODES;
}
if (airFreight == TransportConstants.AIR_FREIGHT_NONE) {
return getAllowedModesForZeroAirFreight(plantDTO, supplier);
}
if (airFreight > 0.0 && airFreight < TransportConstants.AIR_FREIGHT_FULL) {
return TransportConstants.SEA_TRANSPORT_MODES;
}
return Collections.emptyList();
}
private static List<String> getAllowedModesForZeroAirFreight(PlantDTO plantDTO, SupplierDetailsDTO supplier) {
String country = plantDTO.getCountry();
return switch (country.toUpperCase()) {
case TransportConstants.GERMANY, TransportConstants.HUNGARY ->
combineTransportModes(TransportConstants.STANDARD_MODES, TransportConstants.SEA_TRANSPORT_MODES);
case TransportConstants.GREAT_BRITAIN ->
isOxfordPlant(plantDTO)
? combineTransportModes(TransportConstants.STANDARD_MODES, TransportConstants.SEA_TRANSPORT_MODES)
: combineTransportModes(TransportConstants.UK_FERRY_MODES, TransportConstants.SEA_TRANSPORT_MODES);
case TransportConstants.UNITED_STATES, TransportConstants.MEXICO ->
getNaftaTransportModes(plantDTO, supplier);
case TransportConstants.SOUTH_AFRICA ->
combineMultipleTransportModes(
TransportConstants.SOUTH_AFRICA_MODES,
TransportConstants.SEA_TRANSPORT_MODES,
TransportConstants.STANDARD_MODES,
TransportConstants.NAFTA_MODES
);
case TransportConstants.CHINA ->
combineMultipleTransportModes(
TransportConstants.SEA_TRANSPORT_MODES,
TransportConstants.CHINA_MODES,
TransportConstants.STANDARD_MODES,
TransportConstants.NAFTA_MODES
);
default -> Collections.emptyList();
};
}
private static boolean isOxfordPlant(PlantDTO plantDTO) {
return TransportConstants.OXFORD_PLANT.equalsIgnoreCase(plantDTO.getRnowPlantCode());
}
private static List<String> getNaftaTransportModes(PlantDTO plantDTO, SupplierDetailsDTO supplier) {
List<String> baseModes = combineMultipleTransportModes(
TransportConstants.NAFTA_MODES,
TransportConstants.STANDARD_MODES,
TransportConstants.SEA_TRANSPORT_MODES
);
// Add JIX if supplier and plant are in the same country
if (supplier.getCountry().equals(plantDTO.getCountry())) {
return combineTransportModes(List.of("JIX"), baseModes);
}
return baseModes;
}
// Helper methods for combining transport modes
private static List<String> combineTransportModes(List<String> modes1, List<String> modes2) {
List<String> combined = new ArrayList<>(modes1);
combined.addAll(modes2);
return combined;
}
@SafeVarargs
private static List<String> combineMultipleTransportModes(List<String>... modeLists) {
return Arrays.stream(modeLists)
.flatMap(List::stream)
.collect(Collectors.toList());
}
// Alternative approach using a configuration-based strategy (more advanced)
public class TransportModeConfigurationStrategy {
private static final Map<String, Function<PlantDTO, List<String>>> COUNTRY_STRATEGIES = Map.of(
TransportConstants.GERMANY, plant -> combineTransportModes(TransportConstants.STANDARD_MODES, TransportConstants.SEA_TRANSPORT_MODES),
TransportConstants.HUNGARY, plant -> combineTransportModes(TransportConstants.STANDARD_MODES, TransportConstants.SEA_TRANSPORT_MODES),
TransportConstants.GREAT_BRITAIN, TransportModeConfigurationStrategy::getUkTransportModes,
TransportConstants.SOUTH_AFRICA, plant -> combineMultipleTransportModes(
TransportConstants.SOUTH_AFRICA_MODES,
TransportConstants.SEA_TRANSPORT_MODES,
TransportConstants.STANDARD_MODES,
TransportConstants.NAFTA_MODES
)
// Add other countries as needed
);
public static List<String> getTransportModesForCountry(PlantDTO plantDTO) {
return COUNTRY_STRATEGIES
.getOrDefault(plantDTO.getCountry().toUpperCase(), plant -> Collections.emptyList())
.apply(plantDTO);
}
private static List<String> getUkTransportModes(PlantDTO plantDTO) {
return isOxfordPlant(plantDTO)
? combineTransportModes(TransportConstants.STANDARD_MODES, TransportConstants.SEA_TRANSPORT_MODES)
: combineTransportModes(TransportConstants.UK_FERRY_MODES, TransportConstants.SEA_TRANSPORT_MODES);
}
}