Triggers-acciones


Dolibarr proporciona un mecanismo sencillo para poder actuar en una aplicación externa en un evento interno de Dolibarr (Para obtener información sobre el caso inverso y permitir que un sistema externo actúe sobre Dolibarr, consulte la página Interfaces del Exterior hacia Dolibarr).

Añadir su código en un evento Dolibarr

Para ayudar a desencadenar código personalizado en respuesta a un evento Dolibarr (creación/modificación /eliminación de una empresa/factura/producto/usuario u otro), Dolibarr propone un mecanismo de triggers. Este mecanismo le permite personalizar un flujo de trabajo a fin de que los eventos de gestión Dolibarr sean enviados a otra aplicación, por ejemplo. Nada impide que también sean utilizados para cambiar el comportamiento de Dolibarr mismo: por ejemplo, para que la validación de una factura provoque la creación de un contrato automáticamente.

Entonces, para añadir su propio código que será desencadenado por un trigger, el procedimiento es el siguiente:

1) Copiar el fichero htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php bajo el nombre:

  • interface_99_all_Xxx.class.php

o bien

  • interface_99_modMonModule_Xxx.class.php

donde Xxx es una cadena a vuestro gusto que empieza por una mayúscula y MonModule es el nombre del módulo si su trigger debe activarse solamente si el módulo MonModule está activo. Si queremos que el trigger esté siempre activo, pondremos all en lugar de modMonModule. Debemos dejar que este nuevo archivo en la misma carpeta. Nota: Los valores a utilizar de modMonModule son visibles en la carpeta htdocs/includes/modules.

Por ejemplo, podemos llamar a nuestro nuevo trigger: htdocs/includes/triggers/interface_99_modFacture_Monworkflow.class.php

Al crear un archivo de nombre como en este ejemplo, el nuevo trigger se activará en cada evento Dolibarr, siempre que el módulo factura esté activo.

Nota: Con Dolibarr 3.2+, es posible tener los archivos triggers en un subdirectorio del módulo. Ej: si el módulo se encuentra en htdocs/mimodulo/, podemos tener los triggers en htdocs/mimodulo/core/triggers/.

En este caso, el trigger no se encontrará si no lo declara en el archivo descriptor de su módulo. Para ello añada triggers->1 en la tabla module_parts (ej: /mimodulo/core/modules/modMiModulo.class.php):

// 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);

Seguidamente desactive y reactive el módulo. Esto añadirá una línea en la tabla Table llx_const que le indicará a Dolibarr que hace falta buscar un trigger en el directorio de su módulo htdocs/mimodulo/core/triggers.


2) Editar el fichero interface_99_modMonModule_Monworkflow.class.php renombrando la clase InterfaceDemo por InterfaceMonworkflow

A continuación, Acceder a la página Inicio-> Info Sistema -> Dolibarr -> Triggers. Su fichero trigger debe aparecer en la lista sin error indicaando que las operaciones anteriores se han realizado con éxito.

3) Volvamos a editar el fichero triggur para añadir nuestro código en la función run_trigger. Esta función es llamada en cada evento Dolibarr. Pongamos nuestro código en función de los eventos sobre los que queramos actuar, cada evento se identifica mediante un código (ver los capítulos siguientes para ver el listado de códigos), podemos actuar o en un evento determinado por una prueba en la variable $action:

function run_trigger($action,$object,$user,$langs,$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')
      ...
}

Puede hacer lo que desee en esta parte del código, siempre que la función run_trigger devuelva un código de retorno basándose en el principio siguiente:

<0 si error, 0 si no se realiza ninguna acción, >0 si ok

También puede utilizar en esta función los siguientes objetos:

  • $object es el objeto sobre el que se lleva la acción (véase la sección siguiente)
  • $user es el objeto del usuario Dolibarr que realiza la acción
  • $langs es el objeto que contiene el idioma del usuario Dolibarr
  • $conf es el objeto que contiene toda la configuración de Dolibarr.

4) Una vez que el código esté realizado, sólo tiene que probarlo, provocando el evento desencadenante en Dolibarr. Atención, la llamada a run_trigger está encapsulado en una transacción. Si el trigger devuelve un código ko, la función que lo ha llamado puede cancelar la transacción (esto depende de la función que realiza la llamada).

Añadir traces en un fichero en la función run_trigger para asegurarse que el código se ejecuta correctamente. Para ello, si lo desea, puede usar la función dol_syslog("mi texto de trace", LOG_DEBUG);

Listado de los eventos conocidos

Los eventos Dolibarr que provocan una llamada de triggers son, a día de hoy, identificados por los códigos $action los siguientes eventos:

Trigger code ($action) Type object ($object)
USER_CREATE 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_ENABLEDISABLE user.class.php
USER_NEW_PASSWORD user.class.php
USER_SETINGROUP user.class.php
USER_REMOVEFROMGROUP user.class.php
USERGROUP_CREATE (>= 12.0.0) usergroup.class.php
USERGROUP_MODIFY(>= 12.0.0) usergroup.class.php
USERGROUP_DELETE(>= 12.0.0) usergroup.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_MODIFY 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_MODIFY 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
ORDER_UNVALIDATE 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_MODIFY 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_ACTIVATE 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 contrat.class.php
LINECONTRACT_MODIFY contrat.class.php
LINECONTRACT_DELETE 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 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 fichinter.class.php
FICHINTER_MODIFY fichinter.class.php
FICHINTER_DELETE fichinter.class.php
FICHINTER_VALIDATE fichinter.class.php
FICHINTER_SENTBYMAIL 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
TASK_TIMESPENT_CREATE task.class.php
TASK_TIMESPENT_MODIFY task.class.php
TASK_TIMESPENT_DELETE task.class.php
PROJECT_TASK_ADD_CONTACT task.class.php
PROJECT_TASK_DELETE_CONTACT 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
STOCK_MOVEMENT mouvementstock.class.php
PAYBOX_PAYMENT_OK
PAYPAL_PAYMENT_OK
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


Gestionar nuevos eventos

Para la gestión de otros eventos como los anteriores, es necesario modificar el código Dolibarr para añadir la secuencia siguiente en los métodos de negociado destinados a la gestión de eventos:

// Call trigger
//$this->context = array('paramX'=>$valueX);
$result = $this->call_trigger('XXXXX_YYYYY', $user);
if ($result <0) $error++;
// End call triggers

Aquí, $this debe de ser el objeto de la clase de negociado que contiene toda la información a pasar al trigger. Reemplazar, de paso, el 'XXXXX_YYYYY' por un código de evento no utilizado. Entonces será posible añadir en el método run_trigger, un if que permita la gestión de ese código. El método run_trigger tomaría esta forma :

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')
      ...
}

Conclusión

Puede en pocos minutos, agregar una interfaz Dolibarr al exterior sin riesgos ya que no toca código Dolibarr, se limita a poner una nuevo archivo trigger en la carpeta de triggers. Si esta interfaz puede ser útil a otros, no dude en empaquetarla en tgz (véase Desarrollo_de_un_módulo#Crear_un_paquete_para_liberar_e_instalar_su_módulo) y enviarlo al área de descarga de las contribuciones en el sitio Dolibarr.

Vea también