Notification ORDER_SUPPLIER_APPROVE vers créateur commande client

Bonjour,
J’ai paramétré le module notifications pour que l’action ORDER_SUPPLIER_VALIDATE envoie un email à un approbateur fixe. Ça fonctionne très bien.
Une fois l’approbation donnée, j’aurais voulu qu’un email soit envoyé en retour au demandeur, c’est à dire l’utilisateur qui a créé la commande fournisseur. Mais toujours dans ce même module, pour l’action ORDER_SUPPLIER_APPROVE, on ne peut utiliser que le mot clé SUPERVISOREMAIL, et sauf erreur rien pour spécifier le créateur de l’objet.
Par curiosité, j’ai décortiqué le code de la classe Notify, et il ne semble effectivement rien gérer de plus comme mot clé.

Comme le cas d’usage me parait spontanément assez naturel, peut-être n’utilisais-je pas la bonne méthode pour le paramétrer ?

Merci par avance de vos retours

En l’absence de réponse, j’ai fini par me créer un petit trigger pour faire le boulot. J’espère ne pas avoir dupliqué une fonctionnalité standard.

Bonjour,
Pourriez vous partager votre solution svp ?
Merci :slight_smile:

@droubaud

Ou la pousser sur GitHub en tant que Pull request !

1 « J'aime »

Bonjour,

On va mettre le code en direct sur le forum. Sur Git, c’est un peu le bazar pour la retrouver après :wink:

<?php
/* Copyright (C) 2019 SuperAdmin
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * \file    core/triggers/interface_99_modQSE_QSETriggers.class.php
 * \ingroup qse
 * \brief   Example trigger.
 *
 * Put detailed description here.
 *
 * \remarks You can create other triggers by copying this one.
 * - File name should be either:
 *      - interface_99_modQSE_MyTrigger.class.php
 *      - interface_99_all_MyTrigger.class.php
 * - The file must stay in core/triggers
 * - The class name must be InterfaceMytrigger
 * - The constructor method must be named InterfaceMytrigger
 * - The name property name must be MyTrigger
 */

require_once DOL_DOCUMENT_ROOT.'/core/triggers/dolibarrtriggers.class.php';
require_once DOL_DOCUMENT_ROOT . "/core/class/commonobject.class.php";
require_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php';
require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
require_once DOL_DOCUMENT_ROOT . '/user/class/user.class.php';

/**
 *  Class InterfaceSupplierOrderApprove : appelée sur triggers
 *   - approbation d'une commande fournisseur ORDER_SUPPLIER_APPROVE
 *   - refus d'approbation d'une commande fournisseur ORDER_SUPPLIER_REFUSE
 *  Envoie un email à l'auteur de la commande pour lui signifier l'approbation ou le refus de la commande fournisseur
 *
 */
class InterfaceSupplierOrderApprove extends DolibarrTriggers
{
	/**
	 * @var DoliDB Database handler
	 */
	protected $db;

	/**
	 * Constructor
	 *
	 * @param DoliDB $db Database handler
	 */
	public function __construct($db)
	{
		$this->db = $db;

		$this->name = preg_replace('/^Interface/i', '', get_class($this));
		$this->family = "Production";
		$this->description = "Workflow approbation ou refus d'une commande fournisseur";
		// 'development', 'experimental', 'dolibarr' or version
		$this->version = 'development';
		$this->picto = 'qse@qse';
	}

	/**
	 * Trigger name
	 *
	 * @return string Name of trigger file
	 */
	public function getName()
	{
		return $this->name;
	}

	/**
	 * Trigger description
	 *
	 * @return string Description of trigger file
	 */
	public function getDesc()
	{
		return $this->description;
	}


	/**
	 * Function called when a Dolibarrr business event is done.
	 * All functions "runTrigger" are triggered if file
	 * is inside directory core/triggers
	 *
	 * @param string 		$action 	Event action code
	 * @param CommonObject 	$object 	Object
	 * @param User 			$user 		Object user
	 * @param Translate 	$langs 		Object langs
	 * @param Conf 			$conf 		Object conf
	 * @return int              		<0 if KO, 0 if no triggered ran, >0 if OK
	 */
	public function runTrigger($action, $object, User $user, Translate $langs, Conf $conf)
	{
		//$object contient la commande fournisseur qui vient d'être approuvée ou refusée
    switch ($action) {
	    case 'ORDER_SUPPLIER_APPROVE':
				$donneurOrdre = new User($this->db);
				$OKDonneurOrdre = $donneurOrdre->fetch($object->user_author_id); //Récupérer le donneur d'ordre = auteur de la commande
				if ($OKDonneurOrdre > 0) {
					$fournisseur = new Societe($this->db);
					$OKFournisseur = $fournisseur->fetch($object->socid); //Récupérer le fournisseur
					if ($OKFournisseur > 0) {
						$expediteur = "[email protected]";
						$destinataire = $this->db->escape(trim($donneurOrdre->email));
						$subject = "Commande ".$object->ref." pour le fournisseur ".$fournisseur->name." approuvée";
						$message = 'La commande fournisseur <a href="'.DOL_MAIN_URL_ROOT.'/fourn/commande/card.php?id='.$object->id.'">'.$object->ref."</a> pour le fournisseur ".$fournisseur->name. " a été approuvée.<br>Vous pouvez maintenant passer cette commande dans Dolibarr.";
						$mailfile = new CMailFile($subject, '<'.$destinataire.'>', '<'.$expediteur.'>', $message, array(), array(), array(),'','',0,1);
						if ($mailfile->error) {
								dol_syslog($mailfile->error, LOG_ERR);
						}
						$result = $mailfile->sendfile();
					}
				}
				break;
	    case 'ORDER_SUPPLIER_REFUSE':
				$donneurOrdre = new User($this->db);
				$OKDonneurOrdre = $donneurOrdre->fetch($object->user_author_id); //Récupérer le donneur d'ordre = auteur de la commande
				if ($OKDonneurOrdre > 0) {
					$fournisseur = new Societe($this->db);
					$OKFournisseur = $fournisseur->fetch($object->socid); //Récupérer le fournisseur
					if ($OKFournisseur > 0) {
						$expediteur = "[email protected]";
						$destinataire = $this->db->escape(trim($donneurOrdre->email));
						$subject = "Commande ".$object->ref." pour le fournisseur ".$fournisseur->name." refusée";
						$message = 'La commande fournisseur <a href="'.DOL_MAIN_URL_ROOT.'/fourn/commande/card.php?id='.$object->id.'">'.$object->ref."</a> pour le fournisseur ".$fournisseur->name. " a été refusée.";
						$mailfile = new CMailFile($subject, '<'.$destinataire.'>', '<'.$expediteur.'>', $message, array(), array(), array(),'','',0,1);
						if ($mailfile->error) {
								dol_syslog($mailfile->error, LOG_ERR);
						}
						$result = $mailfile->sendfile();
					}
				}
				break;
			default:
        dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
        break;
	    }
		return 0;
	}
}

A adapter à votre cas de figure. Trigger déposé dans htdocs/core/triggers

Bon amusement !

2 « J'aime »

Merci pour le partage

bonjour,

je remonte un peu ce message de la cave car c’est une demande que me font mes utilisateurs, à savoir être informé quand notre responsable valide les commandes de second niveau (supérieures à une certaine somme).
j’ai installé ce trigger qui fonctionne très bien mais je me rend compte qu’il envoie deux notifications au user, une pour la première validation et une pour la deuxième. On ne pourrait pas adapter ce code pour n’avoir qu’un message pour la deuxième validation ou alors un message différent entre les deux?
merci

Bonjour,
Si vous déclenchez deux fois le trigger ORDER_SUPPLIER_APPROVE, il va vous falloir mémoriser quelque part le fait que vous êtes sur la première validation ou la deuxième.
Une solution pourrait par exemple être de créer un extrafield non visible dans la commande fournisseur, initialisé à 0 par défaut avant 1ere validation. Au premier ORDER_SUPPLIER_APPROVE, si vous lisez une valeur 0 pour cet extrafield, vous n’envoyez pas de mail mais vous passez sa valeur à 1. Et au deuxième ORDER_SUPPLIER_APPROVE, en lisant la valeur d’extrafield=1, là vous envoyez le mail

Bonjour,

Lors de la première validation fk_user_approve2 et date_approve2 ne sont pas définis. Il doit donc être possible d’adapter le code pour distinguer la première validation de la seconde en se basant sur ces données.

merci beaucoup pour les réponses, je vois donc que techniquement cela doit être possible.
Par contre j’ai simplement copié ce code de trigger mentionné plus haut, je n’en suis malheureusement pas le créateur et n’en ai pas les compétences