diff --git a/CHANGELOG.md b/CHANGELOG.md
index d8499387..4ef2e51b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,88 @@ The **need for configuration updates** is **marked bold**.
### Added
+* Added backend implementation to CRUD Demand and Capacity
+ Notifications ([#415](https://github.com/eclipse-tractusx/puris/pull/415))
+* Added ERP response interface ([#418](https://github.com/eclipse-tractusx/puris/pull/418))
+
+### Changed
+
+* Fixed check when answering delivery information request from a customer which prevented always to
+ answer ([#435](https://github.com/eclipse-tractusx/puris/pull/435))
+
+### Removed
+
+N.A.
+
+### Known Knowns
+
+#### Security
+
+The Backend is currently secured via API Key while the Frontend already uses an API-KEY.
+See [Admin Guide](./docs/admin/Admin_Guide.md) for further information.
+
+#### Upgradeability
+
+As currently no active user was known migrations of data are not yet supported. The chart technically is upgradeable.
+
+#### Data Sovereignty
+
+For productive use the following enhancements are encouraged
+
+* User FrontEnd available: Role Company Admin is able to query catalogue and see negotiations and transfers
+ But company rules / policies need to be configured upfront in backend (via postman) to enable automatic contract
+ negotiations, responsibility lies with Company Admin role
+ --> add section in the User Manual describing this and the (legal) importance and responsibility behind defining these
+ rules
+* Currently only one standard policy per reg. connector / customer instance is supported (more precisely one for DTR,
+ one for all submodels), negotiation happens automatically based on this
+ --> enhance option to select partner and define specific policies (to be planned in context of BPDM Integration)
+ --> UI for specific configuration by dedicated role (e.g. Comp Admin) and more flexible policy configuration (without
+ code changes) is needed
+* As a non-Admin user I do not have ability to view policies in detail --> transparency for users when interacting with
+ and requesting / consuming data via dashboard / views on underlying usage policies to be enhanced
+* ContractReference Constraint or configuration of policies specific to one partner only not implemented -->
+ clarification of potential reference to "PURIS standard contract" and enabling of ContractReference for 24.08.
+* unclear meaning of different stati in negotations --> add view of successfull contract agreeements wrt which data have
+ been closed
+* current logging only done on info level --> enhance logging of policies (currently only available at debug level)
+* in case of non-matching policies (tested in various scenarios) no negotiation takes place -->
+ **enhance visualization or specific Error message to user**
+* no validation of the Schema "profile": "cx-policy:profile2405" (required to ensure interop with other PURIS apps)
+
+#### Styleguide
+
+Overall
+
+* Brief description at the top of each page describing content would be nice for better user experience.
+
+Dashboard
+
+* Similar for Create Delivery (here SOME entries are reset but warnings stay) (**block**)
+
+Stocks
+
+* user needs better guidance to click on a stock to update it (else error prone to enter one
+ slightly different attribute and Add instead of update)
+* Refresh -- update request has been sent successfully. -> more information regarding data transfer needed for user
+
+Catalog
+
+* No action possible -> unclear to user when and how user will consume an offer
+
+Negotiations
+
+* Add filters for transparency (bpnl, state)
+
+## [v2.0.1](https://github.com/eclipse-tractusx/puris/releases/tag/2.0.1)
+
+The following Changelog lists the changes. Please refer to the [documentation](docs/README.md) for configuration needs
+and understanding the concept changes.
+
+The **need for configuration updates** is **marked bold**.
+
+### Added
+
* Added Footer
### Changed
diff --git a/README.md b/README.md
index 1b0260c6..7cadc14c 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ Beside the dependencies provided in the Helm Chart, the following dependencies h
| Application | App Version | Chart Version |
|-------------------------------------------------------------------------------------------------------------------|-------------|---------------|
-| [Tractus-X Connector](https://github.com/eclipse-tractusx/tractusx-edc/tree/main/charts/tractusx-connector) | 0.7.2 | 0.7.2 |
+| [Tractus-X Connector](https://github.com/eclipse-tractusx/tractusx-edc/tree/main/charts/tractusx-connector) | 0.7.1 | 0.7.1 |
| [Digital Twin Registry](https://github.com/eclipse-tractusx/sldt-digital-twin-registry/tree/main/charts/registry) | 0.4.3 | 0.4.11 |
## Known Knows
diff --git a/backend/pom.xml b/backend/pom.xml
index 85cb0e63..bf7d3f26 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -33,7 +33,7 @@
org.eclipse.tractusx.puris
puris-backend
- 2.0.1
+ 2.0.2
puris-backend
PURIS Backend
diff --git a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiController.java b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiController.java
index 55f7e4fe..fcbf7b28 100644
--- a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiController.java
+++ b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiController.java
@@ -66,7 +66,7 @@ public ResponseEntity getDeliveryMapping(
log.warn("Rejecting request at Delivery Information Submodel request 2.0.0 endpoint");
return ResponseEntity.badRequest().build();
}
-
+
if (!"$value".equals(representation)) {
log.warn("Rejecting request at Delivery Information Submodel request 2.0.0 endpoint, missing '$value' in request");
if (!PatternStore.NON_EMPTY_NON_VERTICAL_WHITESPACE_PATTERN.matcher(representation).matches()) {
@@ -75,8 +75,11 @@ public ResponseEntity getDeliveryMapping(
log.warn("Received " + representation + " from " + bpnl);
return ResponseEntity.status(501).build();
}
+
+ log.info("Received request for " + materialNumberCx + " from " + bpnl);
var samm = deliveryRequestApiSrvice.handleDeliverySubmodelRequest(bpnl, materialNumberCx);
if (samm == null) {
+ log.error("SAMM for delivery is null, return 500.");
return ResponseEntity.status(500).build();
}
return ResponseEntity.ok(samm);
diff --git a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/domain/model/Delivery.java b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/domain/model/Delivery.java
index 4d478433..409fcfe2 100644
--- a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/domain/model/Delivery.java
+++ b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/domain/model/Delivery.java
@@ -25,7 +25,6 @@
import jakarta.validation.constraints.Pattern;
import lombok.*;
import lombok.experimental.SuperBuilder;
-
import org.eclipse.tractusx.puris.backend.common.domain.model.measurement.ItemUnitEnumeration;
import org.eclipse.tractusx.puris.backend.common.util.PatternStore;
import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Material;
@@ -108,23 +107,23 @@ public boolean equals(Object o) {
final Delivery that = (Delivery) o;
return this.getMaterial().getOwnMaterialNumber().equals(that.getMaterial().getOwnMaterialNumber()) &&
- this.getPartner().getUuid().equals(that.getPartner().getUuid()) &&
- this.getTrackingNumber().equals(that.getTrackingNumber()) &&
- this.getIncoterm().equals(that.getIncoterm()) &&
- this.getDestinationBpns().equals(that.getDestinationBpns()) &&
- this.getDestinationBpna().equals(that.getDestinationBpna()) &&
- this.getOriginBpns().equals(that.getOriginBpns()) &&
- this.getOriginBpna().equals(that.getOriginBpna()) &&
- this.getDateOfDeparture().equals(that.getDateOfDeparture()) &&
- this.getDateOfArrival().equals(that.getDateOfArrival()) &&
- this.getDepartureType().equals(that.getDepartureType()) &&
- this.getArrivalType().equals(that.getArrivalType()) &&
- this.getIncoterm().equals(that.getIncoterm()) &&
- (
- Objects.equals(this.getCustomerOrderNumber(), that.getCustomerOrderNumber()) &&
+ this.getPartner().getUuid().equals(that.getPartner().getUuid()) &&
+ Objects.equals(this.getTrackingNumber(), that.getTrackingNumber()) &&
+ this.getIncoterm().equals(that.getIncoterm()) &&
+ this.getDestinationBpns().equals(that.getDestinationBpns()) &&
+ this.getDestinationBpna().equals(that.getDestinationBpna()) &&
+ this.getOriginBpns().equals(that.getOriginBpns()) &&
+ this.getOriginBpna().equals(that.getOriginBpna()) &&
+ this.getDateOfDeparture().equals(that.getDateOfDeparture()) &&
+ this.getDateOfArrival().equals(that.getDateOfArrival()) &&
+ this.getDepartureType().equals(that.getDepartureType()) &&
+ this.getArrivalType().equals(that.getArrivalType()) &&
+ this.getIncoterm().equals(that.getIncoterm()) &&
+ (
+ Objects.equals(this.getCustomerOrderNumber(), that.getCustomerOrderNumber()) &&
Objects.equals(this.getCustomerOrderPositionNumber(), that.getCustomerOrderPositionNumber()) &&
Objects.equals(this.getSupplierOrderNumber(), that.getSupplierOrderNumber())
- );
+ );
}
@Override
diff --git a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/logic/service/DeliveryRequestApiService.java b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/logic/service/DeliveryRequestApiService.java
index 11eb0919..b9ecfc97 100644
--- a/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/logic/service/DeliveryRequestApiService.java
+++ b/backend/src/main/java/org/eclipse/tractusx/puris/backend/delivery/logic/service/DeliveryRequestApiService.java
@@ -24,9 +24,12 @@
import lombok.extern.slf4j.Slf4j;
import org.eclipse.tractusx.puris.backend.common.edc.domain.model.SubmodelType;
import org.eclipse.tractusx.puris.backend.common.edc.logic.service.EdcAdapterService;
+import org.eclipse.tractusx.puris.backend.delivery.domain.model.DeliveryResponsibilityEnumeration;
+import org.eclipse.tractusx.puris.backend.delivery.domain.model.OwnDelivery;
import org.eclipse.tractusx.puris.backend.delivery.logic.adapter.DeliveryInformationSammMapper;
import org.eclipse.tractusx.puris.backend.delivery.logic.dto.deliverysamm.DeliveryInformation;
import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Material;
+import org.eclipse.tractusx.puris.backend.masterdata.domain.model.MaterialPartnerRelation;
import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Partner;
import org.eclipse.tractusx.puris.backend.masterdata.logic.service.MaterialPartnerRelationService;
import org.eclipse.tractusx.puris.backend.masterdata.logic.service.MaterialService;
@@ -35,7 +38,9 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.util.List;
import java.util.Optional;
+import java.util.function.Predicate;
@Service
@Slf4j
@@ -68,15 +73,33 @@ public DeliveryInformation handleDeliverySubmodelRequest(String bpnl, String mat
}
Material material = materialService.findByMaterialNumberCx(materialNumberCx);
+ MaterialPartnerRelation mpr = mprService.findByPartnerAndPartnerCXNumber(partner, materialNumberCx);
+
if (material == null) {
// Could not identify partner cx number. I.e. we do not have that partner's
// CX id in one of our MaterialPartnerRelation entities. Try to fix this by
// looking for MPR's, where that partner is a supplier and where we don't have
// a partnerCXId yet. Of course this can only work if there was previously an MPR
// created, but for some unforeseen reason, the initial PartTypeRetrieval didn't succeed.
- log.warn("Could not find " + materialNumberCx + " from partner " + partner.getBpnl());
- mprService.triggerPartTypeRetrievalTask(partner);
- material = materialService.findByMaterialNumberCx(materialNumberCx);
+ // Sidenote: This still means that the ShellDescriptor has not been created and someone tries to access our
+ // api without using the href from DTR
+ if (mpr == null) {
+ log.warn("Could not find " + materialNumberCx + " from partner " + partner.getBpnl());
+ log.warn("ATTENTION: PARTNER WITH BPNL {} ACCESSED THE SERVICE FOR A MATERIAL WITHOUT SHELL DESCRIPTOR " +
+ "IN DTR. THIS MIGHT BE A SECURITY ISSUE!", partner.getBpnl());
+ mprService.triggerPartTypeRetrievalTask(partner);
+ // check if cx id is now given
+ mpr = mprService.findByPartnerAndPartnerCXNumber(partner, materialNumberCx);
+ if (mpr == null) {
+ log.error("No material partner relation for BPNL '{}' and material global asset id '{}'." +
+ "Abort answering delivery request.",
+ partner.getBpnl(),
+ materialNumberCx
+ );
+ return null;
+ }
+ }
+ material = mpr.getMaterial();
}
if (material == null) {
@@ -84,13 +107,43 @@ public DeliveryInformation handleDeliverySubmodelRequest(String bpnl, String mat
return null;
}
- var mpr = mprService.find(material,partner);
- if (mpr == null || !mpr.isPartnerSuppliesMaterial()) {
+ // if the material number cx has been defined by us, we're returning information as an supplier
+ // that means our partner is acting as customer
+ // search mpr again by partner and material to have one mpr at hand independent of partner role
+ boolean partnerIsCustomer = material.getMaterialNumberCx().equals(materialNumberCx);
+ mpr = mprService.find(material, partner);
+ if (mpr == null ||
+ (partnerIsCustomer && !mpr.isPartnerBuysMaterial()) ||
+ (!partnerIsCustomer && !mpr.isPartnerSuppliesMaterial())
+ ) {
// only send an answer if partner is registered as supplier
+ log.warn(
+ "Partner acts as role '{}' but tried to access data for material number cx '{}' for the " +
+ "opposite role '{}'. Returning no data at all.",
+ partnerIsCustomer ? "Customer" : "Supplier",
+ materialNumberCx,
+ partnerIsCustomer ? "Supplier" : "Customer"
+ );
return null;
}
- var currentDeliveries = ownDeliveryService.findAllByFilters(Optional.of(material.getOwnMaterialNumber()), Optional.empty(), Optional.of(partner.getBpnl()));
+ List currentDeliveries = ownDeliveryService.findAllByFilters(
+ Optional.of(material.getOwnMaterialNumber()),
+ Optional.empty(),
+ Optional.of(partner.getBpnl())
+ );
+
+ Predicate parnterRoleDirectionPredicate = partnerRoleDirectionPredicate(partnerIsCustomer, mpr);
+ currentDeliveries = currentDeliveries.stream().filter(
+ parnterRoleDirectionPredicate
+ ).toList();
+ log.debug(
+ "Found '{}' deliveries for material number cx '{}' for partner with bpnl '{}' asking in role '{}'.",
+ currentDeliveries.size(),
+ materialNumberCx,
+ bpnl,
+ partnerIsCustomer ? "Customer" : "Supplier"
+ );
return sammMapper.ownDeliveryToSamm(currentDeliveries, partner, material);
}
@@ -126,4 +179,38 @@ public void doReportedDeliveryRequest(Partner partner, Material material) {
log.error("Error in Reported Deliveries Request for " + material.getOwnMaterialNumber() + " and partner " + partner.getBpnl(), e);
}
}
+
+ /**
+ * filters OwnDelivery entities to be returned to a partner based on his role
+ *
+ * Based on accuracy the following rules apply:
+ *
use role derived from cx id and incoterm responsibility
+ * use mpr role, if only one is present and no incoterms are given
+ *
+ * @param partnerIsCustomer to use as role in combination with incoterms (derived from material number cx)
+ * @param mpr to check the supplies / orders relation in case of missing incoterms
+ * @return Predicate returning true if incoterms and role match or no incoterm but only one role on mpr is given, else false
+ */
+ public static Predicate partnerRoleDirectionPredicate(boolean partnerIsCustomer, MaterialPartnerRelation mpr) {
+ return delivery -> {
+ // return all, if no incoterm is set but partner only acts in one role
+ if (delivery.getIncoterm() == null) {
+ // unlikely that we have a mpr without any role set but then we also don't return something
+ if (mpr.isPartnerBuysMaterial() && mpr.isPartnerSuppliesMaterial()) {
+ return false;
+ } else return mpr.isPartnerBuysMaterial() || mpr.isPartnerSuppliesMaterial();
+ }
+
+ // if we have incoterms set, filter more sophisticatedly based on responsbility of incoterms and role
+ // derived from material number cx
+ DeliveryResponsibilityEnumeration responsibility = delivery.getIncoterm().getResponsibility();
+ if (partnerIsCustomer) {
+ return responsibility == DeliveryResponsibilityEnumeration.SUPPLIER ||
+ responsibility == DeliveryResponsibilityEnumeration.PARTIAL;
+ } else {
+ return responsibility == DeliveryResponsibilityEnumeration.CUSTOMER ||
+ responsibility == DeliveryResponsibilityEnumeration.PARTIAL;
+ }
+ };
+ }
}
diff --git a/backend/src/test/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiServiceTest.java b/backend/src/test/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiServiceTest.java
new file mode 100644
index 00000000..9cdc187a
--- /dev/null
+++ b/backend/src/test/java/org/eclipse/tractusx/puris/backend/delivery/controller/DeliveryRequestApiServiceTest.java
@@ -0,0 +1,354 @@
+/*
+ * Copyright (c) 2024 Volkswagen AG
+ * Copyright (c) 2024 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Apache License, Version 2.0 which is available at
+ * https://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package org.eclipse.tractusx.puris.backend.delivery.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.tractusx.puris.backend.common.domain.model.measurement.ItemUnitEnumeration;
+import org.eclipse.tractusx.puris.backend.common.edc.logic.service.EdcAdapterService;
+import org.eclipse.tractusx.puris.backend.delivery.domain.model.EventTypeEnumeration;
+import org.eclipse.tractusx.puris.backend.delivery.domain.model.IncotermEnumeration;
+import org.eclipse.tractusx.puris.backend.delivery.domain.model.OwnDelivery;
+import org.eclipse.tractusx.puris.backend.delivery.logic.adapter.DeliveryInformationSammMapper;
+import org.eclipse.tractusx.puris.backend.delivery.logic.service.DeliveryRequestApiService;
+import org.eclipse.tractusx.puris.backend.delivery.logic.service.OwnDeliveryService;
+import org.eclipse.tractusx.puris.backend.delivery.logic.service.ReportedDeliveryService;
+import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Material;
+import org.eclipse.tractusx.puris.backend.masterdata.domain.model.MaterialPartnerRelation;
+import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Partner;
+import org.eclipse.tractusx.puris.backend.masterdata.logic.service.MaterialPartnerRelationService;
+import org.eclipse.tractusx.puris.backend.masterdata.logic.service.MaterialService;
+import org.eclipse.tractusx.puris.backend.masterdata.logic.service.PartnerService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.stubbing.Answer;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.function.Predicate;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.*;
+
+@Slf4j
+public class DeliveryRequestApiServiceTest {
+
+ @InjectMocks
+ private DeliveryRequestApiService deliveryRequestApiService;
+
+ @Mock
+ private PartnerService partnerService;
+ @Mock
+ private MaterialService materialService;
+ @Mock
+ private MaterialPartnerRelationService mprService;
+ @Mock
+ private OwnDeliveryService ownDeliveryService;
+ @Mock
+ private ReportedDeliveryService reportedDeliveryService;
+ @Mock
+ private EdcAdapterService edcAdapterService;
+ @Mock
+ private DeliveryInformationSammMapper sammMapper;
+
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
+ private static final String MATERIAL_NUMBER_CX_CUSTOMER = UUID.randomUUID().toString();
+ private static final String BPNL_CUSTOMER = "BPNL4444444444XX";
+ private static final String BPNS_CUSTOMER = "BPNS4444444444XX";
+ private static final String BPNA_CUSTOMER = "BPNA4444444444AA";
+
+ private static final String MATERIAL_NUMBER_CX_SUPPLIER = UUID.randomUUID().toString();
+ private static final String BPNL_SUPPLIER = "BPNL1234567890ZZ";
+ private static final String BPNS_SUPPLIER = "BPNS1234567890ZZ";
+ private static final String BPNA_SUPPLIER = "BPNA1234567890AA";
+
+ private Partner CUSTOMER_PARTNER;
+ private Partner SUPPLIER_PARTNER;
+
+ private static final Material TEST_MATERIAL = new Material(
+ true,
+ true,
+ "Own-Mnr",
+ MATERIAL_NUMBER_CX_CUSTOMER,
+ "Test Material"
+ );
+
+ private static final Material TEST_MATERIAL_SUPPLIER = new Material(
+ true,
+ true,
+ "Own-Mnr",
+ MATERIAL_NUMBER_CX_SUPPLIER,
+ "Test Material"
+ );
+
+ @BeforeEach
+ void setUp() {
+ MockitoAnnotations.openMocks(this);
+
+ CUSTOMER_PARTNER = new Partner(
+ "Test Customer",
+ "http://some-edc.com",
+ BPNL_CUSTOMER,
+ BPNS_CUSTOMER,
+ "Site Name",
+ BPNA_CUSTOMER,
+ "Street 10",
+ "40468 Testdorf",
+ "DE"
+ );
+ CUSTOMER_PARTNER.setUuid(UUID.randomUUID());
+
+ SUPPLIER_PARTNER = new Partner(
+ "Test Supplier",
+ "http://some-edc.com",
+ BPNL_SUPPLIER,
+ BPNS_SUPPLIER,
+ "Site Name",
+ BPNA_SUPPLIER,
+ "Street 10",
+ "40468 Testdorf",
+ "DE"
+ );
+ SUPPLIER_PARTNER.setUuid(UUID.randomUUID());
+ }
+
+ @Test
+ /**
+ * tests that the part type information task is triggered to get the cx id if neither material is
+ * neither found via material nor mpr
+ *
+ * NOTE: This test is very theoretical as this means, that someone queries the service while we didn't even
+ * create the ShellDescriptor with the HREF.
+ */
+ void customerGetsRequestNoCxId_testHandleDeliverySubmodelRequest_works() {
+ // given
+ // Delivery with incoterm with Customer responsibility
+ OwnDelivery delivery = getDelivery();
+ delivery.setIncoterm(IncotermEnumeration.EXW);
+
+ // Delivery with incoterm with PARTIAL responsibility
+ OwnDelivery delivery2 = getDelivery();
+ delivery2.setIncoterm(IncotermEnumeration.FCA);
+
+ // Delivery with incoterm with SUPPLIER responsibility
+ OwnDelivery delivery3 = getDelivery();
+ delivery3.setIncoterm(IncotermEnumeration.DAP);
+
+ List deliveries = Arrays.asList(delivery, delivery2, delivery3);
+
+ // partner supplies only
+ MaterialPartnerRelation mpr = getMpr(SUPPLIER_PARTNER, true, false);
+
+ // when - Customer gets request from supplier
+ when(partnerService.findByBpnl(BPNL_SUPPLIER)).thenReturn(SUPPLIER_PARTNER);
+ // cx id should be on mpr as case is customer
+ when(materialService.findByMaterialNumberCx(MATERIAL_NUMBER_CX_SUPPLIER)).thenReturn(null);
+ // return null to trigger update of Partner CX Id, then return valid mpr after update
+ when(mprService.findByPartnerAndPartnerCXNumber(SUPPLIER_PARTNER, MATERIAL_NUMBER_CX_SUPPLIER))
+ .thenReturn(null)
+ .thenReturn(mpr);
+
+ // update the partnerCxNumber mocked wise - could be done differently, but is closer to workflow
+ doAnswer((Answer) invocation -> {
+ mpr.setPartnerCXNumber(MATERIAL_NUMBER_CX_SUPPLIER);
+ return null;
+ }).when(mprService).triggerPartTypeRetrievalTask(SUPPLIER_PARTNER);
+
+ // return all deliveries defined above
+ // predicate for customer case will return delivery, delivery2
+ when(ownDeliveryService.findAllByFilters(
+ Optional.of(mpr.getMaterial().getOwnMaterialNumber()),
+ Optional.empty(),
+ Optional.of(BPNL_SUPPLIER)
+ )).thenReturn(deliveries);
+
+ // return mpr after update
+ when(mprService.find(mpr.getMaterial(), SUPPLIER_PARTNER)).thenReturn(mpr);
+
+ // trigger the api handling, we don't care about the answer as we don't mock the samm mapper
+ deliveryRequestApiService.handleDeliverySubmodelRequest(BPNL_SUPPLIER, MATERIAL_NUMBER_CX_SUPPLIER);
+
+ //then
+ // verify that update has been triggered due to missing cx id as customer
+ verify(mprService, times(1)).triggerPartTypeRetrievalTask(SUPPLIER_PARTNER);
+ // we don't mock the samm mapper and do not evaluate it results as it will be null (no mock implementation).
+ // verfy that samm mapper has been called correctly (our concern)
+ verify(sammMapper)
+ .ownDeliveryToSamm(
+ eq(Arrays.asList(delivery, delivery2)),
+ eq(SUPPLIER_PARTNER),
+ eq(mpr.getMaterial())
+ );
+ }
+
+ @Test
+ void noIncotermsUniqueMprRole_testPartnerRolePredicate_returnsTrue() {
+ // given
+ // Delivery without incoterm
+ OwnDelivery delivery = getDelivery();
+
+ List deliveries = Collections.singletonList(delivery);
+
+ // partner buys only
+ MaterialPartnerRelation mpr = getMpr(CUSTOMER_PARTNER, false, true);
+ mpr.setPartnerCXNumber(MATERIAL_NUMBER_CX_SUPPLIER);
+
+ // when - Supplier gets request from customer
+ Predicate partnerRoleDirectionPredicate = DeliveryRequestApiService.
+ partnerRoleDirectionPredicate(true, mpr);
+
+ List filteredDeliveries = deliveries.stream().filter(
+ partnerRoleDirectionPredicate
+ ).toList();
+
+ //then
+ assertEquals(deliveries, filteredDeliveries);
+ }
+
+ @Test
+ void noIncotermsNonUniqueMprRole_testPartnerRolePredicate_returnsFalse() {
+ // given
+ // Delivery without incoterm
+ OwnDelivery delivery = getDelivery();
+
+ List deliveries = Collections.singletonList(delivery);
+
+ // partner buys only
+ MaterialPartnerRelation mpr = getMpr(CUSTOMER_PARTNER, true, true);
+ mpr.setPartnerCXNumber(MATERIAL_NUMBER_CX_SUPPLIER);
+
+ // when - Supplier gets request from customer
+ Predicate partnerRoleDirectionPredicate = DeliveryRequestApiService.
+ partnerRoleDirectionPredicate(true, mpr);
+
+ List filteredDeliveries = deliveries.stream().filter(
+ partnerRoleDirectionPredicate
+ ).toList();
+
+ //then
+ assertEquals(0, filteredDeliveries.size());
+ }
+
+ @Test
+ void setIncotermsCustomerRole_testPartnerRolePredicate_filters() {
+ // given
+ // Delivery with incoterm with Customer responsibility
+ OwnDelivery delivery = getDelivery();
+ delivery.setIncoterm(IncotermEnumeration.EXW);
+
+ // Delivery with incoterm with PARTIAL responsibility
+ OwnDelivery delivery2 = getDelivery();
+ delivery2.setIncoterm(IncotermEnumeration.FCA);
+
+ // Delivery with incoterm with SUPPLIER responsibility
+ OwnDelivery delivery3 = getDelivery();
+ delivery3.setIncoterm(IncotermEnumeration.DAP);
+
+ List deliveries = Arrays.asList(delivery, delivery2, delivery3);
+
+ // partner buys and supplies
+ MaterialPartnerRelation mpr = getMpr(CUSTOMER_PARTNER, true, true);
+ mpr.setPartnerCXNumber(MATERIAL_NUMBER_CX_SUPPLIER);
+
+ // when - Supplier gets request from customer
+ Predicate partnerRoleDirectionPredicate = DeliveryRequestApiService.
+ partnerRoleDirectionPredicate(true, mpr);
+
+ List filteredDeliveries = deliveries.stream().filter(
+ partnerRoleDirectionPredicate
+ ).toList();
+
+ //then
+ assertEquals(2, filteredDeliveries.size());
+ // Responsibilities SUPPLIER and PARTIAL have been found, order IS relevant
+ assertEquals(Arrays.asList(delivery2, delivery3), filteredDeliveries);
+ }
+
+ @Test
+ void setIncotermsSupplierRole_testPartnerRolePredicate_filters() {
+ // given
+ // Delivery with incoterm with Customer responsibility
+ OwnDelivery delivery = getDelivery();
+ delivery.setIncoterm(IncotermEnumeration.EXW);
+
+ // Delivery with incoterm with PARTIAL responsibility
+ OwnDelivery delivery2 = getDelivery();
+ delivery2.setIncoterm(IncotermEnumeration.FCA);
+
+ // Delivery with incoterm with SUPPLIER responsibility
+ OwnDelivery delivery3 = getDelivery();
+ delivery3.setIncoterm(IncotermEnumeration.DAP);
+
+ List deliveries = Arrays.asList(delivery, delivery2, delivery3);
+
+ // partner supplies only
+ MaterialPartnerRelation mpr = getMpr(CUSTOMER_PARTNER, true, true);
+ mpr.setPartnerCXNumber(MATERIAL_NUMBER_CX_SUPPLIER);
+
+ // when - Supplier gets request from customer
+ Predicate partnerRoleDirectionPredicate = DeliveryRequestApiService.
+ partnerRoleDirectionPredicate(false, mpr);
+
+ List filteredDeliveries = deliveries.stream().filter(
+ partnerRoleDirectionPredicate
+ ).toList();
+
+ //then
+ assertEquals(2, filteredDeliveries.size());
+ // Responsibilities PARTIAL and CUSTOMER have been found, order IS relevant
+ assertEquals(Arrays.asList(delivery, delivery2), filteredDeliveries);
+ }
+
+ private OwnDelivery getDelivery() {
+ LocalDate tomorrow = LocalDate.now().plusDays(1);
+ Date tomorrowDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant());
+ return OwnDelivery.builder()
+ .material(TEST_MATERIAL)
+ .partner(CUSTOMER_PARTNER)
+ .originBpna(BPNS_SUPPLIER)
+ .originBpna(BPNA_SUPPLIER)
+ .departureType(EventTypeEnumeration.ESTIMATED_DEPARTURE)
+ .dateOfDeparture(tomorrowDate)
+ .destinationBpns(BPNS_CUSTOMER)
+ .destinationBpna(BPNA_CUSTOMER)
+ .arrivalType(EventTypeEnumeration.ESTIMATED_ARRIVAL)
+ .dateOfArrival(new Date())
+ .incoterm(null)
+ .measurementUnit(ItemUnitEnumeration.UNIT_PIECE)
+ .quantity(200)
+ .build();
+ }
+
+ private MaterialPartnerRelation getMpr(Partner partner, boolean partnerSupplies, boolean partnerBuys) {
+ return new MaterialPartnerRelation(
+ TEST_MATERIAL,
+ partner,
+ "Partner Material Number",
+ partnerSupplies,
+ partnerBuys
+ );
+ }
+}
diff --git a/charts/puris/Chart.yaml b/charts/puris/Chart.yaml
index 5b563bc2..f95fbeac 100644
--- a/charts/puris/Chart.yaml
+++ b/charts/puris/Chart.yaml
@@ -35,10 +35,10 @@ dependencies:
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
-version: 2.6.2
+version: 2.6.3
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
-appVersion: "2.0.1"
+appVersion: "2.0.2"
diff --git a/charts/puris/README.md b/charts/puris/README.md
index 3432a6e4..91802d70 100644
--- a/charts/puris/README.md
+++ b/charts/puris/README.md
@@ -1,12 +1,13 @@
# puris
-![Version: 2.6.2](https://img.shields.io/badge/Version-2.6.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 2.0.1](https://img.shields.io/badge/AppVersion-2.0.1-informational?style=flat-square)
+![Version: 2.6.3](https://img.shields.io/badge/Version-2.6.3-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 2.0.2](https://img.shields.io/badge/AppVersion-2.0.2-informational?style=flat-square)
A helm chart for Kubernetes deployment of PURIS
**Homepage:**
## Prerequisites
+
- Kubernetes 1.19+
- Helm 3.2.0+
@@ -18,6 +19,7 @@ To install the chart with the release name `puris`:
$ helm repo add tractusx-dev https://eclipse-tractusx.github.io/charts/dev
$ helm install puris tractusx-dev/policy-hub
```
+
To install the helm chart into your cluster with your values:
```shell
@@ -28,9 +30,9 @@ To use the helm chart as a dependency:
```yaml
dependencies:
- - name: puris
- repository: https://eclipse-tractusx.github.io/charts/dev
- version: YOUR_VERSION
+ - name: puris
+ repository: https://eclipse-tractusx.github.io/charts/dev
+ version: YOUR_VERSION
```
## Source Code
@@ -39,182 +41,182 @@ dependencies:
## Requirements
-| Repository | Name | Version |
-|------------|------|---------|
+| Repository | Name | Version |
+|------------------------------------|------------|---------|
| https://charts.bitnami.com/bitnami | postgresql | 12.12.x |
## Values
-| Key | Type | Default | Description |
-|-----|------|---------|-------------|
-| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution | list | `[{"podAffinityTerm":{"labelSelector":{"matchExpressions":[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]},"topologyKey":"kubernetes.io/hostname"},"weight":100}]` | Rules for the scheduler to find a pod |
-| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.labelSelector.matchExpressions | list | `[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]` | Matching Expressions as key and operators for the pod affinity |
-| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey | string | `"kubernetes.io/hostname"` | Topology key of the Kubernetes cluster |
-| backend.autoscaling.enabled | bool | `false` | Enable or disable the autoscaling of pods |
-| backend.env | object | `{}` | Extra environment variables that will be passed onto the backend deployment pods |
-| backend.image.pullPolicy | string | `"Always"` | THe policy for the image pull process |
-| backend.image.repository | string | `"tractusx/app-puris-backend"` | Repository of the docker image |
-| backend.image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. |
-| backend.imagePullSecrets | list | `[]` | List of used secrets |
-| backend.ingress.annotations | object | `{"kubernetes.io/ingress.class":"nginx","nginx.ingress.kubernetes.io/backend-protocol":"HTTP","nginx.ingress.kubernetes.io/force-ssl-redirect":"true","nginx.ingress.kubernetes.io/ssl-passthrough":"true"}` | Annotations for the Ingress controller |
-| backend.ingress.annotations."kubernetes.io/ingress.class" | string | `"nginx"` | Kubernetes Ingress class annotation for direct bindings |
-| backend.ingress.annotations."nginx.ingress.kubernetes.io/backend-protocol" | string | `"HTTP"` | The backend protocol type (e.g. HTTP) |
-| backend.ingress.annotations."nginx.ingress.kubernetes.io/force-ssl-redirect" | string | `"true"` | Force redirects from HTTP to HTTPS |
-| backend.ingress.annotations."nginx.ingress.kubernetes.io/ssl-passthrough" | string | `"true"` | Pass SSL traffic to the backend ports |
-| backend.ingress.enabled | bool | `false` | Enable the Ingress |
-| backend.ingress.hosts | list | `[{"host":"your-backend-host-address.com","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}]` | Hosts for the Ingress controller |
-| backend.ingress.tls | list | `[]` | TLS certificates for the Ingress controller |
-| backend.livenessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":120,"periodSeconds":25,"successThreshold":1,"timeoutSeconds":1}` | Checks whether a pod is alive or not |
-| backend.livenessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a liveness probe |
-| backend.livenessProbe.initialDelaySeconds | int | `120` | Delay in seconds after which an initial liveness probe is checked |
-| backend.livenessProbe.periodSeconds | int | `25` | Wait time in seconds between liveness probes |
-| backend.livenessProbe.successThreshold | int | `1` | Number of trys until a pod is marked alive |
-| backend.livenessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the liveness probe |
-| backend.nameOverride | string | `""` | Possibility to override the name |
-| backend.nodeSelector | object | `{}` | Constrains for the node selector |
-| backend.podAnnotations | object | `{}` | Annotations added to a running pod |
-| backend.podSecurityContext | object | `{}` | Added security contexts for a pod |
-| backend.puris.api.key | string | `"test"` | The API key of the PURIS application |
-| backend.puris.api.rootDir | string | `"/catena"` | The root directory of the API |
-| backend.puris.baseurl | string | `"your-backend-host-address.com"` | Base url of the PURIS backend |
-| backend.puris.datasource.driverClassName | string | `"org.postgresql.Driver"` | Driver class name of the database |
-| backend.puris.datasource.password | string | `""` | Password for the database user. Ignored if postgres.enabled is true. |
-| backend.puris.datasource.url | string | `"jdbc:postgresql://postgresql-name:5432/puris-database"` | URL of the database. Ignored if postgres.enabled is true. |
-| backend.puris.datasource.username | string | `"db-user"` | Username of the database. Ignored if postgres.enabled is true. |
-| backend.puris.deliverysubmodel.apiassetid | string | `"deliverysubmodel-api-asset"` | Asset ID for DeliverySubmodel API |
-| backend.puris.demandsubmodel.apiassetid | string | `"demandsubmodel-api-asset"` | Asset ID for DemandSubmodel API |
-| backend.puris.demonstrator.role | string | `nil` | Current role of the PURIS demonstrator. Default value should be empty. Can be set to "customer" or "supplier" to enable demonstration setup |
-| backend.puris.dtr.idp.clients.edc.id | string | `"FOSS-EDC-CLIENT"` | id of the client that has a service account with roles to view the DTR. Used by the application to create DTR asset in the edc with read only access. See Admin Guide. Mandatory if backend.puris.dtr.idp.enabled = true. |
-| backend.puris.dtr.idp.clients.edc.secret.alias | string | `"path/secret-name"` | alias for the vault used by the EDC in which the secret is stored. Mandatory if backend.puris.dtr.idp.enabled = true. |
-| backend.puris.dtr.idp.clients.puris.id | string | `"FOSS-PURIS-CLIENT"` | id of the client that has a service account with roles to manage the DTR. Used by the application to create and update digital twins. See Admin Guide. Mandatory if backend.puris.dtr.idp.enabled = true. |
-| backend.puris.dtr.idp.clients.puris.secret | string | `""` | secret of the client with write access (no vault alias). No default value will be created if empty. Mandatory if backend.puris.dtr.idp.enabled = true. |
-| backend.puris.dtr.idp.enabled | bool | `true` | enables the usage of the IDP for the DTR. |
-| backend.puris.dtr.idp.tokenurl | string | `"https://keycloak-service.com/realms/your-realm/openid-connect/token"` | token url of the idp for your specific realm. May be different to other idp token url in this config. Mandatory if backend.puris.dtr.idp.enabled = true. |
-| backend.puris.dtr.url | string | `"http://localhost:4243"` | Endpoint for DTR |
-| backend.puris.edc.controlplane.host | string | `"172.17.0.2"` | |
-| backend.puris.edc.controlplane.key | string | `"password"` | Key for the EDC control plane |
-| backend.puris.edc.controlplane.management.url | string | `"https:/your-edc-address:8181/management"` | Url to the EDC controlplane management of the edc |
-| backend.puris.edc.controlplane.protocol.url | string | `"https://your-edc-address:8184/api/v1/dsp"` | Url to the EDC controlplane protocol API of the edc |
-| backend.puris.edc.dataplane.public.url | string | `"https://your-data-plane:8285/api/public/"` | Url of one of your data plane's public api |
-| backend.puris.existingSecret | string | `"secret-puris-backend"` | Secret for backend passwords. For more information look into 'backend-secrets.yaml' file. |
-| backend.puris.frameworkagreement.credential | string | `"Puris"` | The name of the framework agreement. Starting with Uppercase and using CamelCase. |
-| backend.puris.frameworkagreement.version | string | `"1.0"` | The version of the framework agreement, NEEDS TO BE PUT AS "STRING"! |
-| backend.puris.generatematerialcatenaxid | bool | `true` | Flag that decides whether the auto-generation feature of the puris backend is enabled. Since all Material entities are required to have a CatenaX-Id, you must enter any pre-existing CatenaX-Id via the materials-API of the backend, when you are inserting a new Material entity to the backend's database. If a CatenaX-Id was not assigned to your Material so far, then this feature can auto-generate one randomly. In a real-world-scenario, you must then use this randomly generated CatenaX-Id for the lifetime of that Material entity. |
-| backend.puris.itemstocksubmodel.apiassetid | string | `"itemstocksubmodel-api-asset"` | Asset ID for ItemStockSubmodel API |
-| backend.puris.jpa.hibernate.ddl-auto | string | `"create"` | Initialises SQL database with Hibernate property "create" to allow Hibernate to first drop all tables and then create new ones |
-| backend.puris.jpa.properties.hibernate.enable_lazy_load_no_trans | bool | `true` | Enables "Lazy load no trans" property to fetch of each lazy entity to open a temporary session and run inside a separate transaction |
-| backend.puris.own.bpna | string | `"BPNA4444444444ZZ"` | Own BPNA of the EDC |
-| backend.puris.own.bpnl | string | `"BPNL4444444444XX"` | Own BPNL of the EDC |
-| backend.puris.own.bpns | string | `"BPNS4444444444XX"` | Own BPNS of the EDC |
-| backend.puris.own.country | string | `"Germany"` | Own country |
-| backend.puris.own.name | string | `"YOUR-COMPANY-NAME"` | Own name (self-description) |
-| backend.puris.own.site.name | string | `"YOUR-SITE-NAME"` | Own site name |
-| backend.puris.own.streetnumber | string | `"Musterstraße 110A"` | Own street and number |
-| backend.puris.own.zipcodeandcity | string | `"12345 Musterhausen"` | Own zipcode and city |
-| backend.puris.productionsubmodel.apiassetid | string | `"productionsubmodel-api-asset"` | Asset ID for ProductionSubmodel API |
-| backend.puris.purpose.name | string | `"cx.puris.base"` | The name of the purpose to use for submodel contracts |
-| backend.puris.purpose.version | string | `"1"` | The version of the purpose to use for submodel contracts. NEEDS TO BE PUT AS "STRING"! |
-| backend.readinessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":120,"periodSeconds":25,"successThreshold":1,"timeoutSeconds":1}` | Checks if the pod is fully ready to operate |
-| backend.readinessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a readiness probe |
-| backend.readinessProbe.initialDelaySeconds | int | `120` | Delay in seconds after which an initial readiness probe is checked |
-| backend.readinessProbe.periodSeconds | int | `25` | Wait time in seconds between readiness probes |
-| backend.readinessProbe.successThreshold | int | `1` | Number of trys until a pod is marked ready |
-| backend.readinessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the readiness probe |
-| backend.replicaCount | int | `1` | Number of replicas of the Kubernetes deployment |
-| backend.resources.limits | object | `{"cpu":"3000m","memory":"2048Mi"}` | Maximum resource limits of CPU und memory |
-| backend.resources.requests | object | `{"cpu":"1000m","memory":"2048Mi"}` | Minimum requested resources for CPU und memory |
-| backend.securityContext | object | `{"allowPrivilegeEscalation":false,"runAsGroup":3000,"runAsNonRoot":true,"runAsUser":8877}` | Security configurations |
-| backend.securityContext.allowPrivilegeEscalation | bool | `false` | Get more privileges than the parent process |
-| backend.securityContext.runAsGroup | int | `3000` | Configures the group id of a user for a run |
-| backend.securityContext.runAsNonRoot | bool | `true` | Configures the non-root privileges for a run |
-| backend.securityContext.runAsUser | int | `8877` | Configures the user id for a run |
-| backend.service.port | int | `8081` | The port of the service |
-| backend.service.type | string | `"ClusterIP"` | Type of the service |
-| backend.serviceAccount.annotations | object | `{}` | Annotations to add to the service account |
-| backend.serviceAccount.create | bool | `true` | Specifies whether a service account should be created |
-| backend.serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template |
-| backend.tolerations | list | `[]` | Constrains for tolerations |
-| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution | list | `[{"podAffinityTerm":{"labelSelector":{"matchExpressions":[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]},"topologyKey":"kubernetes.io/hostname"},"weight":100}]` | Rules for the scheduler to find a pod |
-| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.labelSelector.matchExpressions | list | `[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]` | Matching Expressions as key and operators for the pod affinity |
-| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey | string | `"kubernetes.io/hostname"` | Topology key of the Kubernetes cluster |
-| frontend.autoscaling.enabled | bool | `false` | Enable or disable the autoscaling of pods |
-| frontend.autoscaling.maxReplicas | int | `100` | Number of maximum replica pods for autoscaling |
-| frontend.autoscaling.minReplicas | int | `1` | Number of minimum replica pods for autoscaling |
-| frontend.autoscaling.targetCPUUtilizationPercentage | int | `80` | Value of CPU usage in percentage for autoscaling decisions |
-| frontend.env | object | `{}` | Extra environment variables that will be passed onto the frontend deployment pods |
-| frontend.image.pullPolicy | string | `"IfNotPresent"` | THe policy for the image pull process |
-| frontend.image.repository | string | `"tractusx/app-puris-frontend"` | Repository of the docker image |
-| frontend.image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. |
-| frontend.imagePullSecrets | list | `[]` | List of used secrets |
-| frontend.ingress.annotations | object | `{}` | Annotations for the Ingress controller |
-| frontend.ingress.className | string | `"nginx"` | Class name for the Ingress controller |
-| frontend.ingress.enabled | bool | `false` | Enable the Ingress |
-| frontend.ingress.hosts | list | `[{"host":"your-frontend-host-address.com","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}]` | Hosts for the Ingress controller |
-| frontend.ingress.tls | list | `[]` | TLS certificates for the Ingress controller |
-| frontend.livenessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1}` | Checks whether a pod is alive or not |
-| frontend.livenessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a liveness probe |
-| frontend.livenessProbe.initialDelaySeconds | int | `10` | Delay in seconds after which an initial liveness probe is checked |
-| frontend.livenessProbe.periodSeconds | int | `10` | Wait time in seconds between liveness probes |
-| frontend.livenessProbe.successThreshold | int | `1` | Number of trys until a pod is marked alive |
-| frontend.livenessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the liveness probe |
-| frontend.nameOverride | string | `""` | Possibility to override the name |
-| frontend.nodeSelector | object | `{}` | Constrains for the node selector |
-| frontend.podAnnotations | object | `{}` | Annotations added to a running pod |
-| frontend.podSecurityContext | object | `{}` | Added security contexts for a pod |
-| frontend.puris.appName | string | `"PURIS"` | The name of the app displayed in the frontend |
-| frontend.puris.baseUrl | string | `"your-backend-host-address.com"` | The base URL for the backend base URL without further endpoints |
-| frontend.puris.endpointCustomer | string | `"stockView/customer?ownMaterialNumber="` | The endpoint for the customers who buy a material identified via the own material number for the stock view |
-| frontend.puris.endpointDelivery | string | `"delivery"` | The endpoint for the delivery submodel |
-| frontend.puris.endpointDemand | string | `"demand"` | The endpoint for the demand submodel |
-| frontend.puris.endpointMaterialStocks | string | `"stockView/material-stocks"` | The endpoint for material stocks for the stock view |
-| frontend.puris.endpointMaterials | string | `"stockView/materials"` | The endpoint for materials for the stock view |
-| frontend.puris.endpointPartners | string | `"partners"` | The endpoint for partner information |
-| frontend.puris.endpointProductStocks | string | `"stockView/product-stocks"` | The endpoint for product stocks for the stock view |
-| frontend.puris.endpointProduction | string | `"production"` | The endpoint for the production submodel |
-| frontend.puris.endpointProductionRange | string | `"production/range"` | The endpoint for the production range of the production submodel |
-| frontend.puris.endpointProducts | string | `"stockView/products"` | The endpoint for products for the stock view |
-| frontend.puris.endpointReportedMaterialStocks | string | `"stockView/reported-material-stocks?ownMaterialNumber="` | The endpoint for the partners' (supplier) material stocks that they potentially will deliver to me |
-| frontend.puris.endpointReportedProductStocks | string | `"stockView/reported-product-stocks?ownMaterialNumber="` | The endpoint for the partners' (customer) product stocks that they received from me |
-| frontend.puris.endpointSupplier | string | `"stockView/supplier?ownMaterialNumber="` | The endpoint for the suppliers who buy a material identified via the own material number for the stock view |
-| frontend.puris.endpointUpdateReportedMaterialStocks | string | `"stockView/update-reported-material-stocks?ownMaterialNumber="` | The endpoint for triggering an update of your material stocks on your partners side |
-| frontend.puris.endpointUpdateReportedProductStocks | string | `"stockView/update-reported-product-stocks?ownMaterialNumber="` | The endpoint for triggering an update of your product stocks on your partners side |
-| frontend.puris.keycloak.clientId | string | `"appXYZ"` | Name of the client which is used for the application. |
-| frontend.puris.keycloak.disabled | bool | `true` | Disable the Keycloak integration. |
-| frontend.puris.keycloak.realm | string | `"Catena-X"` | Name of the Realm of the keycloak instance. |
-| frontend.puris.keycloak.redirectUrlFrontend | string | `"https://your-frontend-url.com"` | URL to use as keycloak redirect url. |
-| frontend.puris.keycloak.url | string | `"https://idp.com/auth"` | The URL to the IDP that should be used. |
-| frontend.puris.rateLimiting.burst | int | `30` | Burst rate limiting for nginx. |
-| frontend.puris.rateLimiting.limit | string | `"10m"` | Bucket zone limit for rate limiting in nginx. |
-| frontend.puris.rateLimiting.rate | string | `"10r/s"` | Allowed rates per second for nginx rate limiting. |
-| frontend.readinessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1}` | Checks if the pod is fully ready to operate |
-| frontend.readinessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a readiness probe |
-| frontend.readinessProbe.initialDelaySeconds | int | `10` | Delay in seconds after which an initial readiness probe is checked |
-| frontend.readinessProbe.periodSeconds | int | `10` | Wait time in seconds between readiness probes |
-| frontend.readinessProbe.successThreshold | int | `1` | Number of trys until a pod is marked ready |
-| frontend.readinessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the readiness probe |
-| frontend.replicaCount | int | `1` | |
-| frontend.resources.limits | object | `{"cpu":"600m","memory":"128Mi"}` | Maximum resource limits of CPU und memory |
-| frontend.resources.requests | object | `{"cpu":"200m","memory":"128Mi"}` | Minimum requested resources for CPU und memory |
-| frontend.securityContext | object | `{"allowPrivilegeEscalation":false,"runAsGroup":3000,"runAsNonRoot":true,"runAsUser":101}` | Security configurations |
-| frontend.securityContext.allowPrivilegeEscalation | bool | `false` | Get more privileges than the parent process |
-| frontend.securityContext.runAsGroup | int | `3000` | Configures the group id of a user for a run |
-| frontend.securityContext.runAsNonRoot | bool | `true` | Configures the non-root privileges for a run |
-| frontend.securityContext.runAsUser | int | `101` | Configures the user id for a run |
-| frontend.service.port | int | `8080` | The port of the service |
-| frontend.service.type | string | `"ClusterIP"` | Type of the service |
-| frontend.serviceAccount.annotations | object | `{}` | Annotations to add to the service account |
-| frontend.serviceAccount.create | bool | `true` | Specifies whether a service account should be created |
-| frontend.serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template |
-| frontend.tolerations | list | `[]` | Constrains for tolerations |
-| global.domain.backend.ingress | string | `"your-backend-host-address.com"` | |
-| postgresql.auth.database | string | `"postgres"` | Name of the database. |
-| postgresql.auth.existingSecret | string | `"secret-puris-postgres-init"` | Secret containing the password. For more information look into 'backend-secrets-postgres.yaml' file. |
-| postgresql.auth.password | string | `""` | Password for the custom database user. Secret-key 'password' |
-| postgresql.auth.passwordPostgres | string | `""` | Password for the database. Secret-key 'postgres-password'. |
-| postgresql.auth.username | string | `"puris"` | Username for the custom database user. |
-| postgresql.enabled | bool | `true` | Enable postgres by default, set to false to use existing postgres. Make sure to set backend.puris.jpa.hibernate.ddl-auto accordingly (by default database is created using hibernate ddl from backend). |
-| postgresql.service | object | `{"ports":{"postgresql":5432}}` | Possibility to override the name nameOverride: "" |
-| postgresql.service.ports.postgresql | int | `5432` | Port of postgres database. |
+| Key | Type | Default | Description |
+|-------------------------------------------------------------------------------------------------------------------------------------|--------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution | list | `[{"podAffinityTerm":{"labelSelector":{"matchExpressions":[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]},"topologyKey":"kubernetes.io/hostname"},"weight":100}]` | Rules for the scheduler to find a pod |
+| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.labelSelector.matchExpressions | list | `[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]` | Matching Expressions as key and operators for the pod affinity |
+| backend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey | string | `"kubernetes.io/hostname"` | Topology key of the Kubernetes cluster |
+| backend.autoscaling.enabled | bool | `false` | Enable or disable the autoscaling of pods |
+| backend.env | object | `{}` | Extra environment variables that will be passed onto the backend deployment pods |
+| backend.image.pullPolicy | string | `"Always"` | THe policy for the image pull process |
+| backend.image.repository | string | `"tractusx/app-puris-backend"` | Repository of the docker image |
+| backend.image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. |
+| backend.imagePullSecrets | list | `[]` | List of used secrets |
+| backend.ingress.annotations | object | `{"kubernetes.io/ingress.class":"nginx","nginx.ingress.kubernetes.io/backend-protocol":"HTTP","nginx.ingress.kubernetes.io/force-ssl-redirect":"true","nginx.ingress.kubernetes.io/ssl-passthrough":"true"}` | Annotations for the Ingress controller |
+| backend.ingress.annotations."kubernetes.io/ingress.class" | string | `"nginx"` | Kubernetes Ingress class annotation for direct bindings |
+| backend.ingress.annotations."nginx.ingress.kubernetes.io/backend-protocol" | string | `"HTTP"` | The backend protocol type (e.g. HTTP) |
+| backend.ingress.annotations."nginx.ingress.kubernetes.io/force-ssl-redirect" | string | `"true"` | Force redirects from HTTP to HTTPS |
+| backend.ingress.annotations."nginx.ingress.kubernetes.io/ssl-passthrough" | string | `"true"` | Pass SSL traffic to the backend ports |
+| backend.ingress.enabled | bool | `false` | Enable the Ingress |
+| backend.ingress.hosts | list | `[{"host":"your-backend-host-address.com","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}]` | Hosts for the Ingress controller |
+| backend.ingress.tls | list | `[]` | TLS certificates for the Ingress controller |
+| backend.livenessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":120,"periodSeconds":25,"successThreshold":1,"timeoutSeconds":1}` | Checks whether a pod is alive or not |
+| backend.livenessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a liveness probe |
+| backend.livenessProbe.initialDelaySeconds | int | `120` | Delay in seconds after which an initial liveness probe is checked |
+| backend.livenessProbe.periodSeconds | int | `25` | Wait time in seconds between liveness probes |
+| backend.livenessProbe.successThreshold | int | `1` | Number of trys until a pod is marked alive |
+| backend.livenessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the liveness probe |
+| backend.nameOverride | string | `""` | Possibility to override the name |
+| backend.nodeSelector | object | `{}` | Constrains for the node selector |
+| backend.podAnnotations | object | `{}` | Annotations added to a running pod |
+| backend.podSecurityContext | object | `{}` | Added security contexts for a pod |
+| backend.puris.api.key | string | `"test"` | The API key of the PURIS application |
+| backend.puris.api.rootDir | string | `"/catena"` | The root directory of the API |
+| backend.puris.baseurl | string | `"your-backend-host-address.com"` | Base url of the PURIS backend |
+| backend.puris.datasource.driverClassName | string | `"org.postgresql.Driver"` | Driver class name of the database |
+| backend.puris.datasource.password | string | `""` | Password for the database user. Ignored if postgres.enabled is true. |
+| backend.puris.datasource.url | string | `"jdbc:postgresql://postgresql-name:5432/puris-database"` | URL of the database. Ignored if postgres.enabled is true. |
+| backend.puris.datasource.username | string | `"db-user"` | Username of the database. Ignored if postgres.enabled is true. |
+| backend.puris.deliverysubmodel.apiassetid | string | `"deliverysubmodel-api-asset"` | Asset ID for DeliverySubmodel API |
+| backend.puris.demandsubmodel.apiassetid | string | `"demandsubmodel-api-asset"` | Asset ID for DemandSubmodel API |
+| backend.puris.demonstrator.role | string | `nil` | Current role of the PURIS demonstrator. Default value should be empty. Can be set to "customer" or "supplier" to enable demonstration setup |
+| backend.puris.dtr.idp.clients.edc.id | string | `"FOSS-EDC-CLIENT"` | id of the client that has a service account with roles to view the DTR. Used by the application to create DTR asset in the edc with read only access. See Admin Guide. Mandatory if backend.puris.dtr.idp.enabled = true. |
+| backend.puris.dtr.idp.clients.edc.secret.alias | string | `"path/secret-name"` | alias for the vault used by the EDC in which the secret is stored. Mandatory if backend.puris.dtr.idp.enabled = true. |
+| backend.puris.dtr.idp.clients.puris.id | string | `"FOSS-PURIS-CLIENT"` | id of the client that has a service account with roles to manage the DTR. Used by the application to create and update digital twins. See Admin Guide. Mandatory if backend.puris.dtr.idp.enabled = true. |
+| backend.puris.dtr.idp.clients.puris.secret | string | `""` | secret of the client with write access (no vault alias). No default value will be created if empty. Mandatory if backend.puris.dtr.idp.enabled = true. |
+| backend.puris.dtr.idp.enabled | bool | `true` | enables the usage of the IDP for the DTR. |
+| backend.puris.dtr.idp.tokenurl | string | `"https://keycloak-service.com/realms/your-realm/openid-connect/token"` | token url of the idp for your specific realm. May be different to other idp token url in this config. Mandatory if backend.puris.dtr.idp.enabled = true. |
+| backend.puris.dtr.url | string | `"http://localhost:4243"` | Endpoint for DTR |
+| backend.puris.edc.controlplane.host | string | `"172.17.0.2"` | |
+| backend.puris.edc.controlplane.key | string | `"password"` | Key for the EDC control plane |
+| backend.puris.edc.controlplane.management.url | string | `"https:/your-edc-address:8181/management"` | Url to the EDC controlplane management of the edc |
+| backend.puris.edc.controlplane.protocol.url | string | `"https://your-edc-address:8184/api/v1/dsp"` | Url to the EDC controlplane protocol API of the edc |
+| backend.puris.edc.dataplane.public.url | string | `"https://your-data-plane:8285/api/public/"` | Url of one of your data plane's public api |
+| backend.puris.existingSecret | string | `"secret-puris-backend"` | Secret for backend passwords. For more information look into 'backend-secrets.yaml' file. |
+| backend.puris.frameworkagreement.credential | string | `"Puris"` | The name of the framework agreement. Starting with Uppercase and using CamelCase. |
+| backend.puris.frameworkagreement.version | string | `"1.0"` | The version of the framework agreement, NEEDS TO BE PUT AS "STRING"! |
+| backend.puris.generatematerialcatenaxid | bool | `true` | Flag that decides whether the auto-generation feature of the puris backend is enabled. Since all Material entities are required to have a CatenaX-Id, you must enter any pre-existing CatenaX-Id via the materials-API of the backend, when you are inserting a new Material entity to the backend's database. If a CatenaX-Id was not assigned to your Material so far, then this feature can auto-generate one randomly. In a real-world-scenario, you must then use this randomly generated CatenaX-Id for the lifetime of that Material entity. |
+| backend.puris.itemstocksubmodel.apiassetid | string | `"itemstocksubmodel-api-asset"` | Asset ID for ItemStockSubmodel API |
+| backend.puris.jpa.hibernate.ddl-auto | string | `"create"` | Initialises SQL database with Hibernate property "create" to allow Hibernate to first drop all tables and then create new ones |
+| backend.puris.jpa.properties.hibernate.enable_lazy_load_no_trans | bool | `true` | Enables "Lazy load no trans" property to fetch of each lazy entity to open a temporary session and run inside a separate transaction |
+| backend.puris.own.bpna | string | `"BPNA4444444444ZZ"` | Own BPNA of the EDC |
+| backend.puris.own.bpnl | string | `"BPNL4444444444XX"` | Own BPNL of the EDC |
+| backend.puris.own.bpns | string | `"BPNS4444444444XX"` | Own BPNS of the EDC |
+| backend.puris.own.country | string | `"Germany"` | Own country |
+| backend.puris.own.name | string | `"YOUR-COMPANY-NAME"` | Own name (self-description) |
+| backend.puris.own.site.name | string | `"YOUR-SITE-NAME"` | Own site name |
+| backend.puris.own.streetnumber | string | `"Musterstraße 110A"` | Own street and number |
+| backend.puris.own.zipcodeandcity | string | `"12345 Musterhausen"` | Own zipcode and city |
+| backend.puris.productionsubmodel.apiassetid | string | `"productionsubmodel-api-asset"` | Asset ID for ProductionSubmodel API |
+| backend.puris.purpose.name | string | `"cx.puris.base"` | The name of the purpose to use for submodel contracts |
+| backend.puris.purpose.version | string | `"1"` | The version of the purpose to use for submodel contracts. NEEDS TO BE PUT AS "STRING"! |
+| backend.readinessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":120,"periodSeconds":25,"successThreshold":1,"timeoutSeconds":1}` | Checks if the pod is fully ready to operate |
+| backend.readinessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a readiness probe |
+| backend.readinessProbe.initialDelaySeconds | int | `120` | Delay in seconds after which an initial readiness probe is checked |
+| backend.readinessProbe.periodSeconds | int | `25` | Wait time in seconds between readiness probes |
+| backend.readinessProbe.successThreshold | int | `1` | Number of trys until a pod is marked ready |
+| backend.readinessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the readiness probe |
+| backend.replicaCount | int | `1` | Number of replicas of the Kubernetes deployment |
+| backend.resources.limits | object | `{"cpu":"3000m","memory":"2048Mi"}` | Maximum resource limits of CPU und memory |
+| backend.resources.requests | object | `{"cpu":"1000m","memory":"2048Mi"}` | Minimum requested resources for CPU und memory |
+| backend.securityContext | object | `{"allowPrivilegeEscalation":false,"runAsGroup":3000,"runAsNonRoot":true,"runAsUser":8877}` | Security configurations |
+| backend.securityContext.allowPrivilegeEscalation | bool | `false` | Get more privileges than the parent process |
+| backend.securityContext.runAsGroup | int | `3000` | Configures the group id of a user for a run |
+| backend.securityContext.runAsNonRoot | bool | `true` | Configures the non-root privileges for a run |
+| backend.securityContext.runAsUser | int | `8877` | Configures the user id for a run |
+| backend.service.port | int | `8081` | The port of the service |
+| backend.service.type | string | `"ClusterIP"` | Type of the service |
+| backend.serviceAccount.annotations | object | `{}` | Annotations to add to the service account |
+| backend.serviceAccount.create | bool | `true` | Specifies whether a service account should be created |
+| backend.serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template |
+| backend.tolerations | list | `[]` | Constrains for tolerations |
+| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution | list | `[{"podAffinityTerm":{"labelSelector":{"matchExpressions":[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]},"topologyKey":"kubernetes.io/hostname"},"weight":100}]` | Rules for the scheduler to find a pod |
+| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.labelSelector.matchExpressions | list | `[{"key":"app.kubernetes.io/name","operator":"DoesNotExist"}]` | Matching Expressions as key and operators for the pod affinity |
+| frontend.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey | string | `"kubernetes.io/hostname"` | Topology key of the Kubernetes cluster |
+| frontend.autoscaling.enabled | bool | `false` | Enable or disable the autoscaling of pods |
+| frontend.autoscaling.maxReplicas | int | `100` | Number of maximum replica pods for autoscaling |
+| frontend.autoscaling.minReplicas | int | `1` | Number of minimum replica pods for autoscaling |
+| frontend.autoscaling.targetCPUUtilizationPercentage | int | `80` | Value of CPU usage in percentage for autoscaling decisions |
+| frontend.env | object | `{}` | Extra environment variables that will be passed onto the frontend deployment pods |
+| frontend.image.pullPolicy | string | `"IfNotPresent"` | THe policy for the image pull process |
+| frontend.image.repository | string | `"tractusx/app-puris-frontend"` | Repository of the docker image |
+| frontend.image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. |
+| frontend.imagePullSecrets | list | `[]` | List of used secrets |
+| frontend.ingress.annotations | object | `{}` | Annotations for the Ingress controller |
+| frontend.ingress.className | string | `"nginx"` | Class name for the Ingress controller |
+| frontend.ingress.enabled | bool | `false` | Enable the Ingress |
+| frontend.ingress.hosts | list | `[{"host":"your-frontend-host-address.com","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}]` | Hosts for the Ingress controller |
+| frontend.ingress.tls | list | `[]` | TLS certificates for the Ingress controller |
+| frontend.livenessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1}` | Checks whether a pod is alive or not |
+| frontend.livenessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a liveness probe |
+| frontend.livenessProbe.initialDelaySeconds | int | `10` | Delay in seconds after which an initial liveness probe is checked |
+| frontend.livenessProbe.periodSeconds | int | `10` | Wait time in seconds between liveness probes |
+| frontend.livenessProbe.successThreshold | int | `1` | Number of trys until a pod is marked alive |
+| frontend.livenessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the liveness probe |
+| frontend.nameOverride | string | `""` | Possibility to override the name |
+| frontend.nodeSelector | object | `{}` | Constrains for the node selector |
+| frontend.podAnnotations | object | `{}` | Annotations added to a running pod |
+| frontend.podSecurityContext | object | `{}` | Added security contexts for a pod |
+| frontend.puris.appName | string | `"PURIS"` | The name of the app displayed in the frontend |
+| frontend.puris.baseUrl | string | `"your-backend-host-address.com"` | The base URL for the backend base URL without further endpoints |
+| frontend.puris.endpointCustomer | string | `"stockView/customer?ownMaterialNumber="` | The endpoint for the customers who buy a material identified via the own material number for the stock view |
+| frontend.puris.endpointDelivery | string | `"delivery"` | The endpoint for the delivery submodel |
+| frontend.puris.endpointDemand | string | `"demand"` | The endpoint for the demand submodel |
+| frontend.puris.endpointMaterialStocks | string | `"stockView/material-stocks"` | The endpoint for material stocks for the stock view |
+| frontend.puris.endpointMaterials | string | `"stockView/materials"` | The endpoint for materials for the stock view |
+| frontend.puris.endpointPartners | string | `"partners"` | The endpoint for partner information |
+| frontend.puris.endpointProductStocks | string | `"stockView/product-stocks"` | The endpoint for product stocks for the stock view |
+| frontend.puris.endpointProduction | string | `"production"` | The endpoint for the production submodel |
+| frontend.puris.endpointProductionRange | string | `"production/range"` | The endpoint for the production range of the production submodel |
+| frontend.puris.endpointProducts | string | `"stockView/products"` | The endpoint for products for the stock view |
+| frontend.puris.endpointReportedMaterialStocks | string | `"stockView/reported-material-stocks?ownMaterialNumber="` | The endpoint for the partners' (supplier) material stocks that they potentially will deliver to me |
+| frontend.puris.endpointReportedProductStocks | string | `"stockView/reported-product-stocks?ownMaterialNumber="` | The endpoint for the partners' (customer) product stocks that they received from me |
+| frontend.puris.endpointSupplier | string | `"stockView/supplier?ownMaterialNumber="` | The endpoint for the suppliers who buy a material identified via the own material number for the stock view |
+| frontend.puris.endpointUpdateReportedMaterialStocks | string | `"stockView/update-reported-material-stocks?ownMaterialNumber="` | The endpoint for triggering an update of your material stocks on your partners side |
+| frontend.puris.endpointUpdateReportedProductStocks | string | `"stockView/update-reported-product-stocks?ownMaterialNumber="` | The endpoint for triggering an update of your product stocks on your partners side |
+| frontend.puris.keycloak.clientId | string | `"appXYZ"` | Name of the client which is used for the application. |
+| frontend.puris.keycloak.disabled | bool | `true` | Disable the Keycloak integration. |
+| frontend.puris.keycloak.realm | string | `"Catena-X"` | Name of the Realm of the keycloak instance. |
+| frontend.puris.keycloak.redirectUrlFrontend | string | `"https://your-frontend-url.com"` | URL to use as keycloak redirect url. |
+| frontend.puris.keycloak.url | string | `"https://idp.com/auth"` | The URL to the IDP that should be used. |
+| frontend.puris.rateLimiting.burst | int | `30` | Burst rate limiting for nginx. |
+| frontend.puris.rateLimiting.limit | string | `"10m"` | Bucket zone limit for rate limiting in nginx. |
+| frontend.puris.rateLimiting.rate | string | `"10r/s"` | Allowed rates per second for nginx rate limiting. |
+| frontend.readinessProbe | object | `{"failureThreshold":3,"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1}` | Checks if the pod is fully ready to operate |
+| frontend.readinessProbe.failureThreshold | int | `3` | Number of failures (threshold) for a readiness probe |
+| frontend.readinessProbe.initialDelaySeconds | int | `10` | Delay in seconds after which an initial readiness probe is checked |
+| frontend.readinessProbe.periodSeconds | int | `10` | Wait time in seconds between readiness probes |
+| frontend.readinessProbe.successThreshold | int | `1` | Number of trys until a pod is marked ready |
+| frontend.readinessProbe.timeoutSeconds | int | `1` | Timeout in seconds of the readiness probe |
+| frontend.replicaCount | int | `1` | |
+| frontend.resources.limits | object | `{"cpu":"600m","memory":"128Mi"}` | Maximum resource limits of CPU und memory |
+| frontend.resources.requests | object | `{"cpu":"200m","memory":"128Mi"}` | Minimum requested resources for CPU und memory |
+| frontend.securityContext | object | `{"allowPrivilegeEscalation":false,"runAsGroup":3000,"runAsNonRoot":true,"runAsUser":101}` | Security configurations |
+| frontend.securityContext.allowPrivilegeEscalation | bool | `false` | Get more privileges than the parent process |
+| frontend.securityContext.runAsGroup | int | `3000` | Configures the group id of a user for a run |
+| frontend.securityContext.runAsNonRoot | bool | `true` | Configures the non-root privileges for a run |
+| frontend.securityContext.runAsUser | int | `101` | Configures the user id for a run |
+| frontend.service.port | int | `8080` | The port of the service |
+| frontend.service.type | string | `"ClusterIP"` | Type of the service |
+| frontend.serviceAccount.annotations | object | `{}` | Annotations to add to the service account |
+| frontend.serviceAccount.create | bool | `true` | Specifies whether a service account should be created |
+| frontend.serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template |
+| frontend.tolerations | list | `[]` | Constrains for tolerations |
+| global.domain.backend.ingress | string | `"your-backend-host-address.com"` | |
+| postgresql.auth.database | string | `"postgres"` | Name of the database. |
+| postgresql.auth.existingSecret | string | `"secret-puris-postgres-init"` | Secret containing the password. For more information look into 'backend-secrets-postgres.yaml' file. |
+| postgresql.auth.password | string | `""` | Password for the custom database user. Secret-key 'password' |
+| postgresql.auth.passwordPostgres | string | `""` | Password for the database. Secret-key 'postgres-password'. |
+| postgresql.auth.username | string | `"puris"` | Username for the custom database user. |
+| postgresql.enabled | bool | `true` | Enable postgres by default, set to false to use existing postgres. Make sure to set backend.puris.jpa.hibernate.ddl-auto accordingly (by default database is created using hibernate ddl from backend). |
+| postgresql.service | object | `{"ports":{"postgresql":5432}}` | Possibility to override the name nameOverride: "" |
+| postgresql.service.ports.postgresql | int | `5432` | Port of postgres database. |
## NOTICE
diff --git a/frontend/package.json b/frontend/package.json
index 54d949db..15e0bee2 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -2,7 +2,7 @@
"name": "puris-frontend",
"description": "Puris frontend",
"license": "Apache-2.0",
- "version": "2.0.1",
+ "version": "2.0.2",
"type": "module",
"scripts": {
"dev": "vite --host",