Documentation des APIs elloha de gestion des dossiers de vente v1.9
Introduction
Généralités
Les APIs de gestion des dossiers de vente dans elloha permettent de réaliser des consultations, créations, modifications, et annulations de dossiers portant sur un canal de distribution donné.
Etant donné le caractère sensible des données, les accès à ces APIs sont soumis à une couche de sécurité supplémentaire à base de jetons. Afin de pouvoir s'authentifier, il sera ainsi nécessaire de posséder un compte associé à votre canal de distribution, ce qui vous permettra alors de générer les jetons nécessaires afin de manipuler les dossiers de vente associés à votre canal.
L'ensemble des éléments liés à votre compte de connexion vous seront transmis, à votre demande, par le support elloha.
Historique des versions
Version | Date | Description |
---|---|---|
v1.0 | 20/11/2017 | Création du document. |
v1.1 | 09/08/2019 | Actualisation du document. |
v1.2 | 24/04/2020 | Actualisation du document. Ajout de méthodes d'annulation de dossier. |
v1.3 | 10/03/2021 | Ajout de l'état des réservations et les lignes de réservation lors de la consultation des dossiers. |
v1.4 | 02/07/2021 | Ajout du paramètre de recherche "ReturnCancelledReservations". |
v1.5 | 29/08/2022 | Ajout du paramètre de recherche "IdBookingEngine". |
v1.6 | 14/04/2023 | Possibilité de créer des dossier non finalisé en utilisant le paramètre ReservationState. Ajout du paramètre PaymentUrl. |
v1.7 | 27/04/2023 | Ajout de l'header "version". |
v1.8 | 27/06/2023 | Ajout des participants. |
v1.9 | 05/11/2023 | Ajout de l'OptIn aux clients. |
v2.0 | 07/01/2025 | Ajout du paramètre "ModifyLocalBooking" permettant de limiter les modifications au dossier local dans le cas de dossiers issus d'un connecteur. |
Authentification
Généralités
Les APIs elloha de gestion des dossiers de vente nécessitent une authentification à base de jetons, chaque jeton possédant une durée de vie limitée. Ainsi, l'accès à ces APIs doit obligatoirement suivre le cheminement suivant :
- Etape 1 : appel à l'API d'authentification.
- Etape 2 : récupération du jeton fourni par l'API d'authentification.
- Etape 3 : appel aux APIs de gestion des dossiers de vente en transmettant via un header spécifique le jeton à disposition.
L'API elloha d'authentification est accessible via l'URL :
https://api.elloha.com/auth/token
L'URL ci-dessus doit être appelée avec la méthode POST et en y appliquant les headers suivants :
Header | Obligatoire | Valeur |
---|---|---|
accept | oui | application/json |
content-type | oui | application/json |
version | non | 2 |
Génération d'un jeton
Afin de permettre la création d'un jeton, les éléments de votre compte de connexion doivent être envoyés à l'API d'authentification, via une transaction au format JSON transmise à l'API par la méthode POST.
Cette transaction doit comporter les champs suivants :
Propriété | Type | Obligatoire | Description | Exemple |
---|---|---|---|---|
string | oui | Adresse E-mail du compte de connexion. | "Email": "moncompte@elloha.com" | |
Password | string | oui | Mot de passe du compte de connexion. | "Password": "abcdef123!" |
Exemple de transaction d'authentification
Copier
{
"Email": "moncompte@elloha.com",
"Password": "abcdef123!"
}
Suite à l'appel à l'API d'authentification, 2 cas de figure peuvent alors se présenter :
- Soit l'authentification est refusée car le couple E-mail/mot de passe est incorrect. Dans ce cas, une erreur 401 (Unauthorized) est retournée par l'API et aucune information supplémentaire n'est fournie.
- Soit l'authentification est acceptée et dans ce cas, une transaction de réponse au format JSON, contenant le jeton d'authentification, est retournée.
Le format de la transaction de réponse, en cas de succès de l'authentification, est le suivant :
Propriété | Type | Description | Exemple |
---|---|---|---|
token | string | Valeur du jeton généré. | "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzd WIiOiJkb3Jkb2duZUBlbGxvaGEuY29tIiwianRpIjoi ZjQyZWNiNDUtN2I2OS00M2I3LTgwZmQtYzI0YWRmZTV lMzM0IiwiSWRFY3QiOiJjZDEwMjNmNy05N2QzLTQyN2 UtYWU1OC1lZjA3NDA2YTdlZTUiLCJlbWFpbCI6ImRvc mRvZ25lQGVsbG9oYS5jb20iLCJleHAiOjE1MDk3MDQ1 OTAsImlzcyI6Imh0dHA6Ly9lbGxvaGEuY29tIiwiYXV kIjoiaHR0cDovL2VsbG9oYS5jb20ifQ._Jb3Fxj74xt gdT-_RM3tMIooB0y8ytgcE9orsSpn3oA" |
expiration | datetime | Date et heure, au format yyyy-mm-dd hh:mm:ss et basés sur le fuseau horaire universel, à partir desquels le jeton sera considéré comme expiré. Passé ce moment, le jeton deviendra inutilisable et il sera nécessaire de rappeler l'API d'authentification afin de générer un nouveau jeton. | "expiration": "2017-11-03T10:23:10Z" |
A noter qu'un jeton a, par défaut, une durée de vie de 2 heures.
Exemple de transaction de réponse à une authentification
Copier
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkb3Jkb2duZUBlbGxvaGEuY29tIiwianRpIjoiZjQyZWNiNDUtN2I2OS00M2I3LTgwZmQtYzI0YWRmZTVlMzM0IiwiSWRFY3QiOiJjZDEwMjNmNy05N2QzLTQyN2UtYWU1OC1lZjA3NDA2YTdlZTUiLCJlbWFpbCI6ImRvcmRvZ25lQGVsbG9oYS5jb20iLCJleHAiOjE1MDk3MDQ1OTAsImlzcyI6Imh0dHA6Ly9lbGxvaGEuY29tIiwiYXVkIjoiaHR0cDovL2VsbG9oYS5jb20ifQ._Jb3Fxj74xtgdT-_RM3tMIooB0y8ytgcE9orsSpn3oA",
"expiration": "2017-11-03T10:23:10Z"
}
Codes sources
Ci-dessous figurent plusieurs exemples de codes sources permettant de gérer la partie authentification, ces différents exemples étant basés sur les langages de programmation les plus utilisés :
Copier
var data = JSON.stringify({
"Email": "moncompte@elloha.com",
"Password": "abcdef123!"
});
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === 4) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://api.elloha.com/auth/token");
xhr.setRequestHeader("content-type", "application/json");
xhr.setRequestHeader("accept", "application/json");
xhr.send(data);
Copier
var settings = {
"async": true,
"crossDomain": true,
"url": "https://api.elloha.com/auth/token",
"method": "POST",
"headers": {
"content-type": "application/json",
"accept": "application/json"
},
"processData": false,
"data": "{\"Email\": \"moncompte@elloha.com\",\"Password\": \"abcdef123!\"}"
}
$.ajax(settings).done(function (response) {
console.log(response);
});
Copier
setUrl('https://api.elloha.com/auth/token');
$request->setMethod(HTTP_METH_POST);
$request->setHeaders(array(
'accept' => 'application/json',
'content-type' => 'application/json'
));
$request->setBody('{
"Email": "moncompte@elloha.com",
"Password": "abcdef123!"
}');
try {
$response = $request->send();
echo $response->getBody();
} catch (HttpException $ex) {
echo $ex;
}
?>
Copier
import requests
url = "https://api.elloha.com/auth/token"
payload = "{\"Email\": \"moncompte@elloha.com\",\"Password\": \"abcdef123!\"}"
headers = {
'content-type': "application/json",
'accept': "application/json"
}
response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
Copier
require 'uri'
require 'net/http'
url = URI("https://api.elloha.com/auth/token")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new(url)
request["content-type"] = 'application/json'
request["accept"] = 'application/json
request.body = "{\"Email\": \"moncompte@elloha.com\",\"Password\": \"abcdef123!\"}"
response = http.request(request)
puts response.read_body
Copier
var client = new RestClient("https://api.elloha.com/auth/token");
var request = new RestRequest(Method.POST);
request.AddHeader("accept", "application/json");
request.AddHeader("content-type", "application/json");
request.AddParameter("application/json", "{\"Email\": \"moncompte@elloha.com\",\"Password\": \"abcdef123!\"}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Copier
import Foundation
let headers = [
"content-type": "application/json",
"accept": "application/json"
]
let parameters = [
"Email": "moncompte@elloha.com",
"Password": "abcdef123!"
] as [String : Any]
let postData = JSONSerialization.data(withJSONObject: parameters, options: [])
let request = NSMutableURLRequest(url: NSURL(string: "https://api.elloha.com/auth/token")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if (error != nil) {
print(error)
} else {
let httpResponse = response as? HTTPURLResponse
print(httpResponse)
}
})
dataTask.resume()
Copier
wget --quiet \
--method POST \
--header 'content-type: application/json' \
--header 'accept: application/json' \
--body-data '{\n "Email": "moncompte@elloha.com",\n "Password": "abcdef123!"\n}' \
--output-document \
- https://api.elloha.com/auth/token
Accès aux APIs
Généralités
Les APIs elloha de création et de modification des dossiers de vente sont accessibles via l'URL :
https://api.elloha.com/Bookings
L'URL ci-dessus doit être appelée avec la méthode GET pour la consultation de dossiers, et avec la méthode POST pour la création et la modification de dossiers.
Les APIs elloha d'annulation des dossiers de vente sont accessibles via l'URL :
https://api.elloha.com/Bookings/Cancel
L'URL ci-dessus doit être appelée avec la méthode POST pour l'annulation de dossiers.
Lors de chaque appel, les headers suivants doivent être appliqués :
Header | Obligatoire | Valeur |
---|---|---|
accept | oui | application/json |
authorization | oui | "Bearer " suivi de la valeur du jeton d'authentification (jeton obtenu via la procédure décrite dans la section précédente de ce document). Par exemple : Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ zdWIiOiJjaHJpc3RvcGhldkBlbGxvaGEuY 29tIiwianRpIjoiNWMwNTM2ZGYtMzcwZi0 0NDYwLTliMWQtYWU1MTFmYWMzN2UxIiwiS WRFY3QiOiIxYjczMDUwZC0xMWM0LTQ4MDc tODUxNC1jZjhhOTNmZjRkMmYiLCJlbWFpb CI6ImNocmlzdG9waGV2QGVsbG9oYS5jb20 iLCJleHAiOjE1MDY5NTc1NzUsImlzcyI6I mh0dHA6Ly9lbGxvaGEuY29tIiwiYXVkIjo iaHR0cDovL2VsbG9oYS5jb20ifQ.H6g6v0 Xy_KhxYOVAz6ZOpjfrFAqi-rDWP6IDH0W_MZ0 |
content-type | oui | application/json |
culture | oui | Code de la culture souhaitée : fr-FR pour le français, en-GB pour l'anglais, es-ES pour l'espagnol... (voir https://msdn.microsoft.com/en-us/library/ee825488(v=cs.20).aspx pour une liste complète des cultures) |
Codes sources
Ci-dessous figurent plusieurs exemples de codes sources permettant d'appeler l'API en méthode GET, selon les langages de programmation les plus utilisés :
Copier
var data = null;
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === 4) {
console.log(this.responseText);
}
});
xhr.open("GET", "https://api.elloha.com/Bookings");
xhr.setRequestHeader("content-type", "application/json");
xhr.setRequestHeader("accept", "application/json");
xhr.setRequestHeader("authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkb3Jkb2duZUBlbGxvaGEuY29tIiwianRpIjoiYzMyOTY3NDUtNDZhZS00YjRjLTg2Y2EtMzQ0ODI1ZTU3OWI5IiwiSWRFY3QiOiJjZDEwMjNmNy05N2QzLTQyN2UtYWU1OC1lZjA3NDA2YTdlZTUiLCJlbWFpbCI6ImRvcmRvZ25lQGVsbG9oYS5jb20iLCJleHAiOjE1MDk3MTE5NTUsImlzcyI6Imh0dHA6Ly9lbGxvaGEuY29tIiwiYXVkIjoiaHR0cDovL2VsbG9oYS5jb20ifQ.yCJO9IgTLVMASLDahH4QUIJKPe410tyAQktpC6SzWZQ");
xhr.send(data);
Copier
var settings = {
"async": true,
"crossDomain": true,
"url": "https://api.elloha.com/Bookings",
"method": "GET",
"headers": {
"content-type": "application/json",
"accept": "application/json",
"authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkb3Jkb2duZUBlbGxvaGEuY29tIiwianRpIjoiYzMyOTY3NDUtNDZhZS00YjRjLTg2Y2EtMzQ0ODI1ZTU3OWI5IiwiSWRFY3QiOiJjZDEwMjNmNy05N2QzLTQyN2UtYWU1OC1lZjA3NDA2YTdlZTUiLCJlbWFpbCI6ImRvcmRvZ25lQGVsbG9oYS5jb20iLCJleHAiOjE1MDk3MTE5NTUsImlzcyI6Imh0dHA6Ly9lbGxvaGEuY29tIiwiYXVkIjoiaHR0cDovL2VsbG9oYS5jb20ifQ.yCJO9IgTLVMASLDahH4QUIJKPe410tyAQktpC6SzWZQ"
}
}
$.ajax(settings).done(function (response) {
console.log(response);
});
Copier
setUrl('https://api.elloha.com/Bookings');
$request->setMethod(HTTP_METH_GET);
$request->setHeaders(array(
'authorization' => 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkb3Jkb2duZUBlbGxvaGEuY29tIiwianRpIjoiYzMyOTY3NDUtNDZhZS00YjRjLTg2Y2EtMzQ0ODI1ZTU3OWI5IiwiSWRFY3QiOiJjZDEwMjNmNy05N2QzLTQyN2UtYWU1OC1lZjA3NDA2YTdlZTUiLCJlbWFpbCI6ImRvcmRvZ25lQGVsbG9oYS5jb20iLCJleHAiOjE1MDk3MTE5NTUsImlzcyI6Imh0dHA6Ly9lbGxvaGEuY29tIiwiYXVkIjoiaHR0cDovL2VsbG9oYS5jb20ifQ.yCJO9IgTLVMASLDahH4QUIJKPe410tyAQktpC6SzWZQ',
'accept' => 'application/json',
'content-type' => 'application/json'
));
try {
$response = $request->send();
echo $response->getBody();
} catch (HttpException $ex) {
echo $ex;
}
?>
Copier
import http.client
conn = http.client.HTTPSConnection("api.elloha.com")
headers = {
'content-type': "application/json",
'accept': "application/json",
'authorization': "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkb3Jkb2duZUBlbGxvaGEuY29tIiwianRpIjoiYzMyOTY3NDUtNDZhZS00YjRjLTg2Y2EtMzQ0ODI1ZTU3OWI5IiwiSWRFY3QiOiJjZDEwMjNmNy05N2QzLTQyN2UtYWU1OC1lZjA3NDA2YTdlZTUiLCJlbWFpbCI6ImRvcmRvZ25lQGVsbG9oYS5jb20iLCJleHAiOjE1MDk3MTE5NTUsImlzcyI6Imh0dHA6Ly9lbGxvaGEuY29tIiwiYXVkIjoiaHR0cDovL2VsbG9oYS5jb20ifQ.yCJO9IgTLVMASLDahH4QUIJKPe410tyAQktpC6SzWZQ"
}
conn.request("GET", "/Bookings", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
Copier
require 'uri'
require 'net/http'
url = URI("https://api.elloha.com/Bookings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(url)
request["content-type"] = 'application/json'
request["accept"] = 'application/json'
request["authorization"] = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkb3Jkb2duZUBlbGxvaGEuY29tIiwianRpIjoiYzMyOTY3NDUtNDZhZS00YjRjLTg2Y2EtMzQ0ODI1ZTU3OWI5IiwiSWRFY3QiOiJjZDEwMjNmNy05N2QzLTQyN2UtYWU1OC1lZjA3NDA2YTdlZTUiLCJlbWFpbCI6ImRvcmRvZ25lQGVsbG9oYS5jb20iLCJleHAiOjE1MDk3MTE5NTUsImlzcyI6Imh0dHA6Ly9lbGxvaGEuY29tIiwiYXVkIjoiaHR0cDovL2VsbG9oYS5jb20ifQ.yCJO9IgTLVMASLDahH4QUIJKPe410tyAQktpC6SzWZQ'
response = http.request(request)
puts response.read_body
Copier
var client = new RestClient("https://api.elloha.com/Bookings");
var request = new RestRequest(Method.GET);
request.AddHeader("authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkb3Jkb2duZUBlbGxvaGEuY29tIiwianRpIjoiYzMyOTY3NDUtNDZhZS00YjRjLTg2Y2EtMzQ0ODI1ZTU3OWI5IiwiSWRFY3QiOiJjZDEwMjNmNy05N2QzLTQyN2UtYWU1OC1lZjA3NDA2YTdlZTUiLCJlbWFpbCI6ImRvcmRvZ25lQGVsbG9oYS5jb20iLCJleHAiOjE1MDk3MTE5NTUsImlzcyI6Imh0dHA6Ly9lbGxvaGEuY29tIiwiYXVkIjoiaHR0cDovL2VsbG9oYS5jb20ifQ.yCJO9IgTLVMASLDahH4QUIJKPe410tyAQktpC6SzWZQ");
request.AddHeader("accept", "application/json");
request.AddHeader("content-type", "application/json");
IRestResponse response = client.Execute(request);
Copier
import Foundation
let headers = [
"content-type": "application/json",
"accept": "application/json",
"authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkb3Jkb2duZUBlbGxvaGEuY29tIiwianRpIjoiYzMyOTY3NDUtNDZhZS00YjRjLTg2Y2EtMzQ0ODI1ZTU3OWI5IiwiSWRFY3QiOiJjZDEwMjNmNy05N2QzLTQyN2UtYWU1OC1lZjA3NDA2YTdlZTUiLCJlbWFpbCI6ImRvcmRvZ25lQGVsbG9oYS5jb20iLCJleHAiOjE1MDk3MTE5NTUsImlzcyI6Imh0dHA6Ly9lbGxvaGEuY29tIiwiYXVkIjoiaHR0cDovL2VsbG9oYS5jb20ifQ.yCJO9IgTLVMASLDahH4QUIJKPe410tyAQktpC6SzWZQ"
]
let request = NSMutableURLRequest(url: NSURL(string: "https://api.elloha.com/Bookings")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if (error != nil) {
print(error)
} else {
let httpResponse = response as? HTTPURLResponse
print(httpResponse)
}
})
dataTask.resume()
Copier
wget --quiet \
--method GET \
--header 'content-type: application/json' \
--header 'accept: application/json' \
--header 'authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkb3Jkb2duZUBlbGxvaGEuY29tIiwianRpIjoiYzMyOTY3NDUtNDZhZS00YjRjLTg2Y2EtMzQ0ODI1ZTU3OWI5IiwiSWRFY3QiOiJjZDEwMjNmNy05N2QzLTQyN2UtYWU1OC1lZjA3NDA2YTdlZTUiLCJlbWFpbCI6ImRvcmRvZ25lQGVsbG9oYS5jb20iLCJleHAiOjE1MDk3MTE5NTUsImlzcyI6Imh0dHA6Ly9lbGxvaGEuY29tIiwiYXVkIjoiaHR0cDovL2VsbG9oYS5jb20ifQ.yCJO9IgTLVMASLDahH4QUIJKPe410tyAQktpC6SzWZQ' \
--output-document \
- https://api.elloha.com/Bookings
Consultation de dossiers
Généralités
La consultation des dossiers de vente s'effectue via un appel à l'API https://api.elloha.com/Bookings avec la méthode GET.
C'est ainsi le jeton passé à l'API, généré à partir de votre compte de connexion (voir section Accès aux APIs), qui permet de déterminer le canal de distribution depuis lequel récupérer la liste des dossiers de vente. Cette liste est alors présentée sous la forme d'un tableau au format JSON dont les propriétés sont décrites ci-dessous (voir section Description des dossiers de vente).
Filtrage des dossiers de vente
Par défaut, les dossiers de ventes remontés sont les dossiers de vente créés lors des dernières 24h. Il est cependant possible d'ajuster la période de récupération des dossiers selon leur date de création via l'ajout de headers spécifiques lors de l'appel à l'API.
Les headers suivants peuvent ainsi être utilisés :
Header | Type | Description | Exemple |
---|---|---|---|
StartDate | date | Date de début de la période de récupération des dossiers de vente, selon leur date de modification (ou de création si le dossier vient d'être créé). | 2018-03-12 |
EndDate | date | Date de fin de la période de récupération des dossiers de vente, selon leur date de modification (ou de création si le dossier vient d'être créé). | 2018-03-14 |
ArrivalStartDate | date | Date de début de la période de récupération des dossiers de vente, selon leur date début de séjour. | 2018-05-12 |
ArrivalEndDate | date | Date de fin de la période de récupération des dossiers de vente, selon leur date début de séjour. | 2018-05-14 |
ReturnCancelledReservations | bool | Indicateur précisant si les réservations annulées sont retournées (par défaut, elles sont absentes des résultats). | true |
IdBookingEngine | guid | Identifiant du moteur de réservation utilisé. | "6060c648-2f41-4557-bc07-2f1b8a04cd8b" |
BookingNumber | varchar(20) | Identifiant du numéro de dossier. | P2403173279 |
Version | int | Version qui détermine combien d'éléments doivent être retournés. | 2 |
Note : Dans sa version initiale, un seul élément est retourné même lorsque le dossier nouvellement créé présente plusieurs lignes de dossier. Il faut ajouter l'header "version" avec la valeur 2 pour obtenir une liste d'éléments.
Description des dossiers de vente
Les dossiers de vente sont remontés de manière simplifiée, dans le flux JSON, pour un canal de distribution donné. Ainsi, les propriétés retournées sont les suivantes :
Propriété | Type | Description | Exemple |
---|---|---|---|
BookingNumber | string | Numéro du dossier de vente. | "BookingNumber": "B1803130396" |
IdBookingEngine | guid | Identifiant du moteur de réservation utilisé. | "IdBookingEngine": "3ffd98fd-64b1-4737-840c-d81afadbe5fb" |
ExternalBookingNumber | string | Numéro du dossier de vente chez le distributeur, dans le cas d'un distributeur externe, type Booking.com. | "ExternalBookingNumber": "3429320258" |
CreationDate | datetime | Date de création de la réservation. | "CreationDate": "2018-03-13 15:26:00" |
ModificationDate | datetime | Date de modifcation de la réservation. | "ModificationDate": "2018-03-15 14:17:00" |
ChannelName | string | Nom du canal de vente sur lequel la réservation a été réalisée. | "ChannelName": "Booking.com" |
IdProduct | guid | Identifiant du produit réservé. | "IdProduct": "6ed763fe-8924-42e3-950e-bfe410f12678" |
ProductName | string | Nom du produit réservé. | "ProductName": "Les Perluètes" |
City | string | Commune à laquelle appartient le produit réservé. | "City": "CARENNAC" |
ZipCode | string | Code postal de la commune à laquelle appartient le produit réservé. | "ZipCode": "46110" |
IdReservationItem | guid | Identifiant de la ligne de dossier correspondant à une des prestations réservées. | "IdReservationItem": "208d8459-015a-44b9-ac6e-1e56606d0854" |
IdOffer | guid | Identifiant de la prestation réservée. | "IdOffer": "a98730f8-5a2a-446c-9a71-1006b3e2c151" |
OfferName | string | Nom de la prestation réservée. | "OfferName": "Les Perluètes 1" |
IdFormula | guid | Identifiant de la formule réservée en cas de réservation d'activité. | "IdFormula": "c01c2fc7-6bf4-4e1c-942d-788aa2349f12" |
FormulaName | string | Nom de la formule réservée en cas de réservation d'activité. | "FormulaName": "Location de vélo 2h" |
IsOption | bool | Indicateur précisant si la prestation réservée est une option. | "IsOption": true |
Amount | decimal | Montant de la prestation réservée. | "Amount": 50.5 |
ArrivalDate | date | Date d'arrivée. | "ArrivalDate": "2018-03-14" |
Hour | string | Heure d'arrivée. | "Hour": "09:00" |
DepartureDate | date | Date de départ. A noter que cette date n'est pas renseignée dans le cadre d'une activité. | "DepartureDate": "2018-03-15" |
PersonNumber | int | Nombre de personnes demandé dans le cadre de la réservation. | "PersonNumber": 2 |
Quantity | int | Quantité de prestations réservées. | "Quantity": 1 |
ReservationState | string | État de la réservation. Valeurs possible : Ongoing, Reserved, Option et Undetermined. | "ReservationState": "Reserved" |
LineReservationState | string | État de la ligne de réservation correspondant à une des prestations réservées. Valeurs possible : Ongoing, Reserved, ReservedNotPaid, Withdrawn, Consumed et Undetermined. | "LineReservationState": "ReservedNotPaid" |
CustomerLastName | string | Nom de famille du client ayant réservé. | "CustomerLastName": "DOE" |
CustomerFirstName | string | Prénom du client ayant réservé. | "CustomerFirstName": "John" |
CustomerCity | string | Commune du client ayant réservé. | "CustomerCity": "PERPIGNAN" |
CustomerZipCode | string | Code postal de la commune du client ayant réservé. | "CustomerZipCode": "66000" |
CustomerCountry | string | Nom du pays du client ayant réservé. | "CustomerCountry": "FRANCE" |
CustomerEmail | string | Adresse E-mail du client ayant réservé. | "CustomerEmail": "test@elloha.com" |
CustomerPhone | string | Numéro de téléphone du client ayant réservé. | "CustomerPhone": "+33607080910" |
CustomerHasOptIn | bool | Le client consent à recevoir des communications du prestataire. | "CustomerHasOptIn": true |
CustomerHasNetworkOptIn | bool | Le client consent à recevoir des communications du réseau du prestataire. | "CustomerHasNetworkOptIn": false |
CustomerComment | string | Texte indiquant les remarques du client associées au dossier de vente. | "CustomerComment": "Nous arriverons en vélo , avez vous un garage sécurisé pour 2 vélos? Merci" |
InternalComment | string | Texte indiquant les remarques internes associées au dossier de vente. | "InternalComment": "Prévoir repas vegan" |
VoucherUrl | string | URL du document de confirmation de la réservation. Renseigné uniquement lorsque le dossier à l'état Reserved. | "VoucherUrl": "https://reservation.elloha.com/Pdf/Voucher/80E4B54B-4121-46FF-9B75-D0A68CA90CF9 ?Culture=fr-FR&idReservation=DA507286-47BF-4019-BCB9-FFE6806AF9AD" |
PaymentUrl | string | URL de paiement pour confirmer le dossier. Renseigné uniquement lorsque le dossier à l'état Ongoing. Lors de la redirection du client, vous pouvez y ajouter les paramètres suivant : - returnUrl : Remplace l’url du bouton de retour de la page de paiement; - confirmUrl : Remplace l’url de la page final de confirmation de la réservation. |
"PaymentUrl": "https://reservation.elloha.com/PaymentOnline/ShowVadPaymentForm/ahPAsmaiecias0UXGEiFVA%3D%3D ?idPublication=DA507286-47BF-4019-BCB9-FFE6806AF9AD" |
Participants | array | Liste des participants associés à la ligne de dossier. Peut contenir des propriétés supplémentaire selon l'origine du dossier. | "Participants": [ "IdParticipant": "2af44e49-4eee-4c75-948f-f2f44afb9526", "FirstName": "Jean" "LastName": "Dupont" "Age": 20 "ParticipantType": 1, ] |
Participants.IdParticipant | guid | Identifiant du participant. | "IdParticipant": "2af44e49-4eee-4c75-948f-f2f44afb9526" |
Participants.FirstName | string | Prénom du participant. | "FirstName": "Jean" |
Participants.LastName | string | Nom du participant. | "LastName": "Dupont" |
Participants.Age | int | Age du participant. | "Age": 20 |
Participants.Type | int | Type du participant. 1: Adult, 2: Enfant, 3: Bébé | "Type": 1 |
Participants.barcode | string | Code-barre à scanner dans le cadre d'une activité. Généré par un prestataire externe. | "barcode": "33785295-6212039" |
Participants.QrCode | string | QrCode à scanner dans le cadre d'une activité. Généré par elloha. | "QrCode": "lmLc0wsVaoGc…lH_XKbRk-" |
Participants.SeatNumber | string | Information d'emplacement. Généré par un prestataire externe. | "SeatNumber": "Rang C, place 45" |
Exemple de transaction de récupération des dossiers de vente
Copier
[
{
"BookingNumber": "B1803130396",
"ExternalBookingNumber": "3429320258",
"CreationDate": "2018-03-13 15:26:00",
"ModificationDate": "2018-03-15 14:17:00",
"ChannelName": "Booking.com",
"IdProduct": "6ed763fe-8924-42e3-950e-bfe410f12678",
"ProductName": "Les Perluètes",
"City": "CARENNAC",
"ZipCode": "46110",
"IdOffer": "a98730f8-5a2a-446c-9a71-1006b3e2c151",
"OfferName": "Les Perluètes 1",
"IsOption": false,
"Amount": 56,
"ArrivalDate": "2018-03-14",
"DepartureDate": "2018-03-15",
"PersonNumber": 2,
"Quantity": 1,
"ReservationState": "Reserved",
"LineReservationState": "ReservedNotPaid",
"CustomerLastName": "DOE",
"CustomerFirstName": "John",
"CustomerCity": "PERPIGNAN",
"CustomerZipCode": "66000",
"CustomerCountry": "FRANCE",
"CustomerEmail": "test@elloha.com",
"CustomerPhone": "+33607080910",
"CustomerHasOptIn": false,
"CustomerHasNetworkOptIn": true,
"CustomerComment": "Nous arriverons en vélo , avez vous un garage sécurisé pour 2 vélos? Merci",
"InternalComment": "Prévoir repas vegan"
"VoucherUrl": "https://reservation.elloha.com/Pdf/Voucher/80E4B54B-4121-46FF-9B75-D0A68CA90CF9?Culture=fr-FR&idReservation=DA507286-47BF-4019-BCB9-FFE6806AF9AD"
},
{
"BookingNumber": "B1803130437",
"CreationDate": "2018-03-13 16:18:15",
"ModificationDate": "2018-03-13 16:18:15",
"ChannelName": "Dordogne",
"IdProduct": "ffa169e8-6430-43fe-907e-7f0686b94d50",
"ProductName": "Location de vélo La Bruyle",
"City": "ST MICHEL DE BANNIERES",
"ZipCode": "46110",
"IdOffer": "1a4234ea-1a3a-4a94-89d2-1b0868b2a927",
"OfferName": "Location adulte",
"IdFormula": "c01c2fc7-6bf4-4e1c-942d-788aa2349f12",
"FormulaName": "Location de vélo 2h",
"IsOption": false,
"Amount": 40.6,
"ArrivalDate": "2018-03-15",
"Hour": "09:00",
"PersonNumber": 2,
"Quantity": 1,
"ReservationState": "Reserved",
"LineReservationState": "ReservedNotPaid",
"CustomerLastName": "DUPONT",
"CustomerFirstName": "Marc",
"CustomerCity": "PARIS",
"CustomerZipCode": "75007",
"CustomerCountry": "FRANCE",
"CustomerEmail": "dupont@elloha.com",
"CustomerPhone": "+33606060606",
"CustomerHasOptIn": false,
"CustomerHasNetworkOptIn": true,
"CustomerComment": "Nous arriverons en vélo , avez vous un garage sécurisé pour 2 vélos? Merci",
"InternalComment": "Prévoir repas vegan"
"VoucherUrl": "https://reservation.elloha.com/Pdf/Voucher/80E4B54B-4121-46FF-9B75-D0A68CA90CF9?Culture=fr-FR&idReservation=DA507286-47BF-4019-BCB9-FFE6806AF9AD"
}
]
Création de dossiers
Généralités
La création des dossiers de vente s'effectue via un appel à l'API https://api.elloha.com/Bookings avec la méthode POST.
C'est ainsi le jeton passé à l'API, généré à partir de votre compte de connexion (voir section Accès aux APIs), qui permet de déterminer le canal de distribution sur lequel créer le nouveau dossier de vente.
Description du dossier à créer
La transaction de création d'un dossier de vente se présente sous la forme d'un flux JSON identique à celui retourné par l'API de consultation des dossiers de vente (voir section GetDescription), au détail près que :
- Cette transaction ne doit décrire qu'un seul et unique dossier de vente.
- Certaines propriétés présentes dans le flux de consultation, et qui sont à vocation uniquement descriptive, n'ont pas besoin d'être renseignées dans le cas d'une création de dossier de vente.
Les propriétés à renseigner au sein de la transaction de création d'un dossier de vente sont ainsi décrites dans les tableaux ci-dessous.
Liste des propriétés relatives au dossier de vente
Propriété | Type | Obligatoire | Description | Exemple |
---|---|---|---|---|
IdBookingEngine | guid | oui | Identifiant du moteur de réservation appelé. Cet identifiant vous sera fourni par le support elloha à votre demande. C'est une propriété obligatoire afin de pouvoir créer ou modifier un dossier de vente. | "IdBookingEngine": "6060c648-2f41-4557-bc07-2f1b8a04cd8b" |
CustomerLastName | string | non | Nom de famille du client à l'origine de la réservation. | "CustomerLastName": "DOE" |
CustomerFirstName | string | non | Prénom du client à l'origine de la réservation. | "CustomerFirstName": "John" |
CustomerAddress | string | non | Adresse postale du client à l'origine de la réservation. | "CustomerAddress": "rue des test" |
CustomerZipCode | string | non | Code postal de la commune du client à l'origine de la réservation. | "CustomerZipCode": "66000" |
CustomerCity | string | non | Nom de la commune du client à l'origine de la réservation. | "CustomerCity": "PERPIGNAN" |
CustomerCountry | string | non | Nom ou code ISO du pays du client à l'origine de la réservation. | "CustomerCountry": "FRANCE" |
CustomerEmail | string | non | Adresse E-mail du client à l'origine de la réservation. | "CustomerEmail": "test@elloha.com" |
CustomerPhone | string | non | Numéro de téléphone, fixe ou mobile, du client à l'origine de la réservation. | "CustomerPhone": "+33628810706" |
CustomerAcceptNewsletter | bool | non | Indicateur précisant si le client à l'origine de la réservation accepte ou non de recevoir des newsletters de votre part. | "CustomerAcceptNewsletter": false |
CustomerHasOptIn | bool | non | Indicateur précisant si le client client consent à recevoir des communications du prestataire. | "CustomerHasOptIn": true |
CustomerHasNetworkOptIn | bool | non | Indicateur précisant si le client consent à recevoir des communications du réseau du prestataire. | "CustomerHasNetworkOptIn": false |
Remarks | string | non | Texte indiquant aussi bien les remarques du client que vos propres remarques associées au dossier de vente. | "Remarks": "Souhaite une place de parking." |
ReservationState | string | non | État demandé de la réservation à la fin de la requête. Valeur possible : Ongoing, Reserved. Par défaut, la valeur est Reserved. Si Ongoing, la réservation devra être finalisé par le client, la page de paiement sera indiqué dans la propriété PaymentUrl. |
"ReservationState": "Ongoing" |
Liste des propriétés relatives aux lignes de dossier
Propriété | Type | Obligatoire | Description | Exemple |
---|---|---|---|---|
ReservationItems | oui | Liste des lignes de dossier composant le dossier de vente. Chaque ligne de dossier représente la réservation d'une prestation donnée avec les propriétés associées : définition des éléments réservés, montant, dates de séjour, occupation, paiements. | ||
ReservationItems/IdProduct | string | oui | Identifiant du produit réservé. Il peut s'agit soit d'un identifiant elloha (sous la forme d'un guid) soit d'un identifiant externe tel qu'il a été transmis par le fournisseur externe du produit. | "IdProduct": "G001TEST" |
ReservationItems/IdOffer | string | non | Identifiant de la prestation réservée. De même que pour le produit, il peut s'agit soit d'un identifiant elloha (sous la forme d'un guid) soit d'un identifiant externe tel qu'il a été transmis par le fournisseur externe du produit. | "IdOffer": "1234" |
ReservationItems/IdFormula | guid | non | Identifiant de la formule réservée. Celui-ci est toujours sous la forme d'un guid car il s'agit d'un identifiant propre à elloha. Cette propriété ne sera renseignée qu'en cas de réservation d'activité. | "IdFormula": "c01c2fc7-6bf4-4e1c-942d-788aa2349f12" |
ReservationItems/IdRate | guid | non | Identifiant du tarif réservé. Celui-ci est toujours sous la forme d'un guid car il s'agit d'un identifiant propre à elloha. | "IdRate": "00c10f45-42b6-4b4f-887d-6391a1cf8654" |
ReservationItems/Amount | decimal | non | Montant de la réservation associée à la ligne de dossier. Ce montant doit obligatoirement être défini dans la devise paramétrée au niveau du compte elloha du produit (il s'agira normalement de la devise associée au pays d'appartenance du produit). La présence d'un montant est obligatoire dans le cadre de la réservation d'un hébergement ou d'une activité, il est en revanche facultatif dans le cadre d'une réservation d'un restaurant ou d'un service (étant donné que cela correspond à de la prise de rendez-vous). |
"Amount": 360.0 |
ReservationItems/StartDate | date | oui | Date de début de séjour au format yyyy-mm-dd. | "StartDate": "2017-11-25" |
ReservationItems/EndDate | date | non | Date de fin de séjour au format yyyy-mm-dd. Si cette date n'est pas renseignée, alors c'est la date du lendemain du début du séjour qui est positionnée. A noter que cette propriété ne doit pas être renseignée lors d'une réservation d'activité. |
"EndDate": "2017-12-012" |
ReservationItems/Hour | string | non | Heure d'arrivée. | "Hour": "09:00" |
ReservationItems/Quantity | int | non | Quantité de la ligne de dossier. | "Quantity": 2 |
Liste des propriétés relatives à la définition de l'occupation
Il existe 2 modes de définition de l'occupation pour une ligne de dossier donnée :
- Le mode simple qui consiste à définir directement au niveau de chaque ligne de dossier : le nombre d'adultes, le nombre d'enfants ainsi que la liste des âges pour les enfants.
- Le mode avancé qui consiste à décrire chaque participant de manière indépendante, dans une liste de blocs dédiée.
Mode simple :
Propriété | Type | Obligatoire | Description | Exemple |
---|---|---|---|---|
ReservationItems/AdultNumber | int | non | Nombre d'adultes pour la ligne de dossier. | "AdultNumber": 1 |
ReservationItems/ChildNumber | int | non | Nombre d'enfants pour la ligne de dossier. | "ChildNumber": 2 |
ReservationItems/ChildAges | array[int] | non | Liste des âges des enfants, chaque âge étant compris entre 0 et 17 ans. | "ChildAges": [5, 12] |
Mode avancé :
Propriété | Type | Obligatoire | Description | Exemple |
---|---|---|---|---|
ReservationItems/Travellers | non | Liste des participants à la prestation décrite par la ligne de dossier, chaque participant étant décrit de manière détaillée. | ||
ReservationItems/Travellers/Type | int | non | Code du type du participant : 1 pour préciser qu'il s'agit d'un adulte, 2 pour préciser qu'il s'agit d'un enfant. | "Type": 2 |
ReservationItems/Travellers/LastName | string | non | Nom de famille du participant. | "LastName": "DOE" |
ReservationItems/Travellers/FirstName | string | non | Prénom du participant. | "FirstName": "John" |
ReservationItems/Travellers/Age | int | non | Age du participant, compris entre 0 et 17 ans. | "Age": 5 |
Liste des propriétés relatives aux lignes de paiement
Propriété | Type | Obligatoire | Description | Exemple |
---|---|---|---|---|
ReservationItems/Payments | non | Liste des paiements réalisés dans le cadre de la ligne de dossier, chaque paiement étant représenté par un montant et par un moyen de paiement. | ||
ReservationItems/Payments/Amount | decimal | oui | Montant du paiement. | "Amount": 40.0 |
ReservationItems/Payments/IdPaymentMethod | guid | oui | Identifiant du type de moyen de paiement utilisé. Les identifiants disponibles sont les suivants :
|
"IdPaymentMethod": "a0c67e59-c66d-462b-8dd9-70144e2d05fa" |
En cas de création effectuée avec succès, le flux JSON complet du dossier de vente après enregistrement est retourné (voir section GetDescription). Il sera notamment possible d'y récupérer l'identifiant du dossier nouvellement créé, son numéro unique, ainsi que les identifiants de l'ensemble de ses sous-éléments (lignes de dossier, paiements ou participants).
Note : Dans sa version initiale, un seul élément est retourné même lorsque le dossier nouvellement créé présente plusieurs lignes de dossier. Il faut ajouter l'header "version" avec la valeur 2 pour obtenir une liste d'éléments.
Exemple de transaction de création de dossier avec occupation définie en mode simple
Copier
{
"IdBookingEngine": "6060c648-2f41-4557-bc07-2f1b8a04cd8b",
"CustomerLastName": "DOE",
"CustomerFirstName": "John",
"CustomerAddress": "rue des test",
"CustomerZipCode": "66000",
"CustomerCity": "PERPIGNAN",
"CustomerCountry": "FRANCE",
"CustomerEmail": "test@elloha.com",
"CustomerPhone": "+33628810706",
"CustomerAcceptNewsletter": false,
"CustomerHasOptIn": false,
"CustomerHasNetworkOptIn": true,
"Remarks": "Souhaite une place de parking.",
"ReservationItems": [
{
"IdProduct": "G001TEST",
"IdOffer": "1234",
"Amount": 360.0,
"StartDate": "2017-11-25",
"EndDate": "2017-12-02",
"AdultNumber": 1,
"ChildNumber": 2,
"ChildAges": [5, 12],
"Payments": [
{
"Amount": 40.0,
"IdPaymentMethod": "c36854ab-2061-4f1c-8b3e-840d30a824b1"
},
{
"Amount": 160.0,
"IdPaymentMethod": "adf1474b-a7db-4f9c-b426-5db17cc308eb"
},
{
"Amount": 20.0,
"IdPaymentMethod": "a0c67e59-c66d-462b-8dd9-70144e2d05fa"
}
]
},
{
"IdProduct": "G001TEST",
"IdOffer": "3210",
"Amount": 120.0,
"StartDate": "2017-11-25",
"EndDate": "2017-12-02",
"AdultNumber": 2,
"Payments": [
{
"Amount": 120.0,
"IdPaymentMethod": "a0c67e59-c66d-462b-8dd9-70144e2d05fa"
}
]
}
]
}
Exemple de transaction de création de dossier avec occupation définie en mode avancé
Copier
{
"IdBookingEngine": "6060c648-2f41-4557-bc07-2f1b8a04cd8b",
"CustomerLastName": "DOE",
"CustomerFirstName": "John",
"CustomerAddress": "rue des test",
"CustomerZipCode": "66000",
"CustomerCity": "PERPIGNAN",
"CustomerCountry": "FRANCE",
"CustomerEmail": "test@elloha.com",
"CustomerPhone": "+33628810706",
"CustomerAcceptNewsletter": false,
"CustomerHasOptIn": false,
"CustomerHasNetworkOptIn": true,
"Remarks": "Souhaite une place de parking.",
"ReservationItems": [
{
"IdProduct": "9e2ebe36-35ce-4bd5-86dd-45f023561174",
"IdOffer": "324028c0-92e0-42f3-b964-aa276272d9db",
"IdFormula": "c01c2fc7-6bf4-4e1c-942d-788aa2349f12b",
"IdRate": "a70a144d-add2-43d9-8a5d-b09b52edd76c",
"Amount": 120.0,
"StartDate": "2017-11-25",
"EndDate": "2017-12-02",
"Hour": "16:00",
"Travellers": [
{
"Type": 1,
"LastName": "DOE",
"FirstName": "John"
},
{
"Type": 2,
"LastName": "TEST",
"FirstName": "Frank",
"Age": 5
}
],
"Payments": [
{
"Amount": 120.0,
"IdPaymentMethod": "a0c67e59-c66d-462b-8dd9-70144e2d05fa"
}
]
}
]
}
Modification de dossiers
La modification d'un dossier de vente fonctionne exactement sur le même principe que la création d'un dossier de vente : l'API ainsi que la transaction JSON à transmettre via la méthode POST sont identiques.
La seule différence, qui permet de détecter qu'il s'agit ou non d'une modification d'un dossier, est la présence de la propriété ci-dessous au niveau de la description du dossier de vente :
- BookingNumber, sous la forme d'une chaîne de caractères, qui correspond à l'identifiant du dossier de vente.
Par exemple : "BookingNumber": "TP1608240001"
Si jamais la valeur de cette propriété n'est pas retrouvée dans la base de données des dossiers de vente, alors une erreur de type NonExistentReservationError est générée (voir section Erreurs) et aucun traitement n'est effectué. De même, d'autres types d'erreurs pouvant empêcher la modification peuvent survenir, par exemple en cas de demande de changement de dates de séjour avec des nouvelles dates de séjour ne présentant pas de disponibilité. Comme dans le cas d'une création de dossier, les cas d'erreurs peuvent être divers et variés, et il convient de bien analyser les retours de l'API en cas d'erreur.
De même, les identifiants des sous-éléments sont nécessaires lorsque ces sous-éléments sont considérés comme déjà créés en base de données :
- La propriété IdReservationItem, sous la forme d'un guid, doit être renseignée au niveau de chaque ligne de dossier préalablement existante.
Par exemple : "IdReservationItem": "4ce15fd2-b842-46dd-8602-adeb814b7fea" - La propriété IdPayment, sous la forme d'un guid, doit être renseignée au niveau de chaque ligne de paiement préalablement existante.
Par exemple : "IdPayment": "b48aa4de-9b34-489b-a10e-3d2e6194491f" - La propriété IdTraveller, sous la forme d'un guid, doit être renseignée au niveau de chaque participant préalablement existant.
Par exemple : "IdTraveller": "3cec5395-cbb7-42c9-9b77-775484ed43d6"
Ainsi, tout sous-élément ne possédant pas d'identifiant, ou dont l'identifiant ne figure pas dans le dossier de vente enregistré, est considéré comme nouveau et est ainsi créé et ajouté au dossier de vente.
En cas de modification effectuée avec succès, le flux JSON complet du dossier de vente après enregistrement est retourné (voir section GetDescription). Il sera notamment possible d'y récupérer les identifiants de l'ensemble des sous-éléments créés (lignes de dossier, paiements ou participants).
Note :
Dans le cas des dossiers issus d’un connecteur, un paramètre supplémentaire peut être utilisé :
- ModifyLocalBooking (bool) : Si valorisé à
true
, ce paramètre permet de limiter la modification au dossier local, sans affecter le système source du connecteur. Cela signifie que les modifications sont appliquées uniquement au niveau de la base de données locale.
Par exemple : "ModifyLocalBooking": true
Si ce paramètre est omis ou valorisé à false
, le comportement par défaut s’applique, et les modifications sont propagées au système source du connecteur.
Annulation de dossiers
L'annulation des dossiers de vente s'effectue via un appel à l'API https://api.elloha.com/Bookings/Cancel avec la méthode POST.
Le json a transmettre est une version très simplifiée de celui utilisé pour la modification d'une réservation. Le dossier de vente à annuler est identifié via la propriété ci-dessous :
- BookingNumber, sous la forme d'une chaîne de caractères, qui correspond à l'identifiant du dossier de vente.
Par exemple : "BookingNumber": "TP1608240001"
Description du dossier à annuler
La transaction d'annulation d'un dossier de vente se présente sous la forme d'un flux JSON. Il est à noter que :
- Cette transaction ne doit décrire qu'un seul et unique dossier de vente.
- Il est possible d'annuler un dossier dans sa totalité, ou uniquement certaines prestations d'un même dossier de vente.
Les propriétés à renseigner au sein de la transaction d'annulation d'un dossier de vente sont ainsi décrites dans les tableaux ci-dessous.
Liste des propriétés relatives au dossier de vente
Propriété | Type | Obligatoire | Description | Exemple |
---|---|---|---|---|
BookingNumber | string | oui | Indentifiant du dossier de vente à annuler | "BookingNumber": "B1803130396." |
Liste des propriétés relatives aux lignes de dossier
Propriété | Type | Obligatoire | Description | Exemple |
---|---|---|---|---|
ReservationItems | non | Liste des identifiants des lignes de dossier à annuler. Chaque identifiant correspond à ligne de dossier et représente la réservation d'une prestation donnée. | ||
ReservationItems/IdReservationItem | string | non | Identifiant de la ligne de dossier à annuler, sous forme de Guid. | "IdReservationItem": "2A77D865-C44F-4344-81B3-DF9455B2B4E5" |
Si jamais la valeur présente dans la propriété BookingNumber n'est pas retrouvée dans la base de données des dossiers de vente, alors une erreur de type NonExistentReservationError est générée (voir section Erreurs) et aucun traitement n'est effectué.
De même, seules les valeurs de ReservationItems/IdReservationItem qui existent en base de données seront traitées.
Exemple de transaction d'annulation complète d'un dossier de vente
Copier
{
"BookingNumber": "B2004220310"
}
Réponse à la transaction précédente, en cas de succès
Copier
{
"BookingNumber": "B2004220310",
"State": "Cancelled"
}
Exemple de transaction d'annulation de certaines prestations d'un dossier de vente
Copier
{
"BookingNumber": "B2004240159",
"ReservationItems": [
{
"IdReservationItem": "1511FC3F-F2A8-4D9F-8E4F-741E99E403F5"
}
]
}
Réponse à la transaction précédente, en cas de succès
Copier
{
"BookingNumber": "B2004240159",
"ReservationItems": [
{
"IdReservationItem": "1511fc3f-f2a8-4d9f-8e4f-741e99e403f5",
"State": "Cancelled"
}
]
}
Erreurs
En cas d'erreur d'authentification, à cause d'un jeton absent, incorrect ou expiré, une erreur 401 (Unauthorized) est toujours retournée par l'API, sans aucune information supplémentaire.
Si l'authentification est valide, mais que l'appel à l'API se déroule de manière incorrecte, alors une transaction de réponse contenant une erreur est retournée. L'erreur en question est matérialisée par un code et une description.
La transaction d'erreur respecte ainsi le format suivant :
Propriété | Type | Description | Exemple |
---|---|---|---|
ErrorCode | string | Code de l'erreur. | "ErrorCode": "TransactionExecutionError" |
ErrorDescription | string | Description textuelle de l'erreur, dans la langue demandée si cela est possible. | "ErrorDescription": "Erreur d'exécution de la transaction" |
Exemple de transaction d'erreur
Copier
{
"ErrorCode": "SavingReservationError",
"ErrorDescription": "Erreur lors de la sauvegarde du dossier."
}
Les principaux codes d'erreurs sont les suivants :
Code | Description |
---|---|
DeserializationError | Erreur lors de la désérialisation de la transaction contenant le dossier à créer ou à modifier. Cela signifie que le JSON envoyé à l'API n'est pas correctement formé. |
LoadingReservationError | Erreur lors du chargement du dossier de vente à créer ou à modifier. |
SavingReservationError | Erreur lors de la sauvegarde du dossier de vente à créer ou à modifier. |
NonExistentReservationError | Erreur survenant lorsque le dossier à modifier n'existe pas dans elloha. |
Unknown | Erreur d'origine inconnue. |
Si les erreurs ne sont pas identifiables de votre côté, après analyse détaillée de votre part, alors il conviendra de contacter le support elloha, à l'adresse support@elloha.com, en nous fournissant la transaction de consultation/création/modification de dossier impliquée, ainsi que la transaction de réponse contenant l'erreur obtenue.