dolibarr 19.0.4
emailcollector_card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2018 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2022 Charlene Benke <charlene@patas-monkey.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
25// Load Dolibarr environment
26require '../main.inc.php';
27require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
28require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php';
29require_once DOL_DOCUMENT_ROOT.'/core/class/events.class.php';
30
31include_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
32include_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
33include_once DOL_DOCUMENT_ROOT.'/emailcollector/class/emailcollector.class.php';
34include_once DOL_DOCUMENT_ROOT.'/emailcollector/class/emailcollectorfilter.class.php';
35include_once DOL_DOCUMENT_ROOT.'/emailcollector/class/emailcollectoraction.class.php';
36include_once DOL_DOCUMENT_ROOT.'/emailcollector/lib/emailcollector.lib.php';
37
38use Webklex\PHPIMAP\ClientManager;
39use Webklex\PHPIMAP\Exceptions\ConnectionFailedException;
40use Webklex\PHPIMAP\Exceptions\InvalidWhereQueryCriteriaException;
41
42
43use OAuth\Common\Storage\DoliStorage;
44use OAuth\Common\Consumer\Credentials;
45
46if (!$user->admin) {
48}
49if (!isModEnabled('emailcollector')) {
51}
52
53// Load traductions files required by page
54$langs->loadLangs(array("admin", "mails", "other"));
55
56// Get parameters
57$id = GETPOST('id', 'int');
58$ref = GETPOST('ref', 'alpha');
59$action = GETPOST('action', 'aZ09');
60$confirm = GETPOST('confirm', 'alpha');
61$cancel = GETPOST('cancel', 'aZ09');
62$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'emailcollectorcard'; // To manage different context of search
63$backtopage = GETPOST('backtopage', 'alpha');
64
65$operationid = GETPOST('operationid', 'int');
66
67// Initialize technical objects
68$object = new EmailCollector($db);
69$extrafields = new ExtraFields($db);
70$diroutputmassaction = $conf->emailcollector->dir_output.'/temp/massgeneration/'.$user->id;
71$hookmanager->initHooks(array('emailcollectorcard')); // Note that conf->hooks_modules contains array
72
73// Fetch optionals attributes and labels
74$extrafields->fetch_name_optionals_label($object->table_element);
75
76$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
77
78// Initialize array of search criterias
79$search_all = GETPOST("search_all", 'alpha');
80$search = array();
81foreach ($object->fields as $key => $val) {
82 if (GETPOST('search_'.$key, 'alpha')) {
83 $search[$key] = GETPOST('search_'.$key, 'alpha');
84 }
85}
86
87if (GETPOST('saveoperation2')) {
88 $action = 'updateoperation';
89}
90if (empty($action) && empty($id) && empty($ref)) {
91 $action = 'view';
92}
93
94// Load object
95include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
96
97// Security check - Protection if external user
98//if ($user->socid > 0) accessforbidden();
99//if ($user->socid > 0) $socid = $user->socid;
100//$isdraft = (($object->statut == MyObject::STATUS_DRAFT) ? 1 : 0);
101//$result = restrictedArea($user, 'mymodule', $object->id, '', '', 'fk_soc', 'rowid', $isdraft);
102
103$permissionnote = $user->admin; // Used by the include of actions_setnotes.inc.php
104$permissiondellink = $user->admin; // Used by the include of actions_dellink.inc.php
105$permissiontoadd = $user->admin; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
106
107$debuginfo = '';
108$error = 0;
109
110
111/*
112 * Actions
113 */
114
115$parameters = array();
116$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
117
118if ($reshook < 0) {
119 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
120}
121
122if (empty($reshook)) {
123 $permissiontoadd = 1;
124 $permissiontodelete = 1;
125 if (empty($backtopage)) {
126 $backtopage = DOL_URL_ROOT.'/admin/emailcollector_card.php?id='.($id > 0 ? $id : '__ID__');
127 }
128 $backurlforlist = DOL_URL_ROOT.'/admin/emailcollector_list.php';
129
130 // Actions cancel, add, update, delete or clone
131 include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
132
133 // Actions when linking object each other
134 include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php';
135
136 // Actions when printing a doc from card
137 include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
138}
139
140if (GETPOST('addfilter', 'alpha')) {
141 $emailcollectorfilter = new EmailCollectorFilter($db);
142 $emailcollectorfilter->type = GETPOST('filtertype', 'aZ09');
143 $emailcollectorfilter->rulevalue = GETPOST('rulevalue', 'alpha');
144 $emailcollectorfilter->fk_emailcollector = $object->id;
145 $emailcollectorfilter->status = 1;
146
147 $result = $emailcollectorfilter->create($user);
148
149 if ($result > 0) {
150 $object->fetchFilters();
151 } else {
152 setEventMessages($emailcollectorfilter->error, $emailcollectorfilter->errors, 'errors');
153 }
154}
155
156if ($action == 'deletefilter') {
157 $emailcollectorfilter = new EmailCollectorFilter($db);
158 $emailcollectorfilter->fetch(GETPOST('filterid', 'int'));
159 if ($emailcollectorfilter->id > 0) {
160 $result = $emailcollectorfilter->delete($user);
161 if ($result > 0) {
162 $object->fetchFilters();
163 } else {
164 setEventMessages($emailcollectorfilter->error, $emailcollectorfilter->errors, 'errors');
165 }
166 }
167}
168
169if (GETPOST('addoperation', 'alpha')) {
170 $emailcollectoroperation = new EmailCollectorAction($db);
171 $emailcollectoroperation->type = GETPOST('operationtype', 'aZ09');
172 $emailcollectoroperation->actionparam = GETPOST('operationparam', 'restricthtml');
173 $emailcollectoroperation->fk_emailcollector = $object->id;
174 $emailcollectoroperation->status = 1;
175 $emailcollectoroperation->position = 50;
176
177 if ($emailcollectoroperation->type == '-1') {
178 $error++;
179 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Operation")), null, 'errors');
180 }
181
182 if (in_array($emailcollectoroperation->type, array('loadthirdparty', 'loadandcreatethirdparty'))
183 && empty($emailcollectoroperation->actionparam)) {
184 $error++;
185 setEventMessages($langs->trans("ErrorAParameterIsRequiredForThisOperation"), null, 'errors');
186 }
187
188 if (!$error) {
189 $result = $emailcollectoroperation->create($user);
190
191 if ($result > 0) {
192 $object->fetchActions();
193 } else {
194 $error++;
195 setEventMessages($emailcollectoroperation->error, $emailcollectoroperation->errors, 'errors');
196 }
197 }
198}
199
200if ($action == 'updateoperation') {
201 $emailcollectoroperation = new EmailCollectorAction($db);
202 $emailcollectoroperation->fetch(GETPOST('rowidoperation2', 'int'));
203
204 $emailcollectoroperation->actionparam = GETPOST('operationparam2', 'alphawithlgt');
205
206 if (in_array($emailcollectoroperation->type, array('loadthirdparty', 'loadandcreatethirdparty'))
207 && empty($emailcollectoroperation->actionparam)) {
208 $error++;
209 setEventMessages($langs->trans("ErrorAParameterIsRequiredForThisOperation"), null, 'errors');
210 }
211
212 if (!$error) {
213 $result = $emailcollectoroperation->update($user);
214
215 if ($result > 0) {
216 $object->fetchActions();
217 } else {
218 $error++;
219 setEventMessages($emailcollectoroperation->error, $emailcollectoroperation->errors, 'errors');
220 }
221 }
222}
223if ($action == 'deleteoperation') {
224 $emailcollectoroperation = new EmailCollectorAction($db);
225 $emailcollectoroperation->fetch(GETPOST('operationid', 'int'));
226 if ($emailcollectoroperation->id > 0) {
227 $result = $emailcollectoroperation->delete($user);
228 if ($result > 0) {
229 $object->fetchActions();
230 } else {
231 setEventMessages($emailcollectoroperation->error, $emailcollectoroperation->errors, 'errors');
232 }
233 }
234}
235
236if ($action == 'collecttest') {
237 dol_include_once('/emailcollector/class/emailcollector.class.php');
238
239 $res = $object->doCollectOneCollector(1);
240 if ($res > 0) {
241 $debuginfo = $object->debuginfo;
242 setEventMessages($object->lastresult, null, 'mesgs');
243 } else {
244 $debuginfo = $object->debuginfo;
245 setEventMessages($object->error, $object->errors, 'errors');
246 }
247
248 $action = '';
249}
250
251if ($action == 'confirm_collect') {
252 dol_include_once('/emailcollector/class/emailcollector.class.php');
253
254 $res = $object->doCollectOneCollector(0);
255 if ($res > 0) {
256 $debuginfo = $object->debuginfo;
257 setEventMessages($object->lastresult, null, 'mesgs');
258 } else {
259 $debuginfo = $object->debuginfo;
260 setEventMessages($object->error, $object->errors, 'errors');
261 }
262
263 $action = '';
264}
265
266
267
268/*
269 * View
270 */
271
272$form = new Form($db);
273$formfile = new FormFile($db);
274
275$help_url = "EN:Module_EMail_Collector|FR:Module_Collecteur_de_courrier_électronique|ES:Module_EMail_Collector";
276
277llxHeader('', 'EmailCollector', $help_url);
278
279// Part to create
280if ($action == 'create') {
281 print load_fiche_titre($langs->trans("NewEmailCollector", $langs->transnoentitiesnoconv("EmailCollector")));
282
283 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
284 print '<input type="hidden" name="token" value="'.newToken().'">';
285 print '<input type="hidden" name="action" value="add">';
286 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
287
288 print dol_get_fiche_head(array(), '');
289
290 print '<table class="border centpercent tableforfield">'."\n";
291
292 //unset($fields[]);
293
294 // Common attributes
295 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php';
296
297 // Other attributes
298 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
299
300 print '</table>'."\n";
301
302 print dol_get_fiche_end();
303
304 print $form->buttonsSaveCancel("Create");
305
306 print '</form>';
307}
308
309// Part to edit record
310if (($id || $ref) && $action == 'edit') {
311 print load_fiche_titre($langs->trans("EmailCollector"));
312
313 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
314 print '<input type="hidden" name="token" value="'.newToken().'">';
315 print '<input type="hidden" name="action" value="update">';
316 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
317 print '<input type="hidden" name="id" value="'.$object->id.'">';
318
319 print dol_get_fiche_head();
320
321 print '<table class="border centpercent tableforfield">'."\n";
322
323 // Common attributes
324 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_edit.tpl.php';
325
326 // Other attributes
327 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
328
329 print '</table>';
330
331 print dol_get_fiche_end();
332
333 print $form->buttonsSaveCancel();
334
335 print '</form>';
336}
337
338// Part to show record
339if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
340 $res = $object->fetch_optionals();
341
342 $object->fetchFilters();
343 $object->fetchActions();
344
345 $head = emailcollectorPrepareHead($object);
346 print dol_get_fiche_head($head, 'card', $langs->trans("EmailCollector"), -1, 'email');
347
348 $formconfirm = '';
349
350 // Confirmation to delete
351 if ($action == 'delete') {
352 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteEmailCollector'), $langs->trans('ConfirmDeleteEmailCollector'), 'confirm_delete', '', 0, 1);
353 }
354
355 // Clone confirmation
356 if ($action == 'clone') {
357 // Create an array for form
358 $formquestion = array();
359 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneEmailCollector', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
360 }
361
362 // Confirmation of action process
363 if ($action == 'collect') {
364 $formquestion = array();
365 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('EmailCollectorConfirmCollectTitle'), $langs->trans('EmailCollectorConfirmCollect'), 'confirm_collect', $formquestion, 0, 1, 220);
366 }
367
368 // Call Hook formConfirm
369 $parameters = array('formConfirm' => $formconfirm);
370 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
371 if (empty($reshook)) {
372 $formconfirm .= $hookmanager->resPrint;
373 } elseif ($reshook > 0) {
374 $formconfirm = $hookmanager->resPrint;
375 }
376
377 // Print form confirm
378 print $formconfirm;
379
380 // Object card
381 // ------------------------------------------------------------
382 $linkback = '<a href="'.DOL_URL_ROOT.'/admin/emailcollector_list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
383
384 $morehtmlref = '<div class="refidno">';
385 $morehtmlref .= '</div>';
386
387 $morehtml = '';
388
389 $sourcedir = $object->source_directory;
390 $targetdir = ($object->target_directory ? $object->target_directory : ''); // Can be '[Gmail]/Trash' or 'mytag'
391
392 $connection = null;
393 $connectstringserver = '';
394 $connectstringsource = '';
395 $connectstringtarget = '';
396
397 // Note: $object->host has been loaded by the fetch
398 $connectstringserver = $object->getConnectStringIMAP();
399
400 if ($action == 'scan') {
401 if (getDolGlobalString('MAIN_IMAP_USE_PHPIMAP')) {
402 require_once DOL_DOCUMENT_ROOT.'/includes/webklex/php-imap/vendor/autoload.php';
403
404 if ($object->acces_type == 1) {
405 // Mode OAUth2 with PHP-IMAP
406 require_once DOL_DOCUMENT_ROOT.'/core/lib/oauth.lib.php';
407
408 $supportedoauth2array = getSupportedOauth2Array();
409
410 $keyforsupportedoauth2array = $object->oauth_service;
411 if (preg_match('/^.*-/', $keyforsupportedoauth2array)) {
412 $keyforprovider = preg_replace('/^.*-/', '', $keyforsupportedoauth2array);
413 } else {
414 $keyforprovider = '';
415 }
416 $keyforsupportedoauth2array = preg_replace('/-.*$/', '', $keyforsupportedoauth2array);
417 $keyforsupportedoauth2array = 'OAUTH_'.$keyforsupportedoauth2array.'_NAME';
418
419 $OAUTH_SERVICENAME = (empty($supportedoauth2array[$keyforsupportedoauth2array]['name']) ? 'Unknown' : $supportedoauth2array[$keyforsupportedoauth2array]['name'].($keyforprovider ? '-'.$keyforprovider : ''));
420
421 require_once DOL_DOCUMENT_ROOT.'/includes/OAuth/bootstrap.php';
422 //$debugtext = "Host: ".$this->host."<br>Port: ".$this->port."<br>Login: ".$this->login."<br>Password: ".$this->password."<br>access type: ".$this->acces_type."<br>oauth service: ".$this->oauth_service."<br>Max email per collect: ".$this->maxemailpercollect;
423 //dol_syslog($debugtext);
424
425 $token = '';
426
427 $storage = new DoliStorage($db, $conf, $keyforprovider);
428
429 try {
430 $tokenobj = $storage->retrieveAccessToken($OAUTH_SERVICENAME);
431
432 $expire = true;
433 // Is token expired or will token expire in the next 30 seconds
434 // if (is_object($tokenobj)) {
435 // $expire = ($tokenobj->getEndOfLife() !== -9002 && $tokenobj->getEndOfLife() !== -9001 && time() > ($tokenobj->getEndOfLife() - 30));
436 // }
437 // Token expired so we refresh it
438 if (is_object($tokenobj) && $expire) {
439 $credentials = new Credentials(
440 getDolGlobalString('OAUTH_'.$object->oauth_service.'_ID'),
441 getDolGlobalString('OAUTH_'.$object->oauth_service.'_SECRET'),
442 getDolGlobalString('OAUTH_'.$object->oauth_service.'_URLAUTHORIZE')
443 );
444 $serviceFactory = new \OAuth\ServiceFactory();
445 $oauthname = explode('-', $OAUTH_SERVICENAME);
446
447 // ex service is Google-Emails we need only the first part Google
448 $apiService = $serviceFactory->createService($oauthname[0], $credentials, $storage, array());
449
450 // We have to save the token because Google give it only once
451 $refreshtoken = $tokenobj->getRefreshToken();
452
453 //var_dump($tokenobj);
454 try {
455 $tokenobj = $apiService->refreshAccessToken($tokenobj);
456 } catch (Exception $e) {
457 throw new Exception("Failed to refresh access token: ".$e->getMessage());
458 }
459
460 $tokenobj->setRefreshToken($refreshtoken);
461 $storage->storeAccessToken($OAUTH_SERVICENAME, $tokenobj);
462 }
463 $tokenobj = $storage->retrieveAccessToken($OAUTH_SERVICENAME);
464 if (is_object($tokenobj)) {
465 $token = $tokenobj->getAccessToken();
466 } else {
467 $error++;
468 $morehtml .= "Token not found";
469 }
470 } catch (Exception $e) {
471 $error++;
472 $morehtml .= $e->getMessage();
473 }
474
475 if (empty($object->login)) {
476 $error++;
477 $morehtml .= 'Error: Login is empty. Must be email owner when using MAIN_IMAP_USE_PHPIMAP and OAuth.';
478 }
479
480 $cm = new ClientManager();
481 $client = $cm->make([
482 'host' => $object->host,
483 'port' => $object->port,
484 'encryption' => 'ssl',
485 'validate_cert' => true,
486 'protocol' => 'imap',
487 'username' => $object->login,
488 'password' => $token,
489 'authentication' => "oauth",
490 ]);
491 } else {
492 // Mode login/pass with PHP-IMAP
493 $cm = new ClientManager();
494 $client = $cm->make([
495 'host' => $object->host,
496 'port' => $object->port,
497 'encryption' => 'ssl',
498 'validate_cert' => true,
499 'protocol' => 'imap',
500 'username' => $object->login,
501 'password' => $object->password,
502 'authentication' => "login",
503 ]);
504 }
505
506 if (!$error) {
507 try {
508 // To emulate the command connect, you can run
509 // openssl s_client -crlf -connect outlook.office365.com:993
510 // TAG1 AUTHENTICATE XOAUTH2 dXN...
511 // TO Get debug log, you can set protected $debug = true; in Protocol.php file
512 //
513 // A MS bug make this not working !
514 // See https://github.com/MicrosoftDocs/office-developer-exchange-docs/issues/100
515 // See github.com/MicrosoftDocs/office-developer-exchange-docs/issues/87
516 // See github.com/Webklex/php-imap/issues/81
517 $client->connect();
518
519 $f = $client->getFolders(false, $object->source_directory);
520 $nbemail = $f[0]->examine()["exists"];
521 $morehtml .= $nbemail;
522 } catch (ConnectionFailedException $e) {
523 $morehtml .= 'ConnectionFailedException '.$e->getMessage();
524 }
525 }
526 } else {
527 if (function_exists('imap_open')) {
528 try {
529 if ($sourcedir) {
530 //$connectstringsource = $connectstringserver.imap_utf7_encode($sourcedir);
531 $connectstringsource = $connectstringserver.$object->getEncodedUtf7($sourcedir);
532 }
533 if ($targetdir) {
534 //$connectstringtarget = $connectstringserver.imap_utf7_encode($targetdir);
535 $connectstringtarget = $connectstringserver.$object->getEncodedUtf7($targetdir);
536 }
537
538 $timeoutconnect = !getDolGlobalString('MAIN_USE_CONNECT_TIMEOUT') ? 5 : $conf->global->MAIN_USE_CONNECT_TIMEOUT;
539 $timeoutread = !getDolGlobalString('MAIN_USE_RESPONSE_TIMEOUT') ? 20 : $conf->global->MAIN_USE_RESPONSE_TIMEOUT;
540
541 dol_syslog("imap_open connectstring=".$connectstringsource." login=".$object->login." password=".$object->password." timeoutconnect=".$timeoutconnect." timeoutread=".$timeoutread);
542
543 $result1 = imap_timeout(IMAP_OPENTIMEOUT, $timeoutconnect); // timeout seems ignored with ssl connect
544 $result2 = imap_timeout(IMAP_READTIMEOUT, $timeoutread);
545 $result3 = imap_timeout(IMAP_WRITETIMEOUT, 5);
546 $result4 = imap_timeout(IMAP_CLOSETIMEOUT, 5);
547
548 dol_syslog("result1=".$result1." result2=".$result2." result3=".$result3." result4=".$result4);
549
550 $connection = imap_open($connectstringsource, $object->login, $object->password);
551
552 //dol_syslog("end imap_open connection=".var_export($connection, true));
553 } catch (Exception $e) {
554 $morehtml .= $e->getMessage();
555 }
556
557 if (!$connection) {
558 $morehtml .= 'Failed to open IMAP connection '.$connectstringsource;
559 if (function_exists('imap_last_error')) {
560 $morehtml .= '<br>'.imap_last_error();
561 }
562 dol_syslog("Error ".$morehtml, LOG_WARNING);
563 //var_dump(imap_errors())
564 } else {
565 dol_syslog("Imap connected. Now we call imap_num_msg()");
566 $morehtml .= imap_num_msg($connection);
567 }
568
569 if ($connection) {
570 dol_syslog("Imap close");
571 imap_close($connection);
572 }
573 } else {
574 $morehtml .= 'IMAP functions not available on your PHP. ';
575 }
576 }
577 }
578
579 $morehtml = $form->textwithpicto($langs->trans("NbOfEmailsInInbox"), 'Connect string = '.$connectstringserver.'<br>Option MAIN_IMAP_USE_PHPIMAP = '.getDolGlobalInt('MAIN_IMAP_USE_PHPIMAP')).': '.($morehtml !== '' ? $morehtml : '?');
580 $morehtml .= '<a class="flat paddingleft marginleftonly" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=scan&token='.newToken().'">'.img_picto('', 'refresh', 'class="paddingrightonly"').$langs->trans("Refresh").'</a>';
581
582 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref.'<div class="refidno">'.$morehtml.'</div>', '', 0, '', '', 0, '');
583
584 print '<div class="fichecenter">';
585 print '<div class="fichehalfleft">';
586 print '<div class="underbanner clearboth"></div>';
587 print '<table class="border centpercent tableforfield">'."\n";
588
589 // Common attributes
590 //$keyforbreak='fieldkeytoswithonsecondcolumn';
591 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
592
593 // Other attributes
594 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
595
596 print '</table>';
597
598
599 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
600 print '<input type="hidden" name="token" value="'.newToken().'">';
601 print '<input type="hidden" name="action" value="updatefiltersactions">';
602 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
603 print '<input type="hidden" name="id" value="'.$object->id.'">';
604
605 // Filters
606 print '<div class="div-table-responsive-no-min">';
607 print '<table id="tablelineoffilters" class="noborder nobordertop noshadow">';
608 print '<tr class="liste_titre nodrag nodrop">';
609 print '<td>'.img_picto('', 'filter', 'class="pictofixedwidth opacitymedium"').$form->textwithpicto($langs->trans("Filters"), $langs->trans("EmailCollectorFilterDesc")).'</td><td></td><td></td>';
610 print '</tr>';
611 // Add filter
612 print '<tr class="oddeven nodrag nodrop">';
613 print '<td>';
614 $arrayoftypes = array(
615 'from'=>array('label'=>'MailFrom', 'data-placeholder'=>$langs->trans('SearchString')),
616 'to'=>array('label'=>'MailTo', 'data-placeholder'=>$langs->trans('SearchString')),
617 'cc'=>array('label'=>'Cc', 'data-placeholder'=>$langs->trans('SearchString')),
618 'bcc'=>array('label'=>'Bcc', 'data-placeholder'=>$langs->trans('SearchString')),
619 'replyto'=>array('label'=>'ReplyTo', 'data-placeholder'=>$langs->trans('SearchString')),
620 'subject'=>array('label'=>'Subject', 'data-placeholder'=>$langs->trans('SearchString')),
621 'body'=>array('label'=>'Body', 'data-placeholder'=>$langs->trans('SearchString')),
622 // disabled because PHP imap_search is not compatible IMAPv4, only IMAPv2
623 //'header'=>array('label'=>'Header', 'data-placeholder'=>'HeaderKey SearchString'), // HEADER key value
624 //'X1'=>'---',
625 'X2'=>'---',
626 'seen'=>array('label'=>'AlreadyRead', 'data-noparam'=>1),
627 'unseen'=>array('label'=>'NotRead', 'data-noparam'=>1),
628 'unanswered'=>array('label'=>'Unanswered', 'data-noparam'=>1),
629 'answered'=>array('label'=>'Answered', 'data-noparam'=>1),
630 'smaller'=>array('label'=>$langs->trans("Size").' ('.$langs->trans("SmallerThan").")", 'data-placeholder'=>$langs->trans('NumberOfBytes')),
631 'larger'=>array('label'=>$langs->trans("Size").' ('.$langs->trans("LargerThan").")", 'data-placeholder'=>$langs->trans('NumberOfBytes')),
632 'X3'=>'---',
633 'withtrackingid'=>array('label'=>'WithDolTrackingID', 'data-noparam'=>1),
634 'withouttrackingid'=>array('label'=>'WithoutDolTrackingID', 'data-noparam'=>1),
635 'withtrackingidinmsgid'=>array('label'=>'WithDolTrackingIDInMsgId', 'data-noparam'=>1),
636 'withouttrackingidinmsgid'=>array('label'=>'WithoutDolTrackingIDInMsgId', 'data-noparam'=>1),
637 'X4'=>'---',
638 'isnotanswer'=>array('label'=>'IsNotAnAnswer', 'data-noparam'=>1),
639 'isanswer'=>array('label'=>'IsAnAnswer', 'data-noparam'=>1)
640 );
641 print $form->selectarray('filtertype', $arrayoftypes, '', 1, 0, 0, '', 1, 0, 0, '', 'maxwidth300', 1, '', 2);
642
643 print "\n";
644 print '<script>';
645 print 'jQuery("#filtertype").change(function() {
646 console.log("We change a filter");
647 if (jQuery("#filtertype option:selected").attr("data-noparam")) {
648 jQuery("#rulevalue").attr("placeholder", "");
649 jQuery("#rulevalue").text("");
650 jQuery("#rulevalue").prop("disabled", true);
651 jQuery("#rulevaluehelp").addClass("unvisible");
652 } else {
653 jQuery("#rulevalue").prop("disabled", false);
654 jQuery("#rulevaluehelp").removeClass("unvisible");
655 }
656 jQuery("#rulevalue").attr("placeholder", (jQuery("#filtertype option:selected").attr("data-placeholder")));
657 ';
658 /*$noparam = array();
659 foreach ($arrayoftypes as $key => $value)
660 {
661 if ($value['noparam']) $noparam[] = $key;
662 }*/
663 print '})';
664 print '</script>'."\n";
665
666 print '</td><td class="nowraponall">';
667 print '<div class="nowraponall">';
668 print '<input type="text" name="rulevalue" id="rulevalue" class="inline-block valignmiddle">';
669 print '<div class="inline-block valignmiddle unvisible" id="rulevaluehelp">';
670 print img_warning($langs->trans("FilterSearchImapHelp"), '', 'pictowarning classfortooltip');
671 print '</div>';
672 print '</div>';
673 print '</td>';
674 print '<td class="right"><input type="submit" name="addfilter" id="addfilter" class="flat button smallpaddingimp" value="'.$langs->trans("Add").'"></td>';
675 print '</tr>';
676 // List filters
677 foreach ($object->filters as $rulefilter) {
678 $rulefilterobj = new EmailCollectorFilter($db);
679 $rulefilterobj->fetch($rulefilter['id']);
680
681 print '<tr class="oddeven">';
682 print '<td title="'.dol_escape_htmltag($langs->trans("Filter").': '.$rulefilter['type']).'">';
683 print $langs->trans($arrayoftypes[$rulefilter['type']]['label']);
684 print '</td>';
685 print '<td>'.$rulefilter['rulevalue'].'</td>';
686 print '<td class="right">';
687 print ' <a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=deletefilter&token='.urlencode(newToken()).'&filterid='.$rulefilter['id'].'">'.img_delete().'</a>';
688 print '</td>';
689 print '</tr>';
690 }
691
692 print '</tr>';
693 print '</table>';
694 print '</div>';
695
696 print '<div class="clearboth"></div><br><br>';
697
698 // Operations
699 print '<div class="div-table-responsive-no-min">';
700 print '<table id="tablelines" class="noborder noshadow">';
701 print '<tr class="liste_titre nodrag nodrop">';
702 print '<td>'.img_picto('', 'technic', 'class="pictofixedwidth"').$form->textwithpicto($langs->trans("EmailcollectorOperations"), $langs->trans("EmailcollectorOperationsDesc")).'</td>';
703 print '<td>';
704 $htmltext = $langs->transnoentitiesnoconv("OperationParamDesc");
705 print $form->textwithpicto($langs->trans("Parameters"), $htmltext, 1, 'help', '', 0, 2, 'operationparamtt');
706 print '</td>';
707 print '<td></td>';
708 print '<td></td>';
709 print '</tr>';
710
711 $arrayoftypes = array(
712 'loadthirdparty' => $langs->trans('LoadThirdPartyFromName', $langs->transnoentities("ThirdPartyName").'/'.$langs->transnoentities("AliasNameShort").'/'.$langs->transnoentities("Email").'/'.$langs->transnoentities("ID")),
713 'loadandcreatethirdparty' => $langs->trans('LoadThirdPartyFromNameOrCreate', $langs->transnoentities("ThirdPartyName").'/'.$langs->transnoentities("AliasNameShort").'/'.$langs->transnoentities("Email").'/'.$langs->transnoentities("ID")),
714 'recordjoinpiece' => 'AttachJoinedDocumentsToObject',
715 'recordevent' => 'RecordEvent'
716 );
717 $arrayoftypesnocondition = $arrayoftypes;
718 if (isModEnabled('project')) {
719 $arrayoftypes['project'] = 'CreateLeadAndThirdParty';
720 }
721 $arrayoftypesnocondition['project'] = 'CreateLeadAndThirdParty';
722 if (isModEnabled('ticket')) {
723 $arrayoftypes['ticket'] = 'CreateTicketAndThirdParty';
724 }
725 $arrayoftypesnocondition['ticket'] = 'CreateTicketAndThirdParty';
726 if (isModEnabled('recruitment')) {
727 $arrayoftypes['candidature'] = 'CreateCandidature';
728 }
729 $arrayoftypesnocondition['candidature'] = 'CreateCandidature';
730
731 // support hook for add action
732 $parameters = array('arrayoftypes' => $arrayoftypes);
733 $res = $hookmanager->executeHooks('addMoreActionsEmailCollector', $parameters, $object, $action);
734
735 if ($res) {
736 $arrayoftypes = $hookmanager->resArray;
737 } else {
738 foreach ($hookmanager->resArray as $k => $desc) {
739 $arrayoftypes[$k] = $desc;
740 }
741 }
742
743 // Add operation
744 print '<tr class="oddeven nodrag nodrop">';
745 print '<td>';
746 print $form->selectarray('operationtype', $arrayoftypes, '', 1, 0, 0, '', 1, 0, 0, '', 'minwidth150 maxwidth300', 1);
747 print '</td><td>';
748 print '<textarea class="centpercent" name="operationparam" rows="3"></textarea>';
749 print '</td>';
750 print '<td>';
751 print '</td>';
752 print '<td class="right"><input type="submit" name="addoperation" id="addoperation" class="flat button smallpaddingimp" value="'.$langs->trans("Add").'"></td>';
753 print '</tr>';
754 // List operations
755 $nboflines = count($object->actions);
756 $table_element_line = 'emailcollector_emailcollectoraction';
757 $fk_element = 'position';
758 $i = 0;
759 foreach ($object->actions as $ruleaction) {
760 $ruleactionobj = new EmailCollectorAction($db);
761 $ruleactionobj->fetch($ruleaction['id']);
762
763 print '<tr class="drag drop oddeven" id="row-'.$ruleaction['id'].'">';
764 print '<td title="'.dol_escape_htmltag($langs->trans("Operation").': '.$ruleaction['type']).'">';
765 print '<!-- type of action: '.$ruleaction['type'].' -->';
766 if (array_key_exists($ruleaction['type'], $arrayoftypes)) {
767 print $langs->trans($arrayoftypes[$ruleaction['type']]);
768 } else {
769 if (array_key_exists($ruleaction['type'], $arrayoftypesnocondition)) {
770 print '<span class="opacitymedium">'.$langs->trans($arrayoftypesnocondition[$ruleaction['type']]).' - '.$langs->trans("Disabled").'</span>';
771 }
772 }
773
774 if (in_array($ruleaction['type'], array('recordevent'))) {
775 print $form->textwithpicto('', $langs->transnoentitiesnoconv('IfTrackingIDFoundEventWillBeLinked'));
776 } elseif (in_array($ruleaction['type'], array('loadthirdparty', 'loadandcreatethirdparty'))) {
777 print $form->textwithpicto('', $langs->transnoentitiesnoconv('EmailCollectorLoadThirdPartyHelp'));
778 }
779 print '</td>';
780 print '<td class="wordbreak minwidth300 small">';
781 if ($action == 'editoperation' && $ruleaction['id'] == $operationid) {
782 //print '<input type="text" class="quatrevingtquinzepercent" name="operationparam2" value="'.dol_escape_htmltag($ruleaction['actionparam']).'"><br>';
783 print '<textarea class="centpercent" name="operationparam2" rows="3">';
784 print dol_escape_htmltag($ruleaction['actionparam'], 0, 1);
785 print '</textarea>';
786 print '<input type="hidden" name="rowidoperation2" value="'.$ruleaction['id'].'">';
787 print '<input type="submit" class="button small button-save" name="saveoperation2" value="'.$langs->trans("Save").'">';
788 print '<input type="submit" class="button small button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
789 } else {
790 print dol_nl2br(dol_escape_htmltag($ruleaction['actionparam'], 0, 1));
791 }
792 print '</td>';
793 // Move up/down
794 print '<td class="center linecolmove tdlineupdown">';
795 if ($i > 0) {
796 print '<a class="lineupdown" href="'.$_SERVER['PHP_SELF'].'?action=up&amp;rowid='.$ruleaction['id'].'">'.img_up('default', 0, 'imgupforline').'</a>';
797 }
798 if ($i < count($object->actions) - 1) {
799 print '<a class="lineupdown" href="'.$_SERVER['PHP_SELF'].'?action=down&amp;rowid='.$ruleaction['id'].'">'.img_down('default', 0, 'imgdownforline').'</a>';
800 }
801 print '</td>';
802 // Delete
803 print '<td class="right nowraponall">';
804 print '<a class="editfielda marginrightonly" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=editoperation&token='.newToken().'&operationid='.$ruleaction['id'].'">'.img_edit().'</a>';
805 print ' <a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=deleteoperation&token='.newToken().'&operationid='.$ruleaction['id'].'">'.img_delete().'</a>';
806 print '</td>';
807 print '</tr>';
808 $i++;
809 }
810
811 print '</tr>';
812 print '</table>';
813 print '</div>';
814
815 if (!empty($conf->use_javascript_ajax)) {
816 $urltorefreshaftermove = DOL_URL_ROOT.'/admin/emailcollector_card.php?id='.$id;
817 include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
818 }
819
820 print '</form>';
821
822 print '</div>';
823 print '</div>'; // End <div class="fichecenter">
824
825
826 print '<div class="clearboth"></div><br>';
827
828 print dol_get_fiche_end();
829
830 // Buttons for actions
831 if ($action != 'presend' && $action != 'editline') {
832 print '<div class="tabsAction">'."\n";
833 $parameters = array();
834 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
835 if ($reshook < 0) {
836 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
837 }
838
839 if (empty($reshook)) {
840 // Edit
841 print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit&token='.newToken().'">'.$langs->trans("Edit").'</a></div>';
842
843 // Clone
844 print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=clone&token='.newToken().'&object=order">'.$langs->trans("ToClone").'</a></div>';
845
846 // Collect now
847 print '<div class="inline-block divButAction"><a class="butAction reposition" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=collecttest&token='.newToken().'">'.$langs->trans("TestCollectNow").'</a></div>';
848
849 if (count($object->actions) > 0) {
850 print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=collect&token='.newToken().'">'.$langs->trans("CollectNow").'</a></div>';
851 } else {
852 print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NoOperations")).'">'.$langs->trans("CollectNow").'</a></div>';
853 }
854
855 print '<div class="inline-block divButAction"><a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.urlencode(newToken()).'">'.$langs->trans('Delete').'</a></div>';
856 }
857 print '</div>'."\n";
858 }
859
860 if (!empty($debuginfo)) {
861 print info_admin($debuginfo);
862 }
863}
864
865// End of page
866llxFooter();
867$db->close();
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class for EmailCollectorAction.
Class for EmailCollectorFilter.
Class for EmailCollector.
Class to manage standard extra fields.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
emailcollectorPrepareHead($object)
Prepare array of tabs for EmailCollector.
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
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...
getSupportedOauth2Array()
Return array of tabs to used on pages to setup cron module.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.