27 require
'../../main.inc.php';
28 require_once DOL_DOCUMENT_ROOT.
'/core/modules/mailings/modules_mailings.php';
29 require_once DOL_DOCUMENT_ROOT.
'/comm/mailing/class/mailing.class.php';
30 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmailing.class.php';
31 require_once DOL_DOCUMENT_ROOT.
'/core/lib/emailing.lib.php';
32 require_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
33 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
36 $langs->load(
"mails");
39 $limit =
GETPOST(
'limit',
'int') ?
GETPOST(
'limit',
'int') : $conf->liste_limit;
40 $sortfield =
GETPOST(
'sortfield',
'aZ09comma');
41 $sortorder =
GETPOST(
'sortorder',
'aZ09comma');
43 if (empty($page) || $page == -1) {
46 $offset = $limit * $page;
47 $pageprev = $page - 1;
48 $pagenext = $page + 1;
50 $sortfield =
"mc.statut,email";
53 $sortorder =
"DESC,ASC";
57 $rowid =
GETPOST(
'rowid',
'int');
58 $action =
GETPOST(
'action',
'aZ09');
59 $search_lastname =
GETPOST(
"search_lastname",
'alphanohtml');
60 $search_firstname =
GETPOST(
"search_firstname",
'alphanohtml');
61 $search_email =
GETPOST(
"search_email",
'alphanohtml');
62 $search_other =
GETPOST(
"search_other",
'alphanohtml');
63 $search_dest_status =
GETPOST(
'search_dest_status',
'int');
69 $result = $object->fetch($id);
72 $hookmanager->initHooks(array(
'ciblescard',
'globalcard'));
75 if (!$user->rights->mailing->lire || (empty($conf->global->EXTERNAL_USERS_ARE_AUTHORIZED) && $user->socid > 0)) {
85 if ($action ==
'add') {
86 $module =
GETPOST(
"module",
'alpha');
89 foreach ($modulesdir as $dir) {
92 dol_syslog(
"Scan directory ".$dir.
" for modules");
95 $file = $dir.
"/".$module.
".modules.php";
96 $classname =
"mailing_".$module;
98 if (file_exists($file)) {
102 $obj =
new $classname($db);
103 dol_syslog(
"Call add_to_target on class ".$classname);
104 $result = $obj->add_to_target($id);
115 setEventMessages($langs->trans(
"Error").($obj->error ?
' '.$obj->error :
''),
null,
'errors');
119 if (
GETPOST(
'clearlist',
'int')) {
122 $obj->clear_target($id);
129 if (
GETPOST(
'exportcsv',
'int')) {
130 $completefilename =
'targets_emailing'.$object->id.
'_'.
dol_print_date(
dol_now(),
'dayhourlog').
'.csv';
131 header(
'Content-Type: text/csv');
132 header(
'Content-Disposition: attachment;filename='.$completefilename);
135 $sql =
"SELECT mc.rowid, mc.lastname, mc.firstname, mc.email, mc.other, mc.statut as status, mc.date_envoi, mc.tms,";
136 $sql .=
" mc.source_id, mc.source_type, mc.error_text";
137 $sql .=
" FROM ".MAIN_DB_PREFIX.
"mailing_cibles as mc";
138 $sql .=
" WHERE mc.fk_mailing = ".((int) $object->id);
139 $sql .= $db->order($sortfield, $sortorder);
141 $resql = $db->query($sql);
143 $num = $db->num_rows(
$resql);
146 while ($obj = $db->fetch_object(
$resql)) {
147 print $obj->rowid.$sep;
148 print
'"'.$obj->lastname.
'"'.$sep;
149 print
'"'.$obj->firstname.
'"'.$sep;
150 print $obj->email.$sep;
151 print $obj->other.$sep;
152 print $obj->tms.$sep;
153 print $obj->source_type.$sep;
154 print $obj->source_id.$sep;
155 print $obj->date_envoi.$sep;
156 print $obj->status.$sep;
157 print
'"'.$obj->error_text.
'"'.$sep;
168 if ($action ==
'delete') {
170 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"mailing_cibles WHERE rowid = ".((int) $rowid);
171 $resql = $db->query($sql);
175 $obj->update_nb($id);
179 header(
"Location: list.php");
188 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
189 $search_lastname =
'';
190 $search_firstname =
'';
193 $search_dest_status =
'';
202 llxHeader(
'', $langs->trans(
"Mailing"),
'EN:Module_EMailing|FR:Module_Mailing|ES:Módulo_Mailing');
207 if ($object->fetch($id) >= 0) {
212 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
216 if ($object->statut == 2 || $object->statut == 3) {
217 $nbtry = $object->countNbOfTargets(
'alreadysent');
218 $nbko = $object->countNbOfTargets(
'alreadysentko');
219 $nbok = ($nbtry - $nbko);
221 $morehtmlright .=
' ('.$nbtry.
'/'.$object->nbemail;
223 $morehtmlright .=
' - '.$nbko.
' '.$langs->trans(
"Error");
225 $morehtmlright .=
') ';
228 dol_banner_tab($object,
'id', $linkback, 1,
'rowid',
'ref',
'',
'', 0,
'', $morehtmlright);
230 print
'<div class="fichecenter">';
231 print
'<div class="underbanner clearboth"></div>';
233 print
'<table class="border centpercent tableforfield">';
235 print
'<tr><td class="titlefield">'.$langs->trans(
"MailTitle").
'</td><td colspan="3">'.$object->title.
'</td></tr>';
237 print
'<tr><td>'.$langs->trans(
"MailFrom").
'</td><td colspan="3">';
239 foreach ($emailarray as $email => $name) {
240 if ($name && $name != $email) {
244 $langs->load(
"errors");
245 print
img_warning($langs->trans(
"ErrorBadEMail", $email));
256 print
'<tr><td>'.$langs->trans(
"MailErrorsTo").
'</td><td colspan="3">';
258 foreach ($emailarray as $email => $name) {
259 if ($name != $email) {
263 $langs->load(
"errors");
264 print
img_warning($langs->trans(
"ErrorBadEMail", $email));
274 print $langs->trans(
"TotalNbOfDistinctRecipients");
275 print
'</td><td colspan="3">';
276 $nbemail = ($object->nbemail ? $object->nbemail : 0);
277 if (is_numeric($nbemail)) {
279 if ((!empty($conf->global->MAILING_LIMIT_SENDBYWEB) && $conf->global->MAILING_LIMIT_SENDBYWEB < $nbemail) && ($object->statut == 1 || ($object->statut == 2 && $nbtry < $nbemail))) {
280 if ($conf->global->MAILING_LIMIT_SENDBYWEB > 0) {
281 $text .= $langs->trans(
'LimitSendingEmailing', $conf->global->MAILING_LIMIT_SENDBYWEB);
283 $text .= $langs->trans(
'SendingFromWebInterfaceIsNotAllowed');
286 if (empty($nbemail)) {
287 $nbemail .=
' '.img_warning(
'').
' <span class="warning">'.$langs->trans(
"NoTargetYet").
'</span>';
290 print
$form->textwithpicto($nbemail, $text, 1,
'warning');
306 $allowaddtarget = ($object->statut == 0);
309 if ($allowaddtarget && $user->rights->mailing->creer) {
310 print
load_fiche_titre($langs->trans(
"ToAddRecipientsChooseHere"), ($user->admin ?
info_admin($langs->trans(
"YouCanAddYourOwnPredefindedListHere"), 1) :
''),
'generic');
314 print
'<div class="div-table-responsive">';
315 print
'<div class="tagtable centpercent liste_titre_bydiv borderbottom" id="tablelines">';
318 print
'<div class="tagtr liste_titre">';
320 print
'<div class="tagtd">'.$langs->trans(
"RecipientSelectionModules").
'</div>';
322 print
'<div class="tagtd" align="center">'.$langs->trans(
"NbOfUniqueEMails").
'</div>';
324 print
'<div class="tagtd left">'.$langs->trans(
"Filter").
'</div>';
326 print
'<div class="tagtd"> </div>';
332 foreach ($modulesdir as $dir) {
333 $modulenames = array();
337 dol_syslog(
"Scan directory ".$dir.
" for modules");
338 $handle = @opendir($dir);
339 if (is_resource($handle)) {
340 while (($file = readdir($handle)) !==
false) {
341 if (substr($file, 0, 1) <>
'.' && substr($file, 0, 3) <>
'CVS') {
343 if (preg_match(
"/(.*)\.modules\.php$/i", $file, $reg)) {
344 if ($reg[1] ==
'example') {
347 $modulenames[] = $reg[1];
360 foreach ($modulenames as $modulename) {
362 $file = $dir.$modulename.
".modules.php";
363 $classname =
"mailing_".$modulename;
366 $obj =
new $classname($db);
369 $qualified = (is_null($obj->enabled) ? 1 :
dol_eval($obj->enabled, 1));
372 foreach ($obj->require_module as $key) {
373 if (empty($conf->$key->enabled) || (empty($user->admin) && $obj->require_admin)) {
384 if ($allowaddtarget) {
385 print
'<form '.$bctag[$var].
' name="'.$modulename.
'" action="'.$_SERVER[
'PHP_SELF'].
'?action=add&token='.
newToken().
'&id='.$object->id.
'&module='.$modulename.
'" method="POST" enctype="multipart/form-data">';
386 print
'<input type="hidden" name="token" value="'.newToken().
'">';
387 print
'<input type="hidden" name="page_y" value="'.newToken().
'">';
389 print
'<div '.$bctag[$var].
'>';
392 print
'<div class="tagtd">';
393 if (empty($obj->picto)) {
394 $obj->picto =
'generic';
396 print
img_object($langs->trans(
"EmailingTargetSelector").
': '.get_class($obj), $obj->picto,
'class="valignmiddle pictomodule"');
398 print $obj->getDesc();
402 $nbofrecipient = $obj->getNbOfRecipients(
'');
407 print
'<div class="tagtd center">';
408 if ($nbofrecipient ===
'' || $nbofrecipient >= 0) {
409 print $nbofrecipient;
411 print $langs->trans(
"Error").
' '.
img_error($obj->error);
415 print
'<div class="tagtd left">';
416 if ($allowaddtarget) {
418 $filter = $obj->formFilter();
425 print $langs->trans(
"None");
430 print
'<div class="tagtd right">';
431 if ($allowaddtarget) {
432 print
'<input type="submit" class="button button-add small reposition" name="button_'.$modulename.
'" value="'.$langs->trans(
"Add").
'">';
434 print
'<input type="submit" class="button small disabled" disabled="disabled" name="button_'.$modulename.
'" value="'.$langs->trans(
"Add").
'">';
440 if ($allowaddtarget) {
449 $parameters = array();
450 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
451 print $hookmanager->resPrint;
460 $sql =
"SELECT mc.rowid, mc.lastname, mc.firstname, mc.email, mc.other, mc.statut, mc.date_envoi, mc.tms,";
461 $sql .=
" mc.source_url, mc.source_id, mc.source_type, mc.error_text";
462 $sql .=
" FROM ".MAIN_DB_PREFIX.
"mailing_cibles as mc";
463 $sql .=
" WHERE mc.fk_mailing=".((int) $object->id);
464 $asearchcriteriahasbeenset = 0;
465 if ($search_lastname) {
467 $asearchcriteriahasbeenset++;
469 if ($search_firstname) {
471 $asearchcriteriahasbeenset++;
475 $asearchcriteriahasbeenset++;
479 $asearchcriteriahasbeenset++;
481 if ($search_dest_status !=
'' && $search_dest_status >= -1) {
482 $sql .=
" AND mc.statut = ".((int) $search_dest_status);
483 $asearchcriteriahasbeenset++;
485 $sql .= $db->order($sortfield, $sortorder);
488 $nbtotalofrecords =
'';
489 if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
490 $result = $db->query($sql);
491 $nbtotalofrecords = $db->num_rows($result);
492 if (($page * $limit) > $nbtotalofrecords) {
498 if (empty($asearchcriteriahasbeenset)) {
499 if ($nbtotalofrecords != $object->nbemail) {
500 dol_syslog(
"We found a difference in nb of record in target table and the property ->nbemail, we fix ->nbemail");
502 $resultrefresh = $object->refreshNbOfTargets();
503 if ($resultrefresh < 0) {
511 $sql .= $db->plimit($limit + 1, $offset);
513 $resql = $db->query($sql);
515 $num = $db->num_rows(
$resql);
517 $param =
"&id=".$object->id;
519 if ($limit > 0 && $limit != $conf->liste_limit) {
520 $param .=
'&limit='.urlencode($limit);
522 if ($search_lastname) {
523 $param .=
"&search_lastname=".urlencode($search_lastname);
525 if ($search_firstname) {
526 $param .=
"&search_firstname=".urlencode($search_firstname);
529 $param .=
"&search_email=".urlencode($search_email);
532 $param .=
"&search_other=".urlencode($search_other);
535 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
536 print
'<input type="hidden" name="token" value="'.newToken().
'">';
537 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
538 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
539 print
'<input type="hidden" name="page" value="'.$page.
'">';
540 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
542 $morehtmlcenter =
'';
543 if ($allowaddtarget) {
544 $morehtmlcenter =
'<span class="opacitymedium hideonsmartphone">'.$langs->trans(
"ToClearAllRecipientsClickHere").
'</span> <a href="'.$_SERVER[
"PHP_SELF"].
'?clearlist=1&id='.$object->id.
'" class="button reposition smallpaddingimp">'.$langs->trans(
"TargetsReset").
'</a>';
546 $morehtmlcenter .=
' <a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?exportcsv=1&id='.$object->id.
'">'.$langs->trans(
"Download").
'</a>';
548 $massactionbutton =
'';
550 print_barre_liste($langs->trans(
"MailSelectedRecipients"), $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $morehtmlcenter, $num, $nbtotalofrecords,
'generic', 0,
'',
'', $limit);
554 print
"\n<!-- Liste destinataires selectionnes -->\n";
555 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
556 print
'<input type="hidden" name="token" value="'.newToken().
'">';
557 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
558 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
559 print
'<input type="hidden" name="page" value="'.$page.
'">';
560 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
561 print
'<input type="hidden" name="limit" value="'.$limit.
'">';
563 print
'<div class="div-table-responsive">';
564 print
'<table class="noborder centpercent">';
567 print
'<tr class="liste_titre_filter">';
569 print
'<td class="liste_titre">';
570 print
'<input class="flat maxwidth75" type="text" name="search_email" value="'.dol_escape_htmltag($search_email).
'">';
573 print
'<td class="liste_titre">';
574 print
'<input class="flat maxwidth50" type="text" name="search_lastname" value="'.dol_escape_htmltag($search_lastname).
'">';
577 print
'<td class="liste_titre">';
578 print
'<input class="flat maxwidth50" type="text" name="search_firstname" value="'.dol_escape_htmltag($search_firstname).
'">';
581 print
'<td class="liste_titre">';
582 print
'<input class="flat maxwidth100" type="text" name="search_other" value="'.dol_escape_htmltag($search_other).
'">';
585 print
'<td class="liste_titre">';
590 print
'<td class="liste_titre">';
595 print
'<td class="liste_titre">';
600 print
'<td class="liste_titre right">';
601 print $formmailing->selectDestinariesStatus($search_dest_status,
'search_dest_status', 1);
604 print
'<td class="liste_titre maxwidthsearch">';
605 $searchpicto =
$form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
611 $param .=
"&page=".urlencode($page);
614 print
'<tr class="liste_titre">';
616 print_liste_field_titre(
"Lastname", $_SERVER[
"PHP_SELF"],
"mc.lastname", $param,
"",
"", $sortfield, $sortorder);
617 print_liste_field_titre(
"Firstname", $_SERVER[
"PHP_SELF"],
"mc.firstname", $param,
"",
"", $sortfield, $sortorder);
618 print_liste_field_titre(
"OtherInformations", $_SERVER[
"PHP_SELF"],
"", $param,
"",
"", $sortfield, $sortorder);
619 print_liste_field_titre(
"Source", $_SERVER[
"PHP_SELF"],
"", $param,
"",
'align="center"', $sortfield, $sortorder);
621 print_liste_field_titre(
"DateLastModification", $_SERVER[
"PHP_SELF"],
"mc.tms", $param,
"",
'align="center"', $sortfield, $sortorder);
623 print_liste_field_titre(
"DateSending", $_SERVER[
"PHP_SELF"],
"mc.date_envoi", $param,
'',
'align="center"', $sortfield, $sortorder);
624 print_liste_field_titre(
"Status", $_SERVER[
"PHP_SELF"],
"mc.statut", $param,
'',
'class="right"', $sortfield, $sortorder);
631 include_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent.class.php';
632 include_once DOL_DOCUMENT_ROOT.
'/user/class/user.class.php';
633 include_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
634 include_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
635 $objectstaticmember =
new Adherent($db);
636 $objectstaticuser =
new User($db);
637 $objectstaticcompany =
new Societe($db);
638 $objectstaticcontact =
new Contact($db);
640 while ($i < min($num, $limit)) {
641 $obj = $db->fetch_object(
$resql);
643 print
'<tr class="oddeven">';
644 print
'<td class="tdoverflowmax150">'.img_picto(
'$obj->email',
'email',
'class="paddingright"').dol_escape_htmltag($obj->email).
'</td>';
645 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->lastname).
'">'.
dol_escape_htmltag($obj->lastname).
'</td>';
646 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->firstname).
'">'.
dol_escape_htmltag($obj->firstname).
'</td>';
647 print
'<td>'.dol_escape_htmltag($obj->other).
'</td>';
648 print
'<td class="center tdoverflowmax150">';
649 if (empty($obj->source_id) || empty($obj->source_type)) {
650 print empty($obj->source_url) ?
'' : $obj->source_url;
652 if ($obj->source_type ==
'member') {
653 $objectstaticmember->fetch($obj->source_id);
654 print $objectstaticmember->getNomUrl(1);
655 } elseif ($obj->source_type ==
'user') {
656 $objectstaticuser->fetch($obj->source_id);
657 print $objectstaticuser->getNomUrl(1);
658 } elseif ($obj->source_type ==
'thirdparty') {
659 $objectstaticcompany->fetch($obj->source_id);
660 print $objectstaticcompany->getNomUrl(1);
661 } elseif ($obj->source_type ==
'contact') {
662 $objectstaticcontact->fetch($obj->source_id);
663 print $objectstaticcontact->getNomUrl(1);
665 print $obj->source_url;
671 print
'<td class="center nowraponall">';
676 if ($obj->statut == 0) {
678 print
'<td align="center"></td>';
680 print
'<td class="nowrap right">';
681 print $object::libStatutDest($obj->statut, 2,
'');
685 print
'<td class="center nowraponall">'.$obj->date_envoi.
'</td>';
687 print
'<td class="nowrap right">';
688 print $object::libStatutDest($obj->statut, 2, $obj->error_text);
693 print
'<td class="right">';
694 print
'<!-- ID mailing_cibles = '.$obj->rowid.
' -->';
695 if ($obj->statut == 0) {
696 if (!empty($user->rights->mailing->creer) && $allowaddtarget) {
697 print
'<a class="reposition" href="'.$_SERVER[
'PHP_SELF'].
'?action=delete&token='.
newToken().
'&rowid='.$obj->rowid.$param.
'">'.
img_delete($langs->trans(
"RemoveRecipient")).
'</a>';
710 if ($object->statut < 2) {
711 print
'<tr><td colspan="9" class="opacitymedium">';
712 print $langs->trans(
"NoTargetYet");
716 print
"</table><br>";
726 print
"\n<!-- Fin liste destinataires selectionnes -->\n";