From Dolibarr Open Source ERP CRM Wiki

Return to developer
documentation index

File Doc dev.png


Execute your own code on a Dolibarr's action

To execute personalized code after a Dolibarr event (create/modify/remove a third party/invoice/product or other), Dolibarr offers a mechanism of business triggers. This mechanism allows you to personalize a work-flow to have Dolibarr business events being synchronized into another application for example. You can also use triggers to modify the behavior of Dolibarr itself: for example, to create automatically a contract when an invoice is validated.

So, to add your own code that will be triggered by a Dolibarr trigger, this is the way to process:

1) Copy the trigger file htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN under the new name:

  • interface_99_all_Xxx.class.php


  • interface_99_modMyModule_Xxx.class.php

where Xxx is a string of your choice starting with uppercase character, 99 is the priority number for the execution of your trigger (1 being the top priority) and MyModule is the name of a module if you want that trigger is activated only if module MyModyle is activated. If you want the trigger to be always active, use all instead of modMyModule. This new file must be saved inside same directory.

Note: Value you can use for modMyModule are values found in directory htdocs/includes/modules.

WARNING: All those parameters are necessary for the trigger to be detected and executed! Eg: if you forget the priority number, your trigger won't be detected!

For example, you can name your new trigger file: htdocs/includes/triggers/interface_99_modFacture_Myworkflow.class.php

By creating such a file with name as in the example, your new trigger file will be executed each time a Dolibarr business event occurs but only if the module Facture is enabled.

Note: With Dolibarr 3.2+, you can also place the triggers in your own module's subdirectly. Eg: if your module resides in htdocs/mymodule/, then you can place your triggers inside htdocs/mymodule/core/triggers/. But for this, you must declare the trigger into your module descriptor file (eg: /mymodule/core/modules/modMyModule.class.php). For this, add into this file triggers->1 into module_parts array:

// Defined all module parts (triggers, login, substitutions, menus, etc...) (0=disable,1=enable)
$this->module_parts = array('triggers' => 1);
//$this->module_parts = array('triggers' => 1,
//              'login' => 0,
//              'substitutions' => 0,
//              'menus' => 0);

Then disable and reenable your module. This will add a record into Table llx_const to tell Dolibarr that a trigger file must be searched in the module directory htdocs/mymodule/core/triggers/

2) Edit the file interface_99_modMyModule_Myworkflow.class.php to rename class InterfaceDemo by InterfaceMyworkflow

Then go on page Home-> System Infos -> Dolibarr -> Triggers. Your new trigger file must appears in the list without any error message. This means preceding actions have been done successfully.

3) Return now to edition of file to add your own code inside function run_trigger. This function is called at each Dolibarr business event. Put your code according to events on which you want to run. Each event is identified by a code (see following chapter to get full list of codes). So you can react or no after an event by doing just a test on variable $action:

  function run_trigger($action,$object,$user,$langs,$conf)
        // Put here code to execute after an action
        // The type of Dolibarr business event is stored into $action
        // Data of action are stored into object $object
        // Setup, user and language are saved into $conf, $user and $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')

You can do what you want into this coding part, if you check that function run_trigger returns a return code according to following rule:

<0 if KO, 0 if nothing is done, >0 if OK

You can also use, inside this function, the following preinitialized variables:

  • $object is the object on which action is done (see next chapter)
  • $user is the object containing all information of Dolibarr user that realizes the business event.
  • $langs is the object that contains the user language and translations strings
  • $conf is the object that contains all the Dolibarr configuration.

4) Once your trigger file has been developed, last action is to test by using Dolibarr to execute the business event that should trigger your code. Warning, call of function run_trigger is encapsulated into a transaction. If your code return a KO code, the calling function may rollback the transaction (this depends on calling function). Add log information inside your function run_trigger to know if your code is correctly triggered and runs correctly. For this, you can use the function dol_syslog("my log message", LOG_DEBUG);

List of known triggers actions

List of all events that launch triggers are available in Table llx c action trigger. This is a quick list of those events, identified by value of variable $action into trigger code and type of variable $object for each code.

In most cases, trigger action code is a key matching this rules:

  • Start with module name
  • Other information (isolated with character _)
  • Action
Trigger code ($action) Type object ($object)
USER_CREATE user.class.php
USER_CREATE_FROM_CONTACT (Removed since 3.8) user.class.php
USER_MODIFY user.class.php
USER_DELETE user.class.php
USER_LOGIN user.class.php
USER_LOGIN_FAILED user.class.php
USER_LOGOUT user.class.php
USER_UPDATE_SESSION (Removed since 3.7.1) user.class.php
USER_NEW_PASSWORD user.class.php
USER_SETINGROUP user.class.php
GROUP_CREATE usergroup.class.php
GROUP_MODIFY usergroup.class.php
GROUP_DELETE (>= 3.3.0) usergroup.class.php
COMPANY_CREATE societe.class.php
COMPANY_MODIFY societe.class.php
COMPANY_DELETE societe.class.php
COMPANY_SENTBYMAIL (>= 3.5.0) societe.class.php
CONTACT_CREATE contact.class.php
CONTACT_MODIFY contact.class.php
CONTACT_DELETE contact.class.php
CONTACT_ENABLEDISABLE (>= 3.5.0) contact.class.php
PRODUCT_CREATE product.class.php
PRODUCT_MODIFY product.class.php
PRODUCT_PRICE_MODIFY product.class.php
PRODUCT_DELETE product.class.php
SUPPLIER_PRODUCT_BUYPRICE_UPDATE fournisseur.product.class.php
SUPPLIER_PRODUCT_BUYPRICE_CREATE fournisseur.product.class.php
ORDER_CREATE commande.class.php
ORDER_VALIDATE commande.class.php
ORDER_SENTBYMAIL commande.class.php
ORDER_DELETE commande.class.php
ORDER_CLASSIFY_BILLED commande.class.php
ORDER_CLONE commande.class.php
ORDER_CLOSE commande.class.php
ORDER_CANCEL commande.class.php
ORDER_REOPEN (>= 3.3.0) commande.class.php
COMMANDE_ADD_CONTACT commande.class.php
COMMANDE_DELETE_CONTACT commande.class.php
COMMANDE_DELETE_RESOURCE (>= 3.6.0) commande.class.php
LINEORDER_INSERT commande.class.php
LINEORDER_UPDATE commande.class.php
LINEORDER_DELETE commande.class.php
LINEORDER_DISPATCH (>= 3.4.0) commande.class.php
ORDER_SUPPLIER_CREATE fournisseur.commande.class.php
ORDER_SUPPLIER_CLONE fournisseur.commande.class.php
ORDER_SUPPLIER_VALIDATE fournisseur.commande.class.php
ORDER_SUPPLIER_SENTBYMAIL fournisseur.commande.class.php
ORDER_SUPPLIER_APPROVE fournisseur.commande.class.php
ORDER_SUPPLIER_REFUSE fournisseur.commande.class.php
ORDER_SUPPLIER_CANCEL fournisseur.commande.class.php
ORDER_SUPPLIER_DELETE fournisseur.commande.class.php
ORDER_SUPPLIER_DISPATCH (>= 3.4.0) fournisseur.commande.class.php
ORDER_SUPPLIER_ADD_CONTACT fournisseur.commande.class.php
ORDER_SUPPLIER_DELETE_CONTACT fournisseur.commande.class.php
ORDER_SUPPLIER_DELETE_RESOURCE (>= 3.6.0) fournisseur.commande.class.php
LINEORDER_SUPPLIER_CREATE fournisseur.commande.class.php
LINEORDER_SUPPLIER_UPDATE fournisseur.commande.class.php
LINEORDER_SUPPLIER_DELETE (>= 3.6.0) fournisseur.commande.class.php
PROPAL_CREATE propal.class.php
PROPAL_DELETE propal.class.php
PROPAL_CLONE propal.class.php
PROPAL_REOPEN (>= 3.5.0) propal.class.php
PROPAL_VALIDATE propal.class.php
PROPAL_CLOSE_SIGNED propal.class.php
PROPAL_CLOSE_REFUSED propal.class.php
PROPAL_SENTBYMAIL propal.class.php
PROPAL_ADD_CONTACT propal.class.php
PROPAL_DELETE_CONTACT propal.class.php
PROPAL_DELETE_RESOURCE (>= 3.6.0) propal.class.php
LINEPROPAL_INSERT propal.class.php
LINEPROPAL_UPDATE propal.class.php
LINEPROPAL_DELETE propal.class.php
CONTRACT_CREATE contrat.class.php
CONTRACT_VALIDATE contrat.class.php
CONTRACT_SERVICE_CLOSE contrat.class.php
CONTRACT_DELETE contrat.class.php
CONTRAT_ADD_CONTACT contrat.class.php
CONTRAT_DELETE_CONTACT contrat.class.php
CONTRAT_DELETE_RESOURCE (>= 3.6.0) contrat.class.php
LINECONTRACT_INSERT (>= 3.9.0) (LINECONTRACT_CREATE >= 3.7.0) contrat.class.php
BILL_CREATE facture.class.php
BILL_MODIFY facture.class.php
BILL_CLONE facture.class.php
BILL_VALIDATE facture.class.php
BILL_UNVALIDATE (>= 3.4.0) facture.class.php
BILL_PAYED facture.class.php
BILL_UNPAYED facture.class.php
BILL_CANCEL facture.class.php
BILL_DELETE facture.class.php
BILL_SENTBYMAIL facture.class.php
FACTURE_ADD_CONTACT facture.class.php
FACTURE_DELETE_CONTACT facture.class.php
FACTURE_DELETE_RESOURCE (>= 3.6.0) facture.class.php
LINEBILL_INSERT facture.class.php
LINEBILL_UPDATE facture.class.php
LINEBILL_DELETE facture.class.php
BILL_SUPPLIER_CREATE fournisseur.facture.class.php
BILL_SUPPLIER_MODIFY fournisseur.facture.class.php
BILL_SUPPLIER_DELETE (INVOICE_SUPPLIER_DELETE < 3.3.0) fournisseur.facture.class.php
BILL_SUPPLIER_VALIDATE fournisseur.facture.class.php
BILL_SUPPLIER_PAYED fournisseur.facture.class.php
BILL_SUPPLIER_UNPAYED fournisseur.facture.class.php
BILL_SUPPLIER_SENTBYMAIL fournisseur.facture.class.php
INVOICE_SUPPLIER_ADD_CONTACT fournisseur.facture.class.php
INVOICE_SUPPLIER_DELETE_CONTACT fournisseur.facture.class.php
INVOICE_SUPPLIER_DELETE_RESOURCE (>= 3.6.0) fournisseur.facture.class.php
LINEBILL_SUPPLIER_CREATE fournisseur.facture.class.php
LINEBILL_SUPPLIER_UPDATE fournisseur.facture.class.php
LINEBILL_SUPPLIER_DELETE (>= 3.4.0) fournisseur.facture.class.php
PAYMENT_CUSTOMER_CREATE paiement.class.php
PAYMENT_DELETE (<= 3.8) paiement.class.php
PAYMENT_CUSTOMER_DELETE (>= 3.9) paiement.class.php
PAYMENT_ADD_TO_BANK paiement.class.php
PAYMENT_SUPPLIER_CREATE paiementfourn.class.php
PAYMENT_SUPPLIER_DELETE (>= 3.9) paiement.class.php
PAYMENT_SALARY_CREATE (>= 3.6.0) paymentsalary.class.php
PAYMENT_SALARY_MODIFY (>= 3.6.0) paymentsalary.class.php
PAYMENT_SALARY_DELETE (>= 3.6.0) paymentsalary.class.php
FICHINTER_CREATE (FICHEINTER_CREATE < 3.3.0) fichinter.class.php
FICHINTER_MODIFY (FICHEINTER_MODIFY < 3.3.0) fichinter.class.php
FICHINTER_DELETE (FICHEINTER_DELETE < 3.3.0) fichinter.class.php
FICHINTER_ADD_CONTACT fichinter.class.php
FICHINTER_DELETE_CONTACT fichinter.class.php
FICHINTER_DELETE_RESOURCE (>= 3.6.0) fichinter.class.php
LINEFICHINTER_CREATE (>= 3.5.0) fichinter.class.php
LINEFICHINTER_UPDATE (>= 3.5.0) fichinter.class.php
LINEFICHINTER_DELETE (>= 3.5.0) fichinter.class.php
MEMBER_CREATE adherent.class.php
MEMBER_VALIDATE adherent.class.php
MEMBER_SUBSCRIPTION adherent.class.php
MEMBER_MODIFY adherent.class.php
MEMBER_RESILIATE adherent.class.php
MEMBER_NEW_PASSWORD adherent.class.php
MEMBER_DELETE adherent.class.php
CATEGORY_CREATE category.class.php
CATEGORY_MODIFY category.class.php
CATEGORY_DELETE category.class.php
CATEGORY_LINK (>= 3.5.0) category.class.php
CATEGORY_UNLINK (>= 3.5.0) category.class.php
SHIPPING_CREATE expedition.class.php
SHIPPING_VALIDATE expedition.class.php
SHIPPING_MODIFY expedition.class.php
SHIPPING_DELETE expedition.class.php
SHIPPING_SENTBYMAIL expedition.class.php
DELIVERY_VALIDATE livraison.class.php
DELIVERY_DELETE livraison.class.php
ACTION_CREATE actioncomm.class.php
ACTION_MODIFY actioncomm.class.php
ACTION_DELETE actioncomm.class.php
ACTION_ADD_CONTACT actioncomm.class.php
ACTION_DELETE_CONTACT actioncomm.class.php
ACTION_DELETE_RESOURCE (>= 3.6.0) actioncomm.class.php
DEPLACEMENT_CREATE deplacement.class.php
DON_CREATE don.class.php
DON_MODIFY (>= 3.7.0) don.class.php
DON_DELETE (>= 3.7.0) don.class.php
LOCALTAX_CREATE localtax.class.php
LOCALTAX_MODIFY localtax.class.php
LOCALTAX_DELETE localtax.class.php
TVA_CREATE tva.class.php
TVA_MODIFY tva.class.php
TVA_DELETE tva.class.php
TVA_ADDPAYMENT tva.class.php
PROJECT_CREATE project.class.php
PROJECT_MODIFY project.class.php
PROJECT_DELETE project.class.php
PROJECT_VALIDATE project.class.php
PROJECT_CLOSE project.class.php
PROJECT_ADD_CONTACT project.class.php
PROJECT_DELETE_CONTACT project.class.php
PROJECT_DELETE_RESOURCE (>= 3.6.0) project.class.php
TASK_CREATE task.class.php
TASK_MODIFY task.class.php
TASK_DELETE task.class.php
PROJECT_TASK_DELETE_RESOURCE (>= 3.6.0) task.class.php
MYECMDIR_CREATE ecmdirectory.class.php
MYECMDIR_MODIFY ecmdirectory.class.php
MYECMDIR_DELETE ecmdirectory.class.php
IMPORT_DELETE (Removed since 3.7.0) import.class.php
STOCK_MOVEMENT mouvementstock.class.php
LINK_CREATE (>= 3.5.0) link.class.php
LINK_MODIFY (>= 3.5.0) link.class.php
LINK_DELETE (>= 3.5.0) link.class.php
OPENSURVEY_CREATE (>= 3.6.0) opensurveysondage.class.php
OPENSURVEY_DELETE (>= 3.6.0) opensurveysondage.class.php

This list may be not complete.

Manage and create a new trigger's action

To manage other events on objects than the one defined before, you must edit the Dolibarr code to add the following code inside the business method of the class file of the object:

// Call triggers
include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
$interface=new Interfaces($this->db);
if ($result < 0) { $error++; $this->errors=$interface->errors; }
// End call triggers

With Dolibarr >= 3.7 you must use this piece of code for new trigger :

// Call trigger
include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
$interface=new Interfaces($this->db);
$result=$this->call_trigger('XXXXX_YYYYY',$user); // this is the new way to call triggers with Dolibarr >= 3.7.0
if ($result < 0) { $error++; $this->errors=$interface->errors; }
// End call triggers

Here, $this contains the business class with all information to send to the trigger functions. Replace 'XXXXX_YYYYY' by an event code not already used. Then you will be able to add inside the run_trigger method, a "if" to manage this code. The run_trigger method will contains a part of code like this :

function run_trigger($action,$object,$user,$lang,$conf)
      // Put here code to execute after an action
      // The type of Dolibarr business event is stored into $action
      // Data of action are stored into object $object
      // Setup, user and language are saved into $conf, $user and $lang
      if ($action == 'XXXXX_YYYYY')
          dol_syslog("Trigger for action '$action' launched. id=".$object->id);
      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')


You can in few minutes, add an interface from Dolibarr towards another system (or why not towards Dolibarr itself), with no risk since you don't touch anything to Dolibarr files. You only "added" a new trigger file inside the trigger directory. If this new interface can serve a lot of other users, you can package it into a tgz file (see page Module_development#Create_a_package_to_distribute_and_install_your_module) and submit it on the download area in section external contributions on official Dolibarr web site.

See also

Personal tools
  • Ask to to request an account to contribute to this documentation
  • Log in
In other languages
No translation in Deutsch.
No translation in Italian.
No translation in Greek.
No translation in &lt;multilanguagemanager_cn&gt;.

Social networks
Follow us on Google+ Follow us on Facebook Follow us on LinkedIn Follow us on Twitter