dolibarr 23.0.4
advtargetemailing.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2014 Florian Henry <florian.henry@open-concept.pro>
3 * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
5 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
28// Load Dolibarr environment
29require '../../main.inc.php';
30require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmailing.class.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/emailing.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/core/modules/mailings/advthirdparties.modules.php';
35require_once DOL_DOCUMENT_ROOT.'/comm/mailing/class/advtargetemailing.class.php';
36require_once DOL_DOCUMENT_ROOT.'/comm/mailing/class/html.formadvtargetemailing.class.php';
37require_once DOL_DOCUMENT_ROOT.'/comm/mailing/class/mailing.class.php';
38require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
41
50// Load translation files required by the page
51$langs->loadLangs(array('mails', 'admin', 'companies', 'categories'));
52
53$action = GETPOST('action', 'aZ09');
54$toselect = GETPOST('toselect', 'array:int'); // Array of ids of elements selected into a list
55
56// Load variable for pagination
57$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
58$sortfield = GETPOST('sortfield', 'aZ09comma');
59$sortorder = GETPOST('sortorder', 'aZ09comma');
60$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
61if (empty($page) || $page == -1) {
62 $page = 0;
63} // If $page is not defined, or '' or -1
64$offset = $limit * $page;
65$pageprev = $page - 1;
66$pagenext = $page + 1;
67if (!$sortorder) {
68 $sortorder = "ASC";
69}
70if (!$sortfield) {
71 $sortfield = "email";
72}
73
74$id = GETPOSTINT('id');
75$rowid = GETPOSTINT('rowid');
76$search_nom = GETPOST("search_nom");
77$search_prenom = GETPOST("search_prenom");
78$search_email = GETPOST("search_email");
79$template_id = GETPOSTINT('template_id');
80
81// Do we click on purge search criteria ?
82if (GETPOST('button_removefilter_x', 'alpha')) {
83 $search_nom = '';
84 $search_prenom = '';
85 $search_email = '';
86}
87$array_query = array();
88'@phan-var-force array<string,int|string|string[]> $array_query';
89
90$object = new Mailing($db);
91$result = $object->fetch($id);
92
93$advTarget = new AdvanceTargetingMailing($db);
94
95if ($template_id <= 0) {
96 $advTarget->fk_element = $id;
97 $advTarget->type_element = 'mailing';
98 $result = $advTarget->fetch_by_mailing();
99} else {
100 $result = $advTarget->fetch($template_id);
101}
102
103if ($result < 0) {
104 setEventMessages($advTarget->error, $advTarget->errors, 'errors');
105} else {
106 if (!empty($advTarget->id)) {
107 $array_query = json_decode($advTarget->filtervalue, true);
108 }
109}
110
111// List of sending methods
112$listofmethods = array();
113//$listofmethods['default'] = $langs->trans('DefaultOutgoingEmailSetup');
114$listofmethods['mail'] = 'PHP mail function';
115//$listofmethods['simplemail']='Simplemail class';
116$listofmethods['smtps'] = 'SMTP/SMTPS socket library';
117if (version_compare(phpversion(), '7.0', '>=')) {
118 $listofmethods['swiftmailer'] = 'Swift Mailer socket library';
119}
120
121// Security check
122if (!$user->hasRight('mailing', 'lire') || (!getDolGlobalString('EXTERNAL_USERS_ARE_AUTHORIZED') && $user->socid > 0)) {
124}
125if (empty($action) && empty($object->id)) {
126 accessforbidden('Object not found');
127}
128
129$permissiontoread = $user->hasRight('mailing', 'lire');
130$permissiontoadd = $user->hasRight('mailing', 'creer');
131$permissiontovalidatesend = $user->hasRight('mailing', 'valider');
132$permissiontodelete = $user->hasRight('mailing', 'supprimer');
133
134
135/*
136 * Actions
137 */
138
139if ($action == 'loadfilter' && $permissiontoread) {
140 if (!empty($template_id)) {
141 $result = $advTarget->fetch($template_id);
142 if ($result < 0) {
143 setEventMessages($advTarget->error, $advTarget->errors, 'errors');
144 } else {
145 if (!empty($advTarget->id)) {
146 $array_query = json_decode($advTarget->filtervalue, true);
147 }
148 }
149 }
150}
151
152if ($action == 'add' && $permissiontoadd) { // Add recipients
153 $user_contact_query = false;
154
155 $array_query = array();
156
157 // Get extra fields
158
159 foreach ($_POST as $key => $value) {
160 // print '$key='.$key.' $value='.$value.'<BR>';
161 if (preg_match("/^options_.*(?<!_cnct)$/", $key)) {
162 // Special case for start date come with 3 inputs day, month, year
163 if (preg_match("/st_dt/", $key)) {
164 $dtarr = array();
165 $dtarr = explode('_', $key);
166 if (!array_key_exists('options_'.$dtarr[1].'_st_dt', $array_query)) {
167 $array_query['options_'.$dtarr[1].'_st_dt'] = dol_mktime(0, 0, 0, GETPOSTINT('options_'.$dtarr[1].'_st_dtmonth'), GETPOSTINT('options_'.$dtarr[1].'_st_dtday'), GETPOSTINT('options_'.$dtarr[1].'_st_dtyear'));
168 }
169 } elseif (preg_match("/end_dt/", $key)) {
170 // Special case for end date come with 3 inputs day, month, year
171 $dtarr = array();
172 $dtarr = explode('_', $key);
173 if (!array_key_exists('options_'.$dtarr[1].'_end_dt', $array_query)) {
174 $array_query['options_'.$dtarr[1].'_end_dt'] = dol_mktime(0, 0, 0, GETPOSTINT('options_'.$dtarr[1].'_end_dtmonth'), GETPOSTINT('options_'.$dtarr[1].'_end_dtday'), GETPOSTINT('options_'.$dtarr[1].'_end_dtyear'));
175 }
176 } else {
177 $array_query[$key] = GETPOST($key);
178 }
179 }
180 if (preg_match("/^options_.*_cnct/", $key)) {
181 $user_contact_query = true;
182 // Special case for start date come with 3 inputs day, month, year
183 if (preg_match("/st_dt/", $key)) {
184 $dtarr = array();
185 $dtarr = explode('_', $key);
186 if (!array_key_exists('options_'.$dtarr[1].'_st_dt_cnct', $array_query)) {
187 $array_query['options_'.$dtarr[1].'_st_dt_cnct'] = dol_mktime(0, 0, 0, GETPOSTINT('options_'.$dtarr[1].'_st_dtmonth_cnct'), GETPOSTINT('options_'.$dtarr[1].'_st_dtday_cnct'), GETPOSTINT('options_'.$dtarr[1].'_st_dtyear_cnct'));
188 }
189 } elseif (preg_match("/end_dt/", $key)) {
190 // Special case for end date come with 3 inputs day, month, year
191 $dtarr = array();
192 $dtarr = explode('_', $key);
193 if (!array_key_exists('options_'.$dtarr[1].'_end_dt_cnct', $array_query)) {
194 $array_query['options_'.$dtarr[1].'_end_dt_cnct'] = dol_mktime(0, 0, 0, GETPOSTINT('options_'.$dtarr[1].'_end_dtmonth_cnct'), GETPOSTINT('options_'.$dtarr[1].'_end_dtday_cnct'), GETPOSTINT('options_'.$dtarr[1].'_end_dtyear_cnct'));
195 }
196 } else {
197 $array_query[$key] = GETPOST($key);
198 }
199 }
200
201 if (preg_match("/^cust_/", $key)) {
202 $array_query[$key] = GETPOST($key);
203 }
204
205 if (preg_match("/^contact_/", $key)) {
206 $array_query[$key] = GETPOST($key);
207
208 $specials_date_key = array(
209 'contact_update_st_dt',
210 'contact_update_end_dt',
211 'contact_create_st_dt',
212 'contact_create_end_dt'
213 );
214 foreach ($specials_date_key as $date_key) {
215 if ($key == $date_key) {
216 $dt = GETPOST($date_key);
217 if (!empty($dt)) {
218 $array_query[$key] = dol_mktime(0, 0, 0, GETPOSTINT($date_key.'month'), GETPOSTINT($date_key.'day'), GETPOSTINT($date_key.'year'));
219 } else {
220 $array_query[$key] = '';
221 }
222 }
223 }
224
225 if (!empty($array_query[$key])) {
226 $user_contact_query = true;
227 }
228 }
229
230 if ($array_query['type_of_target'] == 2 || $array_query['type_of_target'] == 4) {
231 $user_contact_query = true;
232 }
233
234 if (preg_match("/^type_of_target/", $key)) {
235 $array_query[$key] = GETPOST($key);
236 }
237 }
238
239 // if ($array_query ['type_of_target'] == 1 || $array_query ['type_of_target'] == 3) {
240 $result = $advTarget->query_thirdparty($array_query);
241 if ($result < 0) {
242 setEventMessages($advTarget->error, $advTarget->errors, 'errors');
243 }
244 /*} else {
245 $advTarget->thirdparty_lines = array ();
246 }*/
247
248 if ($user_contact_query && ($array_query['type_of_target'] == 1 || $array_query['type_of_target'] == 2 || $array_query['type_of_target'] == 4)) {
249 $result = $advTarget->query_contact($array_query, 1);
250 if ($result < 0) {
251 setEventMessages($advTarget->error, $advTarget->errors, 'errors');
252 }
253 // If use contact but no result use artefact to so not use socid into add_to_target
254 if (count($advTarget->contact_lines) == 0) {
255 $advTarget->contact_lines = array(
256 0
257 );
258 }
259 } else {
260 $advTarget->contact_lines = array();
261 }
262
263 $mailingadvthirdparties = null;
264 if ((count($advTarget->thirdparty_lines) > 0) || (count($advTarget->contact_lines) > 0)) {
265 // Add targets into database
266 $mailingadvthirdparties = new mailing_advthirdparties($db);
267 $result = $mailingadvthirdparties->add_to_target_spec($id, $advTarget->thirdparty_lines, $array_query['type_of_target'], $advTarget->contact_lines);
268 } else {
269 $result = 0;
270 }
271
272 if ($result > 0) {
273 $query_temlate_id = '';
274 if (!empty($template_id)) {
275 $query_temlate_id = '&template_id='.$template_id;
276 }
277 setEventMessages($langs->trans("XTargetsAdded", $result), null, 'mesgs');
278 header("Location: ".$_SERVER['PHP_SELF']."?id=".$id.$query_temlate_id);
279 exit();
280 }
281 if ($result == 0) {
282 setEventMessages($langs->trans("WarningNoEMailsAdded"), null, 'warnings');
283 }
284 if ($result < 0 && is_object($mailingadvthirdparties)) {
285 setEventMessages($mailingadvthirdparties->error, $mailingadvthirdparties->errors, 'errors');
286 }
287}
288
289if ($action == 'clear' && $permissiontoadd) {
290 $mailingtargets = new MailingTargets($db);
291 $mailingtargets->clear_target($id);
292
293 header("Location: ".$_SERVER['PHP_SELF']."?id=".$id);
294 exit();
295}
296
297if (($action == 'savefilter' || $action == 'createfilter') && $permissiontoadd) {
298 $template_name = GETPOST('template_name');
299 $error = 0;
300
301 if ($action == 'createfilter' && empty($template_name) && $permissiontoadd) {
302 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('AdvTgtOrCreateNewFilter')), null, 'errors');
303 $error++;
304 }
305
306 if (empty($error)) {
307 $array_query = array();
308
309 // Get extra fields
310 foreach ($_POST as $key => $value) {
311 if (preg_match("/^options_.*(?<!_cnct)$/", $key)) {
312 // Special case for start date come with 3 inputs day, month, year
313 if (preg_match("/st_dt/", $key)) {
314 $dtarr = array();
315 $dtarr = explode('_', $key);
316 if (!array_key_exists('options_'.$dtarr[1].'_st_dt', $array_query)) {
317 $array_query['options_'.$dtarr[1].'_st_dt'] = dol_mktime(0, 0, 0, GETPOSTINT('options_'.$dtarr[1].'_st_dtmonth'), GETPOSTINT('options_'.$dtarr[1].'_st_dtday'), GETPOSTINT('options_'.$dtarr[1].'_st_dtyear'));
318 }
319 } elseif (preg_match("/end_dt/", $key)) {
320 // Special case for end date come with 3 inputs day, month, year
321 $dtarr = array();
322 $dtarr = explode('_', $key);
323 if (!array_key_exists('options_'.$dtarr[1].'_end_dt', $array_query)) {
324 $array_query['options_'.$dtarr[1].'_end_dt'] = dol_mktime(0, 0, 0, GETPOSTINT('options_'.$dtarr[1].'_end_dtmonth'), GETPOSTINT('options_'.$dtarr[1].'_end_dtday'), GETPOSTINT('options_'.$dtarr[1].'_end_dtyear'));
325 // print $array_query['options_'.$dtarr[1].'_end_dt'];
326 // 01/02/1013=1361228400
327 }
328 } else {
329 $array_query[$key] = GETPOST($key);
330 }
331 }
332 if (preg_match("/^options_.*_cnct/", $key)) {
333 // Special case for start date come with 3 inputs day, month, year
334 if (preg_match("/st_dt/", $key)) {
335 $dtarr = array();
336 $dtarr = explode('_', $key);
337 if (!array_key_exists('options_'.$dtarr[1].'_st_dt_cnct', $array_query)) {
338 $array_query['options_'.$dtarr[1].'_st_dt_cnct'] = dol_mktime(0, 0, 0, GETPOSTINT('options_'.$dtarr[1].'_st_dtmonth_cnct'), GETPOSTINT('options_'.$dtarr[1].'_st_dtday_cnct'), GETPOSTINT('options_'.$dtarr[1].'_st_dtyear_cnct'));
339 }
340 } elseif (preg_match("/end_dt/", $key)) {
341 // Special case for end date come with 3 inputs day, month, year
342 $dtarr = array();
343 $dtarr = explode('_', $key);
344 if (!array_key_exists('options_'.$dtarr[1].'_end_dt_cnct', $array_query)) {
345 $array_query['options_'.$dtarr[1].'_end_dt_cnct'] = dol_mktime(0, 0, 0, GETPOSTINT('options_'.$dtarr[1].'_end_dtmonth_cnct'), GETPOSTINT('options_'.$dtarr[1].'_end_dtday_cnct'), GETPOSTINT('options_'.$dtarr[1].'_end_dtyear_cnct'));
346 // print $array_query['cnct_options_'.$dtarr[1].'_end_dt'];
347 // 01/02/1013=1361228400
348 }
349 } else {
350 $array_query[$key] = GETPOST($key);
351 }
352 }
353
354 if (preg_match("/^cust_/", $key)) {
355 $array_query[$key] = GETPOST($key);
356 }
357
358 if (preg_match("/^contact_/", $key)) {
359 $array_query[$key] = GETPOST($key);
360
361 $specials_date_key = array(
362 'contact_update_st_dt',
363 'contact_update_end_dt',
364 'contact_create_st_dt',
365 'contact_create_end_dt'
366 );
367 foreach ($specials_date_key as $date_key) {
368 if ($key == $date_key) {
369 $dt = GETPOST($date_key);
370 if (!empty($dt)) {
371 $array_query[$key] = dol_mktime(0, 0, 0, GETPOSTINT($date_key.'month'), GETPOSTINT($date_key.'day'), GETPOSTINT($date_key.'year'));
372 } else {
373 $array_query[$key] = '';
374 }
375 }
376 }
377 }
378
379 if (preg_match("/^type_of_target/", $key)) {
380 $array_query[$key] = GETPOST($key);
381 }
382 }
383 $advTarget->filtervalue = json_encode($array_query);
384
385 if ($action == 'createfilter') { // Test on permission already done
386 $advTarget->name = $template_name;
387 $result = $advTarget->create($user);
388 if ($result < 0) {
389 setEventMessages($advTarget->error, $advTarget->errors, 'errors');
390 }
391 } elseif ($action == 'savefilter') { // Test on permission already done
392 $result = $advTarget->update($user);
393 if ($result < 0) {
394 setEventMessages($advTarget->error, $advTarget->errors, 'errors');
395 }
396 }
397 $template_id = $advTarget->id;
398 }
399}
400
401if ($action == 'deletefilter' && $permissiontoadd) {
402 $result = $advTarget->delete($user);
403 if ($result < 0) {
404 setEventMessages($advTarget->error, $advTarget->errors, 'errors');
405 }
406 header("Location: ".$_SERVER['PHP_SELF']."?id=".$id);
407 exit();
408}
409
410if ($action == 'delete' && $permissiontoadd) {
411 // Ici, rowid indique le destinataire et id le mailing
412 $sql = "DELETE FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE rowid = ".((int) $rowid);
413 $sql .= " AND fk_mailing = ".((int) $object->id);
414 $resql = $db->query($sql);
415 if ($resql) {
416 if (!empty($id)) {
417 $mailingtargets = new MailingTargets($db);
418 $mailingtargets->update_nb($id);
419
420 header("Location: ".$_SERVER['PHP_SELF']."?id=".$id);
421 exit();
422 } else {
423 header("Location: liste.php");
424 exit();
425 }
426 } else {
427 dol_print_error($db);
428 }
429}
430
431if (GETPOST("button_removefilter")) {
432 $search_nom = '';
433 $search_prenom = '';
434 $search_email = '';
435}
436
437
438/*
439 * View
440 */
441
442$form = new Form($db);
443$formmailing = new FormMailing($db);
444$formadvtargetemaling = new FormAdvTargetEmailing($db);
445$formcompany = new FormCompany($db);
446$formother = new FormOther($db);
447
448$help_url = 'EN:Module_EMailing|FR:Module_Mailing|ES:M&oacute;dulo_Mailing';
449llxHeader('', $langs->trans("MailAdvTargetRecipients"), $help_url);
450
451$arrayofselected = is_array($toselect) ? $toselect : array();
452$totalarray = [
453 'nbfield' => 0,
454];
455
456if ($object->fetch($id) >= 0) {
457 $head = emailing_prepare_head($object);
458
459 print dol_get_fiche_head($head, 'advtargets', $langs->trans("Mailing"), -1, $object->picto);
460
461 $linkback = '<a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
462
463 $morehtmlref = '<div class="refidno">';
464 // Ref customer
465 $morehtmlref .= $form->editfieldkey("", 'title', $object->title, $object, 0, 'string', '', 0, 1);
466 $morehtmlref .= $form->editfieldval("", 'title', $object->title, $object, 0, 'string', '', null, null, '', 1);
467 $morehtmlref .= '</div>';
468
469 $morehtmlstatus = '';
470 $nbtry = $nbok = 0;
471 if ($object->status == $object::STATUS_SENTPARTIALY || $object->status == $object::STATUS_SENTCOMPLETELY) {
472 $nbtry = $object->countNbOfTargets('alreadysent');
473 $nbko = $object->countNbOfTargets('alreadysentko');
474 $nbok = ($nbtry - $nbko);
475
476 $morehtmlstatus .= ' ('.$nbtry.'/'.$object->nbemail;
477 if ($nbko) {
478 $morehtmlstatus .= ' - '.$nbko.' '.$langs->trans("Error");
479 }
480 $morehtmlstatus .= ') &nbsp; ';
481 }
482
483 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
484
485 print '<div class="fichecenter">';
486 print '<div class="fichehalfleft">';
487 print '<div class="underbanner clearboth"></div>';
488
489 print '<table class="border centpercent tableforfield">'."\n";
490
491 // From
492 print '<tr><td class="titlefield">';
493 print $langs->trans("MailFrom").'</td><td>';
494 $emailarray = CMailFile::getArrayAddress($object->email_from);
495 foreach ($emailarray as $email => $name) {
496 if ($name && $name != $email) {
497 print dol_escape_htmltag($name).' &lt;'.$email;
498 print '&gt;';
499 if (!isValidEmail($email)) {
500 $langs->load("errors");
501 print img_warning($langs->trans("ErrorBadEMail", $email));
502 }
503 } else {
504 print dol_print_email($object->email_from, 0, 0, 0, 0, 1);
505 }
506 }
507
508 print '</td></tr>';
509
510 // Errors to
511 if ($object->messtype != 'sms') {
512 print '<tr><td>'.$langs->trans("MailErrorsTo").'</td><td>';
513 $emailarray = CMailFile::getArrayAddress($object->email_errorsto);
514 foreach ($emailarray as $email => $name) {
515 if ($name != $email) {
516 print dol_escape_htmltag((string) $name).' &lt;'.$email;
517 print '&gt;';
518 if ($email && !isValidEmail($email)) {
519 $langs->load("errors");
520 print img_warning($langs->trans("ErrorBadEMail", $email));
521 } elseif ($email && !isValidMailDomain($email)) {
522 $langs->load("errors");
523 print img_warning($langs->trans("ErrorBadMXDomain", $email));
524 }
525 } else {
526 print dol_print_email($object->email_errorsto, 0, 0, 0, 0, 1);
527 }
528 }
529 print '</td></tr>';
530 }
531
532 // Reply to
533 if ($object->messtype != 'sms') {
534 print '<tr><td>';
535 print $form->editfieldkey("MailReply", 'email_replyto', $object->email_replyto, $object, (int) ($user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY), 'string');
536 print '</td><td>';
537 print $form->editfieldval("MailReply", 'email_replyto', $object->email_replyto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
538 $email = CMailFile::getValidAddress($object->email_replyto, 2);
539 if ($action != 'editemail_replyto') {
540 if ($email && !isValidEmail($email)) {
541 $langs->load("errors");
542 print img_warning($langs->trans("ErrorBadEMail", $email));
543 } elseif ($email && !isValidMailDomain($email)) {
544 $langs->load("errors");
545 print img_warning($langs->trans("ErrorBadMXDomain", $email));
546 }
547 }
548 print '</td></tr>';
549 }
550
551 print '</table>';
552 print '</div>';
553
554
555 print '<div class="fichehalfright">';
556 print '<div class="underbanner clearboth"></div>';
557
558 print '<table class="border centpercent tableforfield">';
559
560 // Number of distinct emails
561 print '<tr><td>';
562 print $langs->trans("TotalNbOfDistinctRecipients");
563 print '</td><td>';
564 $nbemail = ($object->nbemail ? $object->nbemail : 0);
565 if (is_numeric($nbemail)) {
566 $htmltooltip = '';
567 if ((getDolGlobalString('MAILING_LIMIT_SENDBYWEB') && getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < $nbemail) && ($object->status == 1 || ($object->status == 2 && $nbtry < $nbemail))) {
568 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') > 0) {
569 $htmltooltip .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
570 } else {
571 $htmltooltip .= $langs->trans('SendingFromWebInterfaceIsNotAllowed');
572 }
573 }
574 if (empty($nbemail)) {
575 $nbemail .= ' '.img_warning($langs->trans('ToAddRecipientsChooseHere'));//.' <span class="warning">'.$langs->trans("NoTargetYet").'</span>';
576 }
577 if ($htmltooltip) {
578 print $form->textwithpicto($nbemail, $htmltooltip, 1, 'info');
579 } else {
580 print $nbemail;
581 }
582 }
583 print '</td></tr>';
584
585 print '<tr><td>';
586 print $langs->trans("MAIN_MAIL_SENDMODE");
587 print '</td><td>';
588 if ($object->messtype != 'sms') {
589 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') && getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
590 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING')];
591 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE')) {
592 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE')];
593 } else {
594 $text = $listofmethods['mail'];
595 }
596 print $text;
597 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
598 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'mail') {
599 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER_EMAILING', getDolGlobalString('MAIN_MAIL_SMTP_SERVER')).')</span>';
600 }
601 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE') != 'mail' && getDolGlobalString('MAIN_MAIL_SMTP_SERVER')) {
602 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
603 }
604 } else {
605 print 'SMS ';
606 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
607 }
608 print '</td></tr>';
609
610 // Other attributes. Fields from hook formObjectOptions and Extrafields.
611 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
612
613 print '</table>';
614 print '</div>';
615 print '</div>';
616
617 print '<div class="clearboth"></div>';
618
619 print dol_get_fiche_end();
620
621 print '<br>';
622
623
624 // Show email selectors
625 if ($object->status == 0 && $user->hasRight('mailing', 'creer')) {
626 // @phan-assert FormAdvTargetEmailing $formadvtargetemaling
627 // @phan-assert AdvanceTargetingMailing $advTarget
628
629 // @phan-assert array<string,int|string|string[] $array_query'
630
631 // From controller using view
632 '
633 @phan-var-force FormAdvTargetEmailing $formadvtargetemaling
634 @phan-var-force AdvanceTargetingMailing $advTarget
635 @phan-var-force array<string,string|int|string[]> $array_query
636 ';
637
638 // Backfill keys the form below reads unconditionally. $array_query may be a fresh
639 // empty array() (new mailing, no filter yet) or come from json_decode() of a saved
640 // filter that predates one of these fields, either way missing keys must not trigger
641 // "Undefined array key" warnings. += only fills keys not already present.
642 $array_query += array(
643 'type_of_target' => '',
644 'cust_name' => '',
645 'cust_adress' => '',
646 'cust_zip' => '',
647 'cust_city' => '',
648 'cust_state' => array(),
649 'cust_country' => array(),
650 'cust_status' => array(),
651 'cust_mothercompany' => '',
652 'cust_typecust' => array(),
653 'cust_prospect_status' => array(),
654 'cust_comm_status' => array(),
655 'cust_typeent' => array(),
656 'cust_effectif_id' => array(),
657 'cust_saleman' => array(),
658 'cust_language' => array(),
659 'contact_status' => array(),
660 'contact_civility' => '',
661 'contact_lastname' => '',
662 'contact_firstname' => '',
663 'contact_country' => array(),
664 'contact_no_email' => '',
665 'contact_create_st_dt' => '',
666 'contact_create_end_dt' => '',
667 'contact_update_st_dt' => '',
668 'contact_update_end_dt' => '',
669 );
670
671 print '<script>
672 $(document).ready(function() {
673
674 // Click Function
675 $(":button[name=addcontact]").click(function() {
676 $(":hidden[name=action]").val("add");
677 $("#find_customer").submit();
678 });
679
680 $(":button[name=loadfilter]").click(function() {
681 $(":hidden[name=action]").val("loadfilter");
682 $("#find_customer").submit();
683 });
684
685 $(":button[name=deletefilter]").click(function() {
686 $(":hidden[name=action]").val("deletefilter");
687 $("#find_customer").submit();
688 });
689
690 $(":button[name=savefilter]").click(function() {
691 $(":hidden[name=action]").val("savefilter");
692 $("#find_customer").submit();
693 });
694
695 $(":button[name=createfilter]").click(function() {
696 $(":hidden[name=action]").val("createfilter");
697 $("#find_customer").submit();
698 });
699 });
700 </script>';
701
702
703 print load_fiche_titre($langs->trans("AdvTgtTitle").'...', '', '');
704
705 print '<form name="find_customer" id="find_customer" action="'.$_SERVER['PHP_SELF'].'?id='.$id.'" method="POST">'."\n";
706 print '<input type="hidden" name="token" value="'.newToken().'">'."\n";
707 print '<input type="hidden" name="action" value="">'."\n";
708 print '<table class="border centpercent">'."\n";
709
710 print '<tr><td class="titlefieldcreate">'.$langs->trans('AdvTgtNameTemplate').'</td><td class="valignmiddle">';
711 if (!empty($template_id)) {
712 $default_template = $template_id;
713 } else {
714 $default_template = $advTarget->id;
715 }
716 print $formadvtargetemaling->selectAdvtargetemailingTemplate('template_id', $default_template, $langs->trans("SelectAPredefinedFilter"), $advTarget->type_element, 'minwidth100 valignmiddle');
717 print '<input type="button" name="loadfilter" id="loadfilter" value="'.$langs->trans('AdvTgtLoadFilter').'" class="button smallpaddingimp"/>';
718 print '<input type="button" name="deletefilter" id="deletefilter" value="'.$langs->trans('AdvTgtDeleteFilter').'" class="button smallpaddingimp"/>';
719 print '<input type="button" name="savefilter" id="savefilter" value="'.$langs->trans('AdvTgtSaveFilter').'" class="button smallpaddingimp"/>'; // Update filter
720 print '</td><td>'."\n";
721 print '</td></tr>'."\n";
722
723 print '<tr><td>'.$langs->trans('AdvTgtOrCreateNewFilter').'</td><td>';
724 print '<input type="text" name="template_name" id="template_name" value=""/>';
725 print '<input type="button" name="createfilter" id="createfilter" value="'.$langs->trans('AdvTgtCreateFilter').'" class="button smallpaddingimp"/>';
726 print '</td><td>'."\n";
727 print '</td></tr>'."\n";
728
729 print '<tr><td colspan="3"><hr></td></tr>';
730
731 print '<tr>'."\n";
732 print '<td colspan="3" class="center">'."\n";
733 print '<input type="button" name="addcontact" id="addcontact" value="'.$langs->trans('AdvTgtAddContact').'" class="button"/>'."\n";
734 print '</td>'."\n";
735 print '</tr>'."\n";
736
737 print '<tr><td>'.$langs->trans('AdvTgtTypeOfIncude').'</td><td>';
738 print $form->selectarray('type_of_target', $advTarget->select_target_type, $array_query['type_of_target']);
739 print '</td><td>'."\n";
740 print $form->textwithpicto('', $langs->trans("AdvTgtTypeOfIncudeHelp"), 1, 'help');
741 print '</td></tr>'."\n";
742
743 // Customer name
744 print '<tr><td>'.$langs->trans('ThirdPartyName');
745 if (!empty($array_query['cust_name'])) {
746 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
747 }
748 print '</td><td><input type="text" name="cust_name" value="'.$array_query['cust_name'].'"/></td><td>'."\n";
749 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
750 print '</td></tr>'."\n";
751
752 // Code Client
753 print '<tr><td>'.$langs->trans('CustomerCode');
754 if (!empty($array_query['cust_code'])) {
755 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
756 $cust_code_str = (string) $array_query['cust_code'];
757 } else {
758 $cust_code_str = null;
759 }
760 print '</td><td><input type="text" name="cust_code"'.($cust_code_str != null ? ' value="'.$cust_code_str : '').'"/></td><td>'."\n";
761 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
762 print '</td></tr>'."\n";
763
764 // Address Client
765 print '<tr><td>'.$langs->trans('Address');
766 if (!empty($array_query['cust_adress'])) {
767 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
768 }
769 print '</td><td><input type="text" name="cust_adress" value="'.$array_query['cust_adress'].'"/></td><td>'."\n";
770 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
771 print '</td></tr>'."\n";
772
773 // Zip Client
774 print '<tr><td>'.$langs->trans('Zip');
775 if (!empty($array_query['cust_zip'])) {
776 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
777 }
778 print '</td><td><input type="text" name="cust_zip" value="'.$array_query['cust_zip'].'"/></td><td>'."\n";
779 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
780 print '</td></tr>'."\n";
781
782 // City Client
783 print '<tr><td>'.$langs->trans('Town');
784 if (!empty($array_query['cust_city'])) {
785 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
786 }
787 print '</td><td><input type="text" name="cust_city" value="'.$array_query['cust_city'].'"/></td><td>'."\n";
788 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
789 print '</td></tr>'."\n";
790
791 // State Client
792 print '<tr><td>'.$langs->trans('State');
793 if (!empty($array_query['cust_state'])) {
794 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
795 }
796 print '</td><td>'."\n";
797 print $formadvtargetemaling->multiselectState('cust_state', $array_query['cust_state']);
798 print '</td><td>'."\n";
799 print '</td></tr>'."\n";
800
801 // Customer Country
802 print '<tr><td>'.$langs->trans("Country");
803 if (!empty($array_query['cust_country'])) {
804 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
805 }
806 print '</td><td>'."\n";
807 print $formadvtargetemaling->multiselectCountry('cust_country', $array_query['cust_country']);
808 print '</td><td>'."\n";
809 print '</td></tr>'."\n";
810
811 // State Customer
812 print '<tr><td>'.$langs->trans('Status').' '.$langs->trans('ThirdParty');
813 if (!empty($array_query['cust_status'])) {
814 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
815 }
816 print '</td><td>';
817 print $formadvtargetemaling->advMultiselectarray(
818 'cust_status',
819 array(
820 '0' => $langs->trans('ActivityCeased'),
821 '1' => $langs->trans('InActivity')
822 ),
823 $array_query['cust_status']
824 );
825 print '</td><td>'."\n";
826 print '</td></tr>'."\n";
827
828 // Mother Company
829 print '<tr><td>'.$langs->trans("ParentCompany");
830 if (!empty($array_query['cust_mothercompany'])) {
831 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
832 }
833 print '</td><td>'."\n";
834 print '<input type="text" name="cust_mothercompany" value="'.$array_query['cust_mothercompany'].'"/>';
835 print '</td><td>'."\n";
836 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
837 print '</td></tr>'."\n";
838
839 // Prospect/Customer
840 $selected = $array_query['cust_typecust'];
841 print '<tr><td>'.$langs->trans('ProspectCustomer').' '.$langs->trans('ThirdParty');
842 if (!empty($array_query['cust_typecust'])) {
843 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
844 }
845 print '</td><td>';
846 $options_array = array(
847 2 => $langs->trans('Prospect'),
848 3 => $langs->trans('ProspectCustomer'),
849 1 => $langs->trans('Customer'),
850 0 => $langs->trans('NorProspectNorCustomer')
851 );
852 print $formadvtargetemaling->advMultiselectarray('cust_typecust', $options_array, $selected);
853 print '</td><td>'."\n";
854 print '</td></tr>'."\n";
855
856 // Prospection status
857 print '<tr><td>'.$langs->trans('ProspectLevel');
858 if (!empty($array_query['cust_prospect_status'])) {
859 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
860 }
861 print '</td><td>';
862 print $formadvtargetemaling->multiselectProspectionStatus($array_query['cust_prospect_status'], 'cust_prospect_status');
863 print '</td><td>'."\n";
864 print '</td></tr>'."\n";
865
866 // Prospection comm status
867 print '<tr><td>'.$langs->trans('StatusProsp');
868 if (!empty($array_query['cust_comm_status'])) {
869 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
870 }
871 print '</td><td>';
872 print $formadvtargetemaling->advMultiselectarray('cust_comm_status', $advTarget->type_statuscommprospect, $array_query['cust_comm_status']);
873 print '</td><td>'."\n";
874 print '</td></tr>'."\n";
875
876 // Customer Type
877 print '<tr><td>'.$langs->trans("ThirdPartyType");
878 if (!empty($array_query['cust_typeent'])) {
879 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
880 }
881 print '</td><td>'."\n";
882 print $formadvtargetemaling->advMultiselectarray('cust_typeent', $formcompany->typent_array(0, " AND id <> 0"), $array_query['cust_typeent']);
883 print '</td><td>'."\n";
884 print '</td></tr>'."\n";
885
886 // Staff number
887 print '<td>'.$langs->trans("Staff");
888 if (!empty($array_query['cust_effectif_id'])) {
889 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
890 }
891 print '</td><td>';
892 print $formadvtargetemaling->advMultiselectarray("cust_effectif_id", $formcompany->effectif_array(0, " AND id <> 0"), $array_query['cust_effectif_id']);
893 print '</td><td>'."\n";
894 print '</td></tr>'."\n";
895
896 // Sales manager
897 print '<tr><td>'.$langs->trans("SalesRepresentatives");
898 if (!empty($array_query['cust_saleman'])) {
899 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
900 }
901 print '</td><td>'."\n";
902 print $formadvtargetemaling->multiselectselectSalesRepresentatives('cust_saleman', $array_query['cust_saleman'], $user);
903 print '</td><td>'."\n";
904 print '</td></tr>'."\n";
905
906 // Customer Default Language
907 if (getDolGlobalInt('MAIN_MULTILANGS')) {
908 print '<tr><td>'.$langs->trans("DefaultLang");
909 if (!empty($array_query['cust_language'])) {
910 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
911 }
912 print '</td><td>'."\n";
913 print $formadvtargetemaling->multiselectselectLanguage('cust_language', $array_query['cust_language']);
914 print '</td><td>'."\n";
915 print '</td></tr>'."\n";
916 }
917
918 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
919 // Customer Categories
920 print '<tr><td>'.$langs->trans("CustomersCategoryShort");
921 print '</td><td>'."\n";
922 print $form->selectCategories(Categorie::TYPE_CUSTOMER, 'cust_categ', $object);
923 print '</td><td>'."\n";
924 print '</td></tr>'."\n";
925 }
926
927 // Standard Extrafield feature
928 if (!getDolGlobalString('MAIN_EXTRAFIELDS_DISABLED')) {
929 $socstatic = new Societe($db);
930 $elementtype = $socstatic->table_element;
931 // fetch optionals attributes and labels
932 require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php';
933 $extrafields = new ExtraFields($db);
934 $extrafields->fetch_name_optionals_label($elementtype);
935 foreach ($extrafields->attributes[$elementtype]['label'] as $key => $val) {
936 if ($key != 'ts_nameextra' && $key != 'ts_payeur') {
937 if (!isset($array_query['options_'.$key])) {
938 $array_query['options_'.$key] = '';
939 }
940 if (isset($extrafields->attributes[$elementtype]['langfile'][$key])) {
941 $langs->load($extrafields->attributes[$elementtype]['langfile'][$key]);
942 }
943 print '<tr><td>'.$langs->trans($extrafields->attributes[$elementtype]['label'][$key]);
944 if (!empty($array_query['options_'.$key]) || (is_array($array_query['options_'.$key]) && count($array_query['options_'.$key]) > 0)) {
945 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
946 }
947 print '</td><td>';
948 if (($extrafields->attributes[$elementtype]['type'][$key] == 'varchar') || ($extrafields->attributes[$elementtype]['type'][$key] == 'text')) {
949 print '<input type="text" name="options_'.$key.'"/></td><td>'."\n";
950 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
951 } elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'int') || ($extrafields->attributes[$elementtype]['type'][$key] == 'double')) {
952 print $langs->trans("AdvTgtMinVal").'<input type="text" name="options'.$key.'_min"/>';
953 print $langs->trans("AdvTgtMaxVal").'<input type="text" name="options'.$key.'_max"/>';
954 print '</td><td>'."\n";
955 print $form->textwithpicto('', $langs->trans("AdvTgtSearchIntHelp"), 1, 'help');
956 } elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'date') || ($extrafields->attributes[$elementtype]['type'][$key] == 'datetime')) {
957 print '<table class="nobordernopadding"><tr>';
958 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
959 print $form->selectDate('', 'options_'.$key.'_st_dt', 0, 0, 1);
960 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
961 print $form->selectDate('', 'options_'.$key.'_end_dt', 0, 0, 1);
962 print '</td></tr></table>';
963
964 print '</td><td>'."\n";
965 print $form->textwithpicto('', $langs->trans("AdvTgtSearchDtHelp"), 1, 'help');
966 } elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'boolean')) {
967 print $form->selectarray(
968 'options_'.$key,
969 array(
970 '' => '',
971 '1' => $langs->trans('Yes'),
972 '0' => $langs->trans('No')
973 ),
974 $array_query['options_'.$key]
975 );
976 print '</td><td>'."\n";
977 } elseif ($extrafields->attributes[$elementtype]['type'][$key] == 'select') {
978 print $formadvtargetemaling->advMultiselectarray('options_'.$key, $extrafields->attributes[$elementtype]['param'][$key]['options'], $array_query['options_'.$key]);
979 print '</td><td>'."\n";
980 } elseif ($extrafields->attributes[$elementtype]['type'][$key] == 'sellist') {
981 print $formadvtargetemaling->advMultiselectarraySelllist('options_'.$key, $extrafields->attributes[$elementtype]['param'][$key]['options'], $array_query['options_'.$key]);
982 print '</td><td>'."\n";
983 } else {
984 print '<table class="nobordernopadding"><tr>';
985 print '<td></td><td>';
986 if (is_array($array_query['options_'.$key])) {
987 print $extrafields->showInputField($key, implode(',', $array_query['options_'.$key]), '', '', '', '', 0, 'societe', 1);
988 } else {
989 print $extrafields->showInputField($key, $array_query['options_'.$key], '', '', '', '', 0, 'societe', 1);
990 }
991 print '</td></tr></table>';
992
993 print '</td><td>'."\n";
994 }
995 print '</td></tr>'."\n";
996 }
997 }
998 } else {
999 $std_soc = new Societe($db);
1000 $action_search = 'query';
1001
1002 $parameters = array('advtarget' => 1);
1003 if (!empty($advTarget->id)) {
1004 $parameters = array('array_query' => $advTarget->filtervalue);
1005 }
1006 // Other attributes
1007 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $std_soc, $action_search);
1008 print $hookmanager->resPrint;
1009 }
1010
1011 // State Contact
1012 print '<tr><td>'.$langs->trans('Status').' '.$langs->trans('Contact');
1013 if (!empty($array_query['contact_status'])) {
1014 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1015 }
1016 print '</td><td>';
1017 print $formadvtargetemaling->advMultiselectarray(
1018 'contact_status',
1019 array(
1020 '0' => $langs->trans('ActivityCeased'),
1021 '1' => $langs->trans('InActivity')
1022 ),
1023 $array_query['contact_status']
1024 );
1025 print '</td><td>'."\n";
1026 print $form->textwithpicto('', $langs->trans("AdvTgtContactHelp"), 1, 'help');
1027 print '</td></tr>'."\n";
1028
1029 // Civility
1030 print '<tr><td>'.$langs->trans("UserTitle");
1031 if (!empty($array_query['contact_civility'])) {
1032 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1033 }
1034 print '</td><td>';
1035 print $formadvtargetemaling->multiselectCivility('contact_civility', $array_query['contact_civility']);
1036 print '</td></tr>';
1037
1038 // contact name
1039 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans('Lastname');
1040 if (!empty($array_query['contact_lastname'])) {
1041 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1042 }
1043 print '</td><td><input type="text" name="contact_lastname" value="'.$array_query['contact_lastname'].'"/></td><td>'."\n";
1044 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
1045 print '</td></tr>'."\n";
1046 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans('Firstname');
1047 if (!empty($array_query['contact_firstname'])) {
1048 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1049 }
1050 print '</td><td><input type="text" name="contact_firstname" value="'.$array_query['contact_firstname'].'"/></td><td>'."\n";
1051 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
1052 print '</td></tr>'."\n";
1053
1054 // Contact Country
1055 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("Country");
1056 if (!empty($array_query['contact_country'])) {
1057 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1058 }
1059 print '</td><td>'."\n";
1060 print $formadvtargetemaling->multiselectCountry('contact_country', $array_query['contact_country']);
1061 print '</td><td>'."\n";
1062 print '</td></tr>'."\n";
1063
1064 // Never send mass mailing
1065 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("No_Email");
1066 if (!empty($array_query['contact_no_email'])) {
1067 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1068 }
1069 print '</td><td>'."\n";
1070 print $form->selectarray(
1071 'contact_no_email',
1072 array(
1073 '' => '',
1074 '1' => $langs->trans('Yes'),
1075 '0' => $langs->trans('No')
1076 ),
1077 $array_query['contact_no_email']
1078 );
1079 print '</td><td>'."\n";
1080 print '</td></tr>'."\n";
1081
1082 // Contact Date Create
1083 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("DateCreation");
1084 if (!empty($array_query['contact_create_st_dt'])) {
1085 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1086 }
1087 print '</td><td>'."\n";
1088 print '<table class="nobordernopadding"><tr>';
1089 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
1090 print $form->selectDate($array_query['contact_create_st_dt'], 'contact_create_st_dt', 0, 0, 1, 'find_customer', 1, 1);
1091 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
1092 print $form->selectDate($array_query['contact_create_end_dt'], 'contact_create_end_dt', 0, 0, 1, 'find_customer', 1, 1);
1093 print '</td></tr></table>';
1094 print '</td><td>'."\n";
1095 print '</td></tr>'."\n";
1096
1097 // Contact update Create
1098 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("DateLastModification");
1099 if (!empty($array_query['contact_update_st_dt'])) {
1100 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1101 }
1102 print '</td><td>'."\n";
1103 print '<table class="nobordernopadding"><tr>';
1104 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
1105 print $form->selectDate($array_query['contact_update_st_dt'], 'contact_update_st_dt', 0, 0, 1, 'find_customer', 1, 1);
1106 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
1107 print $form->selectDate($array_query['contact_update_end_dt'], 'contact_update_end_dt', 0, 0, 1, 'find_customer', 1, 1);
1108 print '</td></tr></table>';
1109 print '</td><td>'."\n";
1110 print '</td></tr>'."\n";
1111
1112 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
1113 // Customer Categories
1114 print '<tr><td>'.$langs->trans("ContactCategoriesShort");
1115 print '</td><td>'."\n";
1116 print $form->selectCategories(Categorie::TYPE_CONTACT, 'contact_categ', $object);
1117 print '</td><td>'."\n";
1118 print '</td></tr>'."\n";
1119 }
1120
1121 // Standard Extrafield feature
1122 if (!getDolGlobalString('MAIN_EXTRAFIELDS_DISABLED')) {
1123 $contactstatic = new Contact($db);
1124 $elementtype = $contactstatic->table_element;
1125 // fetch optionals attributes and labels
1126 dol_include_once('/core/class/extrafields.class.php');
1127 $extrafields = new ExtraFields($db);
1128 $extrafields->fetch_name_optionals_label($elementtype);
1129 if (!empty($extrafields->attributes[$elementtype]['type'])) {
1130 foreach ($extrafields->attributes[$elementtype]['type'] as $key => &$value) {
1131 if ($value == 'radio') {
1132 $value = 'select';
1133 }
1134 }
1135 }
1136 if (!empty($extrafields->attributes[$elementtype]['label'])) {
1137 foreach ($extrafields->attributes[$elementtype]['label'] as $key => $val) {
1138 if (!isset($array_query['options_'.$key.'_cnct'])) {
1139 $array_query['options_'.$key.'_cnct'] = '';
1140 }
1141 print '<tr><td>'.$extrafields->attributes[$elementtype]['label'][$key];
1142 if ($array_query['options_'.$key.'_cnct'] != '' || (is_array($array_query['options_'.$key.'_cnct']) && count($array_query['options_'.$key.'_cnct']) > 0)) {
1143 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1144 }
1145 print '</td><td>';
1146 if (($extrafields->attributes[$elementtype]['type'][$key] == 'varchar') || ($extrafields->attributes[$elementtype]['type'][$key] == 'text')) {
1147 print '<input type="text" name="options_'.$key.'_cnct"/></td><td>'."\n";
1148 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
1149 } elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'int') || ($extrafields->attributes[$elementtype]['type'][$key] == 'double')) {
1150 print $langs->trans("AdvTgtMinVal").'<input type="text" name="options_'.$key.'_min_cnct"/>';
1151 print $langs->trans("AdvTgtMaxVal").'<input type="text" name="options_'.$key.'_max_cnct"/>';
1152 print '</td><td>'."\n";
1153 print $form->textwithpicto('', $langs->trans("AdvTgtSearchIntHelp"), 1, 'help');
1154 } elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'date') || ($extrafields->attributes[$elementtype]['type'][$key] == 'datetime')) {
1155 print '<table class="nobordernopadding"><tr>';
1156 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
1157 print $form->selectDate('', 'options_'.$key.'_st_dt_cnct', 0, 0, 1);
1158 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
1159 print $form->selectDate('', 'options_'.$key.'_end_dt_cnct', 0, 0, 1);
1160 print '</td></tr></table>';
1161 print '</td><td>'."\n";
1162 print $form->textwithpicto('', $langs->trans("AdvTgtSearchDtHelp"), 1, 'help');
1163 } elseif (($extrafields->attributes[$elementtype]['type'][$key] == 'boolean')) {
1164 print $form->selectarray(
1165 'options_'.$key.'_cnct',
1166 array(
1167 '' => '',
1168 '1' => $langs->trans('Yes'),
1169 '0' => $langs->trans('No')
1170 ),
1171 $array_query['options_'.$key.'_cnct']
1172 );
1173 print '</td><td>'."\n";
1174 } elseif ($extrafields->attributes[$elementtype]['type'][$key] == 'select') {
1175 print $formadvtargetemaling->advMultiselectarray('options_'.$key.'_cnct', $extrafields->attributes[$elementtype]['param'][$key]['options'], $array_query['options_'.$key.'_cnct']);
1176 print '</td><td>'."\n";
1177 } elseif ($extrafields->attributes[$elementtype]['type'][$key] == 'sellist') {
1178 print $formadvtargetemaling->advMultiselectarraySelllist('options_'.$key.'_cnct', $extrafields->attributes[$elementtype]['param'][$key]['options'], $array_query['options_'.$key.'_cnct']);
1179 print '</td><td>'."\n";
1180 } else {
1181 if (is_array($array_query['options_'.$key.'_cnct'])) {
1182 print $extrafields->showInputField($key, implode(',', $array_query['options_'.$key.'_cnct']), '', '_cnct', '', '', 0, 'socpeople', 1);
1183 } else {
1184 print $extrafields->showInputField($key, $array_query['options_'.$key.'_cnct'], '', '_cnct', '', '', 0, 'socpeople', 1);
1185 }
1186 print '</td><td>'."\n";
1187 }
1188 print '</td></tr>'."\n";
1189 }
1190 }
1191 }
1192
1193 print '</table>'."\n";
1194 print '<br>';
1195 print '<center><input type="button" name="addcontact" id="addcontact" value="'.$langs->trans('AdvTgtAddContact').'" class="butAction"/></center>'."\n";
1196 print '<br>';
1197 print '</form>'."\n";
1198
1199 print '<br>';
1200
1201 // TODO Replace this with an include of a.tpl that contains samecode than into targetemailing.php
1202 print '<form action="'.$_SERVER['PHP_SELF'].'?action=clear&id='.$object->id.'" method="POST">';
1203 print '<input type="hidden" name="token" value="'.newToken().'">';
1204 print load_fiche_titre($langs->trans("ToClearAllRecipientsClickHere"));
1205 print '<table class="noborder centpercent">';
1206 print '<tr class="liste_titre">';
1207 print '<td class="liste_titre right"><input type="submit" class="button" value="'.$langs->trans("TargetsReset").'"></td>';
1208 print '</tr>';
1209 print '</table>';
1210 print '</form>';
1211
1212
1213 print '<br>';
1214 }
1215}
1216
1217// End of page
1218llxFooter();
1219$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition export.php:1216
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to manage advanced emailing target selector.
static getValidAddress($address, $format, $encode=0, $maxnumberofemail=0)
Return a formatted address string for SMTP protocol.
static getArrayAddress($address)
Return a formatted array of address string for SMTP protocol.
Class to manage contact/addresses.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to build HTML component for third parties management Only common components are here.
Class to manage generation of HTML components Only common components must be here.
Class to offer components to list and upload files.
Class permettant la generation de composants html autre Only common components are here.
Class to manage emailings module.
Parent class of emailing target selectors modules.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage a list of personalised recipients for mailing feature.
emailing_prepare_head(Mailing $object)
Prepare array with list of tabs.
isValidMailDomain($mail)
Return true if email has a domain name that can be resolved to MX type.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
dol_print_email($email, $contactid=0, $socid=0, $addlink=0, $max=0, $showinvalid=2, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.