Difference between revisions of "Interfaces Dolibarr toward foreign systems"

From Dolibarr ERP CRM Wiki
Jump to navigation Jump to search
m
m
Line 1: Line 1:
 
{{TemplateDocDevEn}}
 
{{TemplateDocDevEn}}
Dolibarr provides a simple mecanism to make Dolibarr act into an external system on a Dolibarr event (For more inforation on the other direction and allow an external system to act into Dolibarr system, see page [[Interfaces from exterieur to Dolibarr]]).  
+
Dolibarr provides a simple mecanism to make Dolibarr act into an external system on a Dolibarr event (For more inforation on the other direction and allow an external system to act into Dolibarr system, see page [[Interfaces from foreign systems toward Dolibarr]]).
  
 
= Execute your own code on a Dolibarr event =
 
= Execute your own code on a Dolibarr event =

Revision as of 00:05, 24 January 2010

Dolibarr provides a simple mecanism to make Dolibarr act into an external system on a Dolibarr event (For more inforation on the other direction and allow an external system to act into Dolibarr system, see page Interfaces from foreign systems toward Dolibarr).

Execute your own code on a Dolibarr event

En verysmall.png Page waiting for translation. To translate, create an account, go back and clic on "Modify".
Fr verysmall.png Page en attente de traduction. Pour traduire, créez un compte, revenez et cliquez sur "Modifier".
Es verysmall.png Página a traducir. Para traducirla, cree una cuenta, vuelva a la página y haga clic en "editar".
It verysmall.png Pagina da tradurre. Per tradurla, crea un utente, torna indietro e clicca su "modifica".
Pt verysmall.png Página a aguardar por tradução. Para traduzir, crie uma conta, volte atrás e clique em "Modificar".
De verysmall.png Seite wartet auf Übersetzung. Um Übersetzung zu erstellen, richte einen Account ein, geh zurück und klicke auf "bearbeiten".
Zh verysmall.png 页面等待翻译。若要翻译本页,先创建一个帐户、登录并返回本页后单击“编辑”。

Pour permettre de déclencher du code personnalisé en réaction à un évènement Dolibarr (création/modification/suppression d'une société/facture/produit/utilisateur ou autre), Dolibarr propose un mécanisme de triggers métiers. Ce mécanisme vous permet de personnaliser un workflow afin que les évènements de gestion Dolibarr soient répercutés dans une autre application par exemple. Rien n'empêche également de l'utiliser pour modifier le comportement de Dolibarr même: par exemple, pour que la validation d'une facture provoque la création d'un contrat automatiquement.

Donc, pour ajouter son propre code qui sera déclenché par trigger, la procédure est la suivante:


1) Copier le fichier htdocs/includes/triggers/interface_all_Demo.class.php sous le nom:

  • interface_all_Xxx.class.php

ou bien

  • interface_modMonModule_Xxx.class.php

Xxx est une chaine de votre choix commençant par une majuscule et MonModule est le nom du module si votre trigger ne doit être activé que si le module MonModule est actif. Si on désire que le trigger soit toujours actif, on mettra all à la place de modMonModule. Il faut laisser ce nouveau fichier dans le même répertoire. Rem: Les valeurs à utiliser pour modMonModule sont visibles dans le répertoire htdocs/includes/modules.

Par exemple, on pourra nommer notre nouveau trigger: htdocs/includes/triggers/interface_modFacture_Monworkflow.class.php

En créant un fichier nommé comme dans cet exemple, notre nouveau trigger sera déclenché à chaque évènement métier Dolibarr et à condition que le module Facture soit actif.


2) Editer ce fichier interface_modMonModule_Monworkflow.class.php afin de renommer la classe InterfaceDemo par InterfaceMonworkflow


Ensuite, accéder à la page Accueil-> Infos Systèmes -> Dolibarr -> Triggers. Votre fichier trigger doit apparaitre dans la liste sans erreur indiquant que les opérations précédentes ont été réalisées avec succès.


3) Revenez maintenant à l'édition du fichier trigger afin d'ajouter votre code dans la fonction run_trigger. Cette fonction est appelée à chaque évènement Dolibarr. Placer votre code en fonction du ou des évènements sur lesquels vous voulez réagir, chaque évènement étant identifié par un code (voir chapitres suivant pour la liste des codes), on peut réagir ou non à un évènement donnée par un test sur la variable $action:

  function run_trigger($action,$object,$user,$lang,$conf)
  {
        // Mettre ici le code à exécuter en réaction de l'action
        // Le type de l'évènement Dolibarr est stocké dans $action
        // Les données de l'action sont stockées dans $object
        // La configuration, utilisateur et langage sont dans $conf,$user et $lang
        if ($action == 'COMPANY_CREATE')
        {
            dol_syslog("Trigger for action '$action' launched. id=".$object->id);
        }
        elseif ($action == 'COMPANY_MODIFY')
        {        
            dol_syslog("Trigger for action '$action' launched. id=".$object->id);
        }
        elseif ($action == 'COMPANY_DELETE')
        ...
  }

Vous pouvez faire ce que vous voulez dans cette portion de code du moment que la fonction run_trigger renvoi un code retour sur le principe suivant:

<0 si ko, 0 si aucune action faite, >0 si ok

Vous pouvez de plus dans cette fonction utiliser les objets suivant:

  • $object est l'objet sur lequel porte l'action (voir chapitre suivant)
  • $user est l'objet de l'utilisateur Dolibarr qui réalise l'action
  • $langs est l'objet qui contient la langue de l'utilisateur Dolibarr
  • $conf est l'objet qui contient toute la configuration de Dolibarr.

4) Une fois le code réalisé, il n'y a plus qu'à tester, en provoquant l'évènement déclencheur dans Dolibarr. Attention, l'appel au run_trigger et encapsuler dans un transaction. Si votre trigger renvoie un code ko, la fonction appelante peut annuler la transaction (ceci dépend de la fonction appelante). Ajouter des traces dans un fichier dans la fonction run_trigger afin de vous assurer que le code s'exécute bien. Vous pouvez pour cela si vous le désirer, utiliser la fonction dol_syslog("mon texte de trace", LOG_DEBUG);

List of known events

Dolibarr events that launch triggers are identified by an event code $action. Existing codes are:

  • USER_CREATE
  • USER_MODIFY
  • USER_DISABLE

In such cases, the variable $object contains an object of type user.class.php

  • COMPANY_CREATE
  • COMPANY_MODIFY
  • COMPANY_DELETE

In such cases, the variable $object contains an object of type societe.class.php

  • PRODUCT_CREATE
  • PRODUCT_MODIFY
  • PRODUCT_DELETE

In such cases, the variable $object contains an object of type product.class.php

  • ORDER_CREATE
  • ORDER_VALIDATE
  • ORDER_DELETE

In such cases, the variable $object contains an object of type commande.class.php

  • ORDER_SUPPLIER_CREATE
  • ORDER_SUPPLIER_VALIDATE

In such cases, the variable $object contains an object of type fournisseur.commande.class.php

  • PROPAL_CREATE
  • PROPAL_MODIFY
  • PROPAL_VALIDATE
  • PROPAL_CLOSE_SIGNED
  • PROPAL_CLOSE_REFUSED

In such cases, the variable $object contains an object of type societe.class.php

  • CONTRACT_CREATE
  • CONTRACT_MODIFY
  • CONTRACT_ACTIVATE
  • CONTRACT_CANCEL
  • CONTRACT_CLOSE
  • CONTRACT_DELETE

In such cases, the variable $object contains an object of type contract.class.php

  • BILL_CREATE
  • BILL_MODIFY
  • BILL_VALIDATE
  • BILL_CANCEL
  • BILL_DELETE

In such cases, the variable $object contains an object of type facture.class.php

  • PAYMENT_CUSTOMER_CREATE

In such cases, the variable $object contains an object of type paiement.class.php

  • PAYMENT_SUPPLIER_CREATE

In such cases, the variable $object contains an object of type paiementfourn.class.php

  • FICHEINTER_VALIDATE

In such cases, the variable $object contains an object of type ficheinter.class.php

  • MEMBER_CREATE
  • MEMBER_VALIDATE
  • MEMBER_SUBSCRIPTION
  • MEMBER_MODIFY
  • MEMBER_RESILIATE
  • MEMBER_DELETE

In such cases, the variable $object contains an object of type adherent.class.php

  • CATEGORY_CREATE
  • CATEGORY_UPDATE
  • CATEGORY_DELETE

In such cases, the variable $object contains an object of type category.class.php

Manage new events

Pour gérer d'autre évènements que ceux ci-dessus, il faut modifier le code Dolibarr pour y ajouter la séquence suivante dans les méthodes métiers des classes utilisées pour gérer les évenements:

// Appel des triggers
include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php");
$interface=new Interfaces($this->db);
$interface->run_triggers('XXXXX_YYYYYY',$this,$user,$lang,$conf);
// Fin appel triggers

Ici, $this doit être l'objet de la classe métier qui contient toutes les informations à passer au trigger. Remplacer, de plus, le 'XXXXX_YYYYYY' par un code évènement non déjà utilisé. Il sera alors possible d'ajouter dans la méthode run_trigger, un if qui permet de gérer ce code. La méthode run_trigger serait alors de la forme :

function run_trigger($action,$object,$user,$lang,$conf)
{
      // Mettre ici le code à exécuter en réaction de l'action
      // Le type de l'évènement Dolibarr est stocké dans $action
      // Les données de l'action sont stockées dans $object
      // La configuration, utilisateur et langage sont dans $conf,$user et $lang
      <b>
      if ($action == 'XXXXX_YYYYY')
      {
          dol_syslog("Trigger for action '$action' launched. id=".$object->id);
      }
      </b>
      elseif ($action == 'COMPANY_CREATE')
      {
          dol_syslog("Trigger for action '$action' launched. id=".$object->id);
      }
      elseif ($action == 'COMPANY_MODIFY')
      {        
          dol_syslog("Trigger for action '$action' launched. id=".$object->id);
      }
      elseif ($action == 'COMPANY_DELETE')
      ...
}

Conclusion

Vous pouvez donc en quelques minutes, ajouter une interface Dolibarr vers exterieur sans risque puisqu'on ne touche pas au code Dolibarr, on s'est contenté de placer un nouveau fichier trigger dans le répertoire des triggers. Si cette interface peut être utile à d'autre, n'hésitez pas à la packager en tgz (voir les wiki sur la diffusion de modules) et de la soumettre dans l'espace des téléchargement-contributions sur le site de Dolibarr.