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 f6e118d..31d10a5 100644 --- a/src/main/java/de/avatic/lcc/service/api/TaxationResolverService.java +++ b/src/main/java/de/avatic/lcc/service/api/TaxationResolverService.java @@ -46,6 +46,7 @@ public class TaxationResolverService { private Map doRequests(List requests) { + /* country id -> union type */ Map union = requests.stream() .map(TaxationResolverRequest::countryId) .distinct() @@ -57,8 +58,10 @@ public class TaxationResolverService { .orElseThrow() )); + var byCustomUnion = requests.stream().collect(Collectors.groupingBy(r -> (union.get(r.countryId())))); + /* split by incomplete hs codes and complete hs codes */ var filteredRequests = byCustomUnion.getOrDefault(CustomUnionType.NONE, Collections.emptyList()).stream().collect(Collectors.partitioningBy(r -> r.material().getHsCode() != null && r.material().getHsCode().length() < 10)); var joined = Stream.concat( @@ -293,7 +296,7 @@ public class TaxationResolverService { } } - if (selectedDuty != null && (maxDuty - minDuty < 0.02)) { + if (selectedDuty != null && (maxDuty - minDuty <= 0.02)) { return new TaxationResolverResponse(selectedDuty, selectedMeasure, selectedHsCode, request.material(), request.countryId()); } diff --git a/src/main/java/de/avatic/lcc/service/calculation/PremiseCreationService.java b/src/main/java/de/avatic/lcc/service/calculation/PremiseCreationService.java index f5f7c74..c702423 100644 --- a/src/main/java/de/avatic/lcc/service/calculation/PremiseCreationService.java +++ b/src/main/java/de/avatic/lcc/service/calculation/PremiseCreationService.java @@ -7,6 +7,7 @@ import de.avatic.lcc.model.db.premises.Premise; import de.avatic.lcc.model.db.premises.PremiseState; import de.avatic.lcc.model.db.properties.PackagingProperty; import de.avatic.lcc.model.db.properties.PackagingPropertyMappingId; +import de.avatic.lcc.model.db.properties.SystemPropertyMappingId; import de.avatic.lcc.repositories.MaterialRepository; import de.avatic.lcc.repositories.NodeRepository; import de.avatic.lcc.repositories.packaging.PackagingDimensionRepository; @@ -14,8 +15,9 @@ import de.avatic.lcc.repositories.packaging.PackagingPropertiesRepository; import de.avatic.lcc.repositories.packaging.PackagingRepository; import de.avatic.lcc.repositories.premise.PremiseRepository; import de.avatic.lcc.repositories.users.UserNodeRepository; -import de.avatic.lcc.service.api.CustomApiService; import de.avatic.lcc.service.access.DestinationService; +import de.avatic.lcc.service.access.PropertyService; +import de.avatic.lcc.service.api.CustomApiService; import de.avatic.lcc.service.api.TaxationResolverService; import de.avatic.lcc.service.transformer.generic.DimensionTransformer; import de.avatic.lcc.service.transformer.premise.PremiseTransformer; @@ -27,7 +29,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.*; +import java.util.Collections; +import java.util.List; +import java.util.Optional; import java.util.stream.Stream; @Service @@ -44,8 +48,9 @@ public class PremiseCreationService { private final PackagingPropertiesRepository packagingPropertiesRepository; private final AuthorizationService authorizationService; private final TaxationResolverService taxationResolverService; + private final PropertyService propertyService; - public PremiseCreationService(PremiseRepository premiseRepository, PremiseTransformer premiseTransformer, DestinationService destinationService, UserNodeRepository userNodeRepository, NodeRepository nodeRepository, MaterialRepository materialRepository, DimensionTransformer dimensionTransformer, PackagingRepository packagingRepository, PackagingDimensionRepository packagingDimensionRepository, PackagingPropertiesRepository packagingPropertiesRepository, CustomApiService customApiService, AuthorizationService authorizationService, TaxationResolverService taxationResolverService) { + public PremiseCreationService(PremiseRepository premiseRepository, PremiseTransformer premiseTransformer, DestinationService destinationService, UserNodeRepository userNodeRepository, NodeRepository nodeRepository, MaterialRepository materialRepository, DimensionTransformer dimensionTransformer, PackagingRepository packagingRepository, PackagingDimensionRepository packagingDimensionRepository, PackagingPropertiesRepository packagingPropertiesRepository, CustomApiService customApiService, AuthorizationService authorizationService, TaxationResolverService taxationResolverService, PropertyService propertyService) { this.premiseRepository = premiseRepository; this.premiseTransformer = premiseTransformer; this.destinationService = destinationService; @@ -59,6 +64,7 @@ public class PremiseCreationService { this.authorizationService = authorizationService; this.taxationResolverService = taxationResolverService; + this.propertyService = propertyService; } @Transactional @@ -66,6 +72,8 @@ public class PremiseCreationService { var userId = authorizationService.getUserId(); userNodeRepository.checkOwner(userSupplierIds, userId); + Optional defaultTariff = propertyService.getProperty(SystemPropertyMappingId.TARIFF_RATE); + /* Build all resulting premises */ List premises = Stream.concat( supplierIds.stream().flatMap(id -> materialIds.stream().map(materialId -> new TemporaryPremise(materialId, id, null, false))), @@ -82,13 +90,13 @@ public class PremiseCreationService { if (p.getPremise() == null) { // create new p.setId(premiseRepository.insert(p.getMaterialId(), p.getSupplierId(), p.getUserSupplierId(), p.getGeoLat(), p.getGeoLng(), p.getCountryId(), userId)); - fillPremise(p, tariffs, userId); + fillPremise(p, tariffs, defaultTariff, userId); } else if (p.getPremise().getState().equals(PremiseState.DRAFT)) { // recycle p.setId(p.getPremise().getId()); if (createEmpty) { // reset to defaults. - fillPremise(p, tariffs, userId); + fillPremise(p, tariffs, defaultTariff, userId); // remove destinations destinationService.deleteAllDestinationsByPremiseId(Collections.singletonList(p.getId()), false); } @@ -105,7 +113,6 @@ public class PremiseCreationService { } - private void copyPremise(TemporaryPremise p, Integer userId) { var old = p.getPremise(); @@ -115,12 +122,12 @@ public class PremiseCreationService { premiseRepository.setPackagingId(p.getId(), old.getPackagingId()); } - private void fillPremise(TemporaryPremise p, List tariffs, Integer userId) { + private void fillPremise(TemporaryPremise p, List tariffs, Optional optTariff, Integer userId) { if (!p.isUserSupplier()) { var packaging = packagingRepository.getByMaterialIdAndSupplierId(p.getMaterialId(), p.getSupplierId()); - Optional hu = packaging.flatMap( o -> packagingDimensionRepository.getById(o.getHuId())); - Optional shu = packaging.flatMap(o ->packagingDimensionRepository.getById(o.getShuId())); + Optional hu = packaging.flatMap(o -> packagingDimensionRepository.getById(o.getHuId())); + Optional shu = packaging.flatMap(o -> packagingDimensionRepository.getById(o.getShuId())); if (hu.isPresent() && shu.isPresent()) { boolean stackable = packagingPropertiesRepository.getByPackagingIdAndType(packaging.get().getId(), PackagingPropertyMappingId.STACKABLE.name()).map(PackagingProperty::getValue).map(Boolean::valueOf).orElse(false); @@ -135,13 +142,15 @@ public class PremiseCreationService { premiseRepository.resetPrice(Collections.singletonList(p.getId())); } + var defaultTariff = optTariff.orElse(null); + tariffs.stream() .filter(r -> r.material().getId().equals(p.getMaterialId()) && r.countryId().equals(p.getCountryId())) .findFirst() .ifPresent(value -> premiseRepository.updateMaterial(Collections.singletonList( - p.getId()), + p.getId()), value.actualHsCode(), - value.tariffRate() == null ? null : BigDecimal.valueOf(value.tariffRate()), + value.tariffRate() == null ? (defaultTariff == null ? null : BigDecimal.valueOf(defaultTariff)) : BigDecimal.valueOf(value.tariffRate()), value.tariffRate() == null)); } @@ -175,10 +184,10 @@ public class PremiseCreationService { userNodeRepository.getById(temporaryPremise.getUserSupplierId()).orElseThrow(() -> new NotFoundException(NotFoundException.NotFoundType.USER_NODE, "id", String.valueOf(temporaryPremise.getUserSupplierId()))) : nodeRepository.getById(temporaryPremise.getSupplierId()).orElseThrow(() -> new NotFoundException(NotFoundException.NotFoundType.NODE, "id", String.valueOf(temporaryPremise.getSupplierId()))); - if(temporaryPremise.isUserSupplier()) { + if (temporaryPremise.isUserSupplier()) { var id = userNodeRepository.getOwnerById(temporaryPremise.getUserSupplierId()); - if(id.isPresent() && !id.get().equals(userId)) { + if (id.isPresent() && !id.get().equals(userId)) { throw new ForbiddenException("Unable to access this node id " + temporaryPremise.getUserSupplierId()); } } diff --git a/src/main/java/de/avatic/lcc/service/precalculation/PreCalculationCheckService.java b/src/main/java/de/avatic/lcc/service/precalculation/PreCalculationCheckService.java index 517e055..f0d3a9f 100644 --- a/src/main/java/de/avatic/lcc/service/precalculation/PreCalculationCheckService.java +++ b/src/main/java/de/avatic/lcc/service/precalculation/PreCalculationCheckService.java @@ -324,14 +324,14 @@ public class PreCalculationCheckService { private void materialCheck(Premise premise) { - if (premise.getTariffUnlocked()) { - if (premise.getHsCode() == null || premise.getHsCode().length() < 10) - throw new PremiseValidationError("Invalid HS code (10 digits expected)."); - - var isDeclarable = eUTaxationResolverService.validate(premise.getHsCode()); - - if (!isDeclarable) throw new PremiseValidationError("Invalid HS code (not declarable)."); - } +// if (premise.getTariffUnlocked()) { +// if (premise.getHsCode() == null || premise.getHsCode().length() < 10) +// throw new PremiseValidationError("Invalid HS code (10 digits expected)."); +// +// var isDeclarable = eUTaxationResolverService.validate(premise.getHsCode()); +// +// if (!isDeclarable) throw new PremiseValidationError("Invalid HS code (not declarable)."); +// } if (premise.getTariffRate() == null) { throw new PremiseValidationError("Tariff rate not entered.");