Métadonnées
API Reference : $metadata </div>
Accès
Vous pouvez récupérer les métadonnées de l’API Sage Business Cloud Comptabilité pour développer des applications avec appels dynamiques, par exemple pour prévoir un import/export paramétrable ou un générateur de formulaires.
Pour récupérer les métadonnées de l’API Sage Business Cloud Comptabilité, récupérez en premier un id société puis faites un appel à l’API avec la route $metadata
.
{url API}/companies/ // pour récupérer un id société
{url API}/{datasetId}/$metadata // en remplaçant {datasetId} par l'id de la société
</div>
Description
Voir aussi OData Common Schema Definition Language </div>
Noeuds | Description | Exemple attribut Name |
---|---|---|
EntityType | Modèle d’une ressource | Journal pour journaux |
Property | Propriétés d’un modèle | optRapprochement pour Journal |
NavigationProperty | Propriétés de navigation d’un modèle | compte pour Journal |
ComplexType | Regrouper des propriétés d’un modèle | DossierAdresse pour Tiers |
EnumType | Enumération d’une propriété | TypeNatureCompte pour NatureCompte |
EntitySet | Ressource avec clé liée à un modèle | journaux lié à Journal |
Singleton | Ressource sans clé liée à un modèle | company lié à Company |
Action | Exécution d’une action | effacerDonneesPersonnelles |
Exemple
Récupération des ressources, des relations, des noms et types des propriétés et des énumérations
</div>
Code de l’exemple
Attention ! Cet exemple a pour unique objectif de comprendre comment sont organisées les métadonnées de l’API.
Pour cette raison il peut être facilement mis en place en utilisant une simple page html locale contenant le css et le code html et via la console du navigateur pour coller le code JavaScript.
Il n’a pas vocation à être représentatif de l’implémentation de l’API dans vos développements, dans cet exemple il faut passer manuellement un token récupéré, par exemple depuis Postman, la sécurité n’autorisant pas depuis du code JavaScript client de s’authentifier directement à l’API.
</div>
CSS
à coller dans une page html locale
<style>
.title{font-size:large;font-weight:bold;display:block}
div.field{display:inline-block;margin-top:10px;margin-right: 20px;font-size:14px;}
span.field{min-width: 100px;display: block;font-weight:bold;}
select.field{width: 350px;font-family: monospace;}
select.fieldbutton{width:328px;}
button.field{font-size: 10px;padding: 2px 5px 2px 5px;margin-top: -5px;height: 20px;margin-left: -3px;}
</style>
HTML
à coller aussi dans cette page html
<span class="title">Récupération des ressources, des relations, des noms et types des propriétés et des énumérations</span>
<div class="field">
<span class="field">Ressources</span>
<select id="objEntities" class="field"></select>
</div>
<div class="field">
<span class="field">Propriétés de la ressource</span>
<select id="properties" class="field"></select>
</div>
<br>
<div class="field">
<span class="field">Relations de la ressource</span>
<select id="relations" class="field fieldbutton"></select>
<button id="linkToEntity" class="field btn btn-default glyphicon glyphicon-search"></button>
</div>
<div class="field">
<span class="field">Enumérations de la propriété</span>
<select id="enumeration" class="field"></select>
</div>
<br>
<div class="field">
<span class="field">Fonctions de la ressource</span>
<select id="function" class="field"></select>
</div>
Javascript
à coller et exécuter dans la console du navigateur depuis la page HTML
//Récupération des métadonnées au format XML
var token = "xxxxxx"; //Mentionnez ici un token valide par exemple généré par Postman
var qry_company = "{datasetId}"; //Mentionnez ici un id de société valide.
var xhr = new XMLHttpRequest();
var API_URL = "https://api-stg-compta.sage.fr/";
var request=API_URL + qry_company + "/$metadata";
xhr.onload = function () {
if (xhr.readyState === xhr.DONE && xhr.status === 200) {
createSelect(xhr.responseXML);
}
};
xhr.open("GET",request, true);
xhr.setRequestHeader('Authorization', 'Bearer ' + token);
xhr.send();
//Formatage ligne résultat
var fValue = function(value1,value2,car){
if(!car) car=30;
return (value1+" "+".".repeat(car)).substr(0,car)+" "+value2;
}
//Liste des ressources
var createSelect=function(response){
if (response){
metadata=response;
var objEntities = document.getElementById('objEntities');
objEntities.onchange=function(){selectProperties(entities[objEntities.selectedIndex])};
entities=metadata.querySelectorAll("EntityType");
for(var i=0;i<entities.length;i++){
name=entities[i].getAttribute("Name");
//Test si ressource principale (présente dans EntitySet ou Singleton)
if (entitySet=metadata.querySelector("EntitySet[EntityType='100S.Model."+name+"'],Singleton[Type='100S.Model."+name+"']")){
opt = document.createElement('option');
opt.value=name;
opt.appendChild(document.createTextNode(fValue(name,entitySet.getAttribute("Name"))));
objEntities.appendChild(opt);
}
//Sinon ressource uniquement sous ressource d'une autre ressource
else{
opt = document.createElement('option');
opt.value=name;
opt.appendChild(document.createTextNode(fValue(name,"sous-ressource")));
objEntities.appendChild(opt);
}
}
var objLinkToEntity=document.getElementById('linkToEntity');
objLinkToEntity.onclick=function(){linkToEntity()}
selectProperties(entities[0]);
}
}
var linkToEntity=function(){
var objRelations=document.getElementById('relations');
var objEntities = document.getElementById('objEntities');
objEntities.value=objRelations[objRelations.selectedIndex].value;
selectProperties(entities[objEntities.selectedIndex]);
}
//Liste des propriétés et types d'une ressource + liste des relations
var selectProperties=function(entity){
//Recherche de l'héritage éventuel. Exemple : Client dépend de TiersPartenaire qui dépend de Tiers.
var BaseType=entity.getAttribute("BaseType");
while(BaseType){
BaseType=BaseType.replace(/100S\.Model\./,"");
entity=metadata.querySelector("EntityType[Name='"+BaseType+"']");
BaseType=entity.getAttribute("BaseType");
}
var objProperties=document.getElementById('properties');
var objRelations=document.getElementById('relations');
objProperties.onchange=function(){
selectEnum(entity.querySelector("Property[Name='"+objProperties[objProperties.selectedIndex].value+"']"))
};
var opts= objProperties.querySelectorAll("optgroup,option");
for (var i=0;i<opts.length;i++) opts[i].remove();
while (objRelations.options.length) {
objRelations.remove(0);
}
//Récupération liste des propriétés + propriétés type single-valued navigation + récupération des relations
colProperties=entity.querySelectorAll("Property,NavigationProperty");
for(var i=0;i<colProperties.length;i++){
type=colProperties[i].getAttribute("Type").replace(/Edm\./,"").replace(/Collection\(100S\.Model\.(.*)\)/,"$1").replace(/100S\.Model\./,"");
name=colProperties[i].getAttribute("Name");
//Récupération des Relations
if (colProperties[i].nodeName=="NavigationProperty"){
opt = document.createElement('option');
opt.value=type;
opt.appendChild(document.createTextNode(fValue(name,type)));
objRelations.appendChild(opt);
}
//Récupération des sous ressources intégrées à une ressource. Exemple adresse d'un client.
if (colProperties[i].nodeName=="Property" && colProperties[i].getAttribute("Type").indexOf("100S.Model")>=0){
colComplex=metadata.querySelector("ComplexType[Name='"+type+"']");
if (colComplex){
colComplex=colComplex.querySelectorAll("Property");
optgroup=document.createElement('optgroup');
optgroup.label=name+((colProperties[i].getAttribute("Type").indexOf("Collection(")>=0)?"[]":"");
for (var j=0;j<colComplex.length;j++){
opt = document.createElement('option');
name=colComplex[j].getAttribute("Name");
type=colComplex[j].getAttribute("Type").replace(/Edm\./,"").replace(/100S\.Model\./,"");
opt.value=name
opt.appendChild(document.createTextNode(fValue(name,type,26)));
optgroup.appendChild(opt);
}
objProperties.appendChild(optgroup);
continue;
}
}
opt = document.createElement('option');
opt.value=name;
opt.appendChild(document.createTextNode(fValue(name,type)));
objProperties.appendChild(opt);
}
objRelations.disabled=document.getElementById("linkToEntity").disabled=(objRelations.length==0);
selectFunctions(entity.getAttribute("Name"));
selectEnum(entity.querySelector("Property[Name='"+objProperties[0].value+"']"));
}
//Liste des énumérations d'une propriété
var selectEnum=function(objProperties){
var objEnum=document.getElementById('enumeration');
while (objEnum.options.length) {
objEnum.remove(0);
}
if(objProperties){
var type=objProperties.getAttribute("Type");
if (type){
type=type.replace(/100S\.Model\./,"");
var colEnum=metadata.querySelector("EnumType[Name='"+type+"']");
if (colEnum){
objEnum.disabled=false;
colEnum=colEnum.querySelectorAll("Member");
for(var i=0;i<colEnum.length;i++){
opt = document.createElement('option');
name=colEnum[i].getAttribute("Name");
opt.value=name
opt.appendChild(document.createTextNode(name));
objEnum.appendChild(opt);
}
return;
}
}
}
objEnum.disabled=true;
}
//Liste des fonctions d'une ressource
var selectFunctions=function(entityname){
var objFunction=document.getElementById('function');
while (objFunction.options.length) {
objFunction.remove(0);
}
var functions=metadata.querySelectorAll("Function>Parameter[Type='100S.Model."+entityname+"']");
if (functions.length>0){
objFunction.disabled=false;
for(var i=0;i<functions.length;i++){
opt = document.createElement('option');
name=functions[i].parentElement.getAttribute("Name")+"(";
parameters=functions[i].parentElement.querySelectorAll("Parameter");
for (var j=1; j<parameters.length;j++){
name+=((j>1)?",":"")+parameters[j].getAttribute("Name");
}
name+=")";
opt.value=name;
opt.appendChild(document.createTextNode(name));
objFunction.appendChild(opt);
}
return;
}
objFunction.disabled=true;
}