Fixed "Oversea share" -> "Overseas share". Dont show partnumber/Supplier in error message when in single edit mode
This commit is contained in:
parent
eb5aecb1b5
commit
9b13261a20
9 changed files with 56 additions and 242 deletions
|
|
@ -13,7 +13,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field-group">
|
<div class="field-group">
|
||||||
<div class="caption-column">Oversea share [%]</div>
|
<div class="caption-column">Overseas share [%]</div>
|
||||||
<div class="input-column">
|
<div class="input-column">
|
||||||
<div class="text-container">
|
<div class="text-container">
|
||||||
<input ref="overseaShareInput" @keydown.enter="handleEnter('overseaShareInput', $event)" :value="overSeaSharePercent" @blur="validateOverSeaShare" class="input-field"
|
<input ref="overseaShareInput" @keydown.enter="handleEnter('overseaShareInput', $event)" :value="overSeaSharePercent" @blur="validateOverSeaShare" class="input-field"
|
||||||
|
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
package de.avatic.lcc.model.zolltarifnummern;
|
|
||||||
|
|
||||||
import java.lang.reflect.Array;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class ZolltarifnummernResponse {
|
|
||||||
|
|
||||||
String query;
|
|
||||||
|
|
||||||
String year;
|
|
||||||
|
|
||||||
String lang;
|
|
||||||
|
|
||||||
String version;
|
|
||||||
|
|
||||||
String total;
|
|
||||||
|
|
||||||
List<ZolltarifnummernResponseEntry> suggestions;
|
|
||||||
|
|
||||||
public String getQuery() {
|
|
||||||
return query;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setQuery(String query) {
|
|
||||||
this.query = query;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getYear() {
|
|
||||||
return year;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setYear(String year) {
|
|
||||||
this.year = year;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLang() {
|
|
||||||
return lang;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLang(String lang) {
|
|
||||||
this.lang = lang;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getVersion() {
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setVersion(String version) {
|
|
||||||
this.version = version;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTotal() {
|
|
||||||
return total;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTotal(String total) {
|
|
||||||
this.total = total;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ZolltarifnummernResponseEntry> getSuggestions() {
|
|
||||||
return suggestions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSuggestions(List<ZolltarifnummernResponseEntry> suggestions) {
|
|
||||||
this.suggestions = suggestions;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
package de.avatic.lcc.model.zolltarifnummern;
|
|
||||||
|
|
||||||
public class ZolltarifnummernResponseEntry {
|
|
||||||
|
|
||||||
String code;
|
|
||||||
|
|
||||||
String score;
|
|
||||||
|
|
||||||
String value;
|
|
||||||
|
|
||||||
String data;
|
|
||||||
|
|
||||||
public String getCode() {
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCode(String code) {
|
|
||||||
this.code = code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getScore() {
|
|
||||||
return score;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setScore(String score) {
|
|
||||||
this.score = score;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setValue(String value) {
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getData() {
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setData(String data) {
|
|
||||||
this.data = data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -32,18 +32,16 @@ public class TaxationResolverService {
|
||||||
private final CountryRepository countryRepository;
|
private final CountryRepository countryRepository;
|
||||||
private final EUTaxationApiService eUTaxationApiService;
|
private final EUTaxationApiService eUTaxationApiService;
|
||||||
private final PropertyRepository propertyRepository;
|
private final PropertyRepository propertyRepository;
|
||||||
private final ZolltarifnummernApiService zolltarifnummernApiService;
|
|
||||||
private final NomenclatureService nomenclatureService;
|
private final NomenclatureService nomenclatureService;
|
||||||
private final CountryPropertyRepository countryPropertyRepository;
|
private final CountryPropertyRepository countryPropertyRepository;
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(TaxationResolverService.class);
|
private final Logger logger = LoggerFactory.getLogger(TaxationResolverService.class);
|
||||||
|
|
||||||
|
|
||||||
public TaxationResolverService(CountryRepository countryRepository, EUTaxationApiService eUTaxationApiService, PropertyRepository propertyRepository, ZolltarifnummernApiService zolltarifnummernApiService, NomenclatureService nomenclatureService, CountryPropertyRepository countryPropertyRepository) {
|
public TaxationResolverService(CountryRepository countryRepository, EUTaxationApiService eUTaxationApiService, PropertyRepository propertyRepository, NomenclatureService nomenclatureService, CountryPropertyRepository countryPropertyRepository) {
|
||||||
this.countryRepository = countryRepository;
|
this.countryRepository = countryRepository;
|
||||||
this.eUTaxationApiService = eUTaxationApiService;
|
this.eUTaxationApiService = eUTaxationApiService;
|
||||||
this.propertyRepository = propertyRepository;
|
this.propertyRepository = propertyRepository;
|
||||||
this.zolltarifnummernApiService = zolltarifnummernApiService;
|
|
||||||
this.nomenclatureService = nomenclatureService;
|
this.nomenclatureService = nomenclatureService;
|
||||||
this.countryPropertyRepository = countryPropertyRepository;
|
this.countryPropertyRepository = countryPropertyRepository;
|
||||||
}
|
}
|
||||||
|
|
@ -104,19 +102,6 @@ public class TaxationResolverService {
|
||||||
return singleRequests;
|
return singleRequests;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<TaxationResolverSingleRequest> resolveIncompleteHsCodes(List<TaxationResolverRequest> request) {
|
|
||||||
|
|
||||||
var futures = request.stream()
|
|
||||||
.collect(Collectors.toMap(
|
|
||||||
r -> r,
|
|
||||||
r -> zolltarifnummernApiService.getDeclarableHsCodes(r.material().getHsCode()))
|
|
||||||
);
|
|
||||||
|
|
||||||
CompletableFuture.allOf(futures.values().toArray(new CompletableFuture[0])).join();
|
|
||||||
|
|
||||||
return futures.keySet().stream().flatMap(k -> futures.get(k).join().stream().map(resp -> new TaxationResolverSingleRequest(resp, k.countryId(), k))).toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private Map<TaxationResolverSingleRequest, GoodsMeasForWsResponse> doSingleRequests(List<TaxationResolverSingleRequest> requests) {
|
private Map<TaxationResolverSingleRequest, GoodsMeasForWsResponse> doSingleRequests(List<TaxationResolverSingleRequest> requests) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
package de.avatic.lcc.service.api;
|
|
||||||
|
|
||||||
import de.avatic.lcc.model.zolltarifnummern.ZolltarifnummernResponse;
|
|
||||||
import de.avatic.lcc.model.zolltarifnummern.ZolltarifnummernResponseEntry;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.scheduling.annotation.Async;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.springframework.web.client.RestTemplate;
|
|
||||||
import org.springframework.web.util.UriComponentsBuilder;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class ZolltarifnummernApiService {
|
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ZolltarifnummernApiService.class);
|
|
||||||
|
|
||||||
private static final String API_V_1 = "https://www.zolltarifnummern.de/api/v1/cnSuggest";
|
|
||||||
private final RestTemplate restTemplate;
|
|
||||||
|
|
||||||
public ZolltarifnummernApiService(RestTemplate restTemplate) {
|
|
||||||
this.restTemplate = restTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Async("customLookupExecutor")
|
|
||||||
public CompletableFuture<Set<String>> getDeclarableHsCodes(String incompleteHsCode) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
String url = UriComponentsBuilder.fromUriString(API_V_1)
|
|
||||||
.queryParam("term", incompleteHsCode)
|
|
||||||
.queryParam("lang", "en")
|
|
||||||
.encode()
|
|
||||||
.toUriString();
|
|
||||||
|
|
||||||
var resp = restTemplate.getForObject(url, ZolltarifnummernResponse.class);
|
|
||||||
|
|
||||||
if (resp != null && resp.getSuggestions() != null) {
|
|
||||||
return CompletableFuture.completedFuture(resp.getSuggestions().stream()
|
|
||||||
.map(ZolltarifnummernResponseEntry::getCode)
|
|
||||||
.filter(s -> s.startsWith(incompleteHsCode))
|
|
||||||
.filter(s -> s.length() >= 10).collect(Collectors.toSet()));
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Throwable t) {
|
|
||||||
logger.error("HS code lookup failed with exception \"{}\"", t.getMessage());
|
|
||||||
// just continue
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.warn("Unable to load tarif numbers for HS code {}", incompleteHsCode);
|
|
||||||
|
|
||||||
return CompletableFuture.completedFuture(Collections.emptySet());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -70,8 +70,8 @@ public class CalculationJobProcessorManagementService {
|
||||||
validPeriod = validityPeriodRepository.getByDate(request.getDate());
|
validPeriod = validityPeriodRepository.getByDate(request.getDate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean multiRequest = request.getPremiseIds().size() > 1;
|
||||||
request.getPremiseIds().forEach(premiseId -> preCalculationCheckService.doPrecheck(premiseId, validSet, validPeriod, request.getDate()));
|
request.getPremiseIds().forEach(premiseId -> preCalculationCheckService.doPrecheck(premiseId, validSet, validPeriod, request.getDate(), multiRequest));
|
||||||
|
|
||||||
|
|
||||||
if (validSet.isEmpty() || validPeriod.isEmpty())
|
if (validSet.isEmpty() || validPeriod.isEmpty())
|
||||||
|
|
|
||||||
|
|
@ -52,14 +52,12 @@ public class HandlingCostCalculationService {
|
||||||
BigDecimal handling = BigDecimal.valueOf(Double.parseDouble(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.KLT_HANDLING, setId).orElseThrow().getCurrentValue()));
|
BigDecimal handling = BigDecimal.valueOf(Double.parseDouble(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.KLT_HANDLING, setId).orElseThrow().getCurrentValue()));
|
||||||
BigDecimal release = BigDecimal.valueOf(Double.parseDouble(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.KLT_RELEASE, setId).orElseThrow().getCurrentValue()));
|
BigDecimal release = BigDecimal.valueOf(Double.parseDouble(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.KLT_RELEASE, setId).orElseThrow().getCurrentValue()));
|
||||||
BigDecimal dispatch = BigDecimal.valueOf(Double.parseDouble(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.KLT_DISPATCH, setId).orElseThrow().getCurrentValue()));
|
BigDecimal dispatch = BigDecimal.valueOf(Double.parseDouble(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.KLT_DISPATCH, setId).orElseThrow().getCurrentValue()));
|
||||||
BigDecimal disposal = (addRepackingAndDisposalCost ? BigDecimal.valueOf(Double.parseDouble(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.DISPOSAL, setId).orElseThrow().getCurrentValue())) : BigDecimal.ZERO);
|
|
||||||
|
|
||||||
BigDecimal wageFactor = BigDecimal.valueOf(Double.parseDouble(countryPropertyRepository.getByMappingIdAndCountryId(CountryPropertyMappingId.WAGE, setId, destination.getCountryId()).orElseThrow().getCurrentValue()));
|
BigDecimal wageFactor = BigDecimal.valueOf(Double.parseDouble(countryPropertyRepository.getByMappingIdAndCountryId(CountryPropertyMappingId.WAGE, setId, destination.getCountryId()).orElseThrow().getCurrentValue()));
|
||||||
BigDecimal booking = BigDecimal.valueOf(Double.parseDouble(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.BOOKING_KLT, setId).orElseThrow().getCurrentValue()));
|
BigDecimal booking = BigDecimal.valueOf(Double.parseDouble(propertyRepository.getPropertyByMappingId(SystemPropertyMappingId.BOOKING_KLT, setId).orElseThrow().getCurrentValue()));
|
||||||
|
|
||||||
BigDecimal annualRepacking = Objects.requireNonNullElse(destinationRepacking, getRepackingCost(setId, hu, loadCarrierType, addRepackingAndDisposalCost, destinationRepacking).multiply(wageFactor)).multiply(huAnnualAmount);
|
BigDecimal annualRepacking = Objects.requireNonNullElse(destinationRepacking, getRepackingCost(setId, hu, loadCarrierType, addRepackingAndDisposalCost, destinationRepacking).multiply(wageFactor)).multiply(huAnnualAmount);
|
||||||
BigDecimal annualDisposal = Objects.requireNonNullElse(destinationDisposal.multiply(huAnnualAmount), BigDecimal.ZERO);
|
BigDecimal annualDisposal = Objects.requireNonNullElse(destinationDisposal.multiply(huAnnualAmount), BigDecimal.ZERO);
|
||||||
// BigDecimal annualHandling = Objects.requireNonNullElse(destinationHandling, handling.add(release).add(dispatch).add(disposal).multiply(wageFactor)).multiply(multiplier);
|
|
||||||
|
|
||||||
BigDecimal annualHandling;
|
BigDecimal annualHandling;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,12 +69,12 @@ public class PreCalculationCheckService {
|
||||||
this.userNodeRepository = userNodeRepository;
|
this.userNodeRepository = userNodeRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void doPrecheck(Integer premiseId, Optional<PropertySet> set, Optional<ValidityPeriod> period) {
|
public void doPrecheck(Integer premiseId, Optional<PropertySet> set, Optional<ValidityPeriod> period, boolean showCalcInfo) {
|
||||||
doPrecheck(premiseId, set, period, LocalDate.now());
|
doPrecheck(premiseId, set, period, LocalDate.now(), showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void doPrecheck(Integer premiseId, Optional<PropertySet> set, Optional<ValidityPeriod> period, LocalDate date) {
|
public void doPrecheck(Integer premiseId, Optional<PropertySet> set, Optional<ValidityPeriod> period, LocalDate date, boolean showCalcInfo) {
|
||||||
var premise = premiseRepository.getPremiseById(premiseId).orElseThrow();
|
var premise = premiseRepository.getPremiseById(premiseId).orElseThrow();
|
||||||
|
|
||||||
supplierCheck(premise);
|
supplierCheck(premise);
|
||||||
|
|
@ -88,46 +88,46 @@ public class PreCalculationCheckService {
|
||||||
var partNumber = material.get().getPartNumber();
|
var partNumber = material.get().getPartNumber();
|
||||||
var supplierName = supplier.get().getName();
|
var supplierName = supplier.get().getName();
|
||||||
|
|
||||||
materialCheck(premise, supplierName, partNumber);
|
materialCheck(premise, supplierName, partNumber, showCalcInfo);
|
||||||
|
|
||||||
packagingCheck(premise, supplierName, partNumber);
|
packagingCheck(premise, supplierName, partNumber, showCalcInfo);
|
||||||
|
|
||||||
priceCheck(premise, supplierName, partNumber);
|
priceCheck(premise, supplierName, partNumber, showCalcInfo);
|
||||||
|
|
||||||
var destinations = destinationRepository.getByPremiseId(premiseId);
|
var destinations = destinationRepository.getByPremiseId(premiseId);
|
||||||
|
|
||||||
if (destinations == null || destinations.isEmpty()) {
|
if (destinations == null || destinations.isEmpty()) {
|
||||||
throw new PremiseValidationError("Please add at least one destination to continue", supplierName, partNumber);
|
throw new PremiseValidationError("Please add at least one destination to continue", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Destination destination : destinations) {
|
for (Destination destination : destinations) {
|
||||||
|
|
||||||
var node = nodeRepository.getByDestinationId(destination.getId()).orElseThrow();
|
var node = nodeRepository.getByDestinationId(destination.getId()).orElseThrow();
|
||||||
|
|
||||||
destinationCheck(destination, node, supplierName, partNumber);
|
destinationCheck(destination, node, supplierName, partNumber, showCalcInfo);
|
||||||
|
|
||||||
var routes = routeRepository.getByDestinationId(destination.getId());
|
var routes = routeRepository.getByDestinationId(destination.getId());
|
||||||
|
|
||||||
|
|
||||||
if (routes.isEmpty() && destination.getD2d() == false)
|
if (routes.isEmpty() && destination.getD2d() == false)
|
||||||
throw new PremiseValidationError(String.format("No standard route found for %s - try using an individual rate instead", node.getName()), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("No standard route found for %s - try using an individual rate instead", node.getName()), supplierName, partNumber, showCalcInfo);
|
||||||
|
|
||||||
if (routes.stream().noneMatch(Route::getSelected) && destination.getD2d() == false)
|
if (routes.stream().noneMatch(Route::getSelected) && destination.getD2d() == false)
|
||||||
throw new PremiseValidationError(String.format("Please select a route for %s", node.getName()), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("Please select a route for %s", node.getName()), supplierName, partNumber, showCalcInfo);
|
||||||
|
|
||||||
if (destination.getD2d() && (destination.getRateD2d() == null || destination.getRateD2d().compareTo(BigDecimal.ZERO) == 0)) {
|
if (destination.getD2d() && (destination.getRateD2d() == null || destination.getRateD2d().compareTo(BigDecimal.ZERO) == 0)) {
|
||||||
throw new PremiseValidationError("Please enter a door-to-door rate greater than zero", supplierName, partNumber);
|
throw new PremiseValidationError("Please enter a door-to-door rate greater than zero", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (destination.getD2d() && (destination.getLeadTimeD2d() == null || destination.getLeadTimeD2d() == 0)) {
|
if (destination.getD2d() && (destination.getLeadTimeD2d() == null || destination.getLeadTimeD2d() == 0)) {
|
||||||
throw new PremiseValidationError("Please enter a door-to-door lead time", supplierName, partNumber);
|
throw new PremiseValidationError("Please enter a door-to-door lead time", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
periodCheck(period.orElse(null), set.orElse(null), date, supplierName, partNumber);
|
periodCheck(period.orElse(null), set.orElse(null), date, supplierName, partNumber);
|
||||||
|
|
||||||
routes.stream().filter(Route::getSelected).findAny().ifPresent(r -> {
|
routes.stream().filter(Route::getSelected).findAny().ifPresent(r -> {
|
||||||
var sections = routeSectionRepository.getByRouteId(r.getId());
|
var sections = routeSectionRepository.getByRouteId(r.getId());
|
||||||
routeCheck(sections, period.orElseThrow(), date, supplierName, partNumber);
|
routeCheck(sections, period.orElseThrow(), date, supplierName, partNumber, showCalcInfo);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -163,74 +163,74 @@ public class PreCalculationCheckService {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void routeCheck(List<RouteSection> sections, ValidityPeriod period, LocalDate calculationDate, String supplierName, String partNumber) {
|
private void routeCheck(List<RouteSection> sections, ValidityPeriod period, LocalDate calculationDate, String supplierName, String partNumber, boolean showCalcInfo) {
|
||||||
|
|
||||||
sections.forEach(section -> {
|
sections.forEach(section -> {
|
||||||
var fromRouteNode = routeNodeRepository.getFromNodeBySectionId(section.getId());
|
var fromRouteNode = routeNodeRepository.getFromNodeBySectionId(section.getId());
|
||||||
var toRouteNode = routeNodeRepository.getToNodeBySectionId(section.getId());
|
var toRouteNode = routeNodeRepository.getToNodeBySectionId(section.getId());
|
||||||
|
|
||||||
if (fromRouteNode.isEmpty() || toRouteNode.isEmpty())
|
if (fromRouteNode.isEmpty() || toRouteNode.isEmpty())
|
||||||
throw new PremiseValidationError("Route configuration issue - please contact your administrator", supplierName, partNumber);
|
throw new PremiseValidationError("Route configuration issue - please contact your administrator", supplierName, partNumber, showCalcInfo);
|
||||||
|
|
||||||
if (RateType.MATRIX == section.getRateType()) {
|
if (RateType.MATRIX == section.getRateType()) {
|
||||||
var rate = matrixRateRepository.getByCountryIds(fromRouteNode.get().getCountryId(), toRouteNode.get().getCountryId(), period.getId());
|
var rate = matrixRateRepository.getByCountryIds(fromRouteNode.get().getCountryId(), toRouteNode.get().getCountryId(), period.getId());
|
||||||
constructRouteSectionError(calculationDate, fromRouteNode.get(), toRouteNode.get(), rate.isEmpty(), supplierName, partNumber);
|
constructRouteSectionError(calculationDate, fromRouteNode.get(), toRouteNode.get(), rate.isEmpty(), supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RateType.CONTAINER == section.getRateType()) {
|
if (RateType.CONTAINER == section.getRateType()) {
|
||||||
var rate = containerRateRepository.findRoute(fromRouteNode.get().getNodeId(), toRouteNode.get().getNodeId(), period.getId(), section.getTransportType());
|
var rate = containerRateRepository.findRoute(fromRouteNode.get().getNodeId(), toRouteNode.get().getNodeId(), period.getId(), section.getTransportType());
|
||||||
constructRouteSectionError(calculationDate, fromRouteNode.get(), toRouteNode.get(), rate.isEmpty(), supplierName, partNumber);
|
constructRouteSectionError(calculationDate, fromRouteNode.get(), toRouteNode.get(), rate.isEmpty(), supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void constructRouteSectionError(LocalDate calculationDate, RouteNode fromRouteNode, RouteNode toRouteNode, boolean empty, String supplierName, String partNumber) {
|
private void constructRouteSectionError(LocalDate calculationDate, RouteNode fromRouteNode, RouteNode toRouteNode, boolean empty, String supplierName, String partNumber, boolean showCalcInfo) {
|
||||||
if (empty) {
|
if (empty) {
|
||||||
var dateStr = calculationDate == null ? "" : String.format("on %s", calculationDate.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")));
|
var dateStr = calculationDate == null ? "" : String.format("on %s", calculationDate.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")));
|
||||||
var errStr = String.format("Transport rate missing for %s to %s %s - please contact your administrator",
|
var errStr = String.format("Transport rate missing for %s to %s %s - please contact your administrator",
|
||||||
fromRouteNode.getExternalMappingId(),
|
fromRouteNode.getExternalMappingId(),
|
||||||
toRouteNode.getExternalMappingId(),
|
toRouteNode.getExternalMappingId(),
|
||||||
dateStr);
|
dateStr);
|
||||||
throw new PremiseValidationError(errStr, supplierName, partNumber);
|
throw new PremiseValidationError(errStr, supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void destinationCheck(Destination destination, Node node, String supplierName, String partNumber) {
|
private void destinationCheck(Destination destination, Node node, String supplierName, String partNumber, boolean showCalcInfo) {
|
||||||
|
|
||||||
if (destination.getAnnualAmount() == null || destination.getAnnualAmount() == 0)
|
if (destination.getAnnualAmount() == null || destination.getAnnualAmount() == 0)
|
||||||
throw new PremiseValidationError(String.format("Annual quantity for %s must be greater than zero", node.getName()), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("Annual quantity for %s must be greater than zero", node.getName()), supplierName, partNumber, showCalcInfo);
|
||||||
|
|
||||||
if (destination.getD2d() == null)
|
if (destination.getD2d() == null)
|
||||||
throw new PremiseValidationError(String.format("Something's missing for %s - please contact your administrator", node.getName()), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("Something's missing for %s - please contact your administrator", node.getName()), supplierName, partNumber, showCalcInfo);
|
||||||
|
|
||||||
if (destination.getD2d() == true) {
|
if (destination.getD2d() == true) {
|
||||||
if (destination.getRateD2d() == null || destination.getRateD2d().compareTo(BigDecimal.ZERO) == 0) {
|
if (destination.getRateD2d() == null || destination.getRateD2d().compareTo(BigDecimal.ZERO) == 0) {
|
||||||
throw new PremiseValidationError(String.format("Door-to-door rate for %s needs to be greater than zero", node.getName()), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("Door-to-door rate for %s needs to be greater than zero", node.getName()), supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (destination.getLeadTimeD2d() == null || destination.getLeadTimeD2d() == 0) {
|
if (destination.getLeadTimeD2d() == null || destination.getLeadTimeD2d() == 0) {
|
||||||
throw new PremiseValidationError(String.format("Please set a lead time for door-to-door delivery to %s", node.getName()), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("Please set a lead time for door-to-door delivery to %s", node.getName()), supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (destination.getCountryId() == null || destination.getCountryId() == 0) {
|
if (destination.getCountryId() == null || destination.getCountryId() == 0) {
|
||||||
throw new PremiseValidationError(String.format("Configuration issue with %s - please contact your administrator", node.getName()), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("Configuration issue with %s - please contact your administrator", node.getName()), supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (destination.getGeoLat() == null || destination.getGeoLng() == null) {
|
if (destination.getGeoLat() == null || destination.getGeoLng() == null) {
|
||||||
throw new PremiseValidationError(String.format("Location data missing for %s - please contact your administrator", node.getName()), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("Location data missing for %s - please contact your administrator", node.getName()), supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (destination.getDisposalCost() != null && destination.getDisposalCost().compareTo(BigDecimal.ZERO) < 0) {
|
if (destination.getDisposalCost() != null && destination.getDisposalCost().compareTo(BigDecimal.ZERO) < 0) {
|
||||||
throw new PremiseValidationError(String.format("Disposal costs for %s can't be negative", node.getName()), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("Disposal costs for %s can't be negative", node.getName()), supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (destination.getHandlingCost() != null && destination.getHandlingCost().compareTo(BigDecimal.ZERO) < 0) {
|
if (destination.getHandlingCost() != null && destination.getHandlingCost().compareTo(BigDecimal.ZERO) < 0) {
|
||||||
throw new PremiseValidationError(String.format("Handling costs for %s can't be negative", node.getName()), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("Handling costs for %s can't be negative", node.getName()), supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (destination.getRepackingCost() != null && destination.getRepackingCost().compareTo(BigDecimal.ZERO) < 0) {
|
if (destination.getRepackingCost() != null && destination.getRepackingCost().compareTo(BigDecimal.ZERO) < 0) {
|
||||||
throw new PremiseValidationError(String.format("Repackaging costs for %s can't be negative", node.getName()), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("Repackaging costs for %s can't be negative", node.getName()), supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -242,62 +242,62 @@ public class PreCalculationCheckService {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void priceCheck(Premise premise, String supplierName, String partNumber) {
|
private void priceCheck(Premise premise, String supplierName, String partNumber, boolean showCalcInfo) {
|
||||||
|
|
||||||
if (premise.getMaterialCost() == null || premise.getMaterialCost().compareTo(BigDecimal.ZERO) == 0) {
|
if (premise.getMaterialCost() == null || premise.getMaterialCost().compareTo(BigDecimal.ZERO) == 0) {
|
||||||
throw new PremiseValidationError("Please enter a material cost (MEK_A) greater than zero", supplierName, partNumber);
|
throw new PremiseValidationError("Please enter a material cost (MEK_A) greater than zero", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (premise.getOverseaShare() == null) {
|
if (premise.getOverseaShare() == null) {
|
||||||
throw new PremiseValidationError("Please enter the overseas share", supplierName, partNumber);
|
throw new PremiseValidationError("Please enter the overseas share", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (premise.getFcaEnabled() == null) {
|
if (premise.getFcaEnabled() == null) {
|
||||||
throw new PremiseValidationError("FCA configuration missing - please contact your administrator", supplierName, partNumber);
|
throw new PremiseValidationError("FCA configuration missing - please contact your administrator", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void packagingCheck(Premise premise, String supplierName, String partNumber) {
|
private void packagingCheck(Premise premise, String supplierName, String partNumber, boolean showCalcInfo) {
|
||||||
|
|
||||||
if (premise.getHuMixable() == null) {
|
if (premise.getHuMixable() == null) {
|
||||||
throw new PremiseValidationError("Packaging configuration incomplete - please contact your administrator", supplierName, partNumber);
|
throw new PremiseValidationError("Packaging configuration incomplete - please contact your administrator", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (premise.getHuStackable() == null) {
|
if (premise.getHuStackable() == null) {
|
||||||
throw new PremiseValidationError("Packaging configuration incomplete - please contact your administrator", supplierName, partNumber);
|
throw new PremiseValidationError("Packaging configuration incomplete - please contact your administrator", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (premise.getHuStackable() == false && premise.getHuMixable() == true) {
|
if (premise.getHuStackable() == false && premise.getHuMixable() == true) {
|
||||||
throw new PremiseValidationError("If packaging is mixable, it must also be stackable", supplierName, partNumber);
|
throw new PremiseValidationError("If packaging is mixable, it must also be stackable", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (premise.getIndividualHuLength() == null || premise.getIndividualHuLength() == 0) {
|
if (premise.getIndividualHuLength() == null || premise.getIndividualHuLength() == 0) {
|
||||||
throw new PremiseValidationError("Please enter packaging length", supplierName, partNumber);
|
throw new PremiseValidationError("Please enter packaging length", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (premise.getIndividualHuWidth() == null || premise.getIndividualHuWidth() == 0) {
|
if (premise.getIndividualHuWidth() == null || premise.getIndividualHuWidth() == 0) {
|
||||||
throw new PremiseValidationError("Please enter packaging width", supplierName, partNumber);
|
throw new PremiseValidationError("Please enter packaging width", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (premise.getIndividualHuHeight() == null || premise.getIndividualHuHeight() == 0) {
|
if (premise.getIndividualHuHeight() == null || premise.getIndividualHuHeight() == 0) {
|
||||||
throw new PremiseValidationError("Please enter packaging height", supplierName, partNumber);
|
throw new PremiseValidationError("Please enter packaging height", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (premise.getIndividualHuWeight() == null || premise.getIndividualHuWeight() == 0) {
|
if (premise.getIndividualHuWeight() == null || premise.getIndividualHuWeight() == 0) {
|
||||||
throw new PremiseValidationError("Please enter packaging weight", supplierName, partNumber);
|
throw new PremiseValidationError("Please enter packaging weight", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (premise.getHuUnitCount() == null || premise.getHuUnitCount() == 0) {
|
if (premise.getHuUnitCount() == null || premise.getHuUnitCount() == 0) {
|
||||||
throw new PremiseValidationError("Please enter the number of units per package", supplierName, partNumber);
|
throw new PremiseValidationError("Please enter the number of units per package", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (premise.getHuDisplayedWeightUnit() == null) {
|
if (premise.getHuDisplayedWeightUnit() == null) {
|
||||||
throw new PremiseValidationError("Weight unit configuration missing - please contact your administrator", supplierName, partNumber);
|
throw new PremiseValidationError("Weight unit configuration missing - please contact your administrator", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (premise.getHuDisplayedDimensionUnit() == null) {
|
if (premise.getHuDisplayedDimensionUnit() == null) {
|
||||||
throw new PremiseValidationError("Dimension unit configuration missing - please contact your administrator", supplierName, partNumber);
|
throw new PremiseValidationError("Dimension unit configuration missing - please contact your administrator", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
var hu = dimensionTransformer.toDimensionEntity(premise).withTolerance(DIMENSION_TOLERANCE);
|
var hu = dimensionTransformer.toDimensionEntity(premise).withTolerance(DIMENSION_TOLERANCE);
|
||||||
|
|
@ -306,26 +306,26 @@ public class PreCalculationCheckService {
|
||||||
Optional<Integer> feuLoad = propertyService.getProperty(SystemPropertyMappingId.TEU_LOAD);
|
Optional<Integer> feuLoad = propertyService.getProperty(SystemPropertyMappingId.TEU_LOAD);
|
||||||
|
|
||||||
if (teuLoad.isEmpty() || feuLoad.isEmpty())
|
if (teuLoad.isEmpty() || feuLoad.isEmpty())
|
||||||
throw new PremiseValidationError("System configuration incomplete - please contact your administrator", supplierName, partNumber);
|
throw new PremiseValidationError("System configuration incomplete - please contact your administrator", supplierName, partNumber, showCalcInfo);
|
||||||
|
|
||||||
if (WeightUnit.KG.convertFromG(hu.getWeight()) > teuLoad.get() && hu.getWeight() > feuLoad.get())
|
if (WeightUnit.KG.convertFromG(hu.getWeight()) > teuLoad.get() && hu.getWeight() > feuLoad.get())
|
||||||
throw new PremiseValidationError(String.format("Package weight exceeds %d kg - please check your weight and unit", Math.max(teuLoad.get(), feuLoad.get())), supplierName, partNumber);
|
throw new PremiseValidationError(String.format("Package weight exceeds %d kg - please check your weight and unit", Math.max(teuLoad.get(), feuLoad.get())), supplierName, partNumber, showCalcInfo);
|
||||||
|
|
||||||
var teuFitsXY = (hu.getLength() < ContainerType.TEU.getLength() && hu.getWidth() < ContainerType.TEU.getWidth());
|
var teuFitsXY = (hu.getLength() < ContainerType.TEU.getLength() && hu.getWidth() < ContainerType.TEU.getWidth());
|
||||||
var teuFitsYX = (hu.getWidth() < ContainerType.TEU.getLength() && hu.getLength() < ContainerType.TEU.getWidth());
|
var teuFitsYX = (hu.getWidth() < ContainerType.TEU.getLength() && hu.getLength() < ContainerType.TEU.getWidth());
|
||||||
|
|
||||||
if (!teuFitsYX && !teuFitsXY) {
|
if (!teuFitsYX && !teuFitsXY) {
|
||||||
throw new PremiseValidationError("Package dimensions are too large - please check your measurements and unit", supplierName, partNumber);
|
throw new PremiseValidationError("Package dimensions are too large - please check your measurements and unit", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((hu.getLength() * hu.getWidth()) < 20000) {
|
if ((hu.getLength() * hu.getWidth()) < 20000) {
|
||||||
throw new PremiseValidationError("Package dimensions are too small - please check your measurements and unit", supplierName, partNumber);
|
throw new PremiseValidationError("Package dimensions are too small - please check your measurements and unit", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void materialCheck(Premise premise, String supplierName, String partNumber) {
|
private void materialCheck(Premise premise, String supplierName, String partNumber, boolean showCalcInfo) {
|
||||||
|
|
||||||
// if (premise.getTariffUnlocked()) {
|
// if (premise.getTariffUnlocked()) {
|
||||||
// if (premise.getHsCode() == null || premise.getHsCode().length() < 10)
|
// if (premise.getHsCode() == null || premise.getHsCode().length() < 10)
|
||||||
|
|
@ -337,7 +337,7 @@ public class PreCalculationCheckService {
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if (premise.getTariffRate() == null) {
|
if (premise.getTariffRate() == null) {
|
||||||
throw new PremiseValidationError("Please enter a tariff rate", supplierName, partNumber);
|
throw new PremiseValidationError("Please enter a tariff rate", supplierName, partNumber, showCalcInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@ import de.avatic.lcc.util.exception.base.InternalErrorException;
|
||||||
|
|
||||||
public class PremiseValidationError extends InternalErrorException {
|
public class PremiseValidationError extends InternalErrorException {
|
||||||
|
|
||||||
public PremiseValidationError(String message, String supplierName, String partNumber) {
|
public PremiseValidationError(String message, String supplierName, String partNumber, boolean showCalcInfo) {
|
||||||
super("Calculation data validation failed.", String.format("%s (Part number:%s - %s)",message, partNumber, supplierName));
|
super("Calculation data validation failed.", showCalcInfo ? String.format("%s (Part number: %s - %s)" , message, partNumber, supplierName) : message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public PremiseValidationError(String message) {
|
public PremiseValidationError(String message) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue