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