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 $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
622 // Show email selectors
623 if ($object->status < 2 && $user->hasRight('mailing', 'creer')) {
624 // @phan-assert FormAdvTargetEmailing $formadvtargetemaling
625 // @phan-assert AdvanceTargetingMailing $advTarget
626
627 // @phan-assert array<string,int|string|string[] $array_query'
628
629 // From controller using view
630 '
631 @phan-var-force FormAdvTargetEmailing $formadvtargetemaling
632 @phan-var-force AdvanceTargetingMailing $advTarget
633 @phan-var-force array<string,string|int|string[]> $array_query
634 ';
635
636 // Backfill keys the form below reads unconditionally. $array_query may be a fresh
637 // empty array() (new mailing, no filter yet) or come from json_decode() of a saved
638 // filter that predates one of these fields, either way missing keys must not trigger
639 // "Undefined array key" warnings. += only fills keys not already present.
640 $array_query += array(
641 'type_of_target' => '',
642 'cust_name' => '',
643 'cust_adress' => '',
644 'cust_zip' => '',
645 'cust_city' => '',
646 'cust_state' => array(),
647 'cust_country' => array(),
648 'cust_status' => array(),
649 'cust_mothercompany' => '',
650 'cust_typecust' => array(),
651 'cust_prospect_status' => array(),
652 'cust_comm_status' => array(),
653 'cust_typeent' => array(),
654 'cust_effectif_id' => array(),
655 'cust_saleman' => array(),
656 'cust_language' => array(),
657 'contact_status' => array(),
658 'contact_civility' => '',
659 'contact_lastname' => '',
660 'contact_firstname' => '',
661 'contact_country' => array(),
662 'contact_no_email' => '',
663 'contact_create_st_dt' => '',
664 'contact_create_end_dt' => '',
665 'contact_update_st_dt' => '',
666 'contact_update_end_dt' => '',
667 );
668
669 print '<script>
670 $(document).ready(function() {
671
672 // Click Function
673 $(":button[name=addcontact]").click(function() {
674 $(":hidden[name=action]").val("add");
675 $("#find_customer").submit();
676 });
677
678 $(":button[name=loadfilter]").click(function() {
679 $(":hidden[name=action]").val("loadfilter");
680 $("#find_customer").submit();
681 });
682
683 $(":button[name=deletefilter]").click(function() {
684 $(":hidden[name=action]").val("deletefilter");
685 $("#find_customer").submit();
686 });
687
688 $(":button[name=savefilter]").click(function() {
689 $(":hidden[name=action]").val("savefilter");
690 $("#find_customer").submit();
691 });
692
693 $(":button[name=createfilter]").click(function() {
694 $(":hidden[name=action]").val("createfilter");
695 $("#find_customer").submit();
696 });
697 });
698 </script>';
699
700
701 print '<div class="info">';
702 print $langs->trans("AdvTgtTitle").'...';
703 print '</div>';
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'), 'tick', 'class="marginleftonly"');
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'), 'tick');
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'), 'tick');
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'), 'tick');
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'), 'tick');
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'), 'tick');
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'), 'tick');
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'), 'tick');
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'), 'tick');
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'), 'tick');
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'), 'tick');
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'), 'tick');
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'), 'tick');
880 }
881 print '</td><td>'."\n";
882 print $formadvtargetemaling->advMultiselectarray('cust_typeent', $formcompany->typent_array(0, "(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'), 'tick');
890 }
891 print '</td><td>';
892 print $formadvtargetemaling->advMultiselectarray("cust_effectif_id", $formcompany->effectif_array(0, "(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'), 'tick');
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'), 'tick');
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 $extrafields->fetch_name_optionals_label($elementtype);
933 $extrafieldinfo = $extrafields->attributes[$elementtype] ?? [];
934 foreach ($extrafieldinfo['label'] as $key => $val) {
935 if ($key != 'ts_nameextra' && $key != 'ts_payeur') {
936 if (isset($extrafieldinfo['langfile'][$key])) {
937 $langs->load($extrafieldinfo['langfile'][$key]);
938 }
939 if (!isset($array_query['options_'.$key])) {
940 $array_query['options_'.$key] = '';
941 }
942 print '<tr><td>'.$langs->trans($extrafieldinfo['label'][$key]);
943 if (!empty($array_query['options_'.$key]) || (is_array($array_query['options_'.$key]) && count($array_query['options_'.$key]) > 0)) {
944 print img_picto($langs->trans('AdvTgtUse'), 'tick');
945 }
946 print '</td><td>';
947 if (($extrafieldinfo['type'][$key] == 'varchar') || ($extrafieldinfo['type'][$key] == 'text')) {
948 print '<input type="text" name="options_'.$key.'"/></td><td>'."\n";
949 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
950 } elseif (($extrafieldinfo['type'][$key] == 'int') || ($extrafieldinfo['type'][$key] == 'double')) {
951 print $langs->trans("AdvTgtMinVal").'<input type="text" name="options'.$key.'_min"/>';
952 print $langs->trans("AdvTgtMaxVal").'<input type="text" name="options'.$key.'_max"/>';
953 print '</td><td>'."\n";
954 print $form->textwithpicto('', $langs->trans("AdvTgtSearchIntHelp"), 1, 'help');
955 } elseif (($extrafieldinfo['type'][$key] == 'date') || ($extrafieldinfo['type'][$key] == 'datetime')) {
956 print '<table class="nobordernopadding"><tr>';
957 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
958 print $form->selectDate('', 'options_'.$key.'_st_dt', 0, 0, 1);
959 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
960 print $form->selectDate('', 'options_'.$key.'_end_dt', 0, 0, 1);
961 print '</td></tr></table>';
962
963 print '</td><td>'."\n";
964 print $form->textwithpicto('', $langs->trans("AdvTgtSearchDtHelp"), 1, 'help');
965 } elseif (($extrafieldinfo['type'][$key] == 'boolean')) {
966 print $form->selectarray(
967 'options_'.$key,
968 array(
969 '' => '',
970 '1' => $langs->trans('Yes'),
971 '0' => $langs->trans('No')
972 ),
973 $array_query['options_'.$key]
974 );
975 print '</td><td>'."\n";
976 } elseif ($extrafieldinfo['type'][$key] == 'select') {
977 print $formadvtargetemaling->advMultiselectarray('options_'.$key, $extrafieldinfo['param'][$key]['options'], $array_query['options_'.$key]);
978 print '</td><td>'."\n";
979 } elseif ($extrafieldinfo['type'][$key] == 'sellist') {
980 print $formadvtargetemaling->advMultiselectarraySelllist('options_'.$key, $extrafieldinfo['param'][$key]['options'], $array_query['options_'.$key]);
981 print '</td><td>'."\n";
982 } else {
983 print '<table class="nobordernopadding"><tr>';
984 print '<td></td><td>';
985 if (is_array($array_query['options_'.$key])) {
986 print $extrafields->showInputField($key, implode(',', $array_query['options_'.$key]), '', '', '', '', 0, 'societe', 1);
987 } else {
988 print $extrafields->showInputField($key, $array_query['options_'.$key], '', '', '', '', 0, 'societe', 1);
989 }
990 print '</td></tr></table>';
991
992 print '</td><td>'."\n";
993 }
994 print '</td></tr>'."\n";
995 }
996 }
997 } else {
998 $std_soc = new Societe($db);
999 $action_search = 'query';
1000
1001 $parameters = array('advtarget' => 1);
1002 if (!empty($advTarget->id)) {
1003 $parameters = array('array_query' => $advTarget->filtervalue);
1004 }
1005 // Other attributes
1006 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $std_soc, $action_search);
1007 print $hookmanager->resPrint;
1008 }
1009
1010 // State Contact
1011 print '<tr><td>'.$langs->trans('Status').' '.$langs->trans('Contact');
1012 if (!empty($array_query['contact_status'])) {
1013 print img_picto($langs->trans('AdvTgtUse'), 'tick');
1014 }
1015 print '</td><td>';
1016 print $formadvtargetemaling->advMultiselectarray(
1017 'contact_status',
1018 array(
1019 '0' => $langs->trans('ActivityCeased'),
1020 '1' => $langs->trans('InActivity')
1021 ),
1022 $array_query['contact_status']
1023 );
1024 print '</td><td>'."\n";
1025 print $form->textwithpicto('', $langs->trans("AdvTgtContactHelp"), 1, 'help');
1026 print '</td></tr>'."\n";
1027
1028 // Civility
1029 print '<tr><td>'.$langs->trans("UserTitle");
1030 if (!empty($array_query['contact_civility'])) {
1031 print img_picto($langs->trans('AdvTgtUse'), 'tick');
1032 }
1033 print '</td><td>';
1034 print $formadvtargetemaling->multiselectCivility('contact_civility', $array_query['contact_civility']);
1035 print '</td></tr>';
1036
1037 // contact name
1038 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans('Lastname');
1039 if (!empty($array_query['contact_lastname'])) {
1040 print img_picto($langs->trans('AdvTgtUse'), 'tick');
1041 }
1042 print '</td><td><input type="text" name="contact_lastname" value="'.$array_query['contact_lastname'].'"/></td><td>'."\n";
1043 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
1044 print '</td></tr>'."\n";
1045 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans('Firstname');
1046 if (!empty($array_query['contact_firstname'])) {
1047 print img_picto($langs->trans('AdvTgtUse'), 'tick');
1048 }
1049 print '</td><td><input type="text" name="contact_firstname" value="'.$array_query['contact_firstname'].'"/></td><td>'."\n";
1050 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
1051 print '</td></tr>'."\n";
1052
1053 // Contact Country
1054 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("Country");
1055 if (!empty($array_query['contact_country'])) {
1056 print img_picto($langs->trans('AdvTgtUse'), 'tick');
1057 }
1058 print '</td><td>'."\n";
1059 print $formadvtargetemaling->multiselectCountry('contact_country', $array_query['contact_country']);
1060 print '</td><td>'."\n";
1061 print '</td></tr>'."\n";
1062
1063 // Never send mass mailing
1064 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("No_Email");
1065 if (!empty($array_query['contact_no_email'])) {
1066 print img_picto($langs->trans('AdvTgtUse'), 'tick');
1067 }
1068 print '</td><td>'."\n";
1069 print $form->selectarray(
1070 'contact_no_email',
1071 array(
1072 '' => '',
1073 '1' => $langs->trans('Yes'),
1074 '0' => $langs->trans('No')
1075 ),
1076 $array_query['contact_no_email']
1077 );
1078 print '</td><td>'."\n";
1079 print '</td></tr>'."\n";
1080
1081 // Contact Date Create
1082 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("DateCreation");
1083 if (!empty($array_query['contact_create_st_dt'])) {
1084 print img_picto($langs->trans('AdvTgtUse'), 'tick');
1085 }
1086 print '</td><td>'."\n";
1087 print '<table class="nobordernopadding"><tr>';
1088 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
1089 print $form->selectDate($array_query['contact_create_st_dt'], 'contact_create_st_dt', 0, 0, 1, 'find_customer', 1, 1);
1090 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
1091 print $form->selectDate($array_query['contact_create_end_dt'], 'contact_create_end_dt', 0, 0, 1, 'find_customer', 1, 1);
1092 print '</td></tr></table>';
1093 print '</td><td>'."\n";
1094 print '</td></tr>'."\n";
1095
1096 // Contact update Create
1097 print '<tr><td>'.$langs->trans('Contact').' '.$langs->trans("DateLastModification");
1098 if (!empty($array_query['contact_update_st_dt'])) {
1099 print img_picto($langs->trans('AdvTgtUse'), 'tick');
1100 }
1101 print '</td><td>'."\n";
1102 print '<table class="nobordernopadding"><tr>';
1103 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
1104 print $form->selectDate($array_query['contact_update_st_dt'], 'contact_update_st_dt', 0, 0, 1, 'find_customer', 1, 1);
1105 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
1106 print $form->selectDate($array_query['contact_update_end_dt'], 'contact_update_end_dt', 0, 0, 1, 'find_customer', 1, 1);
1107 print '</td></tr></table>';
1108 print '</td><td>'."\n";
1109 print '</td></tr>'."\n";
1110
1111 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
1112 // Customer Categories
1113 print '<tr><td>'.$langs->trans("ContactCategoriesShort");
1114 print '</td><td>'."\n";
1115 print $form->selectCategories(Categorie::TYPE_CONTACT, 'contact_categ', $object);
1116 print '</td><td>'."\n";
1117 print '</td></tr>'."\n";
1118 }
1119
1120 // Standard Extrafield feature
1121 if (!getDolGlobalString('MAIN_EXTRAFIELDS_DISABLED')) {
1122 $contactstatic = new Contact($db);
1123 $elementtype = $contactstatic->table_element;
1124 // fetch optionals attributes and labels
1125
1126 $extrafields->fetch_name_optionals_label($elementtype);
1127 $extrafieldinfo = $extrafields->attributes[$elementtype] ?? [];
1128 if (!empty($extrafieldinfo['type'])) {
1129 foreach ($extrafieldinfo['type'] as $key => &$value) {
1130 if ($value == 'radio') {
1131 $value = 'select';
1132 }
1133 }
1134 }
1135 if (!empty($extrafieldinfo['label'])) {
1136 foreach ($extrafieldinfo['label'] as $key => $val) {
1137 if (!isset($array_query['options_'.$key.'_cnct'])) {
1138 $array_query['options_'.$key.'_cnct'] = '';
1139 }
1140 print '<tr><td>'.$extrafieldinfo['label'][$key];
1141 if ($array_query['options_'.$key.'_cnct'] != '' || (is_array($array_query['options_'.$key.'_cnct']) && count($array_query['options_'.$key.'_cnct']) > 0)) {
1142 print img_picto($langs->trans('AdvTgtUse'), 'tick');
1143 }
1144 print '</td><td>';
1145 if (($extrafieldinfo['type'][$key] == 'varchar') || ($extrafieldinfo['type'][$key] == 'text')) {
1146 print '<input type="text" name="options_'.$key.'_cnct"/></td><td>'."\n";
1147 print $form->textwithpicto('', $langs->trans("AdvTgtSearchTextHelp"), 1, 'help');
1148 } elseif (($extrafieldinfo['type'][$key] == 'int') || ($extrafieldinfo['type'][$key] == 'double')) {
1149 print $langs->trans("AdvTgtMinVal").'<input type="text" name="options_'.$key.'_min_cnct"/>';
1150 print $langs->trans("AdvTgtMaxVal").'<input type="text" name="options_'.$key.'_max_cnct"/>';
1151 print '</td><td>'."\n";
1152 print $form->textwithpicto('', $langs->trans("AdvTgtSearchIntHelp"), 1, 'help');
1153 } elseif (($extrafieldinfo['type'][$key] == 'date') || ($extrafieldinfo['type'][$key] == 'datetime')) {
1154 print '<table class="nobordernopadding"><tr>';
1155 print '<td>'.$langs->trans("AdvTgtStartDt").'</td><td>';
1156 print $form->selectDate('', 'options_'.$key.'_st_dt_cnct', 0, 0, 1);
1157 print '</td><td>'.$langs->trans("AdvTgtEndDt").'</td><td>';
1158 print $form->selectDate('', 'options_'.$key.'_end_dt_cnct', 0, 0, 1);
1159 print '</td></tr></table>';
1160 print '</td><td>'."\n";
1161 print $form->textwithpicto('', $langs->trans("AdvTgtSearchDtHelp"), 1, 'help');
1162 } elseif (($extrafieldinfo['type'][$key] == 'boolean')) {
1163 print $form->selectarray(
1164 'options_'.$key.'_cnct',
1165 array(
1166 '' => '',
1167 '1' => $langs->trans('Yes'),
1168 '0' => $langs->trans('No')
1169 ),
1170 $array_query['options_'.$key.'_cnct']
1171 );
1172 print '</td><td>'."\n";
1173 } elseif ($extrafieldinfo['type'][$key] == 'select') {
1174 print $formadvtargetemaling->advMultiselectarray('options_'.$key.'_cnct', $extrafieldinfo['param'][$key]['options'], $array_query['options_'.$key.'_cnct']);
1175 print '</td><td>'."\n";
1176 } elseif ($extrafieldinfo['type'][$key] == 'sellist') {
1177 print $formadvtargetemaling->advMultiselectarraySelllist('options_'.$key.'_cnct', $extrafieldinfo['param'][$key]['options'], $array_query['options_'.$key.'_cnct']);
1178 print '</td><td>'."\n";
1179 } else {
1180 if (is_array($array_query['options_'.$key.'_cnct'])) {
1181 print $extrafields->showInputField($key, implode(',', $array_query['options_'.$key.'_cnct']), '', '_cnct', '', '', 0, 'socpeople', 1);
1182 } else {
1183 print $extrafields->showInputField($key, $array_query['options_'.$key.'_cnct'], '', '_cnct', '', '', 0, 'socpeople', 1);
1184 }
1185 print '</td><td>'."\n";
1186 }
1187 print '</td></tr>'."\n";
1188 }
1189 }
1190 }
1191
1192 print '</table>'."\n";
1193 print '<br>';
1194 print '<center><input type="button" name="addcontact" id="addcontact" value="'.$langs->trans('AdvTgtAddContact').'" class="butAction"/></center>'."\n";
1195 print '<br>';
1196 print '</form>'."\n";
1197
1198 print '<br>';
1199
1200 // TODO Replace this with an include of a.tpl that contains samecode than into targetemailing.php
1201 print '<form action="'.$_SERVER['PHP_SELF'].'?action=clear&id='.$object->id.'" method="POST">';
1202 print '<input type="hidden" name="token" value="'.newToken().'">';
1203 print load_fiche_titre($langs->trans("ToClearAllRecipientsClickHere"));
1204 print '<table class="noborder centpercent">';
1205 print '<tr class="liste_titre">';
1206 print '<td class="liste_titre right"><input type="submit" class="button" value="'.$langs->trans("TargetsReset").'"></td>';
1207 print '</tr>';
1208 print '</table>';
1209 print '</form>';
1210
1211
1212 print '<br>';
1213 }
1214}
1215
1216// End of page
1217llxFooter();
1218$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
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:
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.
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.
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_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.
Definition html.lib.php:540
dol_get_fiche_end($notab=0)
Return tab footer of a card.
Definition html.lib.php:738
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Definition html.lib.php:181
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.