dolibarr 23.0.3
actioncomm.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2002-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2011 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2011-2017 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
7 * Copyright (C) 2018 Nicolas ZABOURI <info@inovea-conseil.com>
8 * Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
9 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
10 * Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 3 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 */
25
31require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/class/CSMSFile.class.php';
35require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncommreminder.class.php';
36
37
42{
46 public $element = 'action';
47
52 public $TRIGGER_PREFIX = 'ACTION';
53
57 public $table_element = 'actioncomm';
58
62 public $table_rowid = 'id';
63
67 public $picto = 'action';
68
74 public $restrictiononfksoc = 2;
75
79 public $id;
80
84 public $ref;
85
90 public $type_id;
91
96 public $type;
97
102 public $type_code;
103
107 public $type_label;
108
112 public $type_color;
113
117 public $type_picto;
118
123 public $code;
124
128 public $label;
129
133 public $datec;
134
138 public $duree;
139
143 public $datem;
144
150 public $author;
151
157 public $usermod;
158
162 public $authorid;
163
167 public $usermodid;
168
172 public $datep;
173
177 public $datef;
178
182 public $date_start_in_calendar;
183
187 public $date_end_in_calendar;
188
192 public $datep2;
193
198 public $durationp = -1;
199
203 public $fulldayevent = 0;
204
208 public $ponctuel;
209
213 public $percentage;
214
218 public $location;
219
223 public $transparency;
224
228 public $priority;
229
233 public $userassigned = array();
234
238 public $userownerid;
239
243 public $socpeopleassigned = array();
244
248 public $otherassigned = array();
249
253 public $reminders = array();
254
258 public $socid;
259
263 public $contact_id;
264
268 public $fk_task;
269
275 public $societe;
276
282 public $contact;
283
284 // Properties for links to other objects
289 public $fk_element; // Id of record
290
294 public $elementid;
295
299 public $elementtype;
300
304 public $fk_bookcal_calendar;
305
309 public $icalname;
310
314 public $icalcolor;
315
319 public $extraparams;
320
324 public $actions = array();
325
329 public $email_msgid;
330
334 public $email_from;
335
339 public $email_reply_to;
340
344 public $email_sender;
345
349 public $email_to;
350
354 public $email_tocc;
358 public $email_tobcc;
359
363 public $email_subject;
364
368 public $errors_to;
369
373 public $num_vote;
374
378 public $event_paid;
379
383 public $status;
384
388 public $ip;
389
390 /*
391 * Properties to manage the recurring events
392 */
394 public $recurid;
396 public $recurrule;
398 public $recurdateend;
399
401 public $calling_duration;
402
403
407 const EVENT_TODO = 0;
408
413
417 const EVENT_FINISHED = 100;
418
419
420 // BEGIN MODULEBUILDER PROPERTIES
425 public $fields = array(
426 "id" => array("type" => "integer", "label" => "Ref", "enabled" => "1", 'position' => 10, 'notnull' => 1, "visible" => "1",),
427 "ref" => array("type" => "varchar(30)", "label" => "Ref", "enabled" => "1", 'position' => 15, 'notnull' => 1, "visible" => "0", "csslist" => "tdoverflowmax150", "showoncombobox" => "1",),
428 "ref_ext" => array("type" => "varchar(255)", "label" => "Refext", "enabled" => "1", 'position' => 20, 'notnull' => 0, "visible" => "0",),
429 "datep" => array("type" => "datetime", "label" => "DateStart", "enabled" => "1", 'position' => 25, 'notnull' => 0, "visible" => "1",),
430 "datep2" => array("type" => "datetime", "label" => "DateEnd", "enabled" => "1", 'position' => 26, 'notnull' => 0, "visible" => "-1",),
431 "fk_action" => array("type" => "integer", "label" => "Fkaction", "enabled" => "1", 'position' => 40, 'notnull' => 0, "visible" => "0", "css" => "maxwidth500 widthcentpercentminusxx",),
432 "code" => array("type" => "varchar(50)", "label" => "Code", "enabled" => "1", 'position' => 45, 'notnull' => 0, "visible" => "0", "showoncombobox" => "1",),
433 "label" => array("type" => "varchar(255)", "label" => "Title", "enabled" => "1", 'position' => 50, 'notnull' => 1, "visible" => "1", "alwayseditable" => "1", "css" => "minwidth300", "cssview" => "wordbreak", "csslist" => "tdoverflowmax150",),
434 "note" => array("type" => "mediumtext", "label" => "Description", "enabled" => "1", 'position' => 51, 'notnull' => 0, "visible" => "-1",),
435 "fk_project" => array("type" => "integer", "label" => "Project", "picto" => "project", "enabled" => "1", 'position' => 75, 'notnull' => 0, "visible" => "0", "css" => "maxwidth500 widthcentpercentminusxx",),
436 "fk_soc" => array("type" => "integer", "label" => "ThirdParty", "picto" => "company", "enabled" => "1", 'position' => 80, 'notnull' => 0, "visible" => "0", "css" => "maxwidth500 widthcentpercentminusxx",),
437 "fk_contact" => array("type" => "integer", "label" => "Contact", "picto" => "contact", "enabled" => "1", 'position' => 85, 'notnull' => 0, "visible" => "-1", "css" => "maxwidth500 widthcentpercentminusxx",),
438 "fk_parent" => array("type" => "integer", "label" => "Parent", "enabled" => "1", 'position' => 90, 'notnull' => 1, "visible" => "0", "css" => "maxwidth500 widthcentpercentminusxx",),
439 "fk_user_action" => array("type" => "integer", "label" => "Fkuseraction", "picto" => "user", "enabled" => "1", 'position' => 95, 'notnull' => 0, "visible" => "0", "css" => "maxwidth500 widthcentpercentminusxx",),
440 "transparency" => array("type" => "integer", "label" => "Transparency", "enabled" => "1", 'position' => 100, 'notnull' => 0, "visible" => "0",),
441 "fk_user_done" => array("type" => "integer", "label" => "Fkuserdone", "picto" => "user", "enabled" => "1", 'position' => 105, 'notnull' => 0, "visible" => "0", "css" => "maxwidth500 widthcentpercentminusxx",),
442 "priority" => array("type" => "smallint(6)", "label" => "Priority", "enabled" => "1", 'position' => 110, 'notnull' => 0, "visible" => "0",),
443 "fulldayevent" => array("type" => "smallint(6)", "label" => "Fulldayevent", "enabled" => "1", 'position' => 115, 'notnull' => 1, "visible" => "0",),
444 "location" => array("type" => "varchar(128)", "label" => "Location", "enabled" => "1", 'position' => 125, 'notnull' => 0, "visible" => "0",),
445 "durationp" => array("type" => "double", "label" => "Durationp", "enabled" => "1", 'position' => 130, 'notnull' => 0, "visible" => "0",),
446 "durationa" => array("type" => "double", "label" => "Durationa", "enabled" => "1", 'position' => 135, 'notnull' => 0, "visible" => "0",),
447 "fk_element" => array("type" => "integer", "label" => "LinkedObject", "enabled" => "getDolGlobalString('AGENDA_SHOW_LINKED_OBJECT')", 'position' => 145, 'notnull' => 0, "visible" => "0", "css" => "maxwidth500 widthcentpercentminusxx",),
448 "elementtype" => array("type" => "varchar(255)", "label" => "Elementtype", "enabled" => "1", 'position' => 150, 'notnull' => 0, "visible" => "0",),
449 "email_msgid" => array("type" => "varchar(256)", "label" => "Emailmsgid", "enabled" => "1", 'position' => 155, 'notnull' => 0, "visible" => "0",),
450 "email_subject" => array("type" => "varchar(256)", "label" => "Emailsubject", "enabled" => "1", 'position' => 160, 'notnull' => 0, "visible" => "0",),
451 "email_from" => array("type" => "varchar(256)", "label" => "Emailfrom", "enabled" => "1", 'position' => 165, 'notnull' => 0, "visible" => "0",),
452 "email_sender" => array("type" => "varchar(256)", "label" => "Emailsender", "enabled" => "1", 'position' => 170, 'notnull' => 0, "visible" => "0",),
453 "email_to" => array("type" => "varchar(256)", "label" => "Emailto", "enabled" => "1", 'position' => 175, 'notnull' => 0, "visible" => "0",),
454 "email_tocc" => array("type" => "varchar(256)", "label" => "Emailtocc", "enabled" => "1", 'position' => 180, 'notnull' => 0, "visible" => "0",),
455 "email_tobcc" => array("type" => "varchar(256)", "label" => "Emailtobcc", "enabled" => "1", 'position' => 185, 'notnull' => 0, "visible" => "0",),
456 "errors_to" => array("type" => "varchar(256)", "label" => "Errorsto", "enabled" => "1", 'position' => 190, 'notnull' => 0, "visible" => "0",),
457 "recurid" => array("type" => "varchar(128)", "label" => "Recurid", "enabled" => "1", 'position' => 195, 'notnull' => 0, "visible" => "0",),
458 "recurrule" => array("type" => "varchar(128)", "label" => "Recurrule", "enabled" => "1", 'position' => 200, 'notnull' => 0, "visible" => "0",),
459 "recurdateend" => array("type" => "datetime", "label" => "Recurdateend", "enabled" => "1", 'position' => 205, 'notnull' => 0, "visible" => "0",),
460 "import_key" => array("type" => "varchar(14)", "label" => "ImportId", "enabled" => "1", 'position' => 900, 'notnull' => 0, "visible" => "-1",),
461 "extraparams" => array("type" => "varchar(255)", "label" => "Extraparams", "enabled" => "1", 'position' => 215, 'notnull' => 0, "visible" => "0",),
462 "calling_duration" => array("type" => "integer", "label" => "Callingduration", "enabled" => "1", 'position' => 220, 'notnull' => 0, "visible" => "0",),
463 "visibility" => array("type" => "varchar(12)", "label" => "Visibility", "enabled" => "1", 'position' => 225, 'notnull' => 0, "visible" => "0",),
464 "reply_to" => array("type" => "varchar(255)", "label" => "Replyto", "enabled" => "1", 'position' => 230, 'notnull' => 0, "visible" => "0",),
465 "num_vote" => array("type" => "integer", "label" => "Numvote", "enabled" => "1", 'position' => 235, 'notnull' => 0, "visible" => "0",),
466 "event_paid" => array("type" => "smallint(6)", "label" => "Eventpaid", "enabled" => "1", 'position' => 240, 'notnull' => 1, "visible" => "0",),
467 "status" => array("type" => "smallint(6)", "label" => "Status", "enabled" => "1", 'position' => 500, 'notnull' => 1, "visible" => "0",),
468 "ip" => array("type" => "varchar(250)", "label" => "Ip", "enabled" => "1", 'position' => 250, 'notnull' => 0, "visible" => "0",),
469 "fk_bookcal_calendar" => array("type" => "integer", "label" => "Fkbookcalcalendar", "enabled" => "1", 'position' => 255, 'notnull' => 0, "visible" => "0", "css" => "maxwidth500 widthcentpercentminusxx",),
470 "fk_task" => array("type" => "integer", "label" => "Task", "picto" => "task", "enabled" => "1", 'position' => 260, 'notnull' => 0, "visible" => "0", "css" => "maxwidth500 widthcentpercentminusxx",),
471 "fk_user_author" => array("type" => "integer", "label" => "UserCreation", "picto" => "user", "enabled" => "1", 'position' => 505, 'notnull' => 0, "visible" => "0", "css" => "maxwidth500 widthcentpercentminusxx",),
472 "fk_user_mod" => array("type" => "integer", "label" => "UserModification", "picto" => "user", "enabled" => "1", 'position' => 506, 'notnull' => 0, "visible" => "0", "css" => "maxwidth500 widthcentpercentminusxx",),
473 "datec" => array("type" => "datetime", "label" => "DateCreation", "enabled" => "1", 'position' => 510, 'notnull' => 0, "visible" => "-1",),
474 "tms" => array("type" => "timestamp", "label" => "DateModification", "enabled" => "1", 'position' => 520, 'notnull' => 1, "visible" => "-1",),
475 "percent" => array("type" => "smallint(6)", "label" => "Status", "enabled" => "1", 'position' => 1000, 'notnull' => 1, "visible" => "1",), // status
476 );
477 // END MODULEBUILDER PROPERTIES
478
479
485 public function __construct(DoliDB $db)
486 {
487 $this->db = $db;
488
489 $this->ismultientitymanaged = 1;
490 }
491
500 public function create(User $user, $notrigger = 0)
501 {
502 global $langs, $conf;
503
504 $error = 0;
505 $now = dol_now();
506
507 // Check parameters
508 if (!isset($this->userownerid) || (string) $this->userownerid === '') { // $this->userownerid may be 0 (anonymous event) or > 0
509 dol_syslog("You tried to create an event but mandatory property userownerid was empty (you can define it to 0 for anonymous event)", LOG_WARNING);
510 $this->errors[] = 'ErrorActionCommPropertyUserowneridNotDefined';
511 return -1;
512 }
513
514 // Clean parameters
515 $this->label = dol_trunc(trim($this->label), 128);
516 $this->location = (!empty($this->location) ? dol_trunc(trim($this->location), 128) : "");
517 $this->note_private = dol_htmlcleanlastbr(trim(empty($this->note_private) ? $this->note : $this->note_private));
518 if (empty($this->percentage)) {
519 $this->percentage = 0;
520 }
521 if (empty($this->priority) || !is_numeric($this->priority)) {
522 $this->priority = 0;
523 }
524 if (empty($this->fulldayevent)) {
525 $this->fulldayevent = 0;
526 }
527 if (empty($this->transparency)) {
528 $this->transparency = 0;
529 }
530 if ($this->percentage > 100) {
531 $this->percentage = 100;
532 }
533 if (empty($this->datep) && $this->datep != '0') { // We should not insert event in calendar without a start date
534 $this->datep = $now;
535 }
536 if (!empty($this->datep) && !empty($this->datef)) {
537 $this->durationp = ($this->datef - $this->datep); // deprecated
538 }
539 if (!empty($this->datep) && !empty($this->datef) && $this->datep > $this->datef) {
540 $this->datef = $this->datep;
541 }
542 if (!isset($this->fk_project) || $this->fk_project < 0) {
543 $this->fk_project = 0;
544 }
545 if (!isset($this->fk_task) || $this->fk_task < 0) {
546 $this->fk_task = 0;
547 }
548 // For backward compatibility
549 if ($this->elementtype == 'facture') {
550 $this->elementtype = 'invoice';
551 }
552 if ($this->elementtype == 'commande') {
553 $this->elementtype = 'order';
554 }
555 if ($this->elementtype == 'contrat') {
556 $this->elementtype = 'contract';
557 }
558 if (empty($this->fk_element) && !empty($this->elementid)) {
559 $this->fk_element = $this->elementid;
560 }
561 if (empty($this->elementid) && !empty($this->fk_element)) {
562 $this->elementid = $this->fk_element;
563 }
564
565 if (!is_array($this->userassigned) && !empty($this->userassigned)) { // For backward compatibility when userassigned was an int instead of an array
566 $tmpid = (int) $this->userassigned;
567 $this->userassigned = array();
568 $this->userassigned[$tmpid] = array('id' => $tmpid, 'transparency' => $this->transparency);
569 }
570
571 $userownerid = $this->userownerid;
572
573 // Be sure assigned user is defined as an array of array('id'=>,'mandatory'=>,...).
574 if (empty($this->userassigned) || count($this->userassigned) == 0 || !is_array($this->userassigned)) {
575 $this->userassigned = array($userownerid => array('id' => $userownerid, 'transparency' => $this->transparency));
576 }
577
578 if (!$this->type_id || !$this->type_code) {
579 $key = empty($this->type_id) ? $this->type_code : $this->type_id;
580
581 // Get id from code
582 $cactioncomm = new CActionComm($this->db);
583 $result = $cactioncomm->fetch($key);
584
585 if ($result > 0) {
586 $this->type_id = $cactioncomm->id;
587 $this->type_code = $cactioncomm->code;
588 } elseif ($result == 0) {
589 $this->error = $langs->trans('ErrorActionCommBadType', $this->type_id, $this->type_code);
590 return -1;
591 } else {
592 $this->error = $cactioncomm->error;
593 return -1;
594 }
595 }
596 $code = empty($this->code) ? $this->type_code : $this->code;
597
598 // Check parameters
599 if (!$this->type_id) {
600 $this->error = "ErrorWrongParameters";
601 return -1;
602 }
603
604 $extraparams = (!empty($this->extraparams) ? json_encode($this->extraparams) : null);
605 $extraparams = dol_trunc($extraparams, 250);
606
607 $this->db->begin();
608
609 $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm";
610 $sql .= "(ref,";
611 $sql .= "datec,";
612 $sql .= "datep,";
613 $sql .= "datep2,";
614 $sql .= "durationp,"; // deprecated
615 $sql .= "fk_action,";
616 $sql .= "code,";
617 $sql .= "ref_ext,";
618 $sql .= "fk_soc,";
619 $sql .= "fk_project,";
620 $sql .= "note,";
621 $sql .= "fk_contact,";
622 $sql .= "fk_user_author,";
623 $sql .= "fk_user_action,";
624 $sql .= "fk_task,";
625 $sql .= "label,percent,priority,fulldayevent,location,";
626 $sql .= "transparency,";
627 $sql .= "fk_element,";
628 $sql .= "elementtype,";
629 $sql .= "fk_bookcal_calendar,";
630 $sql .= "entity,";
631 $sql .= "extraparams,";
632 // Fields emails
633 $sql .= "email_msgid,";
634 $sql .= "email_from,";
635 $sql .= "email_sender,";
636 $sql .= "email_to,";
637 $sql .= "email_tocc,";
638 $sql .= "email_tobcc,";
639 $sql .= "email_subject,";
640 $sql .= "errors_to,";
641 $sql .= "recurid,";
642 $sql .= "recurrule,";
643 $sql .= "recurdateend,";
644 $sql .= "num_vote,";
645 $sql .= "event_paid,";
646 $sql .= "status,";
647 $sql .= "ip";
648 $sql .= ") VALUES (";
649 $sql .= "'(PROV)', ";
650 $sql .= "'".$this->db->idate($now)."', "; // date creation
651 $sql .= "'".$this->db->idate($this->datep)."', "; // date start event
652 $sql .= (strval($this->datef) != '' ? "'".$this->db->idate($this->datef)."'" : "null").", ";
653 $sql .= ((isset($this->durationp) && $this->durationp >= 0 && $this->durationp != '') ? "'".$this->db->escape((string) $this->durationp)."'" : "null").", "; // deprecated
654 $sql .= (isset($this->type_id) ? $this->type_id : "null").",";
655 $sql .= ($code ? ("'".$this->db->escape($code)."'") : "null").", ";
656 $sql .= (!empty($this->ref_ext) ? "'".$this->db->escape($this->ref_ext)."'" : "null").", ";
657 $sql .= ((isset($this->socid) && $this->socid > 0) ? ((int) $this->socid) : "null").", ";
658 $sql .= ((isset($this->fk_project) && $this->fk_project > 0) ? ((int) $this->fk_project) : "null").", ";
659 $sql .= " '".$this->db->escape($this->note_private)."', ";
660 $sql .= ((isset($this->contact_id) && $this->contact_id > 0) ? ((int) $this->contact_id) : "null").", "; // deprecated, use ->socpeopleassigned
661 $sql .= (isset($user->id) && $user->id > 0 ? $user->id : "null").", ";
662 $sql .= ($userownerid > 0 ? $userownerid : "null").", ";
663 $sql .= (!empty($this->fk_task) ? ((int) $this->fk_task) : "null").", ";
664 $sql .= "'".$this->db->escape($this->label)."', ";
665 $sql .= "'".$this->db->escape((string) $this->percentage)."', ";
666 $sql .= "'".$this->db->escape((string) $this->priority)."', ";
667 $sql .= "'".$this->db->escape((string) $this->fulldayevent)."', ";
668 $sql .= "'".$this->db->escape($this->location)."', ";
669 $sql .= "'".$this->db->escape((string) $this->transparency)."', ";
670 $sql .= (!empty($this->elementid) ? ((int) $this->elementid) : "null").", ";
671 $sql .= (!empty($this->elementtype) ? "'".$this->db->escape($this->elementtype)."'" : "null").", ";
672 $sql .= (!empty($this->fk_bookcal_calendar) ? "'".$this->db->escape((string) $this->fk_bookcal_calendar)."'" : "null").", ";
673 $sql .= ((int) $conf->entity).",";
674 $sql .= (!empty($extraparams) ? "'".$this->db->escape($extraparams)."'" : "null").", ";
675 // Fields emails
676 $sql .= (!empty($this->email_msgid) ? "'".$this->db->escape($this->email_msgid)."'" : "null").", ";
677 $sql .= (!empty($this->email_from) ? "'".$this->db->escape($this->email_from)."'" : "null").", ";
678 $sql .= (!empty($this->email_sender) ? "'".$this->db->escape($this->email_sender)."'" : "null").", ";
679 $sql .= (!empty($this->email_to) ? "'".$this->db->escape($this->email_to)."'" : "null").", ";
680 $sql .= (!empty($this->email_tocc) ? "'".$this->db->escape($this->email_tocc)."'" : "null").", ";
681 $sql .= (!empty($this->email_tobcc) ? "'".$this->db->escape($this->email_tobcc)."'" : "null").", ";
682 $sql .= (!empty($this->email_subject) ? "'".$this->db->escape($this->email_subject)."'" : "null").", ";
683 $sql .= (!empty($this->errors_to) ? "'".$this->db->escape($this->errors_to)."'" : "null").", ";
684 $sql .= (!empty($this->recurid) ? "'".$this->db->escape($this->recurid)."'" : "null").", ";
685 $sql .= (!empty($this->recurrule) ? "'".$this->db->escape($this->recurrule)."'" : "null").", ";
686 $sql .= (!empty($this->recurdateend) ? "'".$this->db->idate($this->recurdateend)."'" : "null").", ";
687 $sql .= (!empty($this->num_vote) ? (int) $this->num_vote : "null").", ";
688 $sql .= (!empty($this->event_paid) ? (int) $this->event_paid : 0).", ";
689 $sql .= (!empty($this->status) ? (int) $this->status : "0").", ";
690 $sql .= (!empty($this->ip) ? "'".$this->db->escape($this->ip)."'" : "null");
691 $sql .= ")";
692
693 dol_syslog(get_class($this)."::add", LOG_DEBUG);
694 $resql = $this->db->query($sql);
695 if ($resql) {
696 $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."actioncomm", "id");
697 $this->ref = (string) $this->id;
698 $sql = "UPDATE ".MAIN_DB_PREFIX."actioncomm SET ref='".$this->db->escape($this->ref)."' WHERE id=".$this->id;
699 $resql = $this->db->query($sql);
700 if (!$resql) {
701 $error++;
702 dol_syslog('Error to process ref: '.$this->db->lasterror(), LOG_ERR);
703 $this->errors[] = $this->db->lasterror();
704 }
705 // Now insert assigned users
706 if (!$error) {
707 //dol_syslog(var_export($this->userassigned, true));
708 $already_inserted = array();
709 foreach ($this->userassigned as $key => $val) {
710 // Common value with new behavior is to have $val = array('id'=>iduser, 'transparency'=>0|1) and $this->userassigned is an array of iduser => $val.
711 if (!is_array($val)) { // For backward compatibility when $val='id'.
712 $val = array('id' => $val);
713 }
714
715 if ($val['id'] > 0) {
716 if (!empty($already_inserted[$val['id']])) {
717 continue;
718 }
719
720 $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element, mandatory, transparency, answer_status)";
721 $sql .= " VALUES(".((int) $this->id).", 'user', ".((int) $val['id']).", ".(empty($val['mandatory']) ? '0' : ((int) $val['mandatory'])).", ".(empty($val['transparency']) ? '0' : ((int) $val['transparency'])).", ".(empty($val['answer_status']) ? '0' : ((int) $val['answer_status'])).")";
722
723 $resql = $this->db->query($sql);
724 if (!$resql) {
725 $error++;
726 dol_syslog('Error to process userassigned: ' . $this->db->lasterror(), LOG_ERR);
727 $this->errors[] = $this->db->lasterror();
728 } else {
729 $already_inserted[$val['id']] = true;
730 }
731 //var_dump($sql);exit;
732 }
733 }
734 }
735
736 if (!$error) {
737 if (!empty($this->socpeopleassigned)) {
738 $already_inserted = array();
739 foreach ($this->socpeopleassigned as $id => $val) {
740 // Common value with new behavior is to have $this->socpeopleassigned an array of idcontact => dummyvalue
741 if (!empty($already_inserted[$id])) {
742 continue;
743 }
744
745 $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element, mandatory, transparency, answer_status)";
746 $sql .= " VALUES(".((int) $this->id).", 'socpeople', ".((int) $id).", 0, 0, 0)";
747
748 $resql = $this->db->query($sql);
749 if (!$resql) {
750 $error++;
751 dol_syslog('Error to process socpeopleassigned: ' . $this->db->lasterror(), LOG_ERR);
752 $this->errors[] = $this->db->lasterror();
753 } else {
754 $already_inserted[$id] = true;
755 }
756 }
757 }
758 }
759
760 if (!$error) {
761 // Actions on extra fields
762 $result = $this->insertExtraFields();
763 if ($result < 0) {
764 $error++;
765 }
766 }
767
768 if (!$error && !$notrigger) {
769 // Call trigger
770 $result = $this->call_trigger('ACTION_CREATE', $user);
771 if ($result < 0) {
772 $error++;
773 }
774 // End call triggers
775 }
776
777 if (!$error) {
778 $this->db->commit();
779 return $this->id;
780 } else {
781 $this->db->rollback();
782 return -1;
783 }
784 } else {
785 $this->db->rollback();
786 $this->error = $this->db->lasterror();
787 return -1;
788 }
789 }
790
798 public function createFromClone(User $fuser, $socid)
799 {
800 global $hookmanager;
801
802 $error = 0;
803
804 $this->db->begin();
805
806 // Load source object
807 $objFrom = clone $this;
808
809 // Retrieve all extrafield
810 // fetch optionals attributes and labels
811 $this->fetch_optionals();
812
813 //$this->fetch_userassigned();
814 $this->fetchResources();
815
816 $this->id = 0;
817 $this->recurid = '';
818 $this->recurrule = '';
819 $this->recurdateend = '';
820
821 // Create clone
822 $this->context['createfromclone'] = 'createfromclone';
823 $result = $this->create($fuser);
824 if ($result < 0) {
825 $error++;
826 } else {
827 $resultcat = $this->cloneCategories($objFrom->id, $this->id);
828 if ($resultcat < 0) {
829 $error++;
830 }
831 }
832
833 if (!$error) {
834 // Hook of thirdparty module
835 if (is_object($hookmanager)) {
836 $parameters = array('objFrom' => $objFrom);
837 $action = '';
838 $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
839 if ($reshook < 0) {
840 $this->setErrorsFromObject($hookmanager);
841 $error++;
842 }
843 }
844
845 // Call trigger
846 $result = $this->call_trigger('ACTION_CLONE', $fuser);
847 if ($result < 0) {
848 $error++;
849 }
850 // End call triggers
851 }
852
853 unset($this->context['createfromclone']);
854
855 // End
856 if (!$error) {
857 $this->db->commit();
858 return $this->id;
859 } else {
860 $this->db->rollback();
861 return -1;
862 }
863 }
864
875 public function fetch($id, $ref = '', $ref_ext = '', $email_msgid = '', $loadresources = 1)
876 {
877 if (empty($id) && empty($ref) && empty($ref_ext) && empty($email_msgid)) {
878 dol_syslog(get_class($this)."::fetch Bad parameters", LOG_WARNING);
879 return -1;
880 }
881
882 $sql = "SELECT a.id,";
883 $sql .= " a.ref as ref,";
884 $sql .= " a.entity,";
885 $sql .= " a.ref_ext,";
886 $sql .= " a.datep,";
887 $sql .= " a.datep2,";
888 $sql .= " a.durationp,"; // deprecated
889 $sql .= " a.datec,";
890 $sql .= " a.tms as datem,";
891 $sql .= " a.code, a.label, a.note as note_private,";
892 $sql .= " a.fk_soc,";
893 $sql .= " a.fk_project,";
894 $sql .= " a.fk_user_author, a.fk_user_mod,";
895 $sql .= " a.fk_user_action,";
896 $sql .= " a.fk_task,";
897 $sql .= " a.fk_contact, a.percent as percentage,";
898 $sql .= " a.fk_element as elementid, a.elementtype,";
899 $sql .= " a.priority, a.fulldayevent, a.location, a.transparency,";
900 $sql .= " a.email_msgid, a.email_subject, a.email_from, a.email_sender, a.email_to, a.email_tocc, a.email_tobcc, a.errors_to,";
901 $sql .= " a.recurid, a.recurrule, a.recurdateend,";
902 $sql .= " c.id as type_id, c.type as type_type, c.code as type_code, c.libelle as type_label, c.color as type_color, c.picto as type_picto,";
903 $sql .= " s.nom as socname,";
904 $sql .= " u.firstname, u.lastname as lastname,";
905 $sql .= " num_vote, event_paid, a.status";
906 $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a ";
907 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_actioncomm as c ON a.fk_action=c.id ";
908 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_author";
909 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on s.rowid = a.fk_soc";
910 $sql .= " WHERE ";
911 if ($ref) {
912 $sql .= " a.ref = '".$this->db->escape($ref)."'";
913 } elseif ($ref_ext) {
914 $sql .= " a.ref_ext = '".$this->db->escape($ref_ext)."'";
915 } elseif ($email_msgid) {
916 $sql .= " a.email_msgid = '".$this->db->escape($email_msgid)."'";
917 } else {
918 $sql .= " a.id = ".((int) $id);
919 }
920
921 dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
922 $resql = $this->db->query($sql);
923 if ($resql) {
924 $num = $this->db->num_rows($resql);
925 if ($num) {
926 $obj = $this->db->fetch_object($resql);
927
928 $this->id = $obj->id;
929 $this->entity = $obj->entity;
930 $this->ref = $obj->ref;
931 $this->ref_ext = $obj->ref_ext;
932
933 // Properties of parent table llx_c_actioncomm
934 $this->type_id = $obj->type_id;
935 $this->type_code = $obj->type_code;
936 $this->type_color = $obj->type_color;
937 $this->type_picto = $obj->type_picto;
938 $this->type = $obj->type_type;
939 $this->type_label = $obj->type_label;
940
941 $this->code = $obj->code;
942 $this->label = $obj->label;
943 $this->datep = $this->db->jdate($obj->datep);
944 $this->datef = $this->db->jdate($obj->datep2);
945
946 $this->datec = $this->db->jdate($obj->datec);
947 $this->datem = $this->db->jdate($obj->datem);
948
949 $this->note = $obj->note_private; // deprecated
950 $this->note_private = $obj->note_private;
951 $this->percentage = $obj->percentage;
952
953 $this->authorid = $obj->fk_user_author;
954 $this->usermodid = $obj->fk_user_mod;
955
956 if (!is_object($this->author)) {
957 $this->author = new User($this->db); // To avoid warning
958 }
959 $this->author->id = $obj->fk_user_author; // deprecated
960 $this->author->firstname = $obj->firstname; // deprecated
961 $this->author->lastname = $obj->lastname; // deprecated
962 if (!is_object($this->usermod)) {
963 $this->usermod = new User($this->db); // To avoid warning
964 }
965 $this->usermod->id = $obj->fk_user_mod; // deprecated
966
967 $this->userownerid = $obj->fk_user_action;
968 $this->fk_task = $obj->fk_task;
969 $this->priority = $obj->priority;
970 $this->fulldayevent = $obj->fulldayevent;
971 $this->location = $obj->location;
972 $this->transparency = $obj->transparency;
973
974 $this->socid = $obj->fk_soc; // To have fetch_thirdparty method working
975 $this->contact_id = $obj->fk_contact; // To have fetch_contact method working
976 $this->fk_project = $obj->fk_project; // To have fetch_projet method working
977
978 //$this->societe->id = $obj->fk_soc; // deprecated
979 //$this->contact->id = $obj->fk_contact; // deprecated
980
981 $this->fk_element = $obj->elementid;
982 $this->elementid = $obj->elementid;
983 $this->elementtype = $obj->elementtype;
984
985 $this->recurid = $obj->recurid;
986 $this->recurrule = $obj->recurrule;
987 $this->recurdateend = $this->db->jdate($obj->recurdateend);
988
989 $this->num_vote = $obj->num_vote;
990 $this->event_paid = $obj->event_paid;
991 $this->status = $obj->status;
992
993 //email information
994 $this->email_msgid = $obj->email_msgid;
995 $this->email_from = $obj->email_from;
996 $this->email_sender = $obj->email_sender;
997 $this->email_to = $obj->email_to;
998 $this->email_tocc = $obj->email_tocc;
999 $this->email_tobcc = $obj->email_tobcc;
1000 $this->email_subject = $obj->email_subject;
1001 $this->errors_to = $obj->errors_to;
1002
1003 $this->fetch_optionals();
1004
1005 if ($loadresources) {
1006 $this->fetchResources();
1007 }
1008 }
1009
1010 $this->db->free($resql);
1011 } else {
1012 $this->error = $this->db->lasterror();
1013 return -1;
1014 }
1015
1016 return $num;
1017 }
1018
1024 public function fetchResources()
1025 {
1026 $this->userassigned = array();
1027 $this->socpeopleassigned = array();
1028
1029 $sql = 'SELECT fk_actioncomm, element_type, fk_element, answer_status, mandatory, transparency';
1030 $sql .= ' FROM '.MAIN_DB_PREFIX.'actioncomm_resources';
1031 $sql .= ' WHERE fk_actioncomm = '.((int) $this->id);
1032 $sql .= " AND element_type IN ('user', 'socpeople')";
1033 $resql = $this->db->query($sql);
1034 if ($resql) {
1035 // If owner is known, we must but id first into list
1036 if ($this->userownerid > 0) {
1037 $this->userassigned[$this->userownerid] = array('id' => $this->userownerid); // Set first so will be first into list.
1038 }
1039
1040 while ($obj = $this->db->fetch_object($resql)) {
1041 if ($obj->fk_element > 0) {
1042 switch ($obj->element_type) {
1043 case 'user':
1044 $this->userassigned[$obj->fk_element] = array('id' => $obj->fk_element, 'mandatory' => $obj->mandatory, 'answer_status' => $obj->answer_status, 'transparency' => $obj->transparency);
1045 if (empty($this->userownerid)) {
1046 $this->userownerid = $obj->fk_element; // If not defined (should not happened, we fix this)
1047 }
1048 break;
1049 case 'socpeople':
1050 $this->socpeopleassigned[$obj->fk_element] = array('id' => $obj->fk_element, 'mandatory' => $obj->mandatory, 'answer_status' => $obj->answer_status, 'transparency' => $obj->transparency);
1051 break;
1052 }
1053 }
1054 }
1055
1056 return 1;
1057 } else {
1058 dol_print_error($this->db);
1059 return -1;
1060 }
1061 }
1062
1063 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1070 public function fetch_userassigned($override = true)
1071 {
1072 // phpcs:enable
1073 $sql = "SELECT fk_actioncomm, element_type, fk_element, answer_status, mandatory, transparency";
1074 $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm_resources";
1075 $sql .= " WHERE element_type = 'user' AND fk_actioncomm = ".((int) $this->id);
1076
1077 $resql2 = $this->db->query($sql);
1078 if ($resql2) {
1079 $this->userassigned = array();
1080
1081 // If owner is known, we must but id first into list
1082 if ($this->userownerid > 0) {
1083 // Set first so will be first into list.
1084 $this->userassigned[$this->userownerid] = array('id' => $this->userownerid);
1085 }
1086
1087 while ($obj = $this->db->fetch_object($resql2)) {
1088 if ($obj->fk_element > 0) {
1089 $this->userassigned[$obj->fk_element] = array('id' => $obj->fk_element,
1090 'mandatory' => $obj->mandatory,
1091 'answer_status' => $obj->answer_status,
1092 'transparency' => $obj->transparency);
1093 }
1094
1095 if ($override === true) {
1096 // If not defined (should not happened, we fix this)
1097 if (empty($this->userownerid)) {
1098 $this->userownerid = $obj->fk_element;
1099 }
1100 }
1101 }
1102
1103 return 1;
1104 } else {
1105 dol_print_error($this->db);
1106 return -1;
1107 }
1108 }
1109
1117 public function delete($user, $notrigger = 0)
1118 {
1119 $error = 0;
1120
1121 dol_syslog(get_class($this)."::delete", LOG_DEBUG);
1122
1123 $this->db->begin();
1124
1125 // remove categorie association
1126 if (!$error) {
1127 $sql = "DELETE FROM ".MAIN_DB_PREFIX."categorie_actioncomm";
1128 $sql .= " WHERE fk_actioncomm=".((int) $this->id);
1129
1130 $res = $this->db->query($sql);
1131 if (!$res) {
1132 $this->error = $this->db->lasterror();
1133 $error++;
1134 }
1135 }
1136
1137 // remove actioncomm_resources
1138 if (!$error) {
1139 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm_resources";
1140 $sql .= " WHERE fk_actioncomm=".((int) $this->id);
1141
1142 $res = $this->db->query($sql);
1143 if (!$res) {
1144 $this->error = $this->db->lasterror();
1145 $error++;
1146 }
1147 }
1148
1149 if (!$error) {
1150 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm_reminder";
1151 $sql .= " WHERE fk_actioncomm = ".((int) $this->id);
1152
1153 $res = $this->db->query($sql);
1154 if (!$res) {
1155 $this->error = $this->db->lasterror();
1156 $error++;
1157 }
1158 }
1159
1160 // Removed extrafields
1161 if (!$error) {
1162 $result = $this->deleteExtraFields();
1163 if ($result < 0) {
1164 $error++;
1165 dol_syslog(get_class($this)."::delete error -3 ".$this->error, LOG_ERR);
1166 }
1167 }
1168
1169 // remove actioncomm
1170 if (!$error) {
1171 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm";
1172 $sql .= " WHERE id=".((int) $this->id);
1173
1174 $res = $this->db->query($sql);
1175 if (!$res) {
1176 $this->error = $this->db->lasterror();
1177 $error++;
1178 }
1179 }
1180
1181 if (!$error) {
1182 if (!$notrigger) {
1183 // Call trigger
1184 $result = $this->call_trigger('ACTION_DELETE', $user);
1185 if ($result < 0) {
1186 $error++;
1187 }
1188 // End call triggers
1189 }
1190
1191 if (!$error) {
1192 $this->db->commit();
1193 return 1;
1194 } else {
1195 $this->db->rollback();
1196 return -2;
1197 }
1198 } else {
1199 $this->db->rollback();
1200 $this->error = $this->db->lasterror();
1201 return -1;
1202 }
1203 }
1204
1213 public function update(User $user, $notrigger = 0)
1214 {
1215 $error = 0;
1216
1217 // Clean parameters
1218 $this->label = trim($this->label);
1219 $this->note_private = dol_htmlcleanlastbr(trim(!isset($this->note_private) ? $this->note : $this->note_private));
1220 if (empty($this->percentage)) {
1221 $this->percentage = 0;
1222 }
1223 if (empty($this->priority) || !is_numeric($this->priority)) {
1224 $this->priority = 0;
1225 }
1226 if (empty($this->transparency)) {
1227 $this->transparency = 0;
1228 }
1229 if (empty($this->fulldayevent)) {
1230 $this->fulldayevent = 0;
1231 }
1232 if ($this->percentage > 100) {
1233 $this->percentage = 100;
1234 }
1235 //if ($this->percentage == 100 && ! $this->dateend) $this->dateend = $this->date;
1236 if ($this->datep && $this->datef) {
1237 $this->durationp = ($this->datef - $this->datep); // deprecated
1238 }
1239 //if ($this->date && $this->dateend) $this->durationa=($this->dateend - $this->date);
1240 if ($this->datep && $this->datef && $this->datep > $this->datef) {
1241 $this->datef = $this->datep;
1242 }
1243 //if ($this->date && $this->dateend && $this->date > $this->dateend) $this->dateend=$this->date;
1244 if ($this->fk_project < 0) {
1245 $this->fk_project = 0;
1246 }
1247
1248 $socid = (($this->socid > 0) ? $this->socid : 0);
1249 $contactid = (($this->contact_id > 0) ? $this->contact_id : 0);
1250 $userownerid = ($this->userownerid ? $this->userownerid : 0);
1251
1252 // If a type_id is set, we must also have the type_code set
1253 if ($this->type_id > 0) {
1254 if (empty($this->type_code)) {
1255 $cactioncomm = new CActionComm($this->db);
1256 $result = $cactioncomm->fetch($this->type_id);
1257 if ($result >= 0 && !empty($cactioncomm->code)) {
1258 $this->type_code = $cactioncomm->code;
1259 }
1260 }
1261 }
1262
1263 $code = $this->code;
1264 if (empty($code) || (!empty($this->oldcopy) && $this->oldcopy->type_code != $this->type_code)) { // If code unknown or if we change the type, we reset $code too
1265 $code = $this->type_code;
1266 }
1267
1268 $this->db->begin();
1269
1270 $sql = "UPDATE ".MAIN_DB_PREFIX."actioncomm";
1271 $sql .= " SET percent = '".$this->db->escape((string) $this->percentage)."'";
1272 $sql .= ", fk_action = ".(int) $this->type_id;
1273 $sql .= ", code = " . ($code ? "'".$this->db->escape($code)."'" : "null");
1274 $sql .= ", label = ".($this->label ? "'".$this->db->escape($this->label)."'" : "null");
1275 $sql .= ", datep = ".(strval($this->datep) != '' ? "'".$this->db->idate($this->datep)."'" : 'null');
1276 $sql .= ", datep2 = ".(strval($this->datef) != '' ? "'".$this->db->idate($this->datef)."'" : 'null');
1277 $sql .= ", durationp = ".(isset($this->durationp) && $this->durationp >= 0 && $this->durationp != '' ? "'".$this->db->escape((string) $this->durationp)."'" : "null"); // deprecated
1278 $sql .= ", note = '".$this->db->escape($this->note_private)."'";
1279 $sql .= ", fk_project =".($this->fk_project > 0 ? ((int) $this->fk_project) : "null");
1280 $sql .= ", fk_soc =".($socid > 0 ? ((int) $socid) : "null");
1281 $sql .= ", fk_contact =".($contactid > 0 ? ((int) $contactid) : "null");
1282 $sql .= ", priority = '".$this->db->escape((string) $this->priority)."'";
1283 $sql .= ", fulldayevent = '".$this->db->escape((string) $this->fulldayevent)."'";
1284 $sql .= ", location = ".($this->location ? "'".$this->db->escape($this->location)."'" : "null");
1285 $sql .= ", transparency = '".$this->db->escape((string) $this->transparency)."'";
1286 $sql .= ", fk_user_mod = ".((int) $user->id);
1287 $sql .= ", fk_user_action = ".($userownerid > 0 ? ((int) $userownerid) : "null");
1288 $sql .= ", fk_task = ".(!empty($this->fk_task) ? ((int) $this->fk_task) : "null");
1289 if (!empty($this->fk_element)) {
1290 $sql .= ", fk_element=".($this->fk_element ? ((int) $this->fk_element) : "null");
1291 }
1292 if (!empty($this->elementtype)) {
1293 $sql .= ", elementtype=".($this->elementtype ? "'".$this->db->escape($this->elementtype)."'" : "null");
1294 }
1295 if (!empty($this->num_vote)) {
1296 $sql .= ", num_vote=".($this->num_vote ? (int) $this->num_vote : null);
1297 }
1298 if (!empty($this->event_paid)) {
1299 $sql .= ", event_paid=".($this->event_paid ? (int) $this->event_paid : 0);
1300 }
1301 if (!empty($this->status)) {
1302 $sql .= ", status=".($this->status ? (int) $this->status : 0);
1303 }
1304 $sql .= " WHERE id=".((int) $this->id);
1305
1306 dol_syslog(get_class($this)."::update", LOG_DEBUG);
1307 if ($this->db->query($sql)) {
1308 $action = 'update';
1309
1310 // Actions on extra fields
1311 if (!$error) {
1312 $result = $this->insertExtraFields();
1313 if ($result < 0) {
1314 $error++;
1315 }
1316 }
1317
1318 // Now insert assignedusers
1319 if (!$error) {
1320 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm_resources where fk_actioncomm = ".((int) $this->id)." AND element_type = 'user'";
1321 $resql = $this->db->query($sql);
1322
1323 $already_inserted = array();
1324 foreach ($this->userassigned as $key => $val) {
1325 if (!is_array($val)) { // For backward compatibility when val=id
1326 $val = array('id' => $val);
1327 }
1328 if (!isset($val['id']) || !is_scalar($val['id'])) {
1329 continue;
1330 }
1331 if (!empty($already_inserted[$val['id']])) {
1332 continue;
1333 }
1334
1335 $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element, mandatory, transparency, answer_status)";
1336 $sql .= " VALUES(".((int) $this->id).", 'user', ".((int) $val['id']).", ".(empty($val['mandatory']) ? '0' : ((int) $val['mandatory'])).", ".(empty($val['transparency']) ? '0' : ((int) $val['transparency'])).", ".(empty($val['answer_status']) ? '0' : ((int) $val['answer_status'])).")";
1337
1338 $resql = $this->db->query($sql);
1339 if (!$resql) {
1340 $error++;
1341 $this->errors[] = $this->db->lasterror();
1342 } else {
1343 $already_inserted[$val['id']] = true;
1344 }
1345 //var_dump($sql);exit;
1346 }
1347 }
1348
1349 if (!$error) {
1350 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm_resources where fk_actioncomm = ".((int) $this->id)." AND element_type = 'socpeople'";
1351 $resql = $this->db->query($sql);
1352
1353 if (!empty($this->socpeopleassigned)) {
1354 $already_inserted = array();
1355 foreach ($this->socpeopleassigned as $val) {
1356 if (!is_array($val)) { // For backward compatibility when val=id
1357 $val = array('id' => $val);
1358 }
1359 if (!empty($already_inserted[$val['id']])) {
1360 continue;
1361 }
1362
1363 $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element, mandatory, transparency, answer_status)";
1364 $sql .= " VALUES(".((int) $this->id).", 'socpeople', ".((int) $val['id']).", 0, 0, 0)";
1365
1366 $resql = $this->db->query($sql);
1367 if (!$resql) {
1368 $error++;
1369 $this->errors[] = $this->db->lasterror();
1370 } else {
1371 $already_inserted[$val['id']] = true;
1372 }
1373 }
1374 }
1375 }
1376
1377 if (!$error && !$notrigger) {
1378 // Call trigger
1379 $result = $this->call_trigger('ACTION_MODIFY', $user);
1380 if ($result < 0) {
1381 $error++;
1382 }
1383 // End call triggers
1384 }
1385
1386 if (!$error) {
1387 $this->db->commit();
1388 return 1;
1389 } else {
1390 $this->db->rollback();
1391 dol_syslog(get_class($this)."::update ".implode(',', $this->errors), LOG_ERR);
1392 return -2;
1393 }
1394 } else {
1395 $this->db->rollback();
1396 $this->error = $this->db->lasterror();
1397 return -1;
1398 }
1399 }
1400
1414 public function getActions($socid = 0, $fk_element = 0, $elementtype = '', $filter = '', $sortfield = 'a.datep', $sortorder = 'DESC', $limit = 0)
1415 {
1416 global $hookmanager;
1417
1418 $resarray = array();
1419
1420 dol_syslog(get_class($this)."::getActions", LOG_DEBUG);
1421
1422 // Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
1423 if (!is_object($hookmanager)) {
1424 include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
1425 $hookmanager = new HookManager($this->db);
1426 }
1427 $hookmanager->initHooks(array('agendadao'));
1428
1429 $sql = "SELECT a.id";
1430 $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
1431 // Fields from hook
1432 $parameters = array('sql' => &$sql, 'socid' => $socid, 'fk_element' => $fk_element, 'elementtype' => $elementtype);
1433 $reshook = $hookmanager->executeHooks('getActionsListFrom', $parameters); // Note that $action and $object may have been modified by hook
1434 if (!empty($hookmanager->resPrint)) {
1435 $sql .= $hookmanager->resPrint;
1436 }
1437 $sql .= " WHERE a.entity IN (".getEntity('agenda').")";
1438 if (!empty($socid)) {
1439 $sql .= " AND a.fk_soc = ".((int) $socid);
1440 }
1441 if (!empty($elementtype)) {
1442 if ($elementtype == 'project') {
1443 $sql .= ' AND a.fk_project = '.((int) $fk_element);
1444 } elseif ($elementtype == 'contact') {
1445 $sql .= ' AND EXISTS';
1446 $sql .= " (SELECT r.rowid FROM ".MAIN_DB_PREFIX."actioncomm_resources as r WHERE";
1447 $sql .= " r.element_type = 'socpeople' AND r.fk_element = ".((int) $fk_element).' AND r.fk_actioncomm = a.id)';
1448 } elseif ($elementtype == 'user') {
1449 $sql .= " AND (a.fk_user_action = ".((int) $fk_element)." OR EXISTS";
1450 $sql .= " (SELECT r.rowid FROM ".MAIN_DB_PREFIX."actioncomm_resources as r WHERE";
1451 $sql .= " r.element_type = 'user' AND r.fk_element = ".((int) $fk_element).' AND r.fk_actioncomm = a.id)';
1452 $sql .= ")";
1453 } else {
1454 $sql .= " AND a.fk_element = ".((int) $fk_element)." AND a.elementtype = '".$this->db->escape($elementtype)."'";
1455 }
1456 }
1457 if (!empty($filter)) {
1458 $sql .= $filter;
1459 }
1460 // Fields where hook
1461 $parameters = array('sql' => &$sql, 'socid' => $socid, 'fk_element' => $fk_element, 'elementtype' => $elementtype);
1462 $reshook = $hookmanager->executeHooks('getActionsListWhere', $parameters); // Note that $action and $object may have been modified by hook
1463 if (!empty($hookmanager->resPrint)) {
1464 $sql .= $hookmanager->resPrint;
1465 }
1466 if ($sortorder && $sortfield) {
1467 $sql .= $this->db->order($sortfield, $sortorder);
1468 }
1469 $sql .= $this->db->plimit($limit, 0);
1470
1471 $resql = $this->db->query($sql);
1472 if ($resql) {
1473 $num = $this->db->num_rows($resql);
1474
1475 if ($num) {
1476 for ($i = 0; $i < $num; $i++) {
1477 $obj = $this->db->fetch_object($resql);
1478 $actioncommstatic = new ActionComm($this->db);
1479 $actioncommstatic->fetch($obj->id);
1480 $resarray[$i] = $actioncommstatic;
1481 }
1482 }
1483 $this->db->free($resql);
1484 return $resarray;
1485 } else {
1486 return $this->db->lasterror();
1487 }
1488 }
1489
1490 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1498 public function load_board($user, $load_state_board = 0)
1499 {
1500 // phpcs:enable
1501 global $conf, $langs;
1502
1503 if (empty($load_state_board)) {
1504 $sql = "SELECT a.id, a.datep as dp";
1505 } else {
1506 $this->nb = array();
1507 $sql = "SELECT count(a.id) as nb";
1508 }
1509 $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
1510 if (!$user->hasRight('agenda', 'allactions', 'read')) {
1511 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."actioncomm_resources AS ar ON a.id = ar.fk_actioncomm AND ar.element_type ='user' AND ar.fk_element = ".((int) $user->id);
1512 }
1513 $sql .= " WHERE 1 = 1";
1514 if (empty($load_state_board)) {
1515 $sql .= " AND a.percent >= 0 AND a.percent < 100";
1516 }
1517 $sql .= " AND a.entity IN (".getEntity('agenda').")";
1518 if (!$user->hasRight('agenda', 'allactions', 'read')) {
1519 $sql .= " AND (a.fk_user_author = ".((int) $user->id)." OR a.fk_user_action = ".((int) $user->id);
1520 $sql .= " OR ar.fk_element = ".((int) $user->id);
1521 $sql .= ")";
1522 }
1523 // If the internal user must only see his customers, force searching by him
1524 $search_sale = 0;
1525 if (!$user->hasRight('societe', 'client', 'voir')) {
1526 $search_sale = $user->id;
1527 }
1528 // Search on sale representative
1529 if ($search_sale && $search_sale != '-1') {
1530 if ($search_sale == -2) {
1531 $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = a.fk_soc)";
1532 } elseif ($search_sale > 0) {
1533 $sql .= " AND (a.fk_soc IS NULL OR EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = a.fk_soc AND sc.fk_user = ".((int) $search_sale)."))";
1534 }
1535 }
1536
1537 $resql = $this->db->query($sql);
1538 if ($resql) {
1539 $response = null; // Ensure the variable is defined
1540 if (empty($load_state_board)) {
1541 $agenda_static = new ActionComm($this->db);
1542 $response = new WorkboardResponse();
1543 $response->warning_delay = $conf->agenda->warning_delay / 60 / 60 / 24;
1544 $response->label = $langs->trans("ActionsToDo");
1545 $response->labelShort = $langs->trans("ActionsToDoShort");
1546 $response->url = DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&actioncode=0&status=todo&mainmenu=agenda';
1547 if ($user->hasRight("agenda", "allactions", "read")) {
1548 $response->url .= '&filtert=-1';
1549 }
1550 $response->img = img_object('', "action", 'class="inline-block valigntextmiddle"');
1551 }
1552 // This assignment in condition is not a bug. It allows walking the results.
1553 while ($obj = $this->db->fetch_object($resql)) {
1554 if (empty($load_state_board)) {
1555 '@phan-var-force WorkboardResponse $response
1556 @phan-var-force ActionComm $agenda_static';
1557 $response->nbtodo++;
1558 $agenda_static->datep = $this->db->jdate($obj->dp);
1559 if ($agenda_static->hasDelay()) {
1560 $response->nbtodolate++;
1561 }
1562 } else {
1563 $this->nb["actionscomm"] = $obj->nb;
1564 }
1565 }
1566
1567 $this->db->free($resql);
1568 if (empty($load_state_board) && $response instanceof WorkboardResponse) {
1569 return $response;
1570 } else {
1571 return 1;
1572 }
1573 } else {
1574 dol_print_error($this->db);
1575 $this->error = $this->db->error();
1576 return -1;
1577 }
1578 }
1579
1580
1587 public function info($id)
1588 {
1589 $sql = 'SELECT ';
1590 $sql .= ' a.id,';
1591 $sql .= ' datec,';
1592 $sql .= ' tms as datem,';
1593 $sql .= ' fk_user_author,';
1594 $sql .= ' fk_user_mod';
1595 $sql .= ' FROM '.MAIN_DB_PREFIX.'actioncomm as a';
1596 $sql .= ' WHERE a.id = '.((int) $id);
1597
1598 dol_syslog(get_class($this)."::info", LOG_DEBUG);
1599 $result = $this->db->query($sql);
1600 if ($result) {
1601 if ($this->db->num_rows($result)) {
1602 $obj = $this->db->fetch_object($result);
1603
1604 $this->id = $obj->id;
1605
1606 $this->user_creation_id = $obj->fk_user_author;
1607 $this->user_modification_id = $obj->fk_user_mod;
1608 $this->date_creation = $this->db->jdate($obj->datec);
1609 $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
1610 }
1611 $this->db->free($result);
1612 } else {
1613 dol_print_error($this->db);
1614 }
1615 }
1616
1617
1625 public function getLibStatut($mode, $hidenastatus = 0)
1626 {
1627 return $this->LibStatut($this->percentage, $mode, $hidenastatus, $this->datep);
1628 }
1629
1630 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1640 public function LibStatut($percent, $mode, $hidenastatus = 0, $datestart = '')
1641 {
1642 // phpcs:enable
1643 global $langs;
1644
1645 $labelStatus = $langs->transnoentitiesnoconv('StatusNotApplicable');
1646 if ($percent == -1 && !$hidenastatus) {
1647 $labelStatus = $langs->transnoentitiesnoconv('StatusNotApplicable');
1648 } elseif ($percent == 0) {
1649 $labelStatus = $langs->transnoentitiesnoconv('StatusActionToDo').' (0%)';
1650 } elseif ($percent > 0 && $percent < 100) {
1651 $labelStatus = $langs->transnoentitiesnoconv('StatusActionInProcess').' ('.$percent.'%)';
1652 } elseif ($percent >= 100) {
1653 $labelStatus = $langs->transnoentitiesnoconv('StatusActionDone').' (100%)';
1654 }
1655
1656 $labelStatusShort = $langs->transnoentitiesnoconv('StatusNotApplicable');
1657 if ($percent == -1 && !$hidenastatus) {
1658 $labelStatusShort = $langs->trans('NA');
1659 } elseif ($percent == 0) {
1660 $labelStatusShort = '0%';
1661 } elseif ($percent > 0 && $percent < 100) {
1662 $labelStatusShort = $percent.'%';
1663 } elseif ($percent >= 100) {
1664 $labelStatusShort = '100%';
1665 }
1666
1667 $statusType = 'status9';
1668 if ($percent == -1 && !$hidenastatus) {
1669 $statusType = 'status9';
1670 }
1671 if ($percent == 0) {
1672 $statusType = 'status1';
1673 }
1674 if ($percent > 0 && $percent < 100) {
1675 $statusType = 'status3';
1676 }
1677 if ($percent >= 100) {
1678 $statusType = 'status6';
1679 }
1680
1681 $params = array('badgeParams' => array('attr' => array('title' => '<b>'.$langs->trans("Progression").'</b> : '.$labelStatus)));
1682
1683 return dolGetStatus($labelStatus, $labelStatusShort, '', $statusType, $mode, '', $params);
1684 }
1685
1692 public function getTooltipContentArray($params)
1693 {
1694 global $langs, $form;
1695
1696 $langs->load('agenda');
1697
1698 $datas = array();
1699 $nofetch = !empty($params['nofetch']);
1700
1701 // Set label of type
1702 $labeltype = '';
1703 if ($this->type_code) {
1704 $langs->load("commercial");
1705 $labeltype = ($langs->transnoentities("Action".$this->type_code) != "Action".$this->type_code) ? $langs->transnoentities("Action".$this->type_code) : $this->type_label;
1706 }
1707 if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
1708 if ($this->type_code != 'AC_OTH_AUTO') {
1709 $labeltype = $langs->trans('ActionAC_MANUAL');
1710 }
1711 }
1712 $datas['picto'] = img_picto('', $this->picto).' <u>'.$langs->trans('Action').'</u>';
1713 if (!empty($this->ref)) {
1714 $datas['ref'] = '<br><b>'.$langs->trans('Ref').':</b> '.dol_escape_htmltag($this->ref);
1715 }
1716 if (!empty($this->label)) {
1717 $datas['title'] = '<br><b>'.$langs->trans('Title').':</b> '.dol_escape_htmltag($this->label);
1718 }
1719 if (!empty($labeltype)) {
1720 $datas['labeltype'] = '<br><b>'.$langs->trans('Type').':</b> '.dol_escape_htmltag($labeltype);
1721 }
1722 if (!empty($this->location)) {
1723 $datas['location'] = '<br><b>'.$langs->trans('Location').':</b> '.dol_escape_htmltag($this->location);
1724 }
1725 if (isset($this->transparency) && $this->datef && $this->datep != $this->datef && isset($this->transparency)) {
1726 $datas['transparency'] = '<br><b>'.$langs->trans('Busy').':</b> '.yn($this->transparency);
1727 }
1728
1729 $datas['date'] = '<br><b>'.$langs->trans('Date').':</b> '.dol_print_date($this->datep, 'dayhourreduceformat', 'tzuserrel');
1730 if ($this->datef) {
1731 $tmpa = dol_getdate($this->datep);
1732 $tmpb = dol_getdate($this->datef);
1733 if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
1734 if ($tmpa['hours'] != $tmpb['hours'] || $tmpa['minutes'] != $tmpb['minutes']) {
1735 $datas['date'] .= '-'.dol_print_date($this->datef, 'hour', 'tzuserrel');
1736 }
1737 } else {
1738 $datas['date'] .= '-'.dol_print_date($this->datef, 'dayhourreduceformat', 'tzuserrel');
1739 }
1740 }
1741
1742 if (!empty($this->recurid)) {
1743 $datas['recurring'] = '<br><b>'.$langs->trans("RecurringEvent").':</b> ';
1744 $datas['recurring'] .= img_picto($langs->trans("EventPartOfARecurringSerie", $this->recurid), 'recurring', 'class="pictofixedwidth"');
1745 $reg = array();
1746 if (preg_match('/FREQ=MONTHLY_BYMONTHDAY(\d+)/', $this->recurrule, $reg)) {
1747 $datas['recurring'] .= $langs->trans("EveryMonth").' <span class="opacitymedium small">('.$langs->trans("DayOfMonth").' '.$reg[1].' - '.$langs->trans("Until").' '.dol_print_date($this->recurdateend, 'day').')</span>';
1748 }
1749 }
1750
1751 if (!empty($this->email_msgid)) {
1752 $langs->load("mails");
1753 $datas['space'] = '<br>';
1754 // $datas['email'] = '<br><b>'.img_picto('', 'email').' '.$langs->trans("Email").'</b>';
1755 $datas['mailtopic'] = '<br><b>'.$langs->trans('MailTopic').':</b> '.dol_escape_htmltag($this->email_subject);
1756 $datas['mailfrom'] = '<br><b>'.$langs->trans('MailFrom').':</b> '.dol_htmlentities($this->email_from);
1757 $datas['mailto'] = '<br><b>'.$langs->trans('MailTo').':</b> '.dol_htmlentities($this->email_to);
1758 if (!empty($this->email_tocc)) {
1759 $datas['mailcc'] = '<br><b>'.$langs->trans('MailCC').':</b> '.dol_htmlentities($this->email_tocc);
1760 }
1761 /* Disabled because bcc must remain by definition not visible
1762 if (!empty($this->email_tobcc)) {
1763 $datas['mailccc'] = '<br><b>'.$langs->trans('MailCCC').':</b> '.$this->email_tobcc;
1764 } */
1765 }
1766 if (!empty($this->note_private)) {
1767 $datas['description'] = '<br><hr>';
1768 // Try to limit length of content
1769 $texttoshow = dolGetFirstLineOfText($this->note_private, 10);
1770 // Restrict height of content into the tooltip
1771 $datas['note'] = '<div class="tenlinesmax">';
1772 $datas['note'] .= (dol_textishtml($texttoshow) ? str_replace(array("\r", "\n"), "", $texttoshow) : str_replace(array("\r", "\n"), '<br>', $texttoshow));
1773 $datas['note'] .= '</div>';
1774 }
1775
1776 // show categories for this record only in ajax to not overload lists
1777 if (isModEnabled('category') && !$nofetch) {
1778 require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php';
1779 if (empty($form)) {
1780 include_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
1781 $form = new Form($this->db);
1782 }
1783 $tmpcategstring = $form->showCategories($this->id, Categorie::TYPE_ACTIONCOMM, 1);
1784 if ($tmpcategstring) {
1785 $datas['categories'] = '<br>'.$tmpcategstring;
1786 }
1787 }
1788
1789 return $datas;
1790 }
1791
1805 public function getNomUrl($withpicto = 0, $maxlength = 0, $morecss = '', $option = '', $overwritepicto = 0, $notooltip = 0, $save_lastsearch_value = -1)
1806 {
1807 global $conf, $langs, $user, $hookmanager, $action;
1808
1809 if (!empty($conf->dol_no_mouse_hover)) {
1810 $notooltip = 1; // Force disable tooltips
1811 }
1812
1813 $canread = 0;
1814 if ($user->hasRight('agenda', 'myactions', 'read') && ($this->authorid == $user->id || $this->userownerid == $user->id)) {
1815 $canread = 1; // Can read my event
1816 }
1817 if ($user->hasRight('agenda', 'myactions', 'read') && array_key_exists($user->id, $this->userassigned)) {
1818 $canread = 1; // Can read my event i am assigned
1819 }
1820 if ($user->hasRight('agenda', 'allactions', 'read')) {
1821 $canread = 1; // Can read all event of other
1822 }
1823 if (!$canread) {
1824 $option = 'nolink';
1825 }
1826
1827 $label = $this->label;
1828
1829 $result = '';
1830
1831 // Set label of type
1832 $labeltype = $this->getTypeLabel(1);
1833
1834 $linkclose = '';
1835
1836 $params = [
1837 'id' => (string) $this->id,
1838 'objecttype' => $this->element.($this->module ? '@'.$this->module : ''),
1839 'option' => $option,
1840 'nofetch' => 1,
1841 ];
1842 $classfortooltip = 'classfortooltip';
1843 $dataparams = '';
1844 if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
1845 $classfortooltip = 'classforajaxtooltip';
1846 $dataparams = ' data-params="'.dol_escape_htmltag(json_encode($params)).'"';
1847 //$label = ''; // $label is used as ref when $maxlength is not negative, so we must not empty it.
1848 } else {
1849 $label = implode($this->getTooltipContentArray($params));
1850 }
1851
1852 if (empty($notooltip)) {
1853 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
1854 $label = $langs->trans("ShowAction");
1855 $linkclose .= ' alt="'.dolPrintHTMLForAttribute($label).'"';
1856 }
1857 $linkclose .= ($label ? ' title="'.dolPrintHTMLForAttribute($label).'"' : ' title="tocomplete"');
1858 $linkclose .= $dataparams.' class="'.$morecss.' '.$classfortooltip.'"';
1859 } else {
1860 $linkclose .= ' class="'.$morecss.'"';
1861 }
1862
1863 $query = ['id' => $this->id];
1864 if ($option == 'birthday') {
1865 $baseurl = DOL_URL_ROOT.'/contact/perso.php';
1866 } elseif ($option == 'holiday') {
1867 $baseurl = DOL_URL_ROOT.'/holiday/card.php';
1868 } else {
1869 $baseurl = DOL_URL_ROOT.'/comm/action/card.php';
1870 }
1871
1872 if ($option !== 'nolink') {
1873 // Add param to save lastsearch_values or not
1874 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1875 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
1876 $add_save_lastsearch_values = 1;
1877 }
1878 if ($add_save_lastsearch_values) {
1879 $query += ['save_lastsearch_values' => 1];
1880 }
1881 }
1882 $url = dolBuildUrl($baseurl, $query);
1883
1884 $linkstart = '<a href="'.$url.'"';
1885 $linkstart .= $linkclose.'>';
1886 $linkend = '</a>';
1887
1888 if ($option == 'nolink') {
1889 $linkstart = '';
1890 $linkend = '';
1891 }
1892
1893 if ($withpicto == 2) {
1894 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
1895 $label = $labeltype;
1896 }
1897 $labelshort = '';
1898 } else {
1899 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE') && empty($label)) {
1900 if (empty($this->label)) {
1901 $label = $labeltype;
1902 } else {
1903 $label = $this->label;
1904 }
1905 }
1906 if ($maxlength < 0) {
1907 $labelshort = $this->ref;
1908 } else {
1909 $labelshort = dol_trunc(empty($this->label) ? $labeltype : $this->label, $maxlength);
1910 }
1911 }
1912
1913 if ($withpicto) {
1914 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE')) { // Add code into ()
1915 if ($labeltype) {
1916 $label .= (preg_match('/'.preg_quote($labeltype, '/').'/', $label) ? '' : ' ('.$langs->transnoentities("Action".$this->type_code).')');
1917 }
1918 }
1919 }
1920
1921 $result .= $linkstart;
1922 if ($withpicto) {
1923 $result .= img_object(($notooltip ? '' : $langs->trans("ShowAction").': '.$label), ($overwritepicto ? $overwritepicto : 'action'), (($this->type_color && $overwritepicto) ? 'style="color: #'.$this->type_color.' !important;" ' : '').($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : ' class="'.(($withpicto != 2) ? 'paddingright ' : '').'"'), 0, 0, $notooltip ? 0 : 1);
1924 }
1925 $result .= dol_escape_htmltag($labelshort);
1926 $result .= $linkend;
1927
1928 global $action;
1929 $hookmanager->initHooks(array('actiondao'));
1930 $parameters = array('id' => $this->id, 'getnomurl' => &$result);
1931 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
1932 if ($reshook > 0) {
1933 $result = $hookmanager->resPrint;
1934 } else {
1935 $result .= $hookmanager->resPrint;
1936 }
1937
1938 return $result;
1939 }
1940
1949 public function getTypePicto($morecss = 'pictofixedwidth paddingright valignmiddle', $titlealt = '')
1950 {
1951 $imgpicto = '';
1952 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
1953 $color = '';
1954 if ($this->type_color) {
1955 $color = 'style="color: #'.$this->type_color.' !important;"';
1956 }
1957 if ($this->type_picto) {
1958 $imgpicto = img_picto($titlealt, $this->type_picto, '', 0, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1959 } else {
1960 if ($this->type_code === 'AC_RDV') {
1961 $imgpicto = img_picto($titlealt, 'meeting', $color, 0, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1962 } elseif ($this->type_code === 'AC_TEL') {
1963 $imgpicto = img_picto($titlealt, 'object_phoning', $color, 0, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1964 } elseif ($this->type_code === 'AC_FAX') {
1965 $imgpicto = img_picto($titlealt, 'object_phoning_fax', $color, 0, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1966 } elseif ($this->type_code === 'AC_EMAIL' || $this->type_code === 'AC_EMAIL_IN' || $this->type_code === 'AC_EMAILING' || (!empty($this->code) && preg_match('/_SENTBYMAIL/', $this->code))) {
1967 $imgpicto = img_picto($titlealt, 'object_email', $color, 0, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1968 } elseif ($this->type_code === 'AC_INT') {
1969 $imgpicto = img_picto($titlealt, 'object_intervention', $color, 0, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1970 } elseif (!empty($this->code) && preg_match('/^TICKET_MSG/', $this->code)) {
1971 $imgpicto = img_picto($titlealt, 'object_conversation', $color, 0, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1972 } elseif ((string) $this->type != 'systemauto') {
1973 $imgpicto = img_picto($titlealt, 'user-cog', $color, 0, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1974 } else {
1975 $imgpicto = img_picto($titlealt, 'cog', $color, 0, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1976 }
1977 }
1978 } else {
1979 // 2 picto: 1 for auto, 1 for manual
1980 if ($this->type != 'systemauto') {
1981 $imgpicto = img_picto($titlealt, 'user-cog', '', 0, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1982 } else {
1983 $imgpicto = img_picto($titlealt, 'cog', '', 0, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1984 }
1985 }
1986
1987 return $imgpicto;
1988 }
1989
1990
1997 public function getTypeLabel($mode = 0)
1998 {
1999 global $conf, $langs;
2000
2001 // If cache for array of types unknown, we load it
2002 if (!empty($conf->cache['actioncommgetypelabel'])) {
2003 $arraylist = $conf->cache['actioncommgetypelabel'];
2004 } else {
2005 require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
2006 $caction = new CActionComm($this->db);
2007 $arraylist = $caction->liste_array(1, 'code', '', (getDolGlobalString('AGENDA_USE_EVENT_TYPE') ? 0 : 1), '', 1);
2008 $conf->cache['actioncommgetypelabel'] = $arraylist;
2009 }
2010
2011 $labeltype = $this->type_code;
2012 if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
2013 $labeltype = 'AC_OTH';
2014 }
2015 if (!empty($this->code) && preg_match('/^TICKET_MSG/', $this->code)) {
2016 $labeltype = $langs->trans("Message");
2017 } else {
2018 if (!empty($arraylist[$labeltype])) {
2019 $labeltype = $arraylist[$labeltype];
2020 }
2021 if ($this->type_code == 'AC_OTH_AUTO' && ($this->type_code != $this->code) && $labeltype && !empty($arraylist[$this->code])) {
2022 $labeltype .= ' - '.$arraylist[$this->code]; // Use code in priority over type_code
2023 }
2024 }
2025
2026 if ($this->type == 'systemauto' && $mode == 1) {
2027 $labeltype .= ' ('.$langs->trans("auto").')';
2028 }
2029 if ($this->type == 'systemauto' && $mode == 2) {
2030 $labeltype = $langs->trans("AutoActions").($this->type_code == 'AC_OTH_AUTO' ? '' : ': '.$labeltype);
2031 } elseif ($this->type != 'systemauto' && $mode == 2) {
2032 $labeltype = $langs->trans("ManualActions").($this->type_code == 'AC_OTH' ? '' : ': '.$labeltype);
2033 }
2034
2035
2036 return $labeltype;
2037 }
2038
2049 public function setCategories($categories)
2050 {
2051 // Handle single category
2052 if (!is_array($categories)) {
2053 $categories = array($categories);
2054 }
2055
2056 // Get current categories
2057 include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
2058 $c = new Categorie($this->db);
2059 $existing = $c->containing($this->id, Categorie::TYPE_ACTIONCOMM, 'id');
2060
2061 // Diff
2062 if (is_array($existing)) {
2063 $to_del = array_diff($existing, $categories);
2064 $to_add = array_diff($categories, $existing);
2065 } else {
2066 $to_del = array(); // Nothing to delete
2067 $to_add = $categories;
2068 }
2069
2070 // Process
2071 foreach ($to_del as $del) {
2072 if ($c->fetch($del) > 0) {
2073 $c->del_type($this, Categorie::TYPE_ACTIONCOMM);
2074 }
2075 }
2076 foreach ($to_add as $add) {
2077 if ($c->fetch($add) > 0) {
2078 $c->add_type($this, Categorie::TYPE_ACTIONCOMM);
2079 }
2080 }
2081 return 1;
2082 }
2083
2084 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2096 public function build_exportfile($format, $type, $cachedelay, $filename, $filters, $exportholiday = 0)
2097 {
2098 global $hookmanager;
2099
2100 // phpcs:enable
2101 global $conf, $langs, $dolibarr_main_url_root, $mysoc;
2102
2103 require_once DOL_DOCUMENT_ROOT."/core/lib/xcal.lib.php";
2104 require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
2105 require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
2106
2107 dol_syslog(get_class($this)."::build_exportfile Build export file format=".$format.", type=".$type.", cachedelay=".$cachedelay.", filename=".$filename.", filters size=".count($filters), LOG_DEBUG);
2108
2109 // Check parameters
2110 if (empty($format)) {
2111 return -1;
2112 }
2113
2114 // Clean parameters
2115 if (!$filename) {
2116 $extension = 'vcs';
2117 if ($format == 'ical') {
2118 $extension = 'ics';
2119 }
2120 $filename = $format.'.'.$extension;
2121 }
2122
2123 // Create dir and define output file (definitive and temporary)
2124 $result = dol_mkdir($conf->agenda->dir_temp);
2125 $outputfile = $conf->agenda->dir_temp.'/'.$filename;
2126
2127 $result = 0;
2128
2129 $buildfile = true;
2130 $login = '';
2131 $logina = '';
2132 $logint = '';
2133 $eventorganization = '';
2134
2135 $now = dol_now();
2136
2137 if ($cachedelay) {
2138 $nowgmt = dol_now();
2139 include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
2140 if (dol_filemtime($outputfile) > ($nowgmt - $cachedelay)) {
2141 dol_syslog(get_class($this)."::build_exportfile file ".$outputfile." is not older than now - cachedelay (".$nowgmt." - ".$cachedelay."). Build is canceled");
2142 $buildfile = false;
2143 }
2144 }
2145
2146 if ($buildfile) {
2147 // Build event array
2148 $eventarray = array();
2149
2150 if (!empty($filters['module']) && $filters['module'] == 'project@eventorganization') {
2151 $sql = "SELECT p.rowid as id,";
2152 $sql .= " p.date_start_event as datep,"; // Start
2153 $sql .= " p.date_end_event as datep2,"; // End
2154 $sql .= " p.datec, p.tms as datem,";
2155 $sql .= " p.title as label, '' as code, p.note_public, p.note_private, 0 as type_id,";
2156 $sql .= " p.fk_soc,";
2157 $sql .= " p.fk_user_creat as fk_user_author, p.fk_user_modif as fk_user_mod,";
2158 $sql .= " 0 as fk_user_action,";
2159 $sql .= " 0 as fk_contact, 100 as percentage,";
2160 $sql .= " 0 as fk_element, '' as elementtype,";
2161 $sql .= " 1 as priority, 0 as fulldayevent, p.location, 0 as transparency,";
2162 $sql .= " u.firstname, u.lastname, '".$this->db->escape(getDolGlobalString("MAIN_INFO_SOCIETE_MAIL"))."' as email,";
2163 $sql .= " s.nom as socname,";
2164 $sql .= " 0 as type_id, '' as type_code, '' as type_label";
2165 $sql .= " FROM ".MAIN_DB_PREFIX."projet as p";
2166 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = p.fk_user_creat"; // Link to get author of event for export
2167 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on s.rowid = p.fk_soc";
2168
2169 $parameters = array('filters' => $filters);
2170 $reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters); // Note that $action and $object may have been modified by hook
2171 $sql .= $hookmanager->resPrint;
2172
2173 $sql .= " WHERE p.entity IN (".getEntity('project').")";
2174
2175 foreach ($filters as $key => $value) {
2176 if ($key == 'notolderthan' && $value != '') {
2177 $sql .= " AND p.date_start_event >= '".$this->db->idate($now - ($value * 24 * 60 * 60))."'";
2178 }
2179 if ($key == 'year') {
2180 $sql .= " AND p.date_start_event BETWEEN '".$this->db->idate(dol_get_first_day($value, 1))."' AND '".$this->db->idate(dol_get_last_day($value, 12))."'";
2181 }
2182 if ($key == 'id') {
2183 $sql .= " AND p.id = ".(is_numeric($value) ? $value : 0);
2184 }
2185 if ($key == 'idfrom') {
2186 $sql .= " AND p.id >= ".(is_numeric($value) ? $value : 0);
2187 }
2188 if ($key == 'idto') {
2189 $sql .= " AND p.id <= ".(is_numeric($value) ? $value : 0);
2190 }
2191 if ($key == 'project') {
2192 $sql .= " AND p.rowid = ".(is_numeric($value) ? $value : 0);
2193 }
2194 if ($key == 'status') {
2195 $sql .= " AND p.fk_statut = ".((int) $value);
2196 }
2197 // TODO Add filters on event code of meetings/talks only
2198 }
2199
2200 $sql .= " ORDER by date_start_event";
2201
2202 $eventorganization = 'project';
2203 } else {
2204 $sql = "SELECT a.id,";
2205 $sql .= " a.datep,"; // Start
2206 $sql .= " a.datep2,"; // End
2207 $sql .= " a.datec, a.tms as datem,";
2208 $sql .= " a.label, a.code, '' as note_public, a.note as note_private, a.fk_action as type_id,";
2209 $sql .= " a.fk_soc,";
2210 $sql .= " a.fk_user_author, a.fk_user_mod,";
2211 $sql .= " a.fk_user_action,";
2212 $sql .= " a.fk_contact, a.percent as percentage,";
2213 $sql .= " a.fk_element, a.elementtype,";
2214 $sql .= " a.priority, a.fulldayevent, a.location, a.transparency,";
2215 $sql .= " u.firstname, u.lastname, u.email,";
2216 $sql .= " s.nom as socname,";
2217 $sql .= " c.id as type_id, c.code as type_code, c.libelle as type_label,";
2218 $sql .= " num_vote, event_paid, a.status";
2219 $sql .= " FROM (".MAIN_DB_PREFIX."c_actioncomm as c, ".MAIN_DB_PREFIX."actioncomm as a)";
2220 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_author"; // Link to get author of event for export
2221 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on s.rowid = a.fk_soc";
2222
2223 $parameters = array('filters' => $filters);
2224 $reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters); // Note that $action and $object may have been modified by hook
2225 $sql .= $hookmanager->resPrint;
2226
2227 // We must filter on assignment table
2228 if (!empty($filters['logint']) && $filters['logint']) {
2229 $sql .= ", ".MAIN_DB_PREFIX."actioncomm_resources as ar";
2230 }
2231 $sql .= " WHERE a.fk_action = c.id";
2232 $sql .= " AND a.entity IN (".getEntity('agenda').")";
2233
2234 foreach ($filters as $key => $value) {
2235 if ($key == 'notolderthan' && $value != '') {
2236 $sql .= " AND a.datep >= '".$this->db->idate($now - ($value * 24 * 60 * 60))."'";
2237 }
2238 if ($key == 'year') {
2239 $sql .= " AND a.datep BETWEEN '".$this->db->idate(dol_get_first_day($value, 1))."' AND '".$this->db->idate(dol_get_last_day($value, 12))."'";
2240 }
2241 if ($key == 'id') {
2242 $sql .= " AND a.id = ".(is_numeric($value) ? $value : 0);
2243 }
2244 if ($key == 'idfrom') {
2245 $sql .= " AND a.id >= ".(is_numeric($value) ? $value : 0);
2246 }
2247 if ($key == 'idto') {
2248 $sql .= " AND a.id <= ".(is_numeric($value) ? $value : 0);
2249 }
2250 if ($key == 'project') {
2251 $sql .= " AND a.fk_project = ".(is_numeric($value) ? $value : 0);
2252 }
2253 if ($key == 'notactiontype') { // deprecated
2254 $sql .= " AND c.type <> '".$this->db->escape($value)."'";
2255 }
2256 if ($key == 'actiontype') { // 'system', 'systemauto', 'module', ...
2257 $newvalue = $value;
2258 $usenotin = 0;
2259 if (preg_match('/^!/', $newvalue)) {
2260 $newvalue = preg_replace('/^!/', '', $value);
2261 $usenotin = 1;
2262 }
2263 $arraynewvalue = explode(',', $newvalue);
2264 $newvalue = "";
2265 foreach ($arraynewvalue as $tmpval) {
2266 $newvalue .= ($newvalue ? "," : "")."'".$tmpval."'";
2267 }
2268 if ($usenotin) {
2269 $sql .= " AND c.type NOT IN (".$this->db->sanitize($newvalue, 1).")";
2270 } else {
2271 $sql .= " AND c.type IN (".$this->db->sanitize($newvalue, 1).")";
2272 }
2273 }
2274 if ($key == 'actioncode') { // 'AC_COMPANY_CREATE', 'AC_COMPANY_MODIFY', ...
2275 $newvalue = $value;
2276 $usenotin = 0;
2277 if (preg_match('/^!/', $newvalue)) {
2278 $newvalue = preg_replace('/^!/', '', $value);
2279 $usenotin = 1;
2280 }
2281 $arraynewvalue = explode(',', $newvalue);
2282 $newvalue = "";
2283 foreach ($arraynewvalue as $tmpval) {
2284 $newvalue .= ($newvalue ? "," : "")."'".$tmpval."'";
2285 }
2286 if ($usenotin) {
2287 $sql .= " AND a.code NOT IN (".$this->db->sanitize($newvalue, 1).")";
2288 } else {
2289 $sql .= " AND a.code IN (".$this->db->sanitize($newvalue, 1).")";
2290 }
2291 }
2292
2293 // We must filter on assignment table
2294 if ($key == 'logint') {
2295 $sql .= " AND ar.fk_actioncomm = a.id AND ar.element_type='user'";
2296 }
2297 if ($key == 'logina') {
2298 $logina = $value;
2299 $condition = '=';
2300 if (preg_match('/^!/', $logina)) {
2301 $logina = preg_replace('/^!/', '', $logina);
2302 $condition = '<>';
2303 }
2304 $userforfilter = new User($this->db);
2305 $result = $userforfilter->fetch(0, $logina);
2306 if ($result > 0) {
2307 $sql .= " AND a.fk_user_author ".$condition." ".$userforfilter->id;
2308 } elseif ($result < 0 || $condition == '=') {
2309 $sql .= " AND a.fk_user_author = 0";
2310 }
2311 }
2312 if ($key == 'logint') {
2313 $logint = $value;
2314 $condition = '=';
2315 if (preg_match('/^!/', $logint)) {
2316 $logint = preg_replace('/^!/', '', $logint);
2317 $condition = '<>';
2318 }
2319 $userforfilter = new User($this->db);
2320 $result = $userforfilter->fetch(0, $logint);
2321 if ($result > 0) {
2322 $sql .= " AND ar.fk_element = ".((int) $userforfilter->id);
2323 } elseif ($result < 0 || $condition == '=') {
2324 $sql .= " AND ar.fk_element = 0";
2325 }
2326 }
2327 if ($key == 'module') {
2328 if ($value == 'conforbooth@eventorganization') {
2329 $value = '@eventorganization';
2330 }
2331 $sql .= " AND c.module LIKE '%".$this->db->escape($value)."'";
2332 }
2333 if ($key == 'status') {
2334 $sql .= " AND a.status = ".((int) $value);
2335 }
2336 }
2337
2338 $sql .= " AND a.datep IS NOT NULL"; // To exclude corrupted events and avoid errors in lightning/sunbird import
2339
2340 $parameters = array('filters' => $filters);
2341 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
2342 $sql .= $hookmanager->resPrint;
2343
2344 $sql .= " ORDER by datep";
2345 }
2346
2347 if (!empty($filters['limit'])) {
2348 $sql .= $this->db->plimit((int) $filters['limit']);
2349 }
2350
2351 //print $sql;exit;
2352
2353 dol_syslog(get_class($this)."::build_exportfile select event(s)", LOG_DEBUG);
2354
2355 $resql = $this->db->query($sql);
2356 if ($resql) {
2357 $diff = 0;
2358 while ($obj = $this->db->fetch_object($resql)) {
2359 $qualified = true;
2360
2361 // 'eid','startdate','duration','enddate','title','summary','category','email','url','desc','author'
2362 $event = array();
2363 $event['uid'] = 'dolibarragenda-'.$this->db->database_name.'-'.$obj->id."@".$_SERVER["SERVER_NAME"];
2364 $event['type'] = $type;
2365
2366 $datestart = (int) $this->db->jdate($obj->datep) - (getDolGlobalInt('AGENDA_EXPORT_FIX_TZ') * 3600);
2367
2368 // fix for -> Warning: A non-numeric value encountered
2369 if (is_numeric($this->db->jdate($obj->datep2))) {
2370 $dateend = (int) $this->db->jdate($obj->datep2) - (getDolGlobalInt('AGENDA_EXPORT_FIX_TZ') * 3600);
2371 } else {
2372 // use start date as fall-back to avoid pb with empty end date on ICS readers
2373 $dateend = $datestart;
2374 }
2375
2376 $duration = ($datestart && $dateend) ? ($dateend - $datestart) : 0;
2377 $event['summary'] = $obj->label.($obj->socname ? " (".$obj->socname.")" : "");
2378
2379 if (!empty($filters['module']) && $filters['module'] == 'project@eventorganization') {
2380 $event['desc'] = $obj->note_public;
2381 } else {
2382 $event['desc'] = $obj->note_private;
2383 }
2384 $event['startdate'] = $datestart;
2385 $event['enddate'] = $dateend; // Not required with type 'journal'
2386 $event['duration'] = $duration; // Not required with type 'journal'
2387 $event['author'] = dolGetFirstLastname($obj->firstname, $obj->lastname);
2388 $event['priority'] = $obj->priority;
2389 $event['fulldayevent'] = $obj->fulldayevent;
2390 $event['location'] = $obj->location;
2391 $event['transparency'] = (($obj->transparency > 0) ? 'OPAQUE' : 'TRANSPARENT'); // OPAQUE (busy) or TRANSPARENT (not busy)
2392 $event['category'] = $obj->type_label;
2393 $event['email'] = $obj->email;
2394
2395 // Public URL of event
2396 if ($eventorganization != '') {
2397 $link_subscription = $dolibarr_main_url_root.'/public/eventorganization/attendee_new.php?id='.((int) $obj->id).'&type=global&noregistration=1';
2398 $encodedsecurekey = dol_hash(getDolGlobalString('EVENTORGANIZATION_SECUREKEY').'conferenceorbooth'.((int) $obj->id), 'md5');
2399 $link_subscription .= '&securekey='.urlencode($encodedsecurekey);
2400
2401 $event['url'] = $link_subscription;
2402 }
2403
2404 $event['created'] = (int) $this->db->jdate($obj->datec) - (getDolGlobalInt('AGENDA_EXPORT_FIX_TZ') * 3600);
2405 $event['modified'] = (int) $this->db->jdate($obj->datem) - (getDolGlobalInt('AGENDA_EXPORT_FIX_TZ') * 3600);
2406 $event['num_vote'] = $this->num_vote;
2407 $event['event_paid'] = $this->event_paid;
2408 $event['status'] = $this->status;
2409
2410 // TODO: find a way to call "$this->fetch_userassigned();" without override "$this" properties
2411 $this->id = $obj->id;
2412 $this->fetch_userassigned(false);
2413
2414 $assignedUserArray = array();
2415
2416 foreach ($this->userassigned as $key => $value) {
2417 $assignedUser = new User($this->db);
2418 $assignedUser->fetch($value['id']);
2419
2420 $assignedUserArray[$key] = $assignedUser;
2421 }
2422
2423 if (!empty($filters['module']) && $filters['module'] != 'project@eventorganization') {
2424 $event['assignedUsers'] = $assignedUserArray;
2425 }
2426
2427 if ($qualified && $datestart) {
2428 $eventarray[] = $event;
2429 }
2430 $diff++;
2431 }
2432
2433 $parameters = array('filters' => $filters, 'eventarray' => &$eventarray);
2434 $reshook = $hookmanager->executeHooks('addMoreEventsExport', $parameters); // Note that $action and $object may have been modified by hook
2435 if ($reshook > 0) {
2436 $eventarray = $hookmanager->resArray;
2437 }
2438 } else {
2439 $this->error = $this->db->lasterror();
2440 return -1;
2441 }
2442
2443 if ($exportholiday == 1) {
2444 $langs->load("holiday");
2445 $title = $langs->transnoentities("Holidays");
2446
2447 $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.email, u.statut, x.rowid, x.date_debut as date_start, x.date_fin as date_end, x.halfday, x.statut as status";
2448 $sql .= " FROM ".MAIN_DB_PREFIX."holiday as x, ".MAIN_DB_PREFIX."user as u";
2449 $sql .= " WHERE u.rowid = x.fk_user";
2450 $sql .= " AND u.statut = '1'"; // Show only active users (0 = inactive user, 1 = active user)
2451 $sql .= " AND (x.statut = '2' OR x.statut = '3')"; // Show only public leaves (2 = leave wait for approval, 3 = leave approved)
2452
2453 $resql = $this->db->query($sql);
2454 if ($resql) {
2455 $num = $this->db->num_rows($resql);
2456 $i = 0;
2457
2458 while ($i < $num) {
2459 $obj = $this->db->fetch_object($resql);
2460 $event = array();
2461
2462 if ($obj->halfday == 1) {
2463 $event['fulldayevent'] = false;
2464
2465 $timestampStart = dol_stringtotime($obj->date_start." 00:00:00", 0);
2466 $timestampEnd = dol_stringtotime($obj->date_end." 12:00:00", 0);
2467 } elseif ($obj->halfday == -1) {
2468 $event['fulldayevent'] = false;
2469
2470 $timestampStart = dol_stringtotime($obj->date_start." 12:00:00", 0);
2471 $timestampEnd = dol_stringtotime($obj->date_end." 23:59:59", 0);
2472 } else {
2473 $event['fulldayevent'] = true;
2474
2475 $timestampStart = dol_stringtotime($obj->date_start." 00:00:00", 0);
2476 $timestampEnd = dol_stringtotime($obj->date_end." 23:59:59", 0);
2477 }
2478
2479 if (getDolGlobalString('AGENDA_EXPORT_FIX_TZ')) {
2480 $timestampStart -= ($conf->global->AGENDA_EXPORT_FIX_TZ * 3600);
2481 $timestampEnd -= ($conf->global->AGENDA_EXPORT_FIX_TZ * 3600);
2482 }
2483
2484 $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
2485 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
2486 $url = $urlwithroot.'/holiday/card.php?id='.$obj->rowid;
2487
2488 $event['uid'] = 'dolibarrholiday-'.$this->db->database_name.'-'.$obj->rowid."@".$_SERVER["SERVER_NAME"];
2489 $event['author'] = dolGetFirstLastname($obj->firstname, $obj->lastname);
2490 $event['type'] = 'event';
2491 $event['category'] = "Holiday";
2492 $event['transparency'] = 'OPAQUE';
2493 $event['email'] = $obj->email;
2494 $event['created'] = $timestampStart;
2495 $event['modified'] = $timestampStart;
2496 $event['startdate'] = $timestampStart;
2497 $event['enddate'] = $timestampEnd;
2498 $event['duration'] = $timestampEnd - $timestampStart;
2499 $event['url'] = $url;
2500
2501 if ($obj->status == 2) {
2502 // 2 = leave wait for approval
2503 $event['summary'] = $title." - ".$obj->lastname." (wait for approval)";
2504 } else {
2505 // 3 = leave approved
2506 $event['summary'] = $title." - ".$obj->lastname;
2507 }
2508
2509 $eventarray[] = $event;
2510
2511 $i++;
2512 }
2513 }
2514 }
2515
2516 $langs->load("agenda");
2517
2518 // Define title and desc
2519 $title = '';
2520 $more = '';
2521 if ($login) {
2522 $more = $langs->transnoentities("User").' '.$login;
2523 }
2524 if ($logina) {
2525 $more = $langs->transnoentities("ActionsAskedBy").' '.$logina;
2526 }
2527 if ($logint) {
2528 $more = $langs->transnoentities("ActionsToDoBy").' '.$logint;
2529 }
2530 if ($eventorganization) {
2531 $langs->load("eventorganization");
2532 $title = $langs->transnoentities("OrganizedEvent").(empty($eventarray[0]['label']) ? '' : ' '.$eventarray[0]['label']);
2533 $more = 'ICS file - '.$langs->transnoentities("OrganizedEvent").(empty($eventarray[0]['label']) ? '' : ' '.$eventarray[0]['label']);
2534 }
2535 if ($more) {
2536 if (empty($title)) {
2537 $title = 'Dolibarr actions '.$mysoc->name.' - '.$more;
2538 }
2539 $desc = $more;
2540 $desc .= ' ('.$mysoc->name.' - built by Dolibarr)';
2541 } else {
2542 if (empty($title)) {
2543 $title = $langs->transnoentities("Events").' '.$mysoc->name;
2544 }
2545 $desc = $langs->transnoentities('ListOfActions');
2546 $desc .= ' ('.$mysoc->name.' - built by Dolibarr)';
2547 }
2548
2549 // Create temp file
2550 $outputfiletmp = tempnam($conf->agenda->dir_temp, 'tmp'); // Temporary file (allow call of function by different threads
2551 dolChmod($outputfiletmp);
2552
2553 // Write file
2554 if ($format == 'vcal') {
2555 $result = build_calfile($format, $title, $desc, $eventarray, $outputfiletmp);
2556 } elseif ($format == 'ical') {
2557 $result = build_calfile($format, $title, $desc, $eventarray, $outputfiletmp);
2558 } elseif ($format == 'rss') {
2559 $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp);
2560 }
2561
2562 if ($result >= 0) {
2563 if (dol_move($outputfiletmp, $outputfile, '0', 1, 0, 0)) {
2564 $result = 1;
2565 } else {
2566 $this->error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;
2567 dol_syslog(get_class($this)."::build_exportfile ".$this->error, LOG_ERR);
2568 dol_delete_file($outputfiletmp, 0, 1);
2569 $result = -1;
2570 }
2571 } else {
2572 dol_syslog(get_class($this)."::build_exportfile build_xxxfile function fails to for format=".$format." outputfiletmp=".$outputfile, LOG_ERR);
2573 dol_delete_file($outputfiletmp, 0, 1);
2574 $langs->load("errors");
2575 $this->error = $langs->trans("ErrorFailToCreateFile", $outputfile);
2576 }
2577 }
2578
2579 return $result;
2580 }
2581
2589 public function initAsSpecimen()
2590 {
2591 global $user;
2592
2593 $now = dol_now();
2594
2595 // Initialise parameters
2596 $this->id = 0;
2597 $this->specimen = 1;
2598
2599 $this->type_code = 'AC_OTH';
2600 $this->code = 'AC_SPECIMEN_CODE';
2601 $this->label = 'Label of event Specimen';
2602 $this->datec = $now;
2603 $this->datem = $now;
2604 $this->datep = $now;
2605 $this->datef = $now;
2606 $this->fulldayevent = 0;
2607 $this->percentage = 0;
2608 $this->status = 0;
2609 $this->location = 'Location';
2610 $this->transparency = 1; // 1 means opaque
2611 $this->priority = 1;
2612 //$this->note_public = "This is a 'public' note.";
2613 $this->note_private = "This is a 'private' note.";
2614
2615 $this->userownerid = $user->id;
2616 $this->userassigned[$user->id] = array('id' => $user->id, 'transparency' => 1);
2617 return 1;
2618 }
2619
2628 public static function replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
2629 {
2630 $tables = array(
2631 'actioncomm'
2632 );
2633
2634 return CommonObject::commonReplaceThirdparty($dbs, $origin_id, $dest_id, $tables);
2635 }
2636
2645 public static function replaceProduct(DoliDB $dbs, $origin_id, $dest_id)
2646 {
2647 $sql = 'UPDATE ' . MAIN_DB_PREFIX . 'actioncomm SET fk_element = ' . ((int) $dest_id) . ' WHERE elementtype="product" AND fk_element = '.((int) $origin_id);
2648 // using $dbs, not $this->db because function is static
2649 if (!$dbs->query($sql)) {
2650 //$this->errors = $dbs->lasterror();
2651 return false;
2652 }
2653
2654 return true;
2655 }
2656
2662 public function hasDelay()
2663 {
2664 global $conf;
2665
2666 $now = dol_now();
2667
2668 return $this->datep && ($this->datep < ($now - $conf->agenda->warning_delay));
2669 }
2670
2671
2680 public function loadReminders($type = '', $fk_user = 0, $onlypast = true)
2681 {
2682 $error = 0;
2683
2684 $this->reminders = array();
2685
2686 //Select all action comm reminders for event
2687 $sql = "SELECT rowid as id, typeremind, dateremind, status, offsetvalue, offsetunit, fk_user, fk_email_template, lasterror";
2688 $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm_reminder";
2689 $sql .= " WHERE fk_actioncomm = ".((int) $this->id);
2690 if ($onlypast) {
2691 $sql .= " AND dateremind <= '".$this->db->idate(dol_now())."'";
2692 }
2693 if ($type) {
2694 $sql .= " AND typeremind = '".$this->db->escape($type)."'";
2695 }
2696 if ($fk_user > 0) {
2697 $sql .= " AND fk_user = ".((int) $fk_user);
2698 }
2699 if (!getDolGlobalString('AGENDA_REMINDER_EMAIL')) {
2700 $sql .= " AND typeremind <> 'email'";
2701 }
2702 if (!getDolGlobalString('AGENDA_REMINDER_BROWSER')) {
2703 $sql .= " AND typeremind <> 'browser'";
2704 }
2705
2706 $sql .= $this->db->order("dateremind", "ASC");
2707 $resql = $this->db->query($sql);
2708
2709 if ($resql) {
2710 while ($obj = $this->db->fetch_object($resql)) {
2711 $tmpactioncommreminder = new ActionCommReminder($this->db);
2712 $tmpactioncommreminder->id = $obj->id;
2713 $tmpactioncommreminder->typeremind = $obj->typeremind;
2714 $tmpactioncommreminder->dateremind = $this->db->jdate($obj->dateremind);
2715 $tmpactioncommreminder->offsetvalue = $obj->offsetvalue;
2716 $tmpactioncommreminder->offsetunit = $obj->offsetunit;
2717 $tmpactioncommreminder->status = $obj->status;
2718 $tmpactioncommreminder->fk_user = $obj->fk_user;
2719 $tmpactioncommreminder->fk_email_template = $obj->fk_email_template;
2720 $tmpactioncommreminder->lasterror = $obj->lasterror;
2721 $tmpactioncommreminder->fk_actioncomm = $this->id;
2722
2723 $this->reminders[$obj->id] = $tmpactioncommreminder;
2724 }
2725 } else {
2726 $this->error = $this->db->lasterror();
2727 $error++;
2728 }
2729
2730 return count($this->reminders);
2731 }
2732
2733
2740 public function sendEmailsReminder()
2741 {
2742 global $langs, $user;
2743
2744 $error = 0;
2745 $this->output = '';
2746 $this->error = '';
2747 $nbMailSend = 0;
2748 $errorsMsg = array();
2749
2750 if (!isModEnabled('agenda')) { // Should not happen. If module disabled, cron job should not be visible.
2751 $langs->load("agenda");
2752 $this->output = $langs->trans('ModuleNotEnabled', $langs->transnoentitiesnoconv("Agenda"));
2753 return 0;
2754 }
2755 if (!getDolGlobalString('AGENDA_REMINDER_EMAIL')) {
2756 $langs->load("agenda");
2757 $this->output = $langs->trans('EventRemindersByEmailNotEnabled', $langs->transnoentitiesnoconv("Agenda"));
2758 return 0;
2759 }
2760
2761 $now = dol_now();
2762 $actionCommReminder = new ActionCommReminder($this->db);
2763
2764 dol_syslog(__METHOD__." start", LOG_INFO);
2765
2766 $this->db->begin();
2767
2768 //Select all action comm reminders
2769 $sql = "SELECT rowid as id FROM ".MAIN_DB_PREFIX."actioncomm_reminder";
2770 $sql .= " WHERE typeremind = 'email'";
2771 $sql .= " AND status = 0"; // 0=No yet sent, -1=Error. TODO Include reminder in error once we can count number of error, so we can try 5 times and not more on errors.
2772 $sql .= " AND dateremind <= '".$this->db->idate($now)."'";
2773 $sql .= " AND entity IN (".getEntity('actioncomm').")";
2774 $sql .= $this->db->order("dateremind", "ASC");
2775 $resql = $this->db->query($sql);
2776
2777 if ($resql) {
2778 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
2779 $formmail = new FormMail($this->db);
2780 $to = null; // Ensure 'to' is defined for static analysis
2781
2782 while ($obj = $this->db->fetch_object($resql)) {
2783 $res = $actionCommReminder->fetch($obj->id);
2784 if ($res < 0) {
2785 $error++;
2786 $errorsMsg[] = "Failed to load invoice ActionComm Reminder";
2787 }
2788
2789 if (!$error) {
2790 //Select email template
2791 $arraymessage = $formmail->getEMailTemplate($this->db, 'actioncomm_send', $user, $langs, (!empty($actionCommReminder->fk_email_template)) ? $actionCommReminder->fk_email_template : -1, 1);
2792
2793 // Load event
2794 $res = $this->fetch($actionCommReminder->fk_actioncomm);
2795 if ($res > 0) {
2796 // PREPARE EMAIL
2797 $errormesg = '';
2798 $this->fetch_thirdparty();
2799
2800 // Make substitution in email content
2801 $substitutionarray = getCommonSubstitutionArray($langs, 0, null, $this);
2802
2803 complete_substitutions_array($substitutionarray, $langs, $this);
2804
2805 // Content
2806 $sendContent = make_substitutions($langs->trans($arraymessage->content), $substitutionarray);
2807
2808 // Topic
2809 $sendTopic = (!empty($arraymessage->topic)) ? $arraymessage->topic : $langs->transnoentitiesnoconv('EventReminder');
2810 $sendTopic = make_substitutions($sendTopic, $substitutionarray);
2811
2812 // Recipient
2813 $recipient = new User($this->db);
2814 $res = $recipient->fetch($actionCommReminder->fk_user);
2815 if ($res > 0) {
2816 if (!empty($recipient->email)) {
2817 $to = $recipient->email;
2818 } else {
2819 $errormesg = "Failed to send remind to user id=" . $actionCommReminder->fk_user . ". No email defined for user.";
2820 $error++;
2821 }
2822 } else {
2823 $errormesg = "Failed to load recipient with user id=" . $actionCommReminder->fk_user;
2824 $error++;
2825 }
2826
2827 // Sender
2828 $from = getDolGlobalString('MAIN_MAIL_EMAIL_FROM');
2829 if (empty($from)) {
2830 $errormesg = "Failed to get sender into global setup MAIN_MAIL_EMAIL_FROM";
2831 $error++;
2832 }
2833
2834 if (!$error) {
2835 // Errors Recipient
2836 $errors_to = getDolGlobalString('MAIN_MAIL_ERRORS_TO');
2837
2838 // Mail Creation
2839 $cMailFile = new CMailFile($sendTopic, (string) $to, $from, $sendContent, array(), array(), array(), '', "", 0, 1, $errors_to, '', '', '', '', '');
2840
2841 // Sending Mail
2842 if ($cMailFile->sendfile()) {
2843 $nbMailSend++;
2844 } else {
2845 $errormesg = 'Failed to send email to: ' . $to . ' ' . $cMailFile->error . implode(',', $cMailFile->errors);
2846 $error++;
2847 }
2848 }
2849
2850 if (!$error) {
2851 $actionCommReminder->status = $actionCommReminder::STATUS_DONE;
2852
2853 $res = $actionCommReminder->update($user);
2854 if ($res < 0) {
2855 $errorsMsg[] = "Failed to update status to done of ActionComm Reminder";
2856 $error++;
2857 break; // This is to avoid to have this error on all the selected email. If we fails here for one record, it may fails for others. We must solve first.
2858 }
2859 } else {
2860 $actionCommReminder->status = $actionCommReminder::STATUS_ERROR;
2861 $actionCommReminder->lasterror = dol_trunc($errormesg, 128, 'right', 'UTF-8', 1);
2862
2863 $res = $actionCommReminder->update($user);
2864 if ($res < 0) {
2865 $errorsMsg[] = "Failed to update status to error of ActionComm Reminder";
2866 $error++;
2867 break; // This is to avoid to have this error on all the selected email. If we fails here for one record, it may fails for others. We must solve first.
2868 } else {
2869 $errorsMsg[] = $errormesg;
2870 }
2871 }
2872 } else {
2873 $errorsMsg[] = 'Failed to fetch record actioncomm with ID = '.$actionCommReminder->fk_actioncomm;
2874 $error++;
2875 }
2876 }
2877 }
2878 } else {
2879 $error++;
2880 }
2881
2882 if (!$error) {
2883 // Delete also very old past events (we do not keep more than 1 month record in past)
2884 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm_reminder";
2885 $sql .= " WHERE dateremind < '".$this->db->idate($now - (3600 * 24 * 32))."'";
2886 $sql .= " AND status = ".((int) $actionCommReminder::STATUS_DONE);
2887 $resql = $this->db->query($sql);
2888
2889 if (!$resql) {
2890 $errorsMsg[] = 'Failed to delete old reminders';
2891 //$error++; // If this fails, we must not rollback other SQL requests already done. Never mind.
2892 }
2893 }
2894
2895 if (!$error) {
2896 $this->output = 'Nb of emails sent : '.$nbMailSend;
2897 $this->db->commit();
2898
2899 dol_syslog(__METHOD__." end - ".$this->output, LOG_INFO);
2900
2901 return 0;
2902 } else {
2903 $this->db->commit(); // We commit also on error, to have the error message recorded.
2904 $this->error = 'Nb of emails sent : '.$nbMailSend.', '.(!empty($errorsMsg) ? implode(', ', $errorsMsg) : $error);
2905
2906 dol_syslog(__METHOD__." end - ".$this->error, LOG_INFO);
2907
2908 return $error;
2909 }
2910 }
2911
2918 public function sendSmsReminder()
2919 {
2920 global $langs, $user;
2921
2922 $error = 0;
2923 $this->output = '';
2924 $this->error = '';
2925 $nbSmsSent = 0;
2926 $errorsMsg = array();
2927
2928 if (!isModEnabled('agenda')) { // Should not happen. If module disabled, cron job should not be visible.
2929 $langs->load("agenda");
2930 $this->output = $langs->trans('ModuleNotEnabled', $langs->transnoentitiesnoconv("Agenda"));
2931 return 0;
2932 }
2933 if (!getDolGlobalString('AGENDA_REMINDER_SMS')) {
2934 $langs->load("agenda");
2935 $this->output = $langs->trans('EventRemindersBySmsNotEnabled', $langs->transnoentitiesnoconv("Agenda"));
2936 return 0;
2937 }
2938
2939 $now = dol_now();
2940 $actionCommReminder = new ActionCommReminder($this->db);
2941
2942 dol_syslog(__METHOD__." start", LOG_INFO);
2943
2944 $this->db->begin();
2945
2946 //Select all action comm reminders
2947 $sql = "SELECT rowid as id FROM ".MAIN_DB_PREFIX."actioncomm_reminder";
2948 $sql .= " WHERE typeremind = 'sms'";
2949 $sql .= " AND status = 0"; // 0=No yet sent, -1=Error. TODO Include reminder in error once we can count number of error, so we can try 5 times and not more on errors.
2950 $sql .= " AND dateremind <= '".$this->db->idate($now)."'";
2951 $sql .= " AND entity IN (".getEntity('actioncomm').")";
2952 $sql .= $this->db->order("dateremind", "ASC");
2953 $resql = $this->db->query($sql);
2954
2955 if ($resql) {
2956 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
2957 $formmail = new FormMail($this->db);
2958 $to = null; // Ensure 'to' is defined for static analysis
2959
2960 while ($obj = $this->db->fetch_object($resql)) {
2961 $res = $actionCommReminder->fetch($obj->id);
2962 if ($res < 0) {
2963 $error++;
2964 $errorsMsg[] = "Failed to load invoice ActionComm Reminder";
2965 }
2966
2967 if (!$error) {
2968 //Select email template
2969 $arraymessage = $formmail->getEMailTemplate($this->db, 'actioncomm_send', $user, $langs, (!empty($actionCommReminder->fk_email_template)) ? $actionCommReminder->fk_email_template : -1, 1);
2970
2971 // Load event
2972 $res = $this->fetch($actionCommReminder->fk_actioncomm);
2973 if ($res > 0) {
2974 // PREPARE SMS
2975 $errormesg = '';
2976 $this->fetch_thirdparty();
2977
2978 // Make substitution in email content
2979 $substitutionarray = getCommonSubstitutionArray($langs, 0, null, $this);
2980
2981 complete_substitutions_array($substitutionarray, $langs, $this);
2982
2983 // Content
2984 $sendContent = dol_string_nohtmltag(make_substitutions($langs->trans($arraymessage->content), $substitutionarray));
2985
2986 // Topic
2987 // $sendTopic = (!empty($arraymessage->topic)) ? $arraymessage->topic : html_entity_decode($langs->transnoentities('EventReminder'));
2988
2989 // Recipient
2990 $recipient = new User($this->db);
2991 $res = $recipient->fetch($actionCommReminder->fk_user);
2992 if ($res > 0) {
2993 if (!empty($recipient->user_mobile)) {
2994 $to = $recipient->user_mobile;
2995 } else {
2996 $errormesg = "Failed to send remind to user id=" . $actionCommReminder->fk_user . ". No email defined for user.";
2997 $error++;
2998 }
2999 } else {
3000 $errormesg = "Failed to load recipient with user id=" . $actionCommReminder->fk_user;
3001 $error++;
3002 }
3003
3004 // Sender
3005 $from = getDolGlobalString('MAIN_SMS_FROM');
3006 if (empty($from)) {
3007 $errormesg = "Failed to get sender into global setup MAIN_SMS_FROM";
3008 $error++;
3009 }
3010
3011 if (!$error) {
3012 // Errors Recipient
3013 // $errors_to = getDolGlobalString('MAIN_MAIL_ERRORS_TO');
3014
3015 // Sms Creation
3016 $CSMSFile = new CSMSFile((string) $to, $from, $sendContent, 0, 0, 3, 1);
3017
3018 // Sending Mail
3019 if ($CSMSFile->sendfile()) {
3020 $nbSmsSent++;
3021 } else {
3022 $errormesg = 'Failed to send email to: ' . $to . ' ' . $CSMSFile->error . implode(',', $CSMSFile->errors);
3023 $error++;
3024 }
3025 }
3026
3027 if (!$error) {
3028 $actionCommReminder->status = $actionCommReminder::STATUS_DONE;
3029
3030 $res = $actionCommReminder->update($user);
3031 if ($res < 0) {
3032 $errorsMsg[] = "Failed to update status to done of ActionComm Reminder";
3033 $error++;
3034 break; // This is to avoid to have this error on all the selected email. If we fails here for one record, it may fails for others. We must solve first.
3035 }
3036 } else {
3037 $actionCommReminder->status = $actionCommReminder::STATUS_ERROR;
3038 $actionCommReminder->lasterror = dol_trunc($errormesg, 128, 'right', 'UTF-8', 1);
3039
3040 $res = $actionCommReminder->update($user);
3041 if ($res < 0) {
3042 $errorsMsg[] = "Failed to update status to error of ActionComm Reminder";
3043 $error++;
3044 break; // This is to avoid to have this error on all the selected email. If we fails here for one record, it may fails for others. We must solve first.
3045 } else {
3046 $errorsMsg[] = $errormesg;
3047 }
3048 }
3049 } else {
3050 $errorsMsg[] = 'Failed to fetch record actioncomm with ID = '.$actionCommReminder->fk_actioncomm;
3051 $error++;
3052 }
3053 }
3054 }
3055 } else {
3056 $error++;
3057 }
3058
3059 if (!$error) {
3060 // Delete also very old past events (we do not keep more than 1 month record in past)
3061 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm_reminder";
3062 $sql .= " WHERE dateremind < '".$this->db->idate($now - (3600 * 24 * 32))."'";
3063 $sql .= " AND status = ".((int) $actionCommReminder::STATUS_DONE);
3064 $resql = $this->db->query($sql);
3065
3066 if (!$resql) {
3067 $errorsMsg[] = 'Failed to delete old reminders';
3068 //$error++; // If this fails, we must not rollback other SQL requests already done. Never mind.
3069 }
3070 }
3071
3072 if (!$error) {
3073 $this->output = 'Nb of SMS sent : '.$nbSmsSent;
3074 $this->db->commit();
3075 dol_syslog(__METHOD__." end - ".$this->output, LOG_INFO);
3076
3077 return 0;
3078 } else {
3079 $this->db->commit(); // We commit also on error, to have the error message recorded.
3080 $this->error = 'Nb of SMS sent : '.$nbSmsSent.', '.(!empty($errorsMsg) ? implode(', ', $errorsMsg) : $error);
3081 dol_syslog(__METHOD__." end - ".$this->error, LOG_INFO);
3082
3083 return $error;
3084 }
3085 }
3086
3095 public function updatePercent($id, $percent, $usermodid = 0)
3096 {
3097 $this->db->begin();
3098
3099 $sql = "UPDATE ".MAIN_DB_PREFIX."actioncomm ";
3100 $sql .= " SET percent = ".(int) $percent;
3101 if ($usermodid > 0) {
3102 $sql .= ", fk_user_mod = ".((int) $usermodid);
3103 }
3104 $sql .= " WHERE id = ".((int) $id);
3105
3106 if ($this->db->query($sql)) {
3107 $this->db->commit();
3108 return 1;
3109 } else {
3110 $this->db->rollback();
3111 $this->error = $this->db->lasterror();
3112 return -1;
3113 }
3114 }
3115}
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
global $dolibarr_main_url_root
$c
Definition line.php:331
$object ref
Definition info.php:90
Class to manage agenda events (actions)
const EVENT_FINISHED
Typical value for a event that is in a finished state.
hasDelay()
Is the action delayed?
build_exportfile($format, $type, $cachedelay, $filename, $filters, $exportholiday=0)
Export events from database into a cal file.
getTooltipContentArray($params)
getTooltipContentArray
update(User $user, $notrigger=0)
Update action into database If percentage = 100, on met a jour date 100%.
sendSmsReminder()
Send reminders by sms CAN BE A CRON TASK.
fetch_userassigned($override=true)
Initialize this->userassigned array with list of id of user assigned to event.
info($id)
Charge les information d'ordre info dans l'objet facture.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
const EVENT_IN_PROGRESS
Typical value for a event that is in a progress state.
sendEmailsReminder()
Send reminders by emails CAN BE A CRON TASK.
create(User $user, $notrigger=0)
Add an action/event into database.
const EVENT_TODO
Typical value for a event that is in a todo state.
setCategories($categories)
Sets object to supplied categories.
createFromClone(User $fuser, $socid)
Load an object from its id and create a new one in database.
getNomUrl($withpicto=0, $maxlength=0, $morecss='', $option='', $overwritepicto=0, $notooltip=0, $save_lastsearch_value=-1)
Return URL of event This uses $this->id, $this->type_code, $this->label and $this->type_label.
LibStatut($percent, $mode, $hidenastatus=0, $datestart='')
Return label of action status.
getActions($socid=0, $fk_element=0, $elementtype='', $filter='', $sortfield='a.datep', $sortorder='DESC', $limit=0)
Load all objects with filters.
load_board($user, $load_state_board=0)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
fetch($id, $ref='', $ref_ext='', $email_msgid='', $loadresources=1)
Load object from database.
updatePercent($id, $percent, $usermodid=0)
Update the percent value of a event with the given id.
getTypeLabel($mode=0)
Return label of type of event.
loadReminders($type='', $fk_user=0, $onlypast=true)
Load event reminder of events.
fetchResources()
Initialize $this->userassigned & this->socpeopleassigned array with list of id of user and contact as...
static replaceProduct(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a product id with another one.
getTypePicto($morecss='pictofixedwidth paddingright valignmiddle', $titlealt='')
Return Picto of type of event.
__construct(DoliDB $db)
Constructor.
initAsSpecimen()
Initialise an instance with random values.
$fields
Array with all fields and their property.
getLibStatut($mode, $hidenastatus=0)
Return the label of the status.
Class for ActionCommReminder.
Class to manage different types of events.
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
Class to send SMS Usage: $smsfile = new CSMSFile($subject,$sendto,$replyto,$message,...
Class to manage categories.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
fetch_thirdparty($force_thirdparty_id=0)
Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty.
setErrorsFromObject($object)
setErrorsFromObject
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
cloneCategories($fromId, $toId, $type='')
Copy related categories to another object.
Class to manage Dolibarr database access.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation du formulaire html d'envoi de mail unitaire Usage: $formail = new Form...
Class to manage hooks.
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Definition index.php:171
global $mysoc
dol_get_first_day($year, $month=1, $gm=false)
Return GMT time for first day of a month or year.
Definition date.lib.php:603
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
Definition date.lib.php:434
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:622
dol_move($srcfile, $destfile, $newmask='0', $overwriteifexists=1, $testvirus=0, $indexdatabase=1, $moreinfo=array(), $entity=null)
Move a file into another name.
dol_filemtime($pathoffile)
Return time of a file.
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_now($mode='gmt')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dolChmod($filepath, $newmask='')
Change mod of a file.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
dol_textishtml($msg, $option=0)
Return if a text is a html content.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
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...
query($query, $usesavepoint=0, $type='auto', $result_mode=0)
Execute a SQL request and return the resultset.
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',...
Definition repair.php:125
dol_hash($chain, $type='0', $nosalt=0, $mode=0)
Returns a hash (non reversible encryption) of a string.
build_calfile($format, $title, $desc, $events_array, $outputfile)
Build a file from an array of events All input params and data must be encoded in $conf->charset_outp...
Definition xcal.lib.php:36
build_rssfile($format, $title, $desc, $events_array, $outputfile, $filter='', $url='', $langcode='')
Build a file from an array of events.
Definition xcal.lib.php:326