dolibarr 19.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-2023 Frédéric France <frederic.france@netlogic.fr>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
29require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
30require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
32require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncommreminder.class.php';
33
34
39{
43 public $element = 'action';
44
48 public $table_element = 'actioncomm';
49
53 public $table_rowid = 'id';
54
58 public $picto = 'action';
59
63 public $ismultientitymanaged = 1;
64
70 public $restrictiononfksoc = 2;
71
75 public $id;
76
80 public $ref;
81
86 public $type_id;
87
92 public $type;
93
98 public $type_code;
99
103 public $type_label;
104
108 public $type_color;
109
113 public $type_picto;
114
119 public $code;
120
124 public $label;
125
130 public $libelle;
131
135 public $datec;
136
140 public $duree;
141
145 public $datem;
146
152 public $author;
153
159 public $usermod;
160
164 public $authorid;
165
169 public $usermodid;
170
174 public $datep;
175
179 public $datef;
180
184 public $date_start_in_calendar;
185
189 public $date_end_in_calendar;
190
194 public $datep2;
195
200 public $durationp = -1;
201
205 public $fulldayevent = 0;
206
210 public $ponctuel;
211
215 public $percentage;
216
220 public $location;
221
225 public $transparency;
226
230 public $priority;
231
235 public $userassigned = array();
236
240 public $userownerid;
241
245 public $userdoneid;
246
250 public $socpeopleassigned = array();
251
255 public $otherassigned = array();
256
260 public $reminders = array();
261
265 public $socid;
266
270 public $contact_id;
271
272
278 public $societe;
279
285 public $contact;
286
287 // Properties for links to other objects
291 public $fk_element; // Id of record
292
296 public $elementid;
297
301 public $elementtype;
302
306 public $fk_bookcal_calendar;
307
311 public $icalname;
312
316 public $icalcolor;
317
321 public $extraparams;
322
326 public $actions = array();
327
331 public $email_msgid;
332
336 public $email_from;
337
341 public $email_sender;
342
346 public $email_to;
347
351 public $email_tocc;
355 public $email_tobcc;
356
360 public $email_subject;
361
365 public $errors_to;
366
370 public $num_vote;
371
375 public $event_paid;
376
380 public $status;
381
385 public $recurid; /* A string YYYYMMDDHHMMSS shared by allevent of same serie */
386 public $recurrule; /* Rule of recurring */
387 public $recurdateend; /* Repeat until this date */
388
389 public $calling_duration;
390
391
395 const EVENT_TODO = 0;
396
401
405 const EVENT_FINISHED = 100;
406
407
408 public $fields = array();
409
410
416 public function __construct(DoliDB $db)
417 {
418 $this->db = $db;
419 }
420
429 public function create(User $user, $notrigger = 0)
430 {
431 global $langs, $conf;
432
433 $error = 0;
434 $now = dol_now();
435
436 // Check parameters
437 if (!isset($this->userownerid) || (string) $this->userownerid === '') { // $this->userownerid may be 0 (anonymous event) or > 0
438 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);
439 $this->errors[] = 'ErrorActionCommPropertyUserowneridNotDefined';
440 return -1;
441 }
442
443 // Clean parameters
444 $this->label = dol_trunc(trim($this->label), 128);
445 $this->location = dol_trunc(trim($this->location), 128);
446 $this->note_private = dol_htmlcleanlastbr(trim(empty($this->note_private) ? $this->note : $this->note_private));
447 if (empty($this->percentage)) {
448 $this->percentage = 0;
449 }
450 if (empty($this->priority) || !is_numeric($this->priority)) {
451 $this->priority = 0;
452 }
453 if (empty($this->fulldayevent)) {
454 $this->fulldayevent = 0;
455 }
456 if (empty($this->transparency)) {
457 $this->transparency = 0;
458 }
459 if ($this->percentage > 100) {
460 $this->percentage = 100;
461 }
462 if (empty($this->datep) && $this->datep != '0') { // We should not insert event in calendar without a start date
463 $this->datep = $now;
464 }
465 if (!empty($this->datep) && !empty($this->datef)) {
466 $this->durationp = ($this->datef - $this->datep); // deprecated
467 }
468 if (!empty($this->datep) && !empty($this->datef) && $this->datep > $this->datef) {
469 $this->datef = $this->datep;
470 }
471 if (!isset($this->fk_project) || $this->fk_project < 0) {
472 $this->fk_project = 0;
473 }
474 // For backward compatibility
475 if ($this->elementtype == 'facture') {
476 $this->elementtype = 'invoice';
477 }
478 if ($this->elementtype == 'commande') {
479 $this->elementtype = 'order';
480 }
481 if ($this->elementtype == 'contrat') {
482 $this->elementtype = 'contract';
483 }
484 if (empty($this->fk_element) && !empty($this->elementid)) {
485 $this->fk_element = $this->elementid;
486 }
487
488 if (!is_array($this->userassigned) && !empty($this->userassigned)) { // For backward compatibility when userassigned was an int instead of an array
489 $tmpid = (int) $this->userassigned;
490 $this->userassigned = array();
491 $this->userassigned[$tmpid] = array('id'=>$tmpid, 'transparency'=>$this->transparency);
492 }
493
494 $userownerid = $this->userownerid;
495 $userdoneid = $this->userdoneid;
496
497 // Be sure assigned user is defined as an array of array('id'=>,'mandatory'=>,...).
498 if (empty($this->userassigned) || count($this->userassigned) == 0 || !is_array($this->userassigned)) {
499 $this->userassigned = array($userownerid=>array('id'=>$userownerid, 'transparency'=>$this->transparency));
500 }
501
502 if (!$this->type_id || !$this->type_code) {
503 $key = empty($this->type_id) ? $this->type_code : $this->type_id;
504
505 // Get id from code
506 $cactioncomm = new CActionComm($this->db);
507 $result = $cactioncomm->fetch($key);
508
509 if ($result > 0) {
510 $this->type_id = $cactioncomm->id;
511 $this->type_code = $cactioncomm->code;
512 } elseif ($result == 0) {
513 $this->error = $langs->trans('ErrorActionCommBadType', $this->type_id, $this->type_code);
514 return -1;
515 } else {
516 $this->error = $cactioncomm->error;
517 return -1;
518 }
519 }
520 $code = empty($this->code) ? $this->type_code : $this->code;
521
522 // Check parameters
523 if (!$this->type_id) {
524 $this->error = "ErrorWrongParameters";
525 return -1;
526 }
527
528 $this->db->begin();
529
530 $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm";
531 $sql .= "(ref,";
532 $sql .= "datec,";
533 $sql .= "datep,";
534 $sql .= "datep2,";
535 $sql .= "durationp,"; // deprecated
536 $sql .= "fk_action,";
537 $sql .= "code,";
538 $sql .= "ref_ext,";
539 $sql .= "fk_soc,";
540 $sql .= "fk_project,";
541 $sql .= "note,";
542 $sql .= "fk_contact,";
543 $sql .= "fk_user_author,";
544 $sql .= "fk_user_action,";
545 $sql .= "fk_user_done,";
546 $sql .= "label,percent,priority,fulldayevent,location,";
547 $sql .= "transparency,";
548 $sql .= "fk_element,";
549 $sql .= "elementtype,";
550 $sql .= "fk_bookcal_calendar,";
551 $sql .= "entity,";
552 $sql .= "extraparams,";
553 // Fields emails
554 $sql .= "email_msgid,";
555 $sql .= "email_from,";
556 $sql .= "email_sender,";
557 $sql .= "email_to,";
558 $sql .= "email_tocc,";
559 $sql .= "email_tobcc,";
560 $sql .= "email_subject,";
561 $sql .= "errors_to,";
562 $sql .= "recurid,";
563 $sql .= "recurrule,";
564 $sql .= "recurdateend,";
565 $sql .= "num_vote,";
566 $sql .= "event_paid,";
567 $sql .= "status,";
568 $sql .= "ip";
569 $sql .= ") VALUES (";
570 $sql .= "'(PROV)', ";
571 $sql .= "'".$this->db->idate($now)."', "; // date creation
572 $sql .= "'".$this->db->idate($this->datep)."', "; // date start event
573 $sql .= (strval($this->datef) != '' ? "'".$this->db->idate($this->datef)."'" : "null").", ";
574 $sql .= ((isset($this->durationp) && $this->durationp >= 0 && $this->durationp != '') ? "'".$this->db->escape($this->durationp)."'" : "null").", "; // deprecated
575 $sql .= (isset($this->type_id) ? $this->type_id : "null").",";
576 $sql .= ($code ? ("'".$this->db->escape($code)."'") : "null").", ";
577 $sql .= (!empty($this->ref_ext) ? "'".$this->db->escape($this->ref_ext)."'" : "null").", ";
578 $sql .= ((isset($this->socid) && $this->socid > 0) ? ((int) $this->socid) : "null").", ";
579 $sql .= ((isset($this->fk_project) && $this->fk_project > 0) ? ((int) $this->fk_project) : "null").", ";
580 $sql .= " '".$this->db->escape($this->note_private)."', ";
581 $sql .= ((isset($this->contact_id) && $this->contact_id > 0) ? ((int) $this->contact_id) : "null").", "; // deprecated, use ->socpeopleassigned
582 $sql .= (isset($user->id) && $user->id > 0 ? $user->id : "null").", ";
583 $sql .= ($userownerid > 0 ? $userownerid : "null").", ";
584 $sql .= ($userdoneid > 0 ? $userdoneid : "null").", ";
585 $sql .= "'".$this->db->escape($this->label)."', ";
586 $sql .= "'".$this->db->escape($this->percentage)."', ";
587 $sql .= "'".$this->db->escape($this->priority)."', ";
588 $sql .= "'".$this->db->escape($this->fulldayevent)."', ";
589 $sql .= "'".$this->db->escape($this->location)."', ";
590 $sql .= "'".$this->db->escape($this->transparency)."', ";
591 $sql .= (!empty($this->fk_element) ? ((int) $this->fk_element) : "null").", ";
592 $sql .= (!empty($this->elementtype) ? "'".$this->db->escape($this->elementtype)."'" : "null").", ";
593 $sql .= (!empty($this->fk_bookcal_calendar) ? "'".$this->db->escape($this->fk_bookcal_calendar)."'" : "null").", ";
594 $sql .= ((int) $conf->entity).",";
595 $sql .= (!empty($this->extraparams) ? "'".$this->db->escape($this->extraparams)."'" : "null").", ";
596 // Fields emails
597 $sql .= (!empty($this->email_msgid) ? "'".$this->db->escape($this->email_msgid)."'" : "null").", ";
598 $sql .= (!empty($this->email_from) ? "'".$this->db->escape($this->email_from)."'" : "null").", ";
599 $sql .= (!empty($this->email_sender) ? "'".$this->db->escape($this->email_sender)."'" : "null").", ";
600 $sql .= (!empty($this->email_to) ? "'".$this->db->escape($this->email_to)."'" : "null").", ";
601 $sql .= (!empty($this->email_tocc) ? "'".$this->db->escape($this->email_tocc)."'" : "null").", ";
602 $sql .= (!empty($this->email_tobcc) ? "'".$this->db->escape($this->email_tobcc)."'" : "null").", ";
603 $sql .= (!empty($this->email_subject) ? "'".$this->db->escape($this->email_subject)."'" : "null").", ";
604 $sql .= (!empty($this->errors_to) ? "'".$this->db->escape($this->errors_to)."'" : "null").", ";
605 $sql .= (!empty($this->recurid) ? "'".$this->db->escape($this->recurid)."'" : "null").", ";
606 $sql .= (!empty($this->recurrule) ? "'".$this->db->escape($this->recurrule)."'" : "null").", ";
607 $sql .= (!empty($this->recurdateend) ? "'".$this->db->idate($this->recurdateend)."'" : "null").", ";
608 $sql .= (!empty($this->num_vote) ? (int) $this->num_vote : "null").", ";
609 $sql .= (!empty($this->event_paid) ? (int) $this->event_paid : 0).", ";
610 $sql .= (!empty($this->status) ? (int) $this->status : "0").", ";
611 $sql .= (!empty($this->ip) ? "'".$this->db->escape($this->ip)."'" : "null");
612 $sql .= ")";
613
614 dol_syslog(get_class($this)."::add", LOG_DEBUG);
615 $resql = $this->db->query($sql);
616 if ($resql) {
617 $this->ref = $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."actioncomm", "id");
618 $sql = "UPDATE ".MAIN_DB_PREFIX."actioncomm SET ref='".$this->db->escape($this->ref)."' WHERE id=".$this->id;
619 $resql = $this->db->query($sql);
620 if (!$resql) {
621 $error++;
622 dol_syslog('Error to process ref: '.$this->db->lasterror(), LOG_ERR);
623 $this->errors[] = $this->db->lasterror();
624 }
625 // Now insert assigned users
626 if (!$error) {
627 //dol_syslog(var_export($this->userassigned, true));
628 $already_inserted = array();
629 foreach ($this->userassigned as $key => $val) {
630 // Common value with new behavior is to have $val = array('id'=>iduser, 'transparency'=>0|1) and $this->userassigned is an array of iduser => $val.
631 if (!is_array($val)) { // For backward compatibility when $val='id'.
632 $val = array('id'=>$val);
633 }
634
635 if ($val['id'] > 0) {
636 if (!empty($already_inserted[$val['id']])) {
637 continue;
638 }
639
640 $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element, mandatory, transparency, answer_status)";
641 $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'])).")";
642
643 $resql = $this->db->query($sql);
644 if (!$resql) {
645 $error++;
646 dol_syslog('Error to process userassigned: ' . $this->db->lasterror(), LOG_ERR);
647 $this->errors[] = $this->db->lasterror();
648 } else {
649 $already_inserted[$val['id']] = true;
650 }
651 //var_dump($sql);exit;
652 }
653 }
654 }
655
656 if (!$error) {
657 if (!empty($this->socpeopleassigned)) {
658 $already_inserted = array();
659 foreach ($this->socpeopleassigned as $id => $val) {
660 // Common value with new behavior is to have $this->socpeopleassigned an array of idcontact => dummyvalue
661 if (!empty($already_inserted[$id])) {
662 continue;
663 }
664
665 $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element, mandatory, transparency, answer_status)";
666 $sql .= " VALUES(".((int) $this->id).", 'socpeople', ".((int) $id).", 0, 0, 0)";
667
668 $resql = $this->db->query($sql);
669 if (!$resql) {
670 $error++;
671 dol_syslog('Error to process socpeopleassigned: ' . $this->db->lasterror(), LOG_ERR);
672 $this->errors[] = $this->db->lasterror();
673 } else {
674 $already_inserted[$id] = true;
675 }
676 }
677 }
678 }
679
680 if (!$error) {
681 // Actions on extra fields
682 $result = $this->insertExtraFields();
683 if ($result < 0) {
684 $error++;
685 }
686 }
687
688 if (!$error && !$notrigger) {
689 // Call trigger
690 $result = $this->call_trigger('ACTION_CREATE', $user);
691 if ($result < 0) {
692 $error++;
693 }
694 // End call triggers
695 }
696
697 if (!$error) {
698 $this->db->commit();
699 return $this->id;
700 } else {
701 $this->db->rollback();
702 return -1;
703 }
704 } else {
705 $this->db->rollback();
706 $this->error = $this->db->lasterror();
707 return -1;
708 }
709 }
710
718 public function createFromClone(User $fuser, $socid)
719 {
720 global $hookmanager;
721
722 $error = 0;
723
724 $this->db->begin();
725
726 // Load source object
727 $objFrom = clone $this;
728
729 // Retrieve all extrafield
730 // fetch optionals attributes and labels
731 $this->fetch_optionals();
732
733 //$this->fetch_userassigned();
734 $this->fetchResources();
735
736 $this->id = 0;
737 $this->recurid = '';
738 $this->recurrule = '';
739 $this->recurdateend = '';
740
741 // Create clone
742 $this->context['createfromclone'] = 'createfromclone';
743 $result = $this->create($fuser);
744 if ($result < 0) {
745 $error++;
746 }
747
748 if (!$error) {
749 // Hook of thirdparty module
750 if (is_object($hookmanager)) {
751 $parameters = array('objFrom'=>$objFrom);
752 $action = '';
753 $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
754 if ($reshook < 0) {
755 $this->setErrorsFromObject($hookmanager);
756 $error++;
757 }
758 }
759
760 // Call trigger
761 $result = $this->call_trigger('ACTION_CLONE', $fuser);
762 if ($result < 0) {
763 $error++;
764 }
765 // End call triggers
766 }
767
768 unset($this->context['createfromclone']);
769
770 // End
771 if (!$error) {
772 $this->db->commit();
773 return $this->id;
774 } else {
775 $this->db->rollback();
776 return -1;
777 }
778 }
779
790 public function fetch($id, $ref = '', $ref_ext = '', $email_msgid = '', $loadresources = 1)
791 {
792 global $langs;
793
794 if (empty($id) && empty($ref) && empty($ref_ext) && empty($email_msgid)) {
795 dol_syslog(get_class($this)."::fetch Bad parameters", LOG_WARNING);
796 return -1;
797 }
798
799 $sql = "SELECT a.id,";
800 $sql .= " a.ref as ref,";
801 $sql .= " a.entity,";
802 $sql .= " a.ref_ext,";
803 $sql .= " a.datep,";
804 $sql .= " a.datep2,";
805 $sql .= " a.durationp,"; // deprecated
806 $sql .= " a.datec,";
807 $sql .= " a.tms as datem,";
808 $sql .= " a.code, a.label, a.note as note_private,";
809 $sql .= " a.fk_soc,";
810 $sql .= " a.fk_project,";
811 $sql .= " a.fk_user_author, a.fk_user_mod,";
812 $sql .= " a.fk_user_action, a.fk_user_done,";
813 $sql .= " a.fk_contact, a.percent as percentage,";
814 $sql .= " a.fk_element as elementid, a.elementtype,";
815 $sql .= " a.priority, a.fulldayevent, a.location, a.transparency,";
816 $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,";
817 $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,";
818 $sql .= " s.nom as socname,";
819 $sql .= " u.firstname, u.lastname as lastname,";
820 $sql .= " num_vote, event_paid, a.status";
821 $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a ";
822 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_actioncomm as c ON a.fk_action=c.id ";
823 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_author";
824 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on s.rowid = a.fk_soc";
825 $sql .= " WHERE ";
826 if ($ref) {
827 $sql .= " a.ref = '".$this->db->escape($ref)."'";
828 } elseif ($ref_ext) {
829 $sql .= " a.ref_ext = '".$this->db->escape($ref_ext)."'";
830 } elseif ($email_msgid) {
831 $sql .= " a.email_msgid = '".$this->db->escape($email_msgid)."'";
832 } else {
833 $sql .= " a.id = ".((int) $id);
834 }
835
836 dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
837 $resql = $this->db->query($sql);
838 if ($resql) {
839 $num = $this->db->num_rows($resql);
840 if ($num) {
841 $obj = $this->db->fetch_object($resql);
842
843 $this->id = $obj->id;
844 $this->entity = $obj->entity;
845 $this->ref = $obj->ref;
846 $this->ref_ext = $obj->ref_ext;
847
848 // Properties of parent table llx_c_actioncomm
849 $this->type_id = $obj->type_id;
850 $this->type_code = $obj->type_code;
851 $this->type_color = $obj->type_color;
852 $this->type_picto = $obj->type_picto;
853 $this->type = $obj->type_type;
854
855 $this->code = $obj->code;
856 $this->label = $obj->label;
857 $this->datep = $this->db->jdate($obj->datep);
858 $this->datef = $this->db->jdate($obj->datep2);
859
860 $this->datec = $this->db->jdate($obj->datec);
861 $this->datem = $this->db->jdate($obj->datem);
862
863 $this->note = $obj->note_private; // deprecated
864 $this->note_private = $obj->note_private;
865 $this->percentage = $obj->percentage;
866
867 $this->authorid = $obj->fk_user_author;
868 $this->usermodid = $obj->fk_user_mod;
869
870 if (!is_object($this->author)) {
871 $this->author = new User($this->db); // To avoid warning
872 }
873 $this->author->id = $obj->fk_user_author; // deprecated
874 $this->author->firstname = $obj->firstname; // deprecated
875 $this->author->lastname = $obj->lastname; // deprecated
876 if (!is_object($this->usermod)) {
877 $this->usermod = new User($this->db); // To avoid warning
878 }
879 $this->usermod->id = $obj->fk_user_mod; // deprecated
880
881 $this->userownerid = $obj->fk_user_action;
882 $this->priority = $obj->priority;
883 $this->fulldayevent = $obj->fulldayevent;
884 $this->location = $obj->location;
885 $this->transparency = $obj->transparency;
886
887 $this->socid = $obj->fk_soc; // To have fetch_thirdparty method working
888 $this->contact_id = $obj->fk_contact; // To have fetch_contact method working
889 $this->fk_project = $obj->fk_project; // To have fetch_projet method working
890
891 //$this->societe->id = $obj->fk_soc; // deprecated
892 //$this->contact->id = $obj->fk_contact; // deprecated
893
894 $this->fk_element = $obj->elementid;
895 $this->elementid = $obj->elementid;
896 $this->elementtype = $obj->elementtype;
897
898 $this->num_vote = $obj->num_vote;
899 $this->event_paid = $obj->event_paid;
900 $this->status = $obj->status;
901
902 //email information
903 $this->email_msgid=$obj->email_msgid;
904 $this->email_from=$obj->email_from;
905 $this->email_sender=$obj->email_sender;
906 $this->email_to=$obj->email_to;
907 $this->email_tocc=$obj->email_tocc;
908 $this->email_tobcc=$obj->email_tobcc;
909 $this->email_subject=$obj->email_subject;
910 $this->errors_to=$obj->errors_to;
911
912 $this->fetch_optionals();
913
914 if ($loadresources) {
915 $this->fetchResources();
916 }
917 }
918
919 $this->db->free($resql);
920 } else {
921 $this->error = $this->db->lasterror();
922 return -1;
923 }
924
925 return $num;
926 }
927
933 public function fetchResources()
934 {
935 $this->userassigned = array();
936 $this->socpeopleassigned = array();
937
938 $sql = 'SELECT fk_actioncomm, element_type, fk_element, answer_status, mandatory, transparency';
939 $sql .= ' FROM '.MAIN_DB_PREFIX.'actioncomm_resources';
940 $sql .= ' WHERE fk_actioncomm = '.((int) $this->id);
941 $sql .= " AND element_type IN ('user', 'socpeople')";
942 $resql = $this->db->query($sql);
943 if ($resql) {
944 // If owner is known, we must but id first into list
945 if ($this->userownerid > 0) {
946 $this->userassigned[$this->userownerid] = array('id'=>$this->userownerid); // Set first so will be first into list.
947 }
948
949 while ($obj = $this->db->fetch_object($resql)) {
950 if ($obj->fk_element > 0) {
951 switch ($obj->element_type) {
952 case 'user':
953 $this->userassigned[$obj->fk_element] = array('id'=>$obj->fk_element, 'mandatory'=>$obj->mandatory, 'answer_status'=>$obj->answer_status, 'transparency'=>$obj->transparency);
954 if (empty($this->userownerid)) {
955 $this->userownerid = $obj->fk_element; // If not defined (should not happened, we fix this)
956 }
957 break;
958 case 'socpeople':
959 $this->socpeopleassigned[$obj->fk_element] = array('id'=>$obj->fk_element, 'mandatory'=>$obj->mandatory, 'answer_status'=>$obj->answer_status, 'transparency'=>$obj->transparency);
960 break;
961 }
962 }
963 }
964
965 return 1;
966 } else {
967 dol_print_error($this->db);
968 return -1;
969 }
970 }
971
972 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
979 public function fetch_userassigned($override = true)
980 {
981 // phpcs:enable
982 $sql = "SELECT fk_actioncomm, element_type, fk_element, answer_status, mandatory, transparency";
983 $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm_resources";
984 $sql .= " WHERE element_type = 'user' AND fk_actioncomm = ".((int) $this->id);
985
986 $resql2 = $this->db->query($sql);
987 if ($resql2) {
988 $this->userassigned = array();
989
990 // If owner is known, we must but id first into list
991 if ($this->userownerid > 0) {
992 // Set first so will be first into list.
993 $this->userassigned[$this->userownerid] = array('id'=>$this->userownerid);
994 }
995
996 while ($obj = $this->db->fetch_object($resql2)) {
997 if ($obj->fk_element > 0) {
998 $this->userassigned[$obj->fk_element] = array('id'=>$obj->fk_element,
999 'mandatory'=>$obj->mandatory,
1000 'answer_status'=>$obj->answer_status,
1001 'transparency'=>$obj->transparency);
1002 }
1003
1004 if ($override === true) {
1005 // If not defined (should not happened, we fix this)
1006 if (empty($this->userownerid)) {
1007 $this->userownerid = $obj->fk_element;
1008 }
1009 }
1010 }
1011
1012 return 1;
1013 } else {
1014 dol_print_error($this->db);
1015 return -1;
1016 }
1017 }
1018
1026 public function delete($notrigger = 0)
1027 {
1028 global $user;
1029
1030 $error = 0;
1031
1032 dol_syslog(get_class($this)."::delete", LOG_DEBUG);
1033
1034 $this->db->begin();
1035
1036 // remove categorie association
1037 if (!$error) {
1038 $sql = "DELETE FROM ".MAIN_DB_PREFIX."categorie_actioncomm";
1039 $sql .= " WHERE fk_actioncomm=".((int) $this->id);
1040
1041 $res = $this->db->query($sql);
1042 if (!$res) {
1043 $this->error = $this->db->lasterror();
1044 $error++;
1045 }
1046 }
1047
1048 // remove actioncomm_resources
1049 if (!$error) {
1050 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm_resources";
1051 $sql .= " WHERE fk_actioncomm=".((int) $this->id);
1052
1053 $res = $this->db->query($sql);
1054 if (!$res) {
1055 $this->error = $this->db->lasterror();
1056 $error++;
1057 }
1058 }
1059
1060 if (!$error) {
1061 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm_reminder";
1062 $sql .= " WHERE fk_actioncomm = ".((int) $this->id);
1063
1064 $res = $this->db->query($sql);
1065 if (!$res) {
1066 $this->error = $this->db->lasterror();
1067 $error++;
1068 }
1069 }
1070
1071 // Removed extrafields
1072 if (!$error) {
1073 $result = $this->deleteExtraFields();
1074 if ($result < 0) {
1075 $error++;
1076 dol_syslog(get_class($this)."::delete error -3 ".$this->error, LOG_ERR);
1077 }
1078 }
1079
1080 // remove actioncomm
1081 if (!$error) {
1082 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm";
1083 $sql .= " WHERE id=".((int) $this->id);
1084
1085 $res = $this->db->query($sql);
1086 if (!$res) {
1087 $this->error = $this->db->lasterror();
1088 $error++;
1089 }
1090 }
1091
1092 if (!$error) {
1093 if (!$notrigger) {
1094 // Call trigger
1095 $result = $this->call_trigger('ACTION_DELETE', $user);
1096 if ($result < 0) {
1097 $error++;
1098 }
1099 // End call triggers
1100 }
1101
1102 if (!$error) {
1103 $this->db->commit();
1104 return 1;
1105 } else {
1106 $this->db->rollback();
1107 return -2;
1108 }
1109 } else {
1110 $this->db->rollback();
1111 $this->error = $this->db->lasterror();
1112 return -1;
1113 }
1114 }
1115
1124 public function update(User $user, $notrigger = 0)
1125 {
1126 global $langs, $conf, $hookmanager;
1127
1128 $error = 0;
1129
1130 // Clean parameters
1131 $this->label = trim($this->label);
1132 $this->note_private = dol_htmlcleanlastbr(trim(!isset($this->note_private) ? $this->note : $this->note_private));
1133 if (empty($this->percentage)) {
1134 $this->percentage = 0;
1135 }
1136 if (empty($this->priority) || !is_numeric($this->priority)) {
1137 $this->priority = 0;
1138 }
1139 if (empty($this->transparency)) {
1140 $this->transparency = 0;
1141 }
1142 if (empty($this->fulldayevent)) {
1143 $this->fulldayevent = 0;
1144 }
1145 if ($this->percentage > 100) {
1146 $this->percentage = 100;
1147 }
1148 //if ($this->percentage == 100 && ! $this->dateend) $this->dateend = $this->date;
1149 if ($this->datep && $this->datef) {
1150 $this->durationp = ($this->datef - $this->datep); // deprecated
1151 }
1152 //if ($this->date && $this->dateend) $this->durationa=($this->dateend - $this->date);
1153 if ($this->datep && $this->datef && $this->datep > $this->datef) {
1154 $this->datef = $this->datep;
1155 }
1156 //if ($this->date && $this->dateend && $this->date > $this->dateend) $this->dateend=$this->date;
1157 if ($this->fk_project < 0) {
1158 $this->fk_project = 0;
1159 }
1160
1161 // Check parameters
1162 if ($this->percentage == 0 && $this->userdoneid > 0) {
1163 $this->error = "ErrorCantSaveADoneUserWithZeroPercentage";
1164 return -1;
1165 }
1166
1167 $socid = (($this->socid > 0) ? $this->socid : 0);
1168 $contactid = (($this->contact_id > 0) ? $this->contact_id : 0);
1169 $userownerid = ($this->userownerid ? $this->userownerid : 0);
1170 $userdoneid = ($this->userdoneid ? $this->userdoneid : 0);
1171
1172 // If a type_id is set, we must also have the type_code set
1173 if ($this->type_id > 0) {
1174 if (empty($this->type_code)) {
1175 $cactioncomm = new CActionComm($this->db);
1176 $result = $cactioncomm->fetch($this->type_id);
1177 if ($result >= 0 && !empty($cactioncomm->code)) {
1178 $this->type_code = $cactioncomm->code;
1179 }
1180 }
1181 }
1182
1183 $code = $this->code;
1184 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
1185 $code = $this->type_code;
1186 }
1187
1188 $this->db->begin();
1189
1190 $sql = "UPDATE ".MAIN_DB_PREFIX."actioncomm";
1191 $sql .= " SET percent = '".$this->db->escape($this->percentage)."'";
1192 $sql .= ", fk_action = ".(int) $this->type_id;
1193 $sql .= ", code = " . ($code ? "'".$this->db->escape($code)."'" : "null");
1194 $sql .= ", label = ".($this->label ? "'".$this->db->escape($this->label)."'" : "null");
1195 $sql .= ", datep = ".(strval($this->datep) != '' ? "'".$this->db->idate($this->datep)."'" : 'null');
1196 $sql .= ", datep2 = ".(strval($this->datef) != '' ? "'".$this->db->idate($this->datef)."'" : 'null');
1197 $sql .= ", durationp = ".(isset($this->durationp) && $this->durationp >= 0 && $this->durationp != '' ? "'".$this->db->escape($this->durationp)."'" : "null"); // deprecated
1198 $sql .= ", note = '".$this->db->escape($this->note_private)."'";
1199 $sql .= ", fk_project =".($this->fk_project > 0 ? ((int) $this->fk_project) : "null");
1200 $sql .= ", fk_soc =".($socid > 0 ? ((int) $socid) : "null");
1201 $sql .= ", fk_contact =".($contactid > 0 ? ((int) $contactid) : "null");
1202 $sql .= ", priority = '".$this->db->escape($this->priority)."'";
1203 $sql .= ", fulldayevent = '".$this->db->escape($this->fulldayevent)."'";
1204 $sql .= ", location = ".($this->location ? "'".$this->db->escape($this->location)."'" : "null");
1205 $sql .= ", transparency = '".$this->db->escape($this->transparency)."'";
1206 $sql .= ", fk_user_mod = ".((int) $user->id);
1207 $sql .= ", fk_user_action = ".($userownerid > 0 ? ((int) $userownerid) : "null");
1208 $sql .= ", fk_user_done = ".($userdoneid > 0 ? ((int) $userdoneid) : "null");
1209 if (!empty($this->fk_element)) {
1210 $sql .= ", fk_element=".($this->fk_element ? ((int) $this->fk_element) : "null");
1211 }
1212 if (!empty($this->elementtype)) {
1213 $sql .= ", elementtype=".($this->elementtype ? "'".$this->db->escape($this->elementtype)."'" : "null");
1214 }
1215 if (!empty($this->num_vote)) {
1216 $sql .= ", num_vote=".($this->num_vote ? (int) $this->num_vote : null);
1217 }
1218 if (!empty($this->event_paid)) {
1219 $sql .= ", event_paid=".($this->event_paid ? (int) $this->event_paid : 0);
1220 }
1221 if (!empty($this->status)) {
1222 $sql .= ", status=".($this->status ? (int) $this->status : 0);
1223 }
1224 $sql .= " WHERE id=".((int) $this->id);
1225
1226 dol_syslog(get_class($this)."::update", LOG_DEBUG);
1227 if ($this->db->query($sql)) {
1228 $action = 'update';
1229
1230 // Actions on extra fields
1231 if (!$error) {
1232 $result = $this->insertExtraFields();
1233 if ($result < 0) {
1234 $error++;
1235 }
1236 }
1237
1238 // Now insert assignedusers
1239 if (!$error) {
1240 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm_resources where fk_actioncomm = ".((int) $this->id)." AND element_type = 'user'";
1241 $resql = $this->db->query($sql);
1242
1243 $already_inserted = array();
1244 foreach ($this->userassigned as $key => $val) {
1245 if (!is_array($val)) { // For backward compatibility when val=id
1246 $val = array('id'=>$val);
1247 }
1248 if (!empty($already_inserted[$val['id']])) {
1249 continue;
1250 }
1251
1252 $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element, mandatory, transparency, answer_status)";
1253 $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'])).")";
1254
1255 $resql = $this->db->query($sql);
1256 if (!$resql) {
1257 $error++;
1258 $this->errors[] = $this->db->lasterror();
1259 } else {
1260 $already_inserted[$val['id']] = true;
1261 }
1262 //var_dump($sql);exit;
1263 }
1264 }
1265
1266 if (!$error) {
1267 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm_resources where fk_actioncomm = ".((int) $this->id)." AND element_type = 'socpeople'";
1268 $resql = $this->db->query($sql);
1269
1270 if (!empty($this->socpeopleassigned)) {
1271 $already_inserted = array();
1272 foreach (array_keys($this->socpeopleassigned) as $key => $val) {
1273 if (!is_array($val)) { // For backward compatibility when val=id
1274 $val = array('id'=>$val);
1275 }
1276 if (!empty($already_inserted[$val['id']])) {
1277 continue;
1278 }
1279
1280 $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element, mandatory, transparency, answer_status)";
1281 $sql .= " VALUES(".((int) $this->id).", 'socpeople', ".((int) $val['id']).", 0, 0, 0)";
1282
1283 $resql = $this->db->query($sql);
1284 if (!$resql) {
1285 $error++;
1286 $this->errors[] = $this->db->lasterror();
1287 } else {
1288 $already_inserted[$val['id']] = true;
1289 }
1290 }
1291 }
1292 }
1293
1294 if (!$error && !$notrigger) {
1295 // Call trigger
1296 $result = $this->call_trigger('ACTION_MODIFY', $user);
1297 if ($result < 0) {
1298 $error++;
1299 }
1300 // End call triggers
1301 }
1302
1303 if (!$error) {
1304 $this->db->commit();
1305 return 1;
1306 } else {
1307 $this->db->rollback();
1308 dol_syslog(get_class($this)."::update ".join(',', $this->errors), LOG_ERR);
1309 return -2;
1310 }
1311 } else {
1312 $this->db->rollback();
1313 $this->error = $this->db->lasterror();
1314 return -1;
1315 }
1316 }
1317
1331 public function getActions($socid = 0, $fk_element = 0, $elementtype = '', $filter = '', $sortfield = 'a.datep', $sortorder = 'DESC', $limit = 0)
1332 {
1333 global $conf, $langs, $hookmanager;
1334
1335 $resarray = array();
1336
1337 dol_syslog(get_class()."::getActions", LOG_DEBUG);
1338
1339 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
1340 if (!is_object($hookmanager)) {
1341 include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
1342 $hookmanager = new HookManager($this->db);
1343 }
1344 $hookmanager->initHooks(array('agendadao'));
1345
1346 $sql = "SELECT a.id";
1347 $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
1348 // Fields from hook
1349 $parameters = array('sql' => &$sql, 'socid' => $socid, 'fk_element' => $fk_element, 'elementtype' => $elementtype);
1350 $reshook = $hookmanager->executeHooks('getActionsListFrom', $parameters); // Note that $action and $object may have been modified by hook
1351 if (!empty($hookmanager->resPrint)) {
1352 $sql.= $hookmanager->resPrint;
1353 }
1354 $sql .= " WHERE a.entity IN (".getEntity('agenda').")";
1355 if (!empty($socid)) {
1356 $sql .= " AND a.fk_soc = ".((int) $socid);
1357 }
1358 if (!empty($elementtype)) {
1359 if ($elementtype == 'project') {
1360 $sql .= ' AND a.fk_project = '.((int) $fk_element);
1361 } elseif ($elementtype == 'contact') {
1362 $sql .= ' AND a.id IN';
1363 $sql .= " (SELECT fk_actioncomm FROM ".MAIN_DB_PREFIX."actioncomm_resources WHERE";
1364 $sql .= " element_type = 'socpeople' AND fk_element = ".((int) $fk_element).')';
1365 } else {
1366 $sql .= " AND a.fk_element = ".((int) $fk_element)." AND a.elementtype = '".$this->db->escape($elementtype)."'";
1367 }
1368 }
1369 if (!empty($filter)) {
1370 $sql .= $filter;
1371 }
1372 // Fields where hook
1373 $parameters = array('sql' => &$sql, 'socid' => $socid, 'fk_element' => $fk_element, 'elementtype' => $elementtype);
1374 $reshook = $hookmanager->executeHooks('getActionsListWhere', $parameters); // Note that $action and $object may have been modified by hook
1375 if (!empty($hookmanager->resPrint)) {
1376 $sql.= $hookmanager->resPrint;
1377 }
1378 if ($sortorder && $sortfield) {
1379 $sql .= $this->db->order($sortfield, $sortorder);
1380 }
1381 $sql .= $this->db->plimit($limit, 0);
1382
1383 $resql = $this->db->query($sql);
1384 if ($resql) {
1385 $num = $this->db->num_rows($resql);
1386
1387 if ($num) {
1388 for ($i = 0; $i < $num; $i++) {
1389 $obj = $this->db->fetch_object($resql);
1390 $actioncommstatic = new ActionComm($this->db);
1391 $actioncommstatic->fetch($obj->id);
1392 $resarray[$i] = $actioncommstatic;
1393 }
1394 }
1395 $this->db->free($resql);
1396 return $resarray;
1397 } else {
1398 return $this->db->lasterror();
1399 }
1400 }
1401
1402 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1410 public function load_board($user, $load_state_board = 0)
1411 {
1412 // phpcs:enable
1413 global $conf, $langs;
1414
1415 if (empty($load_state_board)) {
1416 $sql = "SELECT a.id, a.datep as dp";
1417 } else {
1418 $this->nb = array();
1419 $sql = "SELECT count(a.id) as nb";
1420 }
1421 $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
1422 if (!$user->hasRight('societe', 'client', 'voir') && !$user->socid) {
1423 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON a.fk_soc = sc.fk_soc";
1424 }
1425 if (!$user->hasRight('agenda', 'allactions', 'read')) {
1426 $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);
1427 }
1428 $sql .= " WHERE 1 = 1";
1429 if (empty($load_state_board)) {
1430 $sql .= " AND a.percent >= 0 AND a.percent < 100";
1431 }
1432 $sql .= " AND a.entity IN (".getEntity('agenda').")";
1433 if (!$user->hasRight('societe', 'client', 'voir') && !$user->socid) {
1434 $sql .= " AND (a.fk_soc IS NULL OR sc.fk_user = ".((int) $user->id).")";
1435 }
1436 if ($user->socid) {
1437 $sql .= " AND a.fk_soc = ".((int) $user->socid);
1438 }
1439 if (!$user->hasRight('agenda', 'allactions', 'read')) {
1440 $sql .= " AND (a.fk_user_author = ".((int) $user->id)." OR a.fk_user_action = ".((int) $user->id)." OR a.fk_user_done = ".((int) $user->id);
1441 $sql .= " OR ar.fk_element = ".((int) $user->id);
1442 $sql .= ")";
1443 }
1444
1445 $resql = $this->db->query($sql);
1446 if ($resql) {
1447 if (empty($load_state_board)) {
1448 $agenda_static = new ActionComm($this->db);
1449 $response = new WorkboardResponse();
1450 $response->warning_delay = $conf->agenda->warning_delay / 60 / 60 / 24;
1451 $response->label = $langs->trans("ActionsToDo");
1452 $response->labelShort = $langs->trans("ActionsToDoShort");
1453 $response->url = DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&actioncode=0&status=todo&mainmenu=agenda';
1454 if ($user->hasRight("agenda", "allactions", "read")) {
1455 $response->url .= '&filtert=-1';
1456 }
1457 $response->img = img_object('', "action", 'class="inline-block valigntextmiddle"');
1458 }
1459 // This assignment in condition is not a bug. It allows walking the results.
1460 while ($obj = $this->db->fetch_object($resql)) {
1461 if (empty($load_state_board)) {
1462 $response->nbtodo++;
1463 $agenda_static->datep = $this->db->jdate($obj->dp);
1464 if ($agenda_static->hasDelay()) {
1465 $response->nbtodolate++;
1466 }
1467 } else {
1468 $this->nb["actionscomm"] = $obj->nb;
1469 }
1470 }
1471
1472 $this->db->free($resql);
1473 if (empty($load_state_board)) {
1474 return $response;
1475 } else {
1476 return 1;
1477 }
1478 } else {
1479 dol_print_error($this->db);
1480 $this->error = $this->db->error();
1481 return -1;
1482 }
1483 }
1484
1485
1492 public function info($id)
1493 {
1494 $sql = 'SELECT ';
1495 $sql .= ' a.id,';
1496 $sql .= ' datec,';
1497 $sql .= ' tms as datem,';
1498 $sql .= ' fk_user_author,';
1499 $sql .= ' fk_user_mod';
1500 $sql .= ' FROM '.MAIN_DB_PREFIX.'actioncomm as a';
1501 $sql .= ' WHERE a.id = '.((int) $id);
1502
1503 dol_syslog(get_class($this)."::info", LOG_DEBUG);
1504 $result = $this->db->query($sql);
1505 if ($result) {
1506 if ($this->db->num_rows($result)) {
1507 $obj = $this->db->fetch_object($result);
1508
1509 $this->id = $obj->id;
1510
1511 $this->user_creation_id = $obj->fk_user_author;
1512 $this->user_modification_id = $obj->fk_user_mod;
1513 $this->date_creation = $this->db->jdate($obj->datec);
1514 $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
1515 }
1516 $this->db->free($result);
1517 } else {
1518 dol_print_error($this->db);
1519 }
1520 }
1521
1522
1530 public function getLibStatut($mode, $hidenastatus = 0)
1531 {
1532 return $this->LibStatut($this->percentage, $mode, $hidenastatus, $this->datep);
1533 }
1534
1535 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1545 public function LibStatut($percent, $mode, $hidenastatus = 0, $datestart = '')
1546 {
1547 // phpcs:enable
1548 global $langs;
1549
1550 $labelStatus = $langs->transnoentitiesnoconv('StatusNotApplicable');
1551 if ($percent == -1 && !$hidenastatus) {
1552 $labelStatus = $langs->transnoentitiesnoconv('StatusNotApplicable');
1553 } elseif ($percent == 0) {
1554 $labelStatus = $langs->transnoentitiesnoconv('StatusActionToDo').' (0%)';
1555 } elseif ($percent > 0 && $percent < 100) {
1556 $labelStatus = $langs->transnoentitiesnoconv('StatusActionInProcess').' ('.$percent.'%)';
1557 } elseif ($percent >= 100) {
1558 $labelStatus = $langs->transnoentitiesnoconv('StatusActionDone').' (100%)';
1559 }
1560
1561 $labelStatusShort = $langs->transnoentitiesnoconv('StatusNotApplicable');
1562 if ($percent == -1 && !$hidenastatus) {
1563 $labelStatusShort = $langs->trans('NA');
1564 } elseif ($percent == 0) {
1565 $labelStatusShort = '0%';
1566 } elseif ($percent > 0 && $percent < 100) {
1567 $labelStatusShort = $percent.'%';
1568 } elseif ($percent >= 100) {
1569 $labelStatusShort = '100%';
1570 }
1571
1572 $statusType = 'status9';
1573 if ($percent == -1 && !$hidenastatus) {
1574 $statusType = 'status9';
1575 }
1576 if ($percent == 0) {
1577 $statusType = 'status1';
1578 }
1579 if ($percent > 0 && $percent < 100) {
1580 $statusType = 'status3';
1581 }
1582 if ($percent >= 100) {
1583 $statusType = 'status6';
1584 }
1585
1586 return dolGetStatus($labelStatus, $labelStatusShort, '', $statusType, $mode);
1587 }
1588
1595 public function getTooltipContentArray($params)
1596 {
1597 global $conf, $langs, $user;
1598 $langs->load('agenda');
1599
1600 $datas = array();
1601 $nofetch = !empty($params['nofetch']);
1602
1603 // Set label of type
1604 $labeltype = '';
1605 if ($this->type_code) {
1606 $langs->load("commercial");
1607 $labeltype = ($langs->transnoentities("Action".$this->type_code) != "Action".$this->type_code) ? $langs->transnoentities("Action".$this->type_code) : $this->type_label;
1608 }
1609 if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
1610 if ($this->type_code != 'AC_OTH_AUTO') {
1611 $labeltype = $langs->trans('ActionAC_MANUAL');
1612 }
1613 }
1614
1615 $datas['picto'] = img_picto('', $this->picto).' <u>'.$langs->trans('Action').'</u>';
1616 if (!empty($this->ref)) {
1617 $datas['ref'] = '<br><b>'.$langs->trans('Ref').':</b> '.dol_escape_htmltag($this->ref);
1618 }
1619 if (!empty($this->label)) {
1620 $datas['title'] = '<br><b>'.$langs->trans('Title').':</b> '.dol_escape_htmltag($this->label);
1621 }
1622 if (!empty($labeltype)) {
1623 $datas['labeltype'] = '<br><b>'.$langs->trans('Type').':</b> '.dol_escape_htmltag($labeltype);
1624 }
1625 if (!empty($this->location)) {
1626 $datas['location'] = '<br><b>'.$langs->trans('Location').':</b> '.dol_escape_htmltag($this->location);
1627 }
1628 if (isset($this->transparency)) {
1629 $datas['transparency'] = '<br><b>'.$langs->trans('Busy').':</b> '.yn($this->transparency);
1630 }
1631 if (!empty($this->email_msgid)) {
1632 $langs->load("mails");
1633 $datas['space'] = '<br>';
1634 // $datas['email'] = '<br><b>'.img_picto('', 'email').' '.$langs->trans("Email").'</b>';
1635 $datas['mailtopic'] = '<br><b>'.$langs->trans('MailTopic').':</b> '.dol_escape_htmltag($this->email_subject);
1636 $datas['mailfrom'] = '<br><b>'.$langs->trans('MailFrom').':</b> '.str_replace(array('<', '>'), array('&amp;lt', '&amp;gt'), $this->email_from);
1637 $datas['mailto'] = '<br><b>'.$langs->trans('MailTo').':</b> '.str_replace(array('<', '>'), array('&amp;lt', '&amp;gt'), $this->email_to);
1638 if (!empty($this->email_tocc)) {
1639 $datas['mailcc'] = '<br><b>'.$langs->trans('MailCC').':</b> '.str_replace(array('<', '>'), array('&amp;lt', '&amp;gt'), $this->email_tocc);
1640 }
1641 /* Disabled because bcc must remain by defintion not visible
1642 if (!empty($this->email_tobcc)) {
1643 $datas['mailccc'] = '<br><b>'.$langs->trans('MailCCC').':</b> '.$this->email_tobcc;
1644 } */
1645 }
1646 if (!empty($this->note_private)) {
1647 $datas['description'] = '<br><b>'.$langs->trans('Description').':</b><br>';
1648 // Try to limit length of content
1649 $texttoshow = dolGetFirstLineOfText($this->note_private, 10);
1650 // Restrict height of content into the tooltip
1651 $datas['note'] = '<div class="tenlinesmax">';
1652 $datas['note'] .= (dol_textishtml($texttoshow) ? str_replace(array("\r", "\n"), "", $texttoshow) : str_replace(array("\r", "\n"), '<br>', $texttoshow));
1653 $datas['note'] .= '</div>';
1654 }
1655 // show categories for this record only in ajax to not overload lists
1656 if (isModEnabled('categorie') && !$nofetch) {
1657 require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php';
1658 $form = new Form($this->db);
1659 $datas['categories'] = '<br>' . $form->showCategories($this->id, Categorie::TYPE_ACTIONCOMM, 1);
1660 }
1661
1662 return $datas;
1663 }
1664
1678 public function getNomUrl($withpicto = 0, $maxlength = 0, $classname = '', $option = '', $overwritepicto = 0, $notooltip = 0, $save_lastsearch_value = -1)
1679 {
1680 global $conf, $langs, $user, $hookmanager, $action;
1681
1682 if (!empty($conf->dol_no_mouse_hover)) {
1683 $notooltip = 1; // Force disable tooltips
1684 }
1685
1686 $canread = 0;
1687 if ($user->hasRight('agenda', 'myactions', 'read') && ($this->authorid == $user->id || $this->userownerid == $user->id)) {
1688 $canread = 1; // Can read my event
1689 }
1690 if ($user->hasRight('agenda', 'myactions', 'read') && array_key_exists($user->id, $this->userassigned)) {
1691 $canread = 1; // Can read my event i am assigned
1692 }
1693 if ($user->hasRight('agenda', 'allactions', 'read')) {
1694 $canread = 1; // Can read all event of other
1695 }
1696 if (!$canread) {
1697 $option = 'nolink';
1698 }
1699
1700 $label = $this->label;
1701 if (empty($label)) {
1702 $label = $this->libelle; // For backward compatibility
1703 }
1704
1705 $result = '';
1706
1707 // Set label of type
1708 $labeltype = '';
1709 if ($this->type_code) {
1710 $langs->load("commercial");
1711 $labeltype = ($langs->transnoentities("Action".$this->type_code) != "Action".$this->type_code) ? $langs->transnoentities("Action".$this->type_code) : $this->type_label;
1712 }
1713 if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
1714 if ($this->type_code != 'AC_OTH_AUTO') {
1715 $labeltype = $langs->trans('ActionAC_MANUAL');
1716 }
1717 }
1718
1719 $tooltip = img_picto('', $this->picto).' <u>'.$langs->trans('Action').'</u>';
1720 if (!empty($this->ref)) {
1721 $tooltip .= '<br><b>'.$langs->trans('Ref').':</b> '.dol_escape_htmltag($this->ref);
1722 }
1723 if (!empty($label)) {
1724 $tooltip .= '<br><b>'.$langs->trans('Title').':</b> '.dol_escape_htmltag($label);
1725 }
1726 if (!empty($labeltype)) {
1727 $tooltip .= '<br><b>'.$langs->trans('Type').':</b> '.dol_escape_htmltag($labeltype);
1728 }
1729 if (!empty($this->location)) {
1730 $tooltip .= '<br><b>'.$langs->trans('Location').':</b> '.dol_escape_htmltag($this->location);
1731 }
1732 if (isset($this->transparency)) {
1733 $tooltip .= '<br><b>'.$langs->trans('Busy').':</b> '.yn($this->transparency);
1734 }
1735 if (!empty($this->email_msgid)) {
1736 $langs->load("mails");
1737 $tooltip .= '<br>';
1738 //$tooltip .= '<br><b>'.img_picto('', 'email').' '.$langs->trans("Email").'</b>';
1739 $tooltip .= '<br><b>'.$langs->trans('MailTopic').':</b> '.dol_escape_htmltag($this->email_subject);
1740 $tooltip .= '<br><b>'.$langs->trans('MailFrom').':</b> '.str_replace(array('<', '>'), array('&amp;lt', '&amp;gt'), !empty($this->email_from) ? $this->email_from : '');
1741 $tooltip .= '<br><b>'.$langs->trans('MailTo').':</b> '.str_replace(array('<', '>'), array('&amp;lt', '&amp;gt'), !empty($this->email_to) ? $this->email_to : '');
1742 if (!empty($this->email_tocc)) {
1743 $tooltip .= '<br><b>'.$langs->trans('MailCC').':</b> '.str_replace(array('<', '>'), array('&amp;lt', '&amp;gt'), $this->email_tocc);
1744 }
1745 /* Disabled because bcc must remain by defintion not visible
1746 if (!empty($this->email_tobcc)) {
1747 $tooltip .= '<br><b>'.$langs->trans('MailCCC').':</b> '.$this->email_tobcc;
1748 } */
1749 }
1750 if (!empty($this->note_private)) {
1751 $tooltip .= '<br><br><b>'.$langs->trans('Description').':</b><br>';
1752 $texttoshow = dolGetFirstLineOfText($this->note_private, 8); // Try to limit length of content
1753 $tooltip .= '<div class="tenlinesmax">'; // Restrict height of content into the tooltip
1754 $tooltip .= (dol_textishtml($texttoshow) ? str_replace(array("\r", "\n"), "", $texttoshow) : str_replace(array("\r", "\n"), '<br>', $texttoshow));
1755 $tooltip .= '</div>';
1756 }
1757 $linkclose = '';
1758 $classfortooltip = 'classfortooltip';
1759 $dataparams = '';
1760 if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
1761 $params = [
1762 'id' => $this->id,
1763 'objecttype' => $this->element,
1764 'option' => $option,
1765 'nofetch' => 1,
1766 ];
1767 $classfortooltip = 'classforajaxtooltip';
1768 $dataparams = ' data-params="'.dol_escape_htmltag(json_encode($params)).'"';
1769 $tooltip = '';
1770 }
1771 //if (!empty($conf->global->AGENDA_USE_EVENT_TYPE) && $this->type_color)
1772 // $linkclose = ' style="background-color:#'.$this->type_color.'"';
1773 if (empty($notooltip)) {
1774 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
1775 $label = $langs->trans("ShowAction");
1776 $linkclose .= ' alt="'.dol_escape_htmltag($tooltip, 1).'"';
1777 }
1778 $linkclose .= ($tooltip ? ' title="'.dol_escape_htmltag($tooltip, 1).'"' : ' title="tocomplete"');
1779 $linkclose .= $dataparams.' class="'.$classname.' '.$classfortooltip.'"';
1780 } else {
1781 $linkclose .= ' class="'.$classname.'"';
1782 }
1783
1784 $url = '';
1785 if ($option == 'birthday') {
1786 $url = DOL_URL_ROOT.'/contact/perso.php?id='.$this->id;
1787 } elseif ($option == 'holiday') {
1788 $url = DOL_URL_ROOT.'/holiday/card.php?id='.$this->id;
1789 } else {
1790 $url = DOL_URL_ROOT.'/comm/action/card.php?id='.$this->id;
1791 }
1792
1793 if ($option !== 'nolink') {
1794 // Add param to save lastsearch_values or not
1795 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1796 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
1797 $add_save_lastsearch_values = 1;
1798 }
1799 if ($add_save_lastsearch_values) {
1800 $url .= '&save_lastsearch_values=1';
1801 }
1802 }
1803
1804 $linkstart = '<a href="'.$url.'"';
1805 $linkstart .= $linkclose.'>';
1806 $linkend = '</a>';
1807
1808 if ($option == 'nolink') {
1809 $linkstart = '';
1810 $linkend = '';
1811 }
1812
1813 if ($withpicto == 2) {
1814 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
1815 $label = $labeltype;
1816 }
1817 $labelshort = '';
1818 } else {
1819 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE') && empty($label)) {
1820 $label = $labeltype;
1821 }
1822 if ($maxlength < 0) {
1823 $labelshort = $this->ref;
1824 } else {
1825 $labelshort = dol_trunc($label, $maxlength);
1826 }
1827 }
1828
1829 if ($withpicto) {
1830 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE')) { // Add code into ()
1831 if ($labeltype) {
1832 $label .= (preg_match('/'.preg_quote($labeltype, '/').'/', $label) ? '' : ' ('.$langs->transnoentities("Action".$this->type_code).')');
1833 }
1834 }
1835 }
1836
1837 $result .= $linkstart;
1838 if ($withpicto) {
1839 $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);
1840 }
1841 $result .= dol_escape_htmltag($labelshort);
1842 $result .= $linkend;
1843
1844 global $action;
1845 $hookmanager->initHooks(array('actiondao'));
1846 $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
1847 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
1848 if ($reshook > 0) {
1849 $result = $hookmanager->resPrint;
1850 } else {
1851 $result .= $hookmanager->resPrint;
1852 }
1853
1854 return $result;
1855 }
1856
1864 public function getTypePicto($morecss = 'pictofixedwidth paddingright', $titlealt = '')
1865 {
1866 global $conf;
1867
1868 $imgpicto = '';
1869 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
1870 $color = '';
1871 if ($this->type_color) {
1872 $color = 'style="color: #'.$this->type_color.' !important;"';
1873 }
1874 if ($this->type_picto) {
1875 $imgpicto = img_picto($titlealt, $this->type_picto, '', false, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1876 } else {
1877 if ($this->type_code == 'AC_RDV') {
1878 $imgpicto = img_picto($titlealt, 'meeting', $color, false, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1879 } elseif ($this->type_code == 'AC_TEL') {
1880 $imgpicto = img_picto($titlealt, 'object_phoning', $color, false, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1881 } elseif ($this->type_code == 'AC_FAX') {
1882 $imgpicto = img_picto($titlealt, 'object_phoning_fax', $color, false, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1883 } elseif ($this->type_code == 'AC_EMAIL' || $this->type_code == 'AC_EMAIL_IN' || (!empty($this->code) && preg_match('/_SENTBYMAIL/', $this->code))) {
1884 $imgpicto = img_picto($titlealt, 'object_email', $color, false, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1885 } elseif ($this->type_code == 'AC_INT') {
1886 $imgpicto = img_picto($titlealt, 'object_intervention', $color, false, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1887 } elseif (!empty($this->code) && preg_match('/^TICKET_MSG/', $this->code)) {
1888 $imgpicto = img_picto($titlealt, 'object_conversation', $color, false, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1889 } elseif ($this->type != 'systemauto') {
1890 $imgpicto = img_picto($titlealt, 'user-cog', $color, false, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1891 } else {
1892 $imgpicto = img_picto($titlealt, 'cog', $color, false, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1893 }
1894 }
1895 } else {
1896 // 2 picto: 1 for auto, 1 for manual
1897 if ($this->type != 'systemauto') {
1898 $imgpicto = img_picto($titlealt, 'user-cog', '', false, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1899 } else {
1900 $imgpicto = img_picto($titlealt, 'cog', '', false, 0, 0, '', ($morecss ? ' '.$morecss : ''));
1901 }
1902 }
1903
1904 return $imgpicto;
1905 }
1906
1907
1918 public function setCategories($categories)
1919 {
1920 // Handle single category
1921 if (!is_array($categories)) {
1922 $categories = array($categories);
1923 }
1924
1925 // Get current categories
1926 include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1927 $c = new Categorie($this->db);
1928 $existing = $c->containing($this->id, Categorie::TYPE_ACTIONCOMM, 'id');
1929
1930 // Diff
1931 if (is_array($existing)) {
1932 $to_del = array_diff($existing, $categories);
1933 $to_add = array_diff($categories, $existing);
1934 } else {
1935 $to_del = array(); // Nothing to delete
1936 $to_add = $categories;
1937 }
1938
1939 // Process
1940 foreach ($to_del as $del) {
1941 if ($c->fetch($del) > 0) {
1942 $c->del_type($this, Categorie::TYPE_ACTIONCOMM);
1943 }
1944 }
1945 foreach ($to_add as $add) {
1946 if ($c->fetch($add) > 0) {
1947 $c->add_type($this, Categorie::TYPE_ACTIONCOMM);
1948 }
1949 }
1950 return 1;
1951 }
1952
1953 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1965 public function build_exportfile($format, $type, $cachedelay, $filename, $filters, $exportholiday = 0)
1966 {
1967 global $hookmanager;
1968
1969 // phpcs:enable
1970 global $conf, $langs, $dolibarr_main_url_root, $mysoc;
1971
1972 require_once DOL_DOCUMENT_ROOT."/core/lib/xcal.lib.php";
1973 require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
1974 require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
1975
1976 dol_syslog(get_class($this)."::build_exportfile Build export file format=".$format.", type=".$type.", cachedelay=".$cachedelay.", filename=".$filename.", filters size=".count($filters), LOG_DEBUG);
1977
1978 // Check parameters
1979 if (empty($format)) {
1980 return -1;
1981 }
1982
1983 // Clean parameters
1984 if (!$filename) {
1985 $extension = 'vcs';
1986 if ($format == 'ical') {
1987 $extension = 'ics';
1988 }
1989 $filename = $format.'.'.$extension;
1990 }
1991
1992 // Create dir and define output file (definitive and temporary)
1993 $result = dol_mkdir($conf->agenda->dir_temp);
1994 $outputfile = $conf->agenda->dir_temp.'/'.$filename;
1995
1996 $result = 0;
1997
1998 $buildfile = true;
1999 $login = '';
2000 $logina = '';
2001 $logind = '';
2002 $logint = '';
2003
2004 $now = dol_now();
2005
2006 if ($cachedelay) {
2007 $nowgmt = dol_now();
2008 include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
2009 if (dol_filemtime($outputfile) > ($nowgmt - $cachedelay)) {
2010 dol_syslog(get_class($this)."::build_exportfile file ".$outputfile." is not older than now - cachedelay (".$nowgmt." - ".$cachedelay."). Build is canceled");
2011 $buildfile = false;
2012 }
2013 }
2014
2015 if ($buildfile) {
2016 // Build event array
2017 $eventarray = array();
2018
2019 $sql = "SELECT a.id,";
2020 $sql .= " a.datep,"; // Start
2021 $sql .= " a.datep2,"; // End
2022 $sql .= " a.durationp,"; // deprecated
2023 $sql .= " a.datec, a.tms as datem,";
2024 $sql .= " a.label, a.code, a.note as note_private, a.fk_action as type_id,";
2025 $sql .= " a.fk_soc,";
2026 $sql .= " a.fk_user_author, a.fk_user_mod,";
2027 $sql .= " a.fk_user_action,";
2028 $sql .= " a.fk_contact, a.percent as percentage,";
2029 $sql .= " a.fk_element, a.elementtype,";
2030 $sql .= " a.priority, a.fulldayevent, a.location, a.transparency,";
2031 $sql .= " u.firstname, u.lastname, u.email,";
2032 $sql .= " s.nom as socname,";
2033 $sql .= " c.id as type_id, c.code as type_code, c.libelle as type_label,";
2034 $sql .= " num_vote, event_paid, a.status";
2035 $sql .= " FROM (".MAIN_DB_PREFIX."c_actioncomm as c, ".MAIN_DB_PREFIX."actioncomm as a)";
2036 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_author"; // Link to get author of event for export
2037 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on s.rowid = a.fk_soc";
2038
2039 $parameters = array('filters' => $filters);
2040 $reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters); // Note that $action and $object may have been modified by hook
2041 $sql .= $hookmanager->resPrint;
2042
2043 // We must filter on assignement table
2044 if ($filters['logint']) {
2045 $sql .= ", ".MAIN_DB_PREFIX."actioncomm_resources as ar";
2046 }
2047 $sql .= " WHERE a.fk_action=c.id";
2048 $sql .= " AND a.entity IN (".getEntity('agenda').")";
2049 foreach ($filters as $key => $value) {
2050 if ($key == 'notolderthan' && $value != '') {
2051 $sql .= " AND a.datep >= '".$this->db->idate($now - ($value * 24 * 60 * 60))."'";
2052 }
2053 if ($key == 'year') {
2054 $sql .= " AND a.datep BETWEEN '".$this->db->idate(dol_get_first_day($value, 1))."' AND '".$this->db->idate(dol_get_last_day($value, 12))."'";
2055 }
2056 if ($key == 'id') {
2057 $sql .= " AND a.id=".(is_numeric($value) ? $value : 0);
2058 }
2059 if ($key == 'idfrom') {
2060 $sql .= " AND a.id >= ".(is_numeric($value) ? $value : 0);
2061 }
2062 if ($key == 'idto') {
2063 $sql .= " AND a.id <= ".(is_numeric($value) ? $value : 0);
2064 }
2065 if ($key == 'project') {
2066 $sql .= " AND a.fk_project=".(is_numeric($value) ? $value : 0);
2067 }
2068 if ($key == 'actiontype') {
2069 $sql .= " AND c.type = '".$this->db->escape($value)."'";
2070 }
2071 if ($key == 'notactiontype') {
2072 $sql .= " AND c.type <> '".$this->db->escape($value)."'";
2073 }
2074 // We must filter on assignement table
2075 if ($key == 'logint') {
2076 $sql .= " AND ar.fk_actioncomm = a.id AND ar.element_type='user'";
2077 }
2078 if ($key == 'logina') {
2079 $logina = $value;
2080 $condition = '=';
2081 if (preg_match('/^!/', $logina)) {
2082 $logina = preg_replace('/^!/', '', $logina);
2083 $condition = '<>';
2084 }
2085 $userforfilter = new User($this->db);
2086 $result = $userforfilter->fetch('', $logina);
2087 if ($result > 0) {
2088 $sql .= " AND a.fk_user_author ".$condition." ".$userforfilter->id;
2089 } elseif ($result < 0 || $condition == '=') {
2090 $sql .= " AND a.fk_user_author = 0";
2091 }
2092 }
2093 if ($key == 'logint') {
2094 $logint = $value;
2095 $condition = '=';
2096 if (preg_match('/^!/', $logint)) {
2097 $logint = preg_replace('/^!/', '', $logint);
2098 $condition = '<>';
2099 }
2100 $userforfilter = new User($this->db);
2101 $result = $userforfilter->fetch('', $logint);
2102 if ($result > 0) {
2103 $sql .= " AND ar.fk_element = ".((int) $userforfilter->id);
2104 } elseif ($result < 0 || $condition == '=') {
2105 $sql .= " AND ar.fk_element = 0";
2106 }
2107 }
2108 if ($key == 'module') {
2109 $sql .= " AND c.module LIKE '%".$this->db->escape($value)."'";
2110 }
2111 if ($key == 'status') {
2112 $sql .= " AND a.status =".((int) $value);
2113 }
2114 }
2115
2116 $sql .= " AND a.datep IS NOT NULL"; // To exclude corrupted events and avoid errors in lightning/sunbird import
2117
2118 $parameters = array('filters' => $filters);
2119 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
2120 $sql .= $hookmanager->resPrint;
2121
2122 $sql .= " ORDER by datep";
2123 //print $sql;exit;
2124
2125 dol_syslog(get_class($this)."::build_exportfile select events", LOG_DEBUG);
2126 $resql = $this->db->query($sql);
2127 if ($resql) {
2128 $diff = 0;
2129 while ($obj = $this->db->fetch_object($resql)) {
2130 $qualified = true;
2131
2132 // 'eid','startdate','duration','enddate','title','summary','category','email','url','desc','author'
2133 $event = array();
2134 $event['uid'] = 'dolibarragenda-'.$this->db->database_name.'-'.$obj->id."@".$_SERVER["SERVER_NAME"];
2135 $event['type'] = $type;
2136
2137 $datestart = $this->db->jdate($obj->datep) - (!getDolGlobalString('AGENDA_EXPORT_FIX_TZ') ? 0 : ($conf->global->AGENDA_EXPORT_FIX_TZ * 3600));
2138
2139 // fix for -> Warning: A non-numeric value encountered
2140 if (is_numeric($this->db->jdate($obj->datep2))) {
2141 $dateend = $this->db->jdate($obj->datep2) - (!getDolGlobalString('AGENDA_EXPORT_FIX_TZ') ? 0 : ($conf->global->AGENDA_EXPORT_FIX_TZ * 3600));
2142 } else {
2143 // use start date as fall-back to avoid pb with empty end date on ICS readers
2144 $dateend = $datestart;
2145 }
2146
2147 $duration = ($datestart && $dateend) ? ($dateend - $datestart) : 0;
2148 $event['summary'] = $obj->label.($obj->socname ? " (".$obj->socname.")" : "");
2149
2150 $event['desc'] = $obj->note_private;
2151 $event['startdate'] = $datestart;
2152 $event['enddate'] = $dateend; // Not required with type 'journal'
2153 $event['duration'] = $duration; // Not required with type 'journal'
2154 $event['author'] = dolGetFirstLastname($obj->firstname, $obj->lastname);
2155 $event['priority'] = $obj->priority;
2156 $event['fulldayevent'] = $obj->fulldayevent;
2157 $event['location'] = $obj->location;
2158 $event['transparency'] = (($obj->transparency > 0) ? 'OPAQUE' : 'TRANSPARENT'); // OPAQUE (busy) or TRANSPARENT (not busy)
2159 $event['category'] = $obj->type_label;
2160 $event['email'] = $obj->email;
2161 // Define $urlwithroot
2162 $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
2163 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
2164 //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
2165 $url = $urlwithroot.'/comm/action/card.php?id='.$obj->id;
2166 $event['url'] = $url;
2167 $event['created'] = $this->db->jdate($obj->datec) - (!getDolGlobalString('AGENDA_EXPORT_FIX_TZ') ? 0 : ($conf->global->AGENDA_EXPORT_FIX_TZ * 3600));
2168 $event['modified'] = $this->db->jdate($obj->datem) - (!getDolGlobalString('AGENDA_EXPORT_FIX_TZ') ? 0 : ($conf->global->AGENDA_EXPORT_FIX_TZ * 3600));
2169 $event['num_vote'] = $this->num_vote;
2170 $event['event_paid'] = $this->event_paid;
2171 $event['status'] = $this->status;
2172
2173 // TODO: find a way to call "$this->fetch_userassigned();" without override "$this" properties
2174 $this->id = $obj->id;
2175 $this->fetch_userassigned(false);
2176
2177 $assignedUserArray = array();
2178
2179 foreach ($this->userassigned as $key => $value) {
2180 $assignedUser = new User($this->db);
2181 $assignedUser->fetch($value['id']);
2182
2183 $assignedUserArray[$key] = $assignedUser;
2184 }
2185
2186 $event['assignedUsers'] = $assignedUserArray;
2187
2188 if ($qualified && $datestart) {
2189 $eventarray[] = $event;
2190 }
2191 $diff++;
2192 }
2193
2194 $parameters = array('filters' => $filters, 'eventarray' => &$eventarray);
2195 $reshook = $hookmanager->executeHooks('addMoreEventsExport', $parameters); // Note that $action and $object may have been modified by hook
2196 if ($reshook > 0) {
2197 $eventarray = $hookmanager->resArray;
2198 }
2199 } else {
2200 $this->error = $this->db->lasterror();
2201 return -1;
2202 }
2203
2204 if ($exportholiday == 1) {
2205 $langs->load("holiday");
2206 $title = $langs->transnoentities("Holidays");
2207
2208 $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";
2209 $sql .= " FROM ".MAIN_DB_PREFIX."holiday as x, ".MAIN_DB_PREFIX."user as u";
2210 $sql .= " WHERE u.rowid = x.fk_user";
2211 $sql .= " AND u.statut = '1'"; // Show only active users (0 = inactive user, 1 = active user)
2212 $sql .= " AND (x.statut = '2' OR x.statut = '3')"; // Show only public leaves (2 = leave wait for approval, 3 = leave approved)
2213
2214 $resql = $this->db->query($sql);
2215 if ($resql) {
2216 $num = $this->db->num_rows($resql);
2217 $i = 0;
2218
2219 while ($i < $num) {
2220 $obj = $this->db->fetch_object($resql);
2221 $event = array();
2222
2223 if ($obj->halfday == 1) {
2224 $event['fulldayevent'] = false;
2225
2226 $timestampStart = dol_stringtotime($obj->date_start." 00:00:00", 0);
2227 $timestampEnd = dol_stringtotime($obj->date_end." 12:00:00", 0);
2228 } elseif ($obj->halfday == -1) {
2229 $event['fulldayevent'] = false;
2230
2231 $timestampStart = dol_stringtotime($obj->date_start." 12:00:00", 0);
2232 $timestampEnd = dol_stringtotime($obj->date_end." 23:59:59", 0);
2233 } else {
2234 $event['fulldayevent'] = true;
2235
2236 $timestampStart = dol_stringtotime($obj->date_start." 00:00:00", 0);
2237 $timestampEnd = dol_stringtotime($obj->date_end." 23:59:59", 0);
2238 }
2239
2240 if (getDolGlobalString('AGENDA_EXPORT_FIX_TZ')) {
2241 $timestampStart = $timestampStart - ($conf->global->AGENDA_EXPORT_FIX_TZ * 3600);
2242 $timestampEnd = $timestampEnd - ($conf->global->AGENDA_EXPORT_FIX_TZ * 3600);
2243 }
2244
2245 $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
2246 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
2247 $url = $urlwithroot.'/holiday/card.php?id='.$obj->rowid;
2248
2249 $event['uid'] = 'dolibarrholiday-'.$this->db->database_name.'-'.$obj->rowid."@".$_SERVER["SERVER_NAME"];
2250 $event['author'] = dolGetFirstLastname($obj->firstname, $obj->lastname);
2251 $event['type'] = 'event';
2252 $event['category'] = "Holiday";
2253 $event['transparency'] = 'OPAQUE';
2254 $event['email'] = $obj->email;
2255 $event['created'] = $timestampStart;
2256 $event['modified'] = $timestampStart;
2257 $event['startdate'] = $timestampStart;
2258 $event['enddate'] = $timestampEnd;
2259 $event['duration'] = $timestampEnd - $timestampStart;
2260 $event['url'] = $url;
2261
2262 if ($obj->status == 2) {
2263 // 2 = leave wait for approval
2264 $event['summary'] = $title." - ".$obj->lastname." (wait for approval)";
2265 } else {
2266 // 3 = leave approved
2267 $event['summary'] = $title." - ".$obj->lastname;
2268 }
2269
2270 $eventarray[] = $event;
2271
2272 $i++;
2273 }
2274 }
2275 }
2276
2277 $langs->load("agenda");
2278
2279 // Define title and desc
2280 $more = '';
2281 if ($login) {
2282 $more = $langs->transnoentities("User").' '.$login;
2283 }
2284 if ($logina) {
2285 $more = $langs->transnoentities("ActionsAskedBy").' '.$logina;
2286 }
2287 if ($logint) {
2288 $more = $langs->transnoentities("ActionsToDoBy").' '.$logint;
2289 }
2290 if ($logind) {
2291 $more = $langs->transnoentities("ActionsDoneBy").' '.$logind;
2292 }
2293 if ($more) {
2294 $title = 'Dolibarr actions '.$mysoc->name.' - '.$more;
2295 $desc = $more;
2296 $desc .= ' ('.$mysoc->name.' - built by Dolibarr)';
2297 } else {
2298 $title = 'Dolibarr actions '.$mysoc->name;
2299 $desc = $langs->transnoentities('ListOfActions');
2300 $desc .= ' ('.$mysoc->name.' - built by Dolibarr)';
2301 }
2302
2303 // Create temp file
2304 $outputfiletmp = tempnam($conf->agenda->dir_temp, 'tmp'); // Temporary file (allow call of function by different threads
2305 dolChmod($outputfiletmp);
2306
2307 // Write file
2308 if ($format == 'vcal') {
2309 $result = build_calfile($format, $title, $desc, $eventarray, $outputfiletmp);
2310 } elseif ($format == 'ical') {
2311 $result = build_calfile($format, $title, $desc, $eventarray, $outputfiletmp);
2312 } elseif ($format == 'rss') {
2313 $result = build_rssfile($format, $title, $desc, $eventarray, $outputfiletmp);
2314 }
2315
2316 if ($result >= 0) {
2317 if (dol_move($outputfiletmp, $outputfile, 0, 1, 0, 0)) {
2318 $result = 1;
2319 } else {
2320 $this->error = 'Failed to rename '.$outputfiletmp.' into '.$outputfile;
2321 dol_syslog(get_class($this)."::build_exportfile ".$this->error, LOG_ERR);
2322 dol_delete_file($outputfiletmp, 0, 1);
2323 $result = -1;
2324 }
2325 } else {
2326 dol_syslog(get_class($this)."::build_exportfile build_xxxfile function fails to for format=".$format." outputfiletmp=".$outputfile, LOG_ERR);
2327 dol_delete_file($outputfiletmp, 0, 1);
2328 $langs->load("errors");
2329 $this->error = $langs->trans("ErrorFailToCreateFile", $outputfile);
2330 }
2331 }
2332
2333 return $result;
2334 }
2335
2343 public function initAsSpecimen()
2344 {
2345 global $user;
2346
2347 $now = dol_now();
2348
2349 // Initialise parametres
2350 $this->id = 0;
2351 $this->specimen = 1;
2352
2353 $this->type_code = 'AC_OTH';
2354 $this->code = 'AC_SPECIMEN_CODE';
2355 $this->label = 'Label of event Specimen';
2356 $this->datec = $now;
2357 $this->datem = $now;
2358 $this->datep = $now;
2359 $this->datef = $now;
2360 $this->fulldayevent = 0;
2361 $this->percentage = 0;
2362 $this->status = 0;
2363 $this->location = 'Location';
2364 $this->transparency = 1; // 1 means opaque
2365 $this->priority = 1;
2366 //$this->note_public = "This is a 'public' note.";
2367 $this->note_private = "This is a 'private' note.";
2368
2369 $this->userownerid = $user->id;
2370 $this->userassigned[$user->id] = array('id'=>$user->id, 'transparency'=> 1);
2371 return 1;
2372 }
2373
2382 public static function replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
2383 {
2384 $tables = array(
2385 'actioncomm'
2386 );
2387
2388 return CommonObject::commonReplaceThirdparty($dbs, $origin_id, $dest_id, $tables);
2389 }
2390
2399 public static function replaceProduct(DoliDB $dbs, $origin_id, $dest_id)
2400 {
2401 $sql = 'UPDATE ' . MAIN_DB_PREFIX . 'actioncomm SET fk_element = ' . ((int) $dest_id) . ' WHERE elementtype="product" AND fk_element = '.((int) $origin_id);
2402 // using $dbs, not $this->db because function is static
2403 if (!$dbs->query($sql)) {
2404 //$this->errors = $dbs->lasterror();
2405 return false;
2406 }
2407
2408 return true;
2409 }
2410
2416 public function hasDelay()
2417 {
2418 global $conf;
2419
2420 $now = dol_now();
2421
2422 return $this->datep && ($this->datep < ($now - $conf->agenda->warning_delay));
2423 }
2424
2425
2434 public function loadReminders($type = '', $fk_user = 0, $onlypast = true)
2435 {
2436 global $conf, $langs, $user;
2437
2438 $error = 0;
2439
2440 $this->reminders = array();
2441
2442 //Select all action comm reminders for event
2443 $sql = "SELECT rowid as id, typeremind, dateremind, status, offsetvalue, offsetunit, fk_user, fk_email_template, lasterror";
2444 $sql .= " FROM ".MAIN_DB_PREFIX."actioncomm_reminder";
2445 $sql .= " WHERE fk_actioncomm = ".((int) $this->id);
2446 if ($onlypast) {
2447 $sql .= " AND dateremind <= '".$this->db->idate(dol_now())."'";
2448 }
2449 if ($type) {
2450 $sql .= " AND typeremind = '".$this->db->escape($type)."'";
2451 }
2452 if ($fk_user > 0) {
2453 $sql .= " AND fk_user = ".((int) $fk_user);
2454 }
2455 if (!getDolGlobalString('AGENDA_REMINDER_EMAIL')) {
2456 $sql .= " AND typeremind <> 'email'";
2457 }
2458 if (!getDolGlobalString('AGENDA_REMINDER_BROWSER')) {
2459 $sql .= " AND typeremind <> 'browser'";
2460 }
2461
2462 $sql .= $this->db->order("dateremind", "ASC");
2463 $resql = $this->db->query($sql);
2464
2465 if ($resql) {
2466 while ($obj = $this->db->fetch_object($resql)) {
2467 $tmpactioncommreminder = new ActionCommReminder($this->db);
2468 $tmpactioncommreminder->id = $obj->id;
2469 $tmpactioncommreminder->typeremind = $obj->typeremind;
2470 $tmpactioncommreminder->dateremind = $obj->dateremind;
2471 $tmpactioncommreminder->offsetvalue = $obj->offsetvalue;
2472 $tmpactioncommreminder->offsetunit = $obj->offsetunit;
2473 $tmpactioncommreminder->status = $obj->status;
2474 $tmpactioncommreminder->fk_user = $obj->fk_user;
2475 $tmpactioncommreminder->fk_email_template = $obj->fk_email_template;
2476 $tmpactioncommreminder->lasterror = $obj->lasterror;
2477
2478 $this->reminders[$obj->id] = $tmpactioncommreminder;
2479 }
2480 } else {
2481 $this->error = $this->db->lasterror();
2482 $error++;
2483 }
2484
2485 return count($this->reminders);
2486 }
2487
2488
2495 public function sendEmailsReminder()
2496 {
2497 global $conf, $langs, $user;
2498
2499 $error = 0;
2500 $this->output = '';
2501 $this->error = '';
2502 $nbMailSend = 0;
2503 $errorsMsg = array();
2504
2505 if (!isModEnabled('agenda')) { // Should not happen. If module disabled, cron job should not be visible.
2506 $langs->load("agenda");
2507 $this->output = $langs->trans('ModuleNotEnabled', $langs->transnoentitiesnoconv("Agenda"));
2508 return 0;
2509 }
2510 if (!getDolGlobalString('AGENDA_REMINDER_EMAIL')) {
2511 $langs->load("agenda");
2512 $this->output = $langs->trans('EventRemindersByEmailNotEnabled', $langs->transnoentitiesnoconv("Agenda"));
2513 return 0;
2514 }
2515
2516 $now = dol_now();
2517 $actionCommReminder = new ActionCommReminder($this->db);
2518
2519 dol_syslog(__METHOD__." start", LOG_INFO);
2520
2521 $this->db->begin();
2522
2523 //Select all action comm reminders
2524 $sql = "SELECT rowid as id FROM ".MAIN_DB_PREFIX."actioncomm_reminder";
2525 $sql .= " WHERE typeremind = 'email'";
2526 $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.
2527 $sql .= " AND dateremind <= '".$this->db->idate($now)."'";
2528 $sql .= " AND entity IN (".getEntity('actioncomm').")";
2529 $sql .= $this->db->order("dateremind", "ASC");
2530 $resql = $this->db->query($sql);
2531
2532 if ($resql) {
2533 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
2534 $formmail = new FormMail($this->db);
2535
2536 while ($obj = $this->db->fetch_object($resql)) {
2537 $res = $actionCommReminder->fetch($obj->id);
2538 if ($res < 0) {
2539 $error++;
2540 $errorsMsg[] = "Failed to load invoice ActionComm Reminder";
2541 }
2542
2543 if (!$error) {
2544 //Select email template
2545 $arraymessage = $formmail->getEMailTemplate($this->db, 'actioncomm_send', $user, $langs, (!empty($actionCommReminder->fk_email_template)) ? $actionCommReminder->fk_email_template : -1, 1);
2546
2547 // Load event
2548 $res = $this->fetch($actionCommReminder->fk_actioncomm);
2549 if ($res > 0) {
2550 // PREPARE EMAIL
2551 $errormesg = '';
2552
2553 // Make substitution in email content
2554 $substitutionarray = getCommonSubstitutionArray($langs, 0, '', $this);
2555
2556 complete_substitutions_array($substitutionarray, $langs, $this);
2557
2558 // Content
2559 $sendContent = make_substitutions($langs->trans($arraymessage->content), $substitutionarray);
2560
2561 //Topic
2562 $sendTopic = (!empty($arraymessage->topic)) ? $arraymessage->topic : html_entity_decode($langs->transnoentities('EventReminder'));
2563
2564 // Recipient
2565 $recipient = new User($this->db);
2566 $res = $recipient->fetch($actionCommReminder->fk_user);
2567 if ($res > 0) {
2568 if (!empty($recipient->email)) {
2569 $to = $recipient->email;
2570 } else {
2571 $errormesg = "Failed to send remind to user id=".$actionCommReminder->fk_user.". No email defined for user.";
2572 $error++;
2573 }
2574 } else {
2575 $errormesg = "Failed to load recipient with user id=".$actionCommReminder->fk_user;
2576 $error++;
2577 }
2578
2579 // Sender
2580 $from = getDolGlobalString('MAIN_MAIL_EMAIL_FROM');
2581 if (empty($from)) {
2582 $errormesg = "Failed to get sender into global setup MAIN_MAIL_EMAIL_FROM";
2583 $error++;
2584 }
2585
2586 if (!$error) {
2587 // Errors Recipient
2588 $errors_to = getDolGlobalString('MAIN_MAIL_ERRORS_TO');
2589
2590 // Mail Creation
2591 $cMailFile = new CMailFile($sendTopic, $to, $from, $sendContent, array(), array(), array(), '', "", 0, 1, $errors_to, '', '', '', '', '');
2592
2593 // Sending Mail
2594 if ($cMailFile->sendfile()) {
2595 $nbMailSend++;
2596 } else {
2597 $errormesg = 'Failed to send email to: '.$to.' '.$cMailFile->error.join(',', $cMailFile->errors);
2598 $error++;
2599 }
2600 }
2601
2602 if (!$error) {
2603 $actionCommReminder->status = $actionCommReminder::STATUS_DONE;
2604
2605 $res = $actionCommReminder->update($user);
2606 if ($res < 0) {
2607 $errorsMsg[] = "Failed to update status to done of ActionComm Reminder";
2608 $error++;
2609 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.
2610 }
2611 } else {
2612 $actionCommReminder->status = $actionCommReminder::STATUS_ERROR;
2613 $actionCommReminder->lasterror = dol_trunc($errormesg, 128, 'right', 'UTF-8', 1);
2614
2615 $res = $actionCommReminder->update($user);
2616 if ($res < 0) {
2617 $errorsMsg[] = "Failed to update status to error of ActionComm Reminder";
2618 $error++;
2619 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.
2620 } else {
2621 $errorsMsg[] = $errormesg;
2622 }
2623 }
2624 } else {
2625 $errorsMsg[] = 'Failed to fetch record actioncomm with ID = '.$actionCommReminder->fk_actioncomm;
2626 $error++;
2627 }
2628 }
2629 }
2630 } else {
2631 $error++;
2632 }
2633
2634 if (!$error) {
2635 // Delete also very old past events (we do not keep more than 1 month record in past)
2636 $sql = "DELETE FROM ".MAIN_DB_PREFIX."actioncomm_reminder";
2637 $sql .= " WHERE dateremind < '".$this->db->idate($now - (3600 * 24 * 32))."'";
2638 $sql .= " AND status = ".((int) $actionCommReminder::STATUS_DONE);
2639 $resql = $this->db->query($sql);
2640
2641 if (!$resql) {
2642 $errorsMsg[] = 'Failed to delete old reminders';
2643 //$error++; // If this fails, we must not rollback other SQL requests already done. Never mind.
2644 }
2645 }
2646
2647 if (!$error) {
2648 $this->output = 'Nb of emails sent : '.$nbMailSend;
2649 $this->db->commit();
2650
2651 dol_syslog(__METHOD__." end - ".$this->output, LOG_INFO);
2652
2653 return 0;
2654 } else {
2655 $this->db->commit(); // We commit also on error, to have the error message recorded.
2656 $this->error = 'Nb of emails sent : '.$nbMailSend.', '.(!empty($errorsMsg)) ? join(', ', $errorsMsg) : $error;
2657
2658 dol_syslog(__METHOD__." end - ".$this->error, LOG_INFO);
2659
2660 return $error;
2661 }
2662 }
2663
2672 public function updatePercent($id, $percent, $usermodid = 0)
2673 {
2674 $this->db->begin();
2675
2676 $sql = "UPDATE ".MAIN_DB_PREFIX."actioncomm ";
2677 $sql .= " SET percent = ".(int) $percent;
2678 if ($usermodid > 0) {
2679 $sql .= ", fk_user_mod = ".$usermodid;
2680 }
2681 $sql .= " WHERE id = ".((int) $id);
2682
2683 if ($this->db->query($sql)) {
2684 $this->db->commit();
2685 return 1;
2686 } else {
2687 $this->db->rollback();
2688 $this->error = $this->db->lasterror();
2689 return -1;
2690 }
2691 }
2692}
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Definition security.php:604
$object ref
Definition info.php:79
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%.
fetch_userassigned($override=true)
Initialize this->userassigned array with list of id of user assigned to event.
info($id)
Charge les informations 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.
getNomUrl($withpicto=0, $maxlength=0, $classname='', $option='', $overwritepicto=0, $notooltip=0, $save_lastsearch_value=-1)
Return URL of event Use $this->id, $this->type_code, $this->label and $this->type_label.
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.
$recurid
Properties to manage the recurring events.
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)
Udpate the percent value of a event with the given id.
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...
getTypePicto($morecss='pictofixedwidth paddingright', $titlealt='')
Return Picto of type of event.
static replaceProduct(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a product id with another one.
__construct(DoliDB $db)
Constructor.
initAsSpecimen()
Initialise an instance with random values.
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 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...
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.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage Dolibarr database access.
Class to manage generation of HTML components Only common components must be here.
Classe permettant la generation du formulaire html d'envoi de mail unitaire Usage: $formail = new For...
Class to manage hooks.
Class to manage Dolibarr users.
dol_get_first_day($year, $month=1, $gm=false)
Return GMT time for first day of a month or year.
Definition date.lib.php:594
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:426
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:613
dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1, $testvirus=0, $indexdatabase=1, $moreinfo=array())
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.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dolChmod($filepath, $newmask='')
Change mod of a file.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
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...
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_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.
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
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:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition repair.php:121
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:35
build_rssfile($format, $title, $desc, $events_array, $outputfile, $filter='', $url='', $langcode='')
Build a file from an array of events.
Definition xcal.lib.php:325