New: Gros avancements sur l'outil de mailing. Il est possible maintenant de crer un mailing, le supprimer, editer, valider et de choisir les destinataires parmi des listes prdfinis dans des modules.

Qual: Les modules poire et cerise de slection de destinataire ont t revue pour respoecter la norme objet.
This commit is contained in:
Laurent Destailleur
2005-02-12 17:41:13 +00:00
parent 8697288fe6
commit 8bda5c7e7d
6 changed files with 277 additions and 213 deletions

View File

@@ -53,6 +53,19 @@ if ($_GET["action"] == 'add')
Header("Location: cibles.php?id=".$_GET["rowid"]);
}
if ($_GET["action"] == 'clear')
{
// Chargement de la classe
$file = $dir."/modules_mailings.php";
$classname = "MailingTargets";
require_once($file);
$obj = new $classname($db);
$obj->clear_target($_GET["rowid"]);
Header("Location: cibles.php?id=".$_GET["rowid"]);
}
/*
@@ -90,15 +103,22 @@ if ($mil->fetch($_GET["id"]) == 0)
print '<tr><td width="25%">'.$langs->trans("MailTitle").'</td><td colspan="3">'.$mil->titre.'</td></tr>';
print '<tr><td width="25%">'.$langs->trans("MailFrom").'</td><td colspan="3">'.htmlentities($mil->email_from).'</td></tr>';
print '<tr><td width="25%">'.$langs->trans("TotalNbOfDistinctRecipients").'</td><td colspan="3">'.($mil->nbemail?$mil->nbemail:'<font class="error">'.$langs->trans("NoTargetYet").'</font>').'</td></tr>';
print '<tr><td width="25%">'.$langs->trans("Status").'</td><td colspan="3">'.$mil->statuts[$mil->statut].'</td></tr>';
print '</table><br>';
// Ajout d'une liste de s<>lection
print "</div>";
// Affiche les listes de s<>lection
print '<table class="noborder" width=\"100%\">';
print '<tr class="liste_titre">';
print '<td>'.$langs->trans("RecipientSelectionModules").'</td>';
//print '<td>'.$langs->trans("Name").'</td>';
print '<td align="center">'.$langs->trans("NbOfRecipients").'</td>';
print '<td width="80">&nbsp;</td>';
print '<td align="center" width="120">';
if ($mil->statut == 0) {
print $langs->trans("Actions");
}
print '</td>';
print "</tr>\n";
clearstatcache();
@@ -110,8 +130,8 @@ if ($mil->fetch($_GET["id"]) == 0)
{
if (substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS')
{
$var = !$var;
if (eregi("(.*)\.(.*)\.(.*)",$file,$reg)) {
$var = !$var;
$modulename=$reg[1];
// Chargement de la classe
@@ -132,18 +152,32 @@ if ($mil->fetch($_GET["id"]) == 0)
print "</td>";
*/
print '<td align="center">'.$obj->getNbOfRecipients().'</td>';
print '<td><a href="cibles.php?action=add&amp;rowid='.$mil->id.'&amp;module='.$modulename.'">'.img_edit_add($langs->trans("AddRecipients")).'</a></td>';
print '<td align="center">';
if ($mil->statut == 0) {
print '<form action="cibles.php?action=add&rowid='.$mil->id.'&module='.$modulename.'" method="POST"><input type="submit" value="'.$langs->trans("Add").'"></form>';
}
else {
//print $langs->trans("MailNoChangePossible");
print "&nbsp;";
}
print '</td>';
}
print "</tr>\n";
}
}
closedir($handle);
if ($mil->statut == 0) {
print '<tr>';
print '<td>&nbsp;</td><td>&nbsp;</td><td align="center"><form action="cibles.php?action=clear&rowid='.$mil->id.'" method="POST"><input type="submit" value="'.$langs->trans("Clear").'"></form></td>';
print '</tr>';
}
print '</table><br>';
print "</div>";
// Liste des destinataires <20>lectionn<6E>s
$NBMAX=100;
$sql = "SELECT mc.nom, mc.prenom, mc.email";

View File

@@ -44,60 +44,76 @@ llxHeader('','Mailing');
*/
print_titre($langs->trans("MailingArea"));
print '<br>';
print '<table border="0" width="100%">';
print '<table class="noborder" width="100%">';
print '<tr><td valign="top" width="30%">';
/*
* Derni<6E>res actions commerciales effectu<74>es
*
*/
// Affiche stats de tous les modules de destinataires mailings
print '<table class="noborder" width="100%">';
print '<tr class="liste_titre"><td colspan="3">'.$langs->trans("TargetsStatistics").'</td></tr>';
$sql = "SELECT count(*), client";
$sql .= " FROM ".MAIN_DB_PREFIX."societe";
$sql .= " WHERE client in (1,2)";
$sql .= " GROUP BY client";
$dir=DOL_DOCUMENT_ROOT."/includes/modules/mailings";
$handle=opendir($dir);
if ( $db->query($sql) )
$var=True;
while (($file = readdir($handle))!==false)
{
$num = $db->num_rows();
print '<table class="noborder" width="100%">';
print '<tr class="liste_titre"><td colspan="4">'.$langs->trans("Statistics").'</td></tr>';
$i = 0;
while ($i < $num )
if (substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS')
{
$row = $db->fetch_row();
$st[$row[1]] = $row[0];
if (eregi("(.*)\.(.*)\.(.*)",$file,$reg)) {
$var = !$var;
$i++;
$modulename=$reg[1];
// Chargement de la classe
$file = $dir."/".$modulename.".modules.php";
$classname = "mailing_".$modulename;
require_once($file);
$obj = new $classname($db);
foreach ($obj->statssql as $sql)
{
print '<tr '.$bc[$var].'>';
$result=$db->query($sql);
if ($result)
{
$num = $db->num_rows($result);
$i = 0;
while ($i < $num )
{
$obj = $db->fetch_object($result);
print '<td>'.$obj->label.'</td><td>'.$obj->nb.'<td>';
$i++;
}
$db->free();
}
else
{
dolibarr_print_error($db);
}
}
print '</tr>';
}
}
$var = true;
print "<tr $bc[$var]>".'<td>'.$langs->trans("Customers").'</td><td align="center">'.($st[1]?$st[1]:"0")."</td></tr>";
$var=!$var;
print "<tr $bc[$var]>".'<td>'.$langs->trans("Prospects").'</td><td align="center">'.($st[2]?$st[2]:"0")."</td></tr>";
print "</table><br>";
$db->free();
}
else
{
dolibarr_print_error($db);
}
closedir($handle);
print "</table><br>";
print '</td><td valign="top" width="70%">';
/*
*
*
* Liste des derniers mailings
*/
$sql = "SELECT m.rowid, m.titre, m.nbemail, m.statut";

View File

@@ -258,7 +258,7 @@ class Mailing
$this->db->query($sql);
return 1;
}
}
?>

View File

@@ -1,5 +1,6 @@
<?php
/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005 Laurent Destailleur <eldy@users.sourceforge.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -50,17 +51,29 @@ include_once DOL_DOCUMENT_ROOT.'/includes/modules/mailings/modules_mailings.php'
class mailing_cerise extends MailingTargets
{
var $name="ContactProspects";
var $desc='Tous les contacts associ<63>s aux prospects';
var $require_module=array("prospet");
var $name="ContactProspects"; // Identifiant du module mailing
var $desc='Tous les contacts associ<63>s aux prospects'; // Libell<6C> utilis<69> si aucune traduction pour MailingModuleDescXXX ou XXX=name trouv<75>e
var $require_module=array("commercial"); // Module mailing actif si modules require_module actifs
var $db;
var $statssql=array();
function mailing_cerise($DB)
{
global $langs;
$langs->load("commercial");
$this->db=$DB;
// Liste des tableaux des stats espace mailing
$this->statssql[0]="SELECT '".$langs->trans("Prospects")."' label, count(*) nb FROM ".MAIN_DB_PREFIX."societe WHERE client = 2";
$this->statssql[1]="SELECT '".$langs->trans("NbOfProspectsContacts")."' label, count(distinct(c.email)) nb FROM ".MAIN_DB_PREFIX."socpeople as c, ".MAIN_DB_PREFIX."societe as s WHERE s.idp = c.fk_soc AND s.client = 2 AND c.email IS NOT NULL";
}
function getNbOfRecipients()
{
// La requete doit retourner: nb
$sql = "SELECT count(distinct(c.email)) nb";
$sql .= " FROM ".MAIN_DB_PREFIX."socpeople as c";
$sql .= ", ".MAIN_DB_PREFIX."societe as s";
@@ -68,94 +81,21 @@ class mailing_cerise extends MailingTargets
$sql .= " AND s.client = 2";
$sql .= " AND c.email IS NOT NULL";
if ( $this->db->query($sql) )
{
$obj = $this->db->fetch_object();
return $obj->nb;
}
return 0;
return parent::getNbOfRecipients($sql);
}
function add_to_target($mailing_id)
{
$cibles = array();
$sql = "SELECT distinct(c.email), c.idp, c.name, c.firstname, s.nom ";
// La requete doit retourner: email, fk_contact, name, firstname
$sql = "SELECT c.email email, c.idp fk_contact, c.name name, c.firstname firstname";
$sql .= " FROM ".MAIN_DB_PREFIX."socpeople as c";
$sql .= ", ".MAIN_DB_PREFIX."societe as s";
$sql .= " WHERE s.idp = c.fk_soc";
$sql .= " AND s.client = 2";
$sql .= " AND c.email IS NOT NULL";
$sql .= " ORDER BY c.email ASC";
if ( $this->db->query($sql) )
{
$num = $this->db->num_rows();
$i = 0;
$j = 0;
dolibarr_syslog("mailing-prepare: mailing $num cibles trouv<75>es");
$olde = '';
while ($i < $num)
{
$row = $this->db->fetch_row();
if ($olde <> $row[0])
{
$cibles[$j] = $row;
$olde = $row[0];
$j++;
}
$i++;
}
}
else
{
dolibarr_syslog($this->db->error());
}
$sql = "DELETE FROM ".MAIN_DB_PREFIX."mailing_cibles";
$sql .= " WHERE fk_mailing = ".$mailing_id;
if (!$this->db->query($sql))
{
dolibarr_syslog($this->db->error());
}
$num = sizeof($cibles);
for ($i = 0 ; $i < $num ; $i++)
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."mailing_cibles";
$sql .= " (fk_mailing, fk_contact, nom, prenom, email)";
$sql .= " VALUES (".$mailing_id.",";
$sql .= $cibles[$i][1] .",";
$sql .= "'".$cibles[$i][2] ."',";
$sql .= "'".$cibles[$i][3] ."',";
$sql .= "'".$cibles[$i][0] ."')";
if (!$this->db->query($sql))
{
dolibarr_syslog($this->db->error());
}
}
dolibarr_syslog("mailing-prepare: mailing $i cibles ajout<75>es");
$sql = "UPDATE ".MAIN_DB_PREFIX."mailing";
$sql .= " SET nbemail = ".$i." WHERE rowid = ".$mailing_id;
if (!$this->db->query($sql))
{
dolibarr_syslog($this->db->error());
}
return 0;
$sql .= " ORDER BY c.email";
return parent::add_to_target($mailing_id, $sql);
}
}

View File

@@ -1,6 +1,6 @@
<?php
/* Copyright (C) 2003-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2004-2005 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
*
* This program is free software; you can redistribute it and/or modify
@@ -36,8 +36,14 @@
class MailingTargets
{
var $db='';
var $error='';
function MailingTargets($DB)
{
$this->db=$DB;
}
/** \brief Renvoi un exemple de num<75>rotation
* \return string Retourne la traduction de la cl<63> MailingModuleDescXXX ou XXX nom du module, ou $this->desc si non trouv<75>
*/
@@ -57,6 +63,137 @@ class MailingTargets
{
return 0;
}
/**
* \brief Retourne nombre de destinataires
* \param sql Requete sql de comptage
* \return int Nb de destinataires
*/
function getNbOfRecipients($sql)
{
$result=$this->db->query($sql);
if ($result)
{
$obj = $this->db->fetch_object($result);
return $obj->nb;
}
return 0;
}
/**
* \brief Met a jour nombre de destinataires
* \param mailing_id Id du mailing concern<72>
* \return int < 0 si erreur, nb destinataires si ok
*/
function update_nb($mailing_id)
{
// 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))
{
dolibarr_syslog($this->db->error());
return -1;
}
}
else {
return -1;
}
return $nb;
}
/**
* \brief Ajoute destinataires dans table des cibles
* \param mailing_id Id du mailing concern<72>
* \param sql Requete sql de selection des destinataires
* \return int < 0 si erreur, nb ajout si ok
*/
function add_to_target($mailing_id, $sql)
{
$cibles = array();
// Stocke destinataires dans cibles
$result=$this->db->query($sql);
if ($result)
{
$num = $this->db->num_rows($result);
$i = 0;
$j = 0;
dolibarr_syslog("mailing-prepare: mailing $num cibles trouv<75>es");
$old = '';
while ($i < $num)
{
$obj = $this->db->fetch_object($result);
if ($old <> $obj->email)
{
$cibles[$j] = array($obj->email,$obj->fk_contact,$obj->name,$obj->firstname);
$old = $obj->email;
$j++;
}
$i++;
}
}
else
{
dolibarr_syslog($this->db->error());
return -1;
}
// Ins<6E>re destinataires de cibles dans table
$num = sizeof($cibles);
for ($i = 0 ; $i < $num ; $i++)
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."mailing_cibles";
$sql .= " (fk_mailing, ";
if ($cibles[$i][1]) $sql .= "fk_contact, ";
$sql .= "nom, prenom, email)";
$sql .= " VALUES (".$mailing_id.",";
if ($cibles[$i][1]) $sql .= $cibles[$i][1] .",";
$sql .= "'".$cibles[$i][2] ."',";
$sql .= "'".$cibles[$i][3] ."',";
$sql .= "'".$cibles[$i][0] ."')";
if (!$this->db->query($sql))
{
dolibarr_syslog($this->db->error());
return -1;
}
}
dolibarr_syslog("mailing-prepare: mailing $num cibles ajout<75>es");
$this->update_nb($mailing_id);
return $num;
}
/**
* \brief Supprime tous les destinataires de la table des cibles
* \param mailing_id Id du mailing concern<72>
*/
function clear_target($mailing_id)
{
$sql = "DELETE FROM ".MAIN_DB_PREFIX."mailing_cibles";
$sql .= " WHERE fk_mailing = ".$mailing_id;
if (! $this->db->query($sql))
{
dolibarr_syslog($this->db->error());
}
$this->update_nb($mailing_id);
}
}
?>

View File

@@ -50,19 +50,29 @@ include_once DOL_DOCUMENT_ROOT.'/includes/modules/mailings/modules_mailings.php'
class mailing_poire extends MailingTargets
{
var $name='ContactCustomers';
var $desc='Tous les contacts associ<63>s aux clients';
var $require_module=array("customer");
var $name='ContactCustomers'; // Identifiant du module mailing
var $desc='Tous les contacts associ<63>s aux clients'; // Libell<6C> utilis<69> si aucune traduction pour MailingModuleDescXXX ou XXX=name trouv<75>e
var $require_module=array("commercial"); // Module mailing actif si modules require_module actifs
var $db;
var $statssql=array();
function mailing_poire($DB)
{
global $langs;
$langs->load("commercial");
$this->db=$DB;
// Liste des tableaux des stats espace mailing
$this->statssql[0]="SELECT '".$langs->trans("Customers")."' label, count(*) nb FROM ".MAIN_DB_PREFIX."societe WHERE client = 1";
$this->statssql[1]="SELECT '".$langs->trans("NbOfCustomersContacts")."' label, count(distinct(c.email)) nb FROM ".MAIN_DB_PREFIX."socpeople as c, ".MAIN_DB_PREFIX."societe as s WHERE s.idp = c.fk_soc AND s.client = 1 AND c.email IS NOT NULL";
}
function getNbOfRecipients()
{
// La requete doit retourner: nb
$sql = "SELECT count(distinct(c.email)) nb";
$sql .= " FROM ".MAIN_DB_PREFIX."socpeople as c";
$sql .= ", ".MAIN_DB_PREFIX."societe as s";
@@ -70,94 +80,21 @@ class mailing_poire extends MailingTargets
$sql .= " AND s.client = 1";
$sql .= " AND c.email IS NOT NULL";
if ( $this->db->query($sql) )
{
$obj = $this->db->fetch_object();
return $obj->nb;
}
return 0;
return parent::getNbOfRecipients($sql);
}
function add_to_target($mailing_id)
{
$cibles = array();
$sql = "SELECT distinct(c.email), c.idp, c.name, c.firstname, s.nom ";
// La requete doit retourner: email, fk_contact, name, firstname
$sql = "SELECT c.email email, c.idp fk_contact, c.name name, c.firstname firstname";
$sql .= " FROM ".MAIN_DB_PREFIX."socpeople as c";
$sql .= ", ".MAIN_DB_PREFIX."societe as s";
$sql .= " WHERE s.idp = c.fk_soc";
$sql .= " AND s.client = 1";
$sql .= " AND c.email IS NOT NULL";
$sql .= " ORDER BY c.email ASC";
if ( $this->db->query($sql) )
{
$num = $this->db->num_rows();
$i = 0;
$j = 0;
dolibarr_syslog("mailing-prepare: mailing $num cibles trouv<75>es");
$olde = '';
while ($i < $num)
{
$row = $this->db->fetch_row();
if ($olde <> $row[0])
{
$cibles[$j] = $row;
$olde = $row[0];
$j++;
}
$i++;
}
}
else
{
dolibarr_syslog($this->db->error());
}
$sql = "DELETE FROM ".MAIN_DB_PREFIX."mailing_cibles";
$sql .= " WHERE fk_mailing = ".$mailing_id;
if (!$this->db->query($sql))
{
dolibarr_syslog($this->db->error());
}
$num = sizeof($cibles);
for ($i = 0 ; $i < $num ; $i++)
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."mailing_cibles";
$sql .= " (fk_mailing, fk_contact, nom, prenom, email)";
$sql .= " VALUES (".$mailing_id.",";
$sql .= $cibles[$i][1] .",";
$sql .= "'".$cibles[$i][2] ."',";
$sql .= "'".$cibles[$i][3] ."',";
$sql .= "'".$cibles[$i][0] ."')";
if (!$this->db->query($sql))
{
dolibarr_syslog($this->db->error());
}
}
dolibarr_syslog("mailing-prepare: mailing $i cibles ajout<75>es");
$sql = "UPDATE ".MAIN_DB_PREFIX."mailing";
$sql .= " SET nbemail = ".$i." WHERE rowid = ".$mailing_id;
if (!$this->db->query($sql))
{
dolibarr_syslog($this->db->error());
}
return 0;
$sql .= " ORDER BY c.email";
return parent::add_to_target($mailing_id, $sql);
}
}