dolibarr  19.0.0-dev
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
26 require '../main.inc.php';
27 require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
28 require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php';
29 require_once DOL_DOCUMENT_ROOT.'/core/class/events.class.php';
30 
31 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
32 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
33 include_once DOL_DOCUMENT_ROOT.'/emailcollector/class/emailcollector.class.php';
34 include_once DOL_DOCUMENT_ROOT.'/emailcollector/class/emailcollectorfilter.class.php';
35 include_once DOL_DOCUMENT_ROOT.'/emailcollector/class/emailcollectoraction.class.php';
36 include_once DOL_DOCUMENT_ROOT.'/emailcollector/lib/emailcollector.lib.php';
37 
38 use Webklex\PHPIMAP\ClientManager;
39 use Webklex\PHPIMAP\Exceptions\ConnectionFailedException;
40 use Webklex\PHPIMAP\Exceptions\InvalidWhereQueryCriteriaException;
41 
42 
43 use OAuth\Common\Storage\DoliStorage;
44 use OAuth\Common\Consumer\Credentials;
45 
46 if (!$user->admin) {
48 }
49 if (!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();
81 foreach ($object->fields as $key => $val) {
82  if (GETPOST('search_'.$key, 'alpha')) {
83  $search[$key] = GETPOST('search_'.$key, 'alpha');
84  }
85 }
86 
87 if (GETPOST('saveoperation2')) {
88  $action = 'updateoperation';
89 }
90 if (empty($action) && empty($id) && empty($ref)) {
91  $action = 'view';
92 }
93 
94 // Load object
95 include 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 
118 if ($reshook < 0) {
119  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
120 }
121 
122 if (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 
140 if (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 
156 if ($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 
169 if (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 
200 if ($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 }
223 if ($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 
236 if ($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 
251 if ($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 
277 llxHeader('', 'EmailCollector', $help_url);
278 
279 // Part to create
280 if ($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
310 if (($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
339 if ($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
863 llxFooter();
864 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
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.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
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.
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
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)
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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.
isModEnabled($module)
Is Dolibarr module enabled.
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...
$formconfirm
if ($action == 'delbookkeepingyear') {
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.