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 électionné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ères actions commerciales effectué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és aux prospects';
var $require_module=array("prospet");
var $name="ContactProspects"; // Identifiant du module mailing
var $desc='Tous les contacts associés aux prospects'; // Libellé utilisé si aucune traduction pour MailingModuleDescXXX ou XXX=name trouvé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é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é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érotation
* \return string Retourne la traduction de la clé MailingModuleDescXXX ou XXX nom du module, ou $this->desc si non trouvé
*/
@ -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é
* \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é
* \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é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è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é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é
*/
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és aux clients';
var $require_module=array("customer");
var $name='ContactCustomers'; // Identifiant du module mailing
var $desc='Tous les contacts associés aux clients'; // Libellé utilisé si aucune traduction pour MailingModuleDescXXX ou XXX=name trouvé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é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é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);
}
}