.wpb_animate_when_almost_visible { opacity: 1; }
United Way - Product Inventory Management
United Way - Product Inventory Management
1.0

Table of Contents

This document is a complement to TMF 637 documentation regarding the technical details mandated by the TM Forum applied to our application (https://www.tmforum.org/resources/standard/tmf637-product-inventory-management-api-rest-specification-r19-0-0/)

Authentication prerequisite

Access to this API is secured by the OAuth 2.0 framework with the Client Credentials grant type, which means that you will have to present an OAuth 2.0 access_token whenever you want to request this API.

It's easy to negotiate this access_token: just send a request to the proper token negotiation endpoint, with a Basic Authentication header valued with your own client_id and client_secret.

For this API, the token negotiation endpoint is: https://api.orange.com/oauth/v3/token.

A technical guide is available to learn how to negotiate and manage these access_token.

SDK to manage token lifecycle could help you to implement cache token.

Scopes

Scopes restrict specific request verbs for any resource of this api. You must specify at least one when requesting for an access_token. This is done by adding a scope parameter within the access token request. Scopes are additive and shall be space separated.

As an example:

curl -X POST \
-H "Authorization: Basic NktSSHljksdj7P...Jjndb6UdnlrT2lOaA==" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Accept: application/json" \
-d "grant_type=client_credentials&scope=owf:united-way:scope1 owf:united-way:scope2" \
https://api.orange.com/oauth/v3/token

Scopes available in this api are explained below.

ScopeDescription
owf:united-way:product-inventory:v1:readonlyAllow GET, HEAD http request for any resource of this api
  • For your client to do GET requests, you must request an access_token with '&scope=owf:united-way:product-inventory:v1:readonly'.

Scopes are not fine-grained permissions. While an access_token can allows your client application to do GET request, the request can be forbidden at the resource level.

We strongly encourage you to register a dedicated client application to subscribe to all United Way apis. You will be able to request an access_token with all scopes required to do a complete scenario over all needed apis.

Important

Please pay particular attention to properly handle authentication error responses in your application. See the section Errors

Base URL

The Base URL is the first part of the full invocation URL, just before the resource paths defined in the API reference.

The Base URL is comprised of the scheme ('https'), the authority (i.e. the Fully Qualified Domain Name) and the API base path.

Whenever you request this API and encounter a 404 NOT FOUND HTTP error response, please check first that the Base URL is correct.

The Base URL for this API is: https://api.orange.com/united-way/product-inventory-management/v1

The documentation below assumes that, whenever you make requests on this API, you are prepending the Base URL to the resource paths defined for this API.

Resources

ResourceMethodDescription
ProductGETList or find Product objects

There are 4 hierarchical types of products, represented by the following types of product offers (ordered by descending level):

contract > play > set > atomicOffer

A contract finally represents a package (or bundle) of products of type play. The latter are themselves bundles of set products, which themselves are bundles of atomicOffer.

The ProductRelationship object, attribute of the product, will allow to create the relation between the "bundle" product and the "bundled" product in the following way:

It is the upper hierarchical level that will carry this relationship

"contract" : {
"id": "2c901eee7f9da00a017facd33dd00118",
"href": "/api/v1/product/2c901eee7f9da00a017facd33dd00118",
...
"productRelationship": [
{
"relationshipType": "bundles",
"product": {
"id": "ref_bundled_product_id",
"href": "/api/v1/product/ref_bundled_product_id",
.....
}
}
]
}

Given a product matching productOffering.productOfferingType=Contract, fetching this product with depth parameter to 2 will send us the contract product with his 1 sub-levels contract and plays, depth parameter is between 1 and 4.

Query resources patterns

Query Resources with attribute selection

In every GET request, you can add a fields parameters to filter the response body with a subset of the attributes.

Example:

GET /product?fields=name
[
  {
    "id": "2c9280827c98898a017c9920269f002b",
    "href": "/api/v1/product/2c9280827c98898a017c9920269f002b",
    "name": "Caractéristiques principales"
  },
  {
    "id": "2c9280827c98898a017c992154b0002e",
    "href": "/api/v1/product/2c9280827c98898a017c992154b0002e",
    "name": "Point de livraison sur site client final"
  }
]

For better response time, only request fields you really need. Especially when requesting on the list endpoint.

Note that attributes id and href are always returned, even if fields=none.

Query Resources with attribute filtering

According to TMF630 REST API Design Guidelines, you can filter data by specifying attributes in the querystring. However, not all attributes can be used as a filter criteria. Herein, the exhaustive list of available parameters with the associated allowed operators:

Product attribute filter

  • = or .eq= : equal to
  • >= or .gte= : greater than or equal to
  • > or .gt= : strictly greater than
  • <= or .lte= : lower than or equal to
  • < or .lt= : strictly lower than
  • <> or .ne= : Not equal

Those operators can used with those fields :

  • id
  • name
  • externalIdentifier.id
  • externalIdentifier.externalIdentifierType
  • productOffering.id
  • productOffering.productOfferingType
  • productRelationship.relationshipType
  • productRelationship.product.id
  • status
  • operationalStatus
  • productCharacteristic.id
  • productCharacteristic.name
  • productCharacteristic.value
  • productCharacteristic.value.id
  • productCharacteristic.value.name
  • productOrderItem.productOrderId
  • realizingService.id
  • realizingService.name
  • relatedParty.id
  • relatedParty.role

Example: (for all intents and purposes "fields" QueryParam is set to "name" to keep the responses small)

Given a list of 4 products : 3 product have the name 'Collecte régionale' and the last one have the name 'Collecte nationale'

GET /product?fields=name&name=Collecte régionale
[
  {
    "id": "2c9004647f69a6da017f6a1c55ba0000",
    "href": "/api/v1/product/2c9004647f69a6da017f6a1c55ba0000",
    "name": "Collecte régionale"
  },
  {
    "id": "2c9004647f69a6da017f6a1c577c0001",
    "href": "/api/v1/product/2c9004647f69a6da017f6a1c577c0001",
    "name": "Collecte régionale"
  },
  {
    "id": "2c9180857cbbb905017cc1a14f410006",
    "href": "/api/v1/product/2c9180857cbbb905017cc1a14f410006",
    "name": "Collecte régionale"
  }
]

For detailed information on parameters, check the API reference

Query Resources with iterators

When requesting collections, you should set pagination query parameters.

  • offset: Requested index for start of resources to be provided in response requested by client.
  • limit: Requested number of resources to be provided in response requested by client. Default is 50.

After each request, explore the http headers to retrieve the number of results

  • X-Result-Count: The number of matching resources in the JSON response.
  • X-Total-Count: The total number of matching resources.

If X-Total-Count is bigger than X-Result-Count, you need to request again by incrementing the offset query parameter with the X-Result-Count value. You can limit the number of result per page with limit.

Note that you can't request more result per page than the default value for limit. Be sure to read the header X-Result-Count.

Example:

For example, to retrieve only the second element in the list

GET /product?fields=name&limit=1&offset=1
[
  {
    "id": "2c9004647f69a6da017f6a1c55ba0000",
    "href": "/api/v1/product/2c9004647f69a6da017f6a1c55ba0000",
    "name": "Collecte régionale"
  }
]

Sorting

The query parameter sort is used to sort the resultset in the order specified by the fields listed as value. The default direction is ascending order, use the - modifier to sort in descending order.

Example:

GET /product?fields=name&offset=0&limit=2&sort=name
HTTP/1.1 200 OK
X-Result-Count: 2
X-Total-Count: 2
[
  {
    "id": "2c9004647f69a6da017f6a1c55ba0000",
    "href": "/api/v1/product/2c9004647f69a6da017f6a1c55ba0000",
    "name": "Collecte régionale"
  },
  {
    "id": "2c9180837dba2335017dc33dffc5002a",
    "href": "/api/v1/product/2c9180837dba2335017dc33dffc5002a",
    "name": "string"
  }
]

Depth and Expand Directive

With this endpoint : GET /product/{id}

The depth parameter is used to expand the level of referenced (related) entities such as bundled offerings and " target" references of relations.

  • 0 = no depth
  • 1 = expand references to the root of the object
  • 2 = we expand the references of the references developed at the level above (1)
  • etc. (up to 3 if the root object is a contract)

(Only usable product/{id}| GET and productOffering.productOfferingType=Contract)

Only the productRelationship.product path will be expand recursively.

Example:

GET /product/:id?depth=2
{
  "id": "2c9180837dba2335017dc33dffc5002a",
  "href": "/api/v1/product/2c9180837dba2335017dc33dffc5002a",
  "isBundle": true,
  "name": "string",
  "agreement": [
    {
      "id": "AB2021097"
    }
  ],
  "place": [
    {
      "@type": "GeographicSiteBuilding",
      "role": "deliveryAddress",
      "buildingCode": "XXX/00000/X/XXXX"
    }
  ],
  "productOffering": {
    "id": "GOC40140084001",
    "name": "string",
    "productOfferingType": "contract"
  },
  "productOrderItem": [
    {
      "productOrderId": "2",
      "@type": "ProductOrder"
    }
  ],
  "productRelationship": [
    {
      "relationshipType": "bundles",
      "product": {
        "id": "2c9180837dba2335017dc33dee820025",
        "href": "/api/v1/product/2c9180837dba2335017dc33dee820025",
        "isBundle": true,
        "name": "string",
        "productOffering": {
          "id": "OC40140084001",
          "name": "string"
        },
        "productOrderItem": [
          {
            "productOrderId": "2",
            "@type": "ProductOrder"
          }
        ],
        "productRelationship": [
          {
            "relationshipType": "bundles",
            "product": {
              "id": "2c9180837dba2335017dc33ddde1001d",
              "href": "/api/v1/product/2c9180837dba2335017dc33ddde1001d",
              "isBundle": true,
              "name": "Caractéristiques principales",
              "productOffering": {
                "id": "GO40140084001",
                "name": "Caractéristiques principales"
              },
              "productOrderItem": [
                {
                  "productOrderId": "2",
                  "@type": "ProductOrder"
                }
              ],
              "productRelationship": [
                {
                  "relationshipType": "bundles",
                  "product": {
                    "id": "2c9180837dba2335017dc33d15160019",
                    "href": "/api/v1/product/2c9180837dba2335017dc33d15160019"
                  }
                }
              ],
              "relatedParty": [
                {
                  "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
                  "role": "buyer",
                  "@referredType": "Organization"
                },
                {
                  "id": "8f4ac814-5072-4519-9e8c-70bd6c087e80",
                  "role": "user",
                  "@referredType": "Organization"
                }
              ],
              "status": "ACTIVE",
              "operationalStatus": "ACTIVE",
              "@type": "ProductValue"
            }
          },
          {
            "relationshipType": "bundles",
            "product": {
              "id": "2c9180837dba2335017dc33debdf001f",
              "href": "/api/v1/product/2c9180837dba2335017dc33debdf001f",
              "isBundle": true,
              "name": "Point de livraison sur site client final",
              "productOffering": {
                "id": "GO40140084002",
                "name": "Point de livraison sur site client final"
              },
              "productOrderItem": [
                {
                  "productOrderId": "2",
                  "@type": "ProductOrder"
                }
              ],
              "productRelationship": [
                {
                  "relationshipType": "bundles",
                  "product": {
                    "id": "2c9180837dba2335017dc33d372f001a",
                    "href": "/api/v1/product/2c9180837dba2335017dc33d372f001a"
                  }
                }
              ],
              "relatedParty": [
                {
                  "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
                  "role": "buyer",
                  "@referredType": "Organization"
                },
                {
                  "id": "8f4ac814-5072-4519-9e8c-70bd6c087e80",
                  "role": "user",
                  "@referredType": "Organization"
                }
              ],
              "status": "ACTIVE",
              "operationalStatus": "ACTIVE",
              "@type": "ProductValue"
            }
          },
          {
            "relationshipType": "bundles",
            "product": {
              "id": "2c9180837dba2335017dc33dece90021",
              "href": "/api/v1/product/2c9180837dba2335017dc33dece90021",
              "isBundle": true,
              "name": "Interface de livraison sur site client final",
              "productOffering": {
                "id": "GO40140084003",
                "name": "Interface de livraison sur site client final"
              },
              "productOrderItem": [
                {
                  "productOrderId": "2",
                  "@type": "ProductOrder"
                }
              ],
              "productRelationship": [
                {
                  "relationshipType": "bundles",
                  "product": {
                    "id": "2c9180837dba2335017dc33dc216001b",
                    "href": "/api/v1/product/2c9180837dba2335017dc33dc216001b"
                  }
                }
              ],
              "relatedParty": [
                {
                  "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
                  "role": "buyer",
                  "@referredType": "Organization"
                },
                {
                  "id": "8f4ac814-5072-4519-9e8c-70bd6c087e80",
                  "role": "user",
                  "@referredType": "Organization"
                }
              ],
              "status": "ACTIVE",
              "operationalStatus": "ACTIVE",
              "@type": "ProductValue"
            }
          },
          {
            "relationshipType": "bundles",
            "product": {
              "id": "2c9180837dba2335017dc33ded7c0023",
              "href": "/api/v1/product/2c9180837dba2335017dc33ded7c0023",
              "isBundle": true,
              "name": "Intervention",
              "productOffering": {
                "id": "GO40140084004",
                "name": "Intervention"
              },
              "productOrderItem": [
                {
                  "productOrderId": "2",
                  "@type": "ProductOrder"
                }
              ],
              "productRelationship": [
                {
                  "relationshipType": "bundles",
                  "product": {
                    "id": "2c9180837dba2335017dc33dd81c001c",
                    "href": "/api/v1/product/2c9180837dba2335017dc33dd81c001c"
                  }
                }
              ],
              "relatedParty": [
                {
                  "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
                  "role": "buyer",
                  "@referredType": "Organization"
                },
                {
                  "id": "8f4ac814-5072-4519-9e8c-70bd6c087e80",
                  "role": "user",
                  "@referredType": "Organization"
                }
              ],
              "status": "ACTIVE",
              "operationalStatus": "ACTIVE",
              "@type": "ProductValue"
            }
          }
        ],
        "relatedParty": [
          {
            "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
            "role": "buyer",
            "@referredType": "Organization"
          },
          {
            "id": "8f4ac814-5072-4519-9e8c-70bd6c087e80",
            "role": "user",
            "@referredType": "Organization"
          }
        ],
        "status": "ACTIVE",
        "operationalStatus": "ACTIVE",
        "@type": "ProductValue"
      }
    }
  ],
  "relatedParty": [
    {
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "role": "buyer",
      "@referredType": "Organization"
    },
    {
      "id": "8f4ac814-5072-4519-9e8c-70bd6c087e80",
      "role": "user",
      "@referredType": "Organization"
    }
  ],
  "status": "ACTIVE",
  "operationalStatus": "ACTIVE"
}

Notifications

Register listener

The registration of a listener is done by creating a HUB resource unique to the listener (equivalent of a subscription). The HUB resource is attached or bound to the API and its attribute specify the POST event callback address of the listener.

The hub is created via a POST api/hub call.

The POST call sets the communication endpoint address the service instance must use to deliver notifications (by default on all supported events). Note that a query expression may be supplied. The query expression may be used to filter specific event types and/or any content of the event. The query expression structure used for notification filtering is the same than the one used for queries i.e. GET.

Note that you must save the id returned at the end of the subscription as the get method is not available. The scope ' readonly' must be use to post and delete a hub.

POST /hub
Accept: application/json
{
  "callback": "https://listener.com"
}

Notification available

For the API product management, the following notifications are defined:

Notifications related to Product:

  • ProductCreateEvent
  • ProductStateChangeEvent
  • ProductDeleteEvent
  • ProductExternalIdCreateEvent

Those notifications can be used to filter events. The example below shows how to register to a listener only for product creation:

{
  "callback": "https://listener.com",
  "query": "eventType = ProductCreateEvent"
}

Unregister listener

To unregister a listener, the HUB resource corresponding to the listener must be destroyed.

DELETE hub/{id}

This clears the communication endpoint address that was set by creating the Hub.

DELETE /api/hub/{id}
Accept: application/json

Operating status lifecycle

Actual operating statusNext possible operating status
abortedlocked, pendingActive
activeconfirmed, inDisturbance, pendingActive, pendingModification, pendingTerminate
cancelledconfirmed, created, pendingCancel
confirmedcreated
created
inDisturbanceactive
lockedpendingActive
pendingActiveconfirmed, locked
pendingCancelconfirmed, pendingActive
pendingModificationactive
pendingTerminateactive, inDisturbance, pendingModification
terminatedactive, inDisturbance, pendingModification, pendingTerminate

Errors

Failure to code a proper management of the error responses in your application may affect its resilience. Access to the API may be revoked if your application generates too many mishandled errors.

Your application must parse the returned HTTP response to check if an error is returned instead of a 200 OK. Orange APIs use appropriate HTTP status codes to indicate any request processing error, providing detailed information about the underlying fault. This helps you provide better feedback to your users and implement failure recovery mechanisms in your application.

For details on the main error codes, response format, tips and troubleshooting, see our Handling API errors guide

Errors 401

If you get a status code 401 with the error code 42 (such as below), then you have to request a new access token.

HTTP/1.1 401 Unauthorized
Content-Type: application/json
{
"code": 42,
"message": "Expired credentials",
"description": "The requested service needs credentials, and the ones provided
were out-of-date."
}

Token lifetime

  • Each access_token has a lifetime validity period. This validity period may change overtime to comply with security rules.
  • The token server has a maximum hourly quota per client application to prevent from misuse. Therefore, DON'T request an access_token each time you invoke the service API. DON'T hard-code a validity duration in your application. Instead, your application must parse the returned status code and error code to check if it needs to request a new access token.

For other 401 errors: check that you provide the right Authorization header with the right Bearer

Errors 400

In case of invalid request to the API, you will receive a 400 error code with detailed information in the body message, such as:

HTTP/1.1 400 Bad Request
{
  "code": 25,
  "description": "Missing header",
  "message": "...."
}

Errors 404

In case of you try to access to a product by ID using the following endpoint : GET product/{id}:

HTTP/1.1 404 Not Found
{
  "code": "60",
  "message": "Resource not found",
  "reason": "Resource not found",
  "@type": "Error"
}

Below you can find a table with the http codes and their respective functional codes and messages :

HTTP error codeParc code errorerror message
40020Invalid URL parameter value
40021Missing body
40022Invalid body
40023Missing body field
40024Invalid body field
40025Missing header
40026Invalid header value
40027Missing query-string parameter
40028Invalid query-string parameter value
40140Missing credentials
40141Invalid credentials
40142Expired credentials
40350Access denied
40351Forbidden requester
40352Forbidden user
40353Too many requests
40460Resource not found
40561Method not allowed

Use cases

1. I want to get all information from a product

Definition, description, collects, offer, prices, etc.. As a a member of the Sales Team, I want a get all details on a product.

GET /product/2c9004647f69a6da017f6a1c55ba0000 HTTP/1.1
{
  "id": "2c9004647f69a6da017f6a1c55ba0000",
  "href": "/api/v1/product/2c9004647f69a6da017f6a1c55ba0000",
  "name": "Collecte régionale",
  "creationDate": "2020-07-09T22:00:00.000Z",
  "startDate": "2021-02-02T23:00:00.000Z",
  "productCharacteristic": [
    {
      "id": "FONC40160084032",
      "valueType": "object",
      "name": "Région Collecte",
      "value": {
        "id": "VF0001640160084032",
        "name": "LORRAINE"
      }
    },
    {
      "id": "FONC40160084030",
      "valueType": "object",
      "name": "Niveau de service VLAN",
      "value": {
        "id": "VF0000140160084030",
        "name": "835 (Mono VC/VLAN)"
      }
    },
    {
      "id": "FONC40160084033",
      "valueType": "string",
      "name": "N° de VLAN de livraison",
      "value": "236"
    }
  ],
  "productOffering": {
    "id": "O40160084003",
    "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productOffering/O40160084003",
    "name": "Collecte régionale",
    "productOfferingType": "atomicOffer"
  },
  "productSpecification": {
    "id": "PS40160084022",
    "name": "Collecte régionale"
  },
  "relatedParty": [
    {
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "Optimum collect 1",
      "role": "buyer",
      "@referredType": "organization"
    },
    {
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "Optimum collect 2",
      "role": "user",
      "@referredType": "organization"
    }
  ],
  "status": "ACTIVE",
  "operationalStatus": "ACTIVE"
}

2. I want to get a global view on my product parc

I want an inventory on all products I own. As a a member of the Sales Team, I want a get a global picture of my parc. Filters on a customer, the place where the connection is, as well as configuration characteristics.

GET /product?relatedParty.id=ea69228c-600a-4058-8e4e-e13fcc8bf89f HTTP/1.1

Body (we display the first 2 elements of the result)

[
  {
    "id": "2c9004647f69a6da017f6a1c55ba0000",
    "href": "/api/v1/product/2c9004647f69a6da017f6a1c55ba0000",
    "name": "Collecte régionale",
    "creationDate": "2020-07-09T22:00:00.000Z",
    "startDate": "2021-02-02T23:00:00.000Z",
    "productCharacteristic": [
      {
        "id": "FONC40160084032",
        "valueType": "object",
        "name": "Région Collecte",
        "value": {
          "id": "VF0001640160084032",
          "name": "LORRAINE"
        }
      },
      {
        "id": "FONC40160084030",
        "valueType": "object",
        "name": "Niveau de service VLAN",
        "value": {
          "id": "VF0000140160084030",
          "name": "835 (Mono VC/VLAN)"
        }
      },
      {
        "id": "FONC40160084033",
        "valueType": "string",
        "name": "N° de VLAN de livraison",
        "value": "236"
      }
    ],
    "productOffering": {
      "id": "O40160084003",
      "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productOffering/O40160084003",
      "name": "Collecte régionale",
      "productOfferingType": "atomicOffer"
    },
    "productSpecification": {
      "id": "PS40160084022",
      "name": "Collecte régionale"
    },
    "relatedParty": [
      {
        "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
        "name": "Optimum collect 1",
        "role": "buyer",
        "@referredType": "organization"
      },
      {
        "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
        "name": "Optimum collect 2",
        "role": "user",
        "@referredType": "organization"
      }
    ],
    "status": "ACTIVE",
    "operationalStatus": "ACTIVE"
  },
  {
    "id": "2c9004647f69a6da017f6a1c55ba0000",
    "href": "/api/v1/product/2c9004647f69a6da017f6a1c55ba0000",
    "name": "Collecte régionale",
    "creationDate": "2020-07-09T22:00:00.000Z",
    "startDate": "2021-02-02T23:00:00.000Z",
    "productCharacteristic": [
      {
        "id": "FONC40160084032",
        "valueType": "object",
        "name": "Région Collecte",
        "value": {
          "id": "VF0001640160084032",
          "name": "LORRAINE"
        }
      },
      {
        "id": "FONC40160084030",
        "valueType": "object",
        "name": "Niveau de service VLAN",
        "value": {
          "id": "VF0000140160084030",
          "name": "835 (Mono VC/VLAN)"
        }
      },
      {
        "id": "FONC40160084033",
        "valueType": "string",
        "name": "N° de VLAN de livraison",
        "value": "236"
      }
    ],
    "productOffering": {
      "id": "O40160084003",
      "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productOffering/O40160084003",
      "name": "Collecte régionale",
      "productOfferingType": "atomicOffer"
    },
    "productSpecification": {
      "id": "PS40160084022",
      "name": "Collecte régionale"
    },
    "relatedParty": [
      {
        "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
        "name": "Optimum collect 1",
        "role": "buyer",
        "@referredType": "organization"
      },
      {
        "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
        "name": "Optimum collect 2",
        "role": "user",
        "@referredType": "organization"
      }
    ],
    "status": "ACTIVE",
    "operationalStatus": "ACTIVE"
  },
  ...
]

3. I am looking for a collect to make an order

As a sales manager, I have to specify the collect on which I want to make an order.

Creation or suppression of Product is done consequently to a product order.

Any modificiation of a Product has to be done threw the Product Ordering Management API (check all documentation about this API https://developer.orange.com/apis/united-way-product-ordering-management/).

GET /product

Body (we display the first 2 elements of the result)

[
  {
    "id": "2c9004647f69a6da017f6a1c55ba0000",
    "href": "/api/v1/product/2c9004647f69a6da017f6a1c55ba0000",
    "name": "Collecte régionale",
    "creationDate": "2020-07-09T22:00:00.000Z",
    "startDate": "2021-02-02T23:00:00.000Z",
    "productCharacteristic": [
      {
        "id": "FONC40160084032",
        "valueType": "object",
        "name": "Région Collecte",
        "value": {
          "id": "VF0001640160084032",
          "name": "LORRAINE"
        }
      },
      {
        "id": "FONC40160084030",
        "valueType": "object",
        "name": "Niveau de service VLAN",
        "value": {
          "id": "VF0000140160084030",
          "name": "835 (Mono VC/VLAN)"
        }
      },
      {
        "id": "FONC40160084033",
        "valueType": "string",
        "name": "N° de VLAN de livraison",
        "value": "236"
      }
    ],
    "productOffering": {
      "id": "O40160084003",
      "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productOffering/O40160084003",
      "name": "Collecte régionale",
      "productOfferingType": "atomicOffer"
    },
    "productSpecification": {
      "id": "PS40160084022",
      "name": "Collecte régionale"
    },
    "relatedParty": [
      {
        "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
        "name": "Optimum collect 1",
        "role": "buyer",
        "@referredType": "organization"
      },
      {
        "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
        "name": "Optimum collect 2",
        "role": "user",
        "@referredType": "organization"
      }
    ],
    "status": "ACTIVE",
    "operationalStatus": "ACTIVE"
  },
  {
    "id": "2c9004647f69a6da017f6a1c577c0001",
    "href": "/api/v1/product/2c9004647f69a6da017f6a1c577c0001",
    "name": "Collecte régionale",
    "creationDate": "2020-07-09T22:00:00.000Z",
    "startDate": "2021-02-02T23:00:00.000Z",
    "productCharacteristic": [
      {
        "id": "FONC40160084032",
        "valueType": "object",
        "name": "Région Collecte",
        "value": {
          "id": "VF0001640160084032",
          "name": "LORRAINE"
        }
      },
      {
        "id": "FONC40160084030",
        "valueType": "object",
        "name": "Niveau de service VLAN",
        "value": {
          "id": "VF0000240160084030",
          "name": "850 (Bi VC/VLAN)"
        }
      },
      {
        "id": "FONC40160084033",
        "valueType": "string",
        "name": "N° de VLAN de livraison",
        "value": "237"
      }
    ],
    "productOffering": {
      "id": "O40160084003",
      "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productOffering/O40160084003",
      "name": "Collecte régionale",
      "productOfferingType": "atomicOffer"
    },
    "productSpecification": {
      "id": "PS40160084022",
      "name": "Collecte régionale"
    },
    "relatedParty": [
      {
        "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
        "name": "Optimum collect 1",
        "role": "buyer",
        "@referredType": "organization"
      },
      {
        "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
        "name": "Optimum collect 2",
        "role": "user",
        "@referredType": "organization"
      }
    ],
    "status": "ACTIVE",
    "operationalStatus": "ACTIVE"
  },
  ...
]

4. I want to be able to find my collect by the AIRE VPLS id

I want to search my collect through the id AIRE VPLS. For example, it is possible to filter products using the service number of a VPLS service. The filter must be used by the realizingService.

GET /product?fields=realizingService,realizingService.id,realizingService.name&realizingService.id=V1008724&realizingService.name=Aire VPLS
[
  {
    "id": "2c900eb2819080ca0181909345070000",
    "href": "https://pepsi-integration.si.fr.intraorange/product-inventory-service-integration/api/v1/product/2c900eb2819080ca0181909345070000",
    "realizingService": [
      {
        "id": "V1008724",
        "name": "Aire VPLS"
      }
    ]
  },
  {
    "id": "2c900eb2819080ca01819163b597075f",
    "href": "https://pepsi-integration.si.fr.intraorange/product-inventory-service-integration/api/v1/product/2c900eb2819080ca01819163b597075f",
    "realizingService": [
      {
        "id": "V1008724",
        "name": "Aire VPLS"
      }
    ]
  },
  {
    "id": "2c90196181b03ceb0181b59b9ced0000",
    "href": "https://pepsi-integration.si.fr.intraorange/product-inventory-service-integration/api/v1/product/2c90196181b03ceb0181b59b9ced0000",
    "realizingService": [
      {
        "id": "V1008724",
        "name": "Aire VPLS"
      }
    ]
  }
]

5. I want to be able to find my product by the VIA number

I want to search my product through the VIA number. The filter must be used by the externalIdentifier.

GET /product?externalIdentifier.id=VV123456&fields=externalIdentifier.id,externalIdentifier.externalIdentifierType,externalIdentifier.owner
[
  {
    "id": "2c9003938236fcbc0182440840fe0000",
    "externalIdentifier": [
      {
        "id": "VV123456",
        "externalIdentifierType": "billingIdentifier",
        "owner": "viva"
      }
    ],
    "href": "https://pepsi-integration.si.fr.intraorange/product-inventory-service-integration/api/v1/product/2c9003938236fcbc0182440840fe0000"
  }
]