From 438fabefb944aefb499e2e87cc6c0b18aaae5860 Mon Sep 17 00:00:00 2001 From: Jan Date: Fri, 11 Jul 2025 20:32:04 +0200 Subject: [PATCH] Added MaterialControllerIntegrationTest Fixed all errors related to these tests. --- .../controller/GlobalExceptionHandler.java | 21 + .../configuration/MaterialController.java | 10 +- .../material/view/MaterialDetailDTO.java | 27 +- .../view/MaterialDetailPackagingDTO.java | 2 + .../avatic/lcc/dto/generic/DimensionDTO.java | 1 + .../avatic/lcc/dto/generic/MaterialDTO.java | 2 + .../de/avatic/lcc/dto/generic/NodeDTO.java | 1 + .../lcc/repositories/MaterialRepository.java | 39 +- .../lcc/repositories/NodeRepository.java | 14 +- .../PackagingDimensionRepository.java | 19 +- .../PackagingPropertiesRepository.java | 4 +- .../users/UserNodeRepository.java | 2 +- .../lcc/service/access/MaterialService.java | 7 +- .../material/MaterialDetailTransformer.java | 2 + .../CountryControllerIntegrationTest.java | 11 + .../MaterialControllerIntegrationTest.java | 415 +++ .../countries_properties-cleanup.sql | 15 - .../material_packaging-cleanup.sql | 15 + .../master_data/material_packaging.sql | 575 ++++ .../resources/master_data/nodes-cleanup.sql | 9 + src/test/resources/master_data/nodes.sql | 2513 +++++++++++++++++ 21 files changed, 3651 insertions(+), 53 deletions(-) create mode 100644 src/test/java/de/avatic/lcc/controller/configuration/MaterialControllerIntegrationTest.java create mode 100644 src/test/resources/master_data/material_packaging-cleanup.sql create mode 100644 src/test/resources/master_data/material_packaging.sql create mode 100644 src/test/resources/master_data/nodes-cleanup.sql create mode 100644 src/test/resources/master_data/nodes.sql diff --git a/src/main/java/de/avatic/lcc/controller/GlobalExceptionHandler.java b/src/main/java/de/avatic/lcc/controller/GlobalExceptionHandler.java index 9ac22c6..ddf6cc3 100644 --- a/src/main/java/de/avatic/lcc/controller/GlobalExceptionHandler.java +++ b/src/main/java/de/avatic/lcc/controller/GlobalExceptionHandler.java @@ -10,6 +10,7 @@ import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import java.util.HashMap; import java.util.Map; @@ -63,6 +64,26 @@ public class GlobalExceptionHandler { } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public ResponseEntity handleConstraintViolation(MethodArgumentTypeMismatchException exception) { // + + ErrorDTO error = new ErrorDTO( + exception.getClass().getSimpleName(), + "Wrong Datatype", + exception.getMessage(), + new HashMap<>() {{ + put("errorMessage", exception.getMessage()); + put("stackTrace", exception.getStackTrace()); + }} + ); + + return new ResponseEntity<>(new ErrorResponseDTO(error), HttpStatus.BAD_REQUEST); + } + + + @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity handleConstraintViolation(ConstraintViolationException exception) { // diff --git a/src/main/java/de/avatic/lcc/controller/configuration/MaterialController.java b/src/main/java/de/avatic/lcc/controller/configuration/MaterialController.java index c566487..e97be42 100644 --- a/src/main/java/de/avatic/lcc/controller/configuration/MaterialController.java +++ b/src/main/java/de/avatic/lcc/controller/configuration/MaterialController.java @@ -4,14 +4,18 @@ import de.avatic.lcc.dto.configuration.material.view.MaterialDetailDTO; import de.avatic.lcc.dto.generic.MaterialDTO; import de.avatic.lcc.repositories.pagination.SearchQueryResult; import de.avatic.lcc.service.access.MaterialService; +import jakarta.validation.constraints.Min; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Optional; @RestController @RequestMapping("/api/materials") +@Validated public class MaterialController { @@ -33,9 +37,9 @@ public class MaterialController { */ @GetMapping("/") public ResponseEntity> listMaterials( - @RequestParam(defaultValue = "20") int limit, - @RequestParam(defaultValue = "0") int page, - @RequestParam(required = false, defaultValue = "") String filter) { + @RequestParam(defaultValue = "20") @Min(1) int limit, + @RequestParam(defaultValue = "1") @Min(1) int page, + @RequestParam(required = false) Optional filter) { SearchQueryResult materials = materialService.listMaterial(filter, page, limit); diff --git a/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailDTO.java index 544b62f..7609ec6 100644 --- a/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailDTO.java @@ -11,6 +11,9 @@ public class MaterialDetailDTO { @JsonProperty("part_number") private String partNumber; + @JsonProperty("normalized_part_number") + private String normalizedPartNumber; + private String name; @JsonProperty("hs_code") @@ -19,6 +22,9 @@ public class MaterialDetailDTO { @JsonProperty("packaging") private List handlingUnits; + @JsonProperty("is_deprecated") + private boolean isDeprecated; + public MaterialDetailDTO() { } @@ -66,11 +72,12 @@ public class MaterialDetailDTO { this.hsCode = hsCode; } - @JsonProperty("handling_units") + @JsonProperty("packaging") public List getHandlingUnits() { return handlingUnits; } + @JsonProperty("packaging") public void setHandlingUnits(List handlingUnits) { this.handlingUnits = handlingUnits; } @@ -102,4 +109,22 @@ public class MaterialDetailDTO { public int hashCode() { return Objects.hash(id, partNumber, name, hsCode, handlingUnits); } + + public String getNormalizedPartNumber() { + return normalizedPartNumber; + } + + public void setNormalizedPartNumber(String normalizedPartNumber) { + this.normalizedPartNumber = normalizedPartNumber; + } + + @JsonProperty("is_deprecated") + public boolean isDeprecated() { + return isDeprecated; + } + + @JsonProperty("is_deprecated") + public void setDeprecated(boolean deprecated) { + isDeprecated = deprecated; + } } \ No newline at end of file diff --git a/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailPackagingDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailPackagingDTO.java index 67f0d20..2d6f56e 100644 --- a/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailPackagingDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailPackagingDTO.java @@ -40,10 +40,12 @@ public class MaterialDetailPackagingDTO { this.id = id; } + @JsonProperty("is_deprecated") public Boolean getDeprecated() { return isDeprecated; } + @JsonProperty("is_deprecated") public void setDeprecated(Boolean deprecated) { isDeprecated = deprecated; } diff --git a/src/main/java/de/avatic/lcc/dto/generic/DimensionDTO.java b/src/main/java/de/avatic/lcc/dto/generic/DimensionDTO.java index 38af0d8..96036a0 100644 --- a/src/main/java/de/avatic/lcc/dto/generic/DimensionDTO.java +++ b/src/main/java/de/avatic/lcc/dto/generic/DimensionDTO.java @@ -103,6 +103,7 @@ public class DimensionDTO { this.contentUnitCount = contentUnitCount; } + @JsonProperty("is_deprecated") public Boolean getDeprecated() { return isDeprecated; } diff --git a/src/main/java/de/avatic/lcc/dto/generic/MaterialDTO.java b/src/main/java/de/avatic/lcc/dto/generic/MaterialDTO.java index 6ac5776..10c256f 100644 --- a/src/main/java/de/avatic/lcc/dto/generic/MaterialDTO.java +++ b/src/main/java/de/avatic/lcc/dto/generic/MaterialDTO.java @@ -11,6 +11,8 @@ public class MaterialDTO { @JsonProperty("part_number") private String partNumber; private String name; + + @JsonProperty("hs_code") private String hsCode; public MaterialDTO() { diff --git a/src/main/java/de/avatic/lcc/dto/generic/NodeDTO.java b/src/main/java/de/avatic/lcc/dto/generic/NodeDTO.java index d03e2c2..677ccfc 100644 --- a/src/main/java/de/avatic/lcc/dto/generic/NodeDTO.java +++ b/src/main/java/de/avatic/lcc/dto/generic/NodeDTO.java @@ -67,6 +67,7 @@ public class NodeDTO { this.types = types; } + @JsonProperty("is_deprecated") public Boolean getDeprecated() { return isDeprecated; } diff --git a/src/main/java/de/avatic/lcc/repositories/MaterialRepository.java b/src/main/java/de/avatic/lcc/repositories/MaterialRepository.java index 740e12a..e67d0ad 100644 --- a/src/main/java/de/avatic/lcc/repositories/MaterialRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/MaterialRepository.java @@ -51,9 +51,9 @@ public class MaterialRepository { queryBuilder.append(" AND is_deprecated = FALSE"); } if (filter != null) { - queryBuilder.append(" AND (name LIKE ? OR part_number LIKE ?) "); + queryBuilder.append(" AND (name LIKE ? OR part_number LIKE ? ) "); } - queryBuilder.append("ORDER BY normalized_part_number LIMIT ? OFFSET ?"); + queryBuilder.append(" ORDER BY normalized_part_number LIMIT ? OFFSET ?"); return queryBuilder.toString(); } @@ -81,17 +81,22 @@ public class MaterialRepository { } @Transactional - public SearchQueryResult listMaterials(String filter, boolean excludeDeprecated, SearchQueryPagination pagination) { + public SearchQueryResult listMaterials(Optional filter, boolean excludeDeprecated, SearchQueryPagination pagination) { - String query = buildQuery(filter, excludeDeprecated); + String query = buildQuery(filter.orElse(null), excludeDeprecated); - var materials = jdbcTemplate.query(query, new MaterialMapper(), - "%" + filter + "%", "%" + filter + "%", !excludeDeprecated, pagination.getLimit(), pagination.getOffset()); + var materials = filter.isPresent() ? + jdbcTemplate.query(query, new MaterialMapper(), + "%" + filter.get() + "%", "%" + filter.get() + "%", pagination.getLimit(), pagination.getOffset()) : + jdbcTemplate.query(query, new MaterialMapper(), + pagination.getLimit(), pagination.getOffset()); - Integer totalCount = jdbcTemplate.queryForObject( - buildCountQuery(filter, excludeDeprecated), - Integer.class, "%" + filter + "%", "%" + filter + "%", !excludeDeprecated - ); + String countQuery = buildCountQuery(filter.orElse(null), excludeDeprecated); + + Integer totalCount = filter.isPresent() ? + jdbcTemplate.queryForObject(countQuery, Integer.class, + "%" + filter.get() + "%", "%" + filter.get() + "%") : + jdbcTemplate.queryForObject(countQuery, Integer.class); return new SearchQueryResult<>(materials, pagination.getPage(), totalCount, pagination.getLimit()); } @@ -100,9 +105,12 @@ public class MaterialRepository { public Optional getById(Integer id) { String query = "SELECT * FROM material WHERE id = ? AND is_deprecated = FALSE"; - Material material = jdbcTemplate.queryForObject(query, new MaterialMapper(), id); + var material = jdbcTemplate.query(query, new MaterialMapper(), id); - return Optional.ofNullable(material); + if(material.isEmpty()) + return Optional.empty(); + + return Optional.ofNullable(material.getFirst()); } @Transactional @@ -125,9 +133,7 @@ public class MaterialRepository { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { - PreparedStatement ps = connection - .prepareStatement("INSERT INTO material (name, part_number, normalized_part_number, hs_code) VALUES (?, ?, ?, ?)", - Statement.RETURN_GENERATED_KEYS); + PreparedStatement ps = connection.prepareStatement("INSERT INTO material (name, part_number, normalized_part_number, hs_code) VALUES (?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS); ps.setString(1, material.getName()); // ps.setString(2, material.getPartNumber()); ps.setString(3, material.getNormalizedPartNumber()); @@ -136,8 +142,7 @@ public class MaterialRepository { }, keyHolder); - return Optional.ofNullable(!Objects.requireNonNull(keyHolder.getKeys()).isEmpty() ? ((Integer) keyHolder.getKeys().values().iterator().next()) - : null); + return Optional.ofNullable(!Objects.requireNonNull(keyHolder.getKeys()).isEmpty() ? ((Integer) keyHolder.getKeys().values().iterator().next()) : null); } diff --git a/src/main/java/de/avatic/lcc/repositories/NodeRepository.java b/src/main/java/de/avatic/lcc/repositories/NodeRepository.java index 8495c7d..2775f37 100644 --- a/src/main/java/de/avatic/lcc/repositories/NodeRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/NodeRepository.java @@ -27,8 +27,7 @@ public class NodeRepository { public Optional getById(Integer id) { 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 * FROM node WHERE node.id = ?"""; @@ -41,8 +40,7 @@ public class NodeRepository { String placeholders = String.join(",", Collections.nCopies(nodeIds.size(), "?")); 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 * FROM node WHERE node.id IN (?)"""; @@ -186,8 +184,7 @@ public class NodeRepository { public Optional getByExternalMappingId(String mappingId) { 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 * FROM node WHERE node.external_mapping_id = ?"""; @@ -385,6 +382,11 @@ public class NodeRepository { data.setIntermediate(rs.getBoolean("is_intermediate")); data.setPredecessorRequired(rs.getBoolean("predecessor_required")); + data.setGeoLat(rs.getBigDecimal("geo_lat")); + data.setGeoLng(rs.getBigDecimal("geo_lng")); + + data.setDeprecated(rs.getBoolean("is_deprecated")); + data.setNodePredecessors(getPredecessorsOf(data.getId())); data.setOutboundCountries(getOutboundCountriesOf(data.getId())); diff --git a/src/main/java/de/avatic/lcc/repositories/packaging/PackagingDimensionRepository.java b/src/main/java/de/avatic/lcc/repositories/packaging/PackagingDimensionRepository.java index fc72feb..e6baa31 100644 --- a/src/main/java/de/avatic/lcc/repositories/packaging/PackagingDimensionRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/packaging/PackagingDimensionRepository.java @@ -27,13 +27,15 @@ public class PackagingDimensionRepository { @Transactional public Optional getById(Integer id) { String query = """ - SELECT id, displayed_dimension_unit, displayed_weight_unit, width, length, height, - content_unit_count, type, is_deprecated - FROM packaging_dimension - WHERE packaging_dimension.id = ? AND packaging_dimension.is_deprecated = ?"""; + SELECT id, displayed_dimension_unit, displayed_weight_unit, width, length, height, + weight, content_unit_count, type, is_deprecated + FROM packaging_dimension + WHERE packaging_dimension.id = ? AND packaging_dimension.is_deprecated = false"""; - var dimension = jdbcTemplate.queryForObject(query, (rs, rowNum) -> { + //TODO: what if i need to get deprecated materials? + + var dimension = jdbcTemplate.query(query, (rs, rowNum) -> { var entity = new PackagingDimension(); entity.setId(rs.getInt("id")); @@ -48,10 +50,15 @@ public class PackagingDimensionRepository { entity.setHeight(rs.getInt("height")); entity.setLength(rs.getInt("length")); + entity.setContentUnitCount(rs.getInt("content_unit_count")); + return entity; }, id); - return Optional.ofNullable(dimension); + if(dimension.isEmpty()) + return Optional.empty(); + + return Optional.ofNullable(dimension.getFirst()); } public void update(PackagingDimension dimension) { diff --git a/src/main/java/de/avatic/lcc/repositories/packaging/PackagingPropertiesRepository.java b/src/main/java/de/avatic/lcc/repositories/packaging/PackagingPropertiesRepository.java index 8063828..bd4fde6 100644 --- a/src/main/java/de/avatic/lcc/repositories/packaging/PackagingPropertiesRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/packaging/PackagingPropertiesRepository.java @@ -26,7 +26,7 @@ public class PackagingPropertiesRepository { String query = """ SELECT property.id as id, property.property_value AS value, property.packaging_id as packaging_id, - type.name AS type_name, type.data_type AS type_data_type, type.is_required AS type_is_required, + type.id AS type_id, type.name AS type_name, type.data_type AS type_data_type, type.is_required AS type_is_required, type.external_mapping_id AS type_external_mapping_id, type.validation_rule AS type_validation_rule FROM packaging_property property LEFT JOIN packaging_property_type type ON property.packaging_property_type_id = type.id WHERE packaging_id = ?"""; @@ -37,7 +37,7 @@ public class PackagingPropertiesRepository { public Optional getByPackagingIdAndType(Integer id, String type) { String query = """ SELECT property.id as id, property.property_value AS value, property.packaging_id as packaging_id, - type.name AS type_name, type.data_type AS type_data_type, type.is_required AS type_is_required, + type.id AS type_id, type.name AS type_name, type.data_type AS type_data_type, type.is_required AS type_is_required, type.external_mapping_id AS type_external_mapping_id, type.validation_rule AS type_validation_rule FROM packaging_property property LEFT JOIN packaging_property_type type ON property.packaging_property_type_id = type.id WHERE packaging_id = ? AND type.external_mapping_id = ?"""; diff --git a/src/main/java/de/avatic/lcc/repositories/users/UserNodeRepository.java b/src/main/java/de/avatic/lcc/repositories/users/UserNodeRepository.java index 221d346..a2c9809 100644 --- a/src/main/java/de/avatic/lcc/repositories/users/UserNodeRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/users/UserNodeRepository.java @@ -77,7 +77,7 @@ public class UserNodeRepository { node.setAddress(rs.getString("address")); node.setGeoLat(rs.getBigDecimal("geo_lat")); node.setGeoLng(rs.getBigDecimal("geo_lng")); - node.setDeprecated(rs.getBoolean("deprecated")); + node.setDeprecated(rs.getBoolean("is_deprecated")); node.setCountryId(rs.getInt("country_id")); return node; diff --git a/src/main/java/de/avatic/lcc/service/access/MaterialService.java b/src/main/java/de/avatic/lcc/service/access/MaterialService.java index 772ddcd..d4cc71c 100644 --- a/src/main/java/de/avatic/lcc/service/access/MaterialService.java +++ b/src/main/java/de/avatic/lcc/service/access/MaterialService.java @@ -9,8 +9,11 @@ import de.avatic.lcc.repositories.pagination.SearchQueryResult; import de.avatic.lcc.service.transformer.generic.MaterialTransformer; import de.avatic.lcc.service.transformer.material.MaterialDetailTransformer; import de.avatic.lcc.util.exception.badrequest.MaterialNotFoundException; +import de.avatic.lcc.util.exception.badrequest.NotFoundException; import org.springframework.stereotype.Service; +import java.util.Optional; + /** * Service class responsible for managing materials. Provides functionality to * list, retrieve, and manipulate material data. Acts as a bridge between the @@ -44,7 +47,7 @@ public class MaterialService { * @param limit the maximum number of items per page * @return a {@link SearchQueryResult} containing a list of material DTOs and pagination details */ - public SearchQueryResult listMaterial(String filter, int page, int limit) { + public SearchQueryResult listMaterial(Optional filter, int page, int limit) { SearchQueryResult queryResult = materialRepository.listMaterials(filter, true, new SearchQueryPagination(page, limit)); return SearchQueryResult.map(queryResult, materialTransformer::toMaterialDTO); } @@ -57,7 +60,7 @@ public class MaterialService { * @throws MaterialNotFoundException if no material with the given ID is found */ public MaterialDetailDTO getMaterial(Integer id) { - return materialDetailTransformer.toMaterialDetailDTO(materialRepository.getById(id).orElseThrow(() -> new MaterialNotFoundException(id))); + return materialDetailTransformer.toMaterialDetailDTO(materialRepository.getById(id).orElseThrow(() -> new NotFoundException(NotFoundException.NotFoundType.MATERIAL,id.toString()))); } /** diff --git a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailTransformer.java index ef4a103..3cec5d9 100644 --- a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailTransformer.java +++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailTransformer.java @@ -35,9 +35,11 @@ public class MaterialDetailTransformer { dto.setId(entity.getId()); dto.setPartNumber(entity.getPartNumber()); + dto.setNormalizedPartNumber(entity.getNormalizedPartNumber()); dto.setName(entity.getName()); dto.setHsCode(entity.getHsCode()); dto.setHandlingUnits(packaging); + dto.setDeprecated(entity.getDeprecated()); return dto; diff --git a/src/test/java/de/avatic/lcc/controller/configuration/CountryControllerIntegrationTest.java b/src/test/java/de/avatic/lcc/controller/configuration/CountryControllerIntegrationTest.java index 5be2d3f..79b8683 100644 --- a/src/test/java/de/avatic/lcc/controller/configuration/CountryControllerIntegrationTest.java +++ b/src/test/java/de/avatic/lcc/controller/configuration/CountryControllerIntegrationTest.java @@ -92,6 +92,7 @@ public class CountryControllerIntegrationTest { } @Test + @DisplayName("get all countries without pagination") void allCountries() throws Exception { mockMvc.perform(get(BASE_URL + "/all")) .andExpect(status().isOk()) @@ -100,6 +101,7 @@ public class CountryControllerIntegrationTest { } @Test + @DisplayName("get all countries filtered by EMEA region") void allCountriesFilteredByEmea() throws Exception { mockMvc.perform(get(BASE_URL + "/all") .param("filter", "EMEA")) @@ -108,6 +110,7 @@ public class CountryControllerIntegrationTest { } @Test + @DisplayName("get country details by ID") void getCountryDetailsById() throws Exception { final String isoCode = "DE"; @@ -127,6 +130,7 @@ public class CountryControllerIntegrationTest { } @Test + @DisplayName("get country details by ISO code") void getCountryDetailsByIsoCode() throws Exception { final String isoCode = "US"; @@ -142,6 +146,7 @@ public class CountryControllerIntegrationTest { } @Test + @DisplayName("get country with specific property set") void getWithPropertySet() throws Exception { final String isoCode = "US"; Integer propertySetId = getExpiredPropertySet(); @@ -154,6 +159,7 @@ public class CountryControllerIntegrationTest { } @Test + @DisplayName("get country with invalid property set should return bad request") void getWithBadPropertySet() throws Exception { final String isoCode = "US"; Integer propertySetId = 999999; @@ -170,18 +176,21 @@ public class CountryControllerIntegrationTest { } @Test + @DisplayName("get country with invalid ID should return bad request") void getCountryWithBadId() throws Exception { mockMvc.perform(get(BASE_URL + "/999")) .andExpect(status().isBadRequest()); } @Test + @DisplayName("get country with invalid ISO code should return bad request") void getCountryWithBadIsoCode() throws Exception { mockMvc.perform(get(BASE_URL + "/XY")) .andExpect(status().isBadRequest()); } @Test + @DisplayName("get countries with invalid pagination parameters should return bad request") void countriesPaginationWithBadParams() throws Exception { mockMvc.perform(get(BASE_URL + "/") .param("limit", "-1") @@ -190,6 +199,7 @@ public class CountryControllerIntegrationTest { } @Test + @DisplayName("get countries with large pagination limit should return all countries") void countriesPaginationWithLargeParams() throws Exception { mockMvc.perform(get(BASE_URL + "/") .param("limit", "1000")) @@ -198,6 +208,7 @@ public class CountryControllerIntegrationTest { } @Test + @DisplayName("get countries with SQL injection attempt should be safe") void countriesSqlInjection() throws Exception { String maliciousFilter = "'; DROP TABLE country; --"; diff --git a/src/test/java/de/avatic/lcc/controller/configuration/MaterialControllerIntegrationTest.java b/src/test/java/de/avatic/lcc/controller/configuration/MaterialControllerIntegrationTest.java new file mode 100644 index 0000000..64f9c61 --- /dev/null +++ b/src/test/java/de/avatic/lcc/controller/configuration/MaterialControllerIntegrationTest.java @@ -0,0 +1,415 @@ +package de.avatic.lcc.controller.configuration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import de.avatic.lcc.dto.generic.MaterialDTO; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +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.http.MediaType; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.transaction.annotation.Transactional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +@DisplayName("MaterialController Integration Tests") +class MaterialControllerIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Nested + @DisplayName("GET /api/materials/ - List Materials") + @Sql(scripts = {"classpath:master_data/countries_properties.sql", "classpath:master_data/nodes.sql", "classpath:master_data/material_packaging.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/material_packaging-cleanup.sql", "classpath:master_data/nodes-cleanup.sql", "classpath:master_data/countries_properties-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + class ListMaterialsTests { + + @Test + @DisplayName("Should return all materials with default pagination") + void shouldReturnAllMaterialsWithDefaultPagination() throws Exception { + mockMvc.perform(get("/api/materials/") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$", hasSize(18))) // Based on the test data, we have 18 materials + .andExpect(header().string("X-Total-Count", "18")) + .andExpect(header().string("X-Page-Count", "1")) + .andExpect(header().string("X-Current-Page", "1")) + .andExpect(jsonPath("$", hasSize(18))) + .andExpect(jsonPath("$[0].part_number", notNullValue())) + .andExpect(jsonPath("$[0].name", notNullValue())) + .andExpect(jsonPath("$[0].hs_code", notNullValue())); + } + + @Test + @DisplayName("Should return materials with custom pagination") + void shouldReturnMaterialsWithCustomPagination() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("limit", "5") + .param("page", "1") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$", hasSize(5))) + .andExpect(header().string("X-Total-Count", "18")) + .andExpect(header().string("X-Page-Count", "4")) // 18 materials / 5 per page = 4 pages + .andExpect(header().string("X-Current-Page", "1")); + } + + @Test + @DisplayName("Should return second page of materials") + void shouldReturnSecondPageOfMaterials() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("limit", "10") + .param("page", "2") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$", hasSize(8))) // Second page should have 8 materials (18 - 10) + .andExpect(header().string("X-Total-Count", "18")) + .andExpect(header().string("X-Page-Count", "2")) + .andExpect(header().string("X-Current-Page", "2")); + } + + @Test + @DisplayName("Should filter materials by part number") + void shouldFilterMaterialsByPartNumber() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("filter", "28152640129") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$", hasSize(1))) + .andExpect(jsonPath("$[0].part_number", is("28152640129"))) + .andExpect(jsonPath("$[0].name", containsString("gearbox housing blank"))) + .andExpect(header().string("X-Total-Count", "1")) + .andExpect(header().string("X-Page-Count", "1")) + .andExpect(header().string("X-Current-Page", "1")); + } + + @Test + @DisplayName("Should filter materials by name") + void shouldFilterMaterialsByName() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("filter", "wheel") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$", hasSize(greaterThan(0)))) + .andExpect(jsonPath("$[*].name", everyItem(containsStringIgnoringCase("wheel")))); + } + + @Test + @DisplayName("Should return empty list when filter matches no materials") + void shouldReturnEmptyListWhenFilterMatchesNoMaterials() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("filter", "nonexistent") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$", hasSize(0))) + .andExpect(header().string("X-Total-Count", "0")) + .andExpect(header().string("X-Page-Count", "0")) + .andExpect(header().string("X-Current-Page", "1")); + } + + @Test + @DisplayName("Should handle empty filter parameter") + void shouldHandleEmptyFilterParameter() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("filter", "") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$", hasSize(18))) // Should return all materials + .andExpect(header().string("X-Total-Count", "18")); + } + + @Test + @DisplayName("Should handle out of bounds page number") + void shouldHandleOutOfBoundsPageNumber() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("page", "999") + .param("limit", "10") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$", hasSize(0))) // Should return empty list + .andExpect(header().string("X-Total-Count", "18")) + .andExpect(header().string("X-Current-Page", "999")); + } + + @Test + @DisplayName("Should handle negative page number") + void shouldHandleNegativePageNumber() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("page", "-1") + .param("limit", "10") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("Should handle large limit parameter") + void shouldHandleLargeLimitParameter() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("limit", "1000") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$", hasSize(18))) // Should return all available materials + .andExpect(header().string("X-Total-Count", "18")) + .andExpect(header().string("X-Page-Count", "1")); + } + } + + @Nested + @DisplayName("GET /api/materials/{id} - Get Material Details") + @Sql(scripts = {"classpath:master_data/countries_properties.sql", "classpath:master_data/nodes.sql", "classpath:master_data/material_packaging.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/material_packaging-cleanup.sql", "classpath:master_data/nodes-cleanup.sql", "classpath:master_data/countries_properties-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + class GetMaterialDetailsTests { + + @Test + @DisplayName("Should return material details for existing material") + void shouldReturnMaterialDetailsForExistingMaterial() throws Exception { + // First, get the list of materials to find a valid ID + MvcResult listResult = mockMvc.perform(get("/api/materials/") + .param("limit", "1")) + .andExpect(status().isOk()) + .andReturn(); + + var content = objectMapper.readValue(listResult.getResponse().getContentAsString(), MaterialDTO[].class); + assertThat(content.length).isEqualTo(1); + + mockMvc.perform(get("/api/materials/" + content[0].getId()) + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.id", notNullValue())) + .andExpect(jsonPath("$.part_number", notNullValue())) + .andExpect(jsonPath("$.name", notNullValue())) + .andExpect(jsonPath("$.hs_code", notNullValue())) + .andExpect(jsonPath("$.normalized_part_number", notNullValue())) + .andExpect(jsonPath("$.is_deprecated", notNullValue())); + } + + @Test + @DisplayName("Should return material details with correct data structure") + void shouldReturnMaterialDetailsWithCorrectDataStructure() throws Exception { + + MvcResult listResult = mockMvc.perform(get("/api/materials/") + .param("limit", "1") + .param("page", "3")) + .andExpect(status().isOk()) + .andReturn(); + + var content = objectMapper.readValue(listResult.getResponse().getContentAsString(), MaterialDTO[].class); + assertThat(content.length).isEqualTo(1); + + mockMvc.perform(get("/api/materials/" + content[0].getId()) + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.part_number", matchesPattern("\\d+"))) // Part numbers are numeric strings + .andExpect(jsonPath("$.normalized_part_number", matchesPattern("\\d+"))) // Normalized part numbers are numeric strings + .andExpect(jsonPath("$.hs_code", matchesPattern("\\d{8}"))) // HS codes are 8-digit strings + .andExpect(jsonPath("$.name", is(not(emptyString())))) + .andExpect(jsonPath("$.is_deprecated", isA(Boolean.class))); + } + + @Test + @DisplayName("Should return specific material details by known part number") + void shouldReturnSpecificMaterialDetailsByKnownPartNumber() throws Exception { + + MvcResult listResult = mockMvc.perform(get("/api/materials/") + .param("limit", "1").param("filter", "28152640129")) + .andExpect(status().isOk()) + .andReturn(); + + var content = objectMapper.readValue(listResult.getResponse().getContentAsString(), MaterialDTO[].class); + assertThat(content.length).isEqualTo(1); + + // We know from test data that material with part number '28152640129' exists + // We need to find its ID first or assume it has ID 1 + mockMvc.perform(get("/api/materials/" + content[0].getId()) + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.part_number", anyOf( + is("28152640129"), is("8222640822"), is("3064540201")))) // Any of the test materials + .andExpect(jsonPath("$.hs_code", anyOf( + is("84839089"), is("84312000"), is("84831095")))); // Corresponding HS codes + } + + @Test + @DisplayName("Should return 400 for non-existent material ID") + void shouldReturn404ForNonExistentMaterialId() throws Exception { + mockMvc.perform(get("/api/materials/99999") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("Should return 400 for negative material ID") + void shouldReturn404ForNegativeMaterialId() throws Exception { + mockMvc.perform(get("/api/materials/-1") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("Should return 400 for invalid material ID format") + void shouldReturn400ForInvalidMaterialIdFormat() throws Exception { + mockMvc.perform(get("/api/materials/invalid") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("Should return 400 for zero material ID") + void shouldReturn400ForZeroMaterialId() throws Exception { + mockMvc.perform(get("/api/materials/0") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isBadRequest()); // Assuming 0 is not a valid ID + } + } + + @Nested + @DisplayName("Error Handling and Edge Cases") + @Sql(scripts = {"classpath:master_data/countries_properties.sql", "classpath:master_data/nodes.sql", "classpath:master_data/material_packaging.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/material_packaging-cleanup.sql", "classpath:master_data/nodes-cleanup.sql", "classpath:master_data/countries_properties-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + class ErrorHandlingTests { + + @Test + @DisplayName("Should handle missing required headers") + void shouldHandleMissingRequiredHeaders() throws Exception { + mockMvc.perform(get("/api/materials/")) + .andDo(print()) + .andExpect(status().isOk()); // Should still work without explicit content type + } + + @Test + @DisplayName("Should handle invalid parameter types for limit") + void shouldHandleInvalidParameterTypesForLimit() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("limit", "invalid") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("Should handle invalid parameter types for page") + void shouldHandleInvalidParameterTypesForPage() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("page", "invalid") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("Should handle extremely large filter string") + void shouldHandleExtremelyLargeFilterString() throws Exception { + String largeFilter = "x".repeat(1000); + mockMvc.perform(get("/api/materials/") + .param("filter", largeFilter) + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", hasSize(0))); // Should return empty result + } + + @Test + @DisplayName("Should handle special characters in filter") + void shouldHandleSpecialCharactersInFilter() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("filter", "!@#$%^&*()") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", hasSize(0))); // Should return empty result + } + + @Test + @DisplayName("Should handle SQL injection attempts in filter") + void shouldHandleSqlInjectionAttemptsInFilter() throws Exception { + mockMvc.perform(get("/api/materials/") + .param("filter", "'; DROP TABLE material; --") + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", hasSize(0))); // Should return empty result and not break + } + } + + @Nested + @DisplayName("Performance and Load Tests") + class PerformanceTests { + + @Test + @DisplayName("Should handle concurrent requests efficiently") + @Sql(scripts = {"classpath:master_data/countries_properties.sql", "classpath:master_data/nodes.sql", "classpath:master_data/material_packaging.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/material_packaging-cleanup.sql", "classpath:master_data/nodes-cleanup.sql", "classpath:master_data/countries_properties-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + void shouldHandleConcurrentRequestsEfficiently() throws Exception { + // Simulate multiple concurrent requests + for (int i = 0; i < 10; i++) { + mockMvc.perform(get("/api/materials/") + .param("page", String.valueOf((i % 3) + 1)) + .param("limit", "5") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(header().exists("X-Total-Count")); + } + } + + @Test + @DisplayName("Should respond within reasonable time limits") + @Sql(scripts = {"classpath:master_data/countries_properties.sql", "classpath:master_data/nodes.sql", "classpath:master_data/material_packaging.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = {"classpath:master_data/material_packaging-cleanup.sql", "classpath:master_data/nodes-cleanup.sql", "classpath:master_data/countries_properties-cleanup.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + void shouldRespondWithinReasonableTimeLimits() throws Exception { + long startTime = System.currentTimeMillis(); + + mockMvc.perform(get("/api/materials/") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + + long endTime = System.currentTimeMillis(); + long responseTime = endTime - startTime; + + // Assert that response time is reasonable (less than 2 seconds) + assert responseTime < 2000 : "Response time too slow: " + responseTime + "ms"; + } + } +} \ No newline at end of file diff --git a/src/test/resources/master_data/countries_properties-cleanup.sql b/src/test/resources/master_data/countries_properties-cleanup.sql index b6a8138..a98a762 100644 --- a/src/test/resources/master_data/countries_properties-cleanup.sql +++ b/src/test/resources/master_data/countries_properties-cleanup.sql @@ -1,19 +1,4 @@ delete -from lcc_test.packaging_property -where 1; -delete -from lcc_test.packaging_property_type -where 1; -delete -from lcc_test.packaging -where 1; -delete -from lcc_test.packaging_dimension -where 1; -delete -from lcc_test.material -where 1; -delete from lcc_test.country_property where 1; delete diff --git a/src/test/resources/master_data/material_packaging-cleanup.sql b/src/test/resources/master_data/material_packaging-cleanup.sql new file mode 100644 index 0000000..a43f22c --- /dev/null +++ b/src/test/resources/master_data/material_packaging-cleanup.sql @@ -0,0 +1,15 @@ +delete +from lcc_test.packaging_property +where 1; +delete +from lcc_test.packaging_property_type +where 1; +delete +from lcc_test.packaging +where 1; +delete +from lcc_test.packaging_dimension +where 1; +delete +from lcc_test.material +where 1; \ No newline at end of file diff --git a/src/test/resources/master_data/material_packaging.sql b/src/test/resources/master_data/material_packaging.sql new file mode 100644 index 0000000..778a484 --- /dev/null +++ b/src/test/resources/master_data/material_packaging.sql @@ -0,0 +1,575 @@ + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('28152640129', '028152640129', '84839089', 'gearbox housing blank ''GR4H-10', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('8222640822', '008222640822', '84839089', 'planet gear carrier blank ''stage 1', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('3064540201', '003064540201', '84312000', 'wheel hub', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('8212640113', '008212640113', '84312000', 'transmission housing blank ''GR2E-04', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('28152643516', '028152643516', '84831095', 'wheel shaft blank', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('4222640104', '004222640104', '84139100', 'gearbox housing blank ''AK20E', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('28152643502', '028152643502', '84839089', 'wheel shaft blank', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('28152640804', '028152640804', '84839089', 'planet gear carrier blank ''staire 2', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('4222640805', '004222640805', '84139100', 'planet gear carrier blank ''staire 2', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('4222640803', '004222640803', '84139100', 'planet gear carrier blank ''stage 1', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('8212640811', '008212640811', '84839089', 'planet gear carrier blank', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('8212640827', '008212640827', '84312000', 'planet gear carrier blank ''Stufe 1', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('5512640104', '005512640104', '84312000', 'transmission housing blank', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('5512640106', '005512640106', '84312000', 'transmission housing blank', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('8263500575', '008263500575', '85015220', 'traction motor assy. ''AE18-10 left', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('8263500576', '008263500576', '85015220', 'traction motor assy. ''AE18-10 right', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('28523500575', '028523500575', '85015230', 'traction motor assy. ''AE35-10 links', FALSE); + +INSERT INTO material (part_number, normalized_part_number, hs_code, name, is_deprecated) +VALUES ('28523500576', '028523500576', '85015230', 'traction motor assy. ''AE35-10 rechts', FALSE); + + +-- ============================================ +-- Packaging Data Import SQL +-- ============================================ + +-- Zuerst die packaging_property_types für stackable und rust prevention erstellen +-- (falls sie noch nicht existieren) +INSERT INTO packaging_property_type (name, external_mapping_id, data_type, validation_rule, is_required) +VALUES + ('Stackable', 'STACKABLE', 'BOOLEAN', NULL, FALSE), + ('Rust Prevention', 'RUST_PREVENTION', 'BOOLEAN', NULL, FALSE) +ON DUPLICATE KEY UPDATE + name = VALUES(name), + data_type = VALUES(data_type); + +-- ============================================ +-- SHU Packaging Dimensions +-- ============================================ + +-- Part Number: 28152640129 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 7000, 7900, 'CM', 677000, 'KG', 1, FALSE); +SET @shu_dim_28152640129 = LAST_INSERT_ID(); + +-- Part Number: 8222640822 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 5200, 'CM', 942000, 'KG', 630, FALSE); +SET @shu_dim_8222640822 = LAST_INSERT_ID(); + +-- Part Number: 3064540201 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 5200, 'CM', 868000, 'KG', 160, FALSE); +SET @shu_dim_3064540201 = LAST_INSERT_ID(); + +-- Part Number: 8212640113 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 6500, 'CM', 702000, 'KG', 54, FALSE); +SET @shu_dim_8212640113 = LAST_INSERT_ID(); + +-- Part Number: 28152643516 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 4700, 'CM', 912000, 'KG', 60, FALSE); +SET @shu_dim_28152643516 = LAST_INSERT_ID(); + +-- Part Number: 4222640104 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 5700, 'CM', 1074000, 'KG', 400, FALSE); +SET @shu_dim_4222640104 = LAST_INSERT_ID(); + +-- Part Number: 28152643502 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 4700, 'CM', 912000, 'KG', 60, FALSE); +SET @shu_dim_28152643502 = LAST_INSERT_ID(); + +-- Part Number: 28152640804 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 4700, 'CM', 740000, 'KG', 48, FALSE); +SET @shu_dim_28152640804 = LAST_INSERT_ID(); + +-- Part Number: 4222640805 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 5700, 'CM', 912000, 'KG', 300, FALSE); +SET @shu_dim_4222640805 = LAST_INSERT_ID(); + +-- Part Number: 4222640803 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 5700, 'CM', 962000, 'KG', 320, FALSE); +SET @shu_dim_4222640803 = LAST_INSERT_ID(); + +-- Part Number: 8212640811 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 3400, 'CM', 962000, 'KG', 320, FALSE); +SET @shu_dim_8212640811 = LAST_INSERT_ID(); + +-- Part Number: 8212640827 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 3400, 'CM', 962000, 'KG', 320, FALSE); +SET @shu_dim_8212640827 = LAST_INSERT_ID(); + +-- Part Number: 5512640104 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 5700, 'CM', 1074000, 'KG', 400, FALSE); +SET @shu_dim_5512640104 = LAST_INSERT_ID(); + +-- Part Number: 5512640106 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 5700, 'CM', 1074000, 'KG', 400, FALSE); +SET @shu_dim_5512640106 = LAST_INSERT_ID(); + +-- Part Number: 8263500575 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 5200, 'CM', 1050000, 'KG', 600, FALSE); +SET @shu_dim_8263500575 = LAST_INSERT_ID(); + +-- Part Number: 8263500576 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 5200, 'CM', 1050000, 'KG', 600, FALSE); +SET @shu_dim_8263500576 = LAST_INSERT_ID(); + +-- Part Number: 28523500575 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 5200, 'CM', 1050000, 'KG', 600, FALSE); +SET @shu_dim_28523500575 = LAST_INSERT_ID(); + +-- Part Number: 28523500576 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('SHU', 12000, 8000, 5200, 'CM', 1050000, 'KG', 600, FALSE); +SET @shu_dim_28523500576 = LAST_INSERT_ID(); + +-- ============================================ +-- HU Packaging Dimensions +-- ============================================ + +-- Part Number: 28152640129 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 700, 790, 'MM', 677000, 'KG', 1, FALSE); +SET @hu_dim_28152640129 = LAST_INSERT_ID(); + +-- Part Number: 8222640822 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 520, 'MM', 942000, 'KG', 1, FALSE); +SET @hu_dim_8222640822 = LAST_INSERT_ID(); + +-- Part Number: 3064540201 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 520, 'MM', 868000, 'KG', 1, FALSE); +SET @hu_dim_3064540201 = LAST_INSERT_ID(); + +-- Part Number: 8212640113 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 650, 'MM', 702000, 'KG', 1, FALSE); +SET @hu_dim_8212640113 = LAST_INSERT_ID(); + +-- Part Number: 28152643516 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 470, 'MM', 912000, 'KG', 1, FALSE); +SET @hu_dim_28152643516 = LAST_INSERT_ID(); + +-- Part Number: 4222640104 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 570, 'MM', 1074000, 'KG', 1, FALSE); +SET @hu_dim_4222640104 = LAST_INSERT_ID(); + +-- Part Number: 28152643502 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 470, 'MM', 912000, 'KG', 1, FALSE); +SET @hu_dim_28152643502 = LAST_INSERT_ID(); + +-- Part Number: 28152640804 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 470, 'MM', 740000, 'KG', 1, FALSE); +SET @hu_dim_28152640804 = LAST_INSERT_ID(); + +-- Part Number: 4222640805 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 570, 'MM', 912000, 'KG', 1, FALSE); +SET @hu_dim_4222640805 = LAST_INSERT_ID(); + +-- Part Number: 4222640803 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 570, 'MM', 962000, 'KG', 1, FALSE); +SET @hu_dim_4222640803 = LAST_INSERT_ID(); + +-- Part Number: 8212640811 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 340, 'MM', 962000, 'KG', 1, FALSE); +SET @hu_dim_8212640811 = LAST_INSERT_ID(); + +-- Part Number: 8212640827 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 340, 'MM', 962000, 'KG', 1, FALSE); +SET @hu_dim_8212640827 = LAST_INSERT_ID(); + +-- Part Number: 5512640104 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 570, 'MM', 1074000, 'KG', 1, FALSE); +SET @hu_dim_5512640104 = LAST_INSERT_ID(); + +-- Part Number: 5512640106 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 570, 'MM', 1074000, 'KG', 1, FALSE); +SET @hu_dim_5512640106 = LAST_INSERT_ID(); + +-- Part Number: 8263500575 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 520, 'MM', 1050000, 'KG', 1, FALSE); +SET @hu_dim_8263500575 = LAST_INSERT_ID(); + +-- Part Number: 8263500576 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 520, 'MM', 1050000, 'KG', 1, FALSE); +SET @hu_dim_8263500576 = LAST_INSERT_ID(); + +-- Part Number: 28523500575 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 520, 'MM', 1050000, 'KG', 1, FALSE); +SET @hu_dim_28523500575 = LAST_INSERT_ID(); + +-- Part Number: 28523500576 +INSERT INTO packaging_dimension (type, length, width, height, displayed_dimension_unit, weight, displayed_weight_unit, content_unit_count, is_deprecated) +VALUES ('HU', 1200, 800, 520, 'MM', 1050000, 'KG', 1, FALSE); +SET @hu_dim_28523500576 = LAST_INSERT_ID(); + +-- ============================================ +-- Packaging Einträge +-- ============================================ + +-- Part Number: 28152640129 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '28152640129' LIMIT 1), + @hu_dim_28152640129, + @shu_dim_28152640129, + FALSE + ); +SET @packaging_28152640129 = LAST_INSERT_ID(); + +-- Part Number: 8222640822 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '8222640822' LIMIT 1), + @hu_dim_8222640822, + @shu_dim_8222640822, + FALSE + ); +SET @packaging_8222640822 = LAST_INSERT_ID(); + +-- Part Number: 3064540201 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '3064540201' LIMIT 1), + @hu_dim_3064540201, + @shu_dim_3064540201, + FALSE + ); +SET @packaging_3064540201 = LAST_INSERT_ID(); + +-- Part Number: 8212640113 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '8212640113' LIMIT 1), + @hu_dim_8212640113, + @shu_dim_8212640113, + FALSE + ); +SET @packaging_8212640113 = LAST_INSERT_ID(); + +-- Part Number: 28152643516 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '28152643516' LIMIT 1), + @hu_dim_28152643516, + @shu_dim_28152643516, + FALSE + ); +SET @packaging_28152643516 = LAST_INSERT_ID(); + +-- Part Number: 4222640104 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '4222640104' LIMIT 1), + @hu_dim_4222640104, + @shu_dim_4222640104, + FALSE + ); +SET @packaging_4222640104 = LAST_INSERT_ID(); + +-- Part Number: 28152643502 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '28152643502' LIMIT 1), + @hu_dim_28152643502, + @shu_dim_28152643502, + FALSE + ); +SET @packaging_28152643502 = LAST_INSERT_ID(); + +-- Part Number: 28152640804 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '28152640804' LIMIT 1), + @hu_dim_28152640804, + @shu_dim_28152640804, + FALSE + ); +SET @packaging_28152640804 = LAST_INSERT_ID(); + +-- Part Number: 4222640805 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '4222640805' LIMIT 1), + @hu_dim_4222640805, + @shu_dim_4222640805, + FALSE + ); +SET @packaging_4222640805 = LAST_INSERT_ID(); + +-- Part Number: 4222640803 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '4222640803' LIMIT 1), + @hu_dim_4222640803, + @shu_dim_4222640803, + FALSE + ); +SET @packaging_4222640803 = LAST_INSERT_ID(); + +-- Part Number: 8212640811 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '8212640811' LIMIT 1), + @hu_dim_8212640811, + @shu_dim_8212640811, + FALSE + ); +SET @packaging_8212640811 = LAST_INSERT_ID(); + +-- Part Number: 8212640827 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '8212640827' LIMIT 1), + @hu_dim_8212640827, + @shu_dim_8212640827, + FALSE + ); +SET @packaging_8212640827 = LAST_INSERT_ID(); + +-- Part Number: 5512640104 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '5512640104' LIMIT 1), + @hu_dim_5512640104, + @shu_dim_5512640104, + FALSE + ); +SET @packaging_5512640104 = LAST_INSERT_ID(); + +-- Part Number: 5512640106 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '5512640106' LIMIT 1), + @hu_dim_5512640106, + @shu_dim_5512640106, + FALSE + ); +SET @packaging_5512640106 = LAST_INSERT_ID(); + +-- Part Number: 8263500575 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '8263500575' LIMIT 1), + @hu_dim_8263500575, + @shu_dim_8263500575, + FALSE + ); +SET @packaging_8263500575 = LAST_INSERT_ID(); + +-- Part Number: 8263500576 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '8263500576' LIMIT 1), + @hu_dim_8263500576, + @shu_dim_8263500576, + FALSE + ); +SET @packaging_8263500576 = LAST_INSERT_ID(); + +-- Part Number: 28523500575 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '28523500575' LIMIT 1), + @hu_dim_28523500575, + @shu_dim_28523500575, + FALSE + ); +SET @packaging_28523500575 = LAST_INSERT_ID(); + +-- Part Number: 28523500576 +INSERT INTO packaging (supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated) +VALUES ( + (SELECT id FROM node WHERE name = 'Linde (China) Forklift Truck (Supplier)' LIMIT 1), + (SELECT id FROM material WHERE part_number = '28523500576' LIMIT 1), + @hu_dim_28523500576, + @shu_dim_28523500576, + FALSE + ); +SET @packaging_28523500576 = LAST_INSERT_ID(); + +-- ============================================ +-- Packaging Properties +-- ============================================ + +-- Stackable und Rust Prevention Property Type IDs ermitteln +SET @stackable_type_id = (SELECT id FROM packaging_property_type WHERE external_mapping_id = 'STACKABLE' LIMIT 1); +SET @rust_prevention_type_id = (SELECT id FROM packaging_property_type WHERE external_mapping_id = 'RUST_PREVENTION' LIMIT 1); + +-- Part Number: 28152640129 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_28152640129, 'true'), + (@rust_prevention_type_id, @packaging_28152640129, 'false'); + +-- Part Number: 8222640822 - Stackable: No, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_8222640822, 'false'), + (@rust_prevention_type_id, @packaging_8222640822, 'false'); + +-- Part Number: 3064540201 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_3064540201, 'true'), + (@rust_prevention_type_id, @packaging_3064540201, 'false'); + +-- Part Number: 8212640113 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_8212640113, 'true'), + (@rust_prevention_type_id, @packaging_8212640113, 'false'); + +-- Part Number: 28152643516 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_28152643516, 'true'), + (@rust_prevention_type_id, @packaging_28152643516, 'false'); + +-- Part Number: 4222640104 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_4222640104, 'true'), + (@rust_prevention_type_id, @packaging_4222640104, 'false'); + +-- Part Number: 28152643502 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_28152643502, 'true'), + (@rust_prevention_type_id, @packaging_28152643502, 'false'); + +-- Part Number: 28152640804 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_28152640804, 'true'), + (@rust_prevention_type_id, @packaging_28152640804, 'false'); + +-- Part Number: 4222640805 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_4222640805, 'true'), + (@rust_prevention_type_id, @packaging_4222640805, 'false'); + +-- Part Number: 4222640803 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_4222640803, 'true'), + (@rust_prevention_type_id, @packaging_4222640803, 'false'); + +-- Part Number: 8212640811 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_8212640811, 'true'), + (@rust_prevention_type_id, @packaging_8212640811, 'false'); + +-- Part Number: 8212640827 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_8212640827, 'true'), + (@rust_prevention_type_id, @packaging_8212640827, 'false'); + +-- Part Number: 5512640104 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_5512640104, 'true'), + (@rust_prevention_type_id, @packaging_5512640104, 'false'); + +-- Part Number: 5512640106 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_5512640106, 'true'), + (@rust_prevention_type_id, @packaging_5512640106, 'false'); + +-- Part Number: 8263500575 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_8263500575, 'true'), + (@rust_prevention_type_id, @packaging_8263500575, 'false'); + +-- Part Number: 8263500576 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_8263500576, 'true'), + (@rust_prevention_type_id, @packaging_8263500576, 'false'); + +-- Part Number: 28523500575 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_28523500575, 'true'), + (@rust_prevention_type_id, @packaging_28523500575, 'false'); + +-- Part Number: 28523500576 - Stackable: Yes, Rust Prevention: No +INSERT INTO packaging_property (packaging_property_type_id, packaging_id, property_value) +VALUES + (@stackable_type_id, @packaging_28523500576, 'true'), + (@rust_prevention_type_id, @packaging_28523500576, 'false'); diff --git a/src/test/resources/master_data/nodes-cleanup.sql b/src/test/resources/master_data/nodes-cleanup.sql new file mode 100644 index 0000000..54746a3 --- /dev/null +++ b/src/test/resources/master_data/nodes-cleanup.sql @@ -0,0 +1,9 @@ +delete +from lcc_test.node_predecessor_entry +where 1; +delete +from lcc_test.node_predecessor_chain +where 1; +delete +from lcc_test.node +where 1; diff --git a/src/test/resources/master_data/nodes.sql b/src/test/resources/master_data/nodes.sql new file mode 100644 index 0000000..0159bd4 --- /dev/null +++ b/src/test/resources/master_data/nodes.sql @@ -0,0 +1,2513 @@ + +-- Node 1: Xiamen +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 1, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Xiamen (Metropolitan area)', + '89 Jinshang Rd, Siming District, Xiamen, Fujian, China, 361009', + 'Xiamen', + false, + false, + false, + true, + 24.4890, + 118.1478 + ); + +-- Node 2: Shanghai +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 2, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Shanghai (Metropolitan area)', + '6FJP+77M, Ninghai Rd (E), Huangpu, Shanghai, China, 200002', + 'Shanghai', + false, + false, + false, + true, + 31.2308, + 121.4858 + ); + +-- Node 3: Hangzhou +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 3, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Hangzhou (Metropolitan area)', + 'Long Hewan Cookshop, 朝晖地区 Xia Cheng Qu, Hang Zhou Shi, Zhe Jiang Sheng, China, 310014', + 'Hangzhou', + false, + false, + false, + true, + 30.2904, + 120.1701 + ); + +-- Node 4: Yangzhong +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 4, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Yangzhong (Metropolitan area)', + 'Yangzhong, Zhenjiang, Jiangsu, China', + 'Yangzhong', + false, + false, + false, + true, + 32.2370, + 119.7810 + ); + +-- Node 5: Taicang +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 5, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Taicang (Metropolitan area)', + 'Taicang, Suzhou, Jiangsu, China', + 'Taicang', + false, + false, + false, + true, + 31.4500, + 121.1000 + ); + +-- Node 6: Jinjiang +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 6, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Jinjiang (Metropolitan area)', + 'Jinjiang, Quanzhou, Fujian, China', + 'Jinjiang', + false, + false, + false, + true, + 24.8180, + 118.5514 + ); + +-- Node 7: Qingdao +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 7, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Qingdao (Metropolitan area)', + 'Qingdao, Shandong, China', + 'Qingdao', + false, + false, + false, + true, + 36.0986, + 120.3719 + ); + +-- Node 8: Fuqin +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 8, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Fuqing (Metropolitan area)', + 'Fuqing, Fuzhou, Fujian, China', + 'Fuqin', + false, + false, + false, + true, + 25.7213, + 119.3842 + ); + +-- Node 9: Linfen +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 9, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Linfen (Metropolitan area)', + 'Linfen, Shanxi, China', + 'Linfen', + false, + false, + false, + true, + 36.0880, + 111.5189 + ); + +-- Node 10: Yantian +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 10, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Yantian (Metropolitan area)', + 'Yantian District, Shenzhen, Guangdong, China', + 'Yantian', + false, + false, + false, + true, + 22.5881, + 114.2370 + ); + +-- Node 11: Bangalore +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 11, + (SELECT id FROM country WHERE iso_code = 'IN'), + 'Bangalore (Metropolitan area)', + 'Bengaluru, Karnataka, India', + 'Bangalore', + false, + false, + false, + true, + 12.9716, + 77.5946 + ); + +-- Node 12: Chennai +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 12, + (SELECT id FROM country WHERE iso_code = 'IN'), + 'Chennai (Metropolitan area)', + 'Chennai, Tamil Nadu, India', + 'Chennai', + false, + false, + false, + true, + 13.0827, + 80.2707 + ); + +-- Node 13: Pune +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 13, + (SELECT id FROM country WHERE iso_code = 'IN'), + 'Pune (Metropolitan area)', + '201, Solitaire Business Hub, Opp. Viman Nagar, Pune-Nagar Road, Viman Nagar, Pune, Maharashtra 411014, India', + 'Pune', + false, + false, + false, + true, + 18.5679, + 73.9143 + ); + +-- Node 14: Shenzhen +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 14, + (SELECT id FROM country WHERE iso_code = 'IN'), + 'Shenzhen (Metropolitan area)', + 'Shenzhen, Guangdong, China', + 'Shenzhen', + false, + false, + false, + true, + 22.5431, + 114.0579 + ); + +-- Node 15: Aurangabad +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 15, + (SELECT id FROM country WHERE iso_code = 'IN'), + 'Aurangabad (Metropolitan area)', + 'Aurangabad, Maharashtra, India', + 'Aurangabad', + false, + false, + false, + true, + 19.8762, + 75.3433 + ); + +-- Node 16: LX (Linde China) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 16, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Linde (China) Forklift Truck (Supplier)', + 'Linde (China) Forklift Truck Corp. Ltd. + 1258 Gonghexin Road + 闸北区, 上海市 200070 + People''s Republic of China', + 'LX', + false, + false, + true, + false, + 31.2872, + 121.4581 + ); + +-- Node 17: JJ (KION Baoli) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 17, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'KION Baoli (Jiangsu) Forklift Co., Ltd.', + 'KION Baoli (Jiangsu) Forklift Co., Ltd. + No. 88 Gangkou Avenue, Jingjiang Economic Development Zone + Jingjiang City, Jiangsu Province 214500 + People''s Republic of China', + 'JJ', + false, + false, + true, + false, + 32.0140, + 120.2692 + ); + +-- Node 18: ExM (Expeditors Mumbai) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 18, + (SELECT id FROM country WHERE iso_code = 'IN'), + 'Expeditors Mumbai (Warehouse)', + 'A-501 Delphi, Hiranandani Business Park, Powai, Mumbai 400076', + 'ExM', + false, + false, + true, + true, + 19.1176, + 72.9060 + ); + +-- Node 19: AB (Aschaffenburg) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 19, + (SELECT id FROM country WHERE iso_code = 'DE'), + 'Aschaffenburg (KION plant)', + 'Thüngenstraße 1, 63743 Aschaffenburg, Germany', + 'AB', + false, + true, + true, + false, + 49.9763, + 9.1432 + ); + +-- Node 20: HH (Hamburg) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 20, + (SELECT id FROM country WHERE iso_code = 'DE'), + 'Hamburg (KION plant)', + 'EUROGATE Container Terminal Hamburg GmbH, Predöhlkai 1, 20457 Hamburg, Germany', + 'HH', + true, + true, + true, + false, + 53.5488, + 9.9872 + ); + +-- Node 21: FGG (Geisa) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 21, + (SELECT id FROM country WHERE iso_code = 'DE'), + 'Geisa (KION plant)', + 'Porsche-Allee 1, 04356 Leipzig, Germany', + 'FGG', + false, + true, + true, + false, + 51.3412, + 12.3747 + ); + +-- Node 22: KWS (Reutlingen) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 22, + (SELECT id FROM country WHERE iso_code = 'DE'), + 'Reutlingen (KION plant)', + 'Frankfurt am Main International Airport (FRA), 60547 Frankfurt am Main, Germany', + 'KWS', + false, + true, + true, + false, + 50.0379, + 8.5622 + ); + +-- Node 23: EGD (Dinklage) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 23, + (SELECT id FROM country WHERE iso_code = 'DE'), + 'Dinklage (KION plant)', + 'Konrad-Zuse-Platz 8, 70173 Stuttgart, Germany', + 'EGD', + false, + true, + true, + false, + 48.7771, + 9.1807 + ); + +-- Node 24: CTT (Châtellerault) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 24, + (SELECT id FROM country WHERE iso_code = 'FR'), + 'Châtellerault (KION plant)', + 'Cologne Bonn Airport, Kennedystraße, 51147 Cologne, Germany', + 'CTT', + false, + true, + true, + false, + 50.8660, + 7.1427 + ); + +-- Node 25: LZZ (Luzzara) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 25, + (SELECT id FROM country WHERE iso_code = 'IT'), + 'Luzzara', + 'Berlin Brandenburg Airport Willy Brandt (BER), Melli-Beese-Ring 1, 12529 Schönefeld, Germany', + 'LZZ', + false, + true, + true, + false, + 52.3667, + 13.5033 + ); + +-- Node 26: STR (Stříbro) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 26, + (SELECT id FROM country WHERE iso_code = 'CZ'), + 'Stříbro (KION plant)', + 'Munich Airport, Nordallee 25, 85356 Munich, Germany', + 'STR', + false, + true, + true, + false, + 48.3538, + 11.7861 + ); + +-- Node 27: VOP (Nový Jičín) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 27, + (SELECT id FROM country WHERE iso_code = 'CZ'), + 'Nový Jičín (KION plant)', + 'Düsseldorf Airport, Flughafenstraße 120, 40474 Düsseldorf, Germany', + 'VOP', + false, + true, + true, + false, + 51.2895, + 6.7668 + ); + +-- Node 28: KOL (Kołbaskowo) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 28, + (SELECT id FROM country WHERE iso_code = 'PL'), + 'Kołbaskowo (KION plant)', + 'Nuremberg Airport, Flughafenstraße 100, 90411 Nuremberg, Germany', + 'KOL', + false, + true, + true, + false, + 49.4987, + 11.0669 + ); + +-- Node 29: LiPo (Český Krumlov) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 29, + (SELECT id FROM country WHERE iso_code = 'CZ'), + 'Český Krumlov (KION plant)', + 'Bremen Airport, Flughafenallee 20, 28199 Bremen, Germany', + 'LiPo', + false, + true, + true, + false, + 53.0473, + 8.7867 + ); + +-- Node 30: Zbůch +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 30, + (SELECT id FROM country WHERE iso_code = 'CZ'), + 'Urban Zbůch (Warehouse)', + 'Expeditors Germany GmbH, Building 606, Hamburg Airport, 22335 Hamburg, Germany', + 'Zbůch', + false, + false, + true, + true, + 53.6304, + 9.9881 + ); + +-- Node 31: Urban Wörth +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 31, + (SELECT id FROM country WHERE iso_code = 'DE'), + 'Urban Wörth am Main (Warehouse)', + 'Charles de Gaulle Airport, 95700 Roissy-en-France, France', + 'Urban Wörth', + false, + false, + true, + true, + 49.0097, + 2.5479 + ); + +-- Node 32: Urban AB +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 32, + (SELECT id FROM country WHERE iso_code = 'DE'), + 'Urban Aschaffenburg (Warehouse)', + 'Lyon–Saint-Exupéry Airport, 69125 Colombier-Saugnieu, France', + 'Urban AB', + false, + false, + true, + true, + 45.7256, + 5.0811 + ); + +-- Node 33: Pfaff Rade +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 33, + (SELECT id FROM country WHERE iso_code = 'DE'), + 'Pfaff Rade (Warehouse)', + 'Marseille Provence Airport, 13727 Marignane, France', + 'Pfaff Rade', + false, + false, + true, + true, + 43.4393, + 5.2214 + ); + +-- Node 34: Bat3 +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 34, + (SELECT id FROM country WHERE iso_code = 'FR'), + 'Geodis bâtiment 3 (Warehouse)', + 'Toulouse–Blagnac Airport, 31703 Blagnac, France', + 'Bat3', + false, + false, + true, + true, + 43.6291, + 1.3678 + ); + +-- Node 35: Jeantet +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 35, + (SELECT id FROM country WHERE iso_code = 'FR'), + 'Jeantet Ouest (Warehouse)', + 'Nice Côte d''Azur Airport, 06206 Nice, France', + 'Jeantet', + false, + false, + true, + true, + 43.6658, + 7.2155 + ); + +-- Node 36: Urban Rolo +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 36, + (SELECT id FROM country WHERE iso_code = 'IT'), + 'Urban Rolo I (Warehouse)', + 'Bordeaux–Mérignac Airport, 33700 Mérignac, France', + 'Urban Rolo', + false, + false, + true, + true, + 44.8283, + -0.7156 + ); + +-- Node 37: CNSHA (Shanghai Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 37, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Shanghai (Port)', + 'Nantes Atlantique Airport, 44346 Bouguenais, France', + 'CNSHA', + false, + false, + false, + true, + 47.1532, + -1.6107 + ); + +-- Node 38: CNTAO (Qingdao Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 38, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Qingdao (Port)', + 'Expeditors France, 7 Avenue Didier Daurat, 31400 Toulouse, France', + 'CNTAO', + false, + false, + false, + true, + 43.6334, + 1.3822 + ); + +-- Node 39: CNTGS (Tangshan Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 39, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Tangshan (Port)', + 'Milan Malpensa Airport, 21010 Ferno, Province of Varese, Italy', + 'CNTGS', + false, + false, + false, + true, + 45.6306, + 8.7281 + ); + +-- Node 40: CNXMN (Xiamen Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 40, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Xiamen (Port)', + 'Leonardo da Vinci International Airport, Via dell'' Aeroporto di Fiumicino, 320, 00054 Fiumicino, Metropolitan City of Rome, Italy', + 'CNXMN', + false, + false, + false, + true, + 41.8003, + 12.2389 + ); + +-- Node 41: CNYTN (Yantian Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 41, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Yantian (Port)', + 'Naples International Airport, Via Pierluigi da Palestrina, 80144 Naples, Metropolitan City of Naples, Italy', + 'CNYTN', + false, + false, + false, + true, + 40.8860, + 14.2908 + ); + +-- Node 42: INJNPT (Jawaharlal Nehru Port Trust) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 42, + (SELECT id FROM country WHERE iso_code = 'IN'), + 'Jawaharlal Nehru Port Trust (Port)', + 'Turin Airport, Strada Aeroporto, 12, 10072 Caselle Torinese, Metropolitan City of Turin, Italy', + 'INJNPT', + false, + false, + false, + true, + 45.2008, + 7.6497 + ); + +-- Node 43: DEHAM (Hamburg Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 43, + (SELECT id FROM country WHERE iso_code = 'DE'), + 'Hamburg (Port)', + 'Falcone-Borsellino Airport, 90045 Cinisi, Metropolitan City of Palermo, Italy', + 'DEHAM', + false, + false, + false, + true, + 38.1756, + 13.0919 + ); + +-- Node 44: FRLEH (Le Havre Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 44, + (SELECT id FROM country WHERE iso_code = 'FR'), + 'Le Havre (Port)', + 'Bologna Guglielmo Marconi Airport, Via Triumvirato, 84, 40132 Bologna, Metropolitan City of Bologna, Italy', + 'FRLEH', + false, + false, + false, + true, + 44.5354, + 11.2887 + ); + +-- Node 45: BEZEE (Zeebrugge Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 45, + (SELECT id FROM country WHERE iso_code = 'BE'), + 'Zeebrugge (Port)', + 'Expeditors Italy s.r.l., Via Giovanni Keplero, 6, 20124 Milan, Metropolitan City of Milan, Italy', + 'BEZEE', + false, + false, + false, + true, + 45.4972, + 9.2319 + ); + +-- Node 46: INMAA (Chennai Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 46, + (SELECT id FROM country WHERE iso_code = 'IN'), + 'Chennai (Port)', + 'Václav Havel Airport Prague, 160 08 Prague 6, Czechia', + 'INMAA', + false, + false, + false, + true, + 50.1008, + 14.2632 + ); + +-- Node 47: HKMBP (Hong Kong Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 47, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Hong Kong (Port)', + 'Brno–Tuřany Airport, 627 00 Brno-Tuřany, Czechia', + 'HKMBP', + false, + false, + false, + true, + 49.1513, + 16.6944 + ); + +-- Node 48: ITGOA (Genoa Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 48, + (SELECT id FROM country WHERE iso_code = 'IT'), + 'Genoa (Port)', + 'Leoš Janáček Airport Ostrava, 742 51 Mošnov, Czechia', + 'ITGOA', + false, + false, + false, + true, + 49.6963, + 18.1111 + ); + +-- Node 49: CNSZX (Shenzhen Port) +INSERT INTO node ( + id, + country_id, + name, + address, + external_mapping_id, + predecessor_required, + is_destination, + is_source, + is_intermediate, + geo_lat, + geo_lng +) VALUES ( + 49, + (SELECT id FROM country WHERE iso_code = 'CN'), + 'Shenzhen (Port)', + 'Expeditors Czech Republic s.r.o., Tupolevova 665/17, 199 00 Prague 18-Letňany, Czechia', + 'CNSZX', + false, + false, + false, + true, + 50.1220, + 14.5169 + ); + +-- SQL INSERT-Statements für node_predecessor_chain und node_predecessor_entry +-- Generiert aus Lastenheft_Requirements Appendix C_Vorknoten.csv +-- 51 Predecessor-Ketten + +-- Predecessor Chain 1: CTT +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CTT') + ); + +SET @chain_id_1 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Bat3'), + @chain_id_1, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), + @chain_id_1, + 2 + ); + +-- Predecessor Chain 2: CTT +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CTT') + ); + +SET @chain_id_2 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Jeantet'), + @chain_id_2, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), + @chain_id_2, + 2 + ); + +-- Predecessor Chain 3: CTT +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CTT') + ); + +SET @chain_id_3 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'FRLEH'), + @chain_id_3, + 1 + ); + +-- Predecessor Chain 4: CTT +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CTT') + ); + +SET @chain_id_4 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), + @chain_id_4, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + @chain_id_4, + 2 + ); + +-- Predecessor Chain 5: AB +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'AB') + ); + +SET @chain_id_5 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), + @chain_id_5, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_5, + 2 + ); + +-- Predecessor Chain 6: AB +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'AB') + ); + +SET @chain_id_6 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Urban Wörth'), + @chain_id_6, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + @chain_id_6, + 2 + ); + +-- Predecessor Chain 7: AB +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'AB') + ); + +SET @chain_id_7 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), + @chain_id_7, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + @chain_id_7, + 2 + ); + +-- Predecessor Chain 8: AB +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'AB') + ); + +SET @chain_id_8 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + @chain_id_8, + 1 + ); + +-- Predecessor Chain 9: FGG +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'FGG') + ); + +SET @chain_id_9 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), + @chain_id_9, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + @chain_id_9, + 2 + ); + +-- Predecessor Chain 10: FGG +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'FGG') + ); + +SET @chain_id_10 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + @chain_id_10, + 1 + ); + +-- Predecessor Chain 11: KWS +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'KWS') + ); + +SET @chain_id_11 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), + @chain_id_11, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + @chain_id_11, + 2 + ); + +-- Predecessor Chain 12: KWS +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'KWS') + ); + +SET @chain_id_12 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + @chain_id_12, + 1 + ); + +-- Predecessor Chain 13: EGD +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'EGD') + ); + +SET @chain_id_13 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Pfaff Rade'), + @chain_id_13, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_13, + 2 + ); + +-- Predecessor Chain 14: EGD +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'EGD') + ); + +SET @chain_id_14 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_14, + 1 + ); + +-- Predecessor Chain 15: LZZ +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'LZZ') + ); + +SET @chain_id_15 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), + @chain_id_15, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + @chain_id_15, + 2 + ); + +-- Predecessor Chain 16: LZZ +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'LZZ') + ); + +SET @chain_id_16 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Urban Rolo'), + @chain_id_16, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Urban AB'), + @chain_id_16, + 2 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'BEZEE'), + @chain_id_16, + 3 + ); + +-- Predecessor Chain 17: LZZ +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'LZZ') + ); + +SET @chain_id_17 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Urban Rolo'), + @chain_id_17, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + @chain_id_17, + 2 + ); + +-- Predecessor Chain 18: LZZ +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'LZZ') + ); + +SET @chain_id_18 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ITGOA'), + @chain_id_18, + 1 + ); + +-- Predecessor Chain 19: STR +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'STR') + ); + +SET @chain_id_19 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Zbůch'), + @chain_id_19, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_19, + 2 + ); + +-- Predecessor Chain 20: STR +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'STR') + ); + +SET @chain_id_20 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_20, + 1 + ); + +-- Predecessor Chain 21: VOP +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'VOP') + ); + +SET @chain_id_21 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Zbůch'), + @chain_id_21, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_21, + 2 + ); + +-- Predecessor Chain 22: VOP +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'VOP') + ); + +SET @chain_id_22 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_22, + 1 + ); + +-- Predecessor Chain 23: KOL +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'KOL') + ); + +SET @chain_id_23 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_23, + 1 + ); + +-- Predecessor Chain 24: LiPo +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'LiPo') + ); + +SET @chain_id_24 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Zbůch'), + @chain_id_24, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_24, + 2 + ); + +-- Predecessor Chain 25: LiPo +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'LiPo') + ); + +SET @chain_id_25 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_25, + 1 + ); + +-- Predecessor Chain 26: HH +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'HH') + ); + +SET @chain_id_26 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_26, + 1 + ); + +-- Predecessor Chain 27: HH +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'HH') + ); + +SET @chain_id_27 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Pfaff Rade'), + @chain_id_27, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'DEHAM'), + @chain_id_27, + 2 + ); + +-- Predecessor Chain 28: CNXMN +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN') + ); + +SET @chain_id_28 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Xiamen'), + @chain_id_28, + 1 + ); + +-- Predecessor Chain 29: CNSHA +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA') + ); + +SET @chain_id_29 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Shanghai'), + @chain_id_29, + 1 + ); + +-- Predecessor Chain 30: CNSHA +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA') + ); + +SET @chain_id_30 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Hangzhou'), + @chain_id_30, + 1 + ); + +-- Predecessor Chain 31: CNSHA +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA') + ); + +SET @chain_id_31 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Yangzhong'), + @chain_id_31, + 1 + ); + +-- Predecessor Chain 32: CNSHA +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNSHA') + ); + +SET @chain_id_32 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Taicang'), + @chain_id_32, + 1 + ); + +-- Predecessor Chain 33: CNXMN +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN') + ); + +SET @chain_id_33 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Jinjiang'), + @chain_id_33, + 1 + ); + +-- Predecessor Chain 34: CNTAO +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNTAO') + ); + +SET @chain_id_34 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Qingdao'), + @chain_id_34, + 1 + ); + +-- Predecessor Chain 35: CNXMN +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN') + ); + +SET @chain_id_35 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Fuqin'), + @chain_id_35, + 1 + ); + +-- Predecessor Chain 36: CNTAO +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNTAO') + ); + +SET @chain_id_36 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Linfen'), + @chain_id_36, + 1 + ); + +-- Predecessor Chain 37: CNTGS +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNTGS') + ); + +SET @chain_id_37 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Linfen'), + @chain_id_37, + 1 + ); + +-- Predecessor Chain 38: CNYTN +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNYTN') + ); + +SET @chain_id_38 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Yantian'), + @chain_id_38, + 1 + ); + +-- Predecessor Chain 39: INMAA +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INMAA') + ); + +SET @chain_id_39 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Bangalore'), + @chain_id_39, + 1 + ); + +-- Predecessor Chain 40: INJNPT +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT') + ); + +SET @chain_id_40 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), + @chain_id_40, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Bangalore'), + @chain_id_40, + 2 + ); + +-- Predecessor Chain 41: INJNPT +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT') + ); + +SET @chain_id_41 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), + @chain_id_41, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Pune'), + @chain_id_41, + 2 + ); + +-- Predecessor Chain 42: INJNPT +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT') + ); + +SET @chain_id_42 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Pune'), + @chain_id_42, + 1 + ); + +-- Predecessor Chain 43: INMAA +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INMAA') + ); + +SET @chain_id_43 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Chennai'), + @chain_id_43, + 1 + ); + +-- Predecessor Chain 44: INJNPT +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT') + ); + +SET @chain_id_44 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), + @chain_id_44, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Chennai'), + @chain_id_44, + 2 + ); + +-- Predecessor Chain 45: INJNPT +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT') + ); + +SET @chain_id_45 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), + @chain_id_45, + 1 + ); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Aurangabad'), + @chain_id_45, + 2 + ); + +-- Predecessor Chain 46: INJNPT +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT') + ); + +SET @chain_id_46 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Aurangabad'), + @chain_id_46, + 1 + ); + +-- Predecessor Chain 47: CNXMN +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN') + ); + +SET @chain_id_47 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'LX'), + @chain_id_47, + 1 + ); + +-- Predecessor Chain 48: INJNPT +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'INJNPT') + ); + +SET @chain_id_48 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'ExM'), + @chain_id_48, + 1 + ); + +-- Predecessor Chain 49: CNXMN +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNXMN') + ); + +SET @chain_id_49 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'JJ'), + @chain_id_49, + 1 + ); + +-- Predecessor Chain 50: HKMBP +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'HKMBP') + ); + +SET @chain_id_50 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Shenzhen'), + @chain_id_50, + 1 + ); + +-- Predecessor Chain 51: CNSZX +INSERT INTO node_predecessor_chain ( + node_id +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'CNSZX') + ); + +SET @chain_id_51 = LAST_INSERT_ID(); + +INSERT INTO node_predecessor_entry ( + node_id, + node_predecessor_chain_id, + sequence_number +) VALUES ( + (SELECT id FROM node WHERE external_mapping_id = 'Shenzhen'), + @chain_id_51, + 1 + ); +