dolibarr 19.0.3
calendar.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2023 Frédéric France <frederic.france@netlogic.fr>
4 * Copyright (C) 2023 Alice Adminson <aadminson@example.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
26// Put here all includes required by your class file
27require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
28//require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
29//require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
30
35{
39 public $module = 'bookcal';
40
44 public $element = 'calendar';
45
49 public $table_element = 'bookcal_calendar';
50
55 public $ismultientitymanaged = 0;
56
60 public $isextrafieldmanaged = 1;
61
65 public $picto = 'fa-file';
66
67
68 const STATUS_DRAFT = 0;
69 const STATUS_VALIDATED = 1;
70 const STATUS_CANCELED = 9;
71
72
112 // BEGIN MODULEBUILDER PROPERTIES
116 public $fields=array(
117 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'right', 'comment'=>"Id"),
118 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>'1', 'position'=>20, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'searchall'=>1, 'showoncombobox'=>'1', 'validate'=>'1', 'comment'=>"Reference of object", 'css'=>'width100'),
119 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>0, 'visible'=>1, 'alwayseditable'=>'1', 'searchall'=>1, 'css'=>'minwidth300', 'cssview'=>'wordbreak', 'help'=>"Help text", 'showoncombobox'=>'2', 'validate'=>'1',),
120 'visibility' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'Owner', 'enabled'=>'1', 'position'=>40, 'notnull'=>1, 'visible'=>1, 'picto'=>'user', 'css'=>'maxwidth500 widthcentpercentminusxx', 'csslist'=>'tdoverflowmax150',),
121 'type' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>'1', 'position'=>42, 'notnull'=>1, 'visible'=>1, 'arrayofkeyval'=>array('0'=>'Customer', '1'=>'Supplier', '3'=>'Other'),),
122 'fk_soc' => array('type'=>'integer:Societe:societe/class/societe.class.php:1:((status:=:1) AND (entity:IN:__SHARED_ENTITIES__))', 'label'=>'ThirdParty', 'picto'=>'company', 'enabled'=>'isModEnabled("societe")', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'csslist'=>'tdoverflowmax150', 'help'=>"ThirdPartyBookCalHelp", 'validate'=>'1',),
123 'fk_project' => array('type'=>'integer:Project:projet/class/project.class.php:1', 'label'=>'Project', 'picto'=>'project', 'enabled'=>'isModEnabled("project")', 'position'=>52, 'notnull'=>-1, 'visible'=>-1, 'index'=>1, 'css'=>'maxwidth500 widthcentpercentminusxx', 'csslist'=>'tdoverflowmax150', 'validate'=>'1',),
124 'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>3, 'validate'=>'1',),
125 'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>'1', 'position'=>61, 'notnull'=>0, 'visible'=>0, 'cssview'=>'wordbreak', 'validate'=>'1',),
126 'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>'1', 'position'=>62, 'notnull'=>0, 'visible'=>0, 'cssview'=>'wordbreak', 'validate'=>'1',),
127 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2,),
128 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>-2,),
129 'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'picto'=>'user', 'enabled'=>'1', 'position'=>510, 'notnull'=>1, 'visible'=>-2, 'foreignkey'=>'user.rowid', 'csslist'=>'tdoverflowmax150',),
130 'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'picto'=>'user', 'enabled'=>'1', 'position'=>511, 'notnull'=>-1, 'visible'=>-2, 'csslist'=>'tdoverflowmax150',),
131 'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>'1', 'position'=>1000, 'notnull'=>-1, 'visible'=>-2,),
132 'status' => array('type'=>'integer', 'label'=>'Status', 'enabled'=>'1', 'position'=>2000, 'notnull'=>1, 'default'=>0, 'visible'=>1, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Draft', '1'=>'Validated', '9'=>'Closed'), 'validate'=>'1',),
133 );
134 public $rowid;
135 public $ref;
136 public $label;
137 public $type;
138 public $visibility;
139 public $fk_soc;
140 public $fk_project;
141 public $description;
142 public $note_public;
143 public $note_private;
144 public $date_creation;
145 public $tms;
146 public $fk_user_creat;
147 public $fk_user_modif;
148 public $import_key;
149 public $status;
150 // END MODULEBUILDER PROPERTIES
151
152
158 public function __construct(DoliDB $db)
159 {
160 global $langs, $user;
161
162 $this->db = $db;
163
164 if (!getDolGlobalInt('MAIN_SHOW_TECHNICAL_ID') && isset($this->fields['rowid']) && !empty($this->fields['ref'])) {
165 $this->fields['rowid']['visible'] = 0;
166 }
167 if (!isModEnabled('multicompany') && isset($this->fields['entity'])) {
168 $this->fields['entity']['enabled'] = 0;
169 }
170
171 // Example to show how to set values of fields definition dynamically
172 /*if ($user->hasRight('bookcal', 'calendar', 'read')) {
173 $this->fields['myfield']['visible'] = 1;
174 $this->fields['myfield']['noteditable'] = 0;
175 }*/
176 $this->fields['visibility']['default'] = $user->id;
177
178 // Unset fields that are disabled
179 foreach ($this->fields as $key => $val) {
180 if (isset($val['enabled']) && empty($val['enabled'])) {
181 unset($this->fields[$key]);
182 }
183 }
184
185 // Translate some data of arrayofkeyval
186 if (is_object($langs)) {
187 foreach ($this->fields as $key => $val) {
188 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
189 foreach ($val['arrayofkeyval'] as $key2 => $val2) {
190 $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
191 }
192 }
193 }
194 }
195 }
196
204 public function create(User $user, $notrigger = false)
205 {
206 $resultcreate = $this->createCommon($user, $notrigger);
207
208 //$resultvalidate = $this->validate($user, $notrigger);
209
210 return $resultcreate;
211 }
212
220 public function createFromClone(User $user, $fromid)
221 {
222 global $langs, $extrafields;
223 $error = 0;
224
225 dol_syslog(__METHOD__, LOG_DEBUG);
226
227 $object = new self($this->db);
228
229 $this->db->begin();
230
231 // Load source object
232 $result = $object->fetchCommon($fromid);
233 if ($result > 0 && !empty($object->table_element_line)) {
234 $object->fetchLines();
235 }
236
237 // get lines so they will be clone
238 //foreach($this->lines as $line)
239 // $line->fetch_optionals();
240
241 // Reset some properties
242 unset($object->id);
243 unset($object->fk_user_creat);
244 unset($object->import_key);
245
246 // Clear fields
247 if (property_exists($object, 'ref')) {
248 $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
249 }
250 if (property_exists($object, 'label')) {
251 $object->label = empty($this->fields['label']['default']) ? $langs->trans("CopyOf")." ".$object->label : $this->fields['label']['default'];
252 }
253 if (property_exists($object, 'status')) {
254 $object->status = self::STATUS_DRAFT;
255 }
256 if (property_exists($object, 'date_creation')) {
257 $object->date_creation = dol_now();
258 }
259 if (property_exists($object, 'date_modification')) {
260 $object->date_modification = null;
261 }
262 // ...
263 // Clear extrafields that are unique
264 if (is_array($object->array_options) && count($object->array_options) > 0) {
265 $extrafields->fetch_name_optionals_label($this->table_element);
266 foreach ($object->array_options as $key => $option) {
267 $shortkey = preg_replace('/options_/', '', $key);
268 if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
269 //var_dump($key);
270 //var_dump($clonedObj->array_options[$key]); exit;
271 unset($object->array_options[$key]);
272 }
273 }
274 }
275
276 // Create clone
277 $object->context['createfromclone'] = 'createfromclone';
278 $result = $object->createCommon($user);
279 if ($result < 0) {
280 $error++;
281 $this->setErrorsFromObject($object);
282 }
283
284 if (!$error) {
285 // copy internal contacts
286 if ($this->copy_linked_contact($object, 'internal') < 0) {
287 $error++;
288 }
289 }
290
291 if (!$error) {
292 // copy external contacts if same company
293 if (!empty($object->socid) && property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
294 if ($this->copy_linked_contact($object, 'external') < 0) {
295 $error++;
296 }
297 }
298 }
299
300 unset($object->context['createfromclone']);
301
302 // End
303 if (!$error) {
304 $this->db->commit();
305 return $object;
306 } else {
307 $this->db->rollback();
308 return -1;
309 }
310 }
311
319 public function fetch($id, $ref = null)
320 {
321 $result = $this->fetchCommon($id, $ref);
322 if ($result > 0 && !empty($this->table_element_line)) {
323 $this->fetchLines();
324 }
325 return $result;
326 }
327
333 public function fetchLines()
334 {
335 $this->lines = array();
336
337 $result = $this->fetchLinesCommon();
338 return $result;
339 }
340
341
353 public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND')
354 {
355 dol_syslog(__METHOD__, LOG_DEBUG);
356
357 $records = array();
358
359 $sql = "SELECT ";
360 $sql .= $this->getFieldList('t');
361 $sql .= " FROM ".$this->db->prefix().$this->table_element." as t";
362 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
363 $sql .= " WHERE t.entity IN (".getEntity($this->element).")";
364 } else {
365 $sql .= " WHERE 1 = 1";
366 }
367 // Manage filter
368 $sqlwhere = array();
369 if (count($filter) > 0) {
370 foreach ($filter as $key => $value) {
371 if ($key == 't.rowid') {
372 $sqlwhere[] = $key." = ".((int) $value);
373 } elseif (array_key_exists($key, $this->fields) && in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) {
374 $sqlwhere[] = $key." = '".$this->db->idate($value)."'";
375 } elseif ($key == 'customsql') {
376 $sqlwhere[] = $value;
377 } elseif (strpos($value, '%') === false) {
378 $sqlwhere[] = $key." IN (".$this->db->sanitize($this->db->escape($value)).")";
379 } else {
380 $sqlwhere[] = $key." LIKE '%".$this->db->escape($value)."%'";
381 }
382 }
383 }
384 if (count($sqlwhere) > 0) {
385 $sql .= " AND (".implode(" ".$filtermode." ", $sqlwhere).")";
386 }
387
388 if (!empty($sortfield)) {
389 $sql .= $this->db->order($sortfield, $sortorder);
390 }
391 if (!empty($limit)) {
392 $sql .= $this->db->plimit($limit, $offset);
393 }
394
395 $resql = $this->db->query($sql);
396 if ($resql) {
397 $num = $this->db->num_rows($resql);
398 $i = 0;
399 while ($i < ($limit ? min($limit, $num) : $num)) {
400 $obj = $this->db->fetch_object($resql);
401
402 $record = new self($this->db);
403 $record->setVarsFromFetchObj($obj);
404
405 $records[$record->id] = $record;
406
407 $i++;
408 }
409 $this->db->free($resql);
410
411 return $records;
412 } else {
413 $this->errors[] = 'Error '.$this->db->lasterror();
414 dol_syslog(__METHOD__.' '.join(',', $this->errors), LOG_ERR);
415
416 return -1;
417 }
418 }
419
427 public function update(User $user, $notrigger = false)
428 {
429 return $this->updateCommon($user, $notrigger);
430 }
431
439 public function delete(User $user, $notrigger = false)
440 {
441 return $this->deleteCommon($user, $notrigger);
442 //return $this->deleteCommon($user, $notrigger, 1);
443 }
444
453 public function deleteLine(User $user, $idline, $notrigger = false)
454 {
455 if ($this->status < 0) {
456 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
457 return -2;
458 }
459
460 return $this->deleteLineCommon($user, $idline, $notrigger);
461 }
462
463
471 public function validate($user, $notrigger = 0)
472 {
473 global $conf;
474
475 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
476
477 $error = 0;
478
479 // Protection
480 if ($this->status == self::STATUS_VALIDATED) {
481 dol_syslog(get_class($this)."::validate action abandonned: already validated", LOG_WARNING);
482 return 0;
483 }
484
485 /*if (! ((!getDolGlobalInt('MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->bookcal->calendar->write))
486 || (getDolGlobalInt('MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->bookcal->calendar->calendar_advance->validate))))
487 {
488 $this->error='NotEnoughPermissions';
489 dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
490 return -1;
491 }*/
492
493 $now = dol_now();
494
495 $this->db->begin();
496
497 // Define new ref
498 if (!$error && (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
499 $num = $this->getNextNumRef();
500 } else {
501 $num = $this->ref;
502 }
503 $this->newref = $num;
504
505 if (!empty($num)) {
506 // Validate
507 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
508 $sql .= " SET ref = '".$this->db->escape($num)."',";
509 $sql .= " status = ".self::STATUS_VALIDATED;
510 if (!empty($this->fields['date_validation'])) {
511 $sql .= ", date_validation = '".$this->db->idate($now)."'";
512 }
513 if (!empty($this->fields['fk_user_valid'])) {
514 $sql .= ", fk_user_valid = ".((int) $user->id);
515 }
516 $sql .= " WHERE rowid = ".((int) $this->id);
517
518 dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
519 $resql = $this->db->query($sql);
520 if (!$resql) {
521 dol_print_error($this->db);
522 $this->error = $this->db->lasterror();
523 $error++;
524 }
525
526 if (!$error && !$notrigger) {
527 // Call trigger
528 $result = $this->call_trigger('MYOBJECT_VALIDATE', $user);
529 if ($result < 0) {
530 $error++;
531 }
532 // End call triggers
533 }
534 }
535
536 if (!$error) {
537 $this->oldref = $this->ref;
538
539 // Rename directory if dir was a temporary ref
540 if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
541 // Now we rename also files into index
542 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'calendar/".$this->db->escape($this->newref)."'";
543 $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'calendar/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
544 $resql = $this->db->query($sql);
545 if (!$resql) {
546 $error++;
547 $this->error = $this->db->lasterror();
548 }
549 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'calendar/".$this->db->escape($this->newref)."'";
550 $sql .= " WHERE filepath = 'calendar/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
551 $resql = $this->db->query($sql);
552 if (!$resql) {
553 $error++;
554 $this->error = $this->db->lasterror();
555 }
556
557 // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
558 $oldref = dol_sanitizeFileName($this->ref);
559 $newref = dol_sanitizeFileName($num);
560 $dirsource = $conf->bookcal->dir_output.'/calendar/'.$oldref;
561 $dirdest = $conf->bookcal->dir_output.'/calendar/'.$newref;
562 if (!$error && file_exists($dirsource)) {
563 dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
564
565 if (@rename($dirsource, $dirdest)) {
566 dol_syslog("Rename ok");
567 // Rename docs starting with $oldref with $newref
568 $listoffiles = dol_dir_list($conf->bookcal->dir_output.'/calendar/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
569 foreach ($listoffiles as $fileentry) {
570 $dirsource = $fileentry['name'];
571 $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
572 $dirsource = $fileentry['path'].'/'.$dirsource;
573 $dirdest = $fileentry['path'].'/'.$dirdest;
574 @rename($dirsource, $dirdest);
575 }
576 }
577 }
578 }
579 }
580
581 // Set new ref and current status
582 if (!$error) {
583 $this->ref = $num;
584 $this->status = self::STATUS_VALIDATED;
585 }
586
587 if (!$error) {
588 $this->db->commit();
589 return 1;
590 } else {
591 $this->db->rollback();
592 return -1;
593 }
594 }
595
596
604 public function setDraft($user, $notrigger = 0)
605 {
606 // Protection
607 if ($this->status <= self::STATUS_DRAFT) {
608 return 0;
609 }
610
611 /*if (! ((!getDolGlobalInt('MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->bookcal->write))
612 || (getDolGlobalInt('MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->bookcal->bookcal_advance->validate))))
613 {
614 $this->error='Permission denied';
615 return -1;
616 }*/
617
618 return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'MYOBJECT_UNVALIDATE');
619 }
620
628 public function cancel($user, $notrigger = 0)
629 {
630 // Protection
631 if ($this->status != self::STATUS_VALIDATED) {
632 return 0;
633 }
634
635 /*if (! ((!getDolGlobalInt('MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->bookcal->write))
636 || (getDolGlobalInt('MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->bookcal->bookcal_advance->validate))))
637 {
638 $this->error='Permission denied';
639 return -1;
640 }*/
641
642 return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'MYOBJECT_CANCEL');
643 }
644
652 public function reopen($user, $notrigger = 0)
653 {
654 // Protection
655 if ($this->status == self::STATUS_VALIDATED) {
656 return 0;
657 }
658
659 /*if (! ((!getDolGlobalInt('MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->bookcal->write))
660 || (getDolGlobalInt('MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->bookcal->bookcal_advance->validate))))
661 {
662 $this->error='Permission denied';
663 return -1;
664 }*/
665
666 return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'MYOBJECT_REOPEN');
667 }
668
676 public function getTooltipContentArray($params)
677 {
678 global $langs;
679
680 $datas = [];
681
682 if (getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER')) {
683 return ['optimize' => $langs->trans("ShowCalendar")];
684 }
685 $datas['picto'] = img_picto('', $this->picto).' <u>'.$langs->trans("Calendar").'</u>';
686 if (isset($this->status)) {
687 $datas['picto'] .= ' '.$this->getLibStatut(5);
688 }
689 $datas['ref'] .= '<br><b>'.$langs->trans('Ref').':</b> '.$this->ref;
690
691 return $datas;
692 }
693
704 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
705 {
706 global $conf, $langs, $hookmanager;
707
708 if (!empty($conf->dol_no_mouse_hover)) {
709 $notooltip = 1; // Force disable tooltips
710 }
711
712 $result = '';
713 $params = [
714 'id' => $this->id,
715 'objecttype' => $this->element.($this->module ? '@'.$this->module : ''),
716 'option' => $option,
717 ];
718 $classfortooltip = 'classfortooltip';
719 $dataparams = '';
720 if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
721 $classfortooltip = 'classforajaxtooltip';
722 $dataparams = ' data-params="'.dol_escape_htmltag(json_encode($params)).'"';
723 $label = '';
724 } else {
725 $label = implode($this->getTooltipContentArray($params));
726 }
727
728 $url = dol_buildpath('/bookcal/calendar_card.php', 1).'?id='.$this->id;
729
730 if ($option !== 'nolink') {
731 // Add param to save lastsearch_values or not
732 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
733 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
734 $add_save_lastsearch_values = 1;
735 }
736 if ($url && $add_save_lastsearch_values) {
737 $url .= '&save_lastsearch_values=1';
738 }
739 }
740
741 $linkclose = '';
742 if (empty($notooltip)) {
743 if (getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER')) {
744 $label = $langs->trans("ShowCalendar");
745 $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
746 }
747 $linkclose .= ($label ? ' title="'.dol_escape_htmltag($label, 1).'"' : ' title="tocomplete"');
748 $linkclose .= $dataparams.' class="'.$classfortooltip.($morecss ? ' '.$morecss : '').'"';
749 } else {
750 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
751 }
752
753 if ($option == 'nolink' || empty($url)) {
754 $linkstart = '<span';
755 } else {
756 $linkstart = '<a href="'.$url.'"';
757 }
758 $linkstart .= $linkclose.'>';
759 if ($option == 'nolink' || empty($url)) {
760 $linkend = '</span>';
761 } else {
762 $linkend = '</a>';
763 }
764
765 $result .= $linkstart;
766
767 if (empty($this->showphoto_on_popup)) {
768 if ($withpicto) {
769 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), (($withpicto != 2) ? 'class="paddingright"' : ''), 0, 0, $notooltip ? 0 : 1);
770 }
771 } else {
772 if ($withpicto) {
773 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
774
775 list($class, $module) = explode('@', $this->picto);
776 $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
777 $filearray = dol_dir_list($upload_dir, "files");
778 $filename = $filearray[0]['name'];
779 if (!empty($filename)) {
780 $pospoint = strpos($filearray[0]['name'], '.');
781
782 $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
783 if (!getDolGlobalInt(strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS')) {
784 $result .= '<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref"><img class="photo'.$module.'" alt="No photo" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$module.'&entity='.$conf->entity.'&file='.urlencode($pathtophoto).'"></div></div>';
785 } else {
786 $result .= '<div class="floatleft inline-block valignmiddle divphotoref"><img class="photouserphoto userphoto" alt="No photo" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$module.'&entity='.$conf->entity.'&file='.urlencode($pathtophoto).'"></div>';
787 }
788
789 $result .= '</div>';
790 } else {
791 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'"'), 0, 0, $notooltip ? 0 : 1);
792 }
793 }
794 }
795
796 if ($withpicto != 2) {
797 $result .= $this->ref;
798 }
799
800 $result .= $linkend;
801 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
802
803 global $action, $hookmanager;
804 $hookmanager->initHooks(array($this->element.'dao'));
805 $parameters = array('id' => $this->id, 'getnomurl' => &$result);
806 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
807 if ($reshook > 0) {
808 $result = $hookmanager->resPrint;
809 } else {
810 $result .= $hookmanager->resPrint;
811 }
812
813 return $result;
814 }
815
823 public function getKanbanView($option = '', $arraydata = null)
824 {
825 global $conf, $langs;
826
827 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
828
829 $return = '<div class="box-flex-item box-flex-grow-zero">';
830 $return .= '<div class="info-box info-box-sm">';
831 $return .= '<span class="info-box-icon bg-infobox-action">';
832 $return .= img_picto('', $this->picto);
833 $return .= '</span>';
834 $return .= '<div class="info-box-content">';
835 $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).'</span>';
836 if ($selected >= 0) {
837 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
838 }
839 if (property_exists($this, 'label')) {
840 $return .= ' <div class="inline-block opacitymedium valignmiddle tdoverflowmax100">'.$this->label.'</div>';
841 }
842 if (property_exists($this, 'amount')) {
843 $return .= '<br>';
844 $return .= '<span class="info-box-label amount">'.price($this->amount, 0, $langs, 1, -1, -1, $conf->currency).'</span>';
845 }
846 if (method_exists($this, 'getLibStatut')) {
847 $return .= '<br><div class="info-box-status">'.$this->getLibStatut(3).'</div>';
848 }
849 $return .= '</div>';
850 $return .= '</div>';
851 $return .= '</div>';
852
853 return $return;
854 }
855
862 public function getLabelStatus($mode = 0)
863 {
864 return $this->LibStatut($this->status, $mode);
865 }
866
873 public function getLibStatut($mode = 0)
874 {
875 return $this->LibStatut($this->status, $mode);
876 }
877
878 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
886 public function LibStatut($status, $mode = 0)
887 {
888 // phpcs:enable
889 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
890 global $langs;
891
892 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
893 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
894 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
895 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
896 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
897 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
898 }
899
900 $statusType = 'status'.$status;
901 if ($status == self::STATUS_VALIDATED) {
902 $statusType = 'status4';
903 }
904 if ($status == self::STATUS_CANCELED) {
905 $statusType = 'status6';
906 }
907
908 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
909 }
910
917 public function info($id)
918 {
919 $sql = "SELECT rowid,";
920 $sql .= " date_creation as datec, tms as datem,";
921 $sql .= " fk_user_creat, fk_user_modif";
922 $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
923 $sql .= " WHERE t.rowid = ".((int) $id);
924
925 $result = $this->db->query($sql);
926 if ($result) {
927 if ($this->db->num_rows($result)) {
928 $obj = $this->db->fetch_object($result);
929
930 $this->id = $obj->rowid;
931
932 $this->user_creation_id = $obj->fk_user_creat;
933 $this->user_modification_id = $obj->fk_user_modif;
934 $this->date_creation = $this->db->jdate($obj->datec);
935 $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
936 }
937
938 $this->db->free($result);
939 } else {
940 dol_print_error($this->db);
941 }
942 }
943
950 public function initAsSpecimen()
951 {
952 // Set here init that are not commonf fields
953 // $this->property1 = ...
954 // $this->property2 = ...
955
956 $this->initAsSpecimenCommon();
957 }
958
964 public function getLinesArray()
965 {
966 $this->lines = array();
967
968 $objectline = new CalendarLine($this->db);
969 $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_calendar = '.((int) $this->id)));
970
971 if (is_numeric($result)) {
972 $this->setErrorsFromObject($objectline);
973 return $result;
974 } else {
975 $this->lines = $result;
976 return $this->lines;
977 }
978 }
979
985 public function getNextNumRef()
986 {
987 global $langs, $conf;
988 $langs->load("agenda");
989
990 if (getDolGlobalString('BOOKCAL_MYOBJECT_ADDON')) {
991 $conf->global->BOOKCAL_MYOBJECT_ADDON = 'mod_calendar_standard';
992 }
993
994 if (getDolGlobalString('BOOKCAL_MYOBJECT_ADDON')) {
995 $mybool = false;
996
997 $file = getDolGlobalString('BOOKCAL_MYOBJECT_ADDON').".php";
998 $classname = getDolGlobalString('BOOKCAL_MYOBJECT_ADDON');
999
1000 // Include file with class
1001 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
1002 foreach ($dirmodels as $reldir) {
1003 $dir = dol_buildpath($reldir."core/modules/bookcal/");
1004
1005 // Load file with numbering class (if found)
1006 $mybool |= @include_once $dir.$file;
1007 }
1008
1009 if ($mybool === false) {
1010 dol_print_error('', "Failed to include file ".$file);
1011 return '';
1012 }
1013
1014 if (class_exists($classname)) {
1015 $obj = new $classname();
1016 $numref = $obj->getNextValue($this);
1017
1018 if ($numref != '' && $numref != '-1') {
1019 return $numref;
1020 } else {
1021 $this->error = $obj->error;
1022 //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
1023 return "";
1024 }
1025 } else {
1026 print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
1027 return "";
1028 }
1029 } else {
1030 print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
1031 return "";
1032 }
1033 }
1034
1046 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
1047 {
1048 global $conf, $langs;
1049
1050 $result = 0;
1051 $includedocgeneration = 0;
1052
1053 $langs->load("agenda");
1054
1055 if (!dol_strlen($modele)) {
1056 $modele = 'standard_calendar';
1057
1058 if (!empty($this->model_pdf)) {
1059 $modele = $this->model_pdf;
1060 } elseif (getDolGlobalString('MYOBJECT_ADDON_PDF')) {
1061 $modele = getDolGlobalString('MYOBJECT_ADDON_PDF');
1062 }
1063 }
1064
1065 $modelpath = "core/modules/bookcal/doc/";
1066
1067 if ($includedocgeneration && !empty($modele)) {
1068 $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1069 }
1070
1071 return $result;
1072 }
1073
1081 public function doScheduledJob()
1082 {
1083 //global $conf, $langs;
1084
1085 //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log';
1086
1087 $error = 0;
1088 $this->output = '';
1089 $this->error = '';
1090
1091 dol_syslog(__METHOD__, LOG_DEBUG);
1092
1093 $now = dol_now();
1094
1095 $this->db->begin();
1096
1097 // ...
1098
1099 $this->db->commit();
1100
1101 return $error;
1102 }
1103}
1104
1105
1106require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
1107
1112{
1113 // To complete with content of an object CalendarLine
1114 // We should have a field rowid, fk_calendar and position
1115
1119 public $isextrafieldmanaged = 0;
1120
1126 public function __construct(DoliDB $db)
1127 {
1128 $this->db = $db;
1129 }
1130}
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Definition security.php:604
$object ref
Definition info.php:79
Class for Calendar.
createFromClone(User $user, $fromid)
Clone an object into another one.
getLinesArray()
Create an array of lines.
getKanbanView($option='', $arraydata=null)
Return a thumb for kanban views.
getTooltipContentArray($params)
getTooltipContentArray
getLabelStatus($mode=0)
Return the label of the status.
__construct(DoliDB $db)
Constructor.
setDraft($user, $notrigger=0)
Set draft status.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module.
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionaly the picto)
info($id)
Load the info information in the object.
LibStatut($status, $mode=0)
Return the label of a given status.
validate($user, $notrigger=0)
Validate object.
cancel($user, $notrigger=0)
Set cancel status.
getLibStatut($mode=0)
Return the label of the status.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter=array(), $filtermode='AND')
Load list of objects in memory from the database.
deleteLine(User $user, $idline, $notrigger=false)
Delete a line of object in database.
update(User $user, $notrigger=false)
Update object into database.
doScheduledJob()
Action executed by scheduler CAN BE A CRON TASK.
create(User $user, $notrigger=false)
Create object into database.
reopen($user, $notrigger=0)
Set back to validated status.
fetch($id, $ref=null)
Load object in memory from the database.
fetchLines()
Load object lines in memory from the database.
Class CalendarLine.
__construct(DoliDB $db)
Constructor.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
deleteLineCommon(User $user, $idline, $notrigger=false)
Delete a line of object in database.
setErrorsFromObject($object)
setErrorsFromObject
createCommon(User $user, $notrigger=false)
Create object into database.
deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
Delete object in database.
getFieldList($alias='', $excludefields=array())
Function to concat keys of fields.
setStatusCommon($user, $status, $notrigger=0, $triggercode='')
Set to a status.
initAsSpecimenCommon()
Initialise object with example values Id must be 0 if object instance is a specimen.
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
updateCommon(User $user, $notrigger=false)
Update object into database.
fetchLinesCommon($morewhere='', $noextrafields=0)
Load object in memory from the database.
fetchCommon($id, $ref=null, $morewhere='', $noextrafields=0)
Load object in memory from the database.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage Dolibarr database access.
Class to manage Dolibarr users.
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition files.lib.php:62
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)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
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)
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
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.