Ex 6 : Surcharge Règles métier

Correspond au contrôle des règles métiers, qui par exemple peut interdire un ajout/mise à jour si certaines conditions ne sont pas respectées.
Toutes les surcharges seront dans les scripts « WebhookRules_xxxx ».
Attention les règles métier ne sont appelées que pour la méthode « PUT ».

Squelette de la surcharge:

// WebhookRulesOverload_xxxx
// @description     => Overload rules with yours. Return a response and a errorMessage if needed.
//
// @code            => Row code. Not exploited at the moment.
// @method          => Method used. Only PUT method at the moment.
// @dataInput       => Depending of the method. Contains json for the PUT method.
//
// @returns         => Response JSON document with two properties :
//                     response [ required ] => 1 IF all rules are valid or 0 IF at least one rule is not valid
//                     errorMessage [ optional ] => IF response equal to 0, THEN we display your errorMessage

code      = TRANSLATE( "<varscript>arg1</varscript>" )
method    = TRANSLATE( "<varscript>arg2</varscript>" )
dataInput = TRANSLATE( "<varscript>arg3</varscript>" )

jsonResponse = DOCUMENT_CREATE_DOCUMENT()

// To complete
…

response = DOCUMENT_SERIALIZE( jsonResponse, "json" )
RETURN( response )

Description des paramètres :

ParamètreDéscription
En entrée
arg1code (pas exploité pour l’instant)
arg2méthode (aujourd’hui uniquement la méthode « PUT » est implémentée)
arg3json de l’entité concernée (jsonCustomer, jsonContract, …)
En Sortie
Si toutes les règles spécifiques mise en place sont valides alors le script doit retourner « reponse » avec la valeur « 1 » (se fait de manière implicite si non précisé).


DOCUMENT_ADD_PROPERTY_TO_OBJECT( jsonResponse, "response", "1" )

response = DOCUMENT_SERIALIZE( response, "json" )
RETURN( response )

Si au moins une règle spécifique mise en place n’est pas valide alors le script doit retourner « response » avec la valeur « 0 » et un message d’erreur « errorMessage ».


DOCUMENT_ADD_PROPERTY_TO_OBJECT( jsonResponse, "response", "0" )
DOCUMENT_ADD_PROPERTY_TO_OBJECT( jsonResponse, "errorMessage", "Specific rule error: …" )
      
response = DOCUMENT_SERIALIZE( jsonResponse, "json" )
RETURN( response )

Exemples :

  • Je ne veux autoriser l’ajout/mise à jour d’un enregistrement dans « sw_data_customer », uniquement s’il s’agit d’un prospect :
IF( EQUALS( method, "PUT" ) )THEN
  jsonCustomer = JSON_GET_FROM_PATH( dataInput, "customer" )
  
  IF ( JSON_EXISTS_FROM_PATH( jsonCustomer, "generictype_ID_customerType" ) ) THEN
    generictype_ID_customerType =  JSON_GET_FROM_PATH( jsonCustomer, "generictype_ID_customerType" )
    
    IF( EQUALS( generictype_ID_customerType , "CUSTOMER_TYPE-CTP" ) == 0 )THEN
      DOCUMENT_ADD_PROPERTY_TO_OBJECT( jsonResponse, "response", "0" )
      DOCUMENT_ADD_PROPERTY_TO_OBJECT( jsonResponse, "errorMessage", "Specific rule error: Le type doit être prospect (Valeur envoyée : <varscript>generictype_ID_customerType</varscript>)" )
      
      response = DOCUMENT_SERIALIZE( jsonResponse, "json" )
      RETURN( response )
    ENDIF
  ENDIF
   
ENDIF

->  Résultat en retour si la règle n’est pas respectée :

image.png

  • Je ne veux autoriser l’ajout/mise à jour d’un enregistrement dans « sw_data_customer », uniquement si un champ personnalisé « Note administrative » (CLI_50) est >= 8 :
    Pour rappel les champs personnalisés, peuvent être mis à jour par le bloc json « dynamicFields ».
    image.png
IF( EQUALS( method, "PUT" ) )THEN
  jsonCustomer = JSON_GET_FROM_PATH( dataInput, "customer" )
  
  IF ( JSON_EXISTS_FROM_PATH( jsonCustomer, "dynamicfields" ) ) THEN
    jsonDynamicFields = JSON_GET_FROM_PATH( jsonCustomer, "dynamicfields" )
    
    VARSET_SHELL( "errorMessage", "", "FINAL_RulesDynamicFields" )
    EXECUTE_SCRIPT_FOREACH_ROW( "FINAL_WebhookRulesDynamicFields_customer", "json", jsonDynamicFields )
    
    errorMessage = VARGET_SHELL( "errorMessage", "FINAL_RulesDynamicFields" )
    IF (LEN( "<varscript>errorMessage</varscript>" ) > 0) THEN
        error = 1
        DOCUMENT_ADD_PROPERTY_TO_OBJECT( jsonResponse, "response", "0" )
        DOCUMENT_ADD_PROPERTY_TO_OBJECT( jsonResponse, "errorMessage", "Specific rule error: <varscript>errorMessage</varscript>" )
    ENDIF
  
    VARDELGROUP_SHELL( "FINAL_RulesDynamicFields" )

    IF EQUALS( "<varscript>error</varscript>", "1" ) THEN
      response = DOCUMENT_SERIALIZE( jsonResponse, "json" )
      RETURN( response )
    ENDIF
  ENDIF
ENDIF

Avec le script complémentaire « FINAL_WebhookRulesDynamicFields_customer » utilisé dans « EXECUTE_SCRIPT_FOREACH_ROW » pour boucler sur tous les dynamicfields :

IF EQUALS( "<varscript>fieldName</varscript>", "CLI50" )THEN
  IF( EQUALS( "<sql>SELECT '<varscript>fieldValue</varscript>' < 8 </sql>", "1" ) ) THEN
    VARSET_SHELL( "errorMessage", "La note administrative du client est inférieure à 8 (champ : <varscript>fieldName</varscript>, valeur envoyée : <varscript>fieldValue</varscript>)", "FINAL_RulesDynamicFields" )    
  ENDIF
  RETURN("breakforeach")
ENDIF

-> Résultat en retour si la règle n’est pas respectée :

image.png

Surcharge avant exécution du Webhook

Cette surcharge sera appelée entre le contrôle de validité et des règles du webhook et son exécution. Elle sera dans le script « WebhookOverload_Before ».


Squelette de la surcharge :

// WebhookOverload_Before
// @Description             => A script to use before webhook execution
//
// @tableName               => Name on wich table webhook will proceed
// @code                    => Row code. Can be empty depending of the method. It is empty for LIST || PUT.
//                             GET: contains code link to the row to be returned
//                             DELETE: contains code link to the row to be deleted
// @method                  => Method used. Can be GET || LIST || PUT || DELETE
// @headerInput             => Header input
// @dataInput               => Data input. Can be empty depending of the method. It is empty for GET || LIST || DELETE.
//                             PUT: contains data to be inserted
// @resultCode              => IF webhook execution will fail, resultCode is equal to 0. Otherwise, 1.
// @errorMessage            => Error message associated to the code
//
// @Returns                 => Void
 
tableName     = TRANSLATE( "<varscript>arg1</varscript>" )
code          = TRANSLATE( "<varscript>arg2</varscript>" )
method        = TRANSLATE( "<varscript>arg3</varscript>" )
headerInput   = TRANSLATE( "<varscript>arg4</varscript>" )
dataInput     = TRANSLATE( "<varscript>arg5</varscript>" )
resultCode    = TRANSLATE( "<varscript>arg6</varscript>" )
errorMessage  = TRANSLATE( "<varscript>arg7</varscript>" )

// For specific case, markForExport property can be changed here.
// To do it, a variable is available
// VARSET_SHELL( "markForExport", "Can be 0, 1, 2", "WebhookHeader" )

// IF resultCode = 0, THEN all data are empty, except errorMessage.
IF( EQUALS( resultCode, "1" ) )THEN
  
ENDIF

Description des paramètres :

ParamètreDéscription
En entrée
arg1Table principale du webhook
arg2code de l’enregistrement pour les méthodes GET et DELETE (non utilisé pour les méthodes LIST et PUT)
arg3nom de la méthode (GET, LIST, PUT, DELETE)
arg4json du header
arg5 json de l’entité concernée (jsonCustomer, jsonContract, …) pour la méthode PUT (non utilisé pour les méthodes GET, LIST et DELETE)
arg6code résultat du contrôle de validité (0 : Echec / 1 : Ok)
arg7message d’erreur si le contrôle de validité a échoué
En Sortie
Aucun


Exemple d'utilisation :

  • Je veux créer une journalisation des informations dans une table spécifique "sw_data_final_log" :
dataInput = REPLACE("<varscript>dataInput</varscript>",";",",")

msg = "message="
msg = CONCAT( msg, "tableName = <varscript>tableName</varscript>-" )
msg = CONCAT( msg, "code = <varscript>code</varscript>-" )
msg = CONCAT( msg, "method = <varscript>method</varscript>-" )
msg = CONCAT( msg, "headerinput = <varscript>headerinput</varscript>-" )
msg = CONCAT( msg, "datainput = <varscript>datainput</varscript>-" )
msg = CONCAT( msg, "resultcode = <varscript>resultcode</varscript>-" )
msg = CONCAT( msg, "errormessage = <varscript>errormessage</varscript>" )

VARADD_DB( "sw_data_final_log", msg )

Surcharge après l'exécution du Webhook

Cette surcharge sera appelée après l'exécution du Webhook. Elle sera dans le script « WebhookOverload_After ».


Squelette de la surcharge :

// WebhookOverload_After
// @Description             => A script to use after webhook execution
//
// @tableName               => Name on wich table webhook proceeded
// @code                    => Row code. Can be empty depending of the method. It is empty for LIST || PUT.
//                             GET: contains code link to the returned row
//                             DELETE: contains code link to the deleted row
// @method                  => Method used. Can be GET || LIST || PUT || DELETE
// @dataInput               => Data input. Can be empty depending of the method. It is empty for GET || LIST || DELETE.
//                             PUT: contains data inserted
// @dataOuput               => Data ouput. Can be empty depending of the method. It is empty for PUT || DELETE.
//                             GET || LIST: contains data returned
// @resultCode              => IF webhook execution failed, resultCode is equal to 1. Otherwise, 0.
// @errorMessage            => Error message associated to the code
//
// @Returns                 => Void

tableName     = TRANSLATE( "<varscript>arg1</varscript>" )
code          = TRANSLATE( "<varscript>arg2</varscript>" )
method        = TRANSLATE( "<varscript>arg3</varscript>" )
dataInput     = TRANSLATE( "<varscript>arg4</varscript>" )
dataOutput    = TRANSLATE( "<varscript>arg5</varscript>" )
resultCode    = TRANSLATE( "<varscript>arg6</varscript>" )
errorMessage  = TRANSLATE( "<varscript>arg7</varscript>" )

Description des paramètres :

ParamètreDéscription
En entrée
arg1Table principale du webhook
arg2code de l’enregistrement pour les méthodes GET et DELETE (non utilisé pour les méthodes LIST et PUT)
arg3nom de la méthode (GET, LIST, PUT, DELETE)
arg4 json de l’entité concernée (jsonCustomer, jsonContract, …) pour la méthode PUT (non utilisé pour les méthodes GET, LIST et DELETE)
arg5 json en sortie pour les méthodes GET et LIST (non utilisé pour les méthodes PUT et DELETE)
arg6code résultat du contrôle de validité (0 : OK / 1 : Echec)
arg7message d’erreur si l'exécution du Webhook a échoué
En Sortie
Aucun


Exemple d'utilisation :

  • Je veux créer une journalisation des informations dans une table spécifique "sw_data_final_log" :
dataInput = REPLACE("<varscript>dataInput</varscript>",";",",")
dataOutput = REPLACE("<varscript>dataOutput</varscript>",";",",")

msg = "message="
msg = CONCAT( msg, "tableName = <varscript>tableName</varscript>-" )
msg = CONCAT( msg, "code = <varscript>code</varscript>-" )
msg = CONCAT( msg, "method = <varscript>method</varscript>-" )
msg = CONCAT( msg, "datainput = <varscript>datainput</varscript>-" )
msg = CONCAT( msg, "dataoutput = <varscript>dataoutput</varscript>-" )
msg = CONCAT( msg, "resultcode = <varscript>resultcode</varscript>-" )
msg = CONCAT( msg, "errormessage = <varscript>errormessage</varscript>" )

VARADD_DB( "sw_data_final_log", msg )