Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

Bloc de code
languagenone
WebhookDefinitionOverload_xxx

// WebhookDefinitionOverload_xxx
// @Description             =>  Overload webhook definition

languageCode     = VARGET_SHELL( "languageCode", "WebhookDefinition" )

specificOverload = TRANSLATE( "
  {
    'extendedFieldsListToExclude': '',
    'simpleFieldsList': '',
    'relatedTablesCount': '',
    'relatedTables': [],
    'authorizedTables': [],
    'cascadeDeleteTables': [],
    'fieldsList': {
    
    },
    strictFilters: [
      
    ],
    'strictOrderBy': [
      
    ],
    'outOfMainTableFields': [
      
    ]
  }
" )
RETURN( "<varscript>specificOverload</varscript>" )

...

Permet de lister les champs étendus à exclure pour les webhooks en mode LIST et GET (par défaut on retourne tous les champs).

Syntaxe

Bloc de code
languagenone
'extendedFieldsListToExclude': 'field1,field2,field3,...'

...

Je ne veux pas retourner les champs serialnumber et location

Bloc de code
languagenone
'extendedFieldsListToExclude': 'serialnumber,location'

...

Cette propriété n’est pas présente par défaut dans le squelette de la surcharge, il faudra l’ajouter manuellement.

Syntaxe

Bloc de code
languagenone
'simpleFieldsList': 'field1,field2,field3,...'

...

La liste du standard ne me convient pas et je veux afficher les champs codecustomer, name, city et final_pricecategory_ID_tarCod.

Bloc de code
languagenone
'simpleFieldsList': 'codecustomer,name,city,final_pricecategory_ID_tarCod'

...

Il faudra également fournir le nombre de tables liées.

Syntaxe

Bloc de code
languagenone
'relatedTablesCount': xx,
'relatedTables': [ 'fieldFK1', 'fieldFK2', '...' ]

Exemple

Le standard liste les champs generictype_ID_customerFamily, baseuser_ID et generictype_ID_country.

Je veux compléter cette liste pour afficher les valeurs de la table liée au champ final_pricecategory_ID_tarCod.

Bloc de code
languagenone
'relatedTablesCount': 4,
'relatedTables': [ 'generictype_ID_customerFamily', 'baseuser_ID', 'generictype_ID_country', 'final_pricecategory_ID_tarCod' ]

La liste proposée par le standard ne me convient pas et je ne veux afficher que les valeurs liées pour generictype_ID_customerFamily complété par le champ final_pricecategory_ID_tarCod.

Bloc de code
languagenone
'relatedTablesCount': 2,
'relatedTables': [ 'generictype_ID_customerFamily', 'final_pricecategory_ID_tarCod' ]

Liste des tables autorisées pour mise à jour additionnelle

...

Dans la surcharge il faudra reprendre la liste des tables autorisées du standard si vous voulez les conserver, complété par vos champstables.

Il faudra également que la fonction de définition de la table autorisée correspondante existe (WebhookDefinition_xxxx) ainsi que sa surcharge (WebhookDefinitionOverload_xxxx).

Cette propriété n’est pas présente par défaut dans le squelette de la surcharge, il faudra l’ajouter manuellement.

Syntaxe

Bloc de code
languagenone
'authorizedTables': [{'tableName':'mainTableName'}, {'tableName':'additionalTableName1'}, {'tableName':'additionalTableName2'}, {'tableName':'....'}]

Exemple

Pour le webhook des interventions, le standard autorise les table suivantes : intervention, interventionequipment et interventionpart.

Je veux compléter cette liste pour gérer la table des opérations interventionoperationrange.

Bloc de code
languagenone
'authorizedTables': [{'tableName':'intervention'}, {'tableName':'interventionequipment'}, {'tableName':'interventionpart'}, {'tableName':'interventionoperationrange'}

...

]

Liste des tables pour suppression en cascade

Permet de lister des champs qui demandent un traitement spécial pour être affichés en mode LIST et GET ou pour la mise à jour en mode PUT. Par défaut pour les clés étrangères spécifiques on retourne toujours le code de la table étrangère. Il n’y a donc pas besoin de traitement spécifique pour ces cas si le code suffit.

Syntaxe

...

languagenone

...

les tables qui peuvent être supprimées en cascade pour les webhooks en mode DELETE.

Dans la surcharge il faudra reprendre la liste des tables du standard si vous voulez les conserver, complété par vos tables.

Cette propriété n’est pas présente par défaut dans le squelette de la surcharge, il faudra l’ajouter manuellement.

Info

Attention, on ne permet qu’un seul niveau de suppression en cascade.

La suppression d’un enregistrement d’une table principale permet de supprimer en cascade un enregistrement d’une sous-table. Mais si l’enregistrement de cette sous-table est utiilisé dans une autre table, la suppression sera interdite.

Syntaxe

Bloc de code
languagenone
'cascadeDeleteTables': [{'tableName':'tableName1'}, {'tableName':'tableName2'}, {'tableName':'...'}]

Exemple

Pour le webhook des interventions, le standard permet la suppression en cascade des tables suivantes : interventionequipment et interventionpart.

Je veux compléter cette liste pour gérer la table des opérations interventionoperationrange.

Bloc de code
languagenone
'cascadeDeleteTables': [{'tableName':'interventionequipment'}, {'tableName':'interventionpart'}, {'tableName':'interventionoperationrange'}],

Champs

Permet de lister des champs qui demandent un traitement spécial pour être affichés en mode LIST et GET ou pour la mise à jour en mode PUT. Par défaut pour les clés étrangères spécifiques on retourne toujours le code de la table étrangère. Il n’y a donc pas besoin de traitement spécifique pour ces cas si le code suffit.

Syntaxe

Bloc de code
languagenone
'fieldsList': {
      'canGetfield1': 0 or 1,{
          'canInserttype': 0 or 1'…',
          'canUpdatelength': 0 or 1'…',
          'deprecatedlabel': 0 or 1'…',
          'foreignParenttargetTableName': '…'		
  ,
   },       'field2targetFieldName': {
          'type': ''…',
          'lengthfieldNameToShow': '…',

         'label': '…',
          'targetTableName': '…',
      	  'targetFieldName': '…',
	  'fieldNameToShow': '…',
	  'alias': '…',
          'mandatory': 0 or 1,
          'cannotBeNull': 0 or 1,
          'canGet': 0 or 1,
          'canInsert': 0 or 1,
          'canUpdate': 0 or 1,
          'deprecated': 0 or 1,
	
          'foreignParent': '…'		
      },
      'field3field2': {
          'type': '…',
          'length': '…',
          'label': '…',
          'targetTableName': '…',
      	  'targetFieldName': '…',
	  'fieldNameToShow': '…',
	  'alias': '…',
          'mandatory': 0 or 1,
          'cannotBeNull': 0 or 1,
          'canGet': 0 or 1,
          'canInsert': 0 or 1,
          'canUpdate': 0 or 1,
          'deprecated': 0 or 1,
	  'foreignParent': '…'
      },
      'field3': {
  }, 'outOfMainTableFields': [ {     'fieldNametype': '…',
          'tableNamelength': '…',
  }
]        'label': '…',
          'targetTableName': '…',
      	  'targetFieldName': '…',
	  'fieldNameToShow': '…',
	  'alias': '…',
          'mandatory': 0 or 1,
          'cannotBeNull': 0 or 1,
          'canGet': 0 or 1,
          'canInsert': 0 or 1,
          'canUpdate': 0 or 1,
          'deprecated': 0 or 1,
	  'foreignParent': '…'
      }
      … 
},
'outOfMainTableFields': [
{
    'fieldName': '…',
    'tableName': '…'
}
],

Description syntaxe

Propriété

Mode utilisation

Description

fieldsList

type

LIST, GET

Type du champ dans le résultat (bloc "fieldList"). En standard on a : varchar, text, int, double, bool, datetime, timestamp, foreignkey, mediumblob.

length

LIST, GET

Longueur du champ dans le résultat (bloc "fieldList)". En standard renseigné pour varchar, text.

label

LIST, GET

Libellé du champ dans le résultat (bloc "fieldList)". En standard on retourne la clé de traduction en fonction du code langue du json.

targetTableName

LIST, GET

Nom de la table liée pour les clés étrangères. A utiliser uniquement pour un champ spécifique qui pointe vers une table standard.

targetFieldName

LIST, GET

Nom du champ à afficher pour les clés étrangères.

fieldNameToShow

LIST, GET

Permet de changer le nom du champ en retour au lieu d’avoir le nom du champ en base de données. Ex : baseuser_ID -> Utilisateur du client

alias

PUT

Permet de changer le du nom du champ à renseigner afin qu’il soit plus explicite. L’alias ne doit pas comporter d’espaces. Permet de se détacher de la base de données. Ex : city -> Ville

mandatory

PUT

Permet de rendre un champ obligatoire dans le json. Valeurs possibles : 0, 1 (Par défaut on aura : 0 - Champ non obligatoire)

cannotBeNull

PUT

Permet de rendre la valeur d'un champ obligatoire dans le json (c'est-à-dire que la valeur ne peut être à chaine vide ou null). Valeurs possibles : 0, 1 (Par défaut on aura : 0 - Valeur du champ non obligatoire)

canGet

LIST, GET

Permet d'exclure un champ. Valeurs possibles : 0, 1 (Par défaut on aura : 1 - Champ retourné).

canInsert

PUT

Permet de ne pas insérer la valeur d'un champ lors d'un ajout. Valeurs possibles : 0, 1 (Par défaut on aura : 1 - Insérer valeur)

canUpdate

PUT

Permet de ne pas mettre à jour la valeur d'un champ lors d'une mise à jour. Valeurs possibles : 0, 1 (Par défaut on aura : 1 - Mettre à jour valeur)

deprecated

PUT

Permet de ne plus prendre en compte un champ devenu obsolète. Il ne sera ni vérifié, ni inséré, ni mis à jour. Valeurs possibles : 0, 1 (Par défaut on aura : 0 - Non déprécié)

checkForeign

PUT

Permet de ne pas contrôler la valeur d'une foreignkey. Valeurs possibles : 0, 1 (Par défaut on aura : 1 : Contrôler la foreignkey)

canGetDefinitionList

DEFINITION

Permet de lister les valeurs d'une foreignkey. Valeurs possibles : 0, 1 (Par défaut on aura : 0 - Ne pas lister les valeurs)

definitionLabelFieldName

DEFINITION

Permet de donner le champ à utiliser pour afficher le libellé dans la liste. (Si non renseigné on utilisera le champ "label" s'il existe dans la table). Possibilité d'utiliser des fonctions mysql pour par exemple concaténer le nom et le prénom dans la liste des utilisateurs : 'definitionLabelFieldName': 'CONCAT_WS(' ',lastName,firstName)'

definitionFilter

DEFINITION

Permet de filtrer les enregistrements retournés. Ex pour ne pas afficher les ressources matérielles et les équipes dans la liste des utilisateurs : 'definitionFilter': 'resourcetype_ID IS NULL AND teamtype_ID IS NULL'

definitionExtraFields

DEFINITION

Permet d'ajouter des champs additionnels en plus du code et du libellé

dataType

DEFINITION, PUT

Permet de donner le type de data pour une foreignkey pointant vers une table generictype afin de filtrer et contrôler les données

foreignParent

LIST, GET

Nom de la clé étrangère dans la table principale. Cas très particulier où on veut pointer vers une table de niveau +2. Sera combiné avec « outOfMainTableFields » Ex d’utilisation en standard : sw_data_intervention -> sw_datacustomeraddress -> sw_data_customer (ici « customeraddress_ID » pour notre exemple) Permet donc dans notre exemple de retourner une info de la table « sw_data_customer »

outOfMainTableFields (utilisé uniquement en combinaison avec foreignParent)

fieldname

LIST, GET

Nom de la clé étrangère dans la table de niveau +1 (ici « customer_ID » pour notre exemple)

tableName

LIST, GET

Nom de la table liée de niveau +1 (ici « sw_data_customeraddress » pour notre exemple)

...

Permet de rajouter des filtres spécifiques pour interroger les données en mode LIST.

Syntaxe

Bloc de code
'strictFilters': [
{
    'fieldName': '…',
    'operator': '…',
    'targetField': '…',
    'query': '…'    	
},
{
    'fieldName': '…',
    'operator': '…'
    'targetField': '…',
    'query': '…'
},
{
    ...
}
]

...

  • Je veux filtrer mes clients sur un champ standard « N° de téléphone » (phoneNumber) de téléphone » (phoneNumber) :

Bloc de code
'strictFilters': [
{
    'fieldName': 'phoneNumber',
    'operator': 'Equal'
}
]

-> Appel webhook avec le filtre :

Bloc de code
languagejson
"filters": 
{
  "phoneNumber": "02 31 14 50 00"
}
  • Je veux filtrer mes clients sur un champ standard « Date de fin des congés » (vacationEnd) sur une date précise ou une plage de dates :

Bloc de code
'strictFilters': [
{
    'fieldName': 'phoneNumber',
    'operator': 'Equal'
}
]'fieldName': 'vacationEnd',
    'operator' : Equal,
},
{
    'fieldName': 'vacationEndBetween',
    'operator' : 'Between',
    'targetField': 'vacationEnd'
} 
]

Remarque : on peut voir ici la manière de cumuler plusieurs filtres sur le même champ en utilisant la propriété "targetField" pour le 2eme filtre.

-> Appel webhook avec le filtre sur une date :

Bloc de code
languagejson
"filters": 
{
  "vacationEnd": "2020-08-30"
}

-> Appel webhook avec le filtre sur une plage de dates :

Bloc de code
languagejson
"filters": 
{
  "phoneNumbervacationEndBetween": "02 31 14 50 002020-08-01|2020-08-30"
}
  • Je veux filtrer mes clients sur un champ standard « Date de fin des congés » (vacationEnd) sur une date précise ou une plage de dates spécifique « Catégorie tarif » (final_pricecategory_ID_tarCod) qui pointe vers une table standard (sw_data_pricecategory) :

Bloc de code
'strictFilters': [
{
    'fieldName': 'final_pricecategory_ID_tarCod',
    'operator': 'In',
    'fieldNametargetField': 'vacationEndcustomer_ID',
    'query'operator: ' : Equal,
},
{
    'fieldName': 'vacationEndBetween',( SELECT customer_ID 
              FROM sw_data_customer AS c 
              INNER JOIN sw_data_pricecategory AS pc 
     'operator' : 'Between',     'targetField': 'vacationEnd' }ON 
]

Remarque : on peut voir ici la manière de cumuler plusieurs filtres sur le même champ en utilisant la propriété "targetField" pour le 2eme filtre.

-> Appel webhook avec le filtre sur une date :

Bloc de code
languagejson
"filters": 
{
  "vacationEnd": "2020-08-30"
}pc.pricecategory_ID = c.final_pricecategory_ID_tarCod 
              WHERE pc.codepricecategory = %valueToBeReplaced% )'
}
]

-> Appel webhook avec le filtre sur une plage de dates :

Bloc de code
languagejson
"filters": 
{
  "vacationEndBetweenfinal_pricecategory_ID_tarCod": "2020-08-01|2020-08-30TC"
}
  • Je veux filtrer mes clients sur un champ spécifique « Catégorie tarif Code remise » (final_pricecategoryt035_ID_tarCod) qui pointe vers une table standard spécifique (sw_data_final_pricecategoryt035) :

Bloc de code
strictFilters: [
{
    'fieldName': 'final_pricecategoryt035_ID_tarCod',
    'operator': 'In',
    'targetField': 'customer_ID',
    'query': '( SELECT customer_ID 
              FROM sw_data_customer AS c 
              INNER JOIN sw_data_final_pricecategoryt035 AS pct035 
              ON pct035.pricecategoryfinal_t035_ID = c.final_pricecategoryt035_ID_tarCod 
              WHERE pct035.codepricecategorycodefinal_t035 = %valueToBeReplaced% )'
}
]

...

Bloc de code
languagejson
"filters": 
{
  "final_pricecategoryt035_ID_tarCod": "TCRG"
}
  • Je veux filtrer mes clients sur un champ spécifique « Code remise » (final_t035_ID) qui pointe vers une table spécifique (sw_data_final_t035) :

...

  • personnalisé « Capital (Keuros) » (v_A101) avec l’opérateur >= :

Bloc de code
strictFilters: [
{
    'fieldName': 'v_A101',
    'operator': 'GreaterOrEqual'
}
]

-> Appel webhook avec le filtre :

Bloc de code
languagejson
"filters": 
{
  "v_A101": "1000"
}

Tris

Permet de rajouter des tris spécifiques pour interroger les données en mode LIST.

Syntaxe

Bloc de code
'strictOrderBy': [
{
    'fieldNamename': 'final_t035_ID...',
    'operatorfields': [
    {
        'table': 'In',...'
        'targetFieldfield': 'customer_ID...',
        'queryorder': '...'(
 SELECT customer_ID  },
    {
        FROM sw_data_customer AS c'table': '...'
        'field': '...',
       INNER JOIN sw_data_final_t035 AS t035'order': '...'
    },
    {
       ON t035.final_t035_ID = c.final_t035_ID...
    }]
},
{
    'name': '...',
    'fields': [
WHERE t035.codefinal_t035 = %valueToBeReplaced% )'{
} ]

-> Appel webhook avec le filtre :

Bloc de code
languagejson
"filters":  {   "final_t035_ID": "RG"
}
  • Je veux filtrer mes clients sur un champ personnalisé « Capital (Keuros) » (v_A101) avec l’opérateur >= :

Bloc de code
strictFilters: [
{ 'table': '...'
        'fieldNamefield': 'v_A101...',
        'operatororder': 'GreaterOrEqual'
}
]

-> Appel webhook avec le filtre :

Bloc de code
languagejson
"filters": 
{
  "v_A101": "1000"
}

Tris

Permet de rajouter des tris spécifiques pour interroger les données en mode LIST.

...

'...'
    },
    {
        ...
    }]        
}]

Description syntaxe

name : nom du tri, il doit être unique, il peut être intéressant de reprendre le nom des champs et l'ordre du tri comme mnémonique (non obligatoire)

field : nom du champ sur lequel on veut trier les données

order : ordre de tri

Les ordres de tris disponibles sont :

Ordre

Description

asc

tri ascendant

desc

tri descendant

table (optionnel) : nom de la table liée sur laquelle on veut faire le tri. Ne pas utiliser si le tri est effectué sur un champ de la table principale. Ne peut être utilisé que si un champ est déjà lu dans la table liée (selon type “simple” ou “extended”). Pour le type “simple”, les tris sur des tables liées ne seront donc pas forcément tous disponibles.

Exemples

  • Je veux trier mes clients sur les champs standards « Code postal » (postalCode) et « Ville » (city) de manière ascendante :

Bloc de code
'strictOrderBy': [
{
    'name': '...postalCodeAscCityAsc',
    'fields': [
    {
        'field': '...postalCode',
        'order': '...asc'
    },
    {
        'field': '...city',
        'order':    'order': '...'
    },
    {
        ...
    }]
},
{
    'asc'
    }]
}]

-> Appel webhook avec le tri :

Bloc de code
languagejson
"orderBy": "postalCodeAscCityAsc"
  • Je veux trier mes clients sur les champs standards « Date de fin des congés » (vacationEnd) descendante et sur le « Nom » (name) ascendant :

Bloc de code
'strictOrderBy': [
{
    'name': '...vacationEndDescNameASc',
    'fields': [
    {
        'field': '...vacationEnd',
        'order': '...desc'
    },
    {
        ...
    }]        
}]

Description syntaxe

name : nom du tri, il doit être unique, il peut être intéressant de reprendre le nom des champs et l'ordre du tri comme mnémonique (non obligatoire)

field : nom du champ sur lequel on veut trier les données

order : ordre de tri

Les ordres de tris disponibles sont :

...

Ordre

...

Description

...

asc

...

tri ascendant

...

desc

...

tri descendant

Les tris ne sont possibles que sur les champs de la table principale du webhook.

...

'field': 'name',
        'order': 'asc'
    }]
}]

-> Appel webhook avec le tri :

Bloc de code
languagejson
"orderBy": "vacationEndDescNameASc"
  • Je veux trier mes clients sur les champs standards « Code postal » (postalCode) et « Ville » (city) de manière ascendante :

...

  • un champ personnalisé « Capital (Keuros) » (v_A101) de manière descendante :

Bloc de code
'strictOrderBy': [
{
       'fieldname': 'postalCodeCapitalDesc',
   
    'orderfields': 'asc'[
    },
    {
        'field': 'cityv_A101',
        'order': 'ascdesc'
    }]
}]

-> Appel webhook avec le tri filtre :

Bloc de code
languagejson
"orderBy": "postalCodeAscCityAscCapitalDesc"
  • Je veux trier mes clients sur les champs standards « Date de fin des congés » (vacationEnd) descendante un champ d’une autre table « Catégorie client » (codepricecategory) ascendant et sur le « Nom » (name) ascendant :

Info

Attention ici ce tri ne peut être utilisé que si l’interrogation est effectué pour un type “extended”

Pour une utilisation pour un type “simple”, il faudrait ajouter le champ “pricecategory_ID” dans la propriété simpleFieldsList

Bloc de code
 'strictOrderBy': [
{
    'name': 'vacationEndDescNameASccodePriceCategoryAscNameAsc',
    'fields': [
    {
   'fields': [     {'table': 'pricecategory',
        'field': 'vacationEndcodepricecategory',
        'order': 'descasc'
    },
    {
        'field': 'name',
        'order': 'asc'
    }]
}

-> Appel webhook avec le tri filtre :

Bloc de code
languagejson
"orderBy": "vacationEndDescNameASccodePriceCategoryAscNameAsc"
  • Je veux trier mes clients sur un champ personnalisé « Capital (Keuros) » (v_A101) de manière descendante d’une autre table « Type générique - Pays » (originalCode) ascendant et sur le « Nom » (name) ascendant :

Bloc de code
 'strictOrderBy': [
{
    'name': 'CapitalDesccodeCountryAscNameAsc',
    'fields': [
    {
        'table': 'generictype_country',
        'field': 'originalCode',
        'order': 'asc'
    },
    {
        'field': 'v_A101name',
        'order': 'descasc'
    }]
}

-> Appel webhook avec le filtre :

Bloc de code
languagejson
"orderBy": "CapitalDesccodeCountryAscNameAsc"

Surcharge des règles métier

...