From 94692e12ce46355b5abb78ec9c2287bea7392362 Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 13 Dec 2025 17:00:55 +0100 Subject: [PATCH] Add logging to enhance debugging in taxation services. --- .../lcc/service/api/EUTaxationApiService.java | 4 ++ .../service/api/TaxationResolverService.java | 59 ++++++++++++++----- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/main/java/de/avatic/lcc/service/api/EUTaxationApiService.java b/src/main/java/de/avatic/lcc/service/api/EUTaxationApiService.java index 70d2c24..ec3766e 100644 --- a/src/main/java/de/avatic/lcc/service/api/EUTaxationApiService.java +++ b/src/main/java/de/avatic/lcc/service/api/EUTaxationApiService.java @@ -53,12 +53,16 @@ public class EUTaxationApiService { request.setReferenceDate(getCurrentDate()); request.setTradeMovement(TradeMovementCode.fromValue(tradeMovement)); + logger.info("Lookup Measure for {} and {}", goodsCode, countryCode); + JAXBElement requestElement = objectFactory.createGoodsMeasForWs(request); @SuppressWarnings("unchecked") JAXBElement responseElement = (JAXBElement) webServiceTemplate.marshalSendAndReceive(requestElement); + logger.info("Lookup Measure for {} and {} success: {} Measures received.", goodsCode, countryCode, responseElement.getValue().getReturn().getResult().getMeasures().getMeasure().size()); + return CompletableFuture.completedFuture(responseElement.getValue()); } diff --git a/src/main/java/de/avatic/lcc/service/api/TaxationResolverService.java b/src/main/java/de/avatic/lcc/service/api/TaxationResolverService.java index bcd7f12..bdcccdb 100644 --- a/src/main/java/de/avatic/lcc/service/api/TaxationResolverService.java +++ b/src/main/java/de/avatic/lcc/service/api/TaxationResolverService.java @@ -17,6 +17,8 @@ import de.avatic.lcc.util.exception.base.InternalErrorException; import eu.europa.ec.taxation.taric.client.GoodsMeasForWsResponse; import eu.europa.ec.taxation.taric.client.GoodsMeasuresForWsResponse; import jakarta.annotation.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.*; @@ -34,6 +36,9 @@ public class TaxationResolverService { private final NomenclatureService nomenclatureService; private final CountryPropertyRepository countryPropertyRepository; + private final Logger logger = LoggerFactory.getLogger(TaxationResolverService.class); + + public TaxationResolverService(CountryRepository countryRepository, EUTaxationApiService eUTaxationApiService, PropertyRepository propertyRepository, ZolltarifnummernApiService zolltarifnummernApiService, NomenclatureService nomenclatureService, CountryPropertyRepository countryPropertyRepository) { this.countryRepository = countryRepository; this.eUTaxationApiService = eUTaxationApiService; @@ -73,26 +78,30 @@ public class TaxationResolverService { var singleResponses = doSingleRequests(joined.toList()); return Stream.of( - byCustomUnion.getOrDefault(CustomUnionType.NONE,Collections.emptyList()).stream().collect(Collectors.toMap( - r -> r, - r -> new TaxationResolverApiResponse( - r.material(), - true, - singleResponses.keySet().stream().filter(k -> k.origin.equals(r)).map(singleResponses::get).toList()))), + byCustomUnion.getOrDefault(CustomUnionType.NONE, Collections.emptyList()).stream().collect(Collectors.toMap( + r -> r, + r -> new TaxationResolverApiResponse( + r.material(), + true, + singleResponses.keySet().stream().filter(k -> k.origin.equals(r)).map(singleResponses::get).toList()))), - byCustomUnion.getOrDefault(CustomUnionType.EU,Collections.emptyList()).stream().collect(Collectors.toMap( - r -> r, - r -> new TaxationResolverApiResponse( - r.material(), - false, - null)))) + byCustomUnion.getOrDefault(CustomUnionType.EU, Collections.emptyList()).stream().collect(Collectors.toMap( + r -> r, + r -> new TaxationResolverApiResponse( + r.material(), + false, + null)))) - .flatMap(map -> map.entrySet().stream()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(r1,_) -> r1)); + .flatMap(map -> map.entrySet().stream()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (r1, _) -> r1)); } private List resolveIncompleteHsCodesIntern(List request) { - return request.stream().flatMap(r -> nomenclatureService.getNomenclature(r.material().getHsCode()).stream().map(hsCode -> new TaxationResolverSingleRequest(hsCode, r.countryId(), r))).toList(); + var singleRequests = request.stream().flatMap(r -> nomenclatureService.getNomenclature(r.material().getHsCode()).stream().map(hsCode -> new TaxationResolverSingleRequest(hsCode, r.countryId(), r))).toList(); + + logger.info("Resolved {} incomplete hs codes to {} hs code leaves ", request.size(), singleRequests.size()); + + return singleRequests; } private List resolveIncompleteHsCodes(List request) { @@ -244,6 +253,9 @@ public class TaxationResolverService { } public List getTariffRates(List requests) { + + logger.info("Do taxation resolution for {} requests", requests.size()); + var goodMeasures = doRequests(requests); return goodMeasures.keySet().stream().map(r -> mapToResponse(r, goodMeasures.get(r))).toList(); } @@ -251,12 +263,15 @@ public class TaxationResolverService { private TaxationResolverResponse mapToResponse(TaxationResolverRequest request, TaxationResolverApiResponse apiResponse) { // source is EU country. - if(!apiResponse.requestExecuted) + if (!apiResponse.requestExecuted) return new TaxationResolverResponse(0.0, null, request.material().getHsCode(), request.material(), request.countryId()); List measForWsResponse = apiResponse.apiResponse(); + logger.info("============================"); + logger.info("Resolved measures for: {}, {}", request.material(), request.countryId()); + try { String selectedHsCode = null; Double selectedDuty = null; @@ -277,11 +292,21 @@ public class TaxationResolverService { var measureType = MeasureType.fromMeasureCode(measure.getMeasureType().getMeasureType()); boolean maybeRelevant = measureType.map(MeasureType::containsRelevantDuty).orElse(false); + logger.info("Measure ({}{}, {}): is_relevant: {}", measureType.map(MeasureType::getSeries).orElse("UNKNOWN"), measureType.map(MeasureType::getMeasureCode).orElse(""), measureType.map(MeasureType::name).orElse("UNKNOWN"), maybeRelevant); + if (maybeRelevant) { var duty = extractDuty(measure); if (duty.isPresent()) { + logger.info("Measure ({}{}, {}): duty: {}, hs code: {}", + measureType.map(MeasureType::getSeries).orElse("UNKNOWN"), + measureType.map(MeasureType::getMeasureCode).orElse(""), + measureType.map(MeasureType::name).orElse("UNKNOWN"), + measureType.map(MeasureType::getMeasureCode).orElse(null), + entry.getKey().getReturn().getResult().getRequest().getGoodsCode()); + + maxDuty = Math.max(maxDuty, duty.get()); minDuty = Math.min(minDuty, duty.get()); @@ -296,6 +321,10 @@ public class TaxationResolverService { } } + logger.info("============================"); + logger.info("Selected: measure: {}, duty: {}, max_duty: {}, min_duty: {}", selectedMeasure, selectedDuty, maxDuty, minDuty); + logger.info("============================"); + if (selectedDuty != null && (maxDuty - minDuty <= 0.02)) { return new TaxationResolverResponse(selectedDuty, selectedMeasure, selectedHsCode, request.material(), request.countryId()); }