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
Email 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 :
  • a0c67e59-c66d-462b-8dd9-70144e2d05fa pour préciser un paiement par carte bancaire.
  • adf1474b-a7db-4f9c-b426-5db17cc308eb pour préciser un paiement par chèque.
  • c36854ab-2061-4f1c-8b3e-840d30a824b1 pour préciser un paiement par chèques vacances.
  • af3b6c20-02ff-4363-968c-bf0ac45b846a pour préciser un paiement par espèces.
  • 69c64ccf-2129-4d8a-bbfd-91c8d70a49fb pour préciser un paiement par carte cadeau.
  • 9304067c-b2e1-4f07-9270-8ccceaa2d9ef pour préciser tout autre type de paiement.
"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.