dolibarr 18.0.6
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 (!empty($conf->global->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'; // define $supportedoauth2array
407 $keyforsupportedoauth2array = $object->oauth_service;
408 if (preg_match('/^.*-/', $keyforsupportedoauth2array)) {
409 $keyforprovider = preg_replace('/^.*-/', '', $keyforsupportedoauth2array);
410 } else {
411 $keyforprovider = '';
412 }
413 $keyforsupportedoauth2array = preg_replace('/-.*$/', '', $keyforsupportedoauth2array);
414 $keyforsupportedoauth2array = 'OAUTH_'.$keyforsupportedoauth2array.'_NAME';
415
416 $OAUTH_SERVICENAME = (empty($supportedoauth2array[$keyforsupportedoauth2array]['name']) ? 'Unknown' : $supportedoauth2array[$keyforsupportedoauth2array]['name'].($keyforprovider ? '-'.$keyforprovider : ''));
417
418 require_once DOL_DOCUMENT_ROOT.'/includes/OAuth/bootstrap.php';
419 //$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;
420 //dol_syslog($debugtext);
421
422 $token = '';
423
424 $storage = new DoliStorage($db, $conf, $keyforprovider);
425
426 try {
427 $tokenobj = $storage->retrieveAccessToken($OAUTH_SERVICENAME);
428
429 $expire = true;
430 // Is token expired or will token expire in the next 30 seconds
431 // if (is_object($tokenobj)) {
432 // $expire = ($tokenobj->getEndOfLife() !== -9002 && $tokenobj->getEndOfLife() !== -9001 && time() > ($tokenobj->getEndOfLife() - 30));
433 // }
434 // Token expired so we refresh it
435 if (is_object($tokenobj) && $expire) {
436 $credentials = new Credentials(
437 getDolGlobalString('OAUTH_'.$object->oauth_service.'_ID'),
438 getDolGlobalString('OAUTH_'.$object->oauth_service.'_SECRET'),
439 getDolGlobalString('OAUTH_'.$object->oauth_service.'_URLAUTHORIZE')
440 );
441 $serviceFactory = new \OAuth\ServiceFactory();
442 $oauthname = explode('-', $OAUTH_SERVICENAME);
443
444 // ex service is Google-Emails we need only the first part Google
445 $apiService = $serviceFactory->createService($oauthname[0], $credentials, $storage, array());
446
447 // We have to save the token because Google give it only once
448 $refreshtoken = $tokenobj->getRefreshToken();
449
450 //var_dump($tokenobj);
451 try {
452 $tokenobj = $apiService->refreshAccessToken($tokenobj);
453 } catch (Exception $e) {
454 throw new Exception("Failed to refresh access token: ".$e->getMessage());
455 }
456
457 $tokenobj->setRefreshToken($refreshtoken);
458 $storage->storeAccessToken($OAUTH_SERVICENAME, $tokenobj);
459 }
460 $tokenobj = $storage->retrieveAccessToken($OAUTH_SERVICENAME);
461 if (is_object($tokenobj)) {
462 $token = $tokenobj->getAccessToken();
463 } else {
464 $error++;
465 $morehtml .= "Token not found";
466 }
467 } catch (Exception $e) {
468 $error++;
469 $morehtml .= $e->getMessage();
470 }
471
472 if (empty($object->login)) {
473 $error++;
474 $morehtml .= 'Error: Login is empty. Must be email owner when using MAIN_IMAP_USE_PHPIMAP and OAuth.';
475 }
476
477 $cm = new ClientManager();
478 $client = $cm->make([
479 'host' => $object->host,
480 'port' => $object->port,
481 'encryption' => 'ssl',
482 'validate_cert' => true,
483 'protocol' => 'imap',
484 'username' => $object->login,
485 'password' => $token,
486 'authentication' => "oauth",
487 ]);
488 } else {
489 // Mode login/pass with PHP-IMAP
490 $cm = new ClientManager();
491 $client = $cm->make([
492 'host' => $object->host,
493 'port' => $object->port,
494 'encryption' => 'ssl',
495 'validate_cert' => true,
496 'protocol' => 'imap',
497 'username' => $object->login,
498 'password' => $object->password,
499 'authentication' => "login",
500 ]);
501 }
502
503 if (!$error) {
504 try {
505 // To emulate the command connect, you can run
506 // openssl s_client -crlf -connect outlook.office365.com:993
507 // TAG1 AUTHENTICATE XOAUTH2 dXN...
508 // TO Get debug log, you can set protected $debug = true; in Protocol.php file
509 //
510 // A MS bug make this not working !
511 // See https://github.com/MicrosoftDocs/office-developer-exchange-docs/issues/100
512 // See github.com/MicrosoftDocs/office-developer-exchange-docs/issues/87
513 // See github.com/Webklex/php-imap/issues/81
514 $client->connect();
515
516 $f = $client->getFolders(false, $object->source_directory);
517 $nbemail = $f[0]->examine()["exists"];
518 $morehtml .= $nbemail;
519 } catch (ConnectionFailedException $e) {
520 $morehtml .= 'ConnectionFailedException '.$e->getMessage();
521 }
522 }
523 } else {
524 if (function_exists('imap_open')) {
525 try {
526 if ($sourcedir) {
527 //$connectstringsource = $connectstringserver.imap_utf7_encode($sourcedir);
528 $connectstringsource = $connectstringserver.$object->getEncodedUtf7($sourcedir);
529 }
530 if ($targetdir) {
531 //$connectstringtarget = $connectstringserver.imap_utf7_encode($targetdir);
532 $connectstringtarget = $connectstringserver.$object->getEncodedUtf7($targetdir);
533 }
534
535 $timeoutconnect = empty($conf->global->MAIN_USE_CONNECT_TIMEOUT) ? 5 : $conf->global->MAIN_USE_CONNECT_TIMEOUT;
536 $timeoutread = empty($conf->global->MAIN_USE_RESPONSE_TIMEOUT) ? 20 : $conf->global->MAIN_USE_RESPONSE_TIMEOUT;
537
538 dol_syslog("imap_open connectstring=".$connectstringsource." login=".$object->login." password=".$object->password." timeoutconnect=".$timeoutconnect." timeoutread=".$timeoutread);
539
540 $result1 = imap_timeout(IMAP_OPENTIMEOUT, $timeoutconnect); // timeout seems ignored with ssl connect
541 $result2 = imap_timeout(IMAP_READTIMEOUT, $timeoutread);
542 $result3 = imap_timeout(IMAP_WRITETIMEOUT, 5);
543 $result4 = imap_timeout(IMAP_CLOSETIMEOUT, 5);
544
545 dol_syslog("result1=".$result1." result2=".$result2." result3=".$result3." result4=".$result4);
546
547 $connection = imap_open($connectstringsource, $object->login, $object->password);
548
549 //dol_syslog("end imap_open connection=".var_export($connection, true));
550 } catch (Exception $e) {
551 $morehtml .= $e->getMessage();
552 }
553
554 if (!$connection) {
555 $morehtml .= 'Failed to open IMAP connection '.$connectstringsource;
556 if (function_exists('imap_last_error')) {
557 $morehtml .= '<br>'.imap_last_error();
558 }
559 dol_syslog("Error ".$morehtml, LOG_WARNING);
560 //var_dump(imap_errors())
561 } else {
562 dol_syslog("Imap connected. Now we call imap_num_msg()");
563 $morehtml .= imap_num_msg($connection);
564 }
565
566 if ($connection) {
567 dol_syslog("Imap close");
568 imap_close($connection);
569 }
570 } else {
571 $morehtml .= 'IMAP functions not available on your PHP. ';
572 }
573 }
574 }
575
576 $morehtml = $form->textwithpicto($langs->trans("NbOfEmailsInInbox"), 'Connect string = '.$connectstringserver.'<br>Option MAIN_IMAP_USE_PHPIMAP = '.getDolGlobalInt('MAIN_IMAP_USE_PHPIMAP')).': '.($morehtml !== '' ? $morehtml : '?');
577 $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>';
578
579 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref.'<div class="refidno">'.$morehtml.'</div>', '', 0, '', '', 0, '');
580
581 print '<div class="fichecenter">';
582 print '<div class="fichehalfleft">';
583 print '<div class="underbanner clearboth"></div>';
584 print '<table class="border centpercent tableforfield">'."\n";
585
586 // Common attributes
587 //$keyforbreak='fieldkeytoswithonsecondcolumn';
588 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
589
590 // Other attributes
591 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
592
593 print '</table>';
594
595
596 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
597 print '<input type="hidden" name="token" value="'.newToken().'">';
598 print '<input type="hidden" name="action" value="updatefiltersactions">';
599 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
600 print '<input type="hidden" name="id" value="'.$object->id.'">';
601
602 // Filters
603 print '<div class="div-table-responsive-no-min">';
604 print '<table id="tablelineoffilters" class="noborder nobordertop noshadow">';
605 print '<tr class="liste_titre nodrag nodrop">';
606 print '<td>'.img_picto('', 'filter', 'class="pictofixedwidth opacitymedium"').$form->textwithpicto($langs->trans("Filters"), $langs->trans("EmailCollectorFilterDesc")).'</td><td></td><td></td>';
607 print '</tr>';
608 // Add filter
609 print '<tr class="oddeven nodrag nodrop">';
610 print '<td>';
611 $arrayoftypes = array(
612 'from'=>array('label'=>'MailFrom', 'data-placeholder'=>$langs->trans('SearchString')),
613 'to'=>array('label'=>'MailTo', 'data-placeholder'=>$langs->trans('SearchString')),
614 'cc'=>array('label'=>'Cc', 'data-placeholder'=>$langs->trans('SearchString')),
615 'bcc'=>array('label'=>'Bcc', 'data-placeholder'=>$langs->trans('SearchString')),
616 'replyto'=>array('label'=>'ReplyTo', 'data-placeholder'=>$langs->trans('SearchString')),
617 'subject'=>array('label'=>'Subject', 'data-placeholder'=>$langs->trans('SearchString')),
618 'body'=>array('label'=>'Body', 'data-placeholder'=>$langs->trans('SearchString')),
619 // disabled because PHP imap_search is not compatible IMAPv4, only IMAPv2
620 //'header'=>array('label'=>'Header', 'data-placeholder'=>'HeaderKey SearchString'), // HEADER key value
621 //'X1'=>'---',
622 'X2'=>'---',
623 'seen'=>array('label'=>'AlreadyRead', 'data-noparam'=>1),
624 'unseen'=>array('label'=>'NotRead', 'data-noparam'=>1),
625 'unanswered'=>array('label'=>'Unanswered', 'data-noparam'=>1),
626 'answered'=>array('label'=>'Answered', 'data-noparam'=>1),
627 'smaller'=>array('label'=>$langs->trans("Size").' ('.$langs->trans("SmallerThan").")", 'data-placeholder'=>$langs->trans('NumberOfBytes')),
628 'larger'=>array('label'=>$langs->trans("Size").' ('.$langs->trans("LargerThan").")", 'data-placeholder'=>$langs->trans('NumberOfBytes')),
629 'X3'=>'---',
630 'withtrackingid'=>array('label'=>'WithDolTrackingID', 'data-noparam'=>1),
631 'withouttrackingid'=>array('label'=>'WithoutDolTrackingID', 'data-noparam'=>1),
632 'withtrackingidinmsgid'=>array('label'=>'WithDolTrackingIDInMsgId', 'data-noparam'=>1),
633 'withouttrackingidinmsgid'=>array('label'=>'WithoutDolTrackingIDInMsgId', 'data-noparam'=>1),
634 'X4'=>'---',
635 'isnotanswer'=>array('label'=>'IsNotAnAnswer', 'data-noparam'=>1),
636 'isanswer'=>array('label'=>'IsAnAnswer', 'data-noparam'=>1)
637 );
638 print $form->selectarray('filtertype', $arrayoftypes, '', 1, 0, 0, '', 1, 0, 0, '', 'maxwidth300', 1, '', 2);
639
640 print "\n";
641 print '<script>';
642 print 'jQuery("#filtertype").change(function() {
643 console.log("We change a filter");
644 if (jQuery("#filtertype option:selected").attr("data-noparam")) {
645 jQuery("#rulevalue").attr("placeholder", "");
646 jQuery("#rulevalue").text("");
647 jQuery("#rulevalue").prop("disabled", true);
648 jQuery("#rulevaluehelp").addClass("unvisible");
649 } else {
650 jQuery("#rulevalue").prop("disabled", false);
651 jQuery("#rulevaluehelp").removeClass("unvisible");
652 }
653 jQuery("#rulevalue").attr("placeholder", (jQuery("#filtertype option:selected").attr("data-placeholder")));
654 ';
655 /*$noparam = array();
656 foreach ($arrayoftypes as $key => $value)
657 {
658 if ($value['noparam']) $noparam[] = $key;
659 }*/
660 print '})';
661 print '</script>'."\n";
662
663 print '</td><td class="nowraponall">';
664 print '<div class="nowraponall">';
665 print '<input type="text" name="rulevalue" id="rulevalue" class="inline-block valignmiddle">';
666 print '<div class="inline-block valignmiddle unvisible" id="rulevaluehelp">';
667 print img_warning($langs->trans("FilterSearchImapHelp"), '', 'pictowarning classfortooltip');
668 print '</div>';
669 print '</div>';
670 print '</td>';
671 print '<td class="right"><input type="submit" name="addfilter" id="addfilter" class="flat button smallpaddingimp" value="'.$langs->trans("Add").'"></td>';
672 print '</tr>';
673 // List filters
674 foreach ($object->filters as $rulefilter) {
675 $rulefilterobj = new EmailCollectorFilter($db);
676 $rulefilterobj->fetch($rulefilter['id']);
677
678 print '<tr class="oddeven">';
679 print '<td title="'.dol_escape_htmltag($langs->trans("Filter").': '.$rulefilter['type']).'">';
680 print $langs->trans($arrayoftypes[$rulefilter['type']]['label']);
681 print '</td>';
682 print '<td>'.$rulefilter['rulevalue'].'</td>';
683 print '<td class="right">';
684 print ' <a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=deletefilter&token='.urlencode(newToken()).'&filterid='.$rulefilter['id'].'">'.img_delete().'</a>';
685 print '</td>';
686 print '</tr>';
687 }
688
689 print '</tr>';
690 print '</table>';
691 print '</div>';
692
693 print '<div class="clearboth"></div><br><br>';
694
695 // Operations
696 print '<div class="div-table-responsive-no-min">';
697 print '<table id="tablelines" class="noborder noshadow">';
698 print '<tr class="liste_titre nodrag nodrop">';
699 print '<td>'.img_picto('', 'technic', 'class="pictofixedwidth"').$form->textwithpicto($langs->trans("EmailcollectorOperations"), $langs->trans("EmailcollectorOperationsDesc")).'</td>';
700 print '<td>';
701 $htmltext = $langs->transnoentitiesnoconv("OperationParamDesc");
702 print $form->textwithpicto($langs->trans("Parameters"), $htmltext, 1, 'help', '', 0, 2, 'operationparamtt');
703 print '</td>';
704 print '<td></td>';
705 print '<td></td>';
706 print '</tr>';
707
708 $arrayoftypes = array(
709 'loadthirdparty' => $langs->trans('LoadThirdPartyFromName', $langs->transnoentities("ThirdPartyName").'/'.$langs->transnoentities("AliasNameShort").'/'.$langs->transnoentities("Email").'/'.$langs->transnoentities("ID")),
710 'loadandcreatethirdparty' => $langs->trans('LoadThirdPartyFromNameOrCreate', $langs->transnoentities("ThirdPartyName").'/'.$langs->transnoentities("AliasNameShort").'/'.$langs->transnoentities("Email").'/'.$langs->transnoentities("ID")),
711 'recordjoinpiece' => 'AttachJoinedDocumentsToObject',
712 'recordevent' => 'RecordEvent'
713 );
714 $arrayoftypesnocondition = $arrayoftypes;
715 if (isModEnabled('project')) {
716 $arrayoftypes['project'] = 'CreateLeadAndThirdParty';
717 }
718 $arrayoftypesnocondition['project'] = 'CreateLeadAndThirdParty';
719 if (isModEnabled('ticket')) {
720 $arrayoftypes['ticket'] = 'CreateTicketAndThirdParty';
721 }
722 $arrayoftypesnocondition['ticket'] = 'CreateTicketAndThirdParty';
723 if (isModEnabled('recruitment')) {
724 $arrayoftypes['candidature'] = 'CreateCandidature';
725 }
726 $arrayoftypesnocondition['candidature'] = 'CreateCandidature';
727
728 // support hook for add action
729 $parameters = array('arrayoftypes' => $arrayoftypes);
730 $res = $hookmanager->executeHooks('addMoreActionsEmailCollector', $parameters, $object, $action);
731
732 if ($res) {
733 $arrayoftypes = $hookmanager->resArray;
734 } else {
735 foreach ($hookmanager->resArray as $k => $desc) {
736 $arrayoftypes[$k] = $desc;
737 }
738 }
739
740 // Add operation
741 print '<tr class="oddeven nodrag nodrop">';
742 print '<td>';
743 print $form->selectarray('operationtype', $arrayoftypes, '', 1, 0, 0, '', 1, 0, 0, '', 'minwidth150 maxwidth300', 1);
744 print '</td><td>';
745 print '<textarea class="centpercent" name="operationparam" rows="3"></textarea>';
746 print '</td>';
747 print '<td>';
748 print '</td>';
749 print '<td class="right"><input type="submit" name="addoperation" id="addoperation" class="flat button smallpaddingimp" value="'.$langs->trans("Add").'"></td>';
750 print '</tr>';
751 // List operations
752 $nboflines = count($object->actions);
753 $table_element_line = 'emailcollector_emailcollectoraction';
754 $fk_element = 'position';
755 $i = 0;
756 foreach ($object->actions as $ruleaction) {
757 $ruleactionobj = new EmailCollectorAction($db);
758 $ruleactionobj->fetch($ruleaction['id']);
759
760 print '<tr class="drag drop oddeven" id="row-'.$ruleaction['id'].'">';
761 print '<td title="'.dol_escape_htmltag($langs->trans("Operation").': '.$ruleaction['type']).'">';
762 print '<!-- type of action: '.$ruleaction['type'].' -->';
763 if (array_key_exists($ruleaction['type'], $arrayoftypes)) {
764 print $langs->trans($arrayoftypes[$ruleaction['type']]);
765 } else {
766 if (array_key_exists($ruleaction['type'], $arrayoftypesnocondition)) {
767 print '<span class="opacitymedium">'.$langs->trans($arrayoftypesnocondition[$ruleaction['type']]).' - '.$langs->trans("Disabled").'</span>';
768 }
769 }
770
771 if (in_array($ruleaction['type'], array('recordevent'))) {
772 print $form->textwithpicto('', $langs->transnoentitiesnoconv('IfTrackingIDFoundEventWillBeLinked'));
773 } elseif (in_array($ruleaction['type'], array('loadthirdparty', 'loadandcreatethirdparty'))) {
774 print $form->textwithpicto('', $langs->transnoentitiesnoconv('EmailCollectorLoadThirdPartyHelp'));
775 }
776 print '</td>';
777 print '<td class="wordbreak minwidth300 small">';
778 if ($action == 'editoperation' && $ruleaction['id'] == $operationid) {
779 //print '<input type="text" class="quatrevingtquinzepercent" name="operationparam2" value="'.dol_escape_htmltag($ruleaction['actionparam']).'"><br>';
780 print '<textarea class="centpercent" name="operationparam2" rows="3">';
781 print dol_escape_htmltag($ruleaction['actionparam'], 0, 1);
782 print '</textarea>';
783 print '<input type="hidden" name="rowidoperation2" value="'.$ruleaction['id'].'">';
784 print '<input type="submit" class="button small button-save" name="saveoperation2" value="'.$langs->trans("Save").'">';
785 print '<input type="submit" class="button small button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
786 } else {
787 print dol_nl2br(dol_escape_htmltag($ruleaction['actionparam'], 0, 1));
788 }
789 print '</td>';
790 // Move up/down
791 print '<td class="center linecolmove tdlineupdown">';
792 if ($i > 0) {
793 print '<a class="lineupdown" href="'.$_SERVER['PHP_SELF'].'?action=up&amp;rowid='.$ruleaction['id'].'">'.img_up('default', 0, 'imgupforline').'</a>';
794 }
795 if ($i < count($object->actions) - 1) {
796 print '<a class="lineupdown" href="'.$_SERVER['PHP_SELF'].'?action=down&amp;rowid='.$ruleaction['id'].'">'.img_down('default', 0, 'imgdownforline').'</a>';
797 }
798 print '</td>';
799 // Delete
800 print '<td class="right nowraponall">';
801 print '<a class="editfielda marginrightonly" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=editoperation&token='.newToken().'&operationid='.$ruleaction['id'].'">'.img_edit().'</a>';
802 print ' <a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=deleteoperation&token='.newToken().'&operationid='.$ruleaction['id'].'">'.img_delete().'</a>';
803 print '</td>';
804 print '</tr>';
805 $i++;
806 }
807
808 print '</tr>';
809 print '</table>';
810 print '</div>';
811
812 if (!empty($conf->use_javascript_ajax)) {
813 $urltorefreshaftermove = DOL_URL_ROOT.'/admin/emailcollector_card.php?id='.$id;
814 include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
815 }
816
817 print '</form>';
818
819 print '</div>';
820 print '</div>'; // End <div class="fichecenter">
821
822
823 print '<div class="clearboth"></div><br>';
824
825 print dol_get_fiche_end();
826
827 // Buttons for actions
828 if ($action != 'presend' && $action != 'editline') {
829 print '<div class="tabsAction">'."\n";
830 $parameters = array();
831 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
832 if ($reshook < 0) {
833 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
834 }
835
836 if (empty($reshook)) {
837 // Edit
838 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>';
839
840 // Clone
841 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>';
842
843 // Collect now
844 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>';
845
846 if (count($object->actions) > 0) {
847 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>';
848 } else {
849 print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NoOperations")).'">'.$langs->trans("CollectNow").'</a></div>';
850 }
851
852 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>';
853 }
854 print '</div>'."\n";
855 }
856
857 if (!empty($debuginfo)) {
858 print info_admin($debuginfo);
859 }
860}
861
862// End of page
863llxFooter();
864$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:56
llxFooter()
Empty footer.
Definition wrapper.php:70
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 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...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.