--- /tmp/dsg/dolibarr/htdocs/core/modules/mailings/github_advthirdparties.modules.php
+++ /tmp/dsg/dolibarr/htdocs/core/modules/mailings/client_advthirdparties.modules.php
@@ -25,22 +25,22 @@
  */

 class mailing_advthirdparties extends MailingTargets

 {

-	public $name = 'ThirdPartyAdvancedTargeting';

+    public $name = 'ThirdPartyAdvancedTargeting';

 	// This label is used if no translation is found for key XXX neither MailingModuleDescXXX where XXX=name is found

-	public $desc = "Third parties";

-	public $require_admin = 0;

-

-	public $require_module = array("none"); // This module should not be displayed as Selector in mailling

-

-	/**

-	 * @var string String with name of icon for myobject. Must be the part after the 'object_' into object_myobject.png

-	 */

-	public $picto = 'company';

-

-	/**

-	 * @var DoliDB Database handler.

-	 */

-	public $db;

+    public $desc = "Third parties";

+    public $require_admin = 0;

+

+    public $require_module = array("none"); // This module should not be displayed as Selector in mailling

+

+    /**

+     * @var string String with name of icon for myobject. Must be the part after the 'object_' into object_myobject.png

+     */

+    public $picto = 'company';

+

+	/**

+     * @var DoliDB Database handler.

+     */

+    public $db;

 

 

 	/**

@@ -54,7 +54,7 @@
 	}

 

 

-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

 	/**

 	 *    This is the main function that returns the array of emails

 	 *

@@ -66,7 +66,7 @@
 	 */

 	public function add_to_target_spec($mailing_id, $socid, $type_of_target, $contactid)

 	{

-		// phpcs:enable

+        // phpcs:enable

 		global $conf, $langs;

 

 		dol_syslog(get_class($this)."::add_to_target_spec socid=".var_export($socid, true).' contactid='.var_export($contactid, true));

@@ -83,41 +83,43 @@
 				$sql .= " AND s.rowid IN (".implode(',', $socid).")";

 				$sql .= " ORDER BY email";

 

-				// Stock recipients emails into targets table

-				$result = $this->db->query($sql);

-				if ($result)

-				{

-					$num = $this->db->num_rows($result);

-					$i = 0;

-

-					dol_syslog(get_class($this)."::add_to_target_spec mailing ".$num." targets found", LOG_DEBUG);

-

-					while ($i < $num)

-					{

-						$obj = $this->db->fetch_object($result);

-

-						if (!empty($obj->email) && filter_var($obj->email, FILTER_VALIDATE_EMAIL)) {

-							if (!array_key_exists($obj->email, $cibles)) {

-								$cibles[$obj->email] = array(

-									'email' => $obj->email,

-									'fk_contact' => $obj->fk_contact,

-									'name' => $obj->name,

-									'firstname' => $obj->firstname,

-									'other' => '',

-									'source_url' => $this->url($obj->id, 'thirdparty'),

-									'source_id' => $obj->id,

-									'source_type' => 'thirdparty'

-								);

-							}

-						}

-

-						$i++;

-					}

-				} else {

-					dol_syslog($this->db->error());

-					$this->error = $this->db->error();

-					return -1;

-				}

+    			// Stock recipients emails into targets table

+    			$result = $this->db->query($sql);

+    			if ($result)

+    			{

+    				$num = $this->db->num_rows($result);

+    				$i = 0;

+

+    				dol_syslog(get_class($this)."::add_to_target_spec mailing ".$num." targets found", LOG_DEBUG);

+

+    				while ($i < $num)

+    				{

+    					$obj = $this->db->fetch_object($result);

+

+    					if (!empty($obj->email) && filter_var($obj->email, FILTER_VALIDATE_EMAIL)) {

+    						if (!array_key_exists($obj->email, $cibles)) {

+    							$cibles[$obj->email] = array(

+    								'email' => $obj->email,

+    								'fk_contact' => $obj->fk_contact,

+    								'name' => $obj->name,

+    								'firstname' => $obj->firstname,

+    								'other' => '',

+    								'source_url' => $this->url($obj->id, 'thirdparty'),

+    								'source_id' => $obj->id,

+    								'source_type' => 'thirdparty'

+    							);

+    						}

+    					}

+

+    					$i++;

+    				}

+    			}

+    			else

+    			{

+    				dol_syslog($this->db->error());

+    				$this->error = $this->db->error();

+    				return -1;

+    			}

 			}

 		}

 

@@ -136,41 +138,43 @@
 				}

 				$sql .= " ORDER BY email";

 

-				// Stock recipients emails into targets table

-				$result = $this->db->query($sql);

-				if ($result)

-				{

-					$num = $this->db->num_rows($result);

-					$i = 0;

-

-					dol_syslog(get_class($this)."::add_to_target_spec mailing ".$num." targets found");

-

-					while ($i < $num)

-					{

-						$obj = $this->db->fetch_object($result);

-

-						if (!empty($obj->email) && filter_var($obj->email, FILTER_VALIDATE_EMAIL)) {

-							if (!array_key_exists($obj->email, $cibles)) {

-								$cibles[$obj->email] = array(

-									'email' => $obj->email,

-									'fk_contact' =>$obj->id,

-									'lastname' => $obj->lastname,

-									'firstname' => $obj->firstname,

-									'other' => '',

-									'source_url' => $this->url($obj->id, 'contact'),

-									'source_id' => $obj->id,

-									'source_type' => 'contact'

-								);

-							}

-						}

-

-						$i++;

-					}

-				} else {

-					dol_syslog($this->db->error());

-					$this->error = $this->db->error();

-					return -1;

-				}

+    			// Stock recipients emails into targets table

+    			$result = $this->db->query($sql);

+    			if ($result)

+    			{

+    				$num = $this->db->num_rows($result);

+    				$i = 0;

+

+    				dol_syslog(get_class($this)."::add_to_target_spec mailing ".$num." targets found");

+

+    				while ($i < $num)

+    				{

+    					$obj = $this->db->fetch_object($result);

+

+    					if (!empty($obj->email) && filter_var($obj->email, FILTER_VALIDATE_EMAIL)) {

+    						if (!array_key_exists($obj->email, $cibles)) {

+    							$cibles[$obj->email] = array(

+    								'email' => $obj->email,

+    								'fk_contact' =>$obj->id,

+    								'lastname' => $obj->lastname,

+    								'firstname' => $obj->firstname,

+    								'other' => '',

+    								'source_url' => $this->url($obj->id, 'contact'),

+    								'source_id' => $obj->id,

+    								'source_type' => 'contact'

+    							);

+    						}

+    					}

+

+    					$i++;

+    				}

+    			}

+    			else

+    			{

+    				dol_syslog($this->db->error());

+    				$this->error = $this->db->error();

+    				return -1;

+    			}

 			}

 		}

 

@@ -268,7 +272,9 @@
 				$s .= '</option>';

 				$i++;

 			}

-		} else {

+		}

+		else

+		{

 			dol_print_error($this->db);

 		}

 

--- /tmp/dsg/dolibarr/htdocs/core/modules/mailings/github_contacts1.modules.php
+++ /tmp/dsg/dolibarr/htdocs/core/modules/mailings/client_contacts1.modules.php
@@ -44,23 +44,23 @@
 	public $picto = 'contact';

 

 	/**

-	 * @var DoliDB Database handler.

-	 */

-	public $db;

-

-

-	/**

-	 *  Constructor

-	 *

-	 *  @param      DoliDB      $db      Database handler

-	 */

-	public function __construct($db)

-	{

-		$this->db = $db;

-	}

-

-

-	/**

+     * @var DoliDB Database handler.

+     */

+    public $db;

+

+

+    /**

+     *  Constructor

+     *

+     *  @param      DoliDB      $db      Database handler

+     */

+    public function __construct($db)

+    {

+        $this->db = $db;

+    }

+

+

+    /**

 	 *	On the main mailing area, there is a box with statistics.

 	 *	If you want to add a line in this report you must provide an

 	 *	array of SQL request that returns two field:

@@ -68,14 +68,14 @@
 	 *

 	 *	@return		string[]		Array with SQL requests

 	 */

-	public function getSqlArrayForStats()

-	{

+    public function getSqlArrayForStats()

+    {

 		global $conf, $langs;

 

 		$langs->load("commercial");

 

 		$statssql = array();

-		$statssql[0] = "SELECT '".$this->db->escape($langs->trans("NbOfCompaniesContacts"))."' as label,";

+		$statssql[0] = "SELECT '".$langs->trans("NbOfCompaniesContacts")."' as label,";

 		$statssql[0] .= " count(distinct(c.email)) as nb";

 		$statssql[0] .= " FROM ".MAIN_DB_PREFIX."socpeople as c";

 		$statssql[0] .= " WHERE c.entity IN (".getEntity('socpeople').")";

@@ -84,7 +84,7 @@
 		$statssql[0] .= " AND c.statut = 1";

 

 		return $statssql;

-	}

+    }

 

 

 	/**

@@ -95,13 +95,13 @@
 	 *  @param		string	$sql		Requete sql de comptage

 	 *	@return		int

 	 */

-	public function getNbOfRecipients($sql = '')

-	{

+    public function getNbOfRecipients($sql = '')

+    {

 		global $conf;

 

 		$sql = "SELECT count(distinct(c.email)) as nb";

 		$sql .= " FROM ".MAIN_DB_PREFIX."socpeople as c";

-		$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = c.fk_soc";

+    	$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = c.fk_soc";

 		$sql .= " WHERE c.entity IN (".getEntity('socpeople').")";

 		$sql .= " AND c.email != ''"; // Note that null != '' is false

 		$sql .= " AND c.no_email = 0";

@@ -111,7 +111,7 @@
 

 		// The request must return a field called "nb" to be understandable by parent::getNbOfRecipients

 		return parent::getNbOfRecipients($sql);

-	}

+    }

 

 

 	/**

@@ -119,12 +119,12 @@
 	 *

 	 *   @return     string      Retourne zone select

 	 */

-	public function formFilter()

-	{

+    public function formFilter()

+    {

 		global $langs;

 

 		// Load translation files required by the page

-		$langs->loadLangs(array("commercial", "companies", "suppliers", "categories"));

+        $langs->loadLangs(array("commercial", "companies", "suppliers", "categories"));

 

 		$s = '';

 

@@ -153,7 +153,8 @@
 				$s .= '<option value="'.dol_escape_htmltag($obj->poste).'">'.dol_escape_htmltag($obj->poste).' ('.$obj->nb.')</option>';

 				$i++;

 			}

-		} else dol_print_error($this->db);

+		}

+		else dol_print_error($this->db);

 		$s .= '</select>';

 

 		$s .= ' ';

@@ -189,10 +190,13 @@
 					$s .= '<option value="'.$obj->label.'">'.$obj->label.' ('.$obj->nb.')</option>';

 					$i++;

 				}

-			} else {

+			}

+			else

+			{

 				$s .= '<option value="-1" disabled="disabled">'.$langs->trans("NoContactWithCategoryFound").'</option>';

 			}

-		} else dol_print_error($this->db);

+		}

+		else dol_print_error($this->db);

 		$s .= '</select>';

 

 		$s .= '<br>';

@@ -221,7 +225,8 @@
 				$s .= '<option value="prospectslevel'.$obj->code.'">'.$langs->trans("ThirdPartyProspects").' ('.$langs->trans("ProspectLevelShort").'='.$level.')</option>';

 				$i++;

 			}

-		} else dol_print_error($this->db);

+		}

+		else dol_print_error($this->db);

 		$s .= '<option value="customers">'.$langs->trans("ThirdPartyCustomers").'</option>';

 		//$s.='<option value="customersidprof">'.$langs->trans("ThirdPartyCustomersWithIdProf12",$langs->trans("ProfId1"),$langs->trans("ProfId2")).'</option>';

 		$s .= '<option value="suppliers">'.$langs->trans("ThirdPartySuppliers").'</option>';

@@ -260,10 +265,13 @@
 					$s .= '<option value="'.$obj->label.'">'.$obj->label.' ('.$obj->nb.')</option>';

 					$i++;

 				}

-			} else {

+			}

+			else

+			{

 				$s .= '<option value="-1" disabled="disabled">'.$langs->trans("NoContactLinkedToThirdpartieWithCategoryFound").'</option>';

 			}

-		} else dol_print_error($this->db);

+		}

+		else dol_print_error($this->db);

 		$s .= '</select>';

 

 		$s .= ' ';

@@ -299,38 +307,41 @@
 					$s .= '<option value="'.$obj->label.'">'.$obj->label.' ('.$obj->nb.')</option>';

 					$i++;

 				}

-			} else {

+			}

+			else

+			{

 				$s .= '<option value="-1" disabled="disabled">'.$langs->trans("NoContactLinkedToThirdpartieWithCategoryFound").'</option>';

 			}

-		} else dol_print_error($this->db);

+		}

+		else dol_print_error($this->db);

 		$s .= '</select>';

 

 		return $s;

-	}

+    }

 

 

 	/**

 	 *  Renvoie url lien vers fiche de la source du destinataire du mailing

 	 *

-	 *  @param	int		$id		ID

+     *  @param	int		$id		ID

 	 *  @return string      	Url lien

 	 */

-	public function url($id)

-	{

-		return '<a href="'.DOL_URL_ROOT.'/contact/card.php?id='.$id.'">'.img_object('', "contact").'</a>';

-	}

-

-

-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

+    public function url($id)

+    {

+        return '<a href="'.DOL_URL_ROOT.'/contact/card.php?id='.$id.'">'.img_object('', "contact").'</a>';

+    }

+

+

+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

 	/**

 	 *  Ajoute destinataires dans table des cibles

 	 *

 	 *  @param  int		$mailing_id    	Id of emailing

 	 *  @return int           			<0 si erreur, nb ajout si ok

 	 */

-	public function add_to_target($mailing_id)

-	{

-		// phpcs:enable

+    public function add_to_target($mailing_id)

+    {

+        // phpcs:enable

 		global $conf, $langs;

 

 		$filter = GETPOST('filter', 'alpha');

@@ -358,20 +369,21 @@
 				$prospectlevel[$obj->code] = $obj->label;

 				$i++;

 			}

-		} else dol_print_error($this->db);

+		}

+		else dol_print_error($this->db);

 

 		// Request must return: id, email, fk_contact, lastname, firstname, other

 		$sql = "SELECT sp.rowid as id, sp.email as email, sp.rowid as fk_contact, sp.lastname, sp.firstname, sp.civility as civility_id, sp.poste as jobposition,";

 		$sql .= " s.nom as companyname";

 		$sql .= " FROM ".MAIN_DB_PREFIX."socpeople as sp";

-		$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = sp.fk_soc";

-		if ($filter_category <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie as c";

-		if ($filter_category <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie_contact as cs";

-		if ($filter_category_customer <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie as c2";

-		if ($filter_category_customer <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie_societe as c2s";

-		if ($filter_category_supplier <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie as c3";

-		if ($filter_category_supplier <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie_fournisseur as c3s";

-		$sql .= " WHERE sp.entity IN (".getEntity('socpeople').")";

+    	$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = sp.fk_soc";

+    	if ($filter_category <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie as c";

+    	if ($filter_category <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie_contact as cs";

+    	if ($filter_category_customer <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie as c2";

+    	if ($filter_category_customer <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie_societe as c2s";

+    	if ($filter_category_supplier <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie as c3";

+    	if ($filter_category_supplier <> 'all') $sql .= ", ".MAIN_DB_PREFIX."categorie_fournisseur as c3s";

+    	$sql .= " WHERE sp.entity IN (".getEntity('socpeople').")";

 		$sql .= " AND sp.email <> ''";

 		$sql .= " AND sp.no_email = 0";

 		$sql .= " AND (SELECT count(*) FROM ".MAIN_DB_PREFIX."mailing_unsubscribe WHERE email = sp.email) = 0";

@@ -380,17 +392,17 @@
 		$sql .= " AND sp.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";

 		// Filter on category

 		if ($filter_category <> 'all') $sql .= " AND cs.fk_categorie = c.rowid AND cs.fk_socpeople = sp.rowid";

-		if ($filter_category <> 'all') $sql .= " AND c.label = '".$this->db->escape($filter_category)."'";

+    	if ($filter_category <> 'all') $sql .= " AND c.label = '".$this->db->escape($filter_category)."'";

 		if ($filter_category_customer <> 'all') $sql .= " AND c2s.fk_categorie = c2.rowid AND c2s.fk_soc = sp.fk_soc";

-		if ($filter_category_customer <> 'all') $sql .= " AND c2.label = '".$this->db->escape($filter_category_customer)."'";

+    	if ($filter_category_customer <> 'all') $sql .= " AND c2.label = '".$this->db->escape($filter_category_customer)."'";

 		if ($filter_category_supplier <> 'all') $sql .= " AND c3s.fk_categorie = c3.rowid AND c3s.fk_soc = sp.fk_soc";

-		if ($filter_category_supplier <> 'all') $sql .= " AND c3.label = '".$this->db->escape($filter_category_supplier)."'";

-		// Filter on nature

+    	if ($filter_category_supplier <> 'all') $sql .= " AND c3.label = '".$this->db->escape($filter_category_supplier)."'";

+    	// Filter on nature

 		$key = $filter;

 		{

 			//print "xx".$key;

 			if ($key == 'prospects') $sql .= " AND s.client=2";

-			foreach ($prospectlevel as $codelevel=>$valuelevel) if ($key == 'prospectslevel'.$codelevel) $sql .= " AND s.fk_prospectlevel='".$this->db->escape($codelevel)."'";

+			foreach ($prospectlevel as $codelevel=>$valuelevel) if ($key == 'prospectslevel'.$codelevel) $sql .= " AND s.fk_prospectlevel='".$codelevel."'";

 			if ($key == 'customers') $sql .= " AND s.client=1";

 			if ($key == 'suppliers') $sql .= " AND s.fournisseur=1";

 		}

@@ -417,17 +429,17 @@
 				if ($old <> $obj->email)

 				{

 					$cibles[$j] = array(

-							'email' => $obj->email,

-							'fk_contact' => $obj->fk_contact,

-							'lastname' => $obj->lastname,

-							'firstname' => $obj->firstname,

-							'other' =>

-								($langs->transnoentities("ThirdParty").'='.$obj->companyname).';'.

-								($langs->transnoentities("UserTitle").'='.($obj->civility_id ? $langs->transnoentities("Civility".$obj->civility_id) : '')).';'.

-								($langs->transnoentities("JobPosition").'='.$obj->jobposition),

+                    		'email' => $obj->email,

+                    		'fk_contact' => $obj->fk_contact,

+                    		'lastname' => $obj->lastname,

+                    		'firstname' => $obj->firstname,

+                    		'other' =>

+                                ($langs->transnoentities("ThirdParty").'='.$obj->companyname).';'.

+                                ($langs->transnoentities("UserTitle").'='.($obj->civility_id ? $langs->transnoentities("Civility".$obj->civility_id) : '')).';'.

+                                ($langs->transnoentities("JobPosition").'='.$obj->jobposition),

 							'source_url' => $this->url($obj->id),

-							'source_id' => $obj->id,

-							'source_type' => 'contact'

+                            'source_id' => $obj->id,

+                            'source_type' => 'contact'

 					);

 					$old = $obj->email;

 					$j++;

@@ -435,12 +447,14 @@
 

 				$i++;

 			}

-		} else {

+		}

+		else

+		{

 			dol_syslog($this->db->error());

 			$this->error = $this->db->error();

 			return -1;

 		}

 

 		return parent::addTargetsToDatabase($mailing_id, $cibles);

-	}

+    }

 }

--- /tmp/dsg/dolibarr/htdocs/core/modules/mailings/github_example.modules.php
+++ /tmp/dsg/dolibarr/htdocs/core/modules/mailings/client_example.modules.php
@@ -25,70 +25,70 @@
 */

 class mailing_example extends MailingTargets

 {

-	// CHANGE THIS: Put here a name not already used

-	public $name = 'example';

-	// CHANGE THIS: Put here a description of your selector module.

-	// This label is used if no translation is found for key MailingModuleDescXXX where XXX=name is found

-	public $desc = 'Put here a description';

-	// CHANGE THIS: Set to 1 if selector is available for admin users only

-	public $require_admin = 0;

-	// CHANGE THIS: Add a tooltip language key to add a tooltip help icon after the email target selector

-	public $tooltip = 'MyTooltipLangKey';

+    // CHANGE THIS: Put here a name not already used

+    public $name = 'example';

+    // CHANGE THIS: Put here a description of your selector module.

+    // This label is used if no translation is found for key MailingModuleDescXXX where XXX=name is found

+    public $desc = 'Put here a description';

+    // CHANGE THIS: Set to 1 if selector is available for admin users only

+    public $require_admin = 0;

+    // CHANGE THIS: Add a tooltip language key to add a tooltip help icon after the email target selector

+    public $tooltip = 'MyTooltipLangKey';

 

-	public $require_module = array();

+    public $require_module = array();

 

-	/**

-	 * @var string String with name of icon for myobject. Must be the part after the 'object_' into object_myobject.png

-	 */

-	public $picto = '';

+    /**

+     * @var string String with name of icon for myobject. Must be the part after the 'object_' into object_myobject.png

+     */

+    public $picto = '';

 

-	/**

-	 * @var DoliDB Database handler.

-	 */

-	public $db;

+    /**

+     * @var DoliDB Database handler.

+     */

+    public $db;

 

 

-	// CHANGE THIS: Constructor name must be called mailing_xxx with xxx=name of your selector

+    // CHANGE THIS: Constructor name must be called mailing_xxx with xxx=name of your selector

 	/**

 	 *	Constructor

 	 *

 	 *  @param		DoliDB		$db      Database handler

 	 */

-	public function __construct($db)

-	{

-		$this->db = $db;

-	}

+    public function __construct($db)

+    {

+        $this->db = $db;

+    }

 

 

-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

-	/**

-	 *  This is the main function that returns the array of emails

-	 *

-	 *  @param	int		$mailing_id    	Id of mailing. No need to use it.

-	 *  @return int           			<0 if error, number of emails added if ok

-	 */

-	public function add_to_target($mailing_id)

-	{

-		// phpcs:enable

-		$target = array();

+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

+    /**

+     *  This is the main function that returns the array of emails

+     *

+     *  @param	int		$mailing_id    	Id of mailing. No need to use it.

+     *  @return int           			<0 if error, number of emails added if ok

+     */

+    public function add_to_target($mailing_id)

+    {

+        // phpcs:enable

+        $target = array();

 

-		// CHANGE THIS

-		// ----- Your code start here -----

+	    // CHANGE THIS

+	    // ----- Your code start here -----

 

-		// You must fill the $target array with record like this

-		// $target[0]=array('email'=>'email_0','name'=>'name_0','firstname'=>'firstname_0', 'other'=>'other_0');

+	    // You must fill the $target array with record like this

+	    // $target[0]=array('email'=>'email_0','name'=>'name_0','firstname'=>'firstname_0', 'other'=>'other_0');

 		// ...

-		// $target[n]=array('email'=>'email_n','name'=>'name_n','firstname'=>'firstname_n', 'other'=>'other_n');

+	    // $target[n]=array('email'=>'email_n','name'=>'name_n','firstname'=>'firstname_n', 'other'=>'other_n');

 

 		// Example: $target[0]=array('email'=>'myemail@example.com', 'name'=>'Doe', 'firstname'=>'John', 'other'=>'Other information');

 

 		// ----- Your code end here -----

 

-		return parent::addTargetsToDatabase($mailing_id, $target);

-	}

+        return parent::addTargetsToDatabase($mailing_id, $target);

+    }

 

 

-	/**

+    /**

 	 *	On the main mailing area, there is a box with statistics.

 	 *	If you want to add a line in this report you must provide an

 	 *	array of SQL request that returns two field:

@@ -96,59 +96,59 @@
 	 *

 	 *	@return		array		Array with SQL requests

 	 */

-	public function getSqlArrayForStats()

+    public function getSqlArrayForStats()

 	{

-		// CHANGE THIS: Optionnal

+	    // CHANGE THIS: Optionnal

 

 		//var $statssql=array();

-		//$this->statssql[0]="SELECT field1 as label, count(distinct(email)) as nb FROM mytable WHERE email IS NOT NULL";

+        //$this->statssql[0]="SELECT field1 as label, count(distinct(email)) as nb FROM mytable WHERE email IS NOT NULL";

 		return array();

 	}

 

 

-	/**

-	 *  Return here number of distinct emails returned by your selector.

-	 *  For example if this selector is used to extract 500 different

-	 *  emails from a text file, this function must return 500.

-	 *

-	 *  @param		string		$sql		Requete sql de comptage

-	 *  @return		int|string				Number of recipient or '?'

-	 */

-	public function getNbOfRecipients($sql = '')

-	{

-		// CHANGE THIS: Optionnal

+    /**

+     *  Return here number of distinct emails returned by your selector.

+     *  For example if this selector is used to extract 500 different

+     *  emails from a text file, this function must return 500.

+     *

+     *  @param		string		$sql		Requete sql de comptage

+     *  @return		int|string				Number of recipient or '?'

+     */

+    public function getNbOfRecipients($sql = '')

+    {

+        // CHANGE THIS: Optionnal

 

-		// Example: return parent::getNbOfRecipients("SELECT count(*) as nb from dolibarr_table");

-		// Example: return 500;

-		return '?';

-	}

+        // Example: return parent::getNbOfRecipients("SELECT count(*) as nb from dolibarr_table");

+        // Example: return 500;

+        return '?';

+    }

 

-	/**

-	 *  This is to add a form filter to provide variant of selector

-	 *  If used, the HTML select must be called "filter"

-	 *

-	 *  @return     string      A html select zone

-	 */

-	public function formFilter()

-	{

-		// CHANGE THIS: Optionnal

+    /**

+     *  This is to add a form filter to provide variant of selector

+     *  If used, the HTML select must be called "filter"

+     *

+     *  @return     string      A html select zone

+     */

+    public function formFilter()

+    {

+        // CHANGE THIS: Optionnal

 

-		$s = '';

-		return $s;

-	}

+        $s = '';

+        return $s;

+    }

 

 

-	/**

-	 *  Can include an URL link on each record provided by selector

-	 *	shown on target page.

-	 *

-	 *  @param	int		$id		ID

-	 *  @return string      	Url link

-	 */

-	public function url($id)

-	{

-		// CHANGE THIS: Optionnal

+    /**

+     *  Can include an URL link on each record provided by selector

+     *	shown on target page.

+     *

+     *  @param	int		$id		ID

+     *  @return string      	Url link

+     */

+    public function url($id)

+    {

+        // CHANGE THIS: Optionnal

 

-		return '';

-	}

+        return '';

+    }

 }

--- /tmp/dsg/dolibarr/htdocs/core/modules/mailings/github_fraise.modules.php
+++ /tmp/dsg/dolibarr/htdocs/core/modules/mailings/client_fraise.modules.php
@@ -33,286 +33,294 @@
  */

 class mailing_fraise extends MailingTargets

 {

-	public $name = 'FundationMembers'; // Identifiant du module mailing

+    public $name = 'FundationMembers'; // Identifiant du module mailing

 	// This label is used if no translation is found for key XXX neither MailingModuleDescXXX where XXX=name is found

-	public $desc = 'Foundation members with emails';

-	// Set to 1 if selector is available for admin users only

-	public $require_admin = 0;

-

-	public $require_module = array('adherent');

-

-	/**

-	 * @var string String with name of icon for myobject. Must be the part after the 'object_' into object_myobject.png

-	 */

-	public $picto = 'user';

-

-	/**

-	 * @var DoliDB Database handler.

-	 */

-	public $db;

-

-	/**

-	 *    Constructor

-	 *

-	 *  @param        DoliDB        $db      Database handler

-	 */

-	public function __construct($db)

-	{

-		$this->db = $db;

-	}

-

-

-	/**

-	 *    On the main mailing area, there is a box with statistics.

-	 *    If you want to add a line in this report you must provide an

-	 *    array of SQL request that returns two field:

-	 *    One called "label", One called "nb".

-	 *

-	 *    @return        string[]        Array with SQL requests

-	 */

-	public function getSqlArrayForStats()

-	{

-		global $langs;

-

-		$langs->load("members");

-

-		// Array for requests for statistics board

-		$statssql = array();

-

-		$statssql[0] = "SELECT '".$this->db->escape($langs->trans("FundationMembers"))."' as label, count(*) as nb";

-		$statssql[0] .= " FROM ".MAIN_DB_PREFIX."adherent where statut = 1 and entity IN (".getEntity('member').")";

-

-		return $statssql;

-	}

-

-

-	/**

-	 *    Return here number of distinct emails returned by your selector.

-	 *    For example if this selector is used to extract 500 different

-	 *    emails from a text file, this function must return 500.

-	 *

-	 *  @param    string    $sql        Requete sql de comptage

-	 *    @return        int            Nb of recipients

-	 */

-	public function getNbOfRecipients($sql = '')

-	{

-		$sql  = "SELECT count(distinct(a.email)) as nb";

-		$sql .= " FROM ".MAIN_DB_PREFIX."adherent as a";

-		$sql .= " WHERE (a.email IS NOT NULL AND a.email != '') AND a.entity IN (".getEntity('member').")";

-

-		// La requete doit retourner un champ "nb" pour etre comprise

-		// par parent::getNbOfRecipients

-		return parent::getNbOfRecipients($sql);

-	}

-

-

-	/**

-	 *   Affiche formulaire de filtre qui apparait dans page de selection des destinataires de mailings

-	 *

-	 *   @return     string      Retourne zone select

-	 */

-	public function formFilter()

-	{

-		global $conf, $langs;

-

-		// Load translation files required by the page

-		$langs->loadLangs(array("members", "companies", "categories"));

-

-		$form = new Form($this->db);

-

-		$s = '';

-

-		// Status

-		$s .= $langs->trans("Status").': ';

-		$s .= '<select name="filter" class="flat">';

-		$s .= '<option value="none">&nbsp;</option>';

-		$s .= '<option value="-1">'.$langs->trans("MemberStatusDraft").'</option>';

-		$s .= '<option value="1a">'.$langs->trans("MemberStatusActiveShort").' ('.$langs->trans("MemberStatusPaidShort").')</option>';

-		$s .= '<option value="1b">'.$langs->trans("MemberStatusActiveShort").' ('.$langs->trans("MemberStatusActiveLateShort").')</option>';

-		$s .= '<option value="0">'.$langs->trans("MemberStatusResiliatedShort").'</option>';

-		$s .= '</select> ';

-		$s .= $langs->trans("Type").': ';

-		$s .= '<select name="filter_type" class="flat">';

-		$sql = "SELECT rowid, libelle as label, statut";

-		$sql .= " FROM ".MAIN_DB_PREFIX."adherent_type";

-		$sql .= " WHERE entity IN (".getEntity('member_type').")";

-		$sql .= " ORDER BY rowid";

-		$resql = $this->db->query($sql);

-		if ($resql)

-		{

-			$num = $this->db->num_rows($resql);

-

-			$s .= '<option value="0">&nbsp;</option>';

-			if (!$num) $s .= '<option value="0" disabled="disabled">'.$langs->trans("NoCategoriesDefined").'</option>';

-

-			$i = 0;

-			while ($i < $num)

-			{

-				$obj = $this->db->fetch_object($resql);

-

-				$s .= '<option value="'.$obj->rowid.'">'.dol_trunc($obj->label, 38, 'middle');

-				$s .= '</option>';

-				$i++;

-			}

-		} else {

-			dol_print_error($this->db);

-		}

-

-		$s .= '</select>';

-

-		$s .= ' ';

-

-		$s .= $langs->trans("Category").': ';

-		$s .= '<select name="filter_category" class="flat">';

-

-		// Show categories

-		$sql = "SELECT rowid, label, type, visible";

-		$sql .= " FROM ".MAIN_DB_PREFIX."categorie";

-		$sql .= " WHERE type = 3"; // We keep only categories for members

-		// $sql.= " AND visible > 0";	// We ignore the property visible because member's categories does not use this property (only products categories use it).

-		$sql .= " AND entity = ".$conf->entity;

-		$sql .= " ORDER BY label";

-

-		//print $sql;

-		$resql = $this->db->query($sql);

-		if ($resql)

-		{

-			$num = $this->db->num_rows($resql);

-

-			$s .= '<option value="0">&nbsp;</option>';

-			if (!$num) $s .= '<option value="0" disabled>'.$langs->trans("NoCategoriesDefined").'</option>';

-

-			$i = 0;

-			while ($i < $num)

-			{

-				$obj = $this->db->fetch_object($resql);

-

-				$s .= '<option value="'.$obj->rowid.'">'.dol_trunc($obj->label, 38, 'middle');

-				$s .= '</option>';

-				$i++;

-			}

-		} else {

-			dol_print_error($this->db);

-		}

-

-		$s .= '</select>';

-

-

-		$s .= '<br>';

-		$s .= $langs->trans("DateEndSubscription").': &nbsp;';

-		$s .= $langs->trans("After").' > '.$form->selectDate(-1, 'subscriptionafter', 0, 0, 1, 'fraise', 1, 0, 0);

-		$s .= ' &nbsp; ';

-		$s .= $langs->trans("Before").' < '.$form->selectDate(-1, 'subscriptionbefore', 0, 0, 1, 'fraise', 1, 0, 0);

-

-		return $s;

-	}

-

-

-	/**

-	 *  Renvoie url lien vers fiche de la source du destinataire du mailing

-	 *

-	 *  @param    int        $id        ID

-	 *  @return     string      Url lien

-	 */

-	public function url($id)

-	{

-		return '<a href="'.DOL_URL_ROOT.'/adherents/card.php?rowid='.$id.'">'.img_object('', "user").'</a>';

-	}

-

-

-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

-	/**

-	 *  Ajoute destinataires dans table des cibles

-	 *

-	 *  @param    int        $mailing_id        Id of emailing

-	 *  @return int                       < 0 si erreur, nb ajout si ok

-	 */

-	public function add_to_target($mailing_id)

-	{

-		// phpcs:enable

-		global $langs, $_POST;

-

-		// Load translation files required by the page

-		$langs->loadLangs(array("members", "companies"));

-

-		$cibles = array();

-		$now = dol_now();

-

-		$dateendsubscriptionafter = dol_mktime(GETPOST('subscriptionafterhour', 'int'), GETPOST('subscriptionaftermin', 'int'), GETPOST('subscriptionaftersec', 'int'), GETPOST('subscriptionaftermonth', 'int'), GETPOST('subscriptionafterday', 'int'), GETPOST('subscriptionafteryear', 'int'));

-		$dateendsubscriptionbefore = dol_mktime(GETPOST('subscriptionbeforehour', 'int'), GETPOST('subscriptionbeforemin', 'int'), GETPOST('subscriptionbeforesec', 'int'), GETPOST('subscriptionbeforemonth', 'int'), GETPOST('subscriptionbeforeday', 'int'), GETPOST('subscriptionbeforeyear', 'int'));

-

-		// La requete doit retourner: id, email, fk_contact, name, firstname

-		$sql = "SELECT a.rowid as id, a.email as email, null as fk_contact, ";

-		$sql .= " a.lastname, a.firstname,";

-		$sql .= " a.datefin, a.civility as civility_id, a.login, a.societe"; // Other fields

-		$sql .= " FROM ".MAIN_DB_PREFIX."adherent as a";

-		if (GETPOST('filter_category'))

-		{

-			$sql .= " INNER JOIN ".MAIN_DB_PREFIX."categorie_member as cm ON cm.fk_member = a.rowid";

-			$sql .= " INNER JOIN ".MAIN_DB_PREFIX."categorie as c ON c.rowid = cm.fk_categorie AND c.rowid = ".((int) GETPOST('filter_category', 'int'));

-		}

-		$sql .= " , ".MAIN_DB_PREFIX."adherent_type as ta";

-		$sql .= " WHERE a.entity IN (".getEntity('member').") AND a.email <> ''"; // Note that null != '' is false

-		$sql .= " AND a.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$this->db->escape($mailing_id).")";

-		// Filter on status

-		if (GETPOST("filter") == '-1') {

-			$sql .= " AND a.statut=-1";

-		}

-		if (GETPOST("filter", 'aZ09') == '1a') $sql .= " AND a.statut=1 AND (a.datefin >= '".$this->db->idate($now)."' OR ta.subscription = 0)";

-		if (GETPOST("filter", 'aZ09') == '1b') $sql .= " AND a.statut=1 AND ((a.datefin IS NULL or a.datefin < '".$this->db->idate($now)."') AND ta.subscription = 1)";

-		if (GETPOST("filter", 'aZ09') === '0')  $sql .= " AND a.statut=0";

-		// Filter on date

-		if ($dateendsubscriptionafter > 0)  $sql .= " AND datefin > '".$this->db->idate($dateendsubscriptionafter)."'";

-		if ($dateendsubscriptionbefore > 0) $sql .= " AND datefin < '".$this->db->idate($dateendsubscriptionbefore)."'";

-		$sql .= " AND a.fk_adherent_type = ta.rowid";

-		// Filter on type

-		if (GETPOST('filter_type', 'int') > 0) $sql .= " AND ta.rowid='".$this->db->escape(GETPOST('filter_type', 'int'))."'";

-		$sql .= " ORDER BY a.email";

-		//print $sql;

-

-		// Add targets into table

-		dol_syslog(get_class($this)."::add_to_target", LOG_DEBUG);

-		$result = $this->db->query($sql);

-		if ($result)

-		{

-			$num = $this->db->num_rows($result);

-			$i = 0;

-			$j = 0;

-

-			dol_syslog(get_class($this)."::add_to_target mailing ".$num." targets found");

-

-			$old = '';

-			while ($i < $num)

-			{

-				$obj = $this->db->fetch_object($result);

-				if ($old <> $obj->email)

-				{

-					$cibles[$j] = array(

-								'email' => $obj->email,

-								'fk_contact' => $obj->fk_contact,

-								'lastname' => $obj->lastname,

-								'firstname' => $obj->firstname,

-								'other' =>

-								($langs->transnoentities("Login").'='.$obj->login).';'.

-								($langs->transnoentities("UserTitle").'='.($obj->civility_id ? $langs->transnoentities("Civility".$obj->civility_id) : '')).';'.

-								($langs->transnoentities("DateEnd").'='.dol_print_date($this->db->jdate($obj->datefin), 'day')).';'.

-								($langs->transnoentities("Company").'='.$obj->societe),

-								'source_url' => $this->url($obj->id),

-								'source_id' => $obj->id,

-								'source_type' => 'member'

-					);

-					$old = $obj->email;

-					$j++;

-				}

-

-				$i++;

-			}

-		} else {

-			dol_syslog($this->db->error());

-			$this->error = $this->db->error();

-			return -1;

-		}

-

-		return parent::addTargetsToDatabase($mailing_id, $cibles);

-	}

+    public $desc = 'Foundation members with emails';

+    // Set to 1 if selector is available for admin users only

+    public $require_admin = 0;

+

+    public $require_module = array('adherent');

+

+    /**

+     * @var string String with name of icon for myobject. Must be the part after the 'object_' into object_myobject.png

+     */

+    public $picto = 'user';

+

+    /**

+     * @var DoliDB Database handler.

+     */

+    public $db;

+

+    /**

+     *    Constructor

+     *

+     *  @param        DoliDB        $db      Database handler

+     */

+    public function __construct($db)

+    {

+        $this->db = $db;

+    }

+

+

+    /**

+     *    On the main mailing area, there is a box with statistics.

+     *    If you want to add a line in this report you must provide an

+     *    array of SQL request that returns two field:

+     *    One called "label", One called "nb".

+     *

+     *    @return        string[]        Array with SQL requests

+     */

+    public function getSqlArrayForStats()

+    {

+        global $langs;

+

+        $langs->load("members");

+

+        // Array for requests for statistics board

+        $statssql = array();

+

+        $statssql[0] = "SELECT '".$this->db->escape($langs->trans("FundationMembers"))."' as label, count(*) as nb";

+        $statssql[0] .= " FROM ".MAIN_DB_PREFIX."adherent where statut = 1 and entity IN (".getEntity('member').")";

+

+        return $statssql;

+    }

+

+

+    /**

+     *    Return here number of distinct emails returned by your selector.

+     *    For example if this selector is used to extract 500 different

+     *    emails from a text file, this function must return 500.

+     *

+     *  @param    string    $sql        Requete sql de comptage

+     *    @return        int            Nb of recipients

+     */

+    public function getNbOfRecipients($sql = '')

+    {

+        $sql  = "SELECT count(distinct(a.email)) as nb";

+        $sql .= " FROM ".MAIN_DB_PREFIX."adherent as a";

+        $sql .= " WHERE (a.email IS NOT NULL AND a.email != '') AND a.entity IN (".getEntity('member').")";

+

+        // La requete doit retourner un champ "nb" pour etre comprise

+        // par parent::getNbOfRecipients

+        return parent::getNbOfRecipients($sql);

+    }

+

+

+    /**

+     *   Affiche formulaire de filtre qui apparait dans page de selection des destinataires de mailings

+     *

+     *   @return     string      Retourne zone select

+     */

+    public function formFilter()

+    {

+        global $conf, $langs;

+

+        // Load translation files required by the page

+        $langs->loadLangs(array("members", "companies", "categories"));

+

+        $form = new Form($this->db);

+

+        $s = '';

+

+        // Status

+        $s .= $langs->trans("Status").': ';

+        $s .= '<select name="filter" class="flat">';

+        $s .= '<option value="none">&nbsp;</option>';

+        $s .= '<option value="-1">'.$langs->trans("MemberStatusDraft").'</option>';

+        $s .= '<option value="1a">'.$langs->trans("MemberStatusActiveShort").' ('.$langs->trans("MemberStatusPaidShort").')</option>';

+        $s .= '<option value="1b">'.$langs->trans("MemberStatusActiveShort").' ('.$langs->trans("MemberStatusActiveLateShort").')</option>';

+        $s .= '<option value="0">'.$langs->trans("MemberStatusResiliatedShort").'</option>';

+        $s .= '</select> ';

+        $s .= $langs->trans("Type").': ';

+        $s .= '<select name="filter_type" class="flat">';

+        $sql = "SELECT rowid, libelle as label, statut";

+        $sql .= " FROM ".MAIN_DB_PREFIX."adherent_type";

+        $sql .= " WHERE entity IN (".getEntity('member_type').")";

+        $sql .= " ORDER BY rowid";

+        $resql = $this->db->query($sql);

+        if ($resql)

+        {

+            $num = $this->db->num_rows($resql);

+

+            $s .= '<option value="0">&nbsp;</option>';

+            if (!$num) $s .= '<option value="0" disabled="disabled">'.$langs->trans("NoCategoriesDefined").'</option>';

+

+            $i = 0;

+            while ($i < $num)

+            {

+                $obj = $this->db->fetch_object($resql);

+

+                $s .= '<option value="'.$obj->rowid.'">'.dol_trunc($obj->label, 38, 'middle');

+                $s .= '</option>';

+                $i++;

+            }

+        }

+        else

+        {

+            dol_print_error($this->db);

+        }

+

+        $s .= '</select>';

+

+        $s .= ' ';

+

+        $s .= $langs->trans("Category").': ';

+        $s .= '<select name="filter_category" class="flat">';

+

+        // Show categories

+        $sql = "SELECT rowid, label, type, visible";

+        $sql .= " FROM ".MAIN_DB_PREFIX."categorie";

+        $sql .= " WHERE type = 3"; // We keep only categories for members

+        // $sql.= " AND visible > 0";	// We ignore the property visible because member's categories does not use this property (only products categories use it).

+        $sql .= " AND entity = ".$conf->entity;

+        $sql .= " ORDER BY label";

+

+        //print $sql;

+        $resql = $this->db->query($sql);

+        if ($resql)

+        {

+        	$num = $this->db->num_rows($resql);

+

+        	$s .= '<option value="0">&nbsp;</option>';

+        	if (!$num) $s .= '<option value="0" disabled>'.$langs->trans("NoCategoriesDefined").'</option>';

+

+        	$i = 0;

+        	while ($i < $num)

+        	{

+        		$obj = $this->db->fetch_object($resql);

+

+        		$s .= '<option value="'.$obj->rowid.'">'.dol_trunc($obj->label, 38, 'middle');

+        		$s .= '</option>';

+        		$i++;

+        	}

+        }

+        else

+        {

+        	dol_print_error($this->db);

+        }

+

+        $s .= '</select>';

+

+

+        $s .= '<br>';

+        $s .= $langs->trans("DateEndSubscription").': &nbsp;';

+        $s .= $langs->trans("After").' > '.$form->selectDate(-1, 'subscriptionafter', 0, 0, 1, 'fraise', 1, 0, 0);

+        $s .= ' &nbsp; ';

+        $s .= $langs->trans("Before").' < '.$form->selectDate(-1, 'subscriptionbefore', 0, 0, 1, 'fraise', 1, 0, 0);

+

+        return $s;

+    }

+

+

+    /**

+     *  Renvoie url lien vers fiche de la source du destinataire du mailing

+     *

+     *  @param    int        $id        ID

+     *  @return     string      Url lien

+     */

+    public function url($id)

+    {

+        return '<a href="'.DOL_URL_ROOT.'/adherents/card.php?rowid='.$id.'">'.img_object('', "user").'</a>';

+    }

+

+

+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

+    /**

+     *  Ajoute destinataires dans table des cibles

+     *

+     *  @param    int        $mailing_id        Id of emailing

+     *  @return int                       < 0 si erreur, nb ajout si ok

+     */

+    public function add_to_target($mailing_id)

+    {

+        // phpcs:enable

+    	global $langs, $_POST;

+

+    	// Load translation files required by the page

+        $langs->loadLangs(array("members", "companies"));

+

+        $cibles = array();

+        $now = dol_now();

+

+        $dateendsubscriptionafter = dol_mktime($_POST['subscriptionafterhour'], $_POST['subscriptionaftermin'], $_POST['subscriptionaftersec'], $_POST['subscriptionaftermonth'], $_POST['subscriptionafterday'], $_POST['subscriptionafteryear']);

+        $dateendsubscriptionbefore = dol_mktime($_POST['subscriptionbeforehour'], $_POST['subscriptionbeforemin'], $_POST['subscriptionbeforesec'], $_POST['subscriptionbeforemonth'], $_POST['subscriptionbeforeday'], $_POST['subscriptionbeforeyear']);

+

+        // La requete doit retourner: id, email, fk_contact, name, firstname

+        $sql = "SELECT a.rowid as id, a.email as email, null as fk_contact, ";

+        $sql .= " a.lastname, a.firstname,";

+        $sql .= " a.datefin, a.civility as civility_id, a.login, a.societe"; // Other fields

+        $sql .= " FROM ".MAIN_DB_PREFIX."adherent as a";

+        if ($_POST['filter_category'])

+        {

+        	$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."categorie_member as cm ON cm.fk_member = a.rowid";

+        	$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."categorie as c ON c.rowid = cm.fk_categorie";

+        }

+        $sql .= " , ".MAIN_DB_PREFIX."adherent_type as ta";

+        $sql .= " WHERE a.entity IN (".getEntity('member').") AND a.email <> ''"; // Note that null != '' is false

+        $sql .= " AND a.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$this->db->escape($mailing_id).")";

+        // Filter on status

+        if (isset($_POST["filter"]) && $_POST["filter"] == '-1') {

+            $sql .= " AND a.statut=-1";

+        }

+        if (isset($_POST["filter"]) && $_POST["filter"] == '1a') $sql .= " AND a.statut=1 AND (a.datefin >= '".$this->db->idate($now)."' OR ta.subscription = 0)";

+        if (isset($_POST["filter"]) && $_POST["filter"] == '1b') $sql .= " AND a.statut=1 AND ((a.datefin IS NULL or a.datefin < '".$this->db->idate($now)."') AND ta.subscription = 1)";

+        if (isset($_POST["filter"]) && $_POST["filter"] == '0')  $sql .= " AND a.statut=0";

+        // Filter on date

+        if ($dateendsubscriptionafter > 0)  $sql .= " AND datefin > '".$this->db->idate($dateendsubscriptionafter)."'";

+        if ($dateendsubscriptionbefore > 0) $sql .= " AND datefin < '".$this->db->idate($dateendsubscriptionbefore)."'";

+        $sql .= " AND a.fk_adherent_type = ta.rowid";

+        // Filter on type

+        if ($_POST['filter_type']) $sql .= " AND ta.rowid='".$_POST['filter_type']."'";

+        // Filter on category

+        if ($_POST['filter_category']) $sql .= " AND c.rowid='".$_POST['filter_category']."'";

+        $sql .= " ORDER BY a.email";

+        //print $sql;

+

+        // Add targets into table

+        dol_syslog(get_class($this)."::add_to_target", LOG_DEBUG);

+        $result = $this->db->query($sql);

+        if ($result)

+        {

+            $num = $this->db->num_rows($result);

+            $i = 0;

+            $j = 0;

+

+            dol_syslog(get_class($this)."::add_to_target mailing ".$num." targets found");

+

+            $old = '';

+            while ($i < $num)

+            {

+                $obj = $this->db->fetch_object($result);

+                if ($old <> $obj->email)

+                {

+                    $cibles[$j] = array(

+                                'email' => $obj->email,

+                                'fk_contact' => $obj->fk_contact,

+                                'lastname' => $obj->lastname,

+                                'firstname' => $obj->firstname,

+                                'other' =>

+                                ($langs->transnoentities("Login").'='.$obj->login).';'.

+                                ($langs->transnoentities("UserTitle").'='.($obj->civility_id ? $langs->transnoentities("Civility".$obj->civility_id) : '')).';'.

+                                ($langs->transnoentities("DateEnd").'='.dol_print_date($this->db->jdate($obj->datefin), 'day')).';'.

+                                ($langs->transnoentities("Company").'='.$obj->societe),

+                                'source_url' => $this->url($obj->id),

+                                'source_id' => $obj->id,

+                                'source_type' => 'member'

+                                );

+                    $old = $obj->email;

+                    $j++;

+                }

+

+                $i++;

+            }

+        }

+        else

+        {

+            dol_syslog($this->db->error());

+            $this->error = $this->db->error();

+            return -1;

+        }

+

+        return parent::addTargetsToDatabase($mailing_id, $cibles);

+    }

 }

--- /tmp/dsg/dolibarr/htdocs/core/modules/mailings/github_modules_mailings.php
+++ /tmp/dsg/dolibarr/htdocs/core/modules/mailings/client_modules_mailings.php
@@ -31,181 +31,185 @@
  */

 class MailingTargets // This can't be abstract as it is used for some method

 {

-	/**

-	 * @var DoliDB Database handler.

-	 */

-	public $db;

-

-	/**

+    /**

+     * @var DoliDB Database handler.

+     */

+    public $db;

+

+    /**

 	 * @var string Error code (or message)

 	 */

 	public $error = '';

 

-	public $tooltip = '';

-

-

-	/**

+    public $tooltip = '';

+

+

+    /**

 	 *	Constructor

 	 *

 	 *  @param		DoliDB		$db      Database handler

 	 */

-	public function __construct($db)

+    public function __construct($db)

 	{

-		$this->db = $db;

+        $this->db = $db;

 	}

 

-	/**

-	 * Return description of email selector

-	 *

-	 * @return     string      Return translation of module label. Try translation of $this->name then translation of 'MailingModuleDesc'.$this->name, or $this->desc if not found

-	 */

-	public function getDesc()

-	{

-		global $langs, $form;

-

-		$langs->load("mails");

-		$transstring = "MailingModuleDesc".$this->name;

-		$s = '';

-

-		if ($langs->trans($this->name) != $this->name) $s = $langs->trans($this->name);

-		elseif ($langs->trans($transstring) != $transstring) $s = $langs->trans($transstring);

-		else $s = $this->desc;

-

-		if ($this->tooltip && is_object($form)) $s .= ' '.$form->textwithpicto('', $langs->trans($this->tooltip), 1, 1);

-		return $s;

-	}

-

-	/**

+    /**

+     * Return description of email selector

+     *

+     * @return     string      Return translation of module label. Try translation of $this->name then translation of 'MailingModuleDesc'.$this->name, or $this->desc if not found

+     */

+    public function getDesc()

+    {

+        global $langs, $form;

+

+        $langs->load("mails");

+        $transstring = "MailingModuleDesc".$this->name;

+        $s = '';

+

+        if ($langs->trans($this->name) != $this->name) $s = $langs->trans($this->name);

+        elseif ($langs->trans($transstring) != $transstring) $s = $langs->trans($transstring);

+        else $s = $this->desc;

+

+        if ($this->tooltip && is_object($form)) $s .= ' '.$form->textwithpicto('', $langs->trans($this->tooltip), 1, 1);

+        return $s;

+    }

+

+    /**

 	 *	Return number of records for email selector

-	 *

-	 *  @return     integer      Example

-	 */

-	public function getNbOfRecords()

-	{

-		return 0;

-	}

-

-	/**

-	 * Retourne nombre de destinataires

-	 *

-	 * @param      string	$sql        Sql request to count

-	 * @return     int       			Nb of recipient, or <0 if error

-	 */

-	public function getNbOfRecipients($sql)

-	{

-		$result = $this->db->query($sql);

-		if ($result)

-		{

-			$obj = $this->db->fetch_object($result);

-			return $obj->nb;

-		} else {

-			$this->error = $this->db->lasterror();

-			return -1;

-		}

-	}

-

-	/**

-	 * Affiche formulaire de filtre qui apparait dans page de selection

-	 * des destinataires de mailings

-	 *

-	 * @return     string      Retourne zone select

-	 */

-	public function formFilter()

-	{

-		return '';

-	}

-

-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

-	/**

-	 * Met a jour nombre de destinataires

-	 *

-	 * @param	int		$mailing_id          Id of emailing

-	 * @return  int			                 < 0 si erreur, nb destinataires si ok

-	 */

-	public function update_nb($mailing_id)

-	{

-		// phpcs:enable

-		// Mise a jour nombre de destinataire dans table des mailings

-		$sql = "SELECT COUNT(*) nb FROM ".MAIN_DB_PREFIX."mailing_cibles";

-		$sql .= " WHERE fk_mailing = ".$mailing_id;

-		$result = $this->db->query($sql);

-		if ($result)

-		{

-			$obj = $this->db->fetch_object($result);

-			$nb = $obj->nb;

-

-			$sql = "UPDATE ".MAIN_DB_PREFIX."mailing";

-			$sql .= " SET nbemail = ".$nb." WHERE rowid = ".$mailing_id;

-			if (!$this->db->query($sql))

-			{

-				dol_syslog($this->db->error());

-				$this->error = $this->db->error();

-				return -1;

-			}

-		} else {

-			return -1;

-		}

-		return $nb;

-	}

-

-	/**

-	 * Add a list of targets int the database

-	 *

-	 * @param	int		$mailing_id    Id of emailing

-	 * @param   array	$cibles        Array with targets

-	 * @return  int      			   < 0 si erreur, nb ajout si ok

-	 */

-	public function addTargetsToDatabase($mailing_id, $cibles)

-	{

-		global $conf;

-		global $dolibarr_main_instance_unique_id;

-

-		$this->db->begin();

-

-		// Insert emailing targets from array into database

-		$j = 0;

-		$num = count($cibles);

-		foreach ($cibles as $targetarray)

-		{

-			if (!empty($targetarray['email'])) // avoid empty email address

-			{

-				$sql = "INSERT INTO ".MAIN_DB_PREFIX."mailing_cibles";

-				$sql .= " (fk_mailing,";

-				$sql .= " fk_contact,";

-				$sql .= " lastname, firstname, email, other, source_url, source_id,";

-	   			$sql .= " tag,";

-				$sql .= " source_type)";

-				$sql .= " VALUES (".$mailing_id.",";

-				$sql .= (empty($targetarray['fk_contact']) ? '0' : "'".$this->db->escape($targetarray['fk_contact'])."'").",";

-				$sql .= "'".$this->db->escape($targetarray['lastname'])."',";

-				$sql .= "'".$this->db->escape($targetarray['firstname'])."',";

-				$sql .= "'".$this->db->escape($targetarray['email'])."',";

-				$sql .= "'".$this->db->escape($targetarray['other'])."',";

-				$sql .= "'".$this->db->escape($targetarray['source_url'])."',";

-				$sql .= (empty($targetarray['source_id']) ? 'null' : "'".$this->db->escape($targetarray['source_id'])."'").",";

-				$sql .= "'".$this->db->escape(dol_hash($dolibarr_main_instance_unique_id.';'.$targetarray['email'].';'.$targetarray['lastname'].';'.$mailing_id.';'.$conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY), 'md5')."',";

-				$sql .= "'".$this->db->escape($targetarray['source_type'])."')";

-				dol_syslog(__METHOD__, LOG_DEBUG);

-				$result = $this->db->query($sql);

-				if ($result)

-				{

-					$j++;

-				} else {

-					if ($this->db->errno() != 'DB_ERROR_RECORD_ALREADY_EXISTS')

-					{

-						// Si erreur autre que doublon

-						dol_syslog($this->db->error().' : '.$targetarray['email']);

-						$this->error = $this->db->error().' : '.$targetarray['email'];

-						$this->db->rollback();

-						return -1;

-					}

-				}

-			}

-		}

-

-		dol_syslog(__METHOD__.": mailing ".$j." targets added");

-

-		/*

+     *

+     *  @return     integer      Example

+     */

+    public function getNbOfRecords()

+    {

+        return 0;

+    }

+

+    /**

+     * Retourne nombre de destinataires

+     *

+     * @param      string	$sql        Sql request to count

+     * @return     int       			Nb of recipient, or <0 if error

+     */

+    public function getNbOfRecipients($sql)

+    {

+        $result = $this->db->query($sql);

+        if ($result)

+        {

+            $obj = $this->db->fetch_object($result);

+            return $obj->nb;

+        }

+        else

+        {

+        	$this->error = $this->db->lasterror();

+            return -1;

+        }

+    }

+

+    /**

+     * Affiche formulaire de filtre qui apparait dans page de selection

+     * des destinataires de mailings

+     *

+     * @return     string      Retourne zone select

+     */

+    public function formFilter()

+    {

+        return '';

+    }

+

+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

+    /**

+     * Met a jour nombre de destinataires

+     *

+     * @param	int		$mailing_id          Id of emailing

+     * @return  int			                 < 0 si erreur, nb destinataires si ok

+     */

+    public function update_nb($mailing_id)

+    {

+        // phpcs:enable

+        // Mise a jour nombre de destinataire dans table des mailings

+        $sql = "SELECT COUNT(*) nb FROM ".MAIN_DB_PREFIX."mailing_cibles";

+        $sql .= " WHERE fk_mailing = ".$mailing_id;

+        $result = $this->db->query($sql);

+        if ($result)

+        {

+            $obj = $this->db->fetch_object($result);

+            $nb = $obj->nb;

+

+            $sql = "UPDATE ".MAIN_DB_PREFIX."mailing";

+            $sql .= " SET nbemail = ".$nb." WHERE rowid = ".$mailing_id;

+            if (!$this->db->query($sql))

+            {

+                dol_syslog($this->db->error());

+                $this->error = $this->db->error();

+                return -1;

+            }

+        }

+        else {

+            return -1;

+        }

+        return $nb;

+    }

+

+    /**

+     * Add a list of targets int the database

+     *

+     * @param	int		$mailing_id    Id of emailing

+     * @param   array	$cibles        Array with targets

+     * @return  int      			   < 0 si erreur, nb ajout si ok

+     */

+    public function addTargetsToDatabase($mailing_id, $cibles)

+    {

+    	global $conf;

+

+    	$this->db->begin();

+

+        // Insert emailing targets from array into database

+        $j = 0;

+        $num = count($cibles);

+        foreach ($cibles as $targetarray)

+        {

+        	if (!empty($targetarray['email'])) // avoid empty email address

+        	{

+        		$sql = "INSERT INTO ".MAIN_DB_PREFIX."mailing_cibles";

+        		$sql .= " (fk_mailing,";

+        		$sql .= " fk_contact,";

+        		$sql .= " lastname, firstname, email, other, source_url, source_id,";

+       			$sql .= " tag,";

+        		$sql .= " source_type)";

+        		$sql .= " VALUES (".$mailing_id.",";

+        		$sql .= (empty($targetarray['fk_contact']) ? '0' : "'".$targetarray['fk_contact']."'").",";

+        		$sql .= "'".$this->db->escape($targetarray['lastname'])."',";

+        		$sql .= "'".$this->db->escape($targetarray['firstname'])."',";

+        		$sql .= "'".$this->db->escape($targetarray['email'])."',";

+        		$sql .= "'".$this->db->escape($targetarray['other'])."',";

+        		$sql .= "'".$this->db->escape($targetarray['source_url'])."',";

+        		$sql .= (empty($targetarray['source_id']) ? 'null' : "'".$this->db->escape($targetarray['source_id'])."'").",";

+       			$sql .= "'".$this->db->escape(dol_hash($targetarray['email'].';'.$targetarray['lastname'].';'.$mailing_id.';'.$conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY))."',";

+        		$sql .= "'".$this->db->escape($targetarray['source_type'])."')";

+        		dol_syslog(__METHOD__, LOG_DEBUG);

+        		$result = $this->db->query($sql);

+        		if ($result)

+        		{

+        			$j++;

+        		}

+        		else

+        		{

+        			if ($this->db->errno() != 'DB_ERROR_RECORD_ALREADY_EXISTS')

+        			{

+        				// Si erreur autre que doublon

+        				dol_syslog($this->db->error().' : '.$targetarray['email']);

+        				$this->error = $this->db->error().' : '.$targetarray['email'];

+        				$this->db->rollback();

+        				return -1;

+        			}

+        		}

+        	}

+        }

+

+        dol_syslog(__METHOD__.": mailing ".$j." targets added");

+

+        /*

         //Update the status to show thirdparty mail that don't want to be contacted anymore'

         $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles";

         $sql .= " SET statut=3";

@@ -223,42 +227,42 @@
         $result=$this->db->query($sql);

 		*/

 

-		$sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles";

-		$sql .= " SET statut=3";

-		$sql .= " WHERE fk_mailing=".$mailing_id." AND email IN (SELECT mu.email FROM ".MAIN_DB_PREFIX."mailing_unsubscribe AS mu WHERE mu.entity IN ('".getEntity('mailing')."'))";

-

-		dol_syslog(__METHOD__.":mailing update status to display emails that do not want to be contacted anymore", LOG_DEBUG);

-		$result = $this->db->query($sql);

-		if (!$result)

-		{

-			dol_print_error($this->db);

-		}

-

-		$this->update_nb($mailing_id);

-

-		$this->db->commit();

-

-		return $j;

-	}

-

-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

-	/**

-	 *  Supprime tous les destinataires de la table des cibles

-	 *

-	 *  @param  int		$mailing_id        Id of emailing

-	 *  @return	void

-	 */

-	public function clear_target($mailing_id)

-	{

-		// phpcs:enable

-		$sql = "DELETE FROM ".MAIN_DB_PREFIX."mailing_cibles";

-		$sql .= " WHERE fk_mailing = ".$mailing_id;

-

-		if (!$this->db->query($sql))

-		{

-			dol_syslog($this->db->error());

-		}

-

-		$this->update_nb($mailing_id);

-	}

+        $sql = "UPDATE ".MAIN_DB_PREFIX."mailing_cibles";

+        $sql .= " SET statut=3";

+        $sql .= " WHERE fk_mailing=".$mailing_id." AND email IN (SELECT mu.email FROM ".MAIN_DB_PREFIX."mailing_unsubscribe AS mu WHERE mu.entity IN ('".getEntity('mailing')."'))";

+

+        dol_syslog(__METHOD__.":mailing update status to display emails that do not want to be contacted anymore", LOG_DEBUG);

+        $result = $this->db->query($sql);

+        if (!$result)

+        {

+        	dol_print_error($this->db);

+        }

+

+        $this->update_nb($mailing_id);

+

+        $this->db->commit();

+

+        return $j;

+    }

+

+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

+    /**

+     *  Supprime tous les destinataires de la table des cibles

+     *

+     *  @param  int		$mailing_id        Id of emailing

+     *  @return	void

+     */

+    public function clear_target($mailing_id)

+    {

+        // phpcs:enable

+        $sql = "DELETE FROM ".MAIN_DB_PREFIX."mailing_cibles";

+        $sql .= " WHERE fk_mailing = ".$mailing_id;

+

+        if (!$this->db->query($sql))

+        {

+            dol_syslog($this->db->error());

+        }

+

+        $this->update_nb($mailing_id);

+    }

 }

--- /tmp/dsg/dolibarr/htdocs/core/modules/mailings/github_pomme.modules.php
+++ /tmp/dsg/dolibarr/htdocs/core/modules/mailings/client_pomme.modules.php
@@ -42,9 +42,9 @@
 	public $picto = 'user';

 

 	/**

-	 * @var DoliDB Database handler.

-	 */

-	public $db;

+     * @var DoliDB Database handler.

+     */

+    public $db;

 

 

 	/**

@@ -52,13 +52,13 @@
 	 *

 	 *  @param		DoliDB		$db      Database handler

 	 */

-	public function __construct($db)

+    public function __construct($db)

 	{

 		$this->db = $db;

 	}

 

 

-	/**

+    /**

 	 *	On the main mailing area, there is a box with statistics.

 	 *	If you want to add a line in this report you must provide an

 	 *	array of SQL request that returns two field:

@@ -66,14 +66,14 @@
 	 *

 	 *	@return		string[]		Array with SQL requests

 	 */

-	public function getSqlArrayForStats()

+    public function getSqlArrayForStats()

 	{

 		global $conf, $langs;

 

 		$langs->load("users");

 

 		$statssql = array();

-		$sql = "SELECT '".$this->db->escape($langs->trans("DolibarrUsers"))."' as label,";

+		$sql = "SELECT '".$langs->trans("DolibarrUsers")."' as label,";

 		$sql .= " count(distinct(u.email)) as nb";

 		$sql .= " FROM ".MAIN_DB_PREFIX."user as u";

 		$sql .= " WHERE u.email != ''"; // u.email IS NOT NULL est implicite dans ce test

@@ -84,15 +84,15 @@
 	}

 

 

-	/**

-	 *	Return here number of distinct emails returned by your selector.

-	 *	For example if this selector is used to extract 500 different

-	 *	emails from a text file, this function must return 500.

-	 *

-	 *	@param	string	$sql		SQL request to use to count

-	 *	@return	int					Number of recipients

-	 */

-	public function getNbOfRecipients($sql = '')

+    /**

+     *	Return here number of distinct emails returned by your selector.

+     *	For example if this selector is used to extract 500 different

+     *	emails from a text file, this function must return 500.

+     *

+     *	@param	string	$sql		SQL request to use to count

+     *	@return	int					Number of recipients

+     */

+    public function getNbOfRecipients($sql = '')

 	{

 		global $conf;

 

@@ -112,7 +112,7 @@
 	 *

 	 *  @return     string      Retourne zone select

 	 */

-	public function formFilter()

+    public function formFilter()

 	{

 		global $langs;

 

@@ -141,26 +141,26 @@
 	/**

 	 *  Renvoie url lien vers fiche de la source du destinataire du mailing

 	 *

-	 *  @param	int		$id		ID

+     *  @param	int		$id		ID

 	 *  @return     string      Url lien

 	 */

-	public function url($id)

+    public function url($id)

 	{

 		return '<a href="'.DOL_URL_ROOT.'/user/card.php?id='.$id.'">'.img_object('', "user").'</a>';

 	}

 

 

-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

 	/**

 	 *  Ajoute destinataires dans table des cibles

 	 *

 	 *  @param	int		$mailing_id    	Id of emailing

 	 *  @return int           			< 0 si erreur, nb ajout si ok

 	 */

-	public function add_to_target($mailing_id)

-	{

-		// phpcs:enable

-		global $conf, $langs;

+    public function add_to_target($mailing_id)

+	{

+        // phpcs:enable

+	    global $conf, $langs;

 		$langs->load("companies");

 

 		$cibles = array();

@@ -172,10 +172,10 @@
 		$sql .= " WHERE u.email <> ''"; // u.email IS NOT NULL est implicite dans ce test

 		$sql .= " AND u.entity IN (0,".$conf->entity.")";

 		$sql .= " AND u.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";

-		if (GETPOSTISSET("filter") && GETPOST("filter") == '1') $sql .= " AND u.statut=1";

-		if (GETPOSTISSET("filter") && GETPOST("filter") == '0') $sql .= " AND u.statut=0";

-		if (GETPOSTISSET("filteremployee") && GETPOSt("filteremployee") == '1') $sql .= " AND u.employee=1";

-		if (GETPOSTISSET("filteremployee") && GETPOST("filteremployee") == '0') $sql .= " AND u.employee=0";

+		if (isset($_POST["filter"]) && $_POST["filter"] == '1') $sql .= " AND u.statut=1";

+		if (isset($_POST["filter"]) && $_POST["filter"] == '0') $sql .= " AND u.statut=0";

+		if (isset($_POST["filteremployee"]) && $_POST["filteremployee"] == '1') $sql .= " AND u.employee=1";

+		if (isset($_POST["filteremployee"]) && $_POST["filteremployee"] == '0') $sql .= " AND u.employee=0";

 		$sql .= " ORDER BY u.email";

 

 		// Stocke destinataires dans cibles

@@ -195,17 +195,17 @@
 				if ($old <> $obj->email)

 				{

 					$cibles[$j] = array(

-						'email' => $obj->email,

-						'fk_contact' => $obj->fk_contact,

-						'lastname' => $obj->lastname,

-						'firstname' => $obj->firstname,

-						'other' =>

-							($langs->transnoentities("Login").'='.$obj->login).';'.

-							($langs->transnoentities("UserTitle").'='.$obj->civility_id).';'.

-							($langs->transnoentities("PhonePro").'='.$obj->office_phone),

-						'source_url' => $this->url($obj->id),

-						'source_id' => $obj->id,

-						'source_type' => 'user'

+                    	'email' => $obj->email,

+                    	'fk_contact' => $obj->fk_contact,

+                    	'lastname' => $obj->lastname,

+                    	'firstname' => $obj->firstname,

+                    	'other' =>

+					        ($langs->transnoentities("Login").'='.$obj->login).';'.

+                            ($langs->transnoentities("UserTitle").'='.$obj->civility_id).';'.

+					        ($langs->transnoentities("PhonePro").'='.$obj->office_phone),

+                        'source_url' => $this->url($obj->id),

+                        'source_id' => $obj->id,

+                        'source_type' => 'user'

 					);

 					$old = $obj->email;

 					$j++;

@@ -213,12 +213,14 @@
 

 				$i++;

 			}

-		} else {

+		}

+		else

+		{

 			dol_syslog($this->db->error());

 			$this->error = $this->db->error();

 			return -1;

 		}

 

 		return parent::addTargetsToDatabase($mailing_id, $cibles);

-	}

+    }

 }

--- /tmp/dsg/dolibarr/htdocs/core/modules/mailings/github_thirdparties.modules.php
+++ /tmp/dsg/dolibarr/htdocs/core/modules/mailings/client_thirdparties.modules.php
@@ -37,9 +37,9 @@
 	public $picto = 'company';

 

 	/**

-	 * @var DoliDB Database handler.

-	 */

-	public $db;

+     * @var DoliDB Database handler.

+     */

+    public $db;

 

 

 	/**

@@ -47,95 +47,108 @@
 	 *

 	 *  @param		DoliDB		$db      Database handler

 	 */

-	public function __construct($db)

+    public function __construct($db)

 	{

 		global $conf, $langs;

-		$langs->load("companies");

+        $langs->load("companies");

 

 		$this->db = $db;

 	}

 

 

-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

 	/**

 	 *    This is the main function that returns the array of emails

 	 *

 	 *    @param	int		$mailing_id    	Id of mailing. No need to use it.

 	 *    @return   int 					<0 if error, number of emails added if ok

 	 */

-	public function add_to_target($mailing_id)

-	{

-		// phpcs:enable

+    public function add_to_target($mailing_id)

+	{

+        // phpcs:enable

 		global $conf, $langs;

 

 		$cibles = array();

 

-		$addDescription = "";

+        $addDescription = "";

 		// Select the third parties from category

 		if (empty($_POST['filter']))

 		{

-			$sql = "SELECT s.rowid as id, s.email as email, s.nom as name, null as fk_contact, null as firstname, null as label";

-			$sql .= " FROM ".MAIN_DB_PREFIX."societe as s";

-			$sql .= " WHERE s.email <> ''";

-			$sql .= " AND s.entity IN (".getEntity('societe').")";

-			$sql .= " AND s.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";

-		} else {

-			$addFilter = "";

-			if (GETPOSTISSET("filter_client") && GETPOST("filter_client") <> '-1') {

-				$addFilter .= " AND s.client=".((int) GETPOST("filter_client", 'int'));

-				$addDescription = $langs->trans('ProspectCustomer')."=";

-				if ($_POST["filter_client"] == 0)

-				{

-					$addDescription .= $langs->trans('NorProspectNorCustomer');

-				} elseif ($_POST["filter_client"] == 1)

-				{

-					$addDescription .= $langs->trans('Customer');

-				} elseif ($_POST["filter_client"] == 2)

-				{

-					$addDescription .= $langs->trans('Prospect');

-				} elseif ($_POST["filter_client"] == 3)

-				{

-					$addDescription .= $langs->trans('ProspectCustomer');

-				} else {

-					$addDescription .= "Unknown status ".GETPOST("filter_client");

-				}

-			}

-			if (GETPOSTISSET("filter_status")) {

-				if (strlen($addDescription) > 0) {

-					$addDescription .= ";";

-				}

-				$addDescription .= $langs->trans("Status")."=";

-				if (GETPOST("filter_status") == '1') {

-					$addFilter .= " AND s.status=1";

-					$addDescription .= $langs->trans("Enabled");

-				} else {

-					$addFilter .= " AND s.status=0";

-					$addDescription .= $langs->trans("Disabled");

-				}

-			}

-			$sql = "SELECT s.rowid as id, s.email as email, s.nom as name, null as fk_contact, null as firstname, c.label as label";

-			$sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."categorie_societe as cs, ".MAIN_DB_PREFIX."categorie as c";

-			$sql .= " WHERE s.email <> ''";

-			$sql .= " AND s.entity IN (".getEntity('societe').")";

-			$sql .= " AND s.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";

-			$sql .= " AND cs.fk_soc = s.rowid";

-			$sql .= " AND c.rowid = cs.fk_categorie";

-			$sql .= " AND c.rowid=".((int) GETPOST('filter', 'int'));

-			$sql .= $addFilter;

-			$sql .= " UNION ";

-			$sql .= "SELECT s.rowid as id, s.email as email, s.nom as name, null as fk_contact, null as firstname, c.label as label";

-			$sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."categorie_fournisseur as cs, ".MAIN_DB_PREFIX."categorie as c";

-			$sql .= " WHERE s.email <> ''";

-			$sql .= " AND s.entity IN (".getEntity('societe').")";

-			$sql .= " AND s.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";

-			$sql .= " AND cs.fk_soc = s.rowid";

-			$sql .= " AND c.rowid = cs.fk_categorie";

-			$sql .= " AND c.rowid=".((int) GETPOST('filter', 'int'));

-			$sql .= $addFilter;

-		}

-		$sql .= " ORDER BY email";

-

-		// Stock recipients emails into targets table

+		    $sql = "SELECT s.rowid as id, s.email as email, s.nom as name, null as fk_contact, null as firstname, null as label";

+		    $sql .= " FROM ".MAIN_DB_PREFIX."societe as s";

+		    $sql .= " WHERE s.email <> ''";

+		    $sql .= " AND s.entity IN (".getEntity('societe').")";

+		    $sql .= " AND s.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";

+		}

+		else

+		{

+            $addFilter = "";

+            if (isset($_POST["filter_client"]) && $_POST["filter_client"] <> '-1')

+            {

+                $addFilter .= " AND s.client=".$_POST["filter_client"];

+                $addDescription = $langs->trans('ProspectCustomer')."=";

+                if ($_POST["filter_client"] == 0)

+                {

+                    $addDescription .= $langs->trans('NorProspectNorCustomer');

+                }

+                elseif ($_POST["filter_client"] == 1)

+                {

+                    $addDescription .= $langs->trans('Customer');

+                }

+                elseif ($_POST["filter_client"] == 2)

+                {

+                    $addDescription .= $langs->trans('Prospect');

+                }

+                elseif ($_POST["filter_client"] == 3)

+                {

+                    $addDescription .= $langs->trans('ProspectCustomer');

+                }

+                else

+                {

+                    $addDescription .= "Unknown status ".$_POST["filter_client"];

+                }

+            }

+            if (isset($_POST["filter_status"]))

+            {

+                if (strlen($addDescription) > 0)

+                {

+                    $addDescription .= ";";

+                }

+                $addDescription .= $langs->trans("Status")."=";

+                if ($_POST["filter_status"] == '1')

+                {

+                    $addFilter .= " AND s.status=1";

+                    $addDescription .= $langs->trans("Enabled");

+                }

+                else

+                {

+                    $addFilter .= " AND s.status=0";

+                    $addDescription .= $langs->trans("Disabled");

+                }

+            }

+		    $sql = "SELECT s.rowid as id, s.email as email, s.nom as name, null as fk_contact, null as firstname, c.label as label";

+		    $sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."categorie_societe as cs, ".MAIN_DB_PREFIX."categorie as c";

+		    $sql .= " WHERE s.email <> ''";

+		    $sql .= " AND s.entity IN (".getEntity('societe').")";

+		    $sql .= " AND s.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";

+		    $sql .= " AND cs.fk_soc = s.rowid";

+		    $sql .= " AND c.rowid = cs.fk_categorie";

+		    $sql .= " AND c.rowid='".$this->db->escape($_POST['filter'])."'";

+            $sql .= $addFilter;

+		    $sql .= " UNION ";

+		    $sql .= "SELECT s.rowid as id, s.email as email, s.nom as name, null as fk_contact, null as firstname, c.label as label";

+		    $sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."categorie_fournisseur as cs, ".MAIN_DB_PREFIX."categorie as c";

+		    $sql .= " WHERE s.email <> ''";

+		    $sql .= " AND s.entity IN (".getEntity('societe').")";

+		    $sql .= " AND s.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";

+		    $sql .= " AND cs.fk_soc = s.rowid";

+		    $sql .= " AND c.rowid = cs.fk_categorie";

+		    $sql .= " AND c.rowid='".$this->db->escape($_POST['filter'])."'";

+            $sql .= $addFilter;

+        }

+        $sql .= " ORDER BY email";

+

+        // Stock recipients emails into targets table

 		$result = $this->db->query($sql);

 		if ($result)

 		{

@@ -158,14 +171,14 @@
 					}

 					$otherTxt .= $addDescription;

 					$cibles[$j] = array(

-								'email' => $obj->email,

-								'fk_contact' => $obj->fk_contact,

-								'lastname' => $obj->name, // For a thirdparty, we must use name

-								'firstname' => '', // For a thirdparty, lastname is ''

-								'other' => $otherTxt,

-								'source_url' => $this->url($obj->id),

-								'source_id' => $obj->id,

-								'source_type' => 'thirdparty'

+                    			'email' => $obj->email,

+                    			'fk_contact' => $obj->fk_contact,

+                    			'lastname' => $obj->name, // For a thirdparty, we must use name

+                    			'firstname' => '', // For a thirdparty, lastname is ''

+                    			'other' => $otherTxt,

+                                'source_url' => $this->url($obj->id),

+                                'source_id' => $obj->id,

+                                'source_type' => 'thirdparty'

 					);

 					$old = $obj->email;

 					$j++;

@@ -173,7 +186,9 @@
 

 				$i++;

 			}

-		} else {

+		}

+		else

+		{

 			dol_syslog($this->db->error());

 			$this->error = $this->db->error();

 			return -1;

@@ -183,7 +198,7 @@
 	}

 

 

-	/**

+    /**

 	 *	On the main mailing area, there is a box with statistics.

 	 *	If you want to add a line in this report you must provide an

 	 *	array of SQL request that returns two field:

@@ -191,7 +206,7 @@
 	 *

 	 *	@return		array		Array with SQL requests

 	 */

-	public function getSqlArrayForStats()

+    public function getSqlArrayForStats()

 	{

 		// CHANGE THIS: Optionnal

 

@@ -209,7 +224,7 @@
 	 *  @param      string	$sql        Requete sql de comptage

 	 *	@return		int					Nb of recipients

 	 */

-	public function getNbOfRecipients($sql = '')

+    public function getNbOfRecipients($sql = '')

 	{

 		global $conf;

 

@@ -229,7 +244,7 @@
 	 *

 	 *  @return     string      A html select zone

 	 */

-	public function formFilter()

+    public function formFilter()

 	{

 		global $conf, $langs;

 

@@ -270,44 +285,46 @@
 				$s .= '</option>';

 				$i++;

 			}

-		} else {

+		}

+		else

+		{

 			dol_print_error($this->db);

 		}

 

 		$s .= '</select> ';

-		$s .= $langs->trans('ProspectCustomer');

-		$s .= ': <select name="filter_client" class="flat">';

-		$s .= '<option value="-1">&nbsp;</option>';

-		if (empty($conf->global->SOCIETE_DISABLE_PROSPECTS)) {

-			$s .= '<option value="2">'.$langs->trans('Prospect').'</option>';

-		}

-		if (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS) && empty($conf->global->SOCIETE_DISABLE_PROSPECTSCUSTOMERS)) {

-			$s .= '<option value="3">'.$langs->trans('ProspectCustomer').'</option>';

-		}

-		if (empty($conf->global->SOCIETE_DISABLE_CUSTOMERS)) {

-			$s .= '<option value="1">'.$langs->trans('Customer').'</option>';

-		}

-		$s .= '<option value="0">'.$langs->trans('NorProspectNorCustomer').'</option>';

-

-		$s .= '</select> ';

-

-		$s .= $langs->trans("Status");

-		$s .= ': <select name="filter_status" class="flat">';

-		$s .= '<option value="-1">&nbsp;</option>';

-		$s .= '<option value="1" selected>'.$langs->trans("Enabled").'</option>';

-		$s .= '<option value="0">'.$langs->trans("Disabled").'</option>';

-		$s .= '</select>';

+        $s .= $langs->trans('ProspectCustomer');

+        $s .= ': <select name="filter_client" class="flat">';

+        $s .= '<option value="-1">&nbsp;</option>';

+        if (empty($conf->global->SOCIETE_DISABLE_PROSPECTS)) {

+            $s .= '<option value="2">'.$langs->trans('Prospect').'</option>';

+        }

+        if (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS) && empty($conf->global->SOCIETE_DISABLE_PROSPECTSCUSTOMERS)) {

+            $s .= '<option value="3">'.$langs->trans('ProspectCustomer').'</option>';

+        }

+        if (empty($conf->global->SOCIETE_DISABLE_CUSTOMERS)) {

+            $s .= '<option value="1">'.$langs->trans('Customer').'</option>';

+        }

+        $s .= '<option value="0">'.$langs->trans('NorProspectNorCustomer').'</option>';

+

+        $s .= '</select> ';

+

+        $s .= $langs->trans("Status");

+        $s .= ': <select name="filter_status" class="flat">';

+        $s .= '<option value="-1">&nbsp;</option>';

+        $s .= '<option value="1" selected>'.$langs->trans("Enabled").'</option>';

+        $s .= '<option value="0">'.$langs->trans("Disabled").'</option>';

+        $s .= '</select>';

 		return $s;

 	}

 

 

-	/**

+    /**

 	 *  Can include an URL link on each record provided by selector shown on target page.

 	 *

-	 *  @param	int		$id		ID

+     *  @param	int		$id		ID

 	 *  @return string      	Url link

 	 */

-	public function url($id)

+    public function url($id)

 	{

 		return '<a href="'.DOL_URL_ROOT.'/societe/card.php?socid='.$id.'">'.img_object('', "company").'</a>';

 	}

--- /tmp/dsg/dolibarr/htdocs/core/modules/mailings/github_thirdparties_services_expired.modules.php
+++ /tmp/dsg/dolibarr/htdocs/core/modules/mailings/client_thirdparties_services_expired.modules.php
@@ -22,224 +22,228 @@
  */

 class mailing_thirdparties_services_expired extends MailingTargets

 {

-	public $name = 'DolibarrContractsLinesExpired';

+    public $name = 'DolibarrContractsLinesExpired';

 	// This label is used if no translation is found for key XXX neither MailingModuleDescXXX where XXX=name is found

-	public $desc = 'Third parties with expired contract\'s lines';

-	public $require_admin = 0;

-

-	public $require_module = array('contrat');

-

-	/**

-	 * @var string String with name of icon for myobject. Must be the part after the 'object_' into object_myobject.png

-	 */

-	public $picto = 'company';

-

-	/**

-	 * @var DoliDB Database handler.

-	 */

-	public $db;

-

-	public $arrayofproducts = array();

-

-

-	/**

-	 *	Constructor

-	 *

-	 *  @param		DoliDB		$db      Database handler

-	 */

-	public function __construct($db)

-	{

-		global $conf;

-

-		$this->db = $db;

-

-		$this->arrayofproducts = array();

-

-		// List of services

-		$sql = "SELECT ref FROM ".MAIN_DB_PREFIX."product";

-		$sql .= " WHERE entity IN (".getEntity('product').")";

-		if (empty($conf->global->CONTRACT_SUPPORT_PRODUCTS)) $sql .= " AND fk_product_type = 1"; // By default, only services

-		$sql .= " ORDER BY ref";

-		$result = $this->db->query($sql);

-		if ($result)

-		{

-			$num = $this->db->num_rows($result);

-			dol_syslog("dolibarr_services_expired.modules.php:mailing_dolibarr_services_expired ".$num." services found");

-

-			$i = 0;

-			while ($i < $num)

-			{

-				$obj = $this->db->fetch_object($result);

-				$i++;

-				$this->arrayofproducts[$i] = $obj->ref;

-			}

-		} else {

-			dol_print_error($this->db);

-		}

-	}

-

-

-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

-	/**

-	 *  This is the main function that returns the array of emails

-	 *

-	 *  @param	int		$mailing_id    	Id of mailing. No need to use it.

-	 *  @return int           			<0 if error, number of emails added if ok

-	 */

-	public function add_to_target($mailing_id)

-	{

-		// phpcs:enable

-		$key = GETPOST('filter', 'int');

-

-		$cibles = array();

-		$j = 0;

-

-		$product = '';

-		if ($key == '0')

-		{

-			$this->error = "Error: You must choose a filter";

-			$this->errors[] = $this->error;

-			return $this->error;

-		}

-

-		$product = $this->arrayofproducts[$key];

-

-		$now = dol_now();

-

-		// La requete doit retourner: id, email, name

-		$sql = "SELECT s.rowid as id, s.email, s.nom as name, cd.rowid as cdid, cd.date_ouverture, cd.date_fin_validite, cd.fk_contrat";

-		$sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."contrat as c";

-		$sql .= ", ".MAIN_DB_PREFIX."contratdet as cd, ".MAIN_DB_PREFIX."product as p";

-		$sql .= " WHERE s.entity IN (".getEntity('societe').")";

-		$sql .= " AND s.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";

-		$sql .= " AND s.rowid = c.fk_soc AND cd.fk_contrat = c.rowid AND s.email != ''";

-		$sql .= " AND cd.statut= 4 AND cd.fk_product=p.rowid AND p.ref = '".$this->db->escape($product)."'";

-		$sql .= " AND cd.date_fin_validite < '".$this->db->idate($now)."'";

-		$sql .= " ORDER BY s.email";

-

-		// Stocke destinataires dans cibles

-		$result = $this->db->query($sql);

-		if ($result)

-		{

-			$num = $this->db->num_rows($result);

-			$i = 0;

-

-			dol_syslog(get_class($this)."::add_to_target ".$num." targets found");

-

-			$old = '';

-			while ($i < $num)

-			{

-				$obj = $this->db->fetch_object($result);

-				if ($old <> $obj->email)

-				{

-					$cibles[$j] = array(

+    public $desc = 'Third parties with expired contract\'s lines';

+    public $require_admin = 0;

+

+    public $require_module = array('contrat');

+

+    /**

+     * @var string String with name of icon for myobject. Must be the part after the 'object_' into object_myobject.png

+     */

+    public $picto = 'company';

+

+    /**

+     * @var DoliDB Database handler.

+     */

+    public $db;

+

+    public $arrayofproducts = array();

+

+

+    /**

+     *	Constructor

+     *

+     *  @param		DoliDB		$db      Database handler

+     */

+    public function __construct($db)

+    {

+    	global $conf;

+

+        $this->db = $db;

+

+        $this->arrayofproducts = array();

+

+        // List of services

+        $sql = "SELECT ref FROM ".MAIN_DB_PREFIX."product";

+        $sql .= " WHERE entity IN (".getEntity('product').")";

+        if (empty($conf->global->CONTRACT_SUPPORT_PRODUCTS)) $sql .= " AND fk_product_type = 1"; // By default, only services

+        $sql .= " ORDER BY ref";

+        $result = $this->db->query($sql);

+        if ($result)

+        {

+            $num = $this->db->num_rows($result);

+            dol_syslog("dolibarr_services_expired.modules.php:mailing_dolibarr_services_expired ".$num." services found");

+

+            $i = 0;

+            while ($i < $num)

+            {

+                $obj = $this->db->fetch_object($result);

+                $i++;

+                $this->arrayofproducts[$i] = $obj->ref;

+            }

+        }

+        else

+        {

+            dol_print_error($this->db);

+        }

+    }

+

+

+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

+    /**

+     *  This is the main function that returns the array of emails

+     *

+     *  @param	int		$mailing_id    	Id of mailing. No need to use it.

+     *  @return int           			<0 if error, number of emails added if ok

+     */

+    public function add_to_target($mailing_id)

+    {

+        // phpcs:enable

+        $key = GETPOST('filter', 'int');

+

+        $cibles = array();

+        $j = 0;

+

+        $product = '';

+        if ($key == '0')

+        {

+        	$this->error = "Error: You must choose a filter";

+        	$this->errors[] = $this->error;

+        	return $this->error;

+        }

+

+        $product = $this->arrayofproducts[$key];

+

+        $now = dol_now();

+

+        // La requete doit retourner: id, email, name

+        $sql = "SELECT s.rowid as id, s.email, s.nom as name, cd.rowid as cdid, cd.date_ouverture, cd.date_fin_validite, cd.fk_contrat";

+        $sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."contrat as c";

+        $sql .= ", ".MAIN_DB_PREFIX."contratdet as cd, ".MAIN_DB_PREFIX."product as p";

+        $sql .= " WHERE s.entity IN (".getEntity('societe').")";

+        $sql .= " AND s.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";

+        $sql .= " AND s.rowid = c.fk_soc AND cd.fk_contrat = c.rowid AND s.email != ''";

+        $sql .= " AND cd.statut= 4 AND cd.fk_product=p.rowid AND p.ref = '".$product."'";

+        $sql .= " AND cd.date_fin_validite < '".$this->db->idate($now)."'";

+        $sql .= " ORDER BY s.email";

+

+        // Stocke destinataires dans cibles

+        $result = $this->db->query($sql);

+        if ($result)

+        {

+            $num = $this->db->num_rows($result);

+            $i = 0;

+

+            dol_syslog(get_class($this)."::add_to_target ".$num." targets found");

+

+            $old = '';

+            while ($i < $num)

+            {

+                $obj = $this->db->fetch_object($result);

+                if ($old <> $obj->email)

+                {

+                    $cibles[$j] = array(

 					'email' => $obj->email,

 					'lastname' => $obj->name, // For thirdparties, lastname must be name

-					'firstname' => '', // For thirdparties, firstname is ''

+                    'firstname' => '', // For thirdparties, firstname is ''

 					'other' =>

-					('DateStart='.dol_print_date($this->db->jdate($obj->date_ouverture), 'day')).';'.

-					('DateEnd='.dol_print_date($this->db->jdate($obj->date_fin_validite), 'day')).';'.

-					('Contract='.$obj->fk_contrat).';'.

-					('ContactLine='.$obj->cdid),

+                    ('DateStart='.dol_print_date($this->db->jdate($obj->date_ouverture), 'day')).';'.

+                    ('DateEnd='.dol_print_date($this->db->jdate($obj->date_fin_validite), 'day')).';'.

+                    ('Contract='.$obj->fk_contrat).';'.

+                    ('ContactLine='.$obj->cdid),

 					'source_url' => $this->url($obj->id),

 					'source_id' => $obj->id,

 					'source_type' => 'thirdparty'

-					);

-					$old = $obj->email;

-					$j++;

-				}

-

-				$i++;

-			}

-		} else {

-			dol_syslog($this->db->lasterror());

-			$this->error = $this->db->lasterror();

-			return -1;

-		}

-

-		// ----- Your code end here -----

-

-		return parent::addTargetsToDatabase($mailing_id, $cibles);

-	}

-

-

-	/**

-	 *	On the main mailing area, there is a box with statistics.

-	 *	If you want to add a line in this report you must provide an

-	 *	array of SQL request that returns two field:

-	 *	One called "label", One called "nb".

-	 *

-	 *	@return		array		Array with SQL requests

-	 */

-	public function getSqlArrayForStats()

-	{

-

-		//var $statssql=array();

-		//$this->statssql[0]="SELECT field1 as label, count(distinct(email)) as nb FROM mytable WHERE email IS NOT NULL";

-

-		return array();

-	}

-

-

-	/**

-	 *	Return here number of distinct emails returned by your selector.

-	 *	For example if this selector is used to extract 500 different

-	 *	emails from a text file, this function must return 500.

-	 *

-	 *	@param	string	$sql		SQL request to use to count

-	 *	@return	int					Number of recipients

-	 */

-	public function getNbOfRecipients($sql = '')

-	{

-		$now = dol_now();

-

-		// Example: return parent::getNbOfRecipients("SELECT count(*) as nb from dolibarr_table");

-		// Example: return 500;

-		$sql = "SELECT count(*) as nb";

-		$sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."contrat as c";

-		$sql .= ", ".MAIN_DB_PREFIX."contratdet as cd, ".MAIN_DB_PREFIX."product as p";

-		$sql .= " WHERE s.entity IN (".getEntity('societe').")";

-		$sql .= " AND s.rowid = c.fk_soc AND cd.fk_contrat = c.rowid AND s.email != ''";

-		$sql .= " AND cd.statut= 4 AND cd.fk_product=p.rowid";

-		$sql .= " AND p.ref IN ('".join("','", $this->arrayofproducts)."')";

-		$sql .= " AND cd.date_fin_validite < '".$this->db->idate($now)."'";

-

-		$a = parent::getNbOfRecipients($sql);

-

-		return $a;

-	}

-

-	/**

-	 *  This is to add a form filter to provide variant of selector

-	 *	If used, the HTML select must be called "filter"

-	 *

-	 *  @return     string      A html select zone

-	 */

-	public function formFilter()

-	{

-		global $langs;

-

-		$s = $langs->trans("ProductOrService");

-		$s .= '<select name="filter" class="flat">';

-		if (count($this->arrayofproducts)) $s .= '<option value="0">&nbsp;</option>';

-		else $s .= '<option value="0">'.$langs->trans("ContactsAllShort").'</option>';

-		foreach ($this->arrayofproducts as $key => $val)

-		{

-			$s .= '<option value="'.$key.'">'.$val.'</option>';

-		}

-		$s .= '</select>';

-		return $s;

-	}

-

-

-	/**

-	 *  Can include an URL link on each record provided by selector	shown on target page.

-	 *

-	 *  @param	int		$id		ID

-	 *  @return string      	Url link

-	 */

-	public function url($id)

-	{

-		return '<a href="'.DOL_URL_ROOT.'/societe/card.php?socid='.$id.'">'.img_object('', "company").'</a>';

-	}

+                    );

+                    $old = $obj->email;

+                    $j++;

+                }

+

+                $i++;

+            }

+        }

+        else

+        {

+            dol_syslog($this->db->lasterror());

+            $this->error = $this->db->lasterror();

+            return -1;

+        }

+

+        // ----- Your code end here -----

+

+        return parent::addTargetsToDatabase($mailing_id, $cibles);

+    }

+

+

+    /**

+     *	On the main mailing area, there is a box with statistics.

+     *	If you want to add a line in this report you must provide an

+     *	array of SQL request that returns two field:

+     *	One called "label", One called "nb".

+     *

+     *	@return		array		Array with SQL requests

+     */

+    public function getSqlArrayForStats()

+    {

+

+        //var $statssql=array();

+        //$this->statssql[0]="SELECT field1 as label, count(distinct(email)) as nb FROM mytable WHERE email IS NOT NULL";

+

+        return array();

+    }

+

+

+    /**

+     *	Return here number of distinct emails returned by your selector.

+     *	For example if this selector is used to extract 500 different

+     *	emails from a text file, this function must return 500.

+     *

+     *	@param	string	$sql		SQL request to use to count

+     *	@return	int					Number of recipients

+     */

+    public function getNbOfRecipients($sql = '')

+    {

+        $now = dol_now();

+

+        // Example: return parent::getNbOfRecipients("SELECT count(*) as nb from dolibarr_table");

+        // Example: return 500;

+        $sql = "SELECT count(*) as nb";

+        $sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."contrat as c";

+        $sql .= ", ".MAIN_DB_PREFIX."contratdet as cd, ".MAIN_DB_PREFIX."product as p";

+        $sql .= " WHERE s.entity IN (".getEntity('societe').")";

+        $sql .= " AND s.rowid = c.fk_soc AND cd.fk_contrat = c.rowid AND s.email != ''";

+        $sql .= " AND cd.statut= 4 AND cd.fk_product=p.rowid";

+        $sql .= " AND p.ref IN ('".join("','", $this->arrayofproducts)."')";

+        $sql .= " AND cd.date_fin_validite < '".$this->db->idate($now)."'";

+

+        $a = parent::getNbOfRecipients($sql);

+

+        return $a;

+    }

+

+    /**

+     *  This is to add a form filter to provide variant of selector

+     *	If used, the HTML select must be called "filter"

+     *

+     *  @return     string      A html select zone

+     */

+    public function formFilter()

+    {

+        global $langs;

+

+        $s = $langs->trans("ProductOrService");

+        $s .= '<select name="filter" class="flat">';

+        if (count($this->arrayofproducts)) $s .= '<option value="0">&nbsp;</option>';

+        else $s .= '<option value="0">'.$langs->trans("ContactsAllShort").'</option>';

+        foreach ($this->arrayofproducts as $key => $val)

+        {

+            $s .= '<option value="'.$key.'">'.$val.'</option>';

+        }

+        $s .= '</select>';

+        return $s;

+    }

+

+

+    /**

+     *  Can include an URL link on each record provided by selector	shown on target page.

+     *

+     *  @param	int		$id		ID

+     *  @return string      	Url link

+     */

+    public function url($id)

+    {

+        return '<a href="'.DOL_URL_ROOT.'/societe/card.php?socid='.$id.'">'.img_object('', "company").'</a>';

+    }

 }

--- /tmp/dsg/dolibarr/htdocs/core/modules/mailings/github_xinputfile.modules.php
+++ /tmp/dsg/dolibarr/htdocs/core/modules/mailings/client_xinputfile.modules.php
@@ -30,31 +30,31 @@
  */

 class mailing_xinputfile extends MailingTargets

 {

-	public $name = 'EmailsFromFile'; // Identifiant du module mailing

-	// This label is used if no translation is found for key XXX neither MailingModuleDescXXX where XXX=name is found

-	public $desc = 'EMails from a file'; // Libelle utilise si aucune traduction pour MailingModuleDescXXX ou XXX=name trouv�e

-	public $require_module = array(); // Module mailing actif si modules require_module actifs

-	public $require_admin = 0; // Module mailing actif pour user admin ou non

-

-	/**

-	 * @var string String with name of icon for myobject. Must be the part after the 'object_' into object_myobject.png

-	 */

-	public $picto = 'generic';

-	public $tooltip = 'UseFormatFileEmailToTarget';

-

-

-	/**

-	 *  Constructor

-	 *

-	 *  @param      DoliDB      $db      Database handler

-	 */

-	public function __construct($db)

-	{

-		$this->db = $db;

-	}

-

-

-	/**

+    public $name = 'EmailsFromFile'; // Identifiant du module mailing

+    // This label is used if no translation is found for key XXX neither MailingModuleDescXXX where XXX=name is found

+    public $desc = 'EMails from a file'; // Libelle utilise si aucune traduction pour MailingModuleDescXXX ou XXX=name trouv�e

+    public $require_module = array(); // Module mailing actif si modules require_module actifs

+    public $require_admin = 0; // Module mailing actif pour user admin ou non

+

+    /**

+     * @var string String with name of icon for myobject. Must be the part after the 'object_' into object_myobject.png

+     */

+    public $picto = 'generic';

+    public $tooltip = 'UseFormatFileEmailToTarget';

+

+

+    /**

+     *  Constructor

+     *

+     *  @param      DoliDB      $db      Database handler

+     */

+    public function __construct($db)

+    {

+        $this->db = $db;

+    }

+

+

+    /**

 	 *	On the main mailing area, there is a box with statistics.

 	 *	If you want to add a line in this report you must provide an

 	 *	array of SQL request that returns two field:

@@ -62,7 +62,7 @@
 	 *

 	 *	@return		array		Array with SQL requests

 	 */

-	public function getSqlArrayForStats()

+    public function getSqlArrayForStats()

 	{

 		global $langs;

 		$langs->load("users");

@@ -80,7 +80,7 @@
 	 *  @param      string	$sql        Sql request to count

 	 *	@return		string				'' means NA

 	 */

-	public function getNbOfRecipients($sql = '')

+    public function getNbOfRecipients($sql = '')

 	{

 		return '';

 	}

@@ -89,10 +89,10 @@
 	/**

 	 *  Renvoie url lien vers fiche de la source du destinataire du mailing

 	 *

-	 *  @param	int		$id		ID

+     *  @param	int		$id		ID

 	 *  @return string      	Url lien

 	 */

-	public function url($id)

+    public function url($id)

 	{

 		global $langs;

 		return $langs->trans('LineInFile', $id);

@@ -105,7 +105,7 @@
 	 *

 	 *   @return     string      Retourne zone select

 	 */

-	public function formFilter()

+    public function formFilter()

 	{

 		global $langs;

 

@@ -114,16 +114,16 @@
 		return $s;

 	}

 

-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

 	/**

 	 *  Ajoute destinataires dans table des cibles

 	 *

 	 *  @param	int		$mailing_id    	Id of emailing

 	 *  @return int           			< 0 si erreur, nb ajout si ok

 	 */

-	public function add_to_target($mailing_id)

-	{

-		// phpcs:enable

+    public function add_to_target($mailing_id)

+	{

+        // phpcs:enable

 		global $conf, $langs, $_FILES;

 

 		require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';

@@ -147,67 +147,76 @@
 				if ($handle)

 				{

 					$i = 0;

-					$j = 0;

-

-					$old = '';

+		            $j = 0;

+

+            		$old = '';

 					while (!feof($handle))

 					{

 						$cpt++;

-						$buffer = trim(fgets($handle));

-						$tab = explode(';', $buffer, 4);

-						$email = $tab[0];

-						$name = $tab[1];

-						$firstname = $tab[2];

-						$other = $tab[3];

-						if (!empty($buffer))

-						{

-							//print 'xx'.dol_strlen($buffer).empty($buffer)."<br>\n";

-							if (isValidEMail($email))

-							{

+				        $buffer = trim(fgets($handle));

+			        	$tab = explode(';', $buffer, 4);

+				        $email = $tab[0];

+				        $name = $tab[1];

+				        $firstname = $tab[2];

+				        $other = $tab[3];

+				        if (!empty($buffer))

+				        {

+			        		//print 'xx'.dol_strlen($buffer).empty($buffer)."<br>\n";

+				        	$id = $cpt;

+					        if (isValidEMail($email))

+					        {

 		   						if ($old <> $email)

 								{

 									$cibles[$j] = array(

-													'email' => $email,

-													'lastname' => $name,

-													'firstname' => $firstname,

+					                    			'email' => $email,

+					                    			'lastname' => $name,

+					                    			'firstname' => $firstname,

 													'other' => $other,

-													'source_url' => '',

-													'source_id' => '',

-													'source_type' => 'file'

+                                                    'source_url' => '',

+                                                    'source_id' => '',

+                                                    'source_type' => 'file'

 									);

 									$old = $email;

 									$j++;

 								}

-							} else {

-								$i++;

-								$langs->load("errors");

-								$msg = $langs->trans("ErrorFoundBadEmailInFile", $i, $cpt, $email);

-								if (!empty($msg)) $this->error = $msg;

-								else $this->error = 'ErrorFoundBadEmailInFile '.$i.' '.$cpt.' '.$email; // We experience case where $langs->trans return an empty string.

-							}

-						}

-					}

-					fclose($handle);

-

-					if ($i > 0)

-					{

-						return -$i;

-					}

-				} else {

+					        }

+					        else

+					        {

+					        	$i++;

+					        	$langs->load("errors");

+                                $msg = $langs->trans("ErrorFoundBadEmailInFile", $i, $cpt, $email);

+					        	if (!empty($msg)) $this->error = $msg;

+                                else $this->error = 'ErrorFoundBadEmailInFile '.$i.' '.$cpt.' '.$email; // We experience case where $langs->trans return an empty string.

+					        }

+				        }

+				    }

+				    fclose($handle);

+

+				    if ($i > 0)

+				    {

+				    	return -$i;

+				    }

+				}

+				else

+				{

 					$this->error = $langs->trans("ErrorFaildToOpenFile");

 					return -1;

 				}

 

 				dol_syslog(get_class($this)."::add_to_target mailing ".$cpt." targets found");

-			} else {

+			}

+			else

+			{

 				$langs->load("errors");

 				if ($resupload < 0)	// Unknown error

 				{

 					$this->error = '<div class="error">'.$langs->trans("ErrorFileNotUploaded").'</div>';

-				} elseif (preg_match('/ErrorFileIsInfectedWithAVirus/', $resupload))	// Files infected by a virus

+				}

+				elseif (preg_match('/ErrorFileIsInfectedWithAVirus/', $resupload))	// Files infected by a virus

 				{

 					$this->error = '<div class="error">'.$langs->trans("ErrorFileIsInfectedWithAVirus").'</div>';

-				} else // Known error

+				}

+				else	// Known error

 				{

 					$this->error = '<div class="error">'.$langs->trans($resupload).'</div>';

 				}

--- /tmp/dsg/dolibarr/htdocs/core/modules/mailings/github_xinputuser.modules.php
+++ /tmp/dsg/dolibarr/htdocs/core/modules/mailings/client_xinputuser.modules.php
@@ -48,13 +48,13 @@
 	 *

 	 *  @param		DoliDB		$db      Database handler

 	 */

-	public function __construct($db)

+    public function __construct($db)

 	{

 		$this->db = $db;

 	}

 

 

-	/**

+    /**

 	 *	On the main mailing area, there is a box with statistics.

 	 *	If you want to add a line in this report you must provide an

 	 *	array of SQL request that returns two field:

@@ -62,7 +62,7 @@
 	 *

 	 *	@return		array		Array with SQL requests

 	 */

-	public function getSqlArrayForStats()

+    public function getSqlArrayForStats()

 	{

 		global $langs;

 		$langs->load("users");

@@ -80,7 +80,7 @@
 	 *  @param      string	$sql   	Sql request to count

 	 *	@return		string			'' means NA

 	 */

-	public function getNbOfRecipients($sql = '')

+    public function getNbOfRecipients($sql = '')

 	{

 		return '';

 	}

@@ -89,10 +89,10 @@
 	/**

 	 *  Renvoie url lien vers fiche de la source du destinataire du mailing

 	 *

-	 *  @param	int		$id		ID

+     *  @param	int		$id		ID

 	 *  @return string      	Url lien

 	 */

-	public function url($id)

+    public function url($id)

 	{

 		return '';

 	}

@@ -103,7 +103,7 @@
 	 *

 	 *   @return     string      Retourne zone select

 	 */

-	public function formFilter()

+    public function formFilter()

 	{

 		global $langs;

 

@@ -112,16 +112,16 @@
 		return $s;

 	}

 

-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

 	/**

 	 *  Ajoute destinataires dans table des cibles

 	 *

 	 *  @param	int		$mailing_id    	Id of emailing

 	 *  @return int           			< 0 si erreur, nb ajout si ok

 	 */

-	public function add_to_target($mailing_id)

+    public function add_to_target($mailing_id)

 	{

-		// phpcs:enable

+        // phpcs:enable

 		global $conf, $langs, $_FILES;

 

 		require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';

@@ -133,29 +133,33 @@
 		$other = $tmparray[3];

 

 		$cibles = array();

-		if (!empty($email))

-		{

+        if (!empty($email))

+        {

 			if (isValidEMail($email))

 			{

 				$cibles[] = array(

-		   			'email' => $email,

-		   			'lastname' => $lastname,

-		   			'firstname' => $firstname,

+           			'email' => $email,

+           			'lastname' => $lastname,

+           			'firstname' => $firstname,

 					'other' => $other,

-					'source_url' => '',

-					'source_id' => '',

-					'source_type' => 'file'

+                    'source_url' => '',

+                    'source_id' => '',

+                    'source_type' => 'file'

 				);

 

 				return parent::addTargetsToDatabase($mailing_id, $cibles);

-			} else {

+			}

+			else

+			{

 				$langs->load("errors");

 				$this->error = $langs->trans("ErrorBadEMail", $email);

 				return -1;

 			}

-		} else {

-			$langs->load("errors");

-			$this->error = $langs->trans("ErrorBadEmail", $email);

+		}

+		else

+		{

+            $langs->load("errors");

+            $this->error = $langs->trans("ErrorBadEmail", $email);

 			return -1;

 		}

 	}