dolibarr 25.0.0-alpha
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-2026 MDW <mdeweerd@users.noreply.github.com>
5 * Copyright (C) 2024-2026 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';
38require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmailing.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
41require_once DOL_DOCUMENT_ROOT.'/core/lib/emailing.lib.php';
42require_once DOL_DOCUMENT_ROOT.'/core/modules/mailings/advthirdparties.modules.php';
43require_once DOL_DOCUMENT_ROOT.'/comm/mailing/class/advtargetemailing.class.php';
44require_once DOL_DOCUMENT_ROOT.'/comm/mailing/class/html.formadvtargetemailing.class.php';
45require_once DOL_DOCUMENT_ROOT.'/comm/mailing/class/mailing.class.php';
46require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
47require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
48require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
49
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] = GETPOSTISARRAY($key) ? GETPOST($key, 'array:int') : 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] = GETPOSTINT($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 $get_param_template_id = '';
274 if (!empty($template_id)) {
275 $get_param_template_id = '&template_id='.$template_id;
276 }
277 setEventMessages($langs->trans("XTargetsAdded", $result), null, 'mesgs');
278 header("Location: ".$_SERVER['PHP_SELF']."?id=".$id.$get_param_template_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 $resql = $db->query($sql);
414 if ($resql) {
415 if (!empty($id)) {
416 $mailingtargets = new MailingTargets($db);
417 $mailingtargets->update_nb($id);
418
419 header("Location: ".$_SERVER['PHP_SELF']."?id=".$id);
420 exit();
421 } else {
422 header("Location: liste.php");
423 exit();
424 }
425 } else {
427 }
428}
429
430if (GETPOST("button_removefilter")) {
431 $search_nom = '';
432 $search_prenom = '';
433 $search_email = '';
434}
435
436
437/*
438 * View
439 */
440
441$form = new Form($db);
442$formmailing = new FormMailing($db);
443$formadvtargetemaling = new FormAdvTargetEmailing($db);
444$formcompany = new FormCompany($db);
445$formother = new FormOther($db);
446
447$help_url = 'EN:Module_EMailing|FR:Module_Mailing|ES:M&oacute;dulo_Mailing';
448llxHeader('', $langs->trans("MailAdvTargetRecipients"), $help_url);
449
450$arrayofselected = is_array($toselect) ? $toselect : array();
451$totalarray = [
452 'nbfield' => 0,
453];
454
455if ($object->fetch($id) >= 0) {
456 $head = emailing_prepare_head($object);
457
458 print dol_get_fiche_head($head, 'advtargets', $langs->trans("Mailing"), -1, $object->picto);
459
460 $linkback = '<a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
461
462 $morehtmlref = '<div class="refidno">';
463 // Ref customer
464 $morehtmlref .= $form->editfieldkey("", 'title', $object->title, $object, 0, 'string', '', 0, 1);
465 $morehtmlref .= $form->editfieldval("", 'title', $object->title, $object, 0, 'string', '', null, null, '', 1);
466 $morehtmlref .= '</div>';
467
468 $morehtmlstatus = '';
469 $nbtry = $nbok = 0;
470 if ($object->status == $object::STATUS_SENTPARTIALY || $object->status == $object::STATUS_SENTCOMPLETELY) {
471 $nbtry = $object->countNbOfTargets('alreadysent');
472 $nbko = $object->countNbOfTargets('alreadysentko');
473 $nbok = ($nbtry - $nbko);
474
475 $morehtmlstatus .= ' ('.$nbtry.'/'.$object->nbemail;
476 if ($nbko) {
477 $morehtmlstatus .= ' - '.$nbko.' '.$langs->trans("Error");
478 }
479 $morehtmlstatus .= ') &nbsp; ';
480 }
481
482 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
483
484 print '<div class="fichecenter">';
485 print '<div class="fichehalfleft">';
486 print '<div class="underbanner clearboth"></div>';
487
488 print '<table class="border centpercent tableforfield">'."\n";
489
490 // From
491 print '<tr><td class="titlefield">';
492 print $langs->trans("MailFrom").'</td><td>';
493 $emailarray = CMailFile::getArrayAddress($object->email_from);
494 foreach ($emailarray as $email => $name) {
495 if ($name && $name != $email) {
496 print dol_escape_htmltag($name).' &lt;'.$email;
497 print '&gt;';
498 if (!isValidEmail($email)) {
499 $langs->load("errors");
500 print img_warning($langs->trans("ErrorBadEMail", $email));
501 }
502 } else {
503 print dol_print_email($object->email_from, 0, 0, 0, 0, 1);
504 }
505 }
506
507 print '</td></tr>';
508
509 // Errors to
510 if ($object->messtype != 'sms') {
511 print '<tr><td>'.$langs->trans("MailErrorsTo").'</td><td>';
512 $emailarray = CMailFile::getArrayAddress($object->email_errorsto);
513 foreach ($emailarray as $email => $name) {
514 if ($name != $email) {
515 print dol_escape_htmltag((string) $name).' &lt;'.$email;
516 print '&gt;';
517 if ($email && !isValidEmail($email)) {
518 $langs->load("errors");
519 print img_warning($langs->trans("ErrorBadEMail", $email));
520 } elseif ($email && !isValidMailDomain($email)) {
521 $langs->load("errors");
522 print img_warning($langs->trans("ErrorBadMXDomain", $email));
523 }
524 } else {
525 print dol_print_email($object->email_errorsto, 0, 0, 0, 0, 1);
526 }
527 }
528 print '</td></tr>';
529 }
530
531 // Reply to
532 if ($object->messtype != 'sms') {
533 print '<tr><td>';
534 print $form->editfieldkey("MailReply", 'email_replyto', $object->email_replyto, $object, (int) ($user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY), 'string');
535 print '</td><td>';
536 print $form->editfieldval("MailReply", 'email_replyto', $object->email_replyto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
537 $email = CMailFile::getValidAddress($object->email_replyto, 2);
538 if ($action != 'editemail_replyto') {
539 if ($email && !isValidEmail($email)) {
540 $langs->load("errors");
541 print img_warning($langs->trans("ErrorBadEMail", $email));
542 } elseif ($email && !isValidMailDomain($email)) {
543 $langs->load("errors");
544 print img_warning($langs->trans("ErrorBadMXDomain", $email));
545 }
546 }
547 print '</td></tr>';
548 }
549
550 print '</table>';
551 print '</div>';
552
553
554 print '<div class="fichehalfright">';
555 print '<div class="underbanner clearboth"></div>';
556
557 print '<table class="border centpercent tableforfield">';
558
559 // Number of distinct emails
560 print '<tr><td>';
561 print $langs->trans("TotalNbOfDistinctRecipients");
562 print '</td><td>';
563 $nbemail = ($object->nbemail ? $object->nbemail : 0);
564 if (is_numeric($nbemail)) {
565 $htmltooltip = '';
566 if ((getDolGlobalString('MAILING_LIMIT_SENDBYWEB') && getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < $nbemail) && ($object->status == 1 || ($object->status == 2 && $nbtry < $nbemail))) {
567 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') > 0) {
568 $htmltooltip .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
569 } else {
570 $htmltooltip .= $langs->trans('SendingFromWebInterfaceIsNotAllowed');
571 }
572 }
573 if (empty($nbemail)) {
574 $nbemail .= ' '.img_warning($langs->trans('ToAddRecipientsChooseHere'));//.' <span class="warning">'.$langs->trans("NoTargetYet").'</span>';
575 }
576 if ($htmltooltip) {
577 print $form->textwithpicto($nbemail, $htmltooltip, 1, 'info');
578 } else {
579 print $nbemail;
580 }
581 }
582 print '</td></tr>';
583
584 print '<tr><td>';
585 print $langs->trans("MAIN_MAIL_SENDMODE");
586 print '</td><td>';
587 if ($object->messtype != 'sms') {
588 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') && getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
589 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING')];
590 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE')) {
591 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE')];
592 } else {
593 $text = $listofmethods['mail'];
594 }
595 print $text;
596 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
597 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'mail') {
598 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER_EMAILING', getDolGlobalString('MAIN_MAIL_SMTP_SERVER')).')</span>';
599 }
600 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE') != 'mail' && getDolGlobalString('MAIN_MAIL_SMTP_SERVER')) {
601 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
602 }
603 } else {
604 print 'SMS ';
605 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
606 }
607 print '</td></tr>';
608
609 // Other attributes. Fields from hook formObjectOptions and Extrafields.
610 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
611
612 print '</table>';
613 print '</div>';
614 print '</div>';
615
616 print '<div class="clearboth"></div>';
617
618 print dol_get_fiche_end();
619
620
621 // Show email selectors
622 if ($object->status < 2 && $user->hasRight('mailing', 'creer')) {
623 // @phan-assert FormAdvTargetEmailing $formadvtargetemaling
624 // @phan-assert AdvanceTargetingMailing $advTarget
625
626 // @phan-assert array<string,int|string|string[] $array_query'
627
628 // From controller using view
629 '
630 @phan-var-force FormAdvTargetEmailing $formadvtargetemaling
631 @phan-var-force AdvanceTargetingMailing $advTarget
632 @phan-var-force array<string,string|int|string[]> $array_query
633 ';
634
635 print '<script>
636 $(document).ready(function() {
637
638 // Click Function
639 $(":button[name=addcontact]").click(function() {
640 $(":hidden[name=action]").val("add");
641 $("#find_customer").submit();
642 });
643
644 $(":button[name=loadfilter]").click(function() {
645 $(":hidden[name=action]").val("loadfilter");
646 $("#find_customer").submit();
647 });
648
649 $(":button[name=deletefilter]").click(function() {
650 $(":hidden[name=action]").val("deletefilter");
651 $("#find_customer").submit();
652 });
653
654 $(":button[name=savefilter]").click(function() {
655 $(":hidden[name=action]").val("savefilter");
656 $("#find_customer").submit();
657 });
658
659 $(":button[name=createfilter]").click(function() {
660 $(":hidden[name=action]").val("createfilter");
661 $("#find_customer").submit();
662 });
663 });
664 </script>';
665
666
667 print '<div class="info">';
668 print $langs->trans("AdvTgtTitle").'...';
669 print '</div>';
670
671 print '<form name="find_customer" id="find_customer" action="'.$_SERVER['PHP_SELF'].'?id='.$id.'" method="POST">'."\n";
672 print '<input type="hidden" name="token" value="'.newToken().'">'."\n";
673 print '<input type="hidden" name="action" value="">'."\n";
674 print '<table class="border centpercent">'."\n";
675
676 print '<tr><td class="titlefieldcreate">'.$langs->trans('AdvTgtNameTemplate').'</td><td class="valignmiddle">';
677 if (!empty($template_id)) {
678 $default_template = $template_id;
679 } else {
680 $default_template = $advTarget->id;
681 }
682 print $formadvtargetemaling->selectAdvtargetemailingTemplate('template_id', $default_template, $langs->trans("SelectAPredefinedFilter"), $advTarget->type_element, 'minwidth100 valignmiddle');
683 print '<input type="button" name="loadfilter" id="loadfilter" value="'.$langs->trans('AdvTgtLoadFilter').'" class="button smallpaddingimp"/>';
684 print '<input type="button" name="deletefilter" id="deletefilter" value="'.$langs->trans('AdvTgtDeleteFilter').'" class="button smallpaddingimp"/>';
685 print '<input type="button" name="savefilter" id="savefilter" value="'.$langs->trans('AdvTgtSaveFilter').'" class="button smallpaddingimp"/>'; // Update filter
686 print '</td><td>'."\n";
687 print '</td></tr>'."\n";
688
689 print '<tr><td>'.$langs->trans('AdvTgtOrCreateNewFilter').'</td><td>';
690 print '<input type="text" name="template_name" id="template_name" value=""/>';
691 print '<input type="button" name="createfilter" id="createfilter" value="'.$langs->trans('AdvTgtCreateFilter').'" class="button smallpaddingimp"/>';
692 print '</td><td>'."\n";
693 print '</td></tr>'."\n";
694
695 print '<tr><td colspan="3"><hr></td></tr>';
696
697 print '<tr>'."\n";
698 print '<td colspan="3" class="center">'."\n";
699 print '<input type="button" name="addcontact" id="addcontact" value="'.$langs->trans('AdvTgtAddContact').'" class="button"/>'."\n";
700 print '</td>'."\n";
701 print '</tr>'."\n";
702
703 print '<tr><td>'.$langs->trans('AdvTgtTypeOfIncude').'</td><td>';
704 print $form->selectarray('type_of_target', $advTarget->select_target_type, $array_query['type_of_target']);
705 print '</td><td>'."\n";
706 print $form->textwithpicto('', $langs->trans("AdvTgtTypeOfIncudeHelp"), 1, 'help');
707 print '</td></tr>'."\n";
708
709 // Customer name
710 print '<tr><td>'.$langs->trans('ThirdPartyName');
711 if (!empty($array_query['cust_name'])) {
712 print img_picto($langs->trans('AdvTgtUse'), 'tick', 'class="marginleftonly"');
713 }
714 print '</td><td><input type="text" name="cust_name" value="'.$array_query['cust_name'].'"/></td><td>'."\n";
715 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
716 print '</td></tr>'."\n";
717
718 // Code Client
719 print '<tr><td>'.$langs->trans('CustomerCode');
720 if (!empty($array_query['cust_code'])) {
721 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
722 $cust_code_str = (string) $array_query['cust_code'];
723 } else {
724 $cust_code_str = null;
725 }
726 print '</td><td><input type="text" name="cust_code"'.($cust_code_str != null ? ' value="'.$cust_code_str : '').'"/></td><td>'."\n";
727 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
728 print '</td></tr>'."\n";
729
730 // Address Client
731 print '<tr><td>'.$langs->trans('Address');
732 if (!empty($array_query['cust_adress'])) {
733 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
734 }
735 print '</td><td><input type="text" name="cust_adress" value="'.$array_query['cust_adress'].'"/></td><td>'."\n";
736 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
737 print '</td></tr>'."\n";
738
739 // Zip Client
740 print '<tr><td>'.$langs->trans('Zip');
741 if (!empty($array_query['cust_zip'])) {
742 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
743 }
744 print '</td><td><input type="text" name="cust_zip" value="'.$array_query['cust_zip'].'"/></td><td>'."\n";
745 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
746 print '</td></tr>'."\n";
747
748 // City Client
749 print '<tr><td>'.$langs->trans('Town');
750 if (!empty($array_query['cust_city'])) {
751 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
752 }
753 print '</td><td><input type="text" name="cust_city" value="'.$array_query['cust_city'].'"/></td><td>'."\n";
754 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
755 print '</td></tr>'."\n";
756
757 // State Client
758 print '<tr><td>'.$langs->trans('State');
759 if (!empty($array_query['cust_state'])) {
760 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
761 }
762 print '</td><td>'."\n";
763 print $formadvtargetemaling->multiselectState('cust_state', $array_query['cust_state']);
764 print '</td><td>'."\n";
765 print '</td></tr>'."\n";
766
767 // Customer Country
768 print '<tr><td>'.$langs->trans("Country");
769 if (!empty($array_query['cust_country'])) {
770 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
771 }
772 print '</td><td>'."\n";
773 print $formadvtargetemaling->multiselectCountry('cust_country', $array_query['cust_country']);
774 print '</td><td>'."\n";
775 print '</td></tr>'."\n";
776
777 // State Customer
778 print '<tr><td>'.$langs->trans('Status').' '.$langs->trans('ThirdParty');
779 if (!empty($array_query['cust_status'])) {
780 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
781 }
782 print '</td><td>';
783 print $formadvtargetemaling->advMultiselectarray(
784 'cust_status',
785 array(
786 '0' => $langs->trans('ActivityCeased'),
787 '1' => $langs->trans('InActivity')
788 ),
789 $array_query['cust_status']
790 );
791 print '</td><td>'."\n";
792 print '</td></tr>'."\n";
793
794 // Mother Company
795 print '<tr><td>'.$langs->trans("ParentCompany");
796 if (!empty($array_query['cust_mothercompany'])) {
797 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
798 }
799 print '</td><td>'."\n";
800 print '<input type="text" name="cust_mothercompany" value="'.$array_query['cust_mothercompany'].'"/>';
801 print '</td><td>'."\n";
802 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
803 print '</td></tr>'."\n";
804
805 // Prospect/Customer
806 $selected = $array_query['cust_typecust'];
807 print '<tr><td>'.$langs->trans('ProspectCustomer').' '.$langs->trans('ThirdParty');
808 if (!empty($array_query['cust_typecust'])) {
809 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
810 }
811 print '</td><td>';
812 $options_array = array(
813 2 => $langs->trans('Prospect'),
814 3 => $langs->trans('ProspectCustomer'),
815 1 => $langs->trans('Customer'),
816 0 => $langs->trans('NorProspectNorCustomer')
817 );
818 print $formadvtargetemaling->advMultiselectarray('cust_typecust', $options_array, $selected);
819 print '</td><td>'."\n";
820 print '</td></tr>'."\n";
821
822 // Prospection status
823 print '<tr><td>'.$langs->trans('ProspectLevel');
824 if (!empty($array_query['cust_prospect_status'])) {
825 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
826 }
827 print '</td><td>';
828 print $formadvtargetemaling->multiselectProspectionStatus($array_query['cust_prospect_status'], 'cust_prospect_status');
829 print '</td><td>'."\n";
830 print '</td></tr>'."\n";
831
832 // Prospection comm status
833 print '<tr><td>'.$langs->trans('StatusProsp');
834 if (!empty($array_query['cust_comm_status'])) {
835 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
836 }
837 print '</td><td>';
838 print $formadvtargetemaling->advMultiselectarray('cust_comm_status', $advTarget->type_statuscommprospect, $array_query['cust_comm_status']);
839 print '</td><td>'."\n";
840 print '</td></tr>'."\n";
841
842 // Customer Type
843 print '<tr><td>'.$langs->trans("ThirdPartyType");
844 if (!empty($array_query['cust_typeent'])) {
845 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
846 }
847 print '</td><td>'."\n";
848 print $formadvtargetemaling->advMultiselectarray('cust_typeent', $formcompany->typent_array(0, "(id:<>:0)"), $array_query['cust_typeent']);
849 print '</td><td>'."\n";
850 print '</td></tr>'."\n";
851
852 // Staff number
853 print '<td>'.$langs->trans("Staff");
854 if (!empty($array_query['cust_effectif_id'])) {
855 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
856 }
857 print '</td><td>';
858 print $formadvtargetemaling->advMultiselectarray("cust_effectif_id", $formcompany->effectif_array(0, "(id:<>:0)"), $array_query['cust_effectif_id']);
859 print '</td><td>'."\n";
860 print '</td></tr>'."\n";
861
862 // Sales manager
863 print '<tr><td>'.$langs->trans("SalesRepresentatives");
864 if (!empty($array_query['cust_saleman'])) {
865 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
866 }
867 print '</td><td>'."\n";
868 print $formadvtargetemaling->multiselectselectSalesRepresentatives('cust_saleman', $array_query['cust_saleman'], $user);
869 print '</td><td>'."\n";
870 print '</td></tr>'."\n";
871
872 // Customer Default Language
873 if (getDolGlobalInt('MAIN_MULTILANGS')) {
874 print '<tr><td>'.$langs->trans("DefaultLang");
875 if (!empty($array_query['cust_language'])) {
876 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
877 }
878 print '</td><td>'."\n";
879 print $formadvtargetemaling->multiselectselectLanguage('cust_language', $array_query['cust_language']);
880 print '</td><td>'."\n";
881 print '</td></tr>'."\n";
882 }
883
884 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
885 // Customer Categories
886 print '<tr><td>'.$langs->trans("CustomersCategoryShort");
887 print '</td><td>'."\n";
888 print $form->selectCategories(Categorie::TYPE_CUSTOMER, 'cust_categ', $object);
889 print '</td><td>'."\n";
890 print '</td></tr>'."\n";
891 }
892
893 // Standard Extrafield feature
894 if (!getDolGlobalString('MAIN_EXTRAFIELDS_DISABLED')) {
895 $socstatic = new Societe($db);
896 $elementtype = $socstatic->table_element;
897 // fetch optionals attributes and labels
898 $extrafields->fetch_name_optionals_label($elementtype);
899 $extrafieldinfo = $extrafields->attributes[$elementtype] ?? [];
900 foreach ($extrafieldinfo['label'] as $key => $val) {
901 if ($key != 'ts_nameextra' && $key != 'ts_payeur') {
902 if (isset($extrafieldinfo['langfile'][$key])) {
903 $langs->load($extrafieldinfo['langfile'][$key]);
904 }
905 print '<tr><td>'.$langs->trans($extrafieldinfo['label'][$key]);
906 if (!empty($array_query['options_'.$key]) || (is_array($array_query['options_'.$key]) && count($array_query['options_'.$key]) > 0)) {
907 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
908 }
909 print '</td><td>';
910 if (($extrafieldinfo['type'][$key] == 'varchar') || ($extrafieldinfo['type'][$key] == 'text')) {
911 print '<input type="text" name="options_'.$key.'"/></td><td>'."\n";
912 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
913 } elseif (($extrafieldinfo['type'][$key] == 'int') || ($extrafieldinfo['type'][$key] == 'double')) {
914 print $langs->trans("AdvTgtMinVal").'<input type="text" name="options'.$key.'_min"/>';
915 print $langs->trans("AdvTgtMaxVal").'<input type="text" name="options'.$key.'_max"/>';
916 print '</td><td>'."\n";
917 print $form->textwithpicto('', $langs->trans("AdvTgtSearchIntHelp"), 1, 'help');
918 } elseif (($extrafieldinfo['type'][$key] == 'date') || ($extrafieldinfo['type'][$key] == 'datetime')) {
919 print '<table class="nobordernopadding"><tr>';
920 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
921 print $form->selectDate('', 'options_'.$key.'_st_dt', 0, 0, 1);
922 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
923 print $form->selectDate('', 'options_'.$key.'_end_dt', 0, 0, 1);
924 print '</td></tr></table>';
925
926 print '</td><td>'."\n";
927 print $form->textwithpicto('', $langs->trans("AdvTgtSearchDtHelp"), 1, 'help');
928 } elseif (($extrafieldinfo['type'][$key] == 'boolean')) {
929 print $form->selectarray(
930 'options_'.$key,
931 array(
932 '' => '',
933 '1' => $langs->trans('Yes'),
934 '0' => $langs->trans('No')
935 ),
936 $array_query['options_'.$key]
937 );
938 print '</td><td>'."\n";
939 } elseif ($extrafieldinfo['type'][$key] == 'select') {
940 print $formadvtargetemaling->advMultiselectarray('options_'.$key, $extrafieldinfo['param'][$key]['options'], $array_query['options_'.$key]);
941 print '</td><td>'."\n";
942 } elseif ($extrafieldinfo['type'][$key] == 'sellist') {
943 print $formadvtargetemaling->advMultiselectarraySelllist('options_'.$key, $extrafieldinfo['param'][$key]['options'], $array_query['options_'.$key]);
944 print '</td><td>'."\n";
945 } else {
946 print '<table class="nobordernopadding"><tr>';
947 print '<td></td><td>';
948 if (is_array($array_query['options_'.$key])) {
949 print $extrafields->showInputField($key, implode(',', $array_query['options_'.$key]), '', '', '', '', 0, 'societe', 1);
950 } else {
951 print $extrafields->showInputField($key, $array_query['options_'.$key], '', '', '', '', 0, 'societe', 1);
952 }
953 print '</td></tr></table>';
954
955 print '</td><td>'."\n";
956 }
957 print '</td></tr>'."\n";
958 }
959 }
960 } else {
961 $std_soc = new Societe($db);
962 $action_search = 'query';
963
964 $parameters = array('advtarget' => 1);
965 if (!empty($advTarget->id)) {
966 $parameters = array('array_query' => $advTarget->filtervalue);
967 }
968 // Other attributes
969 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $std_soc, $action_search);
970 print $hookmanager->resPrint;
971 }
972
973 // State Contact
974 print '<tr><td>'.$langs->trans('Status').' '.$langs->trans('Contact');
975 if (!empty($array_query['contact_status'])) {
976 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
977 }
978 print '</td><td>';
979 print $formadvtargetemaling->advMultiselectarray(
980 'contact_status',
981 array(
982 '0' => $langs->trans('ActivityCeased'),
983 '1' => $langs->trans('InActivity')
984 ),
985 $array_query['contact_status']
986 );
987 print '</td><td>'."\n";
988 print $form->textwithpicto('', $langs->trans("AdvTgtContactHelp"), 1, 'help');
989 print '</td></tr>'."\n";
990
991 // Civility
992 print '<tr><td>'.$langs->trans("UserTitle");
993 if (!empty($array_query['contact_civility'])) {
994 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
995 }
996 print '</td><td>';
997 print $formadvtargetemaling->multiselectCivility('contact_civility', $array_query['contact_civility']);
998 print '</td></tr>';
999
1000 // contact name
1001 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans('Lastname');
1002 if (!empty($array_query['contact_lastname'])) {
1003 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1004 }
1005 print '</td><td><input type="text" name="contact_lastname" value="'.$array_query['contact_lastname'].'"/></td><td>'."\n";
1006 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
1007 print '</td></tr>'."\n";
1008 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans('Firstname');
1009 if (!empty($array_query['contact_firstname'])) {
1010 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1011 }
1012 print '</td><td><input type="text" name="contact_firstname" value="'.$array_query['contact_firstname'].'"/></td><td>'."\n";
1013 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
1014 print '</td></tr>'."\n";
1015
1016 // Contact Country
1017 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("Country");
1018 if (!empty($array_query['contact_country'])) {
1019 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1020 }
1021 print '</td><td>'."\n";
1022 print $formadvtargetemaling->multiselectCountry('contact_country', $array_query['contact_country']);
1023 print '</td><td>'."\n";
1024 print '</td></tr>'."\n";
1025
1026 // Never send mass mailing
1027 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("No_Email");
1028 if (!empty($array_query['contact_no_email'])) {
1029 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1030 }
1031 print '</td><td>'."\n";
1032 print $form->selectarray(
1033 'contact_no_email',
1034 array(
1035 '' => '',
1036 '1' => $langs->trans('Yes'),
1037 '0' => $langs->trans('No')
1038 ),
1039 $array_query['contact_no_email']
1040 );
1041 print '</td><td>'."\n";
1042 print '</td></tr>'."\n";
1043
1044 // Contact Date Create
1045 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("DateCreation");
1046 if (!empty($array_query['contact_create_st_dt'])) {
1047 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1048 }
1049 print '</td><td>'."\n";
1050 print '<table class="nobordernopadding"><tr>';
1051 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
1052 print $form->selectDate($array_query['contact_create_st_dt'], 'contact_create_st_dt', 0, 0, 1, 'find_customer', 1, 1);
1053 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
1054 print $form->selectDate($array_query['contact_create_end_dt'], 'contact_create_end_dt', 0, 0, 1, 'find_customer', 1, 1);
1055 print '</td></tr></table>';
1056 print '</td><td>'."\n";
1057 print '</td></tr>'."\n";
1058
1059 // Contact update Create
1060 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("DateLastModification");
1061 if (!empty($array_query['contact_update_st_dt'])) {
1062 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1063 }
1064 print '</td><td>'."\n";
1065 print '<table class="nobordernopadding"><tr>';
1066 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
1067 print $form->selectDate($array_query['contact_update_st_dt'], 'contact_update_st_dt', 0, 0, 1, 'find_customer', 1, 1);
1068 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
1069 print $form->selectDate($array_query['contact_update_end_dt'], 'contact_update_end_dt', 0, 0, 1, 'find_customer', 1, 1);
1070 print '</td></tr></table>';
1071 print '</td><td>'."\n";
1072 print '</td></tr>'."\n";
1073
1074 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
1075 // Customer Categories
1076 print '<tr><td>'.$langs->trans("ContactCategoriesShort");
1077 print '</td><td>'."\n";
1078 print $form->selectCategories(Categorie::TYPE_CONTACT, 'contact_categ', $object);
1079 print '</td><td>'."\n";
1080 print '</td></tr>'."\n";
1081 }
1082
1083 // Standard Extrafield feature
1084 if (!getDolGlobalString('MAIN_EXTRAFIELDS_DISABLED')) {
1085 $contactstatic = new Contact($db);
1086 $elementtype = $contactstatic->table_element;
1087 // fetch optionals attributes and labels
1088
1089 $extrafields->fetch_name_optionals_label($elementtype);
1090 $extrafieldinfo = $extrafields->attributes[$elementtype] ?? [];
1091 if (!empty($extrafieldinfo['type'])) {
1092 foreach ($extrafieldinfo['type'] as $key => &$value) {
1093 if ($value == 'radio') {
1094 $value = 'select';
1095 }
1096 }
1097 }
1098 if (!empty($extrafieldinfo['label'])) {
1099 foreach ($extrafieldinfo['label'] as $key => $val) {
1100 print '<tr><td>'.$extrafieldinfo['label'][$key];
1101 if ($array_query['options_'.$key.'_cnct'] != '' || (is_array($array_query['options_'.$key.'_cnct']) && count($array_query['options_'.$key.'_cnct']) > 0)) {
1102 print img_picto($langs->trans('AdvTgtUse'), 'ok.png@advtargetemailing');
1103 }
1104 print '</td><td>';
1105 if (($extrafieldinfo['type'][$key] == 'varchar') || ($extrafieldinfo['type'][$key] == 'text')) {
1106 print '<input type="text" name="options_'.$key.'_cnct"/></td><td>'."\n";
1107 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
1108 } elseif (($extrafieldinfo['type'][$key] == 'int') || ($extrafieldinfo['type'][$key] == 'double')) {
1109 print $langs->trans("AdvTgtMinVal").'<input type="text" name="options_'.$key.'_min_cnct"/>';
1110 print $langs->trans("AdvTgtMaxVal").'<input type="text" name="options_'.$key.'_max_cnct"/>';
1111 print '</td><td>'."\n";
1112 print $form->textwithpicto('', $langs->trans("AdvTgtSearchIntHelp"), 1, 'help');
1113 } elseif (($extrafieldinfo['type'][$key] == 'date') || ($extrafieldinfo['type'][$key] == 'datetime')) {
1114 print '<table class="nobordernopadding"><tr>';
1115 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
1116 print $form->selectDate('', 'options_'.$key.'_st_dt_cnct', 0, 0, 1);
1117 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
1118 print $form->selectDate('', 'options_'.$key.'_end_dt_cnct', 0, 0, 1);
1119 print '</td></tr></table>';
1120 print '</td><td>'."\n";
1121 print $form->textwithpicto('', $langs->trans("AdvTgtSearchDtHelp"), 1, 'help');
1122 } elseif (($extrafieldinfo['type'][$key] == 'boolean')) {
1123 print $form->selectarray(
1124 'options_'.$key.'_cnct',
1125 array(
1126 '' => '',
1127 '1' => $langs->trans('Yes'),
1128 '0' => $langs->trans('No')
1129 ),
1130 $array_query['options_'.$key.'_cnct']
1131 );
1132 print '</td><td>'."\n";
1133 } elseif ($extrafieldinfo['type'][$key] == 'select') {
1134 print $formadvtargetemaling->advMultiselectarray('options_'.$key.'_cnct', $extrafieldinfo['param'][$key]['options'], $array_query['options_'.$key.'_cnct']);
1135 print '</td><td>'."\n";
1136 } elseif ($extrafieldinfo['type'][$key] == 'sellist') {
1137 print $formadvtargetemaling->advMultiselectarraySelllist('options_'.$key.'_cnct', $extrafieldinfo['param'][$key]['options'], $array_query['options_'.$key.'_cnct']);
1138 print '</td><td>'."\n";
1139 } else {
1140 if (is_array($array_query['options_'.$key.'_cnct'])) {
1141 print $extrafields->showInputField($key, implode(',', $array_query['options_'.$key.'_cnct']), '', '_cnct', '', '', 0, 'socpeople', 1);
1142 } else {
1143 print $extrafields->showInputField($key, $array_query['options_'.$key.'_cnct'], '', '_cnct', '', '', 0, 'socpeople', 1);
1144 }
1145 print '</td><td>'."\n";
1146 }
1147 print '</td></tr>'."\n";
1148 }
1149 }
1150 }
1151
1152 print '</table>'."\n";
1153 print '<br>';
1154 print '<center><input type="button" name="addcontact" id="addcontact" value="'.$langs->trans('AdvTgtAddContact').'" class="butAction"/></center>'."\n";
1155 print '<br>';
1156 print '</form>'."\n";
1157
1158 print '<br>';
1159
1160 // TODO Replace this with an include of a.tpl that contains samecode than into targetemailing.php
1161 print '<form action="'.$_SERVER['PHP_SELF'].'?action=clear&id='.$object->id.'" method="POST">';
1162 print '<input type="hidden" name="token" value="'.newToken().'">';
1163 print load_fiche_titre($langs->trans("ToClearAllRecipientsClickHere"));
1164 print '<table class="noborder centpercent">';
1165 print '<tr class="liste_titre">';
1166 print '<td class="liste_titre right"><input type="submit" class="button" value="'.$langs->trans("TargetsReset").'"></td>';
1167 print '</tr>';
1168 print '</table>';
1169 print '</form>';
1170
1171
1172 print '<br>';
1173 }
1174}
1175
1176// End of page
1177llxFooter();
1178$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 list.php:498
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 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 to help generate other html components 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.
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
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.
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.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.