dolibarr 23.0.3
availabilities.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2022 Alice Adminson <aadminson@example.com>
4 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
5 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
27// Put here all includes required by your class file
28require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
29
34{
38 public $module = 'bookcal';
39
43 public $element = 'availabilities';
44
49 public $TRIGGER_PREFIX = 'AVAILABILITIES';
50
54 public $table_element = 'bookcal_availabilities';
55
59 public $picto = 'fa-calendar-check';
60
61
62 const STATUS_DRAFT = 0;
63 const STATUS_VALIDATED = 1;
64 const STATUS_CANCELED = 9;
65
66
106 // BEGIN MODULEBUILDER PROPERTIES
110 public $fields = array(
111 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'visible' => 2, 'noteditable' => 1, 'index' => 1, 'css' => 'left', 'comment' => "Id"),
112 'label' => array('type' => 'varchar(255)', 'label' => 'Label', 'enabled' => 1, 'position' => 20, 'notnull' => 0, 'visible' => 1, 'searchall' => 1, 'css' => 'minwidth300', 'csslist' => 'tdoverflowmax150', 'cssview' => 'wordbreak', 'help' => "BookcalLabelAvailabilityHelp", 'showoncombobox' => 2, 'validate' => 1,),
113 'fk_bookcal_calendar' => array('type' => 'integer:Calendar:bookcal/class/calendar.class.php:1', 'label' => 'Calendar', 'enabled' => 1, 'position' => 25, 'notnull' => 1, 'visible' => 1, 'css' => 'maxwidth500 widthcentpercentminusxx', 'csslist' => 'tdoverflowmax100'),
114 'description' => array('type' => 'text', 'label' => 'Description', 'enabled' => 1, 'position' => 60, 'notnull' => 0, 'visible' => 3, 'validate' => 1,),
115 'note_public' => array('type' => 'html', 'label' => 'NotePublic', 'enabled' => 1, 'position' => 61, 'notnull' => 0, 'visible' => 0, 'cssview' => 'wordbreak', 'validate' => 1,),
116 'note_private' => array('type' => 'html', 'label' => 'NotePrivate', 'enabled' => 1, 'position' => 62, 'notnull' => 0, 'visible' => 0, 'cssview' => 'wordbreak', 'validate' => 1,),
117 'date_creation' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'position' => 500, 'notnull' => 1, 'visible' => -2,),
118 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'position' => 501, 'notnull' => 0, 'visible' => -2,),
119 'fk_user_creat' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserAuthor', 'picto' => 'user', 'enabled' => 1, 'position' => 510, 'notnull' => 1, 'visible' => -2, 'css' => 'maxwidth500 widthcentpercentminusxx', 'csslist' => 'tdoverflowmax150'),
120 'fk_user_modif' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserModif', 'picto' => 'user', 'enabled' => 1, 'position' => 511, 'notnull' => -1, 'visible' => -2, 'css' => 'maxwidth500 widthcentpercentminusxx', 'csslist' => 'tdoverflowmax150'),
121 'last_main_doc' => array('type' => 'varchar(255)', 'label' => 'LastMainDoc', 'enabled' => 1, 'position' => 600, 'notnull' => 0, 'visible' => 0,),
122 'import_key' => array('type' => 'varchar(14)', 'label' => 'ImportId', 'enabled' => 1, 'position' => 1000, 'notnull' => -1, 'visible' => -2,),
123 'model_pdf' => array('type' => 'varchar(255)', 'label' => 'Model pdf', 'enabled' => 1, 'position' => 1010, 'notnull' => -1, 'visible' => 0,),
124 'start' => array('type' => 'date', 'label' => 'Start Date', 'enabled' => 1, 'position' => 40, 'notnull' => 1, 'visible' => 1, 'searchall' => 1,),
125 'end' => array('type' => 'date', 'label' => 'End Date', 'enabled' => 1, 'position' => 45, 'notnull' => 1, 'visible' => 1, 'searchall' => 1,),
126 'duration' => array('type' => 'integer', 'label' => 'DurationOfRange', 'enabled' => 1, 'position' => 48, 'notnull' => 1, 'visible' => 1, 'default' => '30', 'css' => 'width50 right'),
127 'startHour' => array('type' => 'integer', 'label' => 'Start Hour', 'enabled' => 1, 'position' => 46, 'notnull' => 1, 'visible' => 1,),
128 'endHour' => array('type' => 'integer', 'label' => 'End Hour', 'enabled' => 1, 'position' => 47, 'notnull' => 1, 'visible' => 1,),
129 'status' => array('type' => 'integer', 'label' => 'Status', 'enabled' => 1, 'position' => 2000, 'notnull' => 1, 'visible' => 1, 'index' => 1, 'arrayofkeyval' => array(0 => 'Draft', 1 => 'Validated', 9 => 'Closed'), 'default' => '1', 'validate' => 1),
130 );
134 public $rowid;
138 public $label;
142 public $description;
146 public $note_public;
150 public $note_private;
154 public $fk_user_creat;
158 public $fk_user_modif;
162 public $last_main_doc;
166 public $import_key;
170 public $model_pdf;
171
175 public $start;
179 public $end;
183 public $duration;
187 public $startHour;
191 public $endHour;
195 public $fk_bookcal_calendar;
196 // END MODULEBUILDER PROPERTIES
197
203 public function __construct(DoliDB $db)
204 {
205 global $conf, $langs;
206
207 $this->db = $db;
208
209 $this->ismultientitymanaged = 'fk_bookcal_calendar@bookcal_calendar';
210 $this->isextrafieldmanaged = 1;
211
212 if (!getDolGlobalString('MAIN_SHOW_TECHNICAL_ID') && isset($this->fields['rowid']) && !empty($this->fields['ref'])) { // @phan-suppress-current-line PhanTypeMismatchProperty
213 $this->fields['rowid']['visible'] = 0;
214 }
215 if (!isModEnabled('multicompany') && isset($this->fields['entity'])) {
216 $this->fields['entity']['enabled'] = 0;
217 }
218
219 // Example to show how to set values of fields definition dynamically
220 /*if ($user->hasRight('bookcal', 'availabilities', 'read')) {
221 $this->fields['myfield']['visible'] = 1;
222 $this->fields['myfield']['noteditable'] = 0;
223 }*/
224
225 // Unset fields that are disabled
226 foreach ($this->fields as $key => $val) {
227 if (isset($val['enabled']) && empty($val['enabled'])) {
228 unset($this->fields[$key]);
229 }
230 }
231
232 // Translate some data of arrayofkeyval
233 if (is_object($langs)) {
234 foreach ($this->fields as $key => $val) {
235 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
236 foreach ($val['arrayofkeyval'] as $key2 => $val2) {
237 $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
238 }
239 }
240 }
241 }
242 }
243
251 public function create(User $user, $notrigger = 0)
252 {
253 $resultcreate = $this->createCommon($user, $notrigger);
254
255 //$resultvalidate = $this->validate($user, $notrigger);
256
257 return $resultcreate;
258 }
259
267 public function createFromClone(User $user, $fromid)
268 {
269 global $langs, $extrafields;
270 $error = 0;
271
272 dol_syslog(__METHOD__, LOG_DEBUG);
273
274 $object = new self($this->db);
275
276 $this->db->begin();
277
278 // Load source object
279 $result = $object->fetchCommon($fromid);
280 if ($result > 0 && !empty($object->table_element_line)) {
281 $object->fetchLines();
282 }
283
284 // get lines so they will be clone
285 //foreach($this->lines as $line)
286 // $line->fetch_optionals();
287
288 // Reset some properties
289 unset($object->id);
290 unset($object->fk_user_creat);
291 unset($object->import_key);
292
293 // Clear fields
294 $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
295 $object->label = $langs->trans("CopyOf")." ".$object->label;
296 $object->status = self::STATUS_DRAFT;
297 $object->date_creation = dol_now();
298 $object->date_modification = null;
299
300 // Clear extrafields that are unique
301 if (is_array($object->array_options) && count($object->array_options) > 0) {
302 $extrafields->fetch_name_optionals_label($this->table_element);
303 foreach ($object->array_options as $key => $option) {
304 $shortkey = preg_replace('/options_/', '', $key);
305 if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
306 //var_dump($key);
307 //var_dump($clonedObj->array_options[$key]); exit;
308 unset($object->array_options[$key]);
309 }
310 }
311 }
312
313 // Create clone
314 $object->context['createfromclone'] = 'createfromclone';
315 $result = $object->createCommon($user);
316 if ($result < 0) {
317 $error++;
319 }
320
321 if (!$error) {
322 // copy internal contacts
323 if ($this->copy_linked_contact($object, 'internal') < 0) {
324 $error++;
325 }
326 }
327
328 unset($object->context['createfromclone']);
329
330 // End
331 if (!$error) {
332 $this->db->commit();
333 return $object;
334 } else {
335 $this->db->rollback();
336 return -1;
337 }
338 }
339
347 public function fetch($id, $ref = null)
348 {
349 $result = $this->fetchCommon($id, $ref);
350 if ($result > 0 && !empty($this->table_element_line)) {
351 $this->fetchLines();
352 }
353 return $result;
354 }
355
361 public function fetchLines()
362 {
363 $this->lines = array();
364
365 $result = $this->fetchLinesCommon();
366 return $result;
367 }
368
369
382 public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, $filter = '', $filtermode = 'AND')
383 {
384 dol_syslog(__METHOD__, LOG_DEBUG);
385
386 $records = array();
387
388 $sql = "SELECT ";
389 $sql .= $this->getFieldList('t');
390 $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
391 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
392 $sql .= " WHERE t.entity IN (".getEntity($this->element).")";
393 } else {
394 $sql .= " WHERE 1 = 1";
395 }
396
397 // Manage filter
398 $errormessage = '';
399 $sql .= forgeSQLFromUniversalSearchCriteria($filter, $errormessage);
400 if ($errormessage) {
401 $this->errors[] = $errormessage;
402 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
403 return -1;
404 }
405
406 if (!empty($sortfield)) {
407 $sql .= $this->db->order($sortfield, $sortorder);
408 }
409 if (!empty($limit)) {
410 $sql .= $this->db->plimit($limit, $offset);
411 }
412
413 $resql = $this->db->query($sql);
414 if ($resql) {
415 $num = $this->db->num_rows($resql);
416 $i = 0;
417 while ($i < ($limit ? min($limit, $num) : $num)) {
418 $obj = $this->db->fetch_object($resql);
419
420 $record = new self($this->db);
421 $record->setVarsFromFetchObj($obj);
422
423 $records[$record->id] = $record;
424
425 $i++;
426 }
427 $this->db->free($resql);
428
429 return $records;
430 } else {
431 $this->errors[] = 'Error '.$this->db->lasterror();
432 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
433
434 return -1;
435 }
436 }
437
445 public function update(User $user, $notrigger = 0)
446 {
447 return $this->updateCommon($user, $notrigger);
448 }
449
457 public function delete(User $user, $notrigger = 0)
458 {
459 return $this->deleteCommon($user, $notrigger);
460 //return $this->deleteCommon($user, $notrigger, 1);
461 }
462
471 public function deleteLine(User $user, $idline, $notrigger = 0)
472 {
473 if ($this->status < 0) {
474 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
475 return -2;
476 }
477
478 return $this->deleteLineCommon($user, $idline, $notrigger);
479 }
480
481
489 public function validate($user, $notrigger = 0)
490 {
491 global $conf;
492
493 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
494
495 $error = 0;
496
497 // Protection
498 if ($this->status == self::STATUS_VALIDATED) {
499 dol_syslog(get_class($this)."::validate action abandoned: already validated", LOG_WARNING);
500 return 0;
501 }
502
503 $now = dol_now();
504
505 $this->db->begin();
506
507 // Define new ref
508 if (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref)) { // empty should not happened, but when it occurs, the test save life
509 $num = $this->getNextNumRef();
510 } else {
511 $num = (string) $this->ref;
512 }
513 $this->newref = $num;
514
515 if (!empty($num)) {
516 // Validate
517 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
518 $sql .= " SET label = '".$this->db->escape($num)."',";
519 $sql .= " status = ".self::STATUS_VALIDATED;
520 if (!empty($this->fields['date_validation'])) { // @phan-suppress-current-line PhanTypeMismatchProperty
521 $sql .= ", date_validation = '".$this->db->idate($now)."'";
522 }
523 if (!empty($this->fields['fk_user_valid'])) { // @phan-suppress-current-line PhanTypeMismatchProperty
524 $sql .= ", fk_user_valid = ".((int) $user->id);
525 }
526 $sql .= " WHERE rowid = ".((int) $this->id);
527
528 dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
529 $resql = $this->db->query($sql);
530 if (!$resql) {
531 dol_print_error($this->db);
532 $this->error = $this->db->lasterror();
533 $error++;
534 }
535
536 if (!$error && !$notrigger) {
537 // Call trigger
538 $result = $this->call_trigger('AVAILABILITIES_VALIDATE', $user);
539 if ($result < 0) {
540 $error++;
541 }
542 // End call triggers
543 }
544 }
545
546 if (!$error) {
547 $this->oldref = $this->ref;
548
549 // Rename directory if dir was a temporary ref
550 if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
551 // Now we rename also files into index
552 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'availabilities/".$this->db->escape($this->newref)."'";
553 $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'availabilities/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
554 $resql = $this->db->query($sql);
555 if (!$resql) {
556 $error++;
557 $this->error = $this->db->lasterror();
558 }
559 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'availabilities/".$this->db->escape($this->newref)."'";
560 $sql .= " WHERE filepath = 'availabilities/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
561 $resql = $this->db->query($sql);
562 if (!$resql) {
563 $error++;
564 $this->error = $this->db->lasterror();
565 }
566
567 // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
568 $oldref = dol_sanitizeFileName($this->ref);
569 $newref = dol_sanitizeFileName($num);
570 $dirsource = $conf->bookcal->dir_output.'/availabilities/'.$oldref;
571 $dirdest = $conf->bookcal->dir_output.'/availabilities/'.$newref;
572 if (!$error && file_exists($dirsource)) {
573 dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
574
575 if (@rename($dirsource, $dirdest)) {
576 dol_syslog("Rename ok");
577 // Rename docs starting with $oldref with $newref
578 $listoffiles = dol_dir_list($conf->bookcal->dir_output.'/availabilities/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
579 foreach ($listoffiles as $fileentry) {
580 $dirsource = $fileentry['name'];
581 $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
582 $dirsource = $fileentry['path'].'/'.$dirsource;
583 $dirdest = $fileentry['path'].'/'.$dirdest;
584 @rename($dirsource, $dirdest);
585 }
586 }
587 }
588 }
589 }
590
591 // Set new ref and current status
592 if (!$error) {
593 $this->ref = $num;
594 $this->status = self::STATUS_VALIDATED;
595 }
596
597 if (!$error) {
598 $this->db->commit();
599 return 1;
600 } else {
601 $this->db->rollback();
602 return -1;
603 }
604 }
605
606
614 public function setDraft($user, $notrigger = 0)
615 {
616 // Protection
617 if ($this->status <= self::STATUS_DRAFT) {
618 return 0;
619 }
620
621 return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'AVAILABILITIES_UNVALIDATE');
622 }
623
631 public function cancel($user, $notrigger = 0)
632 {
633 // Protection
634 if ($this->status != self::STATUS_VALIDATED) {
635 return 0;
636 }
637
638 return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'AVAILABILITIES_CANCEL');
639 }
640
648 public function reopen($user, $notrigger = 0)
649 {
650 // Protection
651 if ($this->status != self::STATUS_CANCELED) {
652 return 0;
653 }
654
655 return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'AVAILABILITIES_REOPEN');
656 }
657
668 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
669 {
670 global $conf, $langs, $hookmanager;
671
672 if (!empty($conf->dol_no_mouse_hover)) {
673 $notooltip = 1; // Force disable tooltips
674 }
675
676 $result = '';
677
678 $label = img_picto('', $this->picto).' <u>'.$langs->trans("Availabilities").'</u>';
679 if (isset($this->status)) {
680 $label .= ' '.$this->getLibStatut(5);
681 }
682 $label .= '<br>';
683 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
684
685 $url = dol_buildpath('/bookcal/availabilities_card.php', 1).'?id='.$this->id;
686
687 if ($option != 'nolink') {
688 // Add param to save lastsearch_values or not
689 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
690 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
691 $add_save_lastsearch_values = 1;
692 }
693 if ($add_save_lastsearch_values) {
694 $url .= '&save_lastsearch_values=1';
695 }
696 }
697
698 $linkclose = '';
699 if (empty($notooltip)) {
700 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
701 $label = $langs->trans("ShowAvailabilities");
702 $linkclose .= ' alt="'.dolPrintHTMLForAttribute($label).'"';
703 }
704 $linkclose .= ' title="'.dolPrintHTMLForAttribute($label).'"';
705 $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
706 } else {
707 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
708 }
709
710 if ($option == 'nolink') {
711 $linkstart = '<span';
712 } else {
713 $linkstart = '<a href="'.$url.'"';
714 }
715 $linkstart .= $linkclose.'>';
716 if ($option == 'nolink') {
717 $linkend = '</span>';
718 } else {
719 $linkend = '</a>';
720 }
721
722 $result .= $linkstart;
723
724 if (empty($this->showphoto_on_popup)) {
725 if ($withpicto) {
726 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
727 }
728 } else {
729 if ($withpicto) {
730 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
731
732 list($class, $module) = explode('@', $this->picto);
733 $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
734 $filearray = dol_dir_list($upload_dir, "files");
735 $filename = $filearray[0]['name'];
736 if (!empty($filename)) {
737 $pospoint = strpos($filearray[0]['name'], '.');
738
739 $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
740 if (!getDolGlobalString(strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS')) {
741 $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>';
742 } else {
743 $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>';
744 }
745
746 $result .= '</div>';
747 } else {
748 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
749 }
750 }
751 }
752
753 if ($withpicto != 2) {
754 $result .= $this->ref;
755 }
756
757 $result .= $linkend;
758 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
759
760 global $action, $hookmanager;
761 $hookmanager->initHooks(array('availabilitiesdao'));
762 $parameters = array('id' => $this->id, 'getnomurl' => &$result);
763 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
764 if ($reshook > 0) {
765 $result = $hookmanager->resPrint;
766 } else {
767 $result .= $hookmanager->resPrint;
768 }
769
770 return $result;
771 }
772
780 public function getKanbanView($option = '', $arraydata = null)
781 {
782 global $conf, $langs;
783
784 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
785
786 $return = '<div class="box-flex-item box-flex-grow-zero">';
787 $return .= '<div class="info-box info-box-sm">';
788 $return .= '<span class="info-box-icon bg-infobox-action">';
789 $return .= img_picto('', $this->picto);
790 $return .= '</span>';
791 $return .= '<div class="info-box-content">';
792 $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">' . $this->getNomUrl() . '</span>';
793 if ($selected >= 0) {
794 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
795 }
796 $return .= ' <div class="inline-block opacitymedium valignmiddle tdoverflowmax100">'.$this->label.'</div>';
797 $return .= '<br><div class="info-box-status">'.$this->getLibStatut(3).'</div>';
798 $return .= '</div>';
799 $return .= '</div>';
800 $return .= '</div>';
801
802 return $return;
803 }
804
811 public function getLabelStatus($mode = 0)
812 {
813 return $this->LibStatut($this->status, $mode);
814 }
815
822 public function getLibStatut($mode = 0)
823 {
824 return $this->LibStatut($this->status, $mode);
825 }
826
827 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
835 public function LibStatut($status, $mode = 0)
836 {
837 // phpcs:enable
838 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
839 global $langs;
840 //$langs->load("agenda");
841 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
842 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
843 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
844 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
845 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
846 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
847 }
848
849 $statusType = 'status'.$status;
850 if ($status == self::STATUS_VALIDATED) {
851 $statusType = 'status4';
852 }
853 if ($status == self::STATUS_CANCELED) {
854 $statusType = 'status6';
855 }
856
857 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
858 }
859
866 public function info($id)
867 {
868 $sql = "SELECT rowid,";
869 $sql .= " date_creation as datec, tms as datem,";
870 $sql .= " fk_user_creat, fk_user_modif";
871 $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
872 $sql .= " WHERE t.rowid = ".((int) $id);
873
874 $result = $this->db->query($sql);
875 if ($result) {
876 if ($this->db->num_rows($result)) {
877 $obj = $this->db->fetch_object($result);
878
879 $this->id = $obj->rowid;
880
881 $this->user_creation_id = $obj->fk_user_creat;
882 $this->user_modification_id = $obj->fk_user_modif;
883 $this->date_creation = $this->db->jdate($obj->datec);
884 $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
885 }
886
887 $this->db->free($result);
888 } else {
889 dol_print_error($this->db);
890 }
891 }
892
899 public function initAsSpecimen()
900 {
901 // Set here init that are not commonf fields
902 // $this->property1 = ...
903 // $this->property2 = ...
904
905 return $this->initAsSpecimenCommon();
906 }
907
913 public function getLinesArray()
914 {
915 $this->lines = array();
916
917 $objectline = new AvailabilitiesLine($this->db);
918 $result = $objectline->fetchAll('ASC', 'position', 0, 0, '(fk_availabilities:=:'.((int) $this->id).')');
919
920 if (is_numeric($result)) {
921 $this->setErrorsFromObject($objectline);
922 return $result;
923 } else {
924 $this->lines = $result;
925 return $this->lines;
926 }
927 }
928
934 public function getNextNumRef()
935 {
936 // Not used
937 return '';
938 }
939
951 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
952 {
953 global $langs;
954
955 $result = 0;
956
957 $langs->load("agenda");
958
959 if (!dol_strlen($modele)) {
960 $modele = 'standard_availabilities';
961
962 if (!empty($this->model_pdf)) {
963 $modele = $this->model_pdf;
964 } elseif (getDolGlobalString('AVAILABILITIES_ADDON_PDF')) {
965 $modele = getDolGlobalString('AVAILABILITIES_ADDON_PDF');
966 }
967 }
968
969 $modelpath = "core/modules/bookcal/doc/";
970
971 if (!empty($modele)) {
972 $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
973 }
974
975 return $result;
976 }
977
985 public function doScheduledJob()
986 {
987 global $conf, $langs;
988
989 //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log';
990
991 $error = 0;
992 $this->output = '';
993 $this->error = '';
994
995 dol_syslog(__METHOD__, LOG_DEBUG);
996
997 $now = dol_now();
998
999 $this->db->begin();
1000
1001 // ...
1002
1003 $this->db->commit();
1004
1005 return $error;
1006 }
1007}
1008
1009
1010require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
1011
1016{
1017 // To complete with content of an object AvailabilitiesLine
1018 // We should have a field rowid, fk_availabilities and position
1019
1025 public function __construct(DoliDB $db)
1026 {
1027 $this->db = $db;
1028 $this->isextrafieldmanaged = 0;
1029 }
1030}
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$object ref
Definition info.php:90
Class for Availabilities.
create(User $user, $notrigger=0)
Create object into database.
getLabelStatus($mode=0)
Return the label of the status.
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module.
fetch($id, $ref=null)
Load object in memory from the database.
fetchLines()
Load object lines in memory from the database.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
doScheduledJob()
Action executed by scheduler CAN BE A CRON TASK.
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionally the picto)
getLibStatut($mode=0)
Return the label of the status.
__construct(DoliDB $db)
Constructor.
LibStatut($status, $mode=0)
Return the status.
createFromClone(User $user, $fromid)
Clone an object into another one.
info($id)
Load the info information in the object.
deleteLine(User $user, $idline, $notrigger=0)
Delete a line of object in database.
update(User $user, $notrigger=0)
Update object into database.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
setDraft($user, $notrigger=0)
Set draft status.
validate($user, $notrigger=0)
Validate object.
getKanbanView($option='', $arraydata=null)
Return a thumb for kanban views.
getLinesArray()
Create an array of lines.
cancel($user, $notrigger=0)
Set cancel status.
reopen($user, $notrigger=0)
Set back to validated status.
Class AvailabilitiesLine.
__construct(DoliDB $db)
Constructor.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
deleteLineCommon(User $user, $idline, $notrigger=0)
Delete a line of object in database.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
setErrorsFromObject($object)
setErrorsFromObject
createCommon(User $user, $notrigger=0)
Create object in the database.
getFieldList($alias='', $excludefields=array())
Function to concat keys of fields.
updateCommon(User $user, $notrigger=0)
Update object into database.
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.
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.
deleteCommon(User $user, $notrigger=0, $forcechilddeletion=0)
Delete object in database.
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.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Definition index.php:171
dol_dir_list($utf8_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:64
dol_now($mode='gmt')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.