Add logging to enhance debugging in taxation services.

This commit is contained in:
Jan 2025-12-13 17:00:55 +01:00
parent 5d804543d7
commit 94692e12ce
2 changed files with 48 additions and 15 deletions

View file

@ -53,12 +53,16 @@ public class EUTaxationApiService {
request.setReferenceDate(getCurrentDate()); request.setReferenceDate(getCurrentDate());
request.setTradeMovement(TradeMovementCode.fromValue(tradeMovement)); request.setTradeMovement(TradeMovementCode.fromValue(tradeMovement));
logger.info("Lookup Measure for {} and {}", goodsCode, countryCode);
JAXBElement<GoodsMeasForWs> requestElement = objectFactory.createGoodsMeasForWs(request); JAXBElement<GoodsMeasForWs> requestElement = objectFactory.createGoodsMeasForWs(request);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
JAXBElement<GoodsMeasForWsResponse> responseElement = JAXBElement<GoodsMeasForWsResponse> responseElement =
(JAXBElement<GoodsMeasForWsResponse>) webServiceTemplate.marshalSendAndReceive(requestElement); (JAXBElement<GoodsMeasForWsResponse>) 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()); return CompletableFuture.completedFuture(responseElement.getValue());
} }

View file

@ -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.GoodsMeasForWsResponse;
import eu.europa.ec.taxation.taric.client.GoodsMeasuresForWsResponse; import eu.europa.ec.taxation.taric.client.GoodsMeasuresForWsResponse;
import jakarta.annotation.Nullable; import jakarta.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
@ -34,6 +36,9 @@ public class TaxationResolverService {
private final NomenclatureService nomenclatureService; private final NomenclatureService nomenclatureService;
private final CountryPropertyRepository countryPropertyRepository; 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) { public TaxationResolverService(CountryRepository countryRepository, EUTaxationApiService eUTaxationApiService, PropertyRepository propertyRepository, ZolltarifnummernApiService zolltarifnummernApiService, NomenclatureService nomenclatureService, CountryPropertyRepository countryPropertyRepository) {
this.countryRepository = countryRepository; this.countryRepository = countryRepository;
this.eUTaxationApiService = eUTaxationApiService; this.eUTaxationApiService = eUTaxationApiService;
@ -73,26 +78,30 @@ public class TaxationResolverService {
var singleResponses = doSingleRequests(joined.toList()); var singleResponses = doSingleRequests(joined.toList());
return Stream.of( return Stream.of(
byCustomUnion.getOrDefault(CustomUnionType.NONE,Collections.emptyList()).stream().collect(Collectors.toMap( byCustomUnion.getOrDefault(CustomUnionType.NONE, Collections.emptyList()).stream().collect(Collectors.toMap(
r -> r, r -> r,
r -> new TaxationResolverApiResponse( r -> new TaxationResolverApiResponse(
r.material(), r.material(),
true, true,
singleResponses.keySet().stream().filter(k -> k.origin.equals(r)).map(singleResponses::get).toList()))), singleResponses.keySet().stream().filter(k -> k.origin.equals(r)).map(singleResponses::get).toList()))),
byCustomUnion.getOrDefault(CustomUnionType.EU,Collections.emptyList()).stream().collect(Collectors.toMap( byCustomUnion.getOrDefault(CustomUnionType.EU, Collections.emptyList()).stream().collect(Collectors.toMap(
r -> r, r -> r,
r -> new TaxationResolverApiResponse( r -> new TaxationResolverApiResponse(
r.material(), r.material(),
false, false,
null)))) 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<TaxationResolverSingleRequest> resolveIncompleteHsCodesIntern(List<TaxationResolverRequest> request) { private List<TaxationResolverSingleRequest> resolveIncompleteHsCodesIntern(List<TaxationResolverRequest> 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<TaxationResolverSingleRequest> resolveIncompleteHsCodes(List<TaxationResolverRequest> request) { private List<TaxationResolverSingleRequest> resolveIncompleteHsCodes(List<TaxationResolverRequest> request) {
@ -244,6 +253,9 @@ public class TaxationResolverService {
} }
public List<TaxationResolverResponse> getTariffRates(List<TaxationResolverRequest> requests) { public List<TaxationResolverResponse> getTariffRates(List<TaxationResolverRequest> requests) {
logger.info("Do taxation resolution for {} requests", requests.size());
var goodMeasures = doRequests(requests); var goodMeasures = doRequests(requests);
return goodMeasures.keySet().stream().map(r -> mapToResponse(r, goodMeasures.get(r))).toList(); 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) { private TaxationResolverResponse mapToResponse(TaxationResolverRequest request, TaxationResolverApiResponse apiResponse) {
// source is EU country. // source is EU country.
if(!apiResponse.requestExecuted) if (!apiResponse.requestExecuted)
return new TaxationResolverResponse(0.0, null, request.material().getHsCode(), request.material(), request.countryId()); return new TaxationResolverResponse(0.0, null, request.material().getHsCode(), request.material(), request.countryId());
List<GoodsMeasForWsResponse> measForWsResponse = apiResponse.apiResponse(); List<GoodsMeasForWsResponse> measForWsResponse = apiResponse.apiResponse();
logger.info("============================");
logger.info("Resolved measures for: {}, {}", request.material(), request.countryId());
try { try {
String selectedHsCode = null; String selectedHsCode = null;
Double selectedDuty = null; Double selectedDuty = null;
@ -277,11 +292,21 @@ public class TaxationResolverService {
var measureType = MeasureType.fromMeasureCode(measure.getMeasureType().getMeasureType()); var measureType = MeasureType.fromMeasureCode(measure.getMeasureType().getMeasureType());
boolean maybeRelevant = measureType.map(MeasureType::containsRelevantDuty).orElse(false); 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) { if (maybeRelevant) {
var duty = extractDuty(measure); var duty = extractDuty(measure);
if (duty.isPresent()) { 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()); maxDuty = Math.max(maxDuty, duty.get());
minDuty = Math.min(minDuty, 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)) { if (selectedDuty != null && (maxDuty - minDuty <= 0.02)) {
return new TaxationResolverResponse(selectedDuty, selectedMeasure, selectedHsCode, request.material(), request.countryId()); return new TaxationResolverResponse(selectedDuty, selectedMeasure, selectedHsCode, request.material(), request.countryId());
} }