Skip to main content
Version: 24.08

Development View

EcoPass KIT Pictotogram

Introduction

General Development Information

The developer view provides developers with resources to utilize the EcoPass KIT effectively. On the one side developers can learn how to integrate the EcoPass KIT into their applications and to make use of the product passport exchanging feature via the Catena-X network. On the other side, IT-Administrators will learn how to provide the needed passport data and which components are required. Thereby, this KIT covers various aspects, starting from how the available API Endpoints can be utilized for data models and how to make them available in the Catena-x Data Space.

Architecture Overview

The following Figure shows how the EcoPass KIT (represented by Digital Product Passport Frontend and Backend) is embedded in the overall architecture.

EcoPassKIT IT Arch Picture

Data Retrieval Flow

In order to achieve a better understanding of the EcoPass KIT data retrieval flow, we can detail a specific example where an user wants to retrieve a specific passport for a asset in Catena-X using the EcoPass KIT (reference implementation digital-product-pass).

In the data retrieval flow example below we will imagine that an user wants to retrieve the data related to a Catena-X Digital Product Pass ID he has in his product as form of QR Code and ID:

Sequence Diagramm

IDCX:XYZ78901:IMR18650V1

As defined in the standard CX-0096 Triangle Document for Digital Product Pass the search id used has the following semantic:


CX:<manufacturerPartId>:<partInstanceId>

IDDescription
CXThe "CX" argument is the one that indicates that this ID is a Catena-X Search Identificator.
<manufacturerPartId>The "manufacturerPartId" makes reference to the id type of the product. It is the identification the manufacturer gives to a specific part he produced.
<partInstanceId>The "partInstanceId" stands to the specific id of the product. This id needs to be registered in the digital twin from the aspect. An example value in case of batteries would be the batteryDMC_Code.

Note: This identifications as defined in the standard MUST be added to the Digital Twin. For more information consult the Operation View Guide.

Prerequisites

In order to retrieve data in the Catena-X Network a number of services need to be available and have data register on them. Otherwise the data retrieval would simply not work because the consumer application would not "find" the specific searched asset even if it would be registered in the provider side.

Service NameDescriptionReference ImplementationStandardized in
Discovery FinderA microservice resolving a type of identifiers against a set of BPN-Discovery Servers. Responsible to give the search endpoints for a type of ideclipse-tractusx/sldt-discovery-finderCX - 0053
BPN DiscoveryA microservice resolving a particular assetId against the registered BPN of its owner. Responsible for indicating the BPNs for the IDs registered by the providerseclipse-tractusx/sldt-bpn-discoverCX - 0053
EDC DiscoveryA microservice that resolves a BPN against an EDC endpoint. Responsible for giving the EDC endpoints of one or more BPNseclipse-tractusx/portal-backend - Code ImplementationCX - 0001
Digital Twin RegistryAn exhaustive list of all Submodel Servers, with link to their assets, adhering to the AAS Registry API. Responsible for having the Digital Twins of the provider and indicating the endpoints to the Passport Aspects.eclipse-tractusx/sldt-digital-twin-registry OR Digital Twin KITCX - 0002
Submodel ServerThe data source adhering to a subset of the Submodel API as defined in AAS Part-2 3.0. Where the Passport Aspects are storedFA³ST-Framework, Eclipse Basyx, AASX ServerCX - 0002
EDCMain gateaway to the network. In this use case two EDC need be existing, one connected to the Digital Product Pass (EcoPass KIT) [EDC Consumer] and another to the Provider Catena-X components [EDC Provider]eclipse-tractusx/tractusx-edcCX - 0018 OR Connector KIT
Digital Product PassThe [EcoPass KIT] reference implementation. The application responsible for retrieving the passports and interacting with the services listed above.eclipse-tractusx/digital-product-passCX - 0143

Note: The diagrams match the architecture proposed in the Digital Product Pass reference implementation Arc42 and Data Retrieval Guide. Using the discovery services from Catena-X

Here is a diagram of the data retrial flow necessary to retrieve any data from the Catena-X Network without any optimizations:

Data Retrieval Flow

1. Discovery Phase

At the beginning we start calling the Discovery Service which is responsible for giving us the urls from the BPN Discovery and the EDC Discovery this two service give us first a BPN or Business Partner Number for a specific id and the EDC Discovery will give you a list of EDC registered by one company's BPN.

2. Digital Twin Registry Search Phase

Once we have a list of EDCs we need to find which of this EDCs contain the Digital Twin Registry component. We can filter which EDCs contain the Digital Twin Registry by simply calling for the catalog with the type condition of the contract that must have the data.core.digitalTwinRegistry standardized type.

Once we have the list of DTRs we need to negotiate each contract retrieve in the catalog so that we can have the Contract Agreement Id which is given by the EDC once the contact is signed and agreed. This id will be used later to request the transfer for the EDR token for accessing the Digital Twin Registry through the EDC Provider Data Plane Proxy.

3. Digital Twin Search Phase

We need to search for the Digital Twins inside of the Digital Twin Registries, and once we found it we can start the negotiation for the submodelDescriptor we are searching for that can be for example a: Digital Product Pass, Battery Pass, Single Level BOM as Built or a Transmission Pass.

4. Data Negotiation and Transfer Phase

Once we have the submodel we are going to call the [subprotocolBody] url of the endpoint interface with name SUBMODEL-3.0. This will provide for us the asset id to negotiate with the EDC Provider. Once this asset is negotiated we will request for the transfer and EDR token will be sent to the backend by the EDC Provider, allowing us to query the dataplane url contained in the href field of the endpoint interface. And in this way we will retrieve the data using the EDC Provider Data Plane Proxy.

Technical Detailed Phases

1. Discovery Phase + 2. Digital Twin Registry Search Phase

At the discovery phase the digital product pass application (EcoPass KIT) will search in the Discovery Service for the following keys:

KeyService Name
bpnEDC Discovery Service
manufacturerPartIdBPN Discovery Service

By searching for this keys the application will find the necessary services and will be able to search for the information needed to start the search for digital twin registries.

After the discovery phase, the search for digital twin registries is one of the core phases to be done when retrieving data in Catena-X. It is necessary for filtering the EDCs which contain the digital twin registry assets, allowing an optimized search without high waiting times.

Once the negotiation for the digital twin registries assets are done we would be able to retrieve a catalog for the user to search the serialized Id (key: partInstanceId, example value: batteryDMC_code).

Prerequisites for Discovery Phase + Digital Twin Registry Search API

The following information is required to enable the decentralized search for digital twin registries:

NameExampleDescription
Search Id TypemanufacturerPartIdThe search id type is required first of all to know in which BPN Discovery services to search. After this same id will be introduced in the Discovery Service and we will obtain a list of BPN Discovery Endpoints. After this same id will be introduce as the type attribute in each BPN Discovery.
Search Id ValueXYZ78901The search id value is required for searching in the BPN Discovery services. One example could be the product type id of a company, which is owned by an unique BPN reducing the complexity of the search.

Sequence Diagram

This sequence diagram represents the digital twin search and the discovery phases. For more information go to explanation Sequence Diagram

NOTE: For learning how to register the assets and the digital twin registry and operate the EcoPass KIT visit the Operation View

3. Digital Twin Search Phase Details

The digital twin searching phase involves searching in every digital twin registry for the desired digital twin asset. In this digital twin we will find the necessary information for requesting the contract information for the "digital twin submodels".

Prerequisites for Digital Twin Search API

The following information is required for enabling the digital twin search, in order to start the data transfer phase:

NameExampleDescription
Specific Asset Id TypepartInstanceIdThe specific asset id type is used to search in the digital twin registry for a specific digital twin. It is basically the name of "specificAssetId" object located at the digital twin specificAssetIds property. The *partInstanceId* is used as an example most of the time, since the digital twin registry implemented a hotfix that allows companies say who can access to their partInstanceId fields. Now allowing the "PUBLIC_READABLE" property.
Specific Asset Id TypeIMR18650V1The specific asset id value is added in the digital twin lookup when calling the EDC Provider Proxy. It basically points to the value of the Specific Asset Id Type property.

Digital Twin Search

4. Data Negotiation and Transfer Phase Details

The Data Negotiation and Transfer Phase is the phase responsible for the final data transfer and negotiation. In this phase we retrieve the data using the EDC.

Prerequisites for Negotiate and Transfer API

The following information is required for enabling the digital twin search, in order to start the data transfer phase:

NameExampleDescription
Contract with PolicyContract ExampleTo start the contract negotiation we need to agree on a policy for the a specific contract. This needs to be selected by the one that is requesting the data.

Sequence Diagram for Negotiate and Transfer

Negotiation and Transfer

Authentication and Authorization

The authentication is administrated by the IAM Services from the Portal defined in the CX - 0001 Standard

The backend APIs are authenticated by using a JWT Token in the request as Bearer token. The frontend is responsible for obtaining this token in the portal federated IAM.

The EcoPass KIT has two authorization methods:

Authorization TypeDescription
Portal RolesEach digital product pass application contains an specific "AppId" provided by the portal in the Marketplace registration. And this Id shall be added to the configuration of the DPP Application in order to authenticate the user. If the end user contains any role added in the portal it will have access to the application if enabled.
Business Partner Number (BPN)The digital product pass application contains a check for the "BPN" of the end user. An option is also to allow the user to login if he is belonging to the company of the configured "EDC" so no user can act in name of a specific company.

NOTE: The authorization can be configured in the EcoPass KIT configuration so that it matches the business interests of the operator.

For more information on how the Authentication & Authorization is done consult the reference implementation Digital Product Pass Arc42

API Specification

Open API specification

The Digital Product Pass / EcoPass KIT Open API specification is available at the swagger hub from Tractus-X:

https://app.swaggerhub.com/apis/eclipse-tractusx-bot/digital-product-pass/2.1.3

EcoPass APIs

The APIs below are the ones contained in the Digital Product Pass Backend reference implementation. Which can be reused for retrieving aspects from the Catena-X Network.

APIMethodDescriptionParameters
/api/contract/createPOSTThe /api/contract/create api is responsible for calling the BPN Discovery service searching for the BPN of a manufacturerPartId and validating if there is any Decentral Digital Twin Registry available for the BPN number found in the EDC Discovery service.Go to Params
/api/contract/searchPOSTAt the /api/contract/search API the user can search for a serialized Id and get its contract. The Backend will search for the Digital Twin and will return the contract for the first one that is found. A sign token (a sha256 hash) is returned also and acts like a "session token" allowing just the user that created the process to sign or decline the contract.Go to Params
/api/contract/agreePOSTOnce the user has the contract he can call the /api/contract/agree API to start the negotiation process and the transfer of the passport. This means that the user accepted the policy and the frame-contracts contained in the contract policy.Go to Params
/api/contract/declinePOSTThe other option rather than /agree is the /decline API, that basically blocks the process and makes it invalid. This means that the user declined the specific contract that was found for this process.Go to Params
/api/contract/cancelPOSTThe user can use /cancel to interrupt the negotiation process once it is signed by mistake if is the case. It will be only valid until the negotiation is made.Go to Params
/api/contract/status/<processId>GETAfter the user signs the contract he can use the /status API to get the process status and see when it is ready to retrieve the passport using the API /data.Go to Params
/api/dataPOSTThe API /data will decrypt the passport file that is encrypted using the session token "sign token", and will delete the file so that it is returned just once to the user and can not be accessed anymore. So a new passport will be always need to be requested.Go to Params
/api/data/requestPOSTThe Single API /data/request calls the necessary above APIs in order to retrieve the passport with auto-sign capability, it calls the create API, then search API, signs with the agree API and retrieves the data with the data API. The authentication is done with an API Key received as an HTTP header.Go to Params

Parameters

/api/contract/create
ParameterValue NameMandatory or Optional Value
idsearchIdValue[REQUIRED]
typesearchIdTypeNamemanufacturerPartId
/api/contract/search
ParameterValue NameMandatory or Optional Value
idserializedIdValue[REQUIRED]
idTypeserializedIdTypeNamepartInstanceId
processIdprocessIdentification[REQUIRED]
/api/contract/agree
ParameterValue NameMandatory or Optional Value
processIdprocessIdentification[REQUIRED]
contractIdcontractIdentification[REQUIRED]
policyIdpolicyIdentificationIf no policyId is specified then the first policy of the contract will be taken
tokensearchSessionToken[REQUIRED]
/api/contract/decline
ParameterValue NameMandatory or Optional Value
processIdprocessIdentification[REQUIRED]
tokensearchSessionToken[REQUIRED]
/api/contract/cancel
ParameterValue NameMandatory or Optional Value
processIdprocessIdentification[REQUIRED]
contractIdcontractIdentification[REQUIRED]
tokensearchSessionToken[REQUIRED]
/api/contract/status/{processId}
ParameterValue NameMandatory or Optional Value
processIdprocessIdentification[REQUIRED]
/api/data
ParameterValue NameMandatory or Optional Value
processIdprocessIdentification[REQUIRED]
contractIdcontractIdentification[REQUIRED]
tokensearchSessionToken[REQUIRED]

/api/data/request

API Key

Header:

X-Api-Key: <apiKeySecret>

NOTE: This can be changed in the configuration

API Parameters
ParameterValue NameMandatory or Optional Value
idsearchIdValue[REQUIRED]
idTypesearchIdTypeNamemanufacturerPartId
discoveryIdserializedIdValue[REQUIRED]
discoveryIdTypeserializedIdTypeNamepartInstanceId
childrensearchForChildrentrue/false [OPTIONAL]
semanticIdsemanticIdentificationsemanticId [OPTIONAL]
The Single API Data Retrieval

The Single API /api/data/request permits to get data from a Catena-X Provider by abstracting of all the separated APIs needed to do so. Authenticating with an defined API Key and with the mandatory and given serialized and discovery identifications, this API will create the process and check for the viability of the data retrieval, searches for a passport with the given serialized id, automatically signs the contract retrieved from provider and start negotiation, waits for the negotiation to be done and returns the data negotiated and transferred. In short, it's the set of the various APIs in one with auto-sign functionality to agile the data retrieval in a simple way.

[!IMPORTANT]

The policy selection in the single api is not enabled, in this way the first contract and policy available for the asset will be selected. Using a policy managment system is recommended in order to allow this API to retrieve data assuring the policies are checked and compliant with your bussiness.

External API calls

ServiceMethodPathParams
Discovery Service [CX-0053]POST/api/administration/connectors/discovery/searchkey:manufacturerPartId (BPN Discovery) & key:bpn (EDC Discovery)
BPN Discovery Service [CX-0053]POST/api/administration/connectors/bpnDiscovery/searchkey:manufacturerPartId
EDC Discovery Service [CX-0001]POST/api/administration/connectors/discovery/search{[<Company's BPNL>]}
Digital Twin Registry [CX-0002]GET/lookup/shellskey:partInstanceID, value: batteryDMC-Code or Product Identification Code
Digital Twin Registry [CX-0002]GET/shell-descriptors/{digitalTwinId}key:partInstanceID, value: batteryDMC-Code or Product Identification Code

Reference Implementations

A reference implementation and a corresponding documentation can be found here.

This reference includes a frontend and a backend allowing users to look up and display Battery Passport assets. The Helm charts of this reference implementation are located here.

Documentation in the context development

The following represents a collection of relevant documentation regarding the presented adaptation and all related services:

EDC Domain Model

Reference Implementation:

Add-ons

The digital product pass reference implementation can have a series of add-ons that enhance the experience of the applicaiton by using other components from Catena-X.

Item Relationship Service Add-on

The Digital Product Pass applicaiton can be integrated with the Item Relationship Service (IRS). The drill down of components will be enabled and if the submodels are configured correctly, in the dpp-frontend component you will be see which childs in a "1 level" deep available. Respecting the one up and one down principle from Catena-X.

The configuration details can be found in the Operation View.

Digital Product Pass Verification Add-on

The Digital Product Passport Verification add-on is basically a concept for Certifying data in Catena-X as a auditor, how to provider certify data enabeling the verification as a data provider and how consumers verify this same data when retriving them from their data providers.

The focus is on proving a process, artifacts and technologies, based on the existing SSI concept, aiming to enable Certification/Verification processes in Catena-X using wallets.

The documentation from the Digital Product Pass Verification Add-on is available here. The concept enables the verification of the Data in the Reference Implementation using a simple wallet, a functional wallet that can:

  • Sign verifiable credentials with JsonWebSignature2020 proofs
  • Verify verifiable credentials with JsonWebSignature2020 proofs
  • Manage private and public keys, providing via DID Documents public keys in JsonWebKey2020 format

Additionally the simple wallet contains a extension for creating JSON-LD @contexts using Catena-X SAMM Models Schemas. This allows the verifiable credentials with the semantic models to be valid JSON-LDs documents and enables the context of the existing and future modeled documents.

Verification Addon Screenshot

Business Partner Data Management Add-on

When passports are retrieved from the data providers not all the company data is available to be visualized and shown. In order to eliminate the need to maintain models which contain references to companies in Catena-X the new models contain the BPNS and BPNL from the companies. Which can be translated into Address and Company information using the https://github.com/eclipse-tractusx/bpdm reference implementation.

[!IMPORTANT]

Companies need to be onboarded in the portal and the information needs to be visible in the Central BPDM Pool Service, where the company information like address is found.

Additionally: Technical User credentials must be provided in order to enable the access to the service.

Data Sovereignty Add-on

In order to retrieve data following the Catena-X Data Sovereighnty guidelines, an addon was developed and can be enabled in the helm chart configuration for configuring the polices which are allowed to be used, with additional asset policy selection in the dpp-frontend component.

A guide for using this configuration add-on can be found here.

Want to know more about Catena-X Digital Product Passes?

Digital Product Pass Tutorial

For the Second Tractus-X Community Days there was prepared a tutorial for understanding and using the Digital Product Pass application.

You can find it here, there you will find information and guides on how to:

  • Deploy the Application
  • Create Digital Product Pass Aspect Models
  • Create Digital Twins for Digital Product Passports
  • Understand how to consume data
  • Learn how to create digital product passport QR codes.

Attachments

AAS 3.0 Digital Twin Example

{
"description": [
{
"language": "en",
"text": "Battery Digital Twin"
}
],
"displayName": [],
"globalAssetId": "urn:uuid:efcb5f8d-f31c-4b1f-b090-9c878054554d",
"idShort": "Battery_BAT-XYZ789",
"id": "urn:uuid:3d050cd8-cdc7-4d65-9f37-70a65d5f53f5",
"specificAssetIds": [
{
"name": "manufacturerId",
"value": "BPNL000000000000",
"externalSubjectId": {
"type": "ExternalReference",
"keys": [
{
"type": "GlobalReference",
"value": "BPNL000000000000"
},
{
"type": "GlobalReference",
"value": "PUBLIC_READABLE"
}
]
}
},
{
"name": "manufacturerPartId",
"value": "XYZ78901",
"externalSubjectId": {
"type": "ExternalReference",
"keys": [
{
"type": "GlobalReference",
"value": "BPNL000000000000"
},
{
"type": "GlobalReference",
"value": "PUBLIC_READABLE"
}
]
}
},
{
"name": "partInstanceId",
"value": "BAT-XYZ789",
"externalSubjectId": {
"type": "ExternalReference",
"keys": [
{
"type": "GlobalReference",
"value": "BPNL000000000000"
}
]
}
},
{
"key" : "assetLifecyclePhase",
"value": "AsBuilt"
},
{
"key" : "digitalTwinType",
"value": "PartInstance"
}
],
"submodelDescriptors": [
{
"endpoints": [
{
"interface": "SUBMODEL-3.0",
"protocolInformation": {
"href": "https://<edc-dataplane-url>/<data-path>/urn:uuid:1ea64f49-8b2b-4cd2-818e-cf9d452c6fea",
"endpointProtocol": "HTTP",
"endpointProtocolVersion": [
"1.1"
],
"subprotocol": "DSP",
"subprotocolBody": "id=urn:uuid:3e4a5957-f226-478a-ab18-79ced49d6195;dspEndpoint=<edc-url>",
"subprotocolBodyEncoding": "plain",
"securityAttributes": [
{
"type": "NONE",
"key": "NONE",
"value": "NONE"
}
]
}
}
],
"idShort": "SerialPart",
"id": "urn:uuid:1ea64f49-8b2b-4cd2-818e-cf9d452c6fea",
"semanticId": {
"type": "ExternalReference",
"keys": [
{
"type": "Submodel",
"value": "urn:bamm:io.catenax.serial_part:1.0.1#SerialPart"
}
]
},
"description": [],
"displayName": []
},
{
"endpoints": [
{
"interface": "SUBMODEL-3.0",
"protocolInformation": {
"href": "https://<edc-dataplane-url>/<data-path>/urn:uuid:09d5d8a9-9073-47b6-93c6-80caff176dca",
"endpointProtocol": "HTTP",
"endpointProtocolVersion": [
"1.1"
],
"subprotocol": "DSP",
"subprotocolBody": "id=urn:uuid:3e4a5957-f226-478a-ab18-79ced49d6195;dspEndpoint=<edc-url>",
"subprotocolBodyEncoding": "plain",
"securityAttributes": [
{
"type": "NONE",
"key": "NONE",
"value": "NONE"
}
]
}
}
],
"idShort": "singleLevelBomAsBuilt",
"id": "urn:uuid:09d5d8a9-9073-47b6-93c6-80caff176dca",
"semanticId": {
"type": "ExternalReference",
"keys": [
{
"type": "Submodel",
"value": "urn:bamm:io.catenax.single_level_bom_as_built:1.0.0#SingleLevelBomAsBuilt"
}
]
},
"description": [],
"displayName": []
},
{
"endpoints": [
{
"interface": "SUBMODEL-3.0",
"protocolInformation": {
"href": "https://<edc-dataplane-url>/<data-path>/api/public/data/urn:uuid:777a3f0a-6d29-4fcd-81ea-1c27c1b870cc",
"endpointProtocol": "HTTP",
"endpointProtocolVersion": [
"1.1"
],
"subprotocol": "DSP",
"subprotocolBody": "id=urn:uuid:3e4a5957-f226-478a-ab18-79ced49d6195;dspEndpoint=<edc-url>",
"subprotocolBodyEncoding": "plain",
"securityAttributes": [
{
"type": "NONE",
"key": "NONE",
"value": "NONE"
}
]
}
}
],
"idShort": "digitalProductPass",
"id": "urn:uuid:777a3f0a-6d29-4fcd-81ea-1c27c1b870cc",
"semanticId": {
"type": "ExternalReference",
"keys": [
{
"type": "Submodel",
"value": "urn:samm:io.catenax.generic.digital_product_passport:4.0.0#DigitalProductPassport"
}
]
},
"description": [
{
"language": "en",
"text": "Digital Product Passport Submodel"
}
],
"displayName": []
}
]
}

Contract Example

{
"@id": "dpp-asset",
"@type": "dcat:Dataset",
"odrl:hasPolicy": {
"@id": "ZGVmYXVsdC1jb250cmFjdC1kZWZpbml0aW9u:cmVnaXN0cnktYXNzZXQ=:MTIxMjYzMzgtYzhkMC00MGQ4LTkxYWMtZmY2ZTY0ZTQ5ZmM0",
"@type": "odrl:Set",
"odrl:permission": [
{
"odrl:action": "USE",
"odrl:constraint": {
"odrl:and": [
{
"odrl:leftOperand": "cx-policy:Membership",
"odrl:operator": {
"@id": "odrl:eq"
},
"odrl:rightOperand": "active"
},
{
"odrl:leftOperand": "cx-policy:FrameworkAgreement",
"odrl:operator": {
"@id": "odrl:eq"
},
"odrl:rightOperand": "circulareconomy:1.0"
},
{
"odrl:leftOperand": "cx-policy:UsagePurpose",
"odrl:operator": {
"@id": "odrl:eq"
},
"odrl:rightOperand": "cx.circular.dpp:1"
}
]
}
}
],
"odrl:prohibition": [],
"odrl:obligation": [],
"odrl:target": "registry-asset"
},
"dcat:distribution": [
{
"@type": "dcat:Distribution",
"dct:format": {
"@id": "HttpProxy"
},
"dcat:accessService": "bc491229-1b41-49a9-9101-a430a4907e6e"
},
{
"@type": "dcat:Distribution",
"dct:format": {
"@id": "AmazonS3"
},
"dcat:accessService": "bc491229-1b41-49a9-9101-a430a4907e6e"
}
],
"asset:prop:type": "data.core.digitalTwinRegistry",
"description": "Digital Twin Registry for DPP",
"id": "registry-asset",
"contenttype": "application/json"
}

NOTICE

This work is licensed under the CC-BY-4.0.

  • SPDX-License-Identifier: CC-BY-4.0
  • SPDX-FileCopyrightText: 2023, 2024 ZF Friedrichshafen AG
  • SPDX-FileCopyrightText: 2023, 2024 Robert Bosch GmbH
  • SPDX-FileCopyrightText: 2023, 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
  • SPDX-FileCopyrightText: 2023, 2024 T-Systems International GmbH
  • SPDX-FileCopyrightText: 2023, 2024 SAP SE
  • SPDX-FileCopyrightText: 2023, 2024 CGI Deutschland B.V. & Co. KG
  • SPDX-FileCopyrightText: 2023, 2024 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. für ihre Institute IPK und IPK
  • SPDX-FileCopyrightText: 2023, 2024 BASF SE
  • SPDX-FileCopyrightText: 2023, 2024 Henkel AG & Co. KGaA
  • SPDX-FileCopyrightText: 2023, 2024 Contributors to the Eclipse Foundation
  • Source URL: https://github.com/eclipse-tractusx/digital-product-pass