diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/CustomCostCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/CustomCostCalculationService.java index 2dd079c..1e2686d 100644 --- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/CustomCostCalculationService.java +++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/CustomCostCalculationService.java @@ -37,17 +37,6 @@ public class CustomCostCalculationService { this.shippingFrequencyCalculationService = shippingFrequencyCalculationService; } - private BigDecimal getContainerShare(Premise premise, ContainerCalculationResult containerCalculationResult) { - var weightExceeded = containerCalculationResult.isWeightExceeded(); - var mixable = premise.getHuMixable(); - - if (mixable) { - return BigDecimal.valueOf(weightExceeded ? containerCalculationResult.getHuUtilizationByWeight() : containerCalculationResult.getHuUtilizationByVolume()); - } else { - return BigDecimal.ONE.divide(BigDecimal.valueOf(containerCalculationResult.getHuUnitCount()), 10, RoundingMode.HALF_UP); - } - } - public CustomResult doCalculation(Integer setId, Premise premise, Destination destination, List sections) { var destUnion = countryPropertyRepository.getByMappingIdAndCountryId(CountryPropertyMappingId.UNION, setId, destination.getCountryId()).orElseThrow(); @@ -64,13 +53,13 @@ public class CustomCostCalculationService { double huAnnualAmount = BigDecimal.valueOf(destination.getAnnualAmount()).divide(BigDecimal.valueOf(premise.getHuUnitCount()),0, RoundingMode.CEILING).doubleValue(); - return getCustomCalculationResult(setId, premise, destination, getContainerShare(premise, relevantSections.getFirst().containerResult()), huAnnualAmount, transportationCost, transportationChanceCost, transportationRiskCost); + return getCustomCalculationResult(setId, premise, destination, huAnnualAmount, transportationCost, transportationChanceCost, transportationRiskCost); } return CustomResult.EMPTY; } - private CustomResult getCustomCalculationResult(Integer setId, Premise premise, Destination destination, BigDecimal containerShare, double huAnnualAmount, BigDecimal transportationCost, BigDecimal transportationChanceCost, BigDecimal transportationRiskCost) { + private CustomResult getCustomCalculationResult(Integer setId, Premise premise, Destination destination, double huAnnualAmount, BigDecimal transportationCost, BigDecimal transportationChanceCost, BigDecimal transportationRiskCost) { var shippingFrequency = shippingFrequencyCalculationService.doCalculation(setId, huAnnualAmount); var customFee = Double.parseDouble(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.CUSTOM_FEE, setId).orElseThrow().getCurrentValue()); diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/RouteSectionCostCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/RouteSectionCostCalculationService.java index cfe5b39..db414e9 100644 --- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/RouteSectionCostCalculationService.java +++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/RouteSectionCostCalculationService.java @@ -40,8 +40,9 @@ public class RouteSectionCostCalculationService { private final ChangeRiskFactorCalculationService changeRiskFactorCalculationService; private final NodeRepository nodeRepository; private final UserNodeRepository userNodeRepository; + private final ShippingFrequencyCalculationService shippingFrequencyCalculationService; - public RouteSectionCostCalculationService(ContainerRateRepository containerRateRepository, MatrixRateRepository matrixRateRepository, RouteNodeRepository routeNodeRepository, DistanceService distanceService, PropertyRepository propertyRepository, ChangeRiskFactorCalculationService changeRiskFactorCalculationService, NodeRepository nodeRepository, UserNodeRepository userNodeRepository) { + public RouteSectionCostCalculationService(ContainerRateRepository containerRateRepository, MatrixRateRepository matrixRateRepository, RouteNodeRepository routeNodeRepository, DistanceService distanceService, PropertyRepository propertyRepository, ChangeRiskFactorCalculationService changeRiskFactorCalculationService, NodeRepository nodeRepository, UserNodeRepository userNodeRepository, ShippingFrequencyCalculationService shippingFrequencyCalculationService) { this.containerRateRepository = containerRateRepository; this.matrixRateRepository = matrixRateRepository; this.routeNodeRepository = routeNodeRepository; @@ -50,6 +51,7 @@ public class RouteSectionCostCalculationService { this.changeRiskFactorCalculationService = changeRiskFactorCalculationService; this.nodeRepository = nodeRepository; this.userNodeRepository = userNodeRepository; + this.shippingFrequencyCalculationService = shippingFrequencyCalculationService; } public CalculationJobRouteSection doD2dCalculation(Integer setId, Integer periodId, Premise premise, Destination destination, ContainerCalculationResult containerCalculation) { @@ -94,7 +96,10 @@ public class RouteSectionCostCalculationService { containerCalculation.getMaxContainerWeight(), BigDecimal.valueOf(containerCalculation.getTotalUtilizationByVolume()), BigDecimal.valueOf(containerCalculation.getHuUtilizationByWeight()), - utilization); + utilization, + shippingFrequencyCalculationService.doCalculation(setId, huAnnualAmount.doubleValue()), + huAnnualAmount.doubleValue(), + containerCalculation); result.setCbmPrice(!containerCalculation.isWeightExceeded()); result.setWeightPrice(containerCalculation.isWeightExceeded()); @@ -177,7 +182,10 @@ public class RouteSectionCostCalculationService { containerCalculation.getMaxContainerWeight(), BigDecimal.valueOf(containerCalculation.getTotalUtilizationByVolume()), BigDecimal.valueOf(containerCalculation.getTotalUtilizationByWeight()), - utilization); + utilization, + shippingFrequencyCalculationService.doCalculation(setId, huAnnualAmount.doubleValue()), + huAnnualAmount.doubleValue(), + containerCalculation); result.setCbmPrice(!containerCalculation.isWeightExceeded()); result.setWeightPrice(containerCalculation.isWeightExceeded()); @@ -211,7 +219,11 @@ public class RouteSectionCostCalculationService { int maxContainerWeight, BigDecimal totalVolumeUtilization, BigDecimal totalWeightUtilization, - BigDecimal propertyUtilization) { + BigDecimal propertyUtilization, + double shippingFrequency, + double annualHuAmount, + ContainerCalculationResult containerCalculationResult + ) { BigDecimal utilization; @@ -221,16 +233,26 @@ public class RouteSectionCostCalculationService { BigDecimal cbmRate = rate.divide(BigDecimal.valueOf(containerType.getVolume()), 10, RoundingMode.HALF_UP); BigDecimal weightRate = rate.divide(BigDecimal.valueOf(maxContainerWeight), 10, RoundingMode.HALF_UP); + if (huMixable) { volumePrice = cbmRate.divide(propertyUtilization, 10, RoundingMode.HALF_UP); weightPrice = weightRate.divide(BigDecimal.valueOf(1), 10, RoundingMode.HALF_UP); utilization = weightExceeded ? BigDecimal.ONE : propertyUtilization; } else { + + double huPerContainer = annualHuAmount / shippingFrequency; + + // if the shipping frequency is bigger than the annual amount the "totalXXUtilization" cannot be used. + if(huPerContainer < (containerCalculationResult.getHuUnitCount() * containerCalculationResult.getLayer())) { + + totalVolumeUtilization = BigDecimal.valueOf(huPerContainer * containerCalculationResult.getHu().getVolume(DimensionUnit.M)).divide(BigDecimal.valueOf(containerCalculationResult.getContainerType().getVolume()), 20, RoundingMode.HALF_UP); + totalWeightUtilization = BigDecimal.valueOf(huPerContainer * containerCalculationResult.getHu().getWeight(WeightUnit.KG)).divide(BigDecimal.valueOf(containerCalculationResult.getMaxContainerWeight()), 20, RoundingMode.HALF_UP); + } + volumePrice = cbmRate.divide(totalVolumeUtilization, 10, RoundingMode.HALF_UP); weightPrice = weightRate.divide(totalWeightUtilization, 10, RoundingMode.HALF_UP); utilization = weightExceeded ? totalWeightUtilization : totalVolumeUtilization; - //TODO: wenn shippingfreq > annual hu -> shippingfreq * containerprice. - // gleiches für containercalculation * shippingfreq < annual hu ammount. + } return new PriceCalculationResult(volumePrice, weightPrice, utilization); diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ShippingFrequencyCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ShippingFrequencyCalculationService.java index 04687f4..aa7213a 100644 --- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ShippingFrequencyCalculationService.java +++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ShippingFrequencyCalculationService.java @@ -25,13 +25,13 @@ public class ShippingFrequencyCalculationService { } public double doCalculation(Integer setId, double huAnnualAmount) { - Integer minAnnualFrequency = Integer.parseInt(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.FREQ_MIN, setId).orElseThrow().getCurrentValue()); - Integer maxAnnualFrequency = Integer.parseInt(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.FREQ_MAX, setId).orElseThrow().getCurrentValue()); + int minAnnualFrequency = Integer.parseInt(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.FREQ_MIN, setId).orElseThrow().getCurrentValue()); + int maxAnnualFrequency = Integer.parseInt(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.FREQ_MAX, setId).orElseThrow().getCurrentValue()); - if (huAnnualAmount > maxAnnualFrequency.doubleValue()) + if (huAnnualAmount > (double) maxAnnualFrequency) return maxAnnualFrequency; - return Math.max(huAnnualAmount, minAnnualFrequency.doubleValue()); + return Math.max(huAnnualAmount, (double) minAnnualFrequency); }