diff --git a/pom.xml b/pom.xml index d2da4fc..6d96570 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,12 @@ org.springframework.boot spring-boot-starter-validation + + org.jetbrains + annotations + 26.0.2 + provided + com.mysql diff --git a/src/main/java/de/avatic/lcc/controller/calculation/PremiseController.java b/src/main/java/de/avatic/lcc/controller/calculation/PremiseController.java index 54cca2f..53da4ad 100644 --- a/src/main/java/de/avatic/lcc/controller/calculation/PremiseController.java +++ b/src/main/java/de/avatic/lcc/controller/calculation/PremiseController.java @@ -4,6 +4,7 @@ package de.avatic.lcc.controller.calculation; import de.avatic.lcc.dto.calculation.CalculationStatus; import de.avatic.lcc.dto.calculation.DestinationDTO; import de.avatic.lcc.dto.calculation.PremiseDTO; +import de.avatic.lcc.dto.calculation.create.CreatePremiseDTO; import de.avatic.lcc.dto.calculation.create.PremiseSearchResultDTO; import de.avatic.lcc.dto.calculation.edit.PremiseDetailDTO; import de.avatic.lcc.dto.calculation.edit.SetDataDTO; @@ -12,7 +13,6 @@ import de.avatic.lcc.dto.calculation.edit.destination.DestinationUpdateDTO; import de.avatic.lcc.dto.calculation.edit.masterData.MaterialUpdateDTO; import de.avatic.lcc.dto.calculation.edit.masterData.PackagingUpdateDTO; import de.avatic.lcc.dto.calculation.edit.masterData.PriceUpdateDTO; -import de.avatic.lcc.dto.generic.LocationDTO; import de.avatic.lcc.service.access.DestinationService; import de.avatic.lcc.service.access.PremisesService; import de.avatic.lcc.service.calculation.ChangeMaterialService; @@ -20,6 +20,7 @@ import de.avatic.lcc.service.calculation.ChangeSupplierService; import de.avatic.lcc.service.calculation.PremiseCreationService; import de.avatic.lcc.service.calculation.PremiseSearchStringAnalyzerService; import de.avatic.lcc.util.exception.badrequest.InvalidArgumentException; +import jakarta.validation.Valid; import jakarta.validation.constraints.Min; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; @@ -75,46 +76,23 @@ public class PremiseController { } @PostMapping({"/create", "/create/"}) - public ResponseEntity> createPremises(@RequestParam("material") List materialIds, - @RequestParam(value = "supplier", required = false) List supplierIds, - @RequestParam(name = "user_supplier", required = false) List userSupplierIds, - @RequestParam(name = "from_scratch", defaultValue = "true") boolean createEmpty) { + public ResponseEntity> createPremises(@RequestBody @Valid CreatePremiseDTO dto) { - List suppliers; - List userSuppliers; - List materials; - - try { - suppliers = supplierIds == null ? Collections.emptyList() : supplierIds.stream().map(Integer::parseInt).toList(); - userSuppliers = userSupplierIds == null ? Collections.emptyList() : userSupplierIds.stream().map(Integer::parseInt).toList(); - materials = materialIds.stream().map(Integer::parseInt).toList(); - - if(suppliers.stream().anyMatch(s -> s < 1)) - throw new InvalidArgumentException("Supplier ID must be greater than or equal to 1"); - - if(userSuppliers.stream().anyMatch(s -> s < 1)) - throw new InvalidArgumentException("User supplier ID must be greater than or equal to 1"); - - if(materials.stream().anyMatch(s -> s < 1)) - throw new InvalidArgumentException("Material ID must be greater than or equal to 1"); - - } catch (NumberFormatException e) { - throw new InvalidArgumentException("Invalid material or supplier ID provided. Suppliers: " - + supplierIds + ", userSuppliers: " + userSupplierIds + ", materials: " + materialIds + "."); - } - - if (suppliers.isEmpty() && userSuppliers.isEmpty()) { + if ((dto.getSupplierIds() == null || dto.getSupplierIds().isEmpty()) && (dto.getUserSupplierIds() == null || dto.getUserSupplierIds().isEmpty())) { throw new InvalidArgumentException("Either suppliers or userSuppliers must be provided. Suppliers: " - + supplierIds + ", userSuppliers: " + userSupplierIds + "."); + + dto.getSupplierIds() + ", userSuppliers: " + dto.getUserSupplierIds() + "."); } - return ResponseEntity.ok(premiseCreationService.createPremises(materials, suppliers, userSuppliers, createEmpty)); + return ResponseEntity.ok(premiseCreationService.createPremises( + dto.getMaterialIds(), + dto.getSupplierIds() == null ? Collections.emptyList() : dto.getSupplierIds(), + dto.getUserSupplierIds() == null ? Collections.emptyList() : dto.getUserSupplierIds(), + dto.createEmpty())); } - @GetMapping({"/edit", "/edit/"}) - public ResponseEntity> getPremises(@RequestParam("premiss_ids") List premissIds) { + public ResponseEntity> getPremises(@RequestBody List premissIds) { return ResponseEntity.ok(premisesServices.getPremises(premissIds)); } @@ -135,19 +113,22 @@ public class PremiseController { } - @PutMapping({"/status/{processing_id}", "/status/{processing_id}/"}) - public ResponseEntity> updatePackaging(@RequestBody PackagingUpdateDTO packagingDTO) { - return ResponseEntity.ok(premisesServices.updatePackaging(packagingDTO)); + @PostMapping({"/packaging", "/packaging/"}) + public ResponseEntity updatePackaging(@RequestBody PackagingUpdateDTO packagingDTO) { + premisesServices.updatePackaging(packagingDTO); + return ResponseEntity.ok().build(); } @PostMapping({"/material", "/material/"}) - public ResponseEntity> updateMaterial(@RequestBody MaterialUpdateDTO materialUpdateDTO) { - return ResponseEntity.ok(premisesServices.updateMaterial(materialUpdateDTO)); + public ResponseEntity updateMaterial(@RequestBody @Valid MaterialUpdateDTO materialUpdateDTO) { + premisesServices.updateMaterial(materialUpdateDTO); + return ResponseEntity.ok().build(); } - @PutMapping({"/price", "/price/"}) - public ResponseEntity> updatePrice(@RequestBody PriceUpdateDTO priceUpdateDTO) { - return ResponseEntity.ok(premisesServices.updatePrice(priceUpdateDTO)); + @PostMapping({"/price", "/price/"}) + public ResponseEntity updatePrice(@RequestBody @Valid PriceUpdateDTO priceUpdateDTO) { + premisesServices.updatePrice(priceUpdateDTO); + return ResponseEntity.ok().build(); } @PostMapping({"/destination", "/destination/"}) diff --git a/src/main/java/de/avatic/lcc/dto/calculation/create/CreatePremiseDTO.java b/src/main/java/de/avatic/lcc/dto/calculation/create/CreatePremiseDTO.java new file mode 100644 index 0000000..c4293cc --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/calculation/create/CreatePremiseDTO.java @@ -0,0 +1,60 @@ +package de.avatic.lcc.dto.calculation.create; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Min; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +public class CreatePremiseDTO { + + @Valid + @JsonProperty("material") + private List<@Min(1) Integer> materialIds; + + @Valid + @JsonProperty("supplier") + private List<@Min(1) Integer> supplierIds; + + @JsonProperty("user_supplier") + private List<@Min(1) Integer> userSupplierIds; + + @JsonProperty("from_scratch") + private boolean createEmpty; + + public List getMaterialIds() { + return materialIds; + } + + public void setMaterialIds(List materialIds) { + this.materialIds = materialIds; + } + + public List getSupplierIds() { + return supplierIds; + } + + public void setSupplierIds(List supplierIds) { + this.supplierIds = supplierIds; + } + + public List getUserSupplierIds() { + return userSupplierIds; + } + + public void setUserSupplierIds(List userSupplierIds) { + this.userSupplierIds = userSupplierIds; + } + + @JsonIgnore + public boolean createEmpty() { + return this.createEmpty; + } + + @JsonIgnore + public void setCreateEmpty(boolean createEmpty) { + this.createEmpty = createEmpty; + } +} diff --git a/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/MaterialUpdateDTO.java b/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/MaterialUpdateDTO.java index 6c22d7f..ff92afb 100644 --- a/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/MaterialUpdateDTO.java +++ b/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/MaterialUpdateDTO.java @@ -1,6 +1,7 @@ package de.avatic.lcc.dto.calculation.edit.masterData; import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.*; import java.util.List; @@ -11,9 +12,13 @@ public class MaterialUpdateDTO { private List premiseIds; @JsonProperty("hs_code") + @Size(min = 8, max = 11, message = "HS code must be between 8 and 11 characters") + @Pattern(regexp = "^\\d+$", message = "HS code must contain only digits") private String hsCode; @JsonProperty("tariff_rate") + @DecimalMin(value = "0.00", message = "Tariff_rate must be greater than or equal 0") + @Digits(integer = 4, fraction = 4, message = "Tariff rate must have at most 4 decimal places") private Number tariffRate; public String getHsCode() { diff --git a/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/PackagingUpdateDTO.java b/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/PackagingUpdateDTO.java index f538b1d..1609bf2 100644 --- a/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/PackagingUpdateDTO.java +++ b/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/PackagingUpdateDTO.java @@ -2,6 +2,7 @@ package de.avatic.lcc.dto.calculation.edit.masterData; import com.fasterxml.jackson.annotation.JsonProperty; import de.avatic.lcc.dto.generic.DimensionDTO; +import jakarta.validation.constraints.Min; import java.util.List; @@ -16,7 +17,7 @@ public class PackagingUpdateDTO { @JsonProperty("is_stackable") private Boolean isStackable; - private List premiseIds; + private List<@Min(1) Integer> premiseIds; public DimensionDTO getDimensions() { diff --git a/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/PriceUpdateDTO.java b/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/PriceUpdateDTO.java index 66b27ba..6f5356f 100644 --- a/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/PriceUpdateDTO.java +++ b/src/main/java/de/avatic/lcc/dto/calculation/edit/masterData/PriceUpdateDTO.java @@ -1,6 +1,10 @@ package de.avatic.lcc.dto.calculation.edit.masterData; import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.Valid; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.Min; import java.util.List; @@ -8,16 +12,21 @@ import java.util.List; public class PriceUpdateDTO { @JsonProperty("premise_ids") - private List premiseIds; + private List<@Min(1) Integer> premiseIds; + @DecimalMin(value = "0.01", message = "Amount must be greater than 0") + @Digits(integer = 13, fraction = 2, message = "Amount must have at most 2 decimal places") private Number price; @JsonProperty("oversea_share") + @DecimalMin(value = "0.00", message = "Amount must be greater than or equal 0") + @Digits(integer = 4, fraction = 4, message = "Amount must have at most 4 decimal places") private Number overseaShare; @JsonProperty("fca_fee_included") private Boolean includeFcaFee; + public Number getPrice() { return price; } diff --git a/src/main/java/de/avatic/lcc/model/nodes/Node.java b/src/main/java/de/avatic/lcc/model/nodes/Node.java index f0610c2..168a5c0 100644 --- a/src/main/java/de/avatic/lcc/model/nodes/Node.java +++ b/src/main/java/de/avatic/lcc/model/nodes/Node.java @@ -1,5 +1,6 @@ package de.avatic.lcc.model.nodes; +import org.jetbrains.annotations.Debug.Renderer; import jakarta.validation.constraints.*; import org.springframework.validation.annotation.Validated; @@ -9,7 +10,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; - +@Renderer(text = "\"Node: \" + externalMappingId") @Validated public class Node { diff --git a/src/main/java/de/avatic/lcc/model/premises/route/Destination.java b/src/main/java/de/avatic/lcc/model/premises/route/Destination.java index 9aef0d6..5d323a0 100644 --- a/src/main/java/de/avatic/lcc/model/premises/route/Destination.java +++ b/src/main/java/de/avatic/lcc/model/premises/route/Destination.java @@ -17,7 +17,7 @@ public class Destination { private Boolean isD2d; - private int leadTimeD2d; + private Integer leadTimeD2d; private BigDecimal repackingCost; @@ -31,11 +31,11 @@ public class Destination { private Integer countryId; - public int getLeadTimeD2d() { + public Integer getLeadTimeD2d() { return leadTimeD2d; } - public void setLeadTimeD2d(int leadTimeD2d) { + public void setLeadTimeD2d(Integer leadTimeD2d) { this.leadTimeD2d = leadTimeD2d; } diff --git a/src/main/java/de/avatic/lcc/model/utils/DimensionUnit.java b/src/main/java/de/avatic/lcc/model/utils/DimensionUnit.java index 87141b2..364e17a 100644 --- a/src/main/java/de/avatic/lcc/model/utils/DimensionUnit.java +++ b/src/main/java/de/avatic/lcc/model/utils/DimensionUnit.java @@ -2,6 +2,7 @@ package de.avatic.lcc.model.utils; import com.fasterxml.jackson.annotation.JsonValue; +import de.avatic.lcc.util.exception.badrequest.InvalidArgumentException; /** * An enumeration representing the units of dimension measurement. @@ -32,8 +33,8 @@ public enum DimensionUnit { return displayedName; } - public Number convertToMM(Number value) { - return DimensionUnit.MM.convertFrom(value, this).intValue(); + public Integer convertToMM(Number value) { + return Math.toIntExact(Math.round(DimensionUnit.MM.convertFrom(value, this))); } /** @@ -44,9 +45,9 @@ public enum DimensionUnit { * @return the converted value * @throws IllegalArgumentException if value or fromUnit is null */ - public Number convertFrom(Number value, DimensionUnit fromUnit) { + public Double convertFrom(Number value, DimensionUnit fromUnit) { if (value == null || fromUnit == null) { - throw new IllegalArgumentException("Value and fromUnit must not be null"); + throw new InvalidArgumentException("Value and fromUnit must not be null"); } // Convert to base unit (millimeters) @@ -63,7 +64,7 @@ public enum DimensionUnit { * @return the converted value in the target unit * @throws IllegalArgumentException if the provided value is null */ - public Number convertFromMM(Number value) { + public Double convertFromMM(Number value) { return convertFrom(value, MM); } } diff --git a/src/main/java/de/avatic/lcc/model/utils/WeightUnit.java b/src/main/java/de/avatic/lcc/model/utils/WeightUnit.java index 98cd568..86765f1 100644 --- a/src/main/java/de/avatic/lcc/model/utils/WeightUnit.java +++ b/src/main/java/de/avatic/lcc/model/utils/WeightUnit.java @@ -38,7 +38,7 @@ public enum WeightUnit { * @return the converted value * @throws IllegalArgumentException if value or fromUnit is null */ - public Number convertFrom(Number value, WeightUnit fromUnit) { + public Double convertFrom(Number value, WeightUnit fromUnit) { if (value == null || fromUnit == null) { throw new IllegalArgumentException("Value and fromUnit must not be null"); } @@ -50,11 +50,11 @@ public enum WeightUnit { return valueInBaseUnit / this.baseFactor; } - public Number convertFromG(Number value) { + public Double convertFromG(Number value) { return convertFrom(value, G); } - public Number convertToG(Double weight) { - return WeightUnit.G.convertFrom(weight, this); + public Integer convertToG(Double weight) { + return Math.toIntExact(Math.round(WeightUnit.G.convertFrom(weight, this))); } } \ No newline at end of file diff --git a/src/main/java/de/avatic/lcc/repositories/NodeRepository.java b/src/main/java/de/avatic/lcc/repositories/NodeRepository.java index 2701728..609e751 100644 --- a/src/main/java/de/avatic/lcc/repositories/NodeRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/NodeRepository.java @@ -289,7 +289,7 @@ public class NodeRepository { chains.forEach(chain -> { - var currentChain = new ArrayList(); + var currentChain = new ArrayList(Collections.nCopies(chain.size(), null)); resolvedChains.add(currentChain); /* @@ -302,7 +302,7 @@ public class NodeRepository { if (predecessor.isEmpty()) { throw new RuntimeException("Predecessor not found for chain " + chain + " and sequence number " + sequenceNumber); } - currentChain.add(sequenceNumber, predecessor.get()); + currentChain.set(sequenceNumber - 1, predecessor.get()); }); }); @@ -329,7 +329,7 @@ public class NodeRepository { ) <= ? """; - return jdbcTemplate.query(query, new NodeMapper(), node.getGeoLat(), node.getGeoLng(), node.getGeoLat()); + return jdbcTemplate.query(query, new NodeMapper(), node.getGeoLat(), node.getGeoLng(), node.getGeoLat(),regionRadius); } @@ -345,14 +345,13 @@ public class NodeRepository { */ public List getAllOutboundFor(Integer countryId) { String query = """ - SELECT node.id AS id, node.name AS name, node.address as address, node.is_source as is_source, - node.is_destination as is_destination, node.is_intermediate as is_intermediate, node.country_id as country_id, node.predecessor_required as predecessor_required + SELECT node.* FROM node LEFT JOIN outbound_country_mapping ON outbound_country_mapping.node_id = node.id WHERE node.is_deprecated = FALSE AND (outbound_country_mapping.country_id = ? OR (node.is_intermediate = TRUE AND node.country_id = ?)) """; - return jdbcTemplate.query(query, new NodeMapper(), countryId); + return jdbcTemplate.query(query, new NodeMapper(), countryId, countryId); } public List findNodeListsForReportingByPeriodId(Integer materialId, Integer periodId) { @@ -386,7 +385,6 @@ public class NodeRepository { } - private class NodeMapper implements RowMapper { @Override @@ -407,6 +405,8 @@ public class NodeRepository { data.setDeprecated(rs.getBoolean("is_deprecated")); + data.setExternalMappingId(rs.getString("external_mapping_id")); + data.setNodePredecessors(getPredecessorsOf(data.getId())); data.setOutboundCountries(getOutboundCountriesOf(data.getId())); diff --git a/src/main/java/de/avatic/lcc/repositories/premise/DestinationRepository.java b/src/main/java/de/avatic/lcc/repositories/premise/DestinationRepository.java index 477a181..e58f2e0 100644 --- a/src/main/java/de/avatic/lcc/repositories/premise/DestinationRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/premise/DestinationRepository.java @@ -95,13 +95,24 @@ public class DestinationRepository { jdbcTemplate.update(connection -> { var ps = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); - ps.setInt(1, destination.getAnnualAmount()); + + if(destination.getAnnualAmount() == null) + ps.setNull(1, java.sql.Types.INTEGER); + else + ps.setInt(1, destination.getAnnualAmount()); + ps.setInt(2, destination.getPremiseId()); ps.setInt(3, destination.getDestinationNodeId()); ps.setInt(4, destination.getCountryId()); ps.setBigDecimal(5, destination.getRateD2d()); - ps.setInt(6, destination.getLeadTimeD2d()); + + if(destination.getLeadTimeD2d() == null) + ps.setNull(6, java.sql.Types.INTEGER); + else + ps.setInt(6, destination.getLeadTimeD2d()); + ps.setBoolean(7, destination.getD2d()); + ps.setBigDecimal(8, destination.getRepackingCost()); ps.setBigDecimal(9, destination.getHandlingCost()); ps.setBigDecimal(10, destination.getDisposalCost()); diff --git a/src/main/java/de/avatic/lcc/repositories/premise/PremiseRepository.java b/src/main/java/de/avatic/lcc/repositories/premise/PremiseRepository.java index 578212d..d103848 100644 --- a/src/main/java/de/avatic/lcc/repositories/premise/PremiseRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/premise/PremiseRepository.java @@ -203,95 +203,191 @@ public class PremiseRepository { @Transactional public void updatePackaging(List premiseIds, Integer userId, PackagingDimension hu, Boolean stackable, Boolean mixable) { - if (premiseIds == null || premiseIds.isEmpty() || userId == null || hu == null) { + + if (premiseIds == null || premiseIds.isEmpty() || userId == null) { return; } - boolean isStackable = stackable != null ? stackable : false; - boolean isMixable = mixable != null ? mixable : false; - MapSqlParameterSource params = new MapSqlParameterSource(); - params.addValue("length", hu.getLength()); - params.addValue("height", hu.getHeight()); - params.addValue("width", hu.getWidth()); - params.addValue("weight", hu.getWeight()); - params.addValue("dimensionUnit", hu.getDimensionUnit().name()); - params.addValue("weightUnit", hu.getWeightUnit().name()); - params.addValue("unitCount", hu.getContentUnitCount()); - params.addValue("stackable", isStackable); - params.addValue("mixable", isMixable); params.addValue("userId", userId); params.addValue("premiseIds", premiseIds); - String sql = """ - UPDATE premise - SET individual_hu_length = :length, - individual_hu_height = :height, - individual_hu_width = :width, - individual_hu_weight = :weight, - hu_displayed_dimension_unit = :dimensionUnit, - hu_displayed_weight_unit = :weightUnit, - hu_unit_count = :unitCount, - hu_stackable = :stackable, - hu_mixable = :mixable - WHERE user_id = :userId AND id IN (:premiseIds) - """; + StringBuilder sqlBuilder = new StringBuilder("UPDATE premise SET "); + List setClauses = new ArrayList<>(); - namedParameterJdbcTemplate.update(sql, params); + // Handle PackagingDimension hu fields + if (hu != null) { + if (hu.getLength() != null) { + setClauses.add("individual_hu_length = :length"); + params.addValue("length", hu.getLength()); + } + + if (hu.getHeight() != null) { + setClauses.add("individual_hu_height = :height"); + params.addValue("height", hu.getHeight()); + } + + if (hu.getWidth() != null) { + setClauses.add("individual_hu_width = :width"); + params.addValue("width", hu.getWidth()); + } + + if (hu.getWeight() != null) { + setClauses.add("individual_hu_weight = :weight"); + params.addValue("weight", hu.getWeight()); + } + + if (hu.getDimensionUnit() != null) { + setClauses.add("hu_displayed_dimension_unit = :dimensionUnit"); + params.addValue("dimensionUnit", hu.getDimensionUnit().name()); + } + + if (hu.getWeightUnit() != null) { + setClauses.add("hu_displayed_weight_unit = :weightUnit"); + params.addValue("weightUnit", hu.getWeightUnit().name()); + } + + if (hu.getContentUnitCount() != null) { + setClauses.add("hu_unit_count = :unitCount"); + params.addValue("unitCount", hu.getContentUnitCount()); + } + } + + // Handle stackable + if (stackable != null) { + setClauses.add("hu_stackable = :stackable"); + params.addValue("stackable", stackable); + } + + // Handle mixable + if (mixable != null) { + setClauses.add("hu_mixable = :mixable"); + params.addValue("mixable", mixable); + } + + // If no fields to update, return early + if (setClauses.isEmpty()) { + return; + } + + // Build the complete SQL + sqlBuilder.append(String.join(", ", setClauses)); + sqlBuilder.append(" WHERE user_id = :userId AND id IN (:premiseIds)"); + + String sql = sqlBuilder.toString(); + var affectedRows = namedParameterJdbcTemplate.update(sql, params); + + if(affectedRows != premiseIds.size()) + throw new DatabaseException("Premise update failed for " + premiseIds.size() + " premises. Affected rows: " + affectedRows); } @Transactional public void updateMaterial(List premiseIds, Integer userId, String hsCode, BigDecimal tariffRate) { + // Build the SET clause dynamically based on non-null parameters + List setClauses = new ArrayList<>(); + List parameters = new ArrayList<>(); + + if (hsCode != null) { + setClauses.add("hs_code = ?"); + parameters.add(hsCode); + } + + if (tariffRate != null) { + setClauses.add("tariff_rate = ?"); + parameters.add(tariffRate); + } + + // If no fields to update, return early + if (setClauses.isEmpty()) { + return; + } + + // Add userId to parameters + parameters.add(userId); + + // Add premiseIds to parameters + parameters.addAll(premiseIds); + String placeholders = String.join(",", Collections.nCopies(premiseIds.size(), "?")); + String setClause = String.join(", ", setClauses); - String query = """ - UPDATE premise - SET hs_code = ?, - tariff_rate = ? - WHERE user_id = ? AND id IN (""" + placeholders + ")"; + String query = "UPDATE premise SET " + setClause + + " WHERE user_id = ? AND id IN (" + placeholders + ")"; - jdbcTemplate.update( + var affectedRows = jdbcTemplate.update( query, ps -> { - - ps.setString(1, hsCode); - ps.setBigDecimal(2, tariffRate); - ps.setInt(3, userId); - - for (int parameterIndex = 0; parameterIndex < premiseIds.size(); parameterIndex++) { - ps.setInt(parameterIndex + 4, premiseIds.get(parameterIndex)); + for (int i = 0; i < parameters.size(); i++) { + Object param = parameters.get(i); + if (param instanceof String) { + ps.setString(i + 1, (String) param); + } else if (param instanceof BigDecimal) { + ps.setBigDecimal(i + 1, (BigDecimal) param); + } else if (param instanceof Integer) { + ps.setInt(i + 1, (Integer) param); + } } } ); + + if(affectedRows != premiseIds.size()) + throw new DatabaseException("Premise update failed for " + premiseIds.size() + " premises. Affected rows: " + affectedRows); } @Transactional public void updatePrice(List premiseIds, int userId, BigDecimal price, Boolean includeFcaFee, BigDecimal overseaShare) { + // Build dynamic SET clause based on non-null parameters + List setClauses = new ArrayList<>(); + if (price != null) { + setClauses.add("material_cost = ?"); + } + if (includeFcaFee != null) { + setClauses.add("is_fca_enabled = ?"); + } + if (overseaShare != null) { + setClauses.add("oversea_share = ?"); + } + + // If no parameters to update, return early + if (setClauses.isEmpty()) { + return; + } + String placeholders = String.join(",", Collections.nCopies(premiseIds.size(), "?")); + String setClause = String.join(", ", setClauses); - String query = """ - UPDATE premise - SET material_cost = ?, - is_fca_enabled = ?, - oversea_share = ? - WHERE user_id = ? AND id IN (""" + placeholders + ")"; + String query = "UPDATE premise SET " + setClause + " WHERE user_id = ? AND id IN (" + placeholders + ")"; - jdbcTemplate.update( + var affectedRows = jdbcTemplate.update( query, ps -> { + int parameterIndex = 1; - ps.setBigDecimal(1, price); - ps.setBoolean(2, includeFcaFee); - ps.setBigDecimal(3, overseaShare); - ps.setInt(4, userId); + // Set the dynamic parameters in the same order as SET clauses + if (price != null) { + ps.setBigDecimal(parameterIndex++, price); + } + if (includeFcaFee != null) { + ps.setBoolean(parameterIndex++, includeFcaFee); + } + if (overseaShare != null) { + ps.setBigDecimal(parameterIndex++, overseaShare); + } - for (int parameterIndex = 0; parameterIndex < premiseIds.size(); parameterIndex++) { - ps.setInt(parameterIndex + 5, premiseIds.get(parameterIndex)); + // Set user_id parameter + ps.setInt(parameterIndex++, userId); + + // Set premise ID parameters + for (Integer premiseId : premiseIds) { + ps.setInt(parameterIndex++, premiseId); } } ); + + if(affectedRows != premiseIds.size()) + throw new DatabaseException("Premise update failed for " + premiseIds.size() + " premises. Affected rows: " + affectedRows); } @Transactional diff --git a/src/main/java/de/avatic/lcc/repositories/rates/ContainerRateRepository.java b/src/main/java/de/avatic/lcc/repositories/rates/ContainerRateRepository.java index 9b24a11..d05969e 100644 --- a/src/main/java/de/avatic/lcc/repositories/rates/ContainerRateRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/rates/ContainerRateRepository.java @@ -79,7 +79,7 @@ public class ContainerRateRepository { LEFT JOIN validity_period ON validity_period.id = container_rate.validity_period_id WHERE validity_period.state = ? AND (container_rate.container_rate_type = ? OR container_rate.container_rate_type = ?) - AND container_rate.from_node_id = = ? AND to_node.country_id IN (%s)""".formatted( + AND container_rate.from_node_id = ? AND to_node.country_id IN (%s)""".formatted( destinationCountryPlaceholders); List params = new ArrayList<>(); @@ -122,7 +122,7 @@ public class ContainerRateRepository { SELECT * FROM container_rate WHERE from_node_id = ? AND to_node_id = ? AND container_rate_type = ? """; - var route = jdbcTemplate.query(query, new ContainerRateMapper(), fromNodeId, toNodeId, type); + var route = jdbcTemplate.query(query, new ContainerRateMapper(), fromNodeId, toNodeId, type.name()); if(route.isEmpty()) return Optional.empty(); diff --git a/src/main/java/de/avatic/lcc/service/access/DestinationService.java b/src/main/java/de/avatic/lcc/service/access/DestinationService.java index 2fd6505..9813c6e 100644 --- a/src/main/java/de/avatic/lcc/service/access/DestinationService.java +++ b/src/main/java/de/avatic/lcc/service/access/DestinationService.java @@ -71,14 +71,15 @@ public class DestinationService { destination.setPremiseId(premise.getId()); destination.setAnnualAmount(0); destination.setD2d(false); - destination.setLeadTimeD2d(0); - destination.setRateD2d(BigDecimal.ZERO); + destination.setLeadTimeD2d(null); + destination.setRateD2d(null); destination.setDisposalCost(null); destination.setHandlingCost(null); destination.setRepackingCost(null); - destination.setId(destinationRepository.insert(destination)); + destination.setCountryId(destinationNode.getCountryId()); destination.setGeoLat(destinationNode.getGeoLat()); destination.setGeoLng(destinationNode.getGeoLng()); + destination.setId(destinationRepository.insert(destination)); Node source = premise.getSupplierNodeId() == null ? userNodeRepository.getById(premise.getUserSupplierNodeId()).orElseThrow() : nodeRepository.getById(premise.getSupplierNodeId()).orElseThrow(); findRouteAndSave(destination.getId(), destinationNode, source, premise.getSupplierNodeId() == null); diff --git a/src/main/java/de/avatic/lcc/service/access/PremisesService.java b/src/main/java/de/avatic/lcc/service/access/PremisesService.java index 40eaa70..f068574 100644 --- a/src/main/java/de/avatic/lcc/service/access/PremisesService.java +++ b/src/main/java/de/avatic/lcc/service/access/PremisesService.java @@ -108,7 +108,9 @@ public class PremisesService { //TODO check values. and return errors if needed var userId = 1; // todo get id from current user. - premiseRepository.updatePackaging(packagingDTO.getPremiseIds(), userId, dimensionTransformer.toDimensionEntity(packagingDTO.getDimensions()), packagingDTO.getStackable(), packagingDTO.getMixable()); + var dimensions = packagingDTO.getDimensions() == null ? null : dimensionTransformer.toDimensionEntity(packagingDTO.getDimensions()); + + premiseRepository.updatePackaging(packagingDTO.getPremiseIds(), userId, dimensions, packagingDTO.getStackable(), packagingDTO.getMixable()); return null; @@ -118,8 +120,8 @@ public class PremisesService { //TODO check values. and return errors if needed var userId = 1; // todo get id from current user. - premiseRepository.updateMaterial(materialUpdateDTO.getPremiseIds(), userId, materialUpdateDTO.getHsCode(), BigDecimal.valueOf(materialUpdateDTO.getTariffRate().doubleValue())); - + var tariffRate = materialUpdateDTO.getTariffRate() == null ? null : BigDecimal.valueOf(materialUpdateDTO.getTariffRate().doubleValue()); + premiseRepository.updateMaterial(materialUpdateDTO.getPremiseIds(), userId, materialUpdateDTO.getHsCode(), tariffRate); return null; } @@ -128,7 +130,10 @@ public class PremisesService { //TODO check values. and return errors if needed var userId = 1; // todo get id from current user. - premiseRepository.updatePrice(priceUpdateDTO.getPremiseIds(), userId, BigDecimal.valueOf(priceUpdateDTO.getPrice().doubleValue()), priceUpdateDTO.getIncludeFcaFee(), BigDecimal.valueOf(priceUpdateDTO.getOverseaShare().doubleValue())); + var price = priceUpdateDTO.getPrice() == null ? null : BigDecimal.valueOf(priceUpdateDTO.getPrice().doubleValue()); + var overseaShare = priceUpdateDTO.getOverseaShare() == null ? null : BigDecimal.valueOf(priceUpdateDTO.getOverseaShare().doubleValue()); + + premiseRepository.updatePrice(priceUpdateDTO.getPremiseIds(), userId, price, priceUpdateDTO.getIncludeFcaFee(),overseaShare); return null; diff --git a/src/main/java/de/avatic/lcc/service/calculation/ChainResolver.java b/src/main/java/de/avatic/lcc/service/calculation/ChainResolver.java index dddafaf..8813528 100644 --- a/src/main/java/de/avatic/lcc/service/calculation/ChainResolver.java +++ b/src/main/java/de/avatic/lcc/service/calculation/ChainResolver.java @@ -2,6 +2,7 @@ package de.avatic.lcc.service.calculation; import de.avatic.lcc.model.nodes.Node; import de.avatic.lcc.repositories.NodeRepository; +import org.jetbrains.annotations.Debug.Renderer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -91,6 +92,7 @@ public class ChainResolver { * chain processing including the current position and validity status. *

*/ + @Renderer(text = "getFullChainView()") private static class ChainValidationObject { /** Current position in the chain being processed */ @@ -155,6 +157,14 @@ public class ChainResolver { var nextCandidates = new ArrayList>(); boolean shortChainFound = false; + /* + * if we are at the end of the chain and all foreign chains are empty, there is no need to check any further + * the chain object itself is a solution -> return empty. + */ + + if(chainPointer == chain.size() - 1 && foreignChains.stream().allMatch(List::isEmpty)) + return Collections.emptyList(); + int foreignIdx = 0; for (int localIdx = chainPointer + 1; localIdx < chain.size(); localIdx++, foreignIdx++) { var localNode = chain.get(localIdx); @@ -175,12 +185,22 @@ public class ChainResolver { candidates.clear(); candidates.addAll(nextCandidates); - if (candidates.isEmpty()) { - if (!shortChainFound) - this.chainValid = false; + if (candidates.isEmpty()) + break; + } - return Collections.emptyList(); - } + /* + * if there are no candidates left, there is no need to check any further. + * -> set chain to invalid and return empty + * (if any of the chains ended before check was finished (== shortChainFound), the chain object itself is a + * solution -> so keep the chain valid and return empty) + */ + + if (candidates.isEmpty()) { + if (!shortChainFound) + this.chainValid = false; + + return Collections.emptyList(); } return mergeCandidates(candidates, foreignIdx); @@ -216,7 +236,7 @@ public class ChainResolver { * @return true if there are more nodes in the chain, false otherwise */ public boolean hasNext() { - return chainPointer < chain.size() - 1; + return chainPointer < chain.size(); } /** @@ -258,7 +278,24 @@ public class ChainResolver { return (chain.stream().map(Node::getId) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet().stream() - .noneMatch(entry -> entry.getValue() > 1)); + .anyMatch(entry -> entry.getValue() > 1)); + } + + + private String getFullChainView() { + StringBuilder sb = new StringBuilder(); + sb.append(chainValid ? "✓ " : "✗ "); + sb.append("Chain[").append(chainPointer).append("|").append(chain.size()).append("]: "); + + for (int i = 0; i < Math.min(chain.size(), 5); i++) { + if (i > 0) sb.append(" -> "); + if (i == chainPointer) sb.append("["); + sb.append(chain.get(i).getExternalMappingId()); + if (i == chainPointer) sb.append("]"); + } + + if (chain.size() > 5) sb.append(" ..."); + return sb.toString(); } } diff --git a/src/main/java/de/avatic/lcc/service/calculation/RoutingService.java b/src/main/java/de/avatic/lcc/service/calculation/RoutingService.java index 00688f7..d156edb 100644 --- a/src/main/java/de/avatic/lcc/service/calculation/RoutingService.java +++ b/src/main/java/de/avatic/lcc/service/calculation/RoutingService.java @@ -11,6 +11,7 @@ import de.avatic.lcc.repositories.NodeRepository; import de.avatic.lcc.repositories.properties.PropertyRepository; import de.avatic.lcc.repositories.rates.ContainerRateRepository; import de.avatic.lcc.repositories.rates.MatrixRateRepository; +import org.jetbrains.annotations.Debug.Renderer; import org.springframework.stereotype.Service; import java.util.*; @@ -416,6 +417,8 @@ public class RoutingService { * - check if chain is routable * - add post run and main run */ + var mainruns = container.getMainRuns(); + for (var mainRun : container.getMainRuns()) { Node mainRunEndNode = nodeRepository.getById(mainRun.getToNodeId()).orElseThrow(); @@ -423,50 +426,99 @@ public class RoutingService { TemporaryRateObject mainRunObj = new TemporaryRateObject(mainRunStartNode, mainRunEndNode, TemporaryRateObject.TemporaryRateObjectType.MAIN_RUN, mainRun); +// var postRuns = container.getPostRuns().get(mainRun.getId()); +// +// var sortedChains = sortByQuality(destinationChains) + + for (var postRun : container.getPostRuns().get(mainRun.getId())) { Node postRunEndNode = nodeRepository.getById(postRun.getToNodeId()).orElseThrow(); - TemporaryRateObject postRunObj = new TemporaryRateObject(postRunEndNode, mainRunEndNode, TemporaryRateObject.TemporaryRateObjectType.POST_RUN, postRun); + TemporaryRateObject postRunObj = new TemporaryRateObject(mainRunEndNode,postRunEndNode, TemporaryRateObject.TemporaryRateObjectType.POST_RUN, postRun); - for (var chain : destinationChains) { - ChainQuality quality = getChainQuality(chain, postRun, mainRun); + var sortedChains = sortByQuality(destinationChains, postRun, mainRun); + + for(ChainQuality quality : ChainQuality.values()) + { + boolean qualityRoutable = false; /* if connection quality is bad, do not try to route this and continue. */ if (quality == ChainQuality.FALLBACK) continue; - boolean routable = true; - TemporaryRouteObject routeObj = new TemporaryRouteObject(); + if(sortedChains.get(quality) == null) continue; - for (int idx = 1; idx < chain.size() - quality.getSizeOffset(); idx++) { - Node startNode = chain.get(idx); - Node endNode = chain.get(idx - 1); + for(var chain : sortedChains.get(quality)) { + boolean routable = true; + TemporaryRouteObject routeObj = new TemporaryRouteObject(); - var rate = connectNodes(startNode, endNode, container); + for (int idx = 1; idx < chain.size() - quality.getSizeOffset(); idx++) { + Node startNode = chain.get(idx); + Node endNode = chain.get(idx - 1); - if (rate != null) { - routeObj.addSection(rate); - } else { - // chain is not routable -> discard - routable = false; - break; + var rate = connectNodes(startNode, endNode, container); + + if (rate != null) { + routeObj.addSection(rate); + } else { + // chain is not routable -> discard + routable = false; + break; + } + } + + if(routable && quality == ChainQuality.LOW) { + var rate = connectNodes(postRunEndNode, chain.getLast(), container); + + if (rate != null) { + routeObj.addSection(rate); + } else { + routable = false; + } + } + + if (routable) { + qualityRoutable = true; + routeObj.setQuality(quality); + routeObj.addPostRunSection(postRunObj); + routeObj.addMainRunSection(mainRunObj); + container.addRoute(routeObj); } } - if (routable) { - routeObj.addPostRunSection(postRunObj); - routeObj.addMainRunSection(mainRunObj); - container.addRoute(routeObj); - } + /* if higher quality is routable, do not calculate lower qualities. */ + if(qualityRoutable) + break; + } } } } + private Map>> sortByQuality(List> chains, ContainerRate postRun, ContainerRate mainRun) { + + Map>> sortedChains = new HashMap<>(); + + for(var chain : chains) { + ChainQuality chainQuality = getChainQuality(chain, postRun, mainRun); + sortedChains.putIfAbsent(chainQuality, new ArrayList<>()); + sortedChains.get(chainQuality).add(chain); + } + + return sortedChains; + } + private ChainQuality getChainQuality(List chain, ContainerRate postRun, ContainerRate mainRun) { if (chain.getLast().getId().equals(postRun.getToNodeId())) { return ChainQuality.MEDIUM; - } else if (chain.getLast().getId().equals(postRun.getFromNodeId()) && chain.get(chain.size() - 2).getId().equals(postRun.getToNodeId())) { + } else if (chain.size() > 2 + && chain.getLast().getId().equals(mainRun.getFromNodeId()) + && chain.get(chain.size() - 2).getId().equals(postRun.getFromNodeId()) + && chain.get(chain.size() - 3).getId().equals(postRun.getToNodeId())) { + return ChainQuality.SUPERIOR; + } else if (chain.size() > 1 + && chain.getLast().getId().equals(postRun.getFromNodeId()) + && chain.get(chain.size() - 2).getId().equals(postRun.getToNodeId())) { return ChainQuality.HIGH; } else if (chain.getLast().getCountryId().equals(postRun.getToCountryId())) { return ChainQuality.LOW; @@ -505,7 +557,7 @@ public class RoutingService { } private enum ChainQuality { - HIGH(1), MEDIUM(0), LOW(0), FALLBACK(0); + SUPERIOR(2), HIGH(1), MEDIUM(0), LOW(0), FALLBACK(0); private final int sizeOffset; @@ -534,10 +586,14 @@ public class RoutingService { private final Node source; private final Node destination; /* - * mainRuns and postRuns retrieved from database. + * mainRuns (maps start node to rate) retrieved from the database. */ private Map> mainRuns; + /* + * postRuns (maps main_run container rate id to post_run container rate id) retrieved from the database. + */ private Map> postRuns; + private MatrixRate sourceMatrixRate; public TemporaryContainer(Node source, Node destination) { @@ -603,6 +659,7 @@ public class RoutingService { } } + @Renderer(text = "getFullDebugText()") private static class TemporaryRouteObject { private final List sections; @@ -613,6 +670,7 @@ public class RoutingService { private boolean nearBy = false; private boolean isCheapest = false; private boolean isFastest = false; + private ChainQuality quality; public TemporaryRouteObject() { sections = new ArrayList<>(); @@ -688,9 +746,32 @@ public class RoutingService { public Boolean isFastest() { return isFastest; } + + public String getFullDebugText() { + + StringBuilder sb = new StringBuilder(); + + if(!sections.isEmpty()) { + sb.append(sections.getLast().getFromNode().getExternalMappingId()); + for (var section : sections.reversed()) { + sb.append(" -"); + sb.append(section.getType().debugText()); + sb.append("-> "); + sb.append(section.getToNode().getExternalMappingId()); + } + } else sb.append("Empty"); + + + return String.format("Route: [%s][%s]", quality.name(), sb.toString()); + } + + public void setQuality(ChainQuality quality) { + this.quality = quality; + } } + @Renderer(text = "getFullDebugText()") private static class TemporaryRateObject { private final Node fromNode; @@ -791,7 +872,24 @@ public class RoutingService { } private enum TemporaryRateObjectType { - MATRIX, CONTAINER, POST_RUN, MAIN_RUN; + MATRIX("\uD83D\uDDA9"), CONTAINER("\uD83D\uDCE6"), POST_RUN("\uD83D\uDE9B"), MAIN_RUN("\uD83D\uDEA2"); + + private final String debugText; + + TemporaryRateObjectType(String debugText) { + this.debugText = debugText; + } + + public String debugText() { + return debugText; + } + } + + public String getFullDebugText() { + if(type.equals(TemporaryRateObjectType.MATRIX)) { + return String.format("Rate [%s --> %s [%s, %.2f km]", fromNode.getExternalMappingId(), toNode.getExternalMappingId(), type, approxDistance); + } + return String.format("Rate [%s --> %s [%s]", fromNode.getExternalMappingId(), toNode.getExternalMappingId(), type); } } } diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/DimensionTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/DimensionTransformer.java index a9e677e..c492971 100644 --- a/src/main/java/de/avatic/lcc/service/transformer/generic/DimensionTransformer.java +++ b/src/main/java/de/avatic/lcc/service/transformer/generic/DimensionTransformer.java @@ -4,6 +4,7 @@ import de.avatic.lcc.dto.generic.DimensionDTO; import de.avatic.lcc.model.packaging.PackagingDimension; import de.avatic.lcc.model.packaging.PackagingType; import de.avatic.lcc.model.premises.Premise; +import de.avatic.lcc.util.exception.badrequest.InvalidArgumentException; import org.springframework.stereotype.Service; @Service @@ -27,14 +28,24 @@ public class DimensionTransformer { } public PackagingDimension toDimensionEntity(DimensionDTO dto) { + + if(dto.getDimensionUnit() == null) { + throw new InvalidArgumentException("dimension_unit", "null"); + } + + if(dto.getWeightUnit() == null) { + throw new InvalidArgumentException("weight_unit", "null"); + } + var entity = new PackagingDimension(); entity.setId(dto.getId()); entity.setType(dto.getType()); - entity.setLength(dto.getDimensionUnit().convertToMM(dto.getLength()).intValue()); - entity.setWidth(dto.getDimensionUnit().convertToMM(dto.getWidth()).intValue()); - entity.setHeight(dto.getDimensionUnit().convertToMM(dto.getHeight()).intValue()); + + entity.setLength(dto.getDimensionUnit().convertToMM(dto.getLength())); + entity.setWidth(dto.getDimensionUnit().convertToMM(dto.getWidth())); + entity.setHeight( dto.getDimensionUnit().convertToMM(dto.getHeight())); entity.setDimensionUnit(dto.getDimensionUnit()); - entity.setWeight(dto.getWeightUnit().convertToG(dto.getWeight()).intValue()); + entity.setWeight(dto.getWeightUnit().convertToG(dto.getWeight())); entity.setWeightUnit(dto.getWeightUnit()); entity.setContentUnitCount(dto.getContentUnitCount()); entity.setDeprecated(dto.getDeprecated()); diff --git a/src/main/resources/master_data/08-data-containerrate.sql b/src/main/resources/master_data/08-data-containerrate.sql index 6fddd86..df01a15 100644 --- a/src/main/resources/master_data/08-data-containerrate.sql +++ b/src/main/resources/master_data/08-data-containerrate.sql @@ -1,14 +1,5 @@ -SET @validity_period_id = ( - SELECT id - FROM validity_period - WHERE state = 'VALID' - AND start_date <= NOW() - AND (end_date IS NULL OR end_date > NOW()) - LIMIT 1 -); - --- Generated SQL INSERT statements for container rates --- Generated from shipping_data.csv +-- Container Rate INSERT Statements +-- Generiert aus Excel-Datei INSERT INTO container_rate ( from_node_id, @@ -20,12 +11,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Xiamen'), - (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + (SELECT id FROM node WHERE external_mapping_id = 'Aurangabad'), + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), 'ROAD', - 118.00, - 129.00, - 131.00, + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -40,88 +31,8 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Shanghai'), - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - 'ROAD', - 127.00, - 144.00, - 147.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Hangzhou'), - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - 'ROAD', - 372.00, - 535.00, - 562.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Yangzhong'), - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - 'ROAD', - 394.00, - 570.00, - 599.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Taicang'), - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - 'ROAD', - 183.00, - 263.00, - 276.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Jinjiang'), - (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), + (SELECT id FROM node WHERE external_mapping_id = 'Aurangabad'), + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), 'ROAD', 250.00, 400.00, @@ -140,12 +51,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Qingdao'), - (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), - 'ROAD', - 100.00, - 160.00, - 170.00, + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'AB'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -160,12 +71,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Fuqin'), - (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), - 'ROAD', - 250.00, - 400.00, - 425.00, + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'FGG'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -180,12 +91,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Linfen'), - (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), - 'ROAD', - 250.00, - 400.00, - 425.00, + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'KWS'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -200,12 +111,52 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Yantian'), - (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'Urban Wörth'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Bangalore'), + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), 'ROAD', - 264.00, - 423.00, - 449.00, + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -240,93 +191,13 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Pune'), - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - 'ROAD', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'JJ'), - (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - 'ROAD', - 250.00, - 400.00, - 425.00, - 2, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'LX'), - (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - 'ROAD', - 250.00, - 400.00, - 425.00, - 2, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Aurangabad'), - (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), - 'ROAD', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Chennai'), - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - 'ROAD', - 626.00, - 901.00, - 965.00, - 1, + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + 'SEA', + 13795.00, + 22472.00, + 23448.00, + 24, @validity_period_id ); @@ -361,155 +232,15 @@ INSERT INTO container_rate ( validity_period_id ) VALUES ( (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), 'SEA', - 14216.00, - 23146.00, - 24148.00, + 14208.00, + 23133.00, + 24134.00, 25, @validity_period_id ); -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 14697.00, - 23915.00, - 24963.00, - 26, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 13901.00, - 22642.00, - 23629.00, - 24, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 13779.00, - 22447.00, - 23422.00, - 24, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 10355.00, - 16968.00, - 17702.00, - 18, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 1200.00, - 1920.00, - 2040.00, - 15, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 10311.00, - 16897.00, - 17627.00, - 18, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), - 'SEA', - 13795.00, - 22472.00, - 23448.00, - 24, - @validity_period_id - ); - INSERT INTO container_rate ( from_node_id, to_node_id, @@ -521,11 +252,11 @@ INSERT INTO container_rate ( validity_period_id ) VALUES ( (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), 'SEA', - 14208.00, - 23133.00, - 24134.00, + 14216.00, + 23146.00, + 24148.00, 25, @validity_period_id ); @@ -550,6 +281,26 @@ INSERT INTO container_rate ( @validity_period_id ); +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + 'SEA', + 14697.00, + 23915.00, + 24963.00, + 26, + @validity_period_id + ); + INSERT INTO container_rate ( from_node_id, to_node_id, @@ -580,136 +331,16 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), 'SEA', - 13771.00, - 22434.00, - 23408.00, + 13901.00, + 22642.00, + 23629.00, 24, @validity_period_id ); -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), - 'SEA', - 10347.00, - 16955.00, - 17688.00, - 18, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), - 'SEA', - 1200.00, - 1920.00, - 2040.00, - 15, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), - 'SEA', - 10303.00, - 16885.00, - 17614.00, - 18, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 13691.00, - 22306.00, - 23270.00, - 24, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 14104.00, - 22966.00, - 23956.00, - 25, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 14585.00, - 23736.00, - 24772.00, - 26, - @validity_period_id - ); - INSERT INTO container_rate ( from_node_id, to_node_id, @@ -730,146 +361,6 @@ INSERT INTO container_rate ( @validity_period_id ); -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 13667.00, - 22267.00, - 23230.00, - 24, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 9795.00, - 16072.00, - 16765.00, - 17, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 1200.00, - 1920.00, - 2040.00, - 15, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 9751.00, - 16002.00, - 16692.00, - 17, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), - 'SEA', - 12430.00, - 20288.00, - 21182.00, - 22, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), - 'SEA', - 12843.00, - 20949.00, - 21871.00, - 22, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), - 'SEA', - 13324.00, - 21718.00, - 22689.00, - 23, - @validity_period_id - ); - INSERT INTO container_rate ( from_node_id, to_node_id, @@ -901,12 +392,12 @@ INSERT INTO container_rate ( validity_period_id ) VALUES ( (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), 'SEA', - 12406.00, - 20250.00, - 21142.00, - 22, + 13771.00, + 22434.00, + 23408.00, + 24, @validity_period_id ); @@ -920,13 +411,13 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), 'SEA', - 6069.00, - 9710.00, - 10417.00, - 11, + 13779.00, + 22447.00, + 23422.00, + 24, @validity_period_id ); @@ -940,52 +431,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Chennai'), (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), - 'SEA', - 1200.00, - 1920.00, - 2040.00, - 15, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), - 'SEA', - 6025.00, - 9640.00, - 10342.00, - 11, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Zbůch'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, + 'ROAD', + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -1000,172 +451,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Pfaff Rade'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'KOL'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Urban Wörth'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Bat3'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Jeantet'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'AB'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'FGG'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'KWS'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, + (SELECT id FROM node WHERE external_mapping_id = 'Chennai'), + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + 'ROAD', + 626.00, + 901.00, + 965.00, 1, @validity_period_id ); @@ -1210,6 +501,26 @@ INSERT INTO container_rate ( @validity_period_id ); +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'KOL'), + 'POST_RUN', + 250.00, + 400.00, + 425.00, + 1, + @validity_period_id + ); + INSERT INTO container_rate ( from_node_id, to_node_id, @@ -1230,6 +541,26 @@ INSERT INTO container_rate ( @validity_period_id ); +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'Pfaff Rade'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + INSERT INTO container_rate ( from_node_id, to_node_id, @@ -1250,6 +581,46 @@ INSERT INTO container_rate ( @validity_period_id ); +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'Urban Wörth'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + INSERT INTO container_rate ( from_node_id, to_node_id, @@ -1281,11 +652,71 @@ INSERT INTO container_rate ( validity_period_id ) VALUES ( (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'Zbůch'), + 'POST_RUN', + 250.00, + 400.00, + 425.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), + (SELECT id FROM node WHERE external_mapping_id = 'Bat3'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), (SELECT id FROM node WHERE external_mapping_id = 'CTT'), 'POST_RUN', - 250.00, - 400.00, - 425.00, + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -1300,9 +731,429 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), + (SELECT id FROM node WHERE external_mapping_id = 'Jeantet'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Fuqin'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'HKMBP'), (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + 'SEA', + 5000.00, + 5500.00, + 6000.00, + 45, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Hangzhou'), + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), + 'ROAD', + 372.00, + 535.00, + 562.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + 'SEA', + 10303.00, + 16885.00, + 17614.00, + 18, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + 'SEA', + 10311.00, + 16897.00, + 17627.00, + 18, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), + 'SEA', + 9751.00, + 16002.00, + 16692.00, + 17, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + 'SEA', + 6025.00, + 9640.00, + 10342.00, + 11, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + 'SEA', + 10347.00, + 16955.00, + 17688.00, + 18, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + 'SEA', + 10355.00, + 16968.00, + 17702.00, + 18, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), + 'SEA', + 9795.00, + 16072.00, + 16765.00, + 17, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + 'SEA', + 6069.00, + 9710.00, + 10417.00, + 11, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), (SELECT id FROM node WHERE external_mapping_id = 'LZZ'), 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + (SELECT id FROM node WHERE external_mapping_id = 'Urban Rolo'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'JJ'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Jinjiang'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'LX'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Linfen'), + (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Linfen'), + (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Pune'), + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Pune'), + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Pune'), + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + 'ROAD', 250.00, 400.00, 425.00, @@ -1320,12 +1171,112 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Urban Rolo'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, + (SELECT id FROM node WHERE external_mapping_id = 'Qingdao'), + (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), + 'ROAD', + 100.00, + 160.00, + 170.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Shanghai'), + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), + 'ROAD', + 127.00, + 144.00, + 147.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Taicang'), + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), + 'ROAD', + 183.00, + 263.00, + 276.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Xiamen'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + 'ROAD', + 118.00, + 129.00, + 131.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Yangzhong'), + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), + 'ROAD', + 394.00, + 570.00, + 599.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Yantian'), + (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), + 'ROAD', + 264.00, + 423.00, + 449.00, 1, @validity_period_id ); diff --git a/src/main/resources/master_data/excel_to_sql_converter_rate.py b/src/main/resources/master_data/excel_to_sql_converter_rate.py new file mode 100644 index 0000000..2ea1d65 --- /dev/null +++ b/src/main/resources/master_data/excel_to_sql_converter_rate.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +""" +Excel zu SQL Konverter für Container Rates +Konvertiert Excel-Datei mit Container-Raten in SQL INSERT-Statements +""" + +import pandas as pd +import sys +from pathlib import Path + +def load_excel_data(file_path): + """ + Lädt die Excel-Datei und gibt die Daten als DataFrame zurück + """ + try: + df = pd.read_excel(file_path) + print(f"✓ Excel-Datei geladen: {len(df)} Zeilen") + return df + except Exception as e: + print(f"✗ Fehler beim Laden der Excel-Datei: {e}") + sys.exit(1) + +def group_and_process_data(df): + """ + Gruppiert die Daten nach From, To, Type und extrahiert die verschiedenen Raten + """ + # Nach From, To, Type gruppieren + grouped = df.groupby(['From', 'To', 'Type']) + + sql_statements = [] + + for (from_port, to_port, transport_type), group in grouped: + # Initialisiere Werte + rate_teu = 'NULL' + rate_feu = 'NULL' + rate_hc = 'NULL' + lead_time = 'NULL' + + # Lead time aus der ersten Zeile nehmen (sollte in allen Zeilen gleich sein) + if not group.empty: + lead_time = group.iloc[0]['lead_time'] + + # Raten nach container_type extrahieren + for _, row in group.iterrows(): + container_type = row['container_type'] + rate = row['rate'] + + if container_type == "20'": + rate_teu = f"{float(rate):.2f}" + elif container_type == "40'": + rate_feu = f"{float(rate):.2f}" + elif container_type == "40'HC": + rate_hc = f"{float(rate):.2f}" + + # SQL INSERT Statement erstellen + sql_statement = f"""INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = '{from_port}'), + (SELECT id FROM node WHERE external_mapping_id = '{to_port}'), + '{transport_type}', + {rate_teu}, + {rate_feu}, + {rate_hc}, + {lead_time}, + @validity_period_id + );""" + + sql_statements.append(sql_statement) + + return sql_statements + +def write_sql_file(sql_statements, output_file): + """ + Schreibt die SQL-Statements in eine Datei + """ + try: + with open(output_file, 'w', encoding='utf-8') as f: + # Header schreiben + f.write("-- Container Rate INSERT Statements\n") + f.write("-- Generiert aus Excel-Datei\n\n") + + # SQL Statements schreiben + for statement in sql_statements: + f.write(statement) + f.write("\n\n") + + print(f"✓ SQL-Datei erstellt: {output_file}") + print(f"✓ {len(sql_statements)} INSERT-Statements generiert") + + except Exception as e: + print(f"✗ Fehler beim Schreiben der SQL-Datei: {e}") + sys.exit(1) + +def main(): + """ + Hauptfunktion + """ + # Dateipfade + excel_file = "container_rates.xlsx" + sql_file = "08-data-containerrate.sql" + + # Prüfen ob Excel-Datei existiert + if not Path(excel_file).exists(): + print(f"✗ Excel-Datei nicht gefunden: {excel_file}") + print("Bitte stellen Sie sicher, dass die Datei im aktuellen Verzeichnis liegt.") + sys.exit(1) + + print("Container Rates Excel zu SQL Konverter") + print("=" * 40) + + # 1. Excel-Datei laden + df = load_excel_data(excel_file) + + # 2. Datenstruktur anzeigen + print(f"Spalten: {list(df.columns)}") + print(f"Eindeutige From-Werte: {df['From'].nunique()}") + print(f"Eindeutige To-Werte: {df['To'].nunique()}") + print(f"Eindeutige Type-Werte: {df['Type'].unique()}") + print(f"Container Types: {df['container_type'].unique()}") + + # 3. Daten gruppieren und SQL-Statements erstellen + print("\n⚙️ Verarbeite Daten...") + sql_statements = group_and_process_data(df) + + # 4. SQL-Datei schreiben + write_sql_file(sql_statements, sql_file) + + print(f"\n✅ Fertig! SQL-Datei wurde erstellt: {sql_file}") + +if __name__ == "__main__": + main() diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 99b88fe..e04935f 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -254,7 +254,7 @@ CREATE TABLE IF NOT EXISTS material id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, part_number CHAR(12) NOT NULL, normalized_part_number CHAR(12) NOT NULL, - hs_code CHAR(8), + hs_code CHAR(11), name VARCHAR(500) NOT NULL, is_deprecated BOOLEAN NOT NULL DEFAULT FALSE, CONSTRAINT `uq_normalized_part_number` UNIQUE (`normalized_part_number`) @@ -342,7 +342,7 @@ CREATE TABLE IF NOT EXISTS premise material_cost DECIMAL(15, 2) DEFAULT NULL COMMENT 'aka MEK_A in EUR', is_fca_enabled BOOLEAN DEFAULT FALSE, oversea_share DECIMAL(8, 4) DEFAULT NULL, - hs_code CHAR(8) DEFAULT NULL, + hs_code CHAR(11) DEFAULT NULL, tariff_rate DECIMAL(8, 4) DEFAULT NULL, state CHAR(10) NOT NULL DEFAULT 'DRAFT', individual_hu_length INT UNSIGNED COMMENT 'user entered dimensions in mm (if system-wide packaging is used, packaging dimensions are copied here after creation)', @@ -381,7 +381,7 @@ CREATE TABLE IF NOT EXISTS premise_destination destination_node_id INT NOT NULL, is_d2d BOOLEAN DEFAULT FALSE, rate_d2d DECIMAL(15, 2) DEFAULT NULL CHECK (rate_d2d >= 0), - lead_time_d2d INT UNSIGNED DEFAULT NULL, + lead_time_d2d INT UNSIGNED DEFAULT NULL CHECK (lead_time_d2d >= 0), repacking_cost DECIMAL(15, 2) DEFAULT NULL CHECK (repacking_cost >= 0), handling_cost DECIMAL(15, 2) DEFAULT NULL CHECK (handling_cost >= 0), disposal_cost DECIMAL(15, 2) DEFAULT NULL CHECK (disposal_cost >= 0), diff --git a/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerIntegrationTest.java b/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerIntegrationTest.java index 33cacf9..d1166de 100644 --- a/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerIntegrationTest.java +++ b/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerIntegrationTest.java @@ -1,34 +1,34 @@ package de.avatic.lcc.controller.calculation; import com.fasterxml.jackson.databind.ObjectMapper; +import de.avatic.lcc.dto.calculation.create.CreatePremiseDTO; import de.avatic.lcc.dto.calculation.edit.PremiseDetailDTO; -import de.avatic.lcc.dto.generic.MaterialDTO; +import de.avatic.lcc.dto.calculation.edit.destination.DestinationCreateDTO; +import de.avatic.lcc.dto.calculation.edit.masterData.MaterialUpdateDTO; +import de.avatic.lcc.dto.calculation.edit.masterData.PackagingUpdateDTO; +import de.avatic.lcc.dto.calculation.edit.masterData.PriceUpdateDTO; +import de.avatic.lcc.dto.generic.DimensionDTO; import de.avatic.lcc.model.nodes.Location; import de.avatic.lcc.model.premises.Premise; import de.avatic.lcc.model.premises.PremiseState; -import de.avatic.lcc.model.premises.route.Destination; import de.avatic.lcc.model.utils.DimensionUnit; import de.avatic.lcc.model.utils.WeightUnit; -import de.avatic.lcc.repositories.premise.DestinationRepository; -import de.avatic.lcc.repositories.premise.PremiseRepository; import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; +import org.springframework.http.MediaType; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.web.servlet.MockMvc; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import java.sql.ResultSet; -import java.sql.SQLException; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.hamcrest.Matchers.*; @@ -45,24 +45,115 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. public class PremiseControllerIntegrationTest { + @Autowired + protected JdbcTemplate jdbcTemplate; @Autowired private MockMvc mockMvc; - @Autowired private ObjectMapper objectMapper; - - @Autowired - protected JdbcTemplate jdbcTemplate; - @Autowired private PremiseControllerTestData premiseTestData; + private List getPremisesFromDb() { + String query = "SELECT * FROM premise"; + return jdbcTemplate.query(query, (rs, rowNum) -> { + var entity = new Premise(); + + entity.setId(rs.getInt("id")); + + entity.setPackagingId(rs.getInt("packaging_id")); + if (rs.wasNull()) + entity.setPackagingId(null); + + entity.setMaterialId(rs.getInt("material_id")); + if (rs.wasNull()) + entity.setMaterialId(null); + + entity.setSupplierNodeId(rs.getInt("supplier_node_id")); + if (rs.wasNull()) + entity.setSupplierNodeId(null); + + entity.setUserSupplierNodeId(rs.getInt("user_supplier_node_id")); + if (rs.wasNull()) + entity.setUserSupplierNodeId(null); + + entity.setLocation(new Location(rs.getBigDecimal("geo_lng").doubleValue(), rs.getBigDecimal("geo_lat").doubleValue())); + + entity.setCountryId(rs.getInt("country_id")); + if (rs.wasNull()) + entity.setCountryId(null); + + entity.setUserId(rs.getInt("user_id")); + if (rs.wasNull()) + entity.setUserId(null); + + entity.setMaterialCost(rs.getBigDecimal("material_cost")); + + entity.setHsCode(rs.getString("hs_code")); + + entity.setCustomRate(rs.getBigDecimal("tariff_rate")); + + entity.setFcaEnabled(rs.getBoolean("is_fca_enabled")); + if (rs.wasNull()) + entity.setFcaEnabled(null); + + entity.setOverseaShare(rs.getBigDecimal("oversea_share")); + + entity.setIndividualHuHeight(rs.getInt("individual_hu_height")); + if (rs.wasNull()) + entity.setIndividualHuHeight(null); + + entity.setIndividualHuWidth(rs.getInt("individual_hu_width")); + if (rs.wasNull()) + entity.setIndividualHuWidth(null); + + entity.setIndividualHuLength(rs.getInt("individual_hu_length")); + if (rs.wasNull()) + entity.setIndividualHuLength(null); + + entity.setIndividualHuWeight(rs.getInt("individual_hu_weight")); + if (rs.wasNull()) + entity.setIndividualHuWeight(null); + + entity.setHuDisplayedDimensionUnit(DimensionUnit.valueOf(rs.getString("hu_displayed_dimension_unit"))); + entity.setHuDisplayedWeightUnit(WeightUnit.valueOf(rs.getString("hu_displayed_weight_unit"))); + + entity.setHuStackable(rs.getBoolean("hu_stackable")); + if (rs.wasNull()) + entity.setHuStackable(null); + + entity.setHuMixable(rs.getBoolean("hu_mixable")); + if (rs.wasNull()) + entity.setHuMixable(null); + + entity.setHuUnitCount(rs.getInt("hu_unit_count")); + if (rs.wasNull()) + entity.setHuUnitCount(null); + + entity.setState(PremiseState.valueOf(rs.getString("state"))); + entity.setUpdatedAt(rs.getTimestamp("updated_at").toLocalDateTime()); + entity.setCreatedAt(rs.getTimestamp("created_at").toLocalDateTime()); + + return entity; + }); + } + + private Integer getNodeIdByExternalMappingId(String mappingId) { + String query = "SELECT id FROM node WHERE external_mapping_id = ? LIMIT 1"; + return jdbcTemplate.queryForObject(query, Integer.class, mappingId); + } + + private Integer getUserNodeIdByName(String name) { + String query = "SELECT id FROM sys_user_node WHERE name = ? LIMIT 1"; + return jdbcTemplate.queryForObject(query, Integer.class, name); + } @Nested @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + @DisplayName("GET /api/calculation/view - View Calculations Tests") class ViewPremisesTests { // Test for GET /api/calculation/view @@ -115,6 +206,7 @@ public class PremiseControllerIntegrationTest { @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + @DisplayName("GET /api/calculation/search - Search Tests") class SearchMaterialTests { // Test for GET /api/calculation/search @@ -156,7 +248,6 @@ public class PremiseControllerIntegrationTest { } /** - * *

Testcases

* * @@ -336,13 +427,13 @@ public class PremiseControllerIntegrationTest { * * *
Sarah Smith
- * */ @Nested @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + @DisplayName("POST /api/calculation/create - Create Calculations Tests") class CreatePremiseTests { @BeforeEach @@ -361,18 +452,18 @@ public class PremiseControllerIntegrationTest { public void createPremiseCase1() throws Exception { - var supplierId = getSupplierIdByExternalMappingId("LX"); + var supplierId = getNodeIdByExternalMappingId("LX"); var premisesBeforeCreate = getPremisesFromDb(); var materialId = getMaterialIdByPartNumber("28152640129"); + var dto = new CreatePremiseDTO(); + dto.setMaterialIds(List.of(materialId)); + dto.setSupplierIds(List.of(supplierId)); + dto.setUserSupplierIds(null); - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("material", materialId.toString()); - params.add("supplier", supplierId.toString()); - params.add("from_scratch", "false"); var result = mockMvc.perform(post("/api/calculation/create") - .params(params)) + .contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(dto))) .andExpect(status().isOk()) .andDo(print()) .andExpect(jsonPath("$[?(@.material.part_number=='28152640129')].handling_unit.content_unit_count", hasItem(2))) // content_unit_count is in the newest premise set to 2 @@ -408,18 +499,19 @@ public class PremiseControllerIntegrationTest { @DisplayName("POST /api/calculation/create - Recycles DRAFT from same user") public void createPremiseCase2() throws Exception { - var supplierId = getSupplierIdByExternalMappingId("LX"); + var supplierId = getNodeIdByExternalMappingId("LX"); var premisesBeforeCreate = getPremisesFromDb(); var materialId = getMaterialIdByPartNumber("8222640822"); - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("material", materialId.toString()); - params.add("supplier", supplierId.toString()); - params.add("from_scratch", "false"); + var dto = new CreatePremiseDTO(); + dto.setMaterialIds(List.of(materialId)); + dto.setSupplierIds(List.of(supplierId)); + dto.setUserSupplierIds(null); + var result = mockMvc.perform(post("/api/calculation/create") - .params(params)) + .contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(dto))) .andExpect(status().isOk()) .andDo(print()) .andExpect(jsonPath("$[?(@.material.part_number=='8222640822')].handling_unit.content_unit_count", hasItem(3))) // content_unit_count is in the correct permise set to 3 @@ -439,18 +531,19 @@ public class PremiseControllerIntegrationTest { @Test @DisplayName("POST /api/calculation/create - Recycles COMPLETED from other user") public void createPremiseCase3() throws Exception { - var supplierId = getSupplierIdByExternalMappingId("LX"); + var supplierId = getNodeIdByExternalMappingId("LX"); var premisesBeforeCreate = getPremisesFromDb(); var materialId = getMaterialIdByPartNumber("3064540201"); - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("material", materialId.toString()); - params.add("supplier", supplierId.toString()); - params.add("from_scratch", "false"); + var dto = new CreatePremiseDTO(); + dto.setMaterialIds(List.of(materialId)); + dto.setSupplierIds(List.of(supplierId)); + dto.setUserSupplierIds(null); + var result = mockMvc.perform(post("/api/calculation/create") - .params(params)) + .contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(dto))) .andExpect(status().isOk()) .andDo(print()) .andExpect(jsonPath("$[?(@.material.part_number=='3064540201')].handling_unit.content_unit_count", hasItem(4))) // content_unit_count is in the correct premise set to 4 @@ -469,18 +562,19 @@ public class PremiseControllerIntegrationTest { @Test @DisplayName("POST /api/calculation/create - Creates new Premise if no old data") public void createPremiseCase4() throws Exception { - var supplierId = getSupplierIdByExternalMappingId("LX"); + var supplierId = getNodeIdByExternalMappingId("LX"); var premisesBeforeCreate = getPremisesFromDb(); var materialId = getMaterialIdByPartNumber("8212640113"); - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("material", materialId.toString()); - params.add("supplier", supplierId.toString()); - params.add("from_scratch", "false"); + var dto = new CreatePremiseDTO(); + dto.setMaterialIds(List.of(materialId)); + dto.setSupplierIds(List.of(supplierId)); + dto.setUserSupplierIds(null); + var result = mockMvc.perform(post("/api/calculation/create") - .params(params)) + .contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(dto))) .andExpect(status().isOk()) .andDo(print()) .andExpect(jsonPath("$[?(@.material.part_number=='8212640113')].handling_unit.content_unit_count", hasItem(54))) // content_unit_count is the data from the packaging database. @@ -500,18 +594,19 @@ public class PremiseControllerIntegrationTest { @Test @DisplayName("POST /api/calculation/create - Uses UserSupplier DRAFT") public void createPremiseCase5() throws Exception { - var supplierId = getUserSupplierIdByName("My Supplier 1"); + var supplierId = getUserNodeIdByName("My Supplier 1"); var premisesBeforeCreate = getPremisesFromDb(); var materialId = getMaterialIdByPartNumber("28152640129"); - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("material", materialId.toString()); - params.add("user_supplier", supplierId.toString()); - params.add("from_scratch", "false"); + var dto = new CreatePremiseDTO(); + dto.setMaterialIds(List.of(materialId)); + dto.setUserSupplierIds(List.of(supplierId)); + dto.setSupplierIds(null); + var result = mockMvc.perform(post("/api/calculation/create") - .params(params)) + .contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(dto))) .andExpect(status().isOk()) .andDo(print()) .andExpect(jsonPath("$[?(@.material.part_number=='28152640129')].handling_unit.content_unit_count", hasItem(8))) // content_unit_count is the data from the packaging database. @@ -530,18 +625,19 @@ public class PremiseControllerIntegrationTest { @Test @DisplayName("POST /api/calculation/create - Access Violation UserSupplier") public void createPremiseCase6() throws Exception { - var supplierId = getUserSupplierIdByName("My Supplier 2"); + var supplierId = getUserNodeIdByName("My Supplier 2"); var premisesBeforeCreate = getPremisesFromDb(); var materialId = getMaterialIdByPartNumber("28152640129"); - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("material", materialId.toString()); - params.add("user_supplier", supplierId.toString()); - params.add("from_scratch", "false"); + var dto = new CreatePremiseDTO(); + dto.setMaterialIds(List.of(materialId)); + dto.setUserSupplierIds(List.of(supplierId)); + dto.setSupplierIds(null); + var result = mockMvc.perform(post("/api/calculation/create") - .params(params)) + .contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(dto))) .andExpect(status().isForbidden()) .andDo(print()) .andReturn(); @@ -554,22 +650,22 @@ public class PremiseControllerIntegrationTest { @Test @DisplayName("POST /api/calculation/create - From Scratch behavior test") public void createPremiseCase7() throws Exception { - var supplierId = getSupplierIdByExternalMappingId("LX"); + var supplierId = getNodeIdByExternalMappingId("LX"); var materialId1 = getMaterialIdByPartNumber("28152640129"); var materialId2 = getMaterialIdByPartNumber("8222640822"); var materialId4 = getMaterialIdByPartNumber("8212640113"); var premisesBeforeCreate = getPremisesFromDb(); - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("material", materialId1.toString()); - params.add("material", materialId2.toString()); - params.add("material", materialId4.toString()); - params.add("supplier", supplierId.toString()); - params.add("from_scratch", "true"); + var dto = new CreatePremiseDTO(); + dto.setMaterialIds(Arrays.asList(materialId1, materialId2, materialId4)); + dto.setSupplierIds(List.of(supplierId)); + dto.setUserSupplierIds(Collections.emptyList()); + dto.setCreateEmpty(true); + var result = mockMvc.perform(post("/api/calculation/create") - .params(params)) + .contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(dto))) .andExpect(status().isOk()) .andDo(print()) .andExpect(jsonPath("$[?(@.material.part_number=='28152640129')].handling_unit.content_unit_count", hasItem(1))) // content_unit_count is the data from the packaging database. @@ -595,13 +691,15 @@ public class PremiseControllerIntegrationTest { var premisesBeforeCreate = getPremisesFromDb(); - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("material", String.valueOf(-1)); - params.add("supplier", String.valueOf(1)); - params.add("from_scratch", "false"); + + var dto = new CreatePremiseDTO(); + dto.setMaterialIds(List.of(-1)); + dto.setSupplierIds(List.of(1)); + dto.setUserSupplierIds(null); + var result = mockMvc.perform(post("/api/calculation/create") - .params(params)) + .contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(dto))) .andExpect(status().isBadRequest()) .andDo(print()) .andReturn(); @@ -619,13 +717,14 @@ public class PremiseControllerIntegrationTest { var premisesBeforeCreate = getPremisesFromDb(); - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("material", String.valueOf(1)); - params.add("supplier", String.valueOf(-1)); - params.add("from_scratch", "false"); + var dto = new CreatePremiseDTO(); + dto.setMaterialIds(List.of(1)); + dto.setSupplierIds(List.of(-1)); + dto.setUserSupplierIds(null); + var result = mockMvc.perform(post("/api/calculation/create") - .params(params)) + .contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(dto))) .andExpect(status().isBadRequest()) .andDo(print()) .andReturn(); @@ -642,13 +741,14 @@ public class PremiseControllerIntegrationTest { public void createPremiseCase10() throws Exception { var premisesBeforeCreate = getPremisesFromDb(); - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("material", String.valueOf(1)); - params.add("user_supplier", String.valueOf(-1)); - params.add("from_scratch", "false"); + var dto = new CreatePremiseDTO(); + dto.setMaterialIds(List.of(-1)); + dto.setUserSupplierIds(List.of(1)); + dto.setSupplierIds(null); + var result = mockMvc.perform(post("/api/calculation/create") - .params(params)) + .contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(dto))) .andExpect(status().isBadRequest()) .andDo(print()) .andReturn(); @@ -659,94 +759,6 @@ public class PremiseControllerIntegrationTest { } - private List getPremisesFromDb() { - String query = "SELECT * FROM premise"; - return jdbcTemplate.query(query, new RowMapper<>() { - - @Override - public Premise mapRow(ResultSet rs, int rowNum) throws SQLException { - var entity = new Premise(); - - entity.setId(rs.getInt("id")); - - entity.setPackagingId(rs.getInt("packaging_id")); - if (rs.wasNull()) - entity.setPackagingId(null); - - entity.setMaterialId(rs.getInt("material_id")); - if (rs.wasNull()) - entity.setMaterialId(null); - - entity.setSupplierNodeId(rs.getInt("supplier_node_id")); - if (rs.wasNull()) - entity.setSupplierNodeId(null); - - entity.setUserSupplierNodeId(rs.getInt("user_supplier_node_id")); - if (rs.wasNull()) - entity.setUserSupplierNodeId(null); - - entity.setLocation(new Location(rs.getBigDecimal("geo_lng").doubleValue(), rs.getBigDecimal("geo_lat").doubleValue())); - - entity.setCountryId(rs.getInt("country_id")); - if (rs.wasNull()) - entity.setCountryId(null); - - entity.setUserId(rs.getInt("user_id")); - if (rs.wasNull()) - entity.setUserId(null); - - entity.setMaterialCost(rs.getBigDecimal("material_cost")); - - entity.setHsCode(rs.getString("hs_code")); - - entity.setCustomRate(rs.getBigDecimal("tariff_rate")); - - entity.setFcaEnabled(rs.getBoolean("is_fca_enabled")); - if (rs.wasNull()) - entity.setFcaEnabled(null); - - entity.setOverseaShare(rs.getBigDecimal("oversea_share")); - - entity.setIndividualHuHeight(rs.getInt("individual_hu_height")); - if (rs.wasNull()) - entity.setIndividualHuHeight(null); - - entity.setIndividualHuWidth(rs.getInt("individual_hu_width")); - if (rs.wasNull()) - entity.setIndividualHuWidth(null); - - entity.setIndividualHuLength(rs.getInt("individual_hu_length")); - if (rs.wasNull()) - entity.setIndividualHuLength(null); - - entity.setIndividualHuWeight(rs.getInt("individual_hu_weight")); - if (rs.wasNull()) - entity.setIndividualHuWeight(null); - - entity.setHuDisplayedDimensionUnit(DimensionUnit.valueOf(rs.getString("hu_displayed_dimension_unit"))); - entity.setHuDisplayedWeightUnit(WeightUnit.valueOf(rs.getString("hu_displayed_weight_unit"))); - - entity.setHuStackable(rs.getBoolean("hu_stackable")); - if (rs.wasNull()) - entity.setHuStackable(null); - - entity.setHuMixable(rs.getBoolean("hu_mixable")); - if (rs.wasNull()) - entity.setHuMixable(null); - - entity.setHuUnitCount(rs.getInt("hu_unit_count")); - if (rs.wasNull()) - entity.setHuUnitCount(null); - - entity.setState(PremiseState.valueOf(rs.getString("state"))); - entity.setUpdatedAt(rs.getTimestamp("updated_at").toLocalDateTime()); - entity.setCreatedAt(rs.getTimestamp("created_at").toLocalDateTime()); - - return entity; - } - }); - } - private Integer getMaterialIdByPartNumber(String partNumber) { String query = "SELECT id FROM material WHERE part_number = ? LIMIT 1"; @@ -763,52 +775,1092 @@ public class PremiseControllerIntegrationTest { return jdbcTemplate.queryForObject(query, Integer.class, name); } - private Integer getSupplierIdByExternalMappingId(String mappingId) { - String query = "SELECT id FROM node WHERE external_mapping_id = ? LIMIT 1"; - return jdbcTemplate.queryForObject(query, Integer.class, mappingId); + + } + + @Nested + @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + @DisplayName("GET /api/calculation/edit - Get Calculations Tests") + class GetPremiseTests { + @BeforeEach + void setUp() { + premiseTestData.generateData(); } - private Integer getUserSupplierIdByName(String name) { - String query = "SELECT id FROM sys_user_node WHERE name = ? LIMIT 1"; - return jdbcTemplate.queryForObject(query, Integer.class, name); + @AfterEach + void cleanUp() { + premiseTestData.deleteAll(); } + + @Test + @DisplayName("GET /api/calculation/edit - Get Single Premiss") + public void getPremiseCase1() throws Exception { + + var premises = getPremisesFromDb(); + + var premise1 = premises.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + + + var result = mockMvc.perform(get("/api/calculation/edit") + .content(Collections.singletonList(premise1.getId()).toString()).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()) + .andExpect(jsonPath("$[?(@.material.part_number=='28152640129')].handling_unit.content_unit_count", hasItem(2))) // content_unit_count is in the newest premise set to 2 + .andExpect(jsonPath("$", hasSize(1))) + .andReturn(); + + + var dtos = objectMapper.readValue(result.getResponse().getContentAsString(), PremiseDetailDTO[].class); + + + // check that destinations are copied from completed. + assertThat(dtos[0].getDestinations().getFirst().getDestinationNode().getName()).isEqualTo("Aschaffenburg (KION plant)"); + + assertThat(dtos[0].getDestinations().getFirst().getRoutes().getFirst().getTransitNodes().get(0).getName()).isEqualTo("Linde (China) Forklift Truck (Supplier)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().getFirst().getTransitNodes().get(1).getName()).isEqualTo("Xiamen (Port)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(0).getTransitNodes().get(2).getName()).isEqualTo("Hamburg (Port)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(0).getTransitNodes().get(3).getName()).isEqualTo("Aschaffenburg (KION plant)"); + + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(1).getTransitNodes().get(0).getName()).isEqualTo("Linde (China) Forklift Truck (Supplier)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(1).getTransitNodes().get(1).getName()).isEqualTo("Xiamen (Port)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(1).getTransitNodes().get(2).getName()).isEqualTo("Zeebrugge (Port)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(1).getTransitNodes().get(3).getName()).isEqualTo("Aschaffenburg (KION plant)"); + + } + + @Test + @DisplayName("GET /api/calculation/edit - Get Multiple Premisses") + public void getPremiseCase2() throws Exception { + + var premises = getPremisesFromDb(); + + var premise1 = premises.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premises.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + var result = mockMvc.perform(get("/api/calculation/edit") + .content(Arrays.asList(premise1.getId(), premise3.getId()).toString()).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()) + .andExpect(jsonPath("$[?(@.material.part_number=='28152640129')].handling_unit.content_unit_count", hasItem(2))) + .andExpect(jsonPath("$[?(@.material.part_number=='8222640822')].handling_unit.content_unit_count", hasItem(3))) + .andExpect(jsonPath("$", hasSize(2))) + .andReturn(); + + + var dtos = objectMapper.readValue(result.getResponse().getContentAsString(), PremiseDetailDTO[].class); + + assertThat(dtos[0].getDestinations().getFirst().getDestinationNode().getName()).isEqualTo("Aschaffenburg (KION plant)"); + + assertThat(dtos[0].getDestinations().getFirst().getRoutes().getFirst().getTransitNodes().get(0).getName()).isEqualTo("Linde (China) Forklift Truck (Supplier)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().getFirst().getTransitNodes().get(1).getName()).isEqualTo("Xiamen (Port)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(0).getTransitNodes().get(2).getName()).isEqualTo("Hamburg (Port)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(0).getTransitNodes().get(3).getName()).isEqualTo("Aschaffenburg (KION plant)"); + + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(1).getTransitNodes().get(0).getName()).isEqualTo("Linde (China) Forklift Truck (Supplier)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(1).getTransitNodes().get(1).getName()).isEqualTo("Xiamen (Port)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(1).getTransitNodes().get(2).getName()).isEqualTo("Zeebrugge (Port)"); + assertThat(dtos[0].getDestinations().getFirst().getRoutes().get(1).getTransitNodes().get(3).getName()).isEqualTo("Aschaffenburg (KION plant)"); + + + assertThat(dtos[0].getDestinations().get(1).getDestinationNode().getName()).isEqualTo("Stříbro (KION plant)"); + assertThat(dtos[1].getDestinations().getFirst().getDestinationNode().getName()).isEqualTo("Châtellerault (KION plant)"); + + } + } + @Nested - class SetSupplierTests { + @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + @DisplayName("POST /api/calculation/material - Update Material tests") + class UpdateMaterialTests { + + + @Test + @DisplayName("POST /api/calculation/material - happy path (update tariff_rate)") + public void updateMaterialCase1() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + var dto = new MaterialUpdateDTO(); + dto.setTariffRate(13.5); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + mockMvc.perform(post("/api/calculation/material") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()); + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getCustomRate()).isEqualByComparingTo(BigDecimal.valueOf(13.5)); + assertThat(premiseAfter3.getCustomRate()).isEqualByComparingTo(BigDecimal.valueOf(13.5)); + assertThat(premiseAfter8.getCustomRate()).isEqualByComparingTo(BigDecimal.valueOf(13.5)); + + assertThat(premiseAfter1.getHsCode()).isEqualTo(premise1.getHsCode()); + assertThat(premiseAfter3.getHsCode()).isEqualTo(premise3.getHsCode()); + assertThat(premiseAfter8.getHsCode()).isEqualTo(premise8.getHsCode()); + + } + + @Test + @DisplayName("POST /api/calculation/material - happy path (update hs_code)") + public void updateMaterialCase2() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + var dto = new MaterialUpdateDTO(); + dto.setHsCode("12345678"); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + mockMvc.perform(post("/api/calculation/material") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()); + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getCustomRate()).isEqualByComparingTo(premise1.getCustomRate()); + assertThat(premiseAfter3.getCustomRate()).isEqualByComparingTo(premise3.getCustomRate()); + assertThat(premiseAfter8.getCustomRate()).isEqualByComparingTo(premise8.getCustomRate()); + + assertThat(premiseAfter1.getHsCode()).isEqualTo("12345678"); + assertThat(premiseAfter3.getHsCode()).isEqualTo("12345678"); + assertThat(premiseAfter8.getHsCode()).isEqualTo("12345678"); + + } + + @Test + @DisplayName("POST /api/calculation/material - happy path (update both)") + public void updateMaterialCase3() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + var dto = new MaterialUpdateDTO(); + dto.setTariffRate(13.5); + dto.setHsCode("12345678"); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + mockMvc.perform(post("/api/calculation/material") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()); + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getCustomRate()).isEqualByComparingTo(BigDecimal.valueOf(13.5)); + assertThat(premiseAfter3.getCustomRate()).isEqualByComparingTo(BigDecimal.valueOf(13.5)); + assertThat(premiseAfter8.getCustomRate()).isEqualByComparingTo(BigDecimal.valueOf(13.5)); + + assertThat(premiseAfter1.getHsCode()).isEqualTo("12345678"); + assertThat(premiseAfter3.getHsCode()).isEqualTo("12345678"); + assertThat(premiseAfter8.getHsCode()).isEqualTo("12345678"); + + } + + + @Test + @DisplayName("POST /api/calculation/material - error (invalid hs_code - to long)") + public void updateMaterialCase4() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + var dto = new MaterialUpdateDTO(); + dto.setHsCode("123456123456"); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + mockMvc.perform(post("/api/calculation/material") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getCustomRate()).isEqualByComparingTo(premise1.getCustomRate()); + assertThat(premiseAfter3.getCustomRate()).isEqualByComparingTo(premise3.getCustomRate()); + assertThat(premiseAfter8.getCustomRate()).isEqualByComparingTo(premise8.getCustomRate()); + + assertThat(premiseAfter1.getHsCode()).isEqualTo(premise1.getHsCode()); + assertThat(premiseAfter3.getHsCode()).isEqualTo(premise3.getHsCode()); + assertThat(premiseAfter8.getHsCode()).isEqualTo(premise8.getHsCode()); + + } + + @Test + @DisplayName("POST /api/calculation/material - error (invalid hs_code - to short)") + public void updateMaterialCase5() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + var dto = new MaterialUpdateDTO(); + dto.setHsCode("12345"); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + mockMvc.perform(post("/api/calculation/material") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getCustomRate()).isEqualByComparingTo(premise1.getCustomRate()); + assertThat(premiseAfter3.getCustomRate()).isEqualByComparingTo(premise3.getCustomRate()); + assertThat(premiseAfter8.getCustomRate()).isEqualByComparingTo(premise8.getCustomRate()); + + assertThat(premiseAfter1.getHsCode()).isEqualTo(premise1.getHsCode()); + assertThat(premiseAfter3.getHsCode()).isEqualTo(premise3.getHsCode()); + assertThat(premiseAfter8.getHsCode()).isEqualTo(premise8.getHsCode()); + + } + + @Test + @DisplayName("POST /api/calculation/material - error (invalid hs_code - invalid characters)") + public void updateMaterialCase6() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + var dto = new MaterialUpdateDTO(); + dto.setHsCode("123abc45"); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + mockMvc.perform(post("/api/calculation/material") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getCustomRate()).isEqualByComparingTo(premise1.getCustomRate()); + assertThat(premiseAfter3.getCustomRate()).isEqualByComparingTo(premise3.getCustomRate()); + assertThat(premiseAfter8.getCustomRate()).isEqualByComparingTo(premise8.getCustomRate()); + + assertThat(premiseAfter1.getHsCode()).isEqualTo(premise1.getHsCode()); + assertThat(premiseAfter3.getHsCode()).isEqualTo(premise3.getHsCode()); + assertThat(premiseAfter8.getHsCode()).isEqualTo(premise8.getHsCode()); + + } + + + @Test + @DisplayName("POST /api/calculation/material - error (invalid hs_code - negative number)") + public void updateMaterialCase7() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + var dto = new MaterialUpdateDTO(); + dto.setHsCode("-12345678"); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + mockMvc.perform(post("/api/calculation/material") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getCustomRate()).isEqualByComparingTo(premise1.getCustomRate()); + assertThat(premiseAfter3.getCustomRate()).isEqualByComparingTo(premise3.getCustomRate()); + assertThat(premiseAfter8.getCustomRate()).isEqualByComparingTo(premise8.getCustomRate()); + + assertThat(premiseAfter1.getHsCode()).isEqualTo(premise1.getHsCode()); + assertThat(premiseAfter3.getHsCode()).isEqualTo(premise3.getHsCode()); + assertThat(premiseAfter8.getHsCode()).isEqualTo(premise8.getHsCode()); + + } + + @Test + @DisplayName("POST /api/calculation/material - error (invalid tariff_rate values)") + public void updateMaterialCase8() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + // to many digits + var dto = new MaterialUpdateDTO(); + dto.setTariffRate(13.54321); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + mockMvc.perform(post("/api/calculation/material") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + // negative + dto = new MaterialUpdateDTO(); + dto.setTariffRate(-13.5); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + mockMvc.perform(post("/api/calculation/material") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + // to big + dto = new MaterialUpdateDTO(); + dto.setTariffRate(13333.5); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + mockMvc.perform(post("/api/calculation/material") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getCustomRate()).isEqualByComparingTo(premise1.getCustomRate()); + assertThat(premiseAfter3.getCustomRate()).isEqualByComparingTo(premise3.getCustomRate()); + assertThat(premiseAfter8.getCustomRate()).isEqualByComparingTo(premise8.getCustomRate()); + + assertThat(premiseAfter1.getHsCode()).isEqualTo(premise1.getHsCode()); + assertThat(premiseAfter3.getHsCode()).isEqualTo(premise3.getHsCode()); + assertThat(premiseAfter8.getHsCode()).isEqualTo(premise8.getHsCode()); + + } + } @Nested - class SetPackagingTests { + @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + @DisplayName("POST /api/calculation/packaging - Update Packaging tests") + class UpdatePackagingTests { + + @Test + @DisplayName("POST /api/calculation/packaging - happy path (update mixable)") + public void updatePackagingCase1() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + var dto = new PackagingUpdateDTO(); + dto.setMixable(false); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + var result = mockMvc.perform(post("/api/calculation/packaging") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()) + .andReturn(); + + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getHuMixable()).isEqualTo(false); + assertThat(premiseAfter3.getHuMixable()).isEqualTo(false); + assertThat(premiseAfter8.getHuMixable()).isEqualTo(false); + + assertThat(premiseAfter1.getHuStackable()).isEqualTo(premise1.getHuStackable()); + assertThat(premiseAfter3.getHuStackable()).isEqualTo(premise3.getHuStackable()); + assertThat(premiseAfter8.getHuStackable()).isEqualTo(premise8.getHuStackable()); + + assertThat(premiseAfter1.getIndividualHuWeight()).isEqualTo(premise1.getIndividualHuWeight()); + assertThat(premiseAfter1.getIndividualHuLength()).isEqualTo(premise1.getIndividualHuLength()); + assertThat(premiseAfter1.getIndividualHuWidth()).isEqualTo(premise1.getIndividualHuWidth()); + assertThat(premiseAfter1.getIndividualHuHeight()).isEqualTo(premise1.getIndividualHuHeight()); + assertThat(premiseAfter1.getHuDisplayedDimensionUnit()).isEqualTo(premise1.getHuDisplayedDimensionUnit()); + assertThat(premiseAfter1.getHuDisplayedWeightUnit()).isEqualTo(premise1.getHuDisplayedWeightUnit()); + + assertThat(premiseAfter3.getIndividualHuWeight()).isEqualTo(premise3.getIndividualHuWeight()); + assertThat(premiseAfter3.getIndividualHuLength()).isEqualTo(premise3.getIndividualHuLength()); + assertThat(premiseAfter3.getIndividualHuWidth()).isEqualTo(premise3.getIndividualHuWidth()); + assertThat(premiseAfter3.getIndividualHuHeight()).isEqualTo(premise3.getIndividualHuHeight()); + assertThat(premiseAfter3.getHuDisplayedDimensionUnit()).isEqualTo(premise3.getHuDisplayedDimensionUnit()); + assertThat(premiseAfter3.getHuDisplayedWeightUnit()).isEqualTo(premise3.getHuDisplayedWeightUnit()); + + assertThat(premiseAfter8.getIndividualHuWeight()).isEqualTo(premise8.getIndividualHuWeight()); + assertThat(premiseAfter8.getIndividualHuLength()).isEqualTo(premise8.getIndividualHuLength()); + assertThat(premiseAfter8.getIndividualHuWidth()).isEqualTo(premise8.getIndividualHuWidth()); + assertThat(premiseAfter8.getIndividualHuHeight()).isEqualTo(premise8.getIndividualHuHeight()); + assertThat(premiseAfter8.getHuDisplayedDimensionUnit()).isEqualTo(premise8.getHuDisplayedDimensionUnit()); + assertThat(premiseAfter8.getHuDisplayedWeightUnit()).isEqualTo(premise8.getHuDisplayedWeightUnit()); + + } + + @Test + @DisplayName("POST /api/calculation/packaging - happy path (update stackable)") + public void updatePackagingCase2() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + var dto = new PackagingUpdateDTO(); + dto.setStackable(!premise1.getHuStackable()); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + var result = mockMvc.perform(post("/api/calculation/packaging") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()) + .andReturn(); + + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getHuStackable()).isEqualTo(dto.getStackable()); + assertThat(premiseAfter3.getHuStackable()).isEqualTo(dto.getStackable()); + assertThat(premiseAfter8.getHuStackable()).isEqualTo(dto.getStackable()); + + assertThat(premiseAfter1.getHuMixable()).isEqualTo(premise1.getHuMixable()); + assertThat(premiseAfter3.getHuMixable()).isEqualTo(premise3.getHuMixable()); + assertThat(premiseAfter8.getHuMixable()).isEqualTo(premise8.getHuMixable()); + + assertThat(premiseAfter1.getIndividualHuWeight()).isEqualTo(premise1.getIndividualHuWeight()); + assertThat(premiseAfter1.getIndividualHuLength()).isEqualTo(premise1.getIndividualHuLength()); + assertThat(premiseAfter1.getIndividualHuWidth()).isEqualTo(premise1.getIndividualHuWidth()); + assertThat(premiseAfter1.getIndividualHuHeight()).isEqualTo(premise1.getIndividualHuHeight()); + assertThat(premiseAfter1.getHuDisplayedDimensionUnit()).isEqualTo(premise1.getHuDisplayedDimensionUnit()); + assertThat(premiseAfter1.getHuDisplayedWeightUnit()).isEqualTo(premise1.getHuDisplayedWeightUnit()); + + assertThat(premiseAfter3.getIndividualHuWeight()).isEqualTo(premise3.getIndividualHuWeight()); + assertThat(premiseAfter3.getIndividualHuLength()).isEqualTo(premise3.getIndividualHuLength()); + assertThat(premiseAfter3.getIndividualHuWidth()).isEqualTo(premise3.getIndividualHuWidth()); + assertThat(premiseAfter3.getIndividualHuHeight()).isEqualTo(premise3.getIndividualHuHeight()); + assertThat(premiseAfter3.getHuDisplayedDimensionUnit()).isEqualTo(premise3.getHuDisplayedDimensionUnit()); + assertThat(premiseAfter3.getHuDisplayedWeightUnit()).isEqualTo(premise3.getHuDisplayedWeightUnit()); + + assertThat(premiseAfter8.getIndividualHuWeight()).isEqualTo(premise8.getIndividualHuWeight()); + assertThat(premiseAfter8.getIndividualHuLength()).isEqualTo(premise8.getIndividualHuLength()); + assertThat(premiseAfter8.getIndividualHuWidth()).isEqualTo(premise8.getIndividualHuWidth()); + assertThat(premiseAfter8.getIndividualHuHeight()).isEqualTo(premise8.getIndividualHuHeight()); + assertThat(premiseAfter8.getHuDisplayedDimensionUnit()).isEqualTo(premise8.getHuDisplayedDimensionUnit()); + assertThat(premiseAfter8.getHuDisplayedWeightUnit()).isEqualTo(premise8.getHuDisplayedWeightUnit()); + + } + + @Test + @DisplayName("POST /api/calculation/packaging - happy path (update dimensions)") + public void updatePackagingCase3() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + var dimensions = new DimensionDTO(); + dimensions.setDimensionUnit(DimensionUnit.CM); + dimensions.setWeightUnit(WeightUnit.KG); + dimensions.setHeight(100.5); + dimensions.setWidth(125.0); + dimensions.setLength(70.0); + dimensions.setWeight(55.5); + + var dto = new PackagingUpdateDTO(); + dto.setDimensions(dimensions); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + var result = mockMvc.perform(post("/api/calculation/packaging") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()) + .andReturn(); + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getHuStackable()).isEqualTo(premise1.getHuStackable()); + assertThat(premiseAfter3.getHuStackable()).isEqualTo(premise3.getHuStackable()); + assertThat(premiseAfter8.getHuStackable()).isEqualTo(premise8.getHuStackable()); + + assertThat(premiseAfter1.getHuMixable()).isEqualTo(premise1.getHuMixable()); + assertThat(premiseAfter3.getHuMixable()).isEqualTo(premise3.getHuMixable()); + assertThat(premiseAfter8.getHuMixable()).isEqualTo(premise8.getHuMixable()); + + assertThat(premiseAfter1.getIndividualHuWeight()).isEqualTo(55500); + assertThat(premiseAfter1.getIndividualHuLength()).isEqualTo(700); + assertThat(premiseAfter1.getIndividualHuWidth()).isEqualTo(1250); + assertThat(premiseAfter1.getIndividualHuHeight()).isEqualTo(1005); + assertThat(premiseAfter1.getHuDisplayedDimensionUnit()).isEqualTo(DimensionUnit.CM); + assertThat(premiseAfter1.getHuDisplayedWeightUnit()).isEqualTo(WeightUnit.KG); + + assertThat(premiseAfter3.getIndividualHuWeight()).isEqualTo(55500); + assertThat(premiseAfter3.getIndividualHuLength()).isEqualTo(700); + assertThat(premiseAfter3.getIndividualHuWidth()).isEqualTo(1250); + assertThat(premiseAfter3.getIndividualHuHeight()).isEqualTo(1005); + assertThat(premiseAfter3.getHuDisplayedDimensionUnit()).isEqualTo(DimensionUnit.CM); + assertThat(premiseAfter3.getHuDisplayedWeightUnit()).isEqualTo(WeightUnit.KG); + + assertThat(premiseAfter8.getIndividualHuWeight()).isEqualTo(55500); + assertThat(premiseAfter8.getIndividualHuLength()).isEqualTo(700); + assertThat(premiseAfter8.getIndividualHuWidth()).isEqualTo(1250); + assertThat(premiseAfter8.getIndividualHuHeight()).isEqualTo(1005); + assertThat(premiseAfter8.getHuDisplayedDimensionUnit()).isEqualTo(DimensionUnit.CM); + assertThat(premiseAfter8.getHuDisplayedWeightUnit()).isEqualTo(WeightUnit.KG); + + } + + @Test + @DisplayName("POST /api/calculation/packaging - error (partial update dimensions)") + public void updatePackagingCase4() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premise8 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + var dimensions = new DimensionDTO(); + dimensions.setDimensionUnit(DimensionUnit.M); + dimensions.setWeightUnit(WeightUnit.G); + dimensions.setHeight(1.005); + dimensions.setWidth(1.250); + dimensions.setLength(null); + dimensions.setWeight(55500.0); + + var dto = new PackagingUpdateDTO(); + dto.setDimensions(dimensions); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId(), premise8.getId())); + + + var result = mockMvc.perform(post("/api/calculation/packaging") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()) + .andReturn(); + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + var premiseAfter8 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 8).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getHuStackable()).isEqualTo(premise1.getHuStackable()); + assertThat(premiseAfter3.getHuStackable()).isEqualTo(premise3.getHuStackable()); + assertThat(premiseAfter8.getHuStackable()).isEqualTo(premise8.getHuStackable()); + + assertThat(premiseAfter1.getHuMixable()).isEqualTo(premise1.getHuMixable()); + assertThat(premiseAfter3.getHuMixable()).isEqualTo(premise3.getHuMixable()); + assertThat(premiseAfter8.getHuMixable()).isEqualTo(premise8.getHuMixable()); + + assertThat(premiseAfter1.getIndividualHuWeight()).isEqualTo(premise1.getIndividualHuWeight()); + assertThat(premiseAfter1.getIndividualHuLength()).isEqualTo(premise1.getIndividualHuLength()); + assertThat(premiseAfter1.getIndividualHuWidth()).isEqualTo(premise1.getIndividualHuWidth()); + assertThat(premiseAfter1.getIndividualHuHeight()).isEqualTo(premise1.getIndividualHuHeight()); + assertThat(premiseAfter1.getHuDisplayedDimensionUnit()).isEqualTo(premise1.getHuDisplayedDimensionUnit()); + assertThat(premiseAfter1.getHuDisplayedWeightUnit()).isEqualTo(premise1.getHuDisplayedWeightUnit()); + + assertThat(premiseAfter3.getIndividualHuWeight()).isEqualTo(premise3.getIndividualHuWeight()); + assertThat(premiseAfter3.getIndividualHuLength()).isEqualTo(premise3.getIndividualHuLength()); + assertThat(premiseAfter3.getIndividualHuWidth()).isEqualTo(premise3.getIndividualHuWidth()); + assertThat(premiseAfter3.getIndividualHuHeight()).isEqualTo(premise3.getIndividualHuHeight()); + assertThat(premiseAfter3.getHuDisplayedDimensionUnit()).isEqualTo(premise3.getHuDisplayedDimensionUnit()); + assertThat(premiseAfter3.getHuDisplayedWeightUnit()).isEqualTo(premise3.getHuDisplayedWeightUnit()); + + assertThat(premiseAfter8.getIndividualHuWeight()).isEqualTo(premise8.getIndividualHuWeight()); + assertThat(premiseAfter8.getIndividualHuLength()).isEqualTo(premise8.getIndividualHuLength()); + assertThat(premiseAfter8.getIndividualHuWidth()).isEqualTo(premise8.getIndividualHuWidth()); + assertThat(premiseAfter8.getIndividualHuHeight()).isEqualTo(premise8.getIndividualHuHeight()); + assertThat(premiseAfter8.getHuDisplayedDimensionUnit()).isEqualTo(premise8.getHuDisplayedDimensionUnit()); + assertThat(premiseAfter8.getHuDisplayedWeightUnit()).isEqualTo(premise8.getHuDisplayedWeightUnit()); + + } + + @Test + @DisplayName("POST /api/calculation/packaging - happy path (API read-back)") + public void updatePackagingCase5() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + + + var dimensions = new DimensionDTO(); + dimensions.setDimensionUnit(DimensionUnit.M); + dimensions.setWeightUnit(WeightUnit.G); + dimensions.setHeight(1.005); + dimensions.setWidth(1.250); + dimensions.setLength(.70); + dimensions.setWeight(55500.0); + + var dto = new PackagingUpdateDTO(); + dto.setDimensions(dimensions); + dto.setPremiseIds(Collections.singletonList(premise1.getId())); + + + mockMvc.perform(post("/api/calculation/packaging") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()) + .andReturn(); + + mockMvc.perform(get("/api/calculation/edit") + .content(Collections.singletonList(premise1.getId()).toString()) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()) + .andExpect(jsonPath("$[0].handling_unit.weight").value(55500.0)) + .andExpect(jsonPath("$[0].handling_unit.height").value(1.005)) + .andExpect(jsonPath("$[0].handling_unit.width").value(1.250)) + .andExpect(jsonPath("$[0]['handling_unit']['length']").value(0.7)); + + } + } @Nested - class SetPriceTests { + @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + @DisplayName("POST /api/calculation/price - Update price tests") + class UpdatePriceTests { + + @Test + @DisplayName("POST /api/calculation/price - happy path (update price only)") + public void updatePriceCase1() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + + var dto = new PriceUpdateDTO(); + dto.setPrice(12.34); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId())); + + + mockMvc.perform(post("/api/calculation/price") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()); + + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getMaterialCost()).isEqualTo(BigDecimal.valueOf(12.34)); + assertThat(premiseAfter3.getMaterialCost()).isEqualTo(BigDecimal.valueOf(12.34)); + + assertThat(premiseAfter1.getOverseaShare()).isEqualByComparingTo(premise1.getOverseaShare()); + assertThat(premiseAfter3.getOverseaShare()).isEqualByComparingTo(premise3.getOverseaShare()); + + assertThat(premiseAfter1.getFcaEnabled()).isEqualTo(premise1.getFcaEnabled()); + assertThat(premiseAfter3.getFcaEnabled()).isEqualTo(premise3.getFcaEnabled()); + + + } + + @Test + @DisplayName("POST /api/calculation/price - error case (set invalid prices)") + public void updatePriceCase2() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + + // to many fractions + var dto = new PriceUpdateDTO(); + dto.setPrice(12.3456); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId())); + + mockMvc.perform(post("/api/calculation/price") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + // negative price + dto = new PriceUpdateDTO(); + dto.setPrice(-12.34); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId())); + + mockMvc.perform(post("/api/calculation/price") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + // price == 0 + dto = new PriceUpdateDTO(); + dto.setPrice(0.00); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId())); + + mockMvc.perform(post("/api/calculation/price") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + // check if database is untouched + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getMaterialCost()).isEqualTo(premise1.getMaterialCost()); + assertThat(premiseAfter3.getMaterialCost()).isEqualTo(premise3.getMaterialCost()); + + assertThat(premiseAfter1.getOverseaShare()).isEqualByComparingTo(premise1.getOverseaShare()); + assertThat(premiseAfter3.getOverseaShare()).isEqualByComparingTo(premise3.getOverseaShare()); + + assertThat(premiseAfter1.getFcaEnabled()).isEqualTo(premise1.getFcaEnabled()); + assertThat(premiseAfter3.getFcaEnabled()).isEqualTo(premise3.getFcaEnabled()); + + } + + @Test + @DisplayName("POST /api/calculation/price - happy path (update oversea share only)") + public void updatePriceCase4() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + + var dto = new PriceUpdateDTO(); + dto.setOverseaShare(60.06); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId())); + + + mockMvc.perform(post("/api/calculation/price") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()); + + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getMaterialCost()).isEqualTo(premise1.getMaterialCost()); + assertThat(premiseAfter3.getMaterialCost()).isEqualTo(premise3.getMaterialCost()); + + assertThat(premiseAfter1.getOverseaShare()).isEqualByComparingTo(BigDecimal.valueOf(60.06)); + assertThat(premiseAfter3.getOverseaShare()).isEqualByComparingTo(BigDecimal.valueOf(60.06)); + + assertThat(premiseAfter1.getFcaEnabled()).isEqualTo(premise1.getFcaEnabled()); + assertThat(premiseAfter3.getFcaEnabled()).isEqualTo(premise3.getFcaEnabled()); + + + } + + @Test + @DisplayName("POST /api/calculation/price - error case (set invalid oversea share)") + public void updatePriceCase5() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + + // negative value + var dto = new PriceUpdateDTO(); + dto.setOverseaShare(-60.06); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId())); + + + mockMvc.perform(post("/api/calculation/price") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + + //value to high + dto = new PriceUpdateDTO(); + dto.setOverseaShare(60000.06); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId())); + + + mockMvc.perform(post("/api/calculation/price") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andDo(print()); + + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getMaterialCost()).isEqualTo(premise1.getMaterialCost()); + assertThat(premiseAfter3.getMaterialCost()).isEqualTo(premise3.getMaterialCost()); + + assertThat(premiseAfter1.getOverseaShare()).isEqualByComparingTo(premise1.getOverseaShare()); + assertThat(premiseAfter3.getOverseaShare()).isEqualByComparingTo(premise3.getOverseaShare()); + + assertThat(premiseAfter1.getFcaEnabled()).isEqualTo(premise1.getFcaEnabled()); + assertThat(premiseAfter3.getFcaEnabled()).isEqualTo(premise3.getFcaEnabled()); + + + } + + @Test + @DisplayName("POST /api/calculation/price - happy path (update include fca fee)") + public void updatePriceCase6() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + var dto = new PriceUpdateDTO(); + dto.setIncludeFcaFee(true); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId())); + + mockMvc.perform(post("/api/calculation/price") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()); + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getMaterialCost()).isEqualTo(premise1.getMaterialCost()); + assertThat(premiseAfter3.getMaterialCost()).isEqualTo(premise3.getMaterialCost()); + + assertThat(premiseAfter1.getOverseaShare()).isEqualByComparingTo(premise1.getOverseaShare()); + assertThat(premiseAfter3.getOverseaShare()).isEqualByComparingTo(premise3.getOverseaShare()); + + assertThat(premiseAfter1.getFcaEnabled()).isEqualTo(true); + assertThat(premiseAfter3.getFcaEnabled()).isEqualTo(true); + + dto = new PriceUpdateDTO(); + dto.setIncludeFcaFee(false); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId())); + + + mockMvc.perform(post("/api/calculation/price") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()); + + + premisesAfterUpdate = getPremisesFromDb(); + + premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getMaterialCost()).isEqualTo(premise1.getMaterialCost()); + assertThat(premiseAfter3.getMaterialCost()).isEqualTo(premise3.getMaterialCost()); + + assertThat(premiseAfter1.getOverseaShare()).isEqualByComparingTo(premise1.getOverseaShare()); + assertThat(premiseAfter3.getOverseaShare()).isEqualByComparingTo(premise3.getOverseaShare()); + + assertThat(premiseAfter1.getFcaEnabled()).isEqualTo(false); + assertThat(premiseAfter3.getFcaEnabled()).isEqualTo(false); + + + } + + @Test + @DisplayName("POST /api/calculation/price - happy path (update all values)") + public void updatePriceCase7() throws Exception { + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + + var dto = new PriceUpdateDTO(); + dto.setPrice(12.34); + dto.setOverseaShare(60.06); + dto.setIncludeFcaFee(true); + dto.setPremiseIds(Arrays.asList(premise1.getId(), premise3.getId())); + + + mockMvc.perform(post("/api/calculation/price") + .content(objectMapper.writeValueAsString(dto)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo(print()); + + + var premisesAfterUpdate = getPremisesFromDb(); + + var premiseAfter1 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premiseAfter3 = premisesAfterUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + assertThat(premiseAfter1.getMaterialCost()).isEqualTo(BigDecimal.valueOf(12.34)); + assertThat(premiseAfter3.getMaterialCost()).isEqualTo(BigDecimal.valueOf(12.34)); + + assertThat(premiseAfter1.getOverseaShare()).isEqualByComparingTo(BigDecimal.valueOf(60.06)); + assertThat(premiseAfter3.getOverseaShare()).isEqualByComparingTo(BigDecimal.valueOf(60.06)); + + assertThat(premiseAfter1.getFcaEnabled()).isEqualTo(true); + assertThat(premiseAfter3.getFcaEnabled()).isEqualTo(true); + + + } } @Nested + @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) class CreateDestinationTests { + @Test + @DisplayName("POST /api/calculation/price - happy path (create destination)") + public void createDestinationCase1() throws Exception { + + var nodeId = getNodeIdByExternalMappingId("AB"); + + var premisesBeforeUpdate = getPremisesFromDb(); + var premise1 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 2).findFirst().orElseThrow(); + var premise3 = premisesBeforeUpdate.stream().filter(p -> p.getHuUnitCount() == 3).findFirst().orElseThrow(); + + var dto = new DestinationCreateDTO(); + dto.setPremiseId(Arrays.asList(premise1.getId(), premise3.getId())); + dto.setDestinationNodeId(nodeId); + + mockMvc.perform(post("/api/calculation/destination") + .content(objectMapper.writeValueAsString(dto)) + .contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andDo(print()); + + + } } @Nested + @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) class GetDestinationTests { } @Nested - class SetDestinationTests { + @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + class UpdateDestinationTests { } @Nested + @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) class DeleteDestinationTests { } + @Nested + @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + @DisplayName("GET /api/calculation/start - Start Calculations Tests") + class StartCalculationTests { + + } + + @Nested + @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + class SetSupplierTests { + + + } + + @Nested + @Sql(scripts = {"classpath:master_data/alldata.sql", "classpath:master_data/users.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/users-cleanup.sql", "classpath:master_data/alldata-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_CLASS) + @Sql(scripts = {"classpath:master_data/premises.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/premises-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + class SetMaterialTests { + + } + // @Nested // class claudeTests { // diff --git a/src/test/resources/master_data/alldata.sql b/src/test/resources/master_data/alldata.sql index 8a63248..7f6a4a1 100644 --- a/src/test/resources/master_data/alldata.sql +++ b/src/test/resources/master_data/alldata.sql @@ -1,3 +1,4 @@ + -- full setup data. but with reduced material master data and fake container rates. INSERT INTO property_set (state) @@ -50900,6 +50901,8 @@ INSERT INTO country_matrix_rate ( -- Generated SQL INSERT statements for container rates -- Generated from shipping_data.csv +-- Container Rate INSERT Statements +-- Generiert aus Excel-Datei INSERT INTO container_rate ( from_node_id, @@ -50911,12 +50914,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Xiamen'), - (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + (SELECT id FROM node WHERE external_mapping_id = 'Aurangabad'), + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), 'ROAD', - 118.00, - 129.00, - 131.00, + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -50931,88 +50934,8 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Shanghai'), - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - 'ROAD', - 127.00, - 144.00, - 147.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Hangzhou'), - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - 'ROAD', - 372.00, - 535.00, - 562.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Yangzhong'), - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - 'ROAD', - 394.00, - 570.00, - 599.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Taicang'), - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - 'ROAD', - 183.00, - 263.00, - 276.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Jinjiang'), - (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), + (SELECT id FROM node WHERE external_mapping_id = 'Aurangabad'), + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), 'ROAD', 250.00, 400.00, @@ -51031,12 +50954,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Qingdao'), - (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), - 'ROAD', - 100.00, - 160.00, - 170.00, + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'AB'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -51051,12 +50974,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Fuqin'), - (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), - 'ROAD', - 250.00, - 400.00, - 425.00, + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'FGG'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -51071,12 +50994,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Linfen'), - (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), - 'ROAD', - 250.00, - 400.00, - 425.00, + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'KWS'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -51091,12 +51014,52 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Yantian'), - (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'Urban Wörth'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Bangalore'), + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), 'ROAD', - 264.00, - 423.00, - 449.00, + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -51131,93 +51094,13 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Pune'), - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - 'ROAD', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'JJ'), - (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - 'ROAD', - 250.00, - 400.00, - 425.00, - 2, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'LX'), - (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - 'ROAD', - 250.00, - 400.00, - 425.00, - 2, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Aurangabad'), - (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), - 'ROAD', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'Chennai'), - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - 'ROAD', - 626.00, - 901.00, - 965.00, - 1, + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + 'SEA', + 13795.00, + 22472.00, + 23448.00, + 24, @validity_period_id ); @@ -51252,155 +51135,15 @@ INSERT INTO container_rate ( validity_period_id ) VALUES ( (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), 'SEA', - 14216.00, - 23146.00, - 24148.00, + 14208.00, + 23133.00, + 24134.00, 25, @validity_period_id ); -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 14697.00, - 23915.00, - 24963.00, - 26, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 13901.00, - 22642.00, - 23629.00, - 24, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 13779.00, - 22447.00, - 23422.00, - 24, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 10355.00, - 16968.00, - 17702.00, - 18, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 1200.00, - 1920.00, - 2040.00, - 15, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - 'SEA', - 10311.00, - 16897.00, - 17627.00, - 18, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), - 'SEA', - 13795.00, - 22472.00, - 23448.00, - 24, - @validity_period_id - ); - INSERT INTO container_rate ( from_node_id, to_node_id, @@ -51412,11 +51155,11 @@ INSERT INTO container_rate ( validity_period_id ) VALUES ( (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), 'SEA', - 14208.00, - 23133.00, - 24134.00, + 14216.00, + 23146.00, + 24148.00, 25, @validity_period_id ); @@ -51441,6 +51184,26 @@ INSERT INTO container_rate ( @validity_period_id ); +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + 'SEA', + 14697.00, + 23915.00, + 24963.00, + 26, + @validity_period_id + ); + INSERT INTO container_rate ( from_node_id, to_node_id, @@ -51471,136 +51234,16 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), 'SEA', - 13771.00, - 22434.00, - 23408.00, + 13901.00, + 22642.00, + 23629.00, 24, @validity_period_id ); -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), - 'SEA', - 10347.00, - 16955.00, - 17688.00, - 18, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), - 'SEA', - 1200.00, - 1920.00, - 2040.00, - 15, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), - (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), - 'SEA', - 10303.00, - 16885.00, - 17614.00, - 18, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 13691.00, - 22306.00, - 23270.00, - 24, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 14104.00, - 22966.00, - 23956.00, - 25, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 14585.00, - 23736.00, - 24772.00, - 26, - @validity_period_id - ); - INSERT INTO container_rate ( from_node_id, to_node_id, @@ -51621,146 +51264,6 @@ INSERT INTO container_rate ( @validity_period_id ); -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 13667.00, - 22267.00, - 23230.00, - 24, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 9795.00, - 16072.00, - 16765.00, - 17, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 1200.00, - 1920.00, - 2040.00, - 15, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), - (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), - 'SEA', - 9751.00, - 16002.00, - 16692.00, - 17, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), - 'SEA', - 12430.00, - 20288.00, - 21182.00, - 22, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), - 'SEA', - 12843.00, - 20949.00, - 21871.00, - 22, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), - 'SEA', - 13324.00, - 21718.00, - 22689.00, - 23, - @validity_period_id - ); - INSERT INTO container_rate ( from_node_id, to_node_id, @@ -51792,12 +51295,12 @@ INSERT INTO container_rate ( validity_period_id ) VALUES ( (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), 'SEA', - 12406.00, - 20250.00, - 21142.00, - 22, + 13771.00, + 22434.00, + 23408.00, + 24, @validity_period_id ); @@ -51811,13 +51314,13 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), 'SEA', - 6069.00, - 9710.00, - 10417.00, - 11, + 13779.00, + 22447.00, + 23422.00, + 24, @validity_period_id ); @@ -51831,52 +51334,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Chennai'), (SELECT id FROM node WHERE external_mapping_id = 'ExM'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), - 'SEA', - 1200.00, - 1920.00, - 2040.00, - 15, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), - (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), - 'SEA', - 6025.00, - 9640.00, - 10342.00, - 11, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Zbůch'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, + 'ROAD', + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -51891,172 +51354,12 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Pfaff Rade'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'KOL'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Urban Wörth'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Bat3'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Jeantet'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'AB'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'FGG'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, - 1, - @validity_period_id - ); - -INSERT INTO container_rate ( - from_node_id, - to_node_id, - container_rate_type, - rate_teu, - rate_feu, - rate_hc, - lead_time, - validity_period_id -) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'KWS'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, + (SELECT id FROM node WHERE external_mapping_id = 'Chennai'), + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + 'ROAD', + 626.00, + 901.00, + 965.00, 1, @validity_period_id ); @@ -52101,6 +51404,26 @@ INSERT INTO container_rate ( @validity_period_id ); +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'KOL'), + 'POST_RUN', + 250.00, + 400.00, + 425.00, + 1, + @validity_period_id + ); + INSERT INTO container_rate ( from_node_id, to_node_id, @@ -52121,6 +51444,26 @@ INSERT INTO container_rate ( @validity_period_id ); +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'Pfaff Rade'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + INSERT INTO container_rate ( from_node_id, to_node_id, @@ -52141,6 +51484,46 @@ INSERT INTO container_rate ( @validity_period_id ); +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'Urban Wörth'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + INSERT INTO container_rate ( from_node_id, to_node_id, @@ -52172,11 +51555,71 @@ INSERT INTO container_rate ( validity_period_id ) VALUES ( (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + (SELECT id FROM node WHERE external_mapping_id = 'Zbůch'), + 'POST_RUN', + 250.00, + 400.00, + 425.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), + (SELECT id FROM node WHERE external_mapping_id = 'Bat3'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), (SELECT id FROM node WHERE external_mapping_id = 'CTT'), 'POST_RUN', - 250.00, - 400.00, - 425.00, + 200.00, + 300.00, + 350.00, 1, @validity_period_id ); @@ -52191,9 +51634,429 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), + (SELECT id FROM node WHERE external_mapping_id = 'Jeantet'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Fuqin'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'HKMBP'), (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + 'SEA', + 5000.00, + 5500.00, + 6000.00, + 45, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Hangzhou'), + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), + 'ROAD', + 372.00, + 535.00, + 562.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + 'SEA', + 10303.00, + 16885.00, + 17614.00, + 18, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + 'SEA', + 10311.00, + 16897.00, + 17627.00, + 18, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), + 'SEA', + 9751.00, + 16002.00, + 16692.00, + 17, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + 'SEA', + 6025.00, + 9640.00, + 10342.00, + 11, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + 'SEA', + 10347.00, + 16955.00, + 17688.00, + 18, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + 'SEA', + 10355.00, + 16968.00, + 17702.00, + 18, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), + 'SEA', + 9795.00, + 16072.00, + 16765.00, + 17, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + 'SEA', + 6069.00, + 9710.00, + 10417.00, + 11, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), (SELECT id FROM node WHERE external_mapping_id = 'LZZ'), 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + (SELECT id FROM node WHERE external_mapping_id = 'Urban Rolo'), + 'POST_RUN', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'JJ'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Jinjiang'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'LX'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Linfen'), + (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Linfen'), + (SELECT id FROM node WHERE external_mapping_id = 'CNTGS'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Pune'), + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Pune'), + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT'), + 'ROAD', + 200.00, + 300.00, + 350.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Pune'), + (SELECT id FROM node WHERE external_mapping_id = 'INMAA'), + 'ROAD', 250.00, 400.00, 425.00, @@ -52211,12 +52074,113 @@ INSERT INTO container_rate ( lead_time, validity_period_id ) VALUES ( - (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), - (SELECT id FROM node WHERE external_mapping_id = 'Urban Rolo'), - 'POST_RUN', - 250.00, - 400.00, - 425.00, + (SELECT id FROM node WHERE external_mapping_id = 'Qingdao'), + (SELECT id FROM node WHERE external_mapping_id = 'CNTAO'), + 'ROAD', + 100.00, + 160.00, + 170.00, 1, @validity_period_id - ); \ No newline at end of file + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Shanghai'), + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), + 'ROAD', + 127.00, + 144.00, + 147.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Taicang'), + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), + 'ROAD', + 183.00, + 263.00, + 276.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Xiamen'), + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN'), + 'ROAD', + 118.00, + 129.00, + 131.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Yangzhong'), + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA'), + 'ROAD', + 394.00, + 570.00, + 599.00, + 1, + @validity_period_id + ); + +INSERT INTO container_rate ( + from_node_id, + to_node_id, + container_rate_type, + rate_teu, + rate_feu, + rate_hc, + lead_time, + validity_period_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Yantian'), + (SELECT id FROM node WHERE external_mapping_id = 'CNYTN'), + 'ROAD', + 264.00, + 423.00, + 449.00, + 1, + @validity_period_id + ); + diff --git a/src/test/resources/master_data/premises.sql b/src/test/resources/master_data/premises.sql index ac05519..f5a8d55 100644 --- a/src/test/resources/master_data/premises.sql +++ b/src/test/resources/master_data/premises.sql @@ -53,7 +53,7 @@ VALUES ((SELECT id FROM material WHERE part_number = '28152640129'), 'G', 2, TRUE, - FALSE, + TRUE, NOW()); SET @premise_id_1 = LAST_INSERT_ID(); @@ -103,7 +103,7 @@ VALUES ((SELECT id FROM material WHERE part_number = '28152640129'), 'G', 1, TRUE, - FALSE, + TRUE, DATE_SUB(NOW(), INTERVAL 3 MONTH)); SET @premiseId2 = LAST_INSERT_ID(); @@ -152,7 +152,7 @@ VALUES ((SELECT id FROM material WHERE part_number = '8222640822'), 'G', 3, TRUE, - FALSE, + TRUE, NOW()); SET @premiseId3 = LAST_INSERT_ID(); @@ -202,7 +202,7 @@ VALUES ((SELECT id FROM material WHERE part_number = '8222640822'), 'G', 1, TRUE, - FALSE, + TRUE, NOW()); SET @premiseId4 = LAST_INSERT_ID(); @@ -251,7 +251,7 @@ VALUES ((SELECT id FROM material WHERE part_number = '8222640822'), 'KG', 1, TRUE, - FALSE, + TRUE, NOW()); SET @premiseId5 = LAST_INSERT_ID(); @@ -301,7 +301,7 @@ VALUES ((SELECT id FROM material WHERE part_number = '3064540201'), 'KG', 1, TRUE, - FALSE, + TRUE, NOW()); SET @premiseId6 = LAST_INSERT_ID(); @@ -351,7 +351,7 @@ VALUES ((SELECT id FROM material WHERE part_number = '3064540201'), 'KG', 4, TRUE, - FALSE, + TRUE, NOW()); SET @premiseId7 = LAST_INSERT_ID(); @@ -401,7 +401,7 @@ VALUES ((SELECT id FROM material WHERE part_number = '28152640129'), 'G', 8, TRUE, - FALSE, + TRUE, NOW()); SET @premiseId8 = LAST_INSERT_ID(); @@ -451,7 +451,7 @@ VALUES ((SELECT id FROM material WHERE part_number = '28152640129'), 'G', 1, TRUE, - FALSE, + TRUE, NOW()); SET @premiseId9 = LAST_INSERT_ID();