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.