28 require
'../../main.inc.php';
29 require_once DOL_DOCUMENT_ROOT.
'/core/modules/mailings/modules_mailings.php';
30 require_once DOL_DOCUMENT_ROOT.
'/comm/mailing/class/mailing.class.php';
31 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmailing.class.php';
32 require_once DOL_DOCUMENT_ROOT.
'/core/lib/emailing.lib.php';
33 require_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
34 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
37 $langs->load(
"mails");
40 $limit =
GETPOST(
'limit',
'int') ?
GETPOST(
'limit',
'int') : $conf->liste_limit;
41 $sortfield =
GETPOST(
'sortfield',
'aZ09comma');
42 $sortorder =
GETPOST(
'sortorder',
'aZ09comma');
44 if (empty($page) || $page == -1) {
47 $offset = $limit * $page;
48 $pageprev = $page - 1;
49 $pagenext = $page + 1;
51 $sortfield =
"mc.statut,email";
54 $sortorder =
"DESC,ASC";
58 $rowid =
GETPOST(
'rowid',
'int');
59 $action =
GETPOST(
'action',
'aZ09');
60 $search_lastname =
GETPOST(
"search_lastname",
'alphanohtml');
61 $search_firstname =
GETPOST(
"search_firstname",
'alphanohtml');
62 $search_email =
GETPOST(
"search_email",
'alphanohtml');
63 $search_other =
GETPOST(
"search_other",
'alphanohtml');
64 $search_dest_status =
GETPOST(
'search_dest_status',
'int');
70 $result = $object->fetch($id);
73 $hookmanager->initHooks(array(
'ciblescard',
'globalcard'));
76 if (!$user->rights->mailing->lire || (empty($conf->global->EXTERNAL_USERS_ARE_AUTHORIZED) && $user->socid > 0)) {
86 if ($action ==
'add') {
87 $module =
GETPOST(
"module",
'alpha');
90 foreach ($modulesdir as $dir) {
93 dol_syslog(
"Scan directory ".$dir.
" for modules");
96 $file = $dir.
"/".$module.
".modules.php";
97 $classname =
"mailing_".$module;
99 if (file_exists($file)) {
103 $obj =
new $classname($db);
104 dol_syslog(
"Call add_to_target on class ".$classname);
105 $result = $obj->add_to_target($id);
116 setEventMessages($langs->trans(
"Error").($obj->error ?
' '.$obj->error :
''),
null,
'errors');
120 if (
GETPOST(
'clearlist',
'int')) {
123 $obj->clear_target($id);
130 if (
GETPOST(
'exportcsv',
'int')) {
131 $completefilename =
'targets_emailing'.$object->id.
'_'.
dol_print_date(
dol_now(),
'dayhourlog').
'.csv';
132 header(
'Content-Type: text/csv');
133 header(
'Content-Disposition: attachment;filename='.$completefilename);
136 $sql =
"SELECT mc.rowid, mc.lastname, mc.firstname, mc.email, mc.other, mc.statut as status, mc.date_envoi, mc.tms,";
137 $sql .=
" mc.source_id, mc.source_type, mc.error_text";
138 $sql .=
" FROM ".MAIN_DB_PREFIX.
"mailing_cibles as mc";
139 $sql .=
" WHERE mc.fk_mailing = ".((int) $object->id);
140 $sql .= $db->order($sortfield, $sortorder);
142 $resql = $db->query(
$sql);
144 $num = $db->num_rows($resql);
147 while ($obj = $db->fetch_object($resql)) {
148 print $obj->rowid.$sep;
149 print
'"'.$obj->lastname.
'"'.$sep;
150 print
'"'.$obj->firstname.
'"'.$sep;
151 print $obj->email.$sep;
152 print $obj->other.$sep;
153 print $obj->tms.$sep;
154 print $obj->source_type.$sep;
155 print $obj->source_id.$sep;
156 print $obj->date_envoi.$sep;
157 print $obj->status.$sep;
158 print
'"'.$obj->error_text.
'"'.$sep;
169 if ($action ==
'delete') {
171 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"mailing_cibles WHERE rowid = ".((int) $rowid);
172 $resql = $db->query(
$sql);
176 $obj->update_nb($id);
180 header(
"Location: list.php");
189 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
190 $search_lastname =
'';
191 $search_firstname =
'';
194 $search_dest_status =
'';
203 llxHeader(
'', $langs->trans(
"Mailing"),
'EN:Module_EMailing|FR:Module_Mailing|ES:Módulo_Mailing');
208 if ($object->fetch($id) >= 0) {
213 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
215 $morehtmlref =
'<div class="refidno">';
217 $morehtmlref .=
$form->editfieldkey(
"",
'title', $object->title, $object, 0,
'string',
'', 0, 1);
218 $morehtmlref .=
$form->editfieldval(
"",
'title', $object->title, $object, 0,
'string',
'',
null,
null,
'', 1);
219 $morehtmlref .=
'</div>';
223 if ($object->statut == 2 || $object->statut == 3) {
224 $nbtry = $object->countNbOfTargets(
'alreadysent');
225 $nbko = $object->countNbOfTargets(
'alreadysentko');
226 $nbok = ($nbtry - $nbko);
228 $morehtmlright .=
' ('.$nbtry.
'/'.$object->nbemail;
230 $morehtmlright .=
' - '.$nbko.
' '.$langs->trans(
"Error");
232 $morehtmlright .=
') ';
235 dol_banner_tab($object,
'id', $linkback, 1,
'rowid',
'ref', $morehtmlref,
'', 0,
'', $morehtmlright);
237 print
'<div class="fichecenter">';
238 print
'<div class="underbanner clearboth"></div>';
240 print
'<table class="border centpercent tableforfield">';
244 print
'<tr><td class="titlefield">'.$langs->trans(
"MailFrom").
'</td><td colspan="3">';
246 foreach ($emailarray as $email => $name) {
247 if ($name && $name != $email) {
251 $langs->load(
"errors");
252 print
img_warning($langs->trans(
"ErrorBadEMail", $email));
263 print
'<tr><td>'.$langs->trans(
"MailErrorsTo").
'</td><td colspan="3">';
265 foreach ($emailarray as $email => $name) {
266 if ($name != $email) {
270 $langs->load(
"errors");
271 print
img_warning($langs->trans(
"ErrorBadEMail", $email));
281 print $langs->trans(
"TotalNbOfDistinctRecipients");
282 print
'</td><td colspan="3">';
283 $nbemail = ($object->nbemail ? $object->nbemail : 0);
284 if (is_numeric($nbemail)) {
286 if ((!empty($conf->global->MAILING_LIMIT_SENDBYWEB) && $conf->global->MAILING_LIMIT_SENDBYWEB < $nbemail) && ($object->statut == 1 || ($object->statut == 2 && $nbtry < $nbemail))) {
287 if ($conf->global->MAILING_LIMIT_SENDBYWEB > 0) {
288 $text .= $langs->trans(
'LimitSendingEmailing', $conf->global->MAILING_LIMIT_SENDBYWEB);
290 $text .= $langs->trans(
'SendingFromWebInterfaceIsNotAllowed');
293 if (empty($nbemail)) {
294 $nbemail .=
' '.img_warning(
'');
297 print
$form->textwithpicto($nbemail, $text, 1,
'warning');
313 $allowaddtarget = ($object->statut == 0);
316 if ($allowaddtarget && $user->rights->mailing->creer) {
317 print
load_fiche_titre($langs->trans(
"ToAddRecipientsChooseHere"), ($user->admin ?
info_admin($langs->trans(
"YouCanAddYourOwnPredefindedListHere"), 1) :
''),
'generic');
319 print
'<div class="div-table-responsive">';
320 print
'<div class="tagtable centpercent liste_titre_bydiv borderbottom" id="tablelines">';
322 print
'<div class="tagtr liste_titre">';
323 print
'<div class="tagtd"></div>';
324 print
'<div class="tagtd">'.$langs->trans(
"RecipientSelectionModules").
'</div>';
325 print
'<div class="tagtd" align="center">'.$langs->trans(
"NbOfUniqueEMails").
'</div>';
326 print
'<div class="tagtd left">'.$langs->trans(
"Filter").
'</div>';
327 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 paddingleftimp marginleftonly paddingrightimp marginrightonly valignmiddle center">';
393 if (empty($obj->picto)) {
394 $obj->picto =
'generic';
396 print
img_object($langs->trans(
"EmailingTargetSelector").
': '.get_class($obj), $obj->picto,
'class="valignmiddle width25 size15x"');
398 print
'<div class="tagtd valignmiddle">';
399 print $obj->getDesc();
403 $nbofrecipient = $obj->getNbOfRecipients(
'');
408 print
'<div class="tagtd center valignmiddle">';
409 if ($nbofrecipient ===
'' || $nbofrecipient >= 0) {
410 print $nbofrecipient;
412 print $langs->trans(
"Error").
' '.
img_error($obj->error);
416 print
'<div class="tagtd left valignmiddle">';
417 if ($allowaddtarget) {
419 $filter = $obj->formFilter();
426 print $langs->trans(
"None");
431 print
'<div class="tagtd right valignmiddle">';
432 if ($allowaddtarget) {
433 print
'<input type="submit" class="button button-add small reposition" name="button_'.$modulename.
'" value="'.$langs->trans(
"Add").
'">';
435 print
'<input type="submit" class="button small disabled" disabled="disabled" name="button_'.$modulename.
'" value="'.$langs->trans(
"Add").
'">';
441 if ($allowaddtarget) {
450 $parameters = array();
451 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
452 print $hookmanager->resPrint;
461 $sql =
"SELECT mc.rowid, mc.lastname, mc.firstname, mc.email, mc.other, mc.statut, mc.date_envoi, mc.tms,";
462 $sql .=
" mc.source_url, mc.source_id, mc.source_type, mc.error_text";
463 $sql .=
" FROM ".MAIN_DB_PREFIX.
"mailing_cibles as mc";
464 $sql .=
" WHERE mc.fk_mailing=".((int) $object->id);
465 $asearchcriteriahasbeenset = 0;
466 if ($search_lastname) {
468 $asearchcriteriahasbeenset++;
470 if ($search_firstname) {
472 $asearchcriteriahasbeenset++;
476 $asearchcriteriahasbeenset++;
480 $asearchcriteriahasbeenset++;
482 if ($search_dest_status !=
'' && $search_dest_status >= -1) {
483 $sql .=
" AND mc.statut = ".((int) $search_dest_status);
484 $asearchcriteriahasbeenset++;
486 $sql .= $db->order($sortfield, $sortorder);
490 if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
491 $result = $db->query(
$sql);
499 if (empty($asearchcriteriahasbeenset)) {
501 dol_syslog(
"We found a difference in nb of record in target table and the property ->nbemail, we fix ->nbemail");
503 $resultrefresh = $object->refreshNbOfTargets();
504 if ($resultrefresh < 0) {
512 $sql .= $db->plimit($limit + 1, $offset);
514 $resql = $db->query(
$sql);
516 $num = $db->num_rows($resql);
518 $param =
"&id=".$object->id;
520 if ($limit > 0 && $limit != $conf->liste_limit) {
521 $param .=
'&limit='.urlencode($limit);
523 if ($search_lastname) {
524 $param .=
"&search_lastname=".urlencode($search_lastname);
526 if ($search_firstname) {
527 $param .=
"&search_firstname=".urlencode($search_firstname);
530 $param .=
"&search_email=".urlencode($search_email);
533 $param .=
"&search_other=".urlencode($search_other);
536 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
537 print
'<input type="hidden" name="token" value="'.newToken().
'">';
538 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
539 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
540 print
'<input type="hidden" name="page" value="'.$page.
'">';
541 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
543 $morehtmlcenter =
'';
544 if ($allowaddtarget) {
545 $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>';
547 $morehtmlcenter .=
' <a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?action=exportcsv&token='.
newToken().
'&exportcsv=1&id='.$object->id.
'">'.
img_picto(
'',
'download',
'class="pictofixedwidth"').$langs->trans(
"Download").
'</a>';
549 $massactionbutton =
'';
551 print_barre_liste($langs->trans(
"MailSelectedRecipients"), $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $morehtmlcenter, $num,
$nbtotalofrecords,
'generic', 0,
'',
'', $limit, 0, 0, 1);
555 print
"\n<!-- Liste destinataires selectionnes -->\n";
556 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
557 print
'<input type="hidden" name="token" value="'.newToken().
'">';
558 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
559 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
560 print
'<input type="hidden" name="page" value="'.$page.
'">';
561 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
562 print
'<input type="hidden" name="limit" value="'.$limit.
'">';
563 print
'<input type="hidden" name="page_y" value="">';
565 print
'<div class="div-table-responsive">';
566 print
'<table class="noborder centpercent">';
569 print
'<tr class="liste_titre_filter">';
571 print
'<td class="liste_titre">';
572 print
'<input class="flat maxwidth75" type="text" name="search_email" value="'.dol_escape_htmltag($search_email).
'">';
575 print
'<td class="liste_titre">';
576 print
'<input class="flat maxwidth50" type="text" name="search_lastname" value="'.dol_escape_htmltag($search_lastname).
'">';
579 print
'<td class="liste_titre">';
580 print
'<input class="flat maxwidth50" type="text" name="search_firstname" value="'.dol_escape_htmltag($search_firstname).
'">';
583 print
'<td class="liste_titre">';
584 print
'<input class="flat maxwidth100" type="text" name="search_other" value="'.dol_escape_htmltag($search_other).
'">';
587 print
'<td class="liste_titre">';
592 print
'<td class="liste_titre">';
597 print
'<td class="liste_titre">';
602 print
'<td class="liste_titre right">';
603 print $formmailing->selectDestinariesStatus($search_dest_status,
'search_dest_status', 1);
606 print
'<td class="liste_titre maxwidthsearch">';
607 $searchpicto =
$form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
613 $param .=
"&page=".urlencode($page);
616 print
'<tr class="liste_titre">';
618 print_liste_field_titre(
"Lastname", $_SERVER[
"PHP_SELF"],
"mc.lastname", $param,
"",
"", $sortfield, $sortorder);
619 print_liste_field_titre(
"Firstname", $_SERVER[
"PHP_SELF"],
"mc.firstname", $param,
"",
"", $sortfield, $sortorder);
620 print_liste_field_titre(
"OtherInformations", $_SERVER[
"PHP_SELF"],
"", $param,
"",
"", $sortfield, $sortorder);
621 print_liste_field_titre(
"Source", $_SERVER[
"PHP_SELF"],
"", $param,
"",
'align="center"', $sortfield, $sortorder);
623 print_liste_field_titre(
"DateLastModification", $_SERVER[
"PHP_SELF"],
"mc.tms", $param,
"",
'align="center"', $sortfield, $sortorder);
625 print_liste_field_titre(
"DateSending", $_SERVER[
"PHP_SELF"],
"mc.date_envoi", $param,
'',
'align="center"', $sortfield, $sortorder);
626 print_liste_field_titre(
"Status", $_SERVER[
"PHP_SELF"],
"mc.statut", $param,
'',
'class="right"', $sortfield, $sortorder);
633 include_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent.class.php';
634 include_once DOL_DOCUMENT_ROOT.
'/user/class/user.class.php';
635 include_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
636 include_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
637 include_once DOL_DOCUMENT_ROOT.
'/eventorganization/class/conferenceorboothattendee.class.php';
638 $objectstaticmember =
new Adherent($db);
639 $objectstaticuser =
new User($db);
640 $objectstaticcompany =
new Societe($db);
641 $objectstaticcontact =
new Contact($db);
644 while ($i < min($num, $limit)) {
645 $obj = $db->fetch_object($resql);
647 print
'<tr class="oddeven">';
648 print
'<td class="tdoverflowmax150">'.img_picto(
'$obj->email',
'email',
'class="paddingright"').dol_escape_htmltag($obj->email).
'</td>';
649 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->lastname).
'">'.
dol_escape_htmltag($obj->lastname).
'</td>';
650 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->firstname).
'">'.
dol_escape_htmltag($obj->firstname).
'</td>';
651 print
'<td><span class="small">'.dol_escape_htmltag($obj->other).
'</small></td>';
652 print
'<td class="center tdoverflowmax150">';
653 if (empty($obj->source_id) || empty($obj->source_type)) {
654 print empty($obj->source_url) ?
'' : $obj->source_url;
656 if ($obj->source_type ==
'member') {
657 $objectstaticmember->fetch($obj->source_id);
658 print $objectstaticmember->getNomUrl(1);
659 } elseif ($obj->source_type ==
'user') {
660 $objectstaticuser->fetch($obj->source_id);
661 print $objectstaticuser->getNomUrl(1);
662 } elseif ($obj->source_type ==
'thirdparty') {
663 $objectstaticcompany->fetch($obj->source_id);
664 print $objectstaticcompany->getNomUrl(1);
665 } elseif ($obj->source_type ==
'contact') {
666 $objectstaticcontact->fetch($obj->source_id);
667 print $objectstaticcontact->getNomUrl(1);
668 } elseif ($obj->source_type ==
'eventorganizationattendee') {
669 $objectstaticeventorganization->fetch($obj->source_id);
670 print $objectstaticeventorganization->getNomUrl(1);
672 print $obj->source_url;
678 print
'<td class="center nowraponall">';
683 if ($obj->statut == 0) {
685 print
'<td align="center"></td>';
687 print
'<td class="nowrap right">';
688 print $object::libStatutDest($obj->statut, 2,
'');
692 print
'<td class="center nowraponall">'.$obj->date_envoi.
'</td>';
694 print
'<td class="nowrap right">';
695 print $object::libStatutDest($obj->statut, 2, $obj->error_text);
700 print
'<td class="right">';
701 print
'<!-- ID mailing_cibles = '.$obj->rowid.
' -->';
702 if ($obj->statut == 0) {
703 if (!empty($user->rights->mailing->creer) && $allowaddtarget) {
704 print
'<a class="reposition" href="'.$_SERVER[
'PHP_SELF'].
'?action=delete&token='.
newToken().
'&rowid='.$obj->rowid.$param.
'">'.
img_delete($langs->trans(
"RemoveRecipient")).
'</a>';
717 if ($object->statut < $object::STATUS_SENTPARTIALY) {
718 print
'<tr><td colspan="9">';
719 print
'<span class="opacitymedium">'.$langs->trans(
"NoTargetYet").
'</span>';
722 print
'<tr><td colspan="9">';
723 print
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
727 print
"</table><br>";
737 print
"\n<!-- Fin liste destinataires selectionnes -->\n";