From 5b2b029f16206d07b73190a88b1b49d9c52dafa1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 25 Jan 2009 22:04:55 +0000 Subject: [PATCH] Can add additionnal fields in emailings selectors --- htdocs/comm/mailing/cibles.php | 144 ++++++++++-------- htdocs/comm/mailing/fiche.php | 121 ++++++++------- htdocs/comm/mailing/liste.php | 20 ++- htdocs/comm/mailing/mailing.class.php | 24 +-- htdocs/includes/modules/mailings/README | 6 +- .../modules/mailings/example.modules.php | 26 ++-- .../modules/mailings/fraise.modules.php | 30 ++-- .../modules/mailings/kiwi.modules.php | 70 +++++---- .../modules/mailings/modules_mailings.php | 17 ++- .../modules/mailings/peche.modules.php | 20 +-- .../modules/mailings/poire.modules.php | 52 ++++--- .../modules/mailings/pomme.modules.php | 22 +-- htdocs/install/check.php | 6 +- htdocs/langs/en_US/mails.lang | 4 +- htdocs/langs/en_US/main.lang | 1 + htdocs/langs/fr_FR/mails.lang | 4 +- htdocs/langs/fr_FR/main.lang | 1 + mysql/migration/2.5.0-2.6.0.sql | 4 +- mysql/tables/llx_mailing_cibles.key.sql | 5 +- mysql/tables/llx_mailing_cibles.sql | 1 + 20 files changed, 326 insertions(+), 252 deletions(-) diff --git a/htdocs/comm/mailing/cibles.php b/htdocs/comm/mailing/cibles.php index 9a88c48b5a2..e8002f4f00d 100644 --- a/htdocs/comm/mailing/cibles.php +++ b/htdocs/comm/mailing/cibles.php @@ -1,6 +1,6 @@ - * Copyright (C) 2005-2008 Laurent Destailleur + * Copyright (C) 2005-2009 Laurent Destailleur * * 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 @@ -18,11 +18,11 @@ */ /** - \file htdocs/comm/mailing/cibles.php - \ingroup mailing - \brief Page des cibles de mailing - \version $Id$ -*/ + * \file htdocs/comm/mailing/cibles.php + * \ingroup mailing + * \brief Page des cibles de mailing + * \version $Id$ + */ require("./pre.inc.php"); @@ -46,7 +46,7 @@ $offset = $conf->liste_limit * $_GET["page"] ; $pageprev = $_GET["page"] - 1; $pagenext = $_GET["page"] + 1; if (! $sortorder) $sortorder="ASC"; -if (! $sortfield) $sortfield="nom"; +if (! $sortfield) $sortfield="email"; $search_nom=isset($_GET["search_nom"])?$_GET["search_nom"]:$_POST["search_nom"]; $search_prenom=isset($_GET["search_prenom"])?$_GET["search_prenom"]:$_POST["search_prenom"]; @@ -59,15 +59,15 @@ $search_email=isset($_GET["search_email"])?$_GET["search_email"]:$_POST["search_ if ($_GET["action"] == 'add') { $modulename=$_GET["module"]; - + // Chargement de la classe $file = $dirmod."/".$modulename.".modules.php"; $classname = "mailing_".$modulename; require_once($file); - + $filtersarray=array(); if (isset($_POST["filter"])) $filtersarray[0]=$_POST["filter"]; - + $obj = new $classname($db); $result=$obj->add_to_target($_GET["rowid"],$filtersarray); @@ -79,11 +79,11 @@ if ($_GET["action"] == 'add') if ($result == 0) { $mesg='
'.$langs->trans("WarningNoEMailsAdded").'
'; - } + } if ($result < 0) { $mesg='
'.$obj->error.'
'; - } + } $_REQUEST["id"]=$_GET["rowid"]; } @@ -93,10 +93,10 @@ if ($_GET["action"] == 'clear') $file = $dirmod."/modules_mailings.php"; $classname = "MailingTargets"; require_once($file); - + $obj = new $classname($db); $obj->clear_target($_GET["rowid"]); - + Header("Location: cibles.php?id=".$_GET["rowid"]); exit; } @@ -111,7 +111,7 @@ if ($_GET["action"] == 'delete') $file = $dirmod."/modules_mailings.php"; $classname = "MailingTargets"; require_once($file); - + $obj = new $classname($db); $obj->update_nb($_REQUEST["id"]); } @@ -141,12 +141,12 @@ $mil = new Mailing($db); $html = new Form($db); if ($mil->fetch($_REQUEST["id"]) >= 0) { - + $h=0; $head[$h][0] = DOL_URL_ROOT."/comm/mailing/fiche.php?id=".$mil->id; $head[$h][1] = $langs->trans("MailCard"); $h++; - + $head[$h][0] = DOL_URL_ROOT."/comm/mailing/cibles.php?id=".$mil->id; $head[$h][1] = $langs->trans("MailRecipients"); $hselected = $h; @@ -158,10 +158,10 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) $h++; */ dolibarr_fiche_head($head, $hselected, $langs->trans("Mailing")); - - + + print ''; - + print ''; print ''; print ''; print '
'.$langs->trans("Ref").''; print $html->showrefnav($mil,'id'); @@ -171,14 +171,14 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) print '
'.$langs->trans("Status").''.$mil->getLibStatut(4).'
'.$langs->trans("TotalNbOfDistinctRecipients").''.($mil->nbemail?$mil->nbemail:'0').'
'; - + print ""; - + if ($mesg) print "$mesg
\n"; $var=!$var; - // Affiche les listes de s�lection + // Affiche les listes de selection if ($mil->statut == 0) { print_titre($langs->trans("ToAddRecipientsChooseHere")); @@ -191,19 +191,19 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) print ''.$langs->trans("Filter").''; print ' '; print "\n"; - + clearstatcache(); $var=true; foreach ($conf->dol_document_root as $dirroot) { $dir=$dirroot."/includes/modules/mailings/"; - + if (is_dir($dir)) { $handle=opendir($dir); if ($handle) - { + { while (($file = readdir($handle))!==false) { if (substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS') @@ -212,14 +212,14 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) { $modulename=$reg[1]; if ($modulename == 'example') continue; - + // Chargement de la classe $file = $dir.$modulename.".modules.php"; $classname = "mailing_".$modulename; require_once($file); - + $obj = new $classname($db); - + $qualified=1; foreach ($obj->require_module as $key) { @@ -230,20 +230,20 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) break; } } - - // Si le module mailing est qualifi� + + // Si le module mailing est qualifie if ($qualified) { $var = !$var; print ''; - + if ($mil->statut == 0) print '
'; - + print ''; if (! $obj->picto) $obj->picto='generic'; - print img_object('',$obj->picto).' '.$obj->getDesc(); + print img_object($langs->trans("Module").': '.get_class($obj),$obj->picto).' '.$obj->getDesc(); print ''; - + /* print ''; print $modulename; @@ -260,13 +260,13 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) print $langs->trans("Error").' '.img_error($obj->error); } print ''; - + print ''; $filter=$obj->formFilter(); if ($filter) print $filter; else print $langs->trans("None"); print ''; - + print ''; if ($mil->statut == 0) { @@ -278,9 +278,9 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) print " "; } print ''; - + if ($mil->statut == 0) print '
'; - + print "\n"; } } @@ -290,10 +290,10 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) } } } // End foreach dir - + print ''; print '
'; - + print '
'; print_titre($langs->trans("ToClearAllRecipientsClickHere")); print ''; @@ -304,7 +304,7 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) print ''; print '
'; } - + // List of selected targets @@ -314,7 +314,7 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) print ''; print ''; - $sql = "SELECT mc.rowid, mc.nom, mc.prenom, mc.email, mc.statut, mc.date_envoi, mc.url"; + $sql = "SELECT mc.rowid, mc.nom, mc.prenom, mc.email, mc.other, mc.statut, mc.date_envoi, mc.url"; $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc"; $sql .= " WHERE mc.fk_mailing=".$mil->id; if ($search_nom) $sql.= " AND mc.nom like '%".addslashes($search_nom)."%'"; @@ -322,12 +322,12 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) if ($search_email) $sql.= " AND mc.email like '%".addslashes($search_email)."%'"; if ($sortfield) { $sql .= " ORDER BY $sortfield $sortorder"; } $sql .= $db->plimit($conf->liste_limit+1, $offset); - + $resql=$db->query($sql); if ($resql) { $num = $db->num_rows($resql); - + $addu = "&id=".$mil->id; if ($search_nom) $addu.= "&search_nom=".urlencode($search_nom); if ($search_prenom) $addu.= "&search_prenom=".urlencode($search_prenom); @@ -338,10 +338,11 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) if ($page) $addu.= "&page=".$page; print '
'; print ''; + print_liste_field_titre($langs->trans("EMail"),$_SERVER["PHP_SELF"],"mc.email",$addu,"","",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Lastname"),$_SERVER["PHP_SELF"],"mc.nom",$addu,"","",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Firstname"),$_SERVER["PHP_SELF"],"mc.prenom",$addu,"","",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("EMail"),$_SERVER["PHP_SELF"],"mc.email",$addu,"","",$sortfield,$sortorder); - print ''; + print_liste_field_titre($langs->trans("OtherInformations"),$_SERVER["PHP_SELF"],"",$addu,"","",$sortfield,$sortorder); + print_liste_field_titre($langs->trans("Source"),$_SERVER["PHP_SELF"],"",$addu,"",'align="center"',$sortfield,$sortorder); // Date if ($mil->statut < 2) @@ -351,7 +352,7 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) else { print_liste_field_titre($langs->trans("Date"),$_SERVER["PHP_SELF"],"mc.date_envoi",$addu,'','align="center"',$sortfield,$sortorder); - } + } // Statut print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"mc.statut",$addu,'','align="right"',$sortfield,$sortorder); @@ -360,37 +361,46 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) // Ligne des champs de filtres print ''; - print ''; - print ''; + // EMail print ''; + // Name + print ''; + // Firstname + print ''; + // Other + print ''; + // Url print ''; print ''; - + $var = true; $i = 0; - + if ($num) { while ($i < min($num,$conf->liste_limit)) { $obj = $db->fetch_object($resql); $var=!$var; - + print ""; + print ''; print ''; print ''; - print ''; - print ''; - + print ''; + print ''; + // Statut pour l'email destinataire (Attentioon != statut du mailing) if ($obj->statut == 0) { @@ -404,30 +414,30 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) if ($obj->statut==-1) print $langs->trans("MailingStatusError").' '.img_error(); if ($obj->statut==1) print $langs->trans("MailingStatusSent").' '.img_picto($langs->trans("MailingStatusSent"),'statut6'); print ''; - } + } print ''; - + $i++; } } else { - print ''; + print ''; } print "
 
'; - print ''; - print ''; - print ''; - print ''; print ''; print ''; + print ''; + print ''; + print ''; + print ''; + print ' '; + print ''; print ''; print '  '; print '
'.$obj->email.''.$obj->nom.''.$obj->prenom.''.$obj->email.''.$obj->url.''.$obj->other.''.$obj->url.'
'.$langs->trans("NoTargetYet").'
'.$langs->trans("NoTargetYet").'

"; - + $db->free($resql); } else { dolibarr_print_error($db); } - + print ''; print "\n\n"; - + } - + $db->close(); diff --git a/htdocs/comm/mailing/fiche.php b/htdocs/comm/mailing/fiche.php index 4e6ad8e8c81..a5600382e32 100644 --- a/htdocs/comm/mailing/fiche.php +++ b/htdocs/comm/mailing/fiche.php @@ -36,17 +36,23 @@ if (! $user->rights->mailing->lire || $user->societe_id > 0) $message = ''; // Tableau des substitutions possibles -$substitutionarray=array( +$substitutionarray=array( '__ID__' => 'IdRecord', '__EMAIL__' => 'EMail', '__LASTNAME__' => 'Lastname', -'__FIRSTNAME__' => 'Firstname' +'__FIRSTNAME__' => 'Firstname', +'__OTHER1__' => 'Other1', +'__OTHER2__' => 'Other2', +'__OTHER3__' => 'Other3', ); -$substitutionarrayfortest=array( +$substitutionarrayfortest=array( '__ID__' => 'TESTIdRecord', '__EMAIL__' => 'TESTEMail', '__LASTNAME__' => 'TESTLastname', -'__FIRSTNAME__' => 'TESTFirstname' +'__FIRSTNAME__' => 'TESTFirstname', +'__OTHER1__' => 'TESTOther1', +'__OTHER2__' => 'TESTOther2', +'__OTHER3__' => 'TESTOther3' ); @@ -92,13 +98,13 @@ if ($_POST["action"] == 'sendallconfirmed') { $mil=new Mailing($db); $result=$mil->fetch($_GET['id']); - + if ($mil->statut == 0) { dolibarr_print_error('','ErrorMailIsNotValidated'); exit; } - + $id = $mil->id; $subject = $mil->sujet; $message = $mil->body; @@ -106,16 +112,16 @@ if ($_POST["action"] == 'sendallconfirmed') $errorsto = $mil->email_errorsto; // Le message est-il en html $msgishtml=-1; // Unknown by default - if (eregi('[ \t]*',$message)) $msgishtml=1; - + if (eregi('[ \t]*',$message)) $msgishtml=1; + // Warning, we must not use begin-commit transaction here // because we want to save update for each mail sent. - + $nbok=0; $nbko=0; // On choisit les mails non deja envoyes pour ce mailing (statut=0) // ou envoyes en erreur (statut=-1) - $sql = "SELECT mc.rowid, mc.nom, mc.prenom, mc.email"; + $sql = "SELECT mc.rowid, mc.nom, mc.prenom, mc.email, mc.other"; $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc"; $sql .= " WHERE mc.statut < 1 AND mc.fk_mailing = ".$id; @@ -124,50 +130,57 @@ if ($_POST["action"] == 'sendallconfirmed') { $num = $db->num_rows($resql); // nb of possible recipients - if ($num) + if ($num) { dolibarr_syslog("mailing-send: nb of targets = ".$num, LOG_DEBUG); // Positionne date debut envoi - $sql="UPDATE ".MAIN_DB_PREFIX."mailing SET date_envoi=SYSDATE() WHERE rowid=".$id; + $sql="UPDATE ".MAIN_DB_PREFIX."mailing SET date_envoi=".$db->idate(gmmktime())." WHERE rowid=".$id; $resql2=$db->query($sql); if (! $resql2) { dolibarr_print_error($db); } - + // Boucle sur chaque adresse et envoie le mail $i = 0; - + while ($i < $num && $i < $conf->global->MAILING_LIMIT_SENDBYWEB) { - + $res=1; - + $obj = $db->fetch_object($resql); // sendto en RFC2822 $sendto = $obj->prenom." ".$obj->nom." <".$obj->email.">"; // Pratique les substitutions sur le sujet et message - $substitutionarray=array( + $other=split(';',$obj->other); + $other1=$other[0]; + $other2=$other[1]; + $other3=$other[3]; + $substitutionarray=array( '__ID__' => $obj->rowid, '__EMAIL__' => $obj->email, '__LASTNAME__' => $obj->nom, - '__FIRSTNAME__' => $obj->prenom + '__FIRSTNAME__' => $obj->prenom, + '__OTHER1__' => $other1, + '__OTHER2__' => $other2, + '__OTHER3__' => $other3 ); $substitutionisok=true; $newsubject=make_substitutions($subject,$substitutionarray); $newmessage=make_substitutions($message,$substitutionarray); - + // Fabrication du mail - $mail = new CMailFile($newsubject, $sendto, $from, $newmessage, + $mail = new CMailFile($newsubject, $sendto, $from, $newmessage, array(), array(), array(), '', '', 0, $msgishtml); $mail->errors_to = $errorsto; - - + + if ($mail->error) { $res=0; @@ -183,38 +196,38 @@ if ($_POST["action"] == 'sendallconfirmed') { $res=$mail->sendfile(); } - + if ($res) { // Mail envoye avec succes $nbok++; - + dolibarr_syslog("mailing-send: ok for #".$i.($mail->error?' - '.$mail->error:''), LOG_DEBUG); $sql="UPDATE ".MAIN_DB_PREFIX."mailing_cibles"; - $sql.=" SET statut=1, date_envoi=SYSDATE() WHERE rowid=".$obj->rowid; + $sql.=" SET statut=1, date_envoi=".$db->idate(gmmktime())." WHERE rowid=".$obj->rowid; $resql2=$db->query($sql); if (! $resql2) { - dolibarr_print_error($db); + dolibarr_print_error($db); } } else { // Mail en echec $nbko++; - + dolibarr_syslog("mailing-send: error for #".$i.($mail->error?' - '.$mail->error:''), LOG_DEBUG); $sql="UPDATE ".MAIN_DB_PREFIX."mailing_cibles"; - $sql.=" SET statut=-1, date_envoi=SYSDATE() WHERE rowid=".$obj->rowid; + $sql.=" SET statut=-1, date_envoi=".$db->idate(gmmktime())." WHERE rowid=".$obj->rowid; $resql2=$db->query($sql); if (! $resql2) { - dolibarr_print_error($db); + dolibarr_print_error($db); } } - + $i++; } } @@ -224,10 +237,10 @@ if ($_POST["action"] == 'sendallconfirmed') { $statut=2; // Status 'sent partially' (because at least one error) } - else + else { if ($nbok >= $num) $statut=3; // Send to everybody - else $statut=2; // Status 'sent partially' (because not send to everybody) + else $statut=2; // Status 'sent partially' (because not send to everybody) } $sql="UPDATE ".MAIN_DB_PREFIX."mailing SET statut=".$statut." WHERE rowid=".$id; @@ -244,7 +257,7 @@ if ($_POST["action"] == 'sendallconfirmed') dolibarr_print_error($db); } $message=''; - $_GET["action"] = ''; + $_GET["action"] = ''; } } @@ -254,7 +267,7 @@ if ($_POST["action"] == 'send' && ! $_POST["cancel"]) { $mil = new Mailing($db); $result=$mil->fetch($_POST["mailid"]); - + $mil->sendto = $_POST["sendto"]; if (! $mil->sendto) { @@ -268,12 +281,12 @@ if ($_POST["action"] == 'send' && ! $_POST["cancel"]) // Le message est-il en html $msgishtml=-1; // Inconnu par defaut - if (eregi('[ \t]*',$message)) $msgishtml=1; + if (eregi('[ \t]*',$message)) $msgishtml=1; // Pratique les substitutions sur le sujet et message $mil->sujet=make_substitutions($mil->sujet,$substitutionarrayfortest); $mil->body=make_substitutions($mil->body,$substitutionarrayfortest); - + $mailfile = new CMailFile($mil->sujet,$mil->sendto,$mil->email_from,$mil->body, $arr_file,$arr_mime,$arr_name, '', '', 0, $msgishtml); @@ -297,7 +310,7 @@ if ($_POST["action"] == 'send' && ! $_POST["cancel"]) if ($_POST["action"] == 'add') { $message=''; - + $mil = new Mailing($db); $mil->email_from = trim($_POST["from"]); @@ -371,11 +384,11 @@ if ($_POST["action"] == 'confirm_approve') if ($_POST["confirm"] == 'yes') { $mil = new Mailing($db); - + if ($mil->fetch($_GET["id"]) >= 0) { $mil->approve($user); - + Header("Location: fiche.php?id=".$mil->id); exit; } @@ -398,7 +411,7 @@ if ($_POST["action"] == 'confirm_delete') { $mil = new Mailing($db); $mil->id = $_GET["id"]; - + if ($mil->delete($mil->id)) { Header("Location: index.php"); @@ -430,14 +443,15 @@ if ($_GET["action"] == 'create') print '
'."\n"; print ''; - print_titre($langs->trans("NewMailing")); + print_fiche_titre($langs->trans("NewMailing")); if ($message) print "$message
"; print ''; - print ''; print ''; + print ''; + print ''; print ''; print '
'.$langs->trans("MailFrom").'
'.$langs->trans("MailTitle").'
 
'.$langs->trans("MailFrom").'
'.$langs->trans("MailTopic").'
'.$langs->trans("MailMessage").'
'; print '
'.$langs->trans("CommonSubstitutions").':
'; @@ -571,8 +585,8 @@ else print '
'; print ""; - - + + // Clone confirmation if ($_GET["action"] == 'clone') { @@ -585,10 +599,10 @@ else // Paiement incomplet. On demande si motif = escompte ou autre $html->form_confirm($_SERVER["PHP_SELF"].'?id='.$mil->id,$langs->trans('CloneEMailing'),$langs->trans('ConfirmCloneEMailing',$mil->ref),'confirm_clone',$formquestion,'yes'); } - - + + if ($mesg) print $mesg; - + if ($_GET["action"] == 'sendall') { @@ -597,7 +611,7 @@ else $message='
'.$langs->trans("MailingNeedCommand").'
'; $message.='
'; } - + if ($message) print "$message
"; /* @@ -643,10 +657,10 @@ else if ($_GET["action"] == 'test') { print_titre($langs->trans("TestMailing")); - + // Create l'objet formulaire mail include_once("../../html.formmail.class.php"); - $formmail = new FormMail($db); + $formmail = new FormMail($db); $formmail->fromname = $mil->email_from; $formmail->frommail = $mil->email_from; $formmail->withsubstit=1; @@ -667,15 +681,15 @@ else $formmail->param["models"]="body"; $formmail->param["mailid"]=$mil->id; $formmail->param["returnurl"]=DOL_URL_ROOT."/comm/mailing/fiche.php?id=".$mil->id; - + // Init list of files if (! empty($_REQUEST["mode"]) && $_REQUEST["mode"]=='init') { $formmail->clear_attached_files(); } - + $formmail->show_form(); - + print '
'; } @@ -700,6 +714,7 @@ else print '__EMAIL__ = '.$langs->trans("EMail").'
'; print '__LASTNAME__ = '.$langs->trans("Lastname").'
'; print '__FIRSTNAME__ = '.$langs->trans("Firstname").'
'; + print '__OTHER1__ = '.$langs->trans("Other").'
'; print ''; print ''; // Editeur wysiwyg diff --git a/htdocs/comm/mailing/liste.php b/htdocs/comm/mailing/liste.php index 6de8d84bed7..ae8e7b550d6 100644 --- a/htdocs/comm/mailing/liste.php +++ b/htdocs/comm/mailing/liste.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2005-2009 Laurent Destailleur * * 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 @@ -28,7 +28,7 @@ require("./pre.inc.php"); if (!$user->rights->mailing->lire) accessforbidden(); // Sécurité accés client -if ($user->societe_id > 0) +if ($user->societe_id > 0) { $action = ''; $socid = $user->societe_id; @@ -42,11 +42,17 @@ if ($page == -1) { $page = 0 ; } $offset = $conf->liste_limit * $_GET["page"] ; $pageprev = $_GET["page"] - 1; $pagenext = $_GET["page"] + 1; +if (! $sortorder) $sortorder="DESC"; +if (! $sortfield) $sortfield="m.date_creat"; $sall=isset($_GET["sall"])?$_GET["sall"]:$_POST["sall"]; $sref=isset($_GET["sref"])?$_GET["sref"]:$_POST["sref"]; +/* + * View + */ + llxHeader(); @@ -67,7 +73,7 @@ if ($result) print_barre_liste($langs->trans("ListOfEMailings"), $page, "liste.php","",$sortfield,$sortorder,"",$num); $i = 0; - + $addu = "&sall=".$sall; print ''; print ''; @@ -91,22 +97,22 @@ if ($result) print ""; print "\n"; print ''; - + $var=True; $email=new Mailing($db); - + while ($i < min($num,$conf->liste_limit)) { $obj = $db->fetch_object($result); - + $var=!$var; print ""; print ''; print ''; - print ''; + print ''; print ''; print ''; print "\n"; diff --git a/htdocs/comm/mailing/mailing.class.php b/htdocs/comm/mailing/mailing.class.php index 65d9d048d20..a0fa4ff4291 100644 --- a/htdocs/comm/mailing/mailing.class.php +++ b/htdocs/comm/mailing/mailing.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2005 Laurent Destailleur +/* Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2005-2009 Laurent Destailleur * * 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 @@ -37,7 +37,7 @@ class Mailing extends CommonObject var $error; var $element='mailing'; var $table_element='mailing'; - + var $id; var $statut; var $titre; @@ -225,9 +225,9 @@ class Mailing extends CommonObject function createFromClone($fromid,$option1,$option2) { global $user,$langs; - + $error=0; - + $object=new Mailing($this->db); $this->db->begin(); @@ -243,7 +243,7 @@ class Mailing extends CommonObject // If no option copy content if (empty($option1)) { - // Clear values + // Clear values $object->nbemail = 0; $object->titre = $langs->trans("Draft").' '.mktime(); $object->sujet = ''; @@ -265,19 +265,19 @@ class Mailing extends CommonObject $result=$object->create($user); // Other options - if ($result < 0) + if ($result < 0) { $this->error=$object->error; $error++; } - + if (! $error) { - - - + + + } - + // End if (! $error) { diff --git a/htdocs/includes/modules/mailings/README b/htdocs/includes/modules/mailings/README index 8485679d929..d277105cf58 100644 --- a/htdocs/includes/modules/mailings/README +++ b/htdocs/includes/modules/mailings/README @@ -33,14 +33,14 @@ fill the $target PHP array with one record for each email your selector must ret You can choose the way you get data: From a file, a database. You are free, the only requirement is that the $target array is filled by records that are -themselves array of: ('email', 'name', 'firstname'). +themselves array of: ('email', 'name', 'firstname', 'other'). This is for example how you can fill the $target array: // ----- Your code start here ----- -$target[0]=array('email'=>'email_0','name'=>'name_0','firstname'=>'firstname_0'); +$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'); +$target[n]=array('email'=>'email_n','name'=>'name_n','firstname'=>'firstname_n', 'other'=>'other_n'); // ----- Your code end here ----- diff --git a/htdocs/includes/modules/mailings/example.modules.php b/htdocs/includes/modules/mailings/example.modules.php index 1e417796ad0..d61873acf7c 100644 --- a/htdocs/includes/modules/mailings/example.modules.php +++ b/htdocs/includes/modules/mailings/example.modules.php @@ -29,7 +29,7 @@ class mailing_example extends MailingTargets // CHANGE THIS: Put here a name not already used var $name='example'; // CHANGE THIS: Put here a description of your selector module. - // This label is used if no translation for MailingModuleDescXXX where XXX=name is found + // This label is used if no translation is found for key MailingModuleDescXXX where XXX=name is found var $desc='Put here a description'; // CHANGE THIS: Set to 1 if selector is available for admin users only var $require_admin=0; @@ -37,7 +37,7 @@ class mailing_example extends MailingTargets var $require_module=array(); var $picto=''; var $db; - + // CHANGE THIS: Constructor name must be called mailing_xxx with xxx=name of your selector function mailing_example($DB) @@ -60,18 +60,18 @@ class mailing_example extends MailingTargets // ----- 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'); + // $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'); + // $target[n]=array('email'=>'email_n','name'=>'name_n','firstname'=>'firstname_n', 'other'=>'other_n'); - // Example: $target[0]=array('email'=>'myemail@mydomain.com','name'=>'Doe','firstname'=>'John'); + // Example: $target[0]=array('email'=>'myemail@mydomain.com', 'name'=>'Doe', 'firstname'=>'John', 'other'=>'Other information'); // ----- Your code end here ----- - + return parent::add_to_target($mailing_id, $target); } - - + + /** * \brief 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 @@ -82,7 +82,7 @@ class mailing_example extends MailingTargets function getSqlArrayForStats() { // 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"; return array(); @@ -101,9 +101,9 @@ class mailing_example extends MailingTargets // Example: return parent::getNbOfRecipients("SELECT count(*) as nb from dolibarr_table"); // Example: return 500; - return '?'; + return '?'; } - + /** * \brief This is to add a form filter to provide variant of selector * If used, the HTML select must be called "filter" @@ -116,8 +116,8 @@ class mailing_example extends MailingTargets $s=''; return $s; } - - + + /** * \brief Can include an URL link on each record provided by selector * shown on target page. diff --git a/htdocs/includes/modules/mailings/fraise.modules.php b/htdocs/includes/modules/mailings/fraise.modules.php index c9869b0c229..cc3b4c43f75 100644 --- a/htdocs/includes/modules/mailings/fraise.modules.php +++ b/htdocs/includes/modules/mailings/fraise.modules.php @@ -39,7 +39,7 @@ class mailing_fraise extends MailingTargets var $require_module=array('adherent'); // Module mailing actif si modules require_module actifs var $require_admin=0; // Module mailing actif pour user admin ou non var $picto='user'; - + var $db; @@ -47,7 +47,7 @@ class mailing_fraise extends MailingTargets { $this->db=$DB; } - + function getSqlArrayForStats() { @@ -78,10 +78,10 @@ class mailing_fraise extends MailingTargets // La requete doit retourner un champ "nb" pour etre comprise // par parent::getNbOfRecipients - return parent::getNbOfRecipients($sql); + return parent::getNbOfRecipients($sql); } - - + + /** * \brief Affiche formulaire de filtre qui apparait dans page de selection * des destinataires de mailings @@ -91,7 +91,7 @@ class mailing_fraise extends MailingTargets { global $langs; $langs->load("members"); - + $s=''; $s.=''; return $s; } - - + + /** * \brief Renvoie url lien vers fiche de la source du destinataire du mailing * \return string Url lien @@ -111,8 +111,8 @@ class mailing_fraise extends MailingTargets { return ''.img_object('',"user").''; } - - + + /** * \brief Ajoute destinataires dans table des cibles * \param mailing_id Id du mailing concerné @@ -121,10 +121,15 @@ class mailing_fraise extends MailingTargets */ function add_to_target($mailing_id,$filtersarray=array()) { - $cibles = array(); + global $langs; + $langs->load("members"); + + $cibles = array(); // La requete doit retourner: id, email, fk_contact, name, firstname - $sql = "SELECT a.rowid as id, a.email as email, null as fk_contact, a.nom as name, a.prenom as firstname"; + $sql = "SELECT a.rowid as id, a.email as email, null as fk_contact, "; + $sql.= " a.nom as name, a.prenom as firstname,"; + $sql.= " a.datefin"; // Other fields $sql.= " FROM ".MAIN_DB_PREFIX."adherent as a"; $sql.= " WHERE a.email IS NOT NULL"; foreach($filtersarray as $key) @@ -157,6 +162,7 @@ class mailing_fraise extends MailingTargets 'fk_contact' => $obj->fk_contact, 'name' => $obj->name, 'firstname' => $obj->firstname, + 'other' => $obj->datefin?($langs->transnoentities("DateEnd").'='.dolibarr_print_date($this->db->jdate($obj->datefin),'day')):'', 'url' => $this->url($obj->id) ); $old = $obj->email; diff --git a/htdocs/includes/modules/mailings/kiwi.modules.php b/htdocs/includes/modules/mailings/kiwi.modules.php index 1fd7c799707..ea39193415b 100644 --- a/htdocs/includes/modules/mailings/kiwi.modules.php +++ b/htdocs/includes/modules/mailings/kiwi.modules.php @@ -18,26 +18,24 @@ include_once DOL_DOCUMENT_ROOT.'/includes/modules/mailings/modules_mailings.php'; -// CHANGE THIS: Class name must be called mailing_xxx with xxx=name of your selector - /** - \class mailing_kiwi - \brief Class to manage a list of personalised recipients for mailing feature -*/ + * \class mailing_kiwi + * \brief Class to manage a list of personalised recipients for mailing feature + */ class mailing_kiwi extends MailingTargets { // CHANGE THIS: Put here a name not already used var $name='ContactsCategories'; // CHANGE THIS: Put here a description of your selector module. - // This label is used if no translation for MailingModuleDescXXX where XXX=name is found - var $desc="Contacts des tiers (par categorie)"; + // This label is used if no translation found for key MailingModuleDescXXX where XXX=name is found + var $desc="Third parties (by categories)"; // CHANGE THIS: Set to 1 if selector is available for admin users only var $require_admin=0; var $require_module=array("categorie"); - var $picto='contact'; + var $picto='company'; var $db; - + // CHANGE THIS: Constructor name must be called mailing_xxx with xxx=name of your selector function mailing_categories($DB) @@ -54,15 +52,21 @@ class mailing_kiwi extends MailingTargets */ function add_to_target($mailing_id,$filtersarray=array()) { - $cibles = array(); + global $langs; + + $cibles = array(); // CHANGE THIS // Select the contacts from category - $sql = "SELECT s.rowid as id, s.email as email, s.nom as name, llx_categorie.label, null as fk_contact, null as firstname - FROM llx_societe as s - LEFT JOIN llx_categorie_societe ON llx_categorie_societe.fk_societe=s.rowid - LEFT JOIN llx_categorie ON llx_categorie.rowid = llx_categorie_societe.fk_categorie - WHERE llx_categorie.rowid='".$_POST['filter']."'"; + $sql = "SELECT s.rowid as id, s.email as email, s.nom as name, null as fk_contact, null as firstname,"; + if ($_POST['filter']) $sql.= " llx_categorie.label as label"; + else $sql.=" null as label"; + $sql.= " FROM llx_societe as s"; + if ($_POST['filter']) $sql.= " LEFT JOIN llx_categorie_societe ON llx_categorie_societe.fk_societe=s.rowid"; + if ($_POST['filter']) $sql.= " LEFT JOIN llx_categorie ON llx_categorie.rowid = llx_categorie_societe.fk_categorie"; + $sql.= " WHERE s.email != ''"; + if ($_POST['filter']) $sql.= " AND llx_categorie.rowid='".$_POST['filter']."'"; + $sql.= " ORDER BY s.email"; // Stocke destinataires dans cibles $result=$this->db->query($sql); @@ -85,6 +89,7 @@ class mailing_kiwi extends MailingTargets 'fk_contact' => $obj->fk_contact, 'name' => $obj->name, 'firstname' => $obj->firstname, + 'other' => ($obj->label?$langs->transnoentities("Category").'='.$obj->label:''), 'url' => $this->url($obj->id) ); $old = $obj->email; @@ -101,11 +106,11 @@ class mailing_kiwi extends MailingTargets return -1; } - + return parent::add_to_target($mailing_id, $cibles); } - - + + /** * \brief 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 @@ -116,7 +121,7 @@ class mailing_kiwi extends MailingTargets function getSqlArrayForStats() { // 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"; return array(); @@ -131,9 +136,15 @@ class mailing_kiwi extends MailingTargets */ function getNbOfRecipients() { - return '?'; + $sql = "SELECT count(distinct(s.email)) as nb"; + $sql .= " FROM ".MAIN_DB_PREFIX."societe as s"; + $sql .= " WHERE s.email != ''"; + + // La requete doit retourner un champ "nb" pour etre comprise + // par parent::getNbOfRecipients + return parent::getNbOfRecipients($sql); } - + /** * \brief This is to add a form filter to provide variant of selector * If used, the HTML select must be called "filter" @@ -142,10 +153,11 @@ class mailing_kiwi extends MailingTargets function formFilter() { global $langs; - + $s=''; $s.=''; $s.=''; @@ -123,8 +123,8 @@ class mailing_poire extends MailingTargets $s.=''; return $s; } - - + + /** * \brief Renvoie url lien vers fiche de la source du destinataire du mailing * \return string Url lien @@ -133,8 +133,8 @@ class mailing_poire extends MailingTargets { return ''.img_object('',"contact").''; } - - + + /** * \brief Ajoute destinataires dans table des cibles * \param mailing_id Id du mailing concerné @@ -143,7 +143,9 @@ class mailing_poire extends MailingTargets */ function add_to_target($mailing_id,$filtersarray=array()) { - $cibles = array(); + global $langs; + + $cibles = array(); # List prospects levels $prospectlevel=array(); @@ -165,12 +167,14 @@ class mailing_poire extends MailingTargets } else dolibarr_print_error($this->db); - // La requete doit retourner: id, email, fk_contact, name, firstname - $sql = "SELECT c.rowid as id, c.email as email, c.rowid as fk_contact, c.name as name, c.firstname as firstname"; - $sql .= " FROM ".MAIN_DB_PREFIX."socpeople as c"; - $sql .= ", ".MAIN_DB_PREFIX."societe as s"; - $sql .= " WHERE s.rowid = c.fk_soc"; - $sql .= " AND c.email != ''"; + // La requete doit retourner: id, email, fk_contact, name, firstname, other + $sql = "SELECT c.rowid as id, c.email as email, c.rowid as fk_contact,"; + $sql.= " c.name as name, c.firstname as firstname, c.civilite,"; + $sql.= " s.nom as companyname"; + $sql.= " FROM ".MAIN_DB_PREFIX."socpeople as c,"; + $sql.= " ".MAIN_DB_PREFIX."societe as s"; + $sql.= " WHERE s.rowid = c.fk_soc"; + $sql.= " AND c.email != ''"; foreach($filtersarray as $key) { if ($key == 'prospects') $sql.= " AND s.client=2"; @@ -179,7 +183,7 @@ class mailing_poire extends MailingTargets if ($key == 'customers') $sql.= " AND s.client=1"; if ($key == 'suppliers') $sql.= " AND s.fournisseur=1"; } - $sql .= " ORDER BY c.email"; + $sql.= " ORDER BY c.email"; //print "x".$sql; // Stocke destinataires dans cibles @@ -198,11 +202,15 @@ class mailing_poire extends MailingTargets $obj = $this->db->fetch_object($result); if ($old <> $obj->email) { - $cibles[$j] = array( + $other=''; + if ($obj->companyname) { if ($other) $other.=';'; $other.=$langs->transnoentities("ThirdParty").'='.$obj->companyname; } + if ($obj->civilite) { if ($other) $other.=';'; $other.=$langs->transnoentities("Civility".$obj->civilite); } + $cibles[$j] = array( 'email' => $obj->email, 'fk_contact' => $obj->fk_contact, 'name' => $obj->name, 'firstname' => $obj->firstname, + 'other' => $other, 'url' => $this->url($obj->id) ); $old = $obj->email; diff --git a/htdocs/includes/modules/mailings/pomme.modules.php b/htdocs/includes/modules/mailings/pomme.modules.php index 88fbeb0bcb6..b4983fde463 100644 --- a/htdocs/includes/modules/mailings/pomme.modules.php +++ b/htdocs/includes/modules/mailings/pomme.modules.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2005-2009 Laurent Destailleur * * 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 @@ -62,7 +62,7 @@ class mailing_pomme extends MailingTargets return $statssql; } - + /* * \brief Return here number of distinct emails returned by your selector. * For example if this selector is used to extract 500 different @@ -77,10 +77,10 @@ class mailing_pomme extends MailingTargets // La requete doit retourner un champ "nb" pour etre comprise // par parent::getNbOfRecipients - return parent::getNbOfRecipients($sql); + return parent::getNbOfRecipients($sql); } - + /** * \brief Renvoie url lien vers fiche de la source du destinataire du mailing * \return string Url lien @@ -90,7 +90,7 @@ class mailing_pomme extends MailingTargets return ''.img_object('',"user").''; } - + /** * \brief Ajoute destinataires dans table des cibles * \param mailing_id Id du mailing concerné @@ -99,13 +99,16 @@ class mailing_pomme extends MailingTargets */ function add_to_target($mailing_id,$filtersarray=array()) { + global $langs; + $cibles = array(); // La requete doit retourner: id, email, fk_contact, name, firstname - $sql = "SELECT u.rowid as id, u.email as email, null as fk_contact, u.name as name, u.firstname as firstname"; - $sql .= " FROM ".MAIN_DB_PREFIX."user as u"; - $sql .= " WHERE u.email != ''"; // u.email IS NOT NULL est implicite dans ce test - $sql .= " ORDER BY u.email"; + $sql = "SELECT u.rowid as id, u.email as email, null as fk_contact,"; + $sql.= " u.name as name, u.firstname as firstname, u.login, u.office_phone"; + $sql.= " FROM ".MAIN_DB_PREFIX."user as u"; + $sql.= " WHERE u.email != ''"; // u.email IS NOT NULL est implicite dans ce test + $sql.= " ORDER BY u.email"; // Stocke destinataires dans cibles $result=$this->db->query($sql); @@ -128,6 +131,7 @@ class mailing_pomme extends MailingTargets 'fk_contact' => $obj->fk_contact, 'name' => $obj->name, 'firstname' => $obj->firstname, + 'other' => $langs->transnoentities("Login").'='.$obj->login.';'.$langs->transnoentities("PhonePro").'='.$obj->office_phone, 'url' => $this->url($obj->id) ); $old = $obj->email; diff --git a/htdocs/install/check.php b/htdocs/install/check.php index 009ac630349..612b5eb374d 100644 --- a/htdocs/install/check.php +++ b/htdocs/install/check.php @@ -162,7 +162,7 @@ if (is_readable($conffile) && filesize($conffile) > 8) } else { - // Si non on le crée + // Si non on le crée dolibarr_install_syslog("check: we try to creat conf file '$conffile'"); $confexists=0; @@ -250,7 +250,7 @@ else print $langs->trans("ChooseYourSetupMode"); print '
'; print img_object($langs->trans("ShowEMail"),"email").' '.stripslashes($obj->rowid).''.$obj->titre.''.dolibarr_print_date($obj->datec).''.dolibarr_print_date($obj->datec,'day').''.$obj->nbemail.''.$email->LibStatut($obj->statut,5).'
'; - + print ''; print '
'.$langs->trans("FreshInstall").''; print $langs->trans("FreshInstallDesc").''; @@ -269,7 +269,7 @@ else array('from'=>'2.1.0', 'to'=>'2.2.0'), array('from'=>'2.2.0', 'to'=>'2.4.0'), array('from'=>'2.4.0', 'to'=>'2.5.0'), - //array('from'=>'2.5.0', 'to'=>'2.6.0') + array('from'=>'2.5.0', 'to'=>'2.6.0') ); # Upgrade lines foreach ($migrationscript as $migarray) diff --git a/htdocs/langs/en_US/mails.lang b/htdocs/langs/en_US/mails.lang index 889d238d16e..e87edf5d1c5 100644 --- a/htdocs/langs/en_US/mails.lang +++ b/htdocs/langs/en_US/mails.lang @@ -63,8 +63,8 @@ NoAttachedFiles=No attached files MailingModuleDescContactCompanies=Contacts of all third parties (customer, prospect, supplier, ...) MailingModuleDescDolibarrUsers=All Dolibarr users with emails MailingModuleDescFundationMembers=Fundation members with emails -MailingModuleDescEmailsFromFile=EMails from a text file (email;name;surname) -MailingModuleDescContactsCategories=Contacts of all third parties (by category) +MailingModuleDescEmailsFromFile=EMails from a text file (email;name;surname;comments) +MailingModuleDescContactsCategories=Third parties with emails (by category) LineInFile=Line %s in file RecipientSelectionModules=Defined requests for recipients' selection diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 68b73c1232e..a8b7ce96280 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -304,6 +304,7 @@ and=and or=or Other=Other Others=Others +OtherInformations=Other informations Quantity=Quantity Qty=Qty ChangedBy=Changed by diff --git a/htdocs/langs/fr_FR/mails.lang b/htdocs/langs/fr_FR/mails.lang index 191bba1d5bf..a914431e64f 100644 --- a/htdocs/langs/fr_FR/mails.lang +++ b/htdocs/langs/fr_FR/mails.lang @@ -63,8 +63,8 @@ NoAttachedFiles=Aucun fichier joint MailingModuleDescContactCompanies=Contacts des tiers (prospects, clients, fournisseurs...) MailingModuleDescDolibarrUsers=Utilisateurs de Dolibarr avec e-mail MailingModuleDescFundationMembers=Adhérents avec e-mail -MailingModuleDescEmailsFromFile=EMails issus d'un fichier texte (email;nom;prenom) -MailingModuleDescContactsCategories=Contacts des tiers (par categorie) +MailingModuleDescEmailsFromFile=EMails issus d'un fichier texte (email;nom;prenom;divers) +MailingModuleDescContactsCategories=Tiers avec e-mail (par categorie) LineInFile=Ligne %s du fichier RecipientSelectionModules=Modules de sélection des destinataires diff --git a/htdocs/langs/fr_FR/main.lang b/htdocs/langs/fr_FR/main.lang index 2df909e6280..ad8e8293701 100644 --- a/htdocs/langs/fr_FR/main.lang +++ b/htdocs/langs/fr_FR/main.lang @@ -305,6 +305,7 @@ and=et or=ou Other=Autre Others=Autres +OtherInformations=Autres informations Quantity=Quantité Qty=Qté ChangedBy=Modifié par diff --git a/mysql/migration/2.5.0-2.6.0.sql b/mysql/migration/2.5.0-2.6.0.sql index 6e0e1a847d5..2c6ec83932f 100644 --- a/mysql/migration/2.5.0-2.6.0.sql +++ b/mysql/migration/2.5.0-2.6.0.sql @@ -30,5 +30,7 @@ ALTER TABLE llx_bank ADD INDEX idx_bank_fk_account(fk_account); ALTER TABLE llx_bank ADD INDEX idx_bank_rappro(rappro); -ALTER TABLE llx_mailing_cibles add column other varchar(255) NULL, +ALTER TABLE llx_mailing_cibles add column other varchar(255) NULL; + +ALTER TABLE llx_mailing_cibles ADD INDEX idx_mailing_cibles_email (email); diff --git a/mysql/tables/llx_mailing_cibles.key.sql b/mysql/tables/llx_mailing_cibles.key.sql index 9f2adca3520..51e133a86dc 100644 --- a/mysql/tables/llx_mailing_cibles.key.sql +++ b/mysql/tables/llx_mailing_cibles.key.sql @@ -1,5 +1,5 @@ -- =================================================================== --- Copyright (C) 2005 Laurent Destailleur +-- Copyright (C) 2005-2009 Laurent Destailleur -- -- 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 @@ -20,3 +20,6 @@ ALTER TABLE llx_mailing_cibles ADD UNIQUE uk_mailing_cibles (fk_mailing, email); + +ALTER TABLE llx_mailing_cibles ADD INDEX idx_mailing_cibles_email (email); + diff --git a/mysql/tables/llx_mailing_cibles.sql b/mysql/tables/llx_mailing_cibles.sql index 6ea9439a6ef..13da8a5aff0 100644 --- a/mysql/tables/llx_mailing_cibles.sql +++ b/mysql/tables/llx_mailing_cibles.sql @@ -1,5 +1,6 @@ -- ======================================================================== -- Copyright (C) 2005 Rodolphe Quiedeville +-- Copyright (C) 2009 Laurent Destailleur -- -- 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