.wpb_animate_when_almost_visible { opacity: 1; }
United Way - Quote Management - Discover
Get a quote from Orange Wholesale
1.0

Table of Contents

This document is a complement to TMF 648 documentation regarding the technical details mandated by the TM Forum applied to our application (https://www.tmforum.org/resources/standard/tmf648-quote-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:quote:v1:readonlyAllow GET, HEAD http request for any resource of this api
owf:united-way:quote:v1:writeAllow POST, PUT, DELETE http request for any resource of this api
  • If your client will only do GET requests, you may request an access_token with '&scope=owf:united-way:quote:v1:readonly'.
  • If your client will do GET and POST requests, you must request an access_token with '&scope=owf:united-way:quote:v1:readonly owf:united-way:quote:v1:write'.

Scopes are not fine-grained permissions. While an access_token can allows your client application to do GET or POST 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/discover/quote-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

ResourceDescription
QuoteQuote can be used to negotiate service and product acquisition or modification between a customer and a service provider. Quote contain list of quote items, a reference to customer (RelatedParty), a list of productOffering and attached prices and conditions.

Quote

Below the table of the mandatory attributs what ever the type of quote

NameType / FormatDescriptionExample
quoteSpecificationStringdefine the action for this quote, in case of new configuration the value should be Acquisition, in case of Termination the value should be Termination, in case of Modification the value depend to the operationSpecification propose in the catalog for the productOfferingAcquisition
instantSyncQuotebooleanOnly value false is accepted because we do not retrieve synchronous quotefalse
relatedPartyRelatedParty[]your organization informationsee below
quoteItemQuoteItem[]the list of quote items represent the offer you want to quote including different characteristics chosensee below

Sub resources

ResourceDescription
RelatedPartyA reference to a party playing a role in this quote (buyer).
QuoteItemA quote items describe an action to be performed on a productOffering or a product in order to get pricing elements and condition.
QuoteItemRelationshipUsed to describe relationship between quote item.
ProductA product to be created defined by value or existing defined by reference.
ProductOfferingA product offering represents entities that are orderable from the provider of the catalog, this resource includes pricing information.
RelatedPlaceRefOrValueA related place defines a place described by reference or by value linked to a specific entity.
GeographicSiteBuildingA polymorphic entity of RelatedPlaceRefOrValue to manage address by buidingCode.
GeographicAddressa sub entity of GeographicSiteBuilding which contains place informations.
GeographicSubAddressa sub entity of GeographicAddress which contains complements informations about an address.

RelatedParty

Please provide the realtedParty with role the value buyer (the buyer corresponds to the organization of the operatordoing the quote).

NameType / FormatDescriptionExampleMandatory
idStringid of your organization"ea69228c-600a-4058-8e4e-e13fcc8bf89f"yes
roleStringshoud be buyer"buyer"yes
@referredTypeStringshoud be organization"organization"yes
nameStringname of your organization"ABSOLIGHT"no

Example:

{
  ...
  "relatedParty": [
    {
      "@referredType": "organization",
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "ABSOLIGHT",
      "role": "buyer"
    }
  ],
  ...
}

To find information about your organization call the Party management API (see Party management getting started form more information)

Example:

GET /api/v1/organization/<organizationId>
{
  "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
  "isHeadOffice": true,
  "isLegalEntity": true,
  "name": "ABSOLIGHT",
  "organizationType": "COMPANY",
  "tradingName": "ABSOLIGHT",
  "contactMedium": [],
  "organizationIdentification": [
    {
      "identificationId": "00353831",
      "identificationType": "RCE"
    },
    {
      "identificationId": "418565404",
      "identificationType": "SIREN"
    }
  ],
  "@type": "Organization",
  "href": "/api/v1/organization/ea69228c-600a-4058-8e4e-e13fcc8bf89f"
}

QuoteItem

In the quote, the list of quote items represent the offer you want to quote including different characteristics chosen. Like the representation of the catalog offer, this list is build like a tree. Each quote items "bundles" other quote items using "relationship" attribut.

Warning: If the list of quote items don't reprensent a tree, if at least one quote item is not bundled by another one and it bundles none then the quote will be cancelled.

NameType / FormatDescriptionExampleMandatory
idintunique id, used for relationship between quote items"1"yes
actionStringcan be add, modify, nochange or delete depending on quoteSpecification"add"yes
quoteItemRelationshipQuoteItemRelationship[]Information about the relation of the quote itemsee belowdepends cases
productProductcontains information about product (exemple characteristics)see belowdepends cases

Example of quoteItem which contains product with productOffering of type atomicOffer and is characteristics:

{
...
    "action": "add",
    "id": "O40140084008",
    "product": {
        "productOffering": {
            "id": "O40140084008",
            "name": "Raccordement"
        },
        "productCharacteristic": [
            {
                "id": "FONC40140084010",
                "valueType": "object",
                "name": "Type de point de livraison",
                "value": {
                    "@type": "CharacteristicChoiceValue",
                    "id": "VF0000140140084010",
                    "name": "DTIO/PTO"
                }
            },
            {
                "valueType": "object",
                "id": "FONC40140084008",
                "valueType": "object",
                "name": "Multi-accès",
                "value": {
                    "@type": "CharacteristicChoiceValue",
                    "id": "VF0000240140084008",
                    "name": "Non"
                }
            },
            {
                "valueType": "object",
                "id": "FONC40140084003",
                "valueType": "object",
                "name": "Type de raccordement",
                "value": {
                    "@type": "CharacteristicChoiceValue",
                    "id": "VF0000140140084003",
                    "name": "Raccordement sur prise existante"
                }
            },
            {
                "valueType": "string",
                "id": "FONC40140084011",
                "valueType": "string",
                "name": "Réfèrence PTO",
                "value": "FI-9786-6362"
            }
        ],
        "productSpecification": {
            "id": "PS40140084008",
            "name": "Accès passif"
        }
    }
    ...
}

QuoteItemRelationship

Describe the relation between quote items.

NameType / FormatDescriptionExampleMandatory
idStringid of the quote item wich has a relation with the current quote item"1"yes
relationshipTypeStringRelationship type"bundles"yes

Example:

...
"quoteItem":[
    {
        "id": 1,
        "quoteItemRelationship": [
            {
            "id": 2,
            "relationshipType": "bundles"
            },
            {
            "id": 3,
            "relationshipType": "bundles"
            }
        ],
        ...
    },
    {
        "id": 2,
        ...
    },
    {
        "id": 3,
        ...
    }

]
...

Product

Describe the product of a quote item.

NameType / FormatDescriptionExampleMandatory
agreementAgreementItemRefcontains information about contractsee below(yes in the quoteItem contract if quoteSpecification is a value of Modification)
placeRelatedPlaceRefOrValuesee below(yes in the quoteItem contract if quoteSpecification is Acquisition)
productCharacteristicsCharacteristic[]key value objectsee belowyes
productOfferingProductOfferingcontains information about product offeringsee belowyes
isBundleBooleantrue if the quote item is bundled by another onetrueyes
idStringid of the product inventory assettrue(yes in the quoteItem contract if quoteSpecification is a value of Modification)

Example of product with productOffering of type contract with the RelatedPlaceRefOrValue of type GeographicSiteBuilding:

{
  ...
  "product": {
    "agreement": [
      {
        "id": "AB1234567"
      }
    ]
    "place": [
      {
        "@type": "GeographicSiteBuilding",
        "role": "deliveryAddress",
        "geographicAddress": [
          {
            "@type": "GeographicAddress",
            "geographicSubAddress": [
              {
                "buildingName": "OULLINS C",
                "@type": "GeographicSubAddress"
              },
              {
                "levelNumber": "_NA_",
                "levelType": "staircase",
                "@type": "GeographicSubAddress"
              },
              {
                "levelNumber": "0",
                "levelType": "floor",
                "@type": "GeographicSubAddress"
              }
            ]
          }
        ],
        "buildingCode": "IMB/69149/C/ZJU1"
      }
    ],
    "productOffering": {
      "id": "GOC40140084001",
      "name": "Just Fibre TEST"
    }
  },
  ...
}

ProductOffering

Describe the product offering of a quote item.

NameType / FormatDescriptionExampleMandatory
idStringunique id of the productOffering coming from Product catalogue management API"GOC40140084001"yes
hrefStringurl to get more information about the productOffering"http://..."no
nameStringDescription of the product offering"Just Fibre TEST"no

Example:

{
  ...
  "productOffering": {
    "id": "GOC40140084001",
    "name": "Just Fibre TEST"
  }
  ...
}

AgreementItemRef

Agreement reference. An agreement represents a contract or arrangement, either written or verbal and sometimes enforceable by law, such as a service level agreement or a customer price agreement. An agreement involves a number of other business entities, such as products, services, and resources and/or their specifications.

NameType / FormatDescriptionExampleMandatory
idStringunique id of the agreement"AB1234567"yes

Agreement is not required to create a quote, but it's mandatory when there is a "quotableWithoutAgreement" criteria mandatory enabled on the offer. You can still provide without enabling "quotableWithoutAgreement", but it will be checked and potentially you could receive a business error like the one listed below.

You need to set the number of the contract "Conditions Générales Accès et Collecte".

Example:

{
  ...
  "agreement": {
    "id": "AB1234567"
  }
  ...
}

Business rules for Agreement

To be set in an quote, the Agreement must respect several rules, otherwise the quote will be rejected. See below for more details:

Business error messageDescription
The agreement id is mandatoryAgreement id missing in the product offering type contract
Agreement is not validYour contract is not valid or has not been found, please contact your Commercial Service.
The product Offering is not covered by the agreementYour contract is not valid, the offer is not covered by the agreement. Please provide the correct agreement.

RelatedPlaceRefOrValue

The RelatedPlaceRefOrValue can be in differents type, but actualy we manage a unique TMF format which is the GeographicSiteBuilding.

GeographicSiteBuilding

Warning: The place GeographicSiteBuilding is manadatory if the productOffering of type contract contains an otherProperty: expectedPlace.deliveryAddress:geographicSiteBuilding. This place need to be defined into the product of the quoteItem which contains the productOffering of type contract.

To verify this call Product catalogue management API and search otherProperty name operationSpecification.Acquisition :

GET /api/catalog/productOffering/<productOfferingId>

...
"otherProperty": [
   {
     "id": "operationSpecification.Acquisition",
     "multiplesValues": [
       "expectedParty.operatorDeliveryDriver:individual",
       "expectedPlace.deliveryAddress:geographicSiteBuilding",
       "mandatoryCriteria:operationSpecification",
       "mandatoryCriteria:siteType",
       "expectedSubAddress:true",
       "expectedResource:resourcePto",
       "mandatoryCriteria:oiBlomCode",
       "requestedproductOfferingQualification:true",
       "expectedParty.operatorInterlocutor:party",
       "expectedParty.user:organization"
     ]
  },
...
NameType / FormatDescriptionExampleMandatory
roleStringrole of the address"deliveryAddress"yes
@typeStringobject type"GeographicSiteBuilding"yes
buildingCodeStringbuilding code of the the address (find with Aero API)"IMB/69149/C/ZJU1"yes
geographicAddressGeographicAddress[]information about the geographicAddress (to set geographicSubAddress)see belowdepends cases

To find a buildingCode for a specific address, you should call the Operator eligibility API (see Operator eligibility France getting started form more information):

 POST /api/productOfferingQualification
{
    "category": {
        "name": "ftth"
    },
    "contextType": "fulltext",
    "place": {
        "nonFormattedAddress": {
        "fullText": "9 grande rue 69600 oullins"
       }
    }
}
{
  "place": {
    "geographicSite": {
      "address": "9 GRANDE RUE, 69600 OULLINS",
      "normalizedAddress": {
        "inseeCode": "69149",
        "rivoliCode": "0510",
        "streetNr": "9",
        "streetType": "",
        "streetName": "GRANDE RUE",
        "postcode": "69600",
        "city": "OULLINS",
        "geographicSubAddress": [
          {
            "buildingName": "OULLINS C",
            "buildingCode": "IMB/69149/C/ZJU1",
            "buildingCodeOC": "IMB/69149/C/ZJU1",
            "buildingCodeOI": "IMB/69149/C/ZJU1",
            "geographicLocation": {
              "longitude": 4.810585,
              "latitude": 45.719603,
              "accuracy": "number"
            }
          }
        ]
      },
      "buildingCode": "IMB/69149/C/ZJU1"
    }
  },
  ...

GeographicAddress

The GeographicAddress is used to set the geographicSubAddress information buildingName, staircase and floor if the productOffering contract need a PTO ressource.

Warning: The GeographicAddress is mandatory if the productOffering of type contract contains an otherProperty: expectedResource:resourcePto:

To verify this call Product catalogue management API and search otherProperty name operationSpecification.Acquisition :

GET /api/catalog/productOffering/<productOfferingId>

...
"otherProperty": [
   {
     "id": "operationSpecification.Acquisition",
     "multiplesValues": [
       "expectedParty.operatorDeliveryDriver:individual",
       "expectedPlace.deliveryAddress:geographicSiteBuilding",
       "mandatoryCriteria:operationSpecification",
       "mandatoryCriteria:siteType",
       "expectedSubAddress:true",
       "expectedResource:resourcePto",
       "mandatoryCriteria:oiBlomCode",
       "requestedproductOfferingQualification:true",
       "expectedParty.operatorInterlocutor:party",
       "expectedParty.user:organization"
     ]
  },
...
NameType / FormatDescriptionExampleMandatory
geographicSubAddressgeographicSubAddress[]list of geographicSubAddresssee belowyes
@typeStringobject type"GeographicAddress"yes

GeographicSubAddress

Warning: The GeographicSubAddress is mandatory if the productOffering of type contract contains an otherProperty: expectedSubAddress:true:

To verify this call Product catalogue management API and search otherProperty name operationSpecification.Acquisition :

GET /api/catalog/productOffering/<productOfferingId>

...
"otherProperty": [
   {
     "id": "operationSpecification.Acquisition",
     "multiplesValues": [
       "expectedParty.operatorDeliveryDriver:individual",
       "expectedPlace.deliveryAddress:geographicSiteBuilding",
       "mandatoryCriteria:operationSpecification",
       "mandatoryCriteria:siteType",
       "expectedSubAddress:true",
       "expectedResource:resourcePto",
       "mandatoryCriteria:oiBlomCode",
       "requestedproductOfferingQualification:true",
       "expectedParty.operatorInterlocutor:party",
       "expectedParty.user:organization"
     ]
  },
...
NameType / FormatDescriptionExampleMandatory
buildingNameStringbuilding name"OULLINS C"depends cases
levelNumberStringlist of geographicSubAddress"NA" , "0",...depends cases
levelTypeStringlist of geographicSubAddress"floor" or "staircase"depends cases
@typeStringobject type"GeographicSubAddress"yes

To find a GeographicSubAddress information for a specific buildingCode, you should call the TAO webservice (for more information, a documentation is available on your Espace opérateur: Mon compte> Mon espace documentaire):

 GET /api/v1/resource?place.buildingCode=IMB/69149/C/ZJU1
[
  {
    "href": "/api/v1/resource/PEPSI000",
    "id": "PEPSI000",
    "administrativeState": "locked",
    "operationalState": "enable",
    "place": {
      "@type": "GeographicSiteBuilding",
      "housingsNumber": "31",
      "buildingStatus": "COMMERCIALISABLE",
      "startOrderAcceptanceDate": "2015-02-03T00:00:00Z",
      "startLigntpathSupplyDate": "2015-02-03T00:00:00Z",
      "geographicAddress": [
        {
          "@type": "GeographicAddress",
          "geographicSubAddress": [
            {
              "buildingName": "OULLINS C",
              "@type": "GeographicSubAddress"
            },
            {
              "levelType": "staircase",
              "levelNumber": "_NA_",
              "@type": "GeographicSubAddress"
            },
            {
              "levelType": "floor",
              "levelNumber": "-1",
              "@type": "GeographicSubAddress"
            }
          ]
        }
      ],
      "buildingCode": "IMB/69149/C/ZJU1"
    },
    ...

Example of complete GeographicSiteBuilding:

 {
  "place": [
    {
      "@type": "GeographicSiteBuilding",
      "role": "deliveryAddress",
      "geographicAddress": [
        {
          "@type": "GeographicAddress",
          "geographicSubAddress": [
            {
              "buildingName": "OULLINS C",
              "@type": "GeographicSubAddress"
            },
            {
              "levelNumber": "_NA_",
              "levelType": "staircase",
              "@type": "GeographicSubAddress"
            },
            {
              "levelNumber": "0",
              "levelType": "floor",
              "@type": "GeographicSubAddress"
            }
          ]
        }
      ],
      "buildingCode": "IMB/69149/C/ZJU1"
    }
  ]
}

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 quote management, the following notifications are defined:

Notifications related to Quote:

  • QuoteCreateEvent
  • QuoteStateChangeEvent
  • QuoteDeleteEvent

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

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

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

Quote life cycle

Each Quote follows a unique worklflow (state machine) with different states. See TMF documentation or below for more informations.

enter image description here

Warning: The quote api executes the quote asynchronously. When the quote is POST you get a response with the status AKNOWLEGDE. When the quote is being executed, it changes to the INPROGRESS status, when the quote could be executed without anomaly, it will have the APPROVED status and a pricing will be positioned on it. If a problem occurs during the processing of this one, its status will be CANCELED and error notes will be posted to indicate the problems encountered.

In the current state, it is only possible to PATCH the status of the quote. If an error has occurred on your quote, you must create a new one via the POST method

If you obtain a quote with the APPROVED state and error note, you are on a partial quote (because some mandatories information are not transmitted, but a price could be delivery)

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 /api/v1/quote?fields=description,quoteDate
[
  {
    "description": "Quote illustration Ariane",
    "href": null,
    "id": "e7dee14c-cd85-495a-9931-ef3c06f2559b",
    "quoteDate": "2021-07-22T11:27:22.000+02:00"
  },
  {
    "description": "Quote illustration Ariane",
    "href": null,
    "id": "37cf411f-5258-409a-9703-66cf965c9f43",
    "quoteDate": "2021-07-22T11:27:29.000+02:00"
  }
]

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

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:

Here's the exhaustive list of available parameters:

  • id
  • externalId
  • description
  • state
  • quoteSpecification
  • href
  • quoteDate
  • agreement.id
  • agreement.href
  • quoteItem
  • quoteItem.id
  • quoteItem.product.productOffering.id

The operations available for the attributes (date, integer and string) are:

  • = 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

Example:

GET /api/v1/quote?fields=state&state=APPROVED&quoteDate.gt=2013-04-20
[
  {
    "href": "/api/v1/quote/2a89ed67-5cf8-429d-9a3d-5153d481ff55",
    "id": "2a89ed67-5cf8-429d-9a3d-5153d481ff55",
    "state": "APPROVED"
  },
  {
    "href": "/api/v1/quote/7f8bb1aa-da62-41e6-be85-38b6f42827ae",
    "id": "7f8bb1aa-da62-41e6-be85-38b6f42827ae",
    "state": "APPROVED"
  },
  {
    "href": "/api/v1/quote/0f9e6ecd-2bee-4448-b0cb-c6cdb29bccb7",
    "id": "0f9e6ecd-2bee-4448-b0cb-c6cdb29bccb7",
    "state": "APPROVED"
  }
]

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.

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. Be sure to read the header X-Result-Count.

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

GET /api/v1/quote?fields=none&limit=1&offset=1
[
  {
    "id": "9240353c-cd38-447c-9437-9d4aa229d5ff",
    "href": "/api/v1/quote/9240353c-cd38-447c-9437-9d4aa229d5ff"
  }
]

Accept-Range is ignored.

Sorting

The query parameter sort is used to order resources to be provided in response (used - if you want descending).

Example:

GET /api/v1/quote?fields=state&sort=-quoteDate
[
  {
    "href": null,
    "id": "7f8bb1aa-da62-41e6-be85-38b6f42827ae",
    "state": "APPROVED"
  },
  {
    "href": null,
    "id": "0f9e6ecd-2bee-4448-b0cb-c6cdb29bccb7",
    "state": "APPROVED"
  }
]

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

If you try to access to a non-existent quotation using the following endpoint : GET quote/{id}:

HTTP/1.1 404 Not Found
{
  "code": "60",
  "message": "No entity found with ID 'sdfsd'!",
  "reason": "Resource not found",
  "@type": "Error"
}

Others

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

HTTP error codeQuotify 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
40662Not acceptable
40863Request time-out
40969Conflict
41164Length required
41265Precondition failed
41366Request entity too large
41467Request-URI too long
41568Unsupported Media Type
42953Too many requests
5001Internal Server Error
5021Internal error
5023Bad gateway
5035The service is temporarily unavailable
5036Orange API is over capacity, retry later !

Errors during the quote validation process

Below you can find a table with the applicative errors possible, these errors occur during the asynchronously validation process and will be found in the Note Attribute of a given quote, see chapter 4. I want to know the errors of my cancelled quote

Business error codeBusiness error message
TODOmissing error message
001no aero code referring to the given catalog offer id
002Legal notices not found for the given quoteLevel
003The field instantSyncQuote can't be true
004One quoteItem is mandatory
005Every related party must have an id and referred type
006Every note must have an id and text field
007Every billing account must have an id
008Every agreement must have an id
009Every product offering must have an id
010At least one place has to be inform
011No more than one place is allowed
012no qualification result in aero response
013not eligible geographically
014No cuivre offer available with the requested debit in Aero response for geographical eligibility control
015Not able to qualify the given address
016No place found to be qualify
017Not able to check the geographical eligibility
018We are not able to handle the given offer category
019QuoteItem with ProductOffering not found
020The QuoteItem tree have missing elements
021The offer configuration is invalid
022The QuoteItem tree have infinite loop of elements
023Cannot create configuration session
024ConfigurationItem dont exist in quoteItem and one of its attributes is mandatory
025Missing quote item to correctly configure the offer
026Missing mandatory characteristic %s
027Unsupported characteristic type
028Update configuration error
029Missing characteristic value
030Unknown product characteristic type
031The attribut action is missing on at least one quote item
032The action value of quote item is not recognized
033ProductOffering not found in lizard
034QuoteItem root not found
035Category not found in lizard
036Pour effectuer une cotation sur cette offre
037Qualification address error
038No ProductOffering with specified ID found in API Catalog
039An seller and buyer related party are mandatory
040Pour effectuer une cotation sur cette offre
041No valid agreement found
042Missing property from catalog response: 'PRODUIT_COTABLE_SANS_CONTRAT'
043Missing eligible criteria
044At least 2 QuoteItems have the same id
045the QuoteItem with id %s is not found
046Le code immeuble est inconnu
047Session configuration error: %s
048ConfigurationItem with productOfferingId: %s not found in lizard session configuration
049QuoteItem with productOfferingId: %s is not a child of QuoteItem with productOfferingId: %s in lizard session configuration
050The product id %s is not recognize
051Quote process type unknown
052Quote item for modification not found
0532 quote items are mandatory for modification quote
060Multiple building codes exist for the given address
061The termination date cannot be before d+1
062code Oi Blom introuvable dans la reponse aero
063The related party role and referred type are incompatible
064Missing quote specification
065No information available to validate related party
066The level of the quote item with product offering id ?1 in the tree is invalid

Use cases

1. I want to get a quote for a new configuration from a product offering

I am in a sales administration team, I want to fill the needed information to get a quote for a product offering.

Understand a catalog offer

Catalog Offer Description

A catalog offer is composed of several bundles and Product Offering with relationships. A catalog offer is broken down into 4 levels of product offering:

  • level 1: Contract
  • level 2: Play
  • level 3: Set
  • level 4: AtomicOffer

Here a sample of possible catalog offer structuration

ContractPlaySetAtomic OfferRelationships
ProductOffering Contract 1bundles "productOffering Play
productOffering Play 1bundles "productOffering Set 1"
productOffering Set 1bundles "productOffering AtomicOffer 1", "productOffering AtomicOffer 2" and "productOffering AtomicOffer 3"
productOffering AtomicOffer 1
productOffering AtomicOffer 2
productOffering AtomicOffer 3
productOffering Set 2bundles "productOffering AtomicOffer 4"
productOffering AtomicOffer 4

Visual representation of a catalog offer

enter image description here

As we can see the Catalog Offer is build like a tree and some of his items are mandatory to create a quote, the other one are optionals.

Find a catalog offer

To generate the quote you must first target an offer in the catalog, this action can be done by requesting the contract level productOffering in the catalog:

GET api/catalog/productOffering/<productOfferingId>/catalog

This request return catagories, productofferings, productSpecifications and productOfferingPrice. This elements help you to generate the content of the quote.

{
  "categories": [
    ...
  ],
  "productOfferings": [
    ...
  ],
  "productSpecifications": [
    ...
  ],
  "productOfferingPrices": [
    ...
  ]
}

Building a quote

add mandatory attribute to the quote

set to the quote:

  • "instantSyncQuote": false
  • "quoteSpecification": "Acquisition"
{
  "externalId": "externalId",
  "instantSyncQuote": false,
  "quoteSpecification": "Acquisition",
  ...
}

set your organization information into the RelatedParty (see chapter RelatedParty to know how to get it)

{
    "externalId": "externalId",
    "instantSyncQuote": false,
    "quoteSpecification": "Acquisition"
    "relatedParty": [
        {
            "@referredType": "organization",
            "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
            "name": "ABSOLIGHT",
            "role": "buyer"
        }
    ],
    ...
}

add quoteItems

For every productOffering (contract, play, set and atomicOffer) present into the catalog response with attribute "visible":"true" you should create a specific quoteItem into the quote.

create a quoteItem with a productOffering

Add into the quoteItem list a quoteItem with:

  • id: a unique id of your choice
  • action: add
  • a product with a productOffering from the catalog response

Example

{
  "externalId": "externalId",
  "instantSyncQuote": false,
  "quoteSpecification": "Acquisition"
  "relatedParty": [
    {
      "@referredType": "organization",
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "ABSOLIGHT",
      "role": "buyer"
    }
  ],
  "quoteItem": [
    {
      "action": "add",
      "id": "GOC40140084001",
      "product": {
        "productOffering": {
          "id": "GOC40140084001",
          "name": "Just Fibre TEST"
        }
      }
    }
  ]
}

To find the productOffering id search it into the list of productOfferings from catalog response:

{
  "productOfferings": [
    {
      "id": "GOC40140084001",
      "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productOffering/GOC40140084001",
      "name": "Just Fibre TEST",
      "shortName": "Just Fibre TEST",
      "category": [],
      "bundledProductOffering": [],
      "visible": "true",
      "isTopLevel": true,
      "isBundle": true,
      "isFulfillable": true,
      "isInstallable": true,
      "productOfferingType": "contract",
      "externalIdentifier": [],
      "viewProperty": {
      },
      "otherProperty": []
    }
  ]
}
create a quoteItem with a place

To check the geographical eligibility of your quote, you must submit a place of type GeographicSiteBuilding with a buildingCode and a role deliveryAddress into the product of the quoteItem which contains the productOffering of type contract.

This rule is defined by the catalog into the productOffering of type contract in the otherProperties list by an element with id operationSpecification.Acquisition which contains a value expectedPlace.deliveryAddress:geographicSiteBuilding (see below).

{
  "id": "GOC40140084001",
  "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productOffering/GOC40140084001",
  "name": "Just Fibre TEST",
  "shortName": "Just Fibre TEST",
  "productOfferingType": "contract",
  ...
  "otherProperty": [
    {
      "id": "operationSpecification.Acquisition",
      "multiplesValues": [
        "expectedPlace.deliveryAddress:geographicSiteBuilding",
        "expectedSubAddress:true"
        ...
        },
        ...
      ]
      ...
    }

The expectedSubAddress:true value explains than sub address informations (buildingName, staircase, floor) are mandatory (see chapter GeographicSubAddress

Example

{
  "externalId": "externalId",
  "instantSyncQuote": false,
  "quoteSpecification": "Acquisition"
  "relatedParty": [
    {
      "@referredType": "organization",
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "ABSOLIGHT",
      "role": "buyer"
    }
  ],
  "quoteItem": [
    {
      "action": "add",
      "id": "GOC40140084001",
      "product": {
        "place": [
          {
            "@type": "GeographicSiteBuilding",
            "role": "deliveryAddress",
            "geographicAddress": [
              {
                "@type": "GeographicAddress",
                "geographicSubAddress": [
                  {
                    "buildingName": "OULLINS C",
                    "@type": "GeographicSubAddress"
                  },
                  {
                    "levelNumber": "_NA_",
                    "levelType": "staircase",
                    "@type": "GeographicSubAddress"
                  },
                  {
                    "levelNumber": "0",
                    "levelType": "floor",
                    "@type": "GeographicSubAddress"
                  }
                ]
              }
            ],
            "buildingCode": "IMB/69149/C/ZJU1"
          }
        ],
        "productOffering": {
          "id": "GOC40140084001",
          "name": "Just Fibre TEST"
        }
      }
    }
  ]
}
create a quoteItem with a quoteItemRelationship

The relation between every productOffering with productOfferingType: contract, play, set and atomicOffer is done by quoteItemRelationship into the quoteItem.

If the catalog productOffering contains bundledProductOffering like this:

{
  "id": "GOC40140084001",
  "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productOffering/GOC40140084001",
  "name": "Just Fibre TEST",
  "shortName": "Just Fibre TEST",
  "productOfferingType": "contract",
  ...
  "bundledProductOffering": [
    {
      "id": "OC40140084001",
      "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productOffering/OC40140084001",
      "name": "Just Fibre TEST"
    }
  ],
  ...

add into the quoteItem a quoteItemRelationship like this:

Example

{
  "externalId": "externalId",
  "instantSyncQuote": false,
  "quoteSpecification": "Acquisition"
  "relatedParty": [
    {
      "@referredType": "organization",
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "ABSOLIGHT",
      "role": "buyer"
    }
  ],
  "quoteItem": [
    {
      "action": "add",
      "id": "GOC40140084001",
      "product": {
        "place": [
          {
            "@type": "GeographicSiteBuilding",
            "role": "deliveryAddress",
            ...
          }
        ],
        "productOffering": {
          "id": "GOC40140084001",
          "name": "Just Fibre TEST"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "OC40140084001",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "OC40140084001",
      "product": {
        "productOffering": {
          "id": "OC40140084001",
          "name": "Just Fibre TEST"
        }
      }
    }
  ]
}

Warning: if you add a quoteItemRelationship into a quoteItem you shoud add a dedicated quoteItem for the declaration (see previous example).

create a quoteItem with productCharacteristic

If the catalog productOffering is a "productOfferingType":"atomicOffer" with "isBundle":false you should set productCharacteristic into the product of the quoteItem.

To find available characteristics for this productOffering get the productSpecification.id and search it into the productSpecifications list of the catalog response (see below)

"productSpecifications": [
    {
      "id": "PS40140084001",
      "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productSpecification/PS40140084001",
      "version": "1",
      "name": "Activation des ressources",
      "productSpecCharacteristic": [
        {
          "id": "FONC40140084004",
          "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productSpecCharacteristic/FONC40140084004",
          "name": "Débit d'accès Montant/Descendant",
          "visible": "true",
          "configurable": "false",
          "productSpecCharacteristicValue": [
            {
              "systemValueCode": "VF0000140140084004",
              "value": "300M/300M",
              "externalIdentifier": [
                {
                  "referentialId": "SI_OWF",
                  "id": "300.0"
                }
              ],
              "property": {
                "id": "VALEUR_DEBIT",
                "simpleValue": "300.0"
              }
            },
            {
              "systemValueCode": "VF0000240140084004",
              "value": "400M/1000M",
              "externalIdentifier": [
                {
                  "referentialId": "SI_OWF",
                  "id": "1000.0"
                }
              ],
              "property": {
                "id": "VALEUR_DEBIT",
                "simpleValue": "1000.0"
              }
            },
            ...

Example of quoteItem with characteristics

{
  "externalId": "externalId",
  "instantSyncQuote": false,
  "quoteSpecification": "Acquisition"
  "relatedParty": [
    {
      "@referredType": "organization",
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "ABSOLIGHT",
      "role": "buyer"
    }
  ],
  "quoteItem": [
    {
      "action": "add",
      "id": "O40140084001",
      "product": {
        "productOffering": {
          "id": "O40140084001",
          "name": "Accès"
        },
        "productCharacteristic": [
          {
            "id": "FONC40140084004",
            "valueType": "object",
            "name": "Débit d'accès Montant/Descendant",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084004",
              "name": "300M/300M"
            }
          },
          {
            "id": "FONC40140084005",
            "valueType": "object",
            "name": "VLAN",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000240140084005",
              "name": "Sans TAG"
            }
          }
        ]
      }
    }
  ]

Warning: If the catalog productSpecCharacteristic have the "valueType": "string" the productCharacteristic format in the quoteItem is:

{
   "id": "FONC40140084011",
   "valueType": "string",
   "name": "Référence PTO",
   "value": "XXXXXXXXX"
}

If the catalog productSpecCharacteristic have a productSpecCharacteristicValue list, the productCharacteristic format in the quoteItem is:

{
   "id": "FONC40140084004",
   "valueType": "object",
   "name": "Débit d'accès Montant/Descendant",
   "value": {
       "@type": "CharacteristicChoiceValue",
       "id": "VF0000140140084004",
       "name": "300M/300M"
   }
}
create a quoteItem with productRelationship

In special case a productOffering need a relationship to a product from the inventory (this is the case for offers where you must have already subscribed to a product to make a quotation).

If the catalog productOffering contains a productOfferingRelationship you must specify a productRelationship in the product of the quoteItem.

Example of productOfferingRelationship on productOffering catalog

{
  "id": "O40140084001",
  "href": "http://cae-owf-ventes.caas-cnp-apps.com.intraorange/catalog/api/catalog/productOffering/O40140084001",
  "name": "Accès",
  "shortName": "Accès",
  "visible": "true",
  "productOfferingType": "atomicOffer",
  "productOfferingRelationship": [
    {
      "id": "O40160084003",
      "name": "Collecte régionale",
      "relationshipType": "reliesOn",
      "validFor": {
        "startDate": "2000-12-31T23:00:00.000+0000"
      }
    },
    {
      "id": "O40160085001",
      "name": "Collecte nationale",
      "relationshipType": "reliesOn",
      "validFor": {
        "startDate": "2000-12-31T23:00:00.000+0000"
      }
    },
    {
      "id": "O40160086001",
      "name": "Collecte DROM - métropole",
      "relationshipType": "reliesOn",
      "validFor": {
        "startDate": "2000-12-31T23:00:00.000+0000"
      }
    },
    ...
  ],
  ...
}

To retrieve a product.id to set in the productRelationship of the quoteItem, you should call the Product inventory management API with this sample request based on previous sample:

GET /api/v1/product?productOffering.id=O40160084003,O40160085001,O40160086001&fields=id
[
  {
    "id": "2c9797447e05ac18017e252187b50025",
    "href": "/api/v1/product/2c9797447e05ac18017e252187b50025"
  },
  {
    "id": "2c9004647f69a6da017f6a1c577c0001",
    "href": "/api/v1/product/2c9004647f69a6da017f6a1c577c0001"
  },
  ...
]

After Get the reponse from inventory, choose your product.id to set into the productRelationship and don't forget to set the relationshipType according the catalog relationshipType.

Example of quoteItem with productRelationship

{
  "externalId": "externalId",
  "instantSyncQuote": false,
  "quoteSpecification": "Acquisition"
  "relatedParty": [
    {
      "@referredType": "organization",
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "ABSOLIGHT",
      "role": "buyer"
    }
  ],
  "quoteItem": [
    {
      "action": "add",
      "id": "O40140084001",
      "product": {
        "productOffering": {
          "id": "O40140084001",
          "name": "Accès"
        },
        "productCharacteristic": [
          {
            "valueType": "object",
            "id": "FONC40140084004",
            "valueType": "object",
            "name": "Débit d'accès Montant/Descendant",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084004",
              "name": "300M/300M"
            }
          },
          {
            "valueType": "object",
            "id": "FONC40140084005",
            "valueType": "object",
            "name": "VLAN",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000240140084005",
              "name": "Sans TAG"
            }
          }
        ],
        "productRelationship": [
          {
            "relationshipType": "reliesOn",
            "product": {
              "id": "2c9797447e05ac18017e252187b50025"
            }
          }
        ]
      }
    },
    ...
  ]
}

Create quote

When the contains of your quote is fully, You can do a POST. Don't forget to use an access_token with owf:united-way: quote:v1:write scope.

POST /quote
Content-Type: application/json
{
  "externalId": "externalId",
  "instantSyncQuote": false,
  "quoteItem": [
    {
      "action": "add",
      "id": "GOC40140084001",
      "product": {
        "place": [
          {
            "@type": "GeographicSiteBuilding",
            "role": "deliveryAddress",
            "geographicAddress": [
              {
                "@type": "GeographicAddress",
                "geographicSubAddress": [
                  {
                    "buildingName": "OULLINS C",
                    "@type": "GeographicSubAddress"
                  },
                  {
                    "levelNumber": "_NA_",
                    "levelType": "staircase",
                    "@type": "GeographicSubAddress"
                  },
                  {
                    "levelNumber": "0",
                    "levelType": "floor",
                    "@type": "GeographicSubAddress"
                  }
                ]
              }
            ],
            "buildingCode": "IMB/69149/C/ZJU1"
          }
        ],
        "productOffering": {
          "id": "GOC40140084001",
          "name": "Just Fibre TEST"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "OC40140084001",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "OC40140084001",
      "product": {
        "productOffering": {
          "id": "OC40140084001",
          "name": "Just Fibre TEST"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "GO40140084001",
          "relationshipType": "bundles"
        },
        {
          "id": "GO40140084002",
          "relationshipType": "bundles"
        },
        {
          "id": "GO40140084003",
          "relationshipType": "bundles"
        },
        {
          "id": "GO40140084004",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "GO40140084001",
      "product": {
        "productOffering": {
          "id": "GO40140084001",
          "name": "Caractéristiques principales"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "O40140084001",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "O40140084001",
      "product": {
        "productOffering": {
          "id": "O40140084001",
          "name": "Accès"
        },
        "productCharacteristic": [
          {
            "id": "FONC40140084004",
            "valueType": "object",
            "name": "Débit d'accès Montant/Descendant",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084004",
              "name": "300M/300M"
            }
          },
          {
            "id": "FONC40140084005",
            "valueType": "object",
            "name": "VLAN",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000240140084005",
              "name": "Sans TAG"
            }
          }
        ],
        "productRelationship": [
          {
            "relationshipType": "reliesOn",
            "product": {
              "id": "2c9797447e05ac18017e252187b50025"
            }
          }
        ]
      }
    },
    {
      "action": "add",
      "id": "GO40140084002",
      "product": {
        "productOffering": {
          "id": "GO40140084002",
          "name": "Point de livraison sur site client final"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "O40140084008",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "O40140084008",
      "product": {
        "productOffering": {
          "id": "O40140084008",
          "name": "Raccordement"
        },
        "productCharacteristic": [
          {
            "id": "FONC40140084010",
            "valueType": "object",
            "name": "Type de point de livraison",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084010",
              "name": "DTIO/PTO"
            }
          },
          {
            "id": "FONC40140084008",
            "valueType": "object",
            "name": "Multi-accès",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000240140084008",
              "name": "Non"
            }
          },
          {
            "id": "FONC40140084003",
            "valueType": "object",
            "name": "Type de raccordement",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084003",
              "name": "Raccordement sur prise existante"
            }
          },
          {
            "id": "FONC40140084011",
            "valueType": "string",
            "name": "Référence PTO",
            "value": "FI-9786-6362"
          }
        ]
      }
    },
    {
      "action": "add",
      "id": "GO40140084003",
      "product": {
        "productOffering": {
          "id": "GO40140084003",
          "name": "Interface de livraison sur site client final"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "O40140084004",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "O40140084004",
      "product": {
        "productOffering": {
          "id": "O40140084004",
          "name": "ONT éxpédié par Orange"
        },
        "productCharacteristic": [
          {
            "id": "FONC40140084015",
            "valueType": "object",
            "name": "Modèle ONT",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084015",
              "name": "Modèle 1 Gbps"
            }
          },
          {
            "id": "FONC40140084014",
            "valueType": "object",
            "name": "ONT installé par Orange",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084014",
              "name": "Oui"
            }
          }
        ]
      }
    },
    {
      "action": "add",
      "id": "GO40140084004",
      "product": {
        "productOffering": {
          "id": "GO40140084004",
          "name": "Intervention"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "O40140084005",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "O40140084005",
      "product": {
        "productOffering": {
          "id": "O40140084005",
          "name": "Intervention"
        },
        "productCharacteristic": [
          {
            "id": "FONC40140084007",
            "valueType": "object",
            "name": "Type d'intervention",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084007",
              "name": "Standard"
            }
          },
          {
            "id": "FONC40990080002",
            "valueType": "object",
            "name": "Intervention",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000840990080002",
              "name": "Intervention avec pose ONT : Prise Optique présente"
            }
          }
        ]
      }
    }
  ],
  "relatedParty": [
    {
      "@referredType": "organization",
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "Jean Pontus",
      "role": "buyer"
    }
  ],
  "quoteSpecification": "Acquisition"
}
HTTP/1.1 201 Created
Location: /quote/de76cfa1-9a55-412f-a9ee-61ca2f662a63

In the response body some attributes has been add including:

  • id
  • href
  • state (The state follows the lifecycle presented above)
  • expectedFulfillmentStartDate
  • expectedQuoteCompletionDate
  • requestedQuoteCompletionDate
  • quoteDate

If the payload is not valid, server will return a 400.

HTTP/1.1 400 Bad Request
{
  "code": "1",
  "message": "error message",
  "reason": "reason message",
  "@type": "Error"
}

2. I want to follow up my quote

To follow the quote state, you can do a GET on the resource /quote/{id}. Don't forget to use an access_token with owf:united-way:quote:v1:read scope.

GET /quote/de76cfa1-9a55-412f-a9ee-61ca2f662a63
HTTP/1.1 200 OK
{
  "id": "de76cfa1-9a55-412f-a9ee-61ca2f662a63",
  ...
  "state": "INPROGRESS",
  ...
}

I see that my quotation is still INPROGRESS, I have to wait that my quotation move to the state APPROVED or * CANCELLED* seing the lifecycle of the quotes.

3. I want to know the prices of my approved quote

If the state of your quote is APPROVED the quoteTotalPrice is added to your quote, and productPrice are added to the product with productOffering with the "productOfferingType": "atomicOffer" of your quoteItem.

GET /quote/de76cfa1-9a55-412f-a9ee-61ca2f662a63
HTTP/1.1 200 OK
{
  "category": "FTTH",
  "title": "Just Fibre TEST",
  "effectiveQuoteCompletionDate": "2022-03-17T16:32:27.000Z",
  "expectedFulfillmentStartDate": "2022-03-17T16:32:07.000Z",
  "expectedQuoteCompletionDate": "2022-06-17T16:32:07.000Z",
  "externalId": "externalId",
  "id": "40f874ef-0b88-4e4e-b676-31a60d6b5162",
  "instantSyncQuote": false,
  "note": [
    {
      "@type": "LegalNotices",
      "author": "OWF"
    },
    {
      "@type": "Note",
      "author": "OWF",
      "text": "Une cotation ne vaut pas réservation des ressources"
    }
  ],
  "quoteDate": "2022-03-17T16:32:07.000Z",
  "quoteItem": [
    {
      "action": "add",
      "id": "GOC40140084001",
      "product": {
        "isBundle": true,
        "place": [
          {
            "@type": "GeographicSiteBuilding",
            "role": "deliveryAddress",
            "geographicAddress": [
              {
                "@type": "GeographicAddressRivoli",
                "streetNr": "9",
                "streetName": "GRANDE RUE",
                "postcode": "69600",
                "city": "OULLINS",
                "geographicSubAddress": [
                  {
                    "@type": "GeographicSubAddress",
                    "buildingName": "OULLINS C"
                  },
                  {
                    "@type": "GeographicSubAddress",
                    "levelType": "staircase",
                    "levelNumber": "_NA_"
                  },
                  {
                    "@type": "GeographicSubAddress",
                    "levelType": "floor",
                    "levelNumber": "0"
                  }
                ],
                "geographicLocation": {
                  "@type": "RelatedGeographicLocation",
                  "geoCodeX": "4.810585",
                  "geoCodeY": "45.719603"
                },
                "cityCode": "69149",
                "streetCode": "0510"
              }
            ],
            "buildingCode": "IMB/69149/C/ZJU1"
          }
        ],
        "productOffering": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productOffering/GOC40140084001",
          "id": "GOC40140084001",
          "name": "Just Fibre TEST",
          "productOfferingType": "contract"
        }
      },
      "productOfferingQualificationItem": {
        "@type": "ProductOfferingQualificationValue",
        "characteristics": [
          {
            "valueType": "string",
            "name": "oiCode",
            "value": "FT"
          },
          {
            "valueType": "string",
            "name": "siteType",
            "value": "IMMEUBLE"
          },
          {
            "valueType": "string",
            "name": "nroCode",
            "value": "69149OUL"
          },
          {
            "valueType": "string",
            "name": "buildingCode",
            "value": "IMB/69149/C/ZJU1"
          }
        ],
        "eligibility": "eligible",
        "qualificationDate": "2022-03-17T16:32:16.000Z"
      },
      "quoteItemRelationship": [
        {
          "id": "OC40140084001",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "OC40140084001",
      "product": {
        "isBundle": true,
        "productOffering": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productOffering/OC40140084001",
          "id": "OC40140084001",
          "name": "Just Fibre TEST",
          "productOfferingType": "play"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "GO40140084001",
          "relationshipType": "bundles"
        },
        {
          "id": "GO40140084002",
          "relationshipType": "bundles"
        },
        {
          "id": "GO40140084003",
          "relationshipType": "bundles"
        },
        {
          "id": "GO40140084004",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "GO40140084001",
      "product": {
        "isBundle": true,
        "productOffering": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productOffering/GO40140084001",
          "id": "GO40140084001",
          "name": "Caractéristiques principales",
          "productOfferingType": "set"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "O40140084001",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "O40140084001",
      "product": {
        "isBundle": false,
        "productCharacteristic": [
          {
            "id": "FONC40140084004",
            "valueType": "object",
            "name": "Débit d'accès Montant/Descendant",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084004",
              "name": "300M/300M"
            }
          },
          {
            "id": "FONC40140084005",
            "valueType": "object",
            "name": "VLAN",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000240140084005",
              "name": "Sans TAG"
            }
          }
        ],
        "productOffering": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productOffering/O40140084001",
          "id": "O40140084001",
          "name": "Accès",
          "productOfferingType": "atomicOffer"
        },
        "productPrice": [
          {
            "description": "Abonnement Just Fibre TEST 300M/300M",
            "name": "Abonnement Just Fibre TEST 300M/300M",
            "price": {
              "dutyFreeAmount": {
                "unit": "eur",
                "value": 29.0
              }
            },
            "priceType": "recurring",
            "recurringChargePeriod": "MONTHLY"
          }
        ],
        "productRelationship": [
          {
            "product": {
              "href": "http://product-inventory-service.product-inventory-management/api/v1/product/2c9797447e05ac18017e252187b50025",
              "id": "2c9797447e05ac18017e252187b50025"
            },
            "relationshipType": "reliesOn"
          }
        ],
        "productSpecification": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productSpecification/PS40140084001",
          "id": "PS40140084001",
          "name": "Activation des ressources"
        }
      }
    },
    {
      "action": "add",
      "id": "GO40140084002",
      "product": {
        "isBundle": true,
        "productOffering": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productOffering/GO40140084002",
          "id": "GO40140084002",
          "name": "Point de livraison sur site client final",
          "productOfferingType": "set"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "O40140084008",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "O40140084008",
      "product": {
        "isBundle": false,
        "productCharacteristic": [
          {
            "id": "FONC40140084010",
            "valueType": "object",
            "name": "Type de point de livraison",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084010",
              "name": "DTIO/PTO"
            }
          },
          {
            "id": "FONC40140084008",
            "valueType": "object",
            "name": "Multi-accès",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000240140084008",
              "name": "Non"
            }
          },
          {
            "id": "FONC40140084003",
            "valueType": "object",
            "name": "Type de raccordement",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084003",
              "name": "Raccordement sur prise existante"
            }
          },
          {
            "id": "FONC40140084011",
            "valueType": "string",
            "name": "Référence PTO",
            "value": "FI-9786-6362"
          }
        ],
        "productOffering": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productOffering/O40140084008",
          "id": "O40140084008",
          "name": "Raccordement",
          "productOfferingType": "atomicOffer"
        },
        "productPrice": [
          {
            "description": "Mise en service Just Fibre TEST",
            "name": "Mise en service Just Fibre TEST",
            "price": {
              "dutyFreeAmount": {
                "unit": "eur",
                "value": 61.0
              }
            },
            "priceType": "nonRecurring",
            "recurringChargePeriod": "immediate"
          }
        ],
        "productSpecification": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productSpecification/PS40140084008",
          "id": "PS40140084008",
          "name": "Construction de l’accès et raccordement client"
        }
      }
    },
    {
      "action": "add",
      "id": "GO40140084003",
      "product": {
        "isBundle": true,
        "productOffering": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productOffering/GO40140084003",
          "id": "GO40140084003",
          "name": "Interface de livraison sur site client final",
          "productOfferingType": "set"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "O40140084004",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "O40140084004",
      "product": {
        "isBundle": false,
        "productCharacteristic": [
          {
            "id": "FONC40140084015",
            "valueType": "object",
            "name": "Modèle ONT",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084015",
              "name": "Modèle 1 Gbps"
            }
          },
          {
            "id": "FONC40140084014",
            "valueType": "object",
            "name": "ONT installé par Orange",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084014",
              "name": "Oui"
            }
          }
        ],
        "productOffering": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productOffering/O40140084004",
          "id": "O40140084004",
          "name": "ONT expédié par Orange",
          "productOfferingType": "atomicOffer"
        },
        "productPrice": [
          {
            "description": "Installation du boitier ONT",
            "name": "Installation du boitier ONT",
            "price": {
              "dutyFreeAmount": {
                "unit": "eur",
                "value": 150.0
              }
            },
            "priceType": "nonRecurring",
            "recurringChargePeriod": "immediate"
          },
          {
            "description": "Livraison à l'adresse",
            "name": "Livraison à l'adresse",
            "price": {
              "dutyFreeAmount": {
                "unit": "eur",
                "value": 50.0
              }
            },
            "priceType": "nonRecurring",
            "recurringChargePeriod": "immediate"
          }
        ],
        "productSpecification": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productSpecification/PS40140084004",
          "id": "PS40140084004",
          "name": "Livraison du matériel"
        }
      }
    },
    {
      "action": "add",
      "id": "GO40140084004",
      "product": {
        "isBundle": true,
        "productOffering": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productOffering/GO40140084004",
          "id": "GO40140084004",
          "name": "Intervention",
          "productOfferingType": "set"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "O40140084005",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "add",
      "id": "O40140084005",
      "product": {
        "isBundle": false,
        "productCharacteristic": [
          {
            "id": "FONC40140084007",
            "valueType": "object",
            "name": "Type d'intervention",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000140140084007",
              "name": "Standard"
            }
          },
          {
            "id": "FONC40990080002",
            "valueType": "object",
            "name": "Intervention",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000840990080002",
              "name": "Intervention avec pose ONT : Prise Optique présente"
            }
          }
        ],
        "productOffering": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productOffering/O40140084005",
          "id": "O40140084005",
          "name": "Intervention",
          "productOfferingType": "atomicOffer"
        },
        "productSpecification": {
          "href": "http://fp-lizard-catalog.ops/api/catalog/productSpecification/PS40140084005",
          "id": "PS40140084005",
          "name": "Intervention"
        }
      }
    }
  ],
  "quoteTotalPrice": [
    {
      "description": "Non recurring",
      "name": "Total price",
      "price": {
        "dutyFreeAmount": {
          "unit": "eur",
          "value": 261.0
        }
      },
      "priceType": "nonRecurring",
      "recurringChargePeriod": "immediate"
    },
    {
      "description": "Non recurring altered",
      "name": "Total price",
      "price": {
        "dutyFreeAmount": {
          "unit": "eur",
          "value": 261.0
        }
      },
      "priceType": "nonRecurring",
      "recurringChargePeriod": "immediate"
    },
    {
      "description": "Recurring",
      "name": "Total price",
      "price": {
        "dutyFreeAmount": {
          "unit": "eur",
          "value": 29.0
        }
      },
      "priceType": "recurring",
      "recurringChargePeriod": "MONTHLY"
    },
    {
      "description": "Recurring altered",
      "name": "Total price",
      "price": {
        "dutyFreeAmount": {
          "unit": "eur",
          "value": 29.0
        }
      },
      "priceType": "recurring",
      "recurringChargePeriod": "MONTHLY"
    }
  ],
  "relatedParty": [
    {
      "@referredType": "organization",
      "href": "/api/v1/organization/ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "ABSOLIGHT",
      "role": "buyer"
    }
  ],
  "requestedQuoteCompletionDate": "2022-03-17T16:32:07.000Z",
  "state": "APPROVED",
  "validFor": {
    "endDateTime": "2022-03-17T16:32:27.000Z",
    "startDateTime": "2022-03-17T16:32:27.000Z"
  },
  "quoteLevel": "information",
  "quoteSpecification": "Acquisition",
  "href": "/api/v1/quote/40f874ef-0b88-4e4e-b676-31a60d6b5162"
}

4. I want to know the errors of my cancelled quote

If the state of your quote is CANCELLED you can do a GET on the resource to see the errors message. Don't forget to use an access_token with owf:united-way:quote:v1:read scope.

GET /quote/3fd8ed29-c4c9-41e3-86eb-e3659dc49daa
HTTP/1.1 200 OK
{
  "category": "FTTH",
  "title": "Just Fibre TEST",
  "expectedFulfillmentStartDate": "2022-03-17T17:08:55.000Z",
  "expectedQuoteCompletionDate": "2022-06-17T17:08:55.000Z",
  "externalId": "externalId",
  "id": "3fd8ed29-c4c9-41e3-86eb-e3659dc49daa",
  "instantSyncQuote": false,
  "note": [
    {
      "@type": "ErrorNote",
      "author": "System",
      "date": "2022-03-17T17:09:03.000Z",
      "text": "Partnair call failure : {\"code\":\"ConfigurationException\",\"reason\":\"The action updateAttribute (action parameter : {_action=updateAttribute, code=FONC40140084004, value=VF0000140140084004X}) is not allowed on the item Accès.\"}"
    }
  ],
  "quoteDate": "2022-03-17T17:08:55.000Z",
  "quoteItem": [
    ...
  ],
  "relatedParty": [
    {
      "@referredType": "organization",
      "href": "/api/v1/organization/ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "ABSOLIGHT",
      "role": "buyer"
    }
  ],
  "requestedQuoteCompletionDate": "2022-03-17T17:08:55.000Z",
  "state": "CANCELLED",
  "quoteSpecification": "Acquisition",
  "href": "/api/v1/quote/3fd8ed29-c4c9-41e3-86eb-e3659dc49daa"

5. I want to accept or reject my quote

If the state of your quote is APPROVED you can do a PATCH on the resource to update the state to ACCEPTED or * REJECTED*. Don't forget to use an access_token with owf:united-way:quote:v1:write scope.

PATCH /quote/3fd8ed29-c4c9-41e3-86eb-e3659dc49daa
Content-Type: application/json
{
  "state": "REJECTED"
}
HTTP/1.1 200 OK

6. I want to get a quote to modify an asset of product inventory

I am in a sales administration team, I need to get the cost to change a configuration of an asset of product inventory.

Understand a quote in modification

Unlike an Acquisition quote, it is not necessary to transmit all productOfferings of your product. It is only necessary to transmit the branch of the productOffering on which the modification is requested.

Imagine your product have these definition:

enter image description here

If you want to modify characteristic 1, you must create in your quote only the tree structure up to this characteristic :

enter image description here

Find the product into product inventory service

To generate the quote you must first target a product in the product inventoy to veriy if it exist, this action can be done by requesting the contract product level in the product inventory service:

GET api/v1/product/<productContractId>?depth=4

This request return the product at level contract and all his childs (set, play, atomic offer).

{
  "id": "2c901c417f74d06d017f8d1f173a222d",
  "href": "https://pepsi-integration.si.fr.intraorange/product-inventory-service-integration/api/v1/product/2c901c417f74d06d017f8d1f173a222d",
  "isBundle": true,
  "isCustomerVisible": true,
  "name": "FTTH Access",
  "creationDate": "2022-03-15T10:28:10.000Z",
  "productSerialNumber": "productSerailNumber",
  "startDate": "2022-03-15T10:28:10.000Z",
  "terminationDate": "2022-03-15T10:28:10.000Z",
  "agreement": [
    {
      "id": "AB2021097",
      "agreementItemId": "Valeur de la Réf. du contrat issue de la commande"
    }
  ],
  "billingAccount": {
    "id": "Valeur du compte de facturation issue de la commande"
  },
  "place": [
    ...
  ],
  "productOffering": {
    "id": "GOC40140084001",
    "name": "FTTH Access",
    "productOfferingType": "contract"
  },
  "productRelationship": [
    {
      ...

Find available modify action in the catalog

When you get a quote to modify an asset, you could change one elements by elements for an unique quote. For exemple in FTTH Acces you could modify the GTR or the Speed but not into the same quote (To know the possible modification action into a ProductOffering contract, refer to the catalog service information).

This informations could be found by requesting the contract level productOffering in the catalog:

GET api/catalog/productOffering/<productOfferingId>

This request return into the attribute otherProperty a list of value name operationSpecification.*. In the case of a modification, look for those named modification.

{
  "id": "GOC40140084001",
  "href": "https://cae-owfventes-integration.caas-cnp-apps-noprod.com.intraorange/api/catalog/v2/productOffering/GOC40140084001",
  "name": "FTTH Access",
  "shortName": "FTTH Access",
  "description": "Offre de bitstream régional / national - composante accès FTTH",
  "category": [
    ...
  ],
  "otherProperty": [
    {
      "id": "operationSpecification.Acquisition",
      "multiplesValues": [
        "expectedParty.operatorDeliveryDriver:individual",
        "expectedPlace.deliveryAddress:geographicSiteBuilding",
        "mandatoryCriteria:operationSpecification",
        "mandatoryCriteria:siteType",
        "expectedSubAddress:true",
        "expectedResource:resourcePto",
        "mandatoryCriteria:oiBlomCode",
        "mandatoryCriteria:requestedDeliveryDate",
        "expectedParty.operatorInterlocutor:individual",
        "requestedproductOfferingQualification:true"
      ]
    },
    {
      "id": "operationSpecification.gtrModification",
      "multiplesValues": [
        "expectedParty.operatorInterlocutor:individual",
        "expectedSubAddress:false",
        "mandatoryCriteria:operationSpecification",
        "requestedproductOfferingQualification:true",
        "mandatoryCriteria:oiBlomCode",
        "mandatoryCriteria:requestedDeliveryDate"
      ]
    },
    {
      "id": "operationSpecification.speedCosModification",
      "multiplesValues": [
        "expectedParty.operatorInterlocutor:individual",
        "expectedSubAddress:false",
        "mandatoryCriteria:operationSpecification",
        "requestedproductOfferingQualification:true",
        "mandatoryCriteria:requestedDeliveryDate",
        "mandatoryCriteria:oiBlomCode"
      ]
    },
    {
      "id": "operationSpecification.Termination",
      "multiplesValues": [
        "expectedParty.operatorInterlocutor:individual",
        "expectedSubAddress:false",
        "mandatoryCriteria:operationSpecification",
        "requestedproductOfferingQualification:true",
        "mandatoryCriteria:requestedDeliveryDate",
        "mandatoryCriteria:oiBlomCode"
      ]
    }
  ]
}

In the case below we have:

  • operationSpecification.speedCosModification
  • operationSpecification.gtrModification

This value will be filled in the quoteSpecification attribute of the quote depending on what you want to do.

Possible action on quote item

When you build your quote in modification you should specify on quoteItem of your Tree an action which could be:

  • nochange (if no change is needed on the productOffering)
  • modify (if you modify a characteristic on a productOffering)
  • add (if you enable a productOffering)
  • delete (if you disable a productOffering)

Building a quote in modification

add mandatory attribute to the quote in modification

set to the quote:

{
  "externalId": "externalId",
  "instantSyncQuote": false,
  "quoteSpecification": "speedCosModification",
  ...
}

set your organization information into the RelatedParty (see chapter RelatedParty to know how to get it)

{
    "externalId": "externalId",
    "instantSyncQuote": false,
    "quoteSpecification": "speedCosModification"
    "relatedParty": [
        {
            "@referredType": "organization",
            "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
            "name": "ABSOLIGHT",
            "role": "buyer"
        }
    ],
    ...
}

add quoteItems to the quote in modification

As explained above, our quote in modification will only consist of 4 quoteItems productOffering type:

  • 1 contract
  • 1 play
  • 1 set
  • 1 atomic offer
create a quoteItem contract
  • In the quoteItem for the productOffering of type contract you should specify the product to be modify by defining the productId into le product object.
  • The action is nochange on this item.
  • Set the quoteItemRelationship to the quoteItem for productOffering of type play (see chapter create a quoteItem with a quoteItemRelationship
 {
  "action": "nochange",
  "id": "GOC40140084001",
  "product": {
    "id": "2c901c417f74d06d017f8d1f173a222d",
    "productOffering": {
      "id": "GOC40140084001",
      "name": "FTTH Access"
    }
  },
  "quoteItemRelationship": [
    {
      "id": "OC40140084001",
      "relationshipType": "bundles"
    }
  ]
},...
create quoteItem play and set
  • The action is nochange on these item.
  • Set the quoteItemRelationship to the quoteItem for productOffering of type set on the quoteItem play
  • Set the quoteItemRelationship to the quoteItem for productOffering of type atomicOffer on the quoteItem set
[
  {
    "action": "nochange",
    "id": "OC40140084001",
    "product": {
      "productOffering": {
        "id": "OC40140084001",
        "name": "FTTH Access"
      }
    },
    "quoteItemRelationship": [
      {
        "id": "GO40140084001",
        "relationshipType": "bundles"
      }
    ]
  },
  {
    "action": "nochange",
    "id": "GO40140084001",
    "product": {
      "productOffering": {
        "id": "GO40140084001",
        "name": "Caract├®ristiques principales"
      }
    },
    "quoteItemRelationship": [
      {
        "id": "O40140084001",
        "relationshipType": "bundles"
      }
    ]
  }
]
create a quoteItem atomicOffer

For the quoteItem with productOffering atomicOffer, you could set 3 possibles actions types:

  • add
  • delete
  • modify

If you want for exemple enable a productOffering atomicOffer "Garantie de temps de rétablissement" not present in your product you used the action: add.

{
  "action": "add",
  "id": "O40140084002",
  "product": {
    "productOffering": {
      "id": "O40140084002",
      "name": "Garantie de temps de rétablissement"
    },
    "productCharacteristic": [
      {
        "valueType": "object",
        "id": "FONC40140084009",
        "valueType": "object",
        "name": "Type de GTR",
        "value": {
          "@type": "CharacteristicChoiceValue",
          "id": "VF0000240140084009",
          "name": "10 heures HO (heures ouvrables)"
        }
      }
    ]
  }
},...

Warning: If this atomicOffer contains some characteristics you must set them.

If you want for exemple disable a productOffering atomicOffer "Garantie de temps de rétablissement" present in your product you used the action: delete.

{
  "action": "delete",
  "id": "O40140084002",
  "product": {
    "productOffering": {
      "id": "O40140084002",
      "name": "Garantie de temps de rétablissement"
    }
  }
},...

If you want for exemple change a productOffering atomicOffer characteristic "Débit d'accès Montant/Descendant" present in your product you used the action: modify.

{
  "action": "modify",
  "id": "O40140084001",
  "product": {
    "productOffering": {
      "id": "O40140084001",
      "name": "Accès"
    },
    "productCharacteristic": [
      {
        "valueType": "object",
        "id": "FONC40140084004",
        "valueType": "object",
        "name": "Débit d'accès Montant/Descendant",
        "value": {
          "@type": "CharacteristicChoiceValue",
          "id": "VF0000240140084004",
          "name": "400M/1000M"
        }
      }
    ]
  }
},...

Create quote in modification

When the contains of your quote is fully, You can do a POST. Don't forget to use an access_token with owf:united-way: quote:v1:write scope.

POST /quote
Content-Type: application/json
{
  "@type": "Quote",
  "category": "OWF Quote",
  "description": "Quote from quote capture",
  "instantSyncQuote": false,
  "expectedFulfillmentStartDate": "2022-12-21T14:19:16.946+01:00",
  "quoteItem": [
    {
      "action": "nochange",
      "id": "GOC40140084001",
      "product": {
        "id": "2c901c417f74d06d017f8d1f173a222d",
        "productOffering": {
          "id": "GOC40140084001",
          "name": "FTTH Access"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "OC40140084001",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "nochange",
      "id": "OC40140084001",
      "product": {
        "productOffering": {
          "id": "OC40140084001",
          "name": "FTTH Access"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "GO40140084001",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "nochange",
      "id": "GO40140084001",
      "product": {
        "productOffering": {
          "id": "GO40140084001",
          "name": "Caractéristiques principales"
        }
      },
      "quoteItemRelationship": [
        {
          "id": "O40140084001",
          "relationshipType": "bundles"
        }
      ]
    },
    {
      "action": "modify",
      "id": "O40140084001",
      "product": {
        "productOffering": {
          "id": "O40140084001",
          "name": "Accès"
        },
        "productCharacteristic": [
          {
            "id": "FONC40140084004",
            "valueType": "object",
            "name": "Débit d'accès Montant/Descendant",
            "value": {
              "@type": "CharacteristicChoiceValue",
              "id": "VF0000240140084004",
              "name": "400M/1000M"
            }
          }
        ],
        "productSpecification": {
          "id": "PS40140084001",
          "name": "Activation sur fibre optique"
        }
      }
    }
  ],
  "relatedParty": [
    {
      "@referredType": "organization",
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "Jean Pontus",
      "role": "buyer"
    }
  ],
  "version": "1",
  "quoteSpecification": "speedCosModification"
}

7. I want to get a quote to terminate an asset of product inventory

I am in a sales administration team, I need to get the cost to terminate an asset of product inventory.

Understand a quote in termination

Unlike an Acquisition quote, it is not necessary to transmit all productOfferings of your product. It is only necessary to transmit the quoteItem of the productOffering of type contract on which the termination is requested.

Find the product into product inventory service

To generate the quote you must first target a product in the product inventoy to veriy if it exist, this action can be done by requesting the contract product level in the product inventory service:

GET api/v1/product/<productContractId>?depth=4

This request return the product at level contract and all his childs (set, play, atomic offer).

{
  "id": "2c901c417f74d06d017f8d1f173a222d",
  "href": "https://pepsi-integration.si.fr.intraorange/product-inventory-service-integration/api/v1/product/2c901c417f74d06d017f8d1f173a222d",
  "isBundle": true,
  "isCustomerVisible": true,
  "name": "FTTH Access",
  "creationDate": "2022-03-15T10:28:10.000Z",
  "productSerialNumber": "productSerailNumber",
  "startDate": "2022-03-15T10:28:10.000Z",
  "terminationDate": "2022-03-15T10:28:10.000Z",
  "agreement": [
    {
      "id": "AB2021097",
      "agreementItemId": "Valeur de la Réf. du contrat issue de la commande"
    }
  ],
  "billingAccount": {
    "id": "Valeur du compte de facturation issue de la commande"
  },
  "place": [
    ...
  ],
  "productOffering": {
    "id": "GOC40140084001",
    "name": "FTTH Access",
    "productOfferingType": "contract"
  },
  "productRelationship": [
    {
      ...

Building a quote in termination

add mandatory attribute to the quote in termination

set to the quote:

  • "instantSyncQuote": false
  • "quoteSpecification": "Termination"
{
  "externalId": "externalId",
  "instantSyncQuote": false,
  "quoteSpecification": "Termination",
  ...
}

set your organization information into the RelatedParty (see chapter RelatedParty to know how to get it)

{
    "externalId": "externalId",
    "instantSyncQuote": false,
    "quoteSpecification": "Termination"
    "relatedParty": [
        {
            "@referredType": "organization",
            "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
            "name": "ABSOLIGHT",
            "role": "buyer"
        }
    ],
    ...
}

add quoteItem contract to the quote in termination

  • In the quoteItem for the productOffering of type contract you should specify the product to be modify by defining the productId into le product object.
  • The action is delete on this item.
{
  "action": "delete",
  "id": "GOC40140084001",
  "product": {
    "id": "2c9792bf7f4a4905017f4b1ced5000c5",
    "productOffering": {
      "id": "GOC40140084001",
      "name": "FTTH Access"
    }
  }
}

Create quote in termination

When the contains of your quote is fully, You can do a POST. Don't forget to use an access_token with owf:united-way: quote:v1:write scope.

POST /quote
Content-Type: application/json
{
  "requestedDebit": 0.0,
  "@type": "Quote",
  "category": "OWF Quote",
  "description": "Quote from quote capture",
  "instantSyncQuote": false,
  "expectedFulfillmentStartDate": "2022-12-21T14:19:16.946+01:00",
  "quoteItem": [
    {
      "action": "delete",
      "id": "GOC40140084001",
      "product": {
        "id": "2c9792bf7f4a4905017f4b1ced5000c5",
        "productOffering": {
          "id": "GOC40140084001",
          "name": "FTTH Access"
        }
      }
    }
  ],
  "relatedParty": [
    {
      "@referredType": "organization",
      "id": "ea69228c-600a-4058-8e4e-e13fcc8bf89f",
      "name": "Jean Pontus",
      "role": "buyer"
    }
  ],
  "version": "1",
  "quoteSpecification": "Termination"
}