Table of Contents
- Table of Contents
- Authentication prerequisite
- Base URL
- Resources
- Sub resources
- Notifications
- Quote life cycle
- Query Resources patterns
- Errors
- Use cases
- 1. I want to get a quote for a new configuration from a product offering
- 2. I want to follow up my quote
- 3. I want to know the prices of my approved quote
- 4. I want to know the errors of my cancelled quote
- 5. I want to accept or reject my quote
- 6. I want to get a quote to modify an asset of product inventory
- 7. I want to get a quote to terminate an asset of product inventory
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.
Scope | Description |
---|---|
owf:united-way:quote:v1:readonly | Allow GET, HEAD http request for any resource of this api |
owf:united-way:quote:v1:write | Allow POST, PUT, DELETE http request for any resource of this api |
- If your client will only do
GET
requests, you may request anaccess_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 API Place 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
Resource | Description |
---|---|
Quote | Quote 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
Name | Type / Format | Description | Example |
---|---|---|---|
quoteSpecification | String | define 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 productOffering | Acquisition |
instantSyncQuote | boolean | Only value false is accepted because we do not retrieve synchronous quote | false |
relatedParty | RelatedParty[] | your organization information | see below |
quoteItem | QuoteItem[] | the list of quote items represent the offer you want to quote including different characteristics chosen | see below |
Sub resources
Resource | Description |
---|---|
RelatedParty | A reference to a party playing a role in this quote (buyer). |
QuoteItem | A quote items describe an action to be performed on a productOffering or a product in order to get pricing elements and condition. |
QuoteItemRelationship | Used to describe relationship between quote item. |
Product | A product to be created defined by value or existing defined by reference. |
ProductOffering | A product offering represents entities that are orderable from the provider of the catalog, this resource includes pricing information. |
RelatedPlaceRefOrValue | A related place defines a place described by reference or by value linked to a specific entity. |
GeographicSiteBuilding | A polymorphic entity of RelatedPlaceRefOrValue to manage address by buidingCode. |
GeographicAddress | a sub entity of GeographicSiteBuilding which contains place informations. |
GeographicSubAddress | a 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).
Name | Type / Format | Description | Example | Mandatory |
---|---|---|---|---|
id | String | id of your organization | "ea69228c-600a-4058-8e4e-e13fcc8bf89f" | yes |
role | String | shoud be buyer | "buyer" | yes |
@referredType | String | shoud be organization | "organization" | yes |
name | String | name 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.
Name | Type / Format | Description | Example | Mandatory |
---|---|---|---|---|
id | int | unique id, used for relationship between quote items | "1" | yes |
action | String | can be add , modify , nochange or delete depending on quoteSpecification | "add" | yes |
quoteItemRelationship | QuoteItemRelationship[] | Information about the relation of the quote item | see below | depends cases |
product | Product | contains information about product (exemple characteristics) | see below | depends 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.
Name | Type / Format | Description | Example | Mandatory |
---|---|---|---|---|
id | String | id of the quote item wich has a relation with the current quote item | "1" | yes |
relationshipType | String | Relationship 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.
Name | Type / Format | Description | Example | Mandatory |
---|---|---|---|---|
agreement | AgreementItemRef | contains information about contract | see below | (yes in the quoteItem contract if quoteSpecification is a value of Modification ) |
place | RelatedPlaceRefOrValue | see below | (yes in the quoteItem contract if quoteSpecification is Acquisition ) | |
productCharacteristics | Characteristic[] | key value object | see below | yes |
productOffering | ProductOffering | contains information about product offering | see below | yes |
isBundle | Boolean | true if the quote item is bundled by another one | true | yes |
id | String | id of the product inventory asset | true | (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.
Name | Type / Format | Description | Example | Mandatory |
---|---|---|---|---|
id | String | unique id of the productOffering coming from Product catalogue management API | "GOC40140084001" | yes |
href | String | url to get more information about the productOffering | "http://..." | no |
name | String | Description 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.
Name | Type / Format | Description | Example | Mandatory |
---|---|---|---|---|
id | String | unique 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 message | Description |
---|---|
The agreement id is mandatory | Agreement id missing in the product offering type contract |
Agreement is not valid | Your contract is not valid or has not been found, please contact your Commercial Service. |
The product Offering is not covered by the agreement | Your 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 theproductOffering
of typecontract
contains anotherProperty
:expectedPlace.deliveryAddress:geographicSiteBuilding
. This place need to be defined into theproduct
of thequoteItem
which contains theproductOffering
of typecontract
.To verify this call Product catalogue management API and search
otherProperty
nameoperationSpecification.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" ] }, ...
Name | Type / Format | Description | Example | Mandatory |
---|---|---|---|---|
role | String | role of the address | "deliveryAddress" | yes |
@type | String | object type | "GeographicSiteBuilding" | yes |
buildingCode | String | building code of the the address (find with Aero API) | "IMB/69149/C/ZJU1" | yes |
geographicAddress | GeographicAddress[] | information about the geographicAddress (to set geographicSubAddress ) | see below | depends 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 theproductOffering
of typecontract
contains anotherProperty
:expectedResource:resourcePto
:To verify this call Product catalogue management API and search
otherProperty
nameoperationSpecification.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" ] }, ...
Name | Type / Format | Description | Example | Mandatory |
---|---|---|---|---|
geographicSubAddress | geographicSubAddress[] | list of geographicSubAddress | see below | yes |
@type | String | object type | "GeographicAddress" | yes |
GeographicSubAddress
Warning: The
GeographicSubAddress
is mandatory if theproductOffering
of typecontract
contains anotherProperty
:expectedSubAddress:true
:To verify this call Product catalogue management API and search
otherProperty
nameoperationSpecification.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" ] }, ...
Name | Type / Format | Description | Example | Mandatory |
---|---|---|---|---|
buildingName | String | building name | "OULLINS C" | depends cases |
levelNumber | String | list of geographicSubAddress | "NA" , "0",... | depends cases |
levelType | String | list of geographicSubAddress | "floor" or "staircase" | depends cases |
@type | String | object 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.
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"eDate.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 newaccess 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 code | Quotify code error | error message |
---|---|---|
400 | 20 | Invalid URL parameter value |
400 | 21 | Missing body |
400 | 22 | Invalid body |
400 | 23 | Missing body field |
400 | 24 | Invalid body field |
400 | 25 | Missing header |
400 | 26 | Invalid header value |
400 | 27 | Missing query-string parameter |
400 | 28 | Invalid query-string parameter value |
401 | 40 | Missing credentials |
401 | 41 | Invalid credentials |
401 | 42 | Expired credentials |
403 | 50 | Access denied |
403 | 51 | Forbidden requester |
403 | 52 | Forbidden user |
403 | 53 | Too many requests |
404 | 60 | Resource not found |
405 | 61 | Method not allowed |
406 | 62 | Not acceptable |
408 | 63 | Request time-out |
409 | 69 | Conflict |
411 | 64 | Length required |
412 | 65 | Precondition failed |
413 | 66 | Request entity too large |
414 | 67 | Request-URI too long |
415 | 68 | Unsupported Media Type |
429 | 53 | Too many requests |
500 | 1 | Internal Server Error |
502 | 1 | Internal error |
502 | 3 | Bad gateway |
503 | 5 | The service is temporarily unavailable |
503 | 6 | Orange 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 code | Business error message |
---|---|
TODO | missing error message |
001 | no aero code referring to the given catalog offer id |
002 | Legal notices not found for the given quoteLevel |
003 | The field instantSyncQuote can't be true |
004 | One quoteItem is mandatory |
005 | Every related party must have an id and referred type |
006 | Every note must have an id and text field |
007 | Every billing account must have an id |
008 | Every agreement must have an id |
009 | Every product offering must have an id |
010 | At least one place has to be inform |
011 | No more than one place is allowed |
012 | no qualification result in aero response |
013 | not eligible geographically |
014 | No cuivre offer available with the requested debit in Aero response for geographical eligibility control |
015 | Not able to qualify the given address |
016 | No place found to be qualify |
017 | Not able to check the geographical eligibility |
018 | We are not able to handle the given offer category |
019 | QuoteItem with ProductOffering not found |
020 | The QuoteItem tree have missing elements |
021 | The offer configuration is invalid |
022 | The QuoteItem tree have infinite loop of elements |
023 | Cannot create configuration session |
024 | ConfigurationItem dont exist in quoteItem and one of its attributes is mandatory |
025 | Missing quote item to correctly configure the offer |
026 | Missing mandatory characteristic %s |
027 | Unsupported characteristic type |
028 | Update configuration error |
029 | Missing characteristic value |
030 | Unknown product characteristic type |
031 | The attribut action is missing on at least one quote item |
032 | The action value of quote item is not recognized |
033 | ProductOffering not found in lizard |
034 | QuoteItem root not found |
035 | Category not found in lizard |
036 | Pour effectuer une cotation sur cette offre |
037 | Qualification address error |
038 | No ProductOffering with specified ID found in API Catalog |
039 | An seller and buyer related party are mandatory |
040 | Pour effectuer une cotation sur cette offre |
041 | No valid agreement found |
042 | Missing property from catalog response: 'PRODUIT_COTABLE_SANS_CONTRAT' |
043 | Missing eligible criteria |
044 | At least 2 QuoteItems have the same id |
045 | the QuoteItem with id %s is not found |
046 | Le code immeuble est inconnu |
047 | Session configuration error: %s |
048 | ConfigurationItem with productOfferingId: %s not found in lizard session configuration |
049 | QuoteItem with productOfferingId: %s is not a child of QuoteItem with productOfferingId: %s in lizard session configuration |
050 | The product id %s is not recognize |
051 | Quote process type unknown |
052 | Quote item for modification not found |
053 | 2 quote items are mandatory for modification quote |
060 | Multiple building codes exist for the given address |
061 | The termination date cannot be before d+1 |
062 | code Oi Blom introuvable dans la reponse aero |
063 | The related party role and referred type are incompatible |
064 | Missing quote specification |
065 | No information available to validate related party |
066 | The 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
Contract | Play | Set | Atomic Offer | Relationships |
---|---|---|---|---|
ProductOffering Contract 1 | bundles "productOffering Play | |||
productOffering Play 1 | bundles "productOffering Set 1" | |||
productOffering Set 1 | bundles "productOffering AtomicOffer 1", "productOffering AtomicOffer 2" and "productOffering AtomicOffer 3" | |||
productOffering AtomicOffer 1 | ||||
productOffering AtomicOffer 2 | ||||
productOffering AtomicOffer 3 | ||||
productOffering Set 2 | bundles "productOffering AtomicOffer 4" | |||
productOffering AtomicOffer 4 |
Visual representation of a catalog offer
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",
...
}
add the related party
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"
theproductCharacteristic
format in the quoteItem is:{ "id": "FONC40140084011", "valueType": "string", "name": "Référence PTO", "value": "XXXXXXXXX" }
If the catalog
productSpecCharacteristic
have aproductSpecCharacteristicValue
list, theproductCharacteristic
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:
If you want to modify characteristic 1
, you must create in your quote only the tree structure up to this characteristic :
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:
- "instantSyncQuote": false
- "quoteSpecification": "speedCosModification" , depending to the modify action available on the contract offer ( see Find available modify action in the catalog
{
"externalId": "externalId",
"instantSyncQuote": false,
"quoteSpecification": "speedCosModification",
...
}
add the related party to the quote in modification
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 typecontract
you should specify the product to be modify by defining theproductId
into leproduct
object. - The action is
nochange
on this item. - Set the
quoteItemRelationship
to thequoteItem
for productOffering of typeplay
(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 thequoteItem
for productOffering of typeset
on thequoteItem
play
- Set the
quoteItemRelationship
to thequoteItem
for productOffering of typeatomicOffer
on thequoteItem
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",
...
}
add the related party to the quote in 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 typecontract
you should specify the product to be modify by defining theproductId
into leproduct
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"
}