dolibarr 21.0.0-alpha
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 Frédéric France <frederic.france@free.fr>
5 * Copyright (C) 2024 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//require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
30//require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
31
36{
40 public $module = 'bookcal';
41
45 public $element = 'availabilities';
46
50 public $table_element = 'bookcal_availabilities';
51
55 public $picto = 'fa-calendar-check';
56
57
58 const STATUS_DRAFT = 0;
59 const STATUS_VALIDATED = 1;
60 const STATUS_CANCELED = 9;
61
62
102 // BEGIN MODULEBUILDER PROPERTIES
106 public $fields = array(
107 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'visible' => 2, 'noteditable' => 1, 'index' => 1, 'css' => 'left', 'comment' => "Id"),
108 '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,),
109 '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'),
110 'description' => array('type' => 'text', 'label' => 'Description', 'enabled' => 1, 'position' => 60, 'notnull' => 0, 'visible' => 3, 'validate' => 1,),
111 'note_public' => array('type' => 'html', 'label' => 'NotePublic', 'enabled' => 1, 'position' => 61, 'notnull' => 0, 'visible' => 0, 'cssview' => 'wordbreak', 'validate' => 1,),
112 'note_private' => array('type' => 'html', 'label' => 'NotePrivate', 'enabled' => 1, 'position' => 62, 'notnull' => 0, 'visible' => 0, 'cssview' => 'wordbreak', 'validate' => 1,),
113 'date_creation' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'position' => 500, 'notnull' => 1, 'visible' => -2,),
114 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'position' => 501, 'notnull' => 0, 'visible' => -2,),
115 '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'),
116 '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'),
117 'last_main_doc' => array('type' => 'varchar(255)', 'label' => 'LastMainDoc', 'enabled' => 1, 'position' => 600, 'notnull' => 0, 'visible' => 0,),
118 'import_key' => array('type' => 'varchar(14)', 'label' => 'ImportId', 'enabled' => 1, 'position' => 1000, 'notnull' => -1, 'visible' => -2,),
119 'model_pdf' => array('type' => 'varchar(255)', 'label' => 'Model pdf', 'enabled' => 1, 'position' => 1010, 'notnull' => -1, 'visible' => 0,),
120 'start' => array('type' => 'date', 'label' => 'Start Date', 'enabled' => 1, 'position' => 40, 'notnull' => 1, 'visible' => 1, 'searchall' => 1,),
121 'end' => array('type' => 'date', 'label' => 'End Date', 'enabled' => 1, 'position' => 45, 'notnull' => 1, 'visible' => 1, 'searchall' => 1,),
122 'duration' => array('type' => 'integer', 'label' => 'DurationOfRange', 'enabled' => 1, 'position' => 47, 'notnull' => 1, 'visible' => 1, 'default' => '30', 'css' => 'width50 right'),
123 'startHour' => array('type' => 'integer', 'label' => 'Start Hour', 'enabled' => 1, 'position' => 46, 'notnull' => 1, 'visible' => 1,),
124 'endHour' => array('type' => 'integer', 'label' => 'End Hour', 'enabled' => 1, 'position' => 46.5, 'notnull' => 1, 'visible' => 1,),
125 '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),
126 );
127 public $rowid;
128 public $label;
129 public $description;
130 public $note_public;
131 public $note_private;
132 public $fk_user_creat;
133 public $fk_user_modif;
134 public $last_main_doc;
135 public $import_key;
136 public $model_pdf;
137 public $status;
138 public $start;
139 public $end;
140 public $duration;
141 public $startHour;
142 public $endHour;
143 public $fk_bookcal_calendar;
144 // END MODULEBUILDER PROPERTIES
145
146
147 // If this object has a subtable with lines
148
149 // /**
150 // * @var string Name of subtable line
151 // */
152 // public $table_element_line = 'bookcal_availabilitiesline';
153
154 // /**
155 // * @var string Field with ID of parent key if this object has a parent
156 // */
157 // public $fk_element = 'fk_availabilities';
158
159 // /**
160 // * @var string Name of subtable class that manage subtable lines
161 // */
162 // public $class_element_line = 'Availabilitiesline';
163
164 // /**
165 // * @var array List of child tables. To test if we can delete object.
166 // */
167 // protected $childtables = array();
168
169 // /**
170 // * @var array List of child tables. To know object to delete on cascade.
171 // * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will
172 // * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object
173 // */
174 // protected $childtablesoncascade = array('bookcal_availabilitiesdet');
175
176 // /**
177 // * @var AvailabilitiesLine[] Array of subtable lines
178 // */
179 // public $lines = array();
180
181
182
188 public function __construct(DoliDB $db)
189 {
190 global $conf, $langs;
191
192 $this->db = $db;
193
194 $this->ismultientitymanaged = 'fk_bookcal_calendar@bookcal_calendar';
195 $this->isextrafieldmanaged = 1;
196
197 if (!getDolGlobalString('MAIN_SHOW_TECHNICAL_ID') && isset($this->fields['rowid']) && !empty($this->fields['ref'])) {
198 $this->fields['rowid']['visible'] = 0;
199 }
200 if (empty($conf->multicompany->enabled) && isset($this->fields['entity'])) {
201 $this->fields['entity']['enabled'] = 0;
202 }
203
204 // Example to show how to set values of fields definition dynamically
205 /*if ($user->hasRight('bookcal', 'availabilities', 'read')) {
206 $this->fields['myfield']['visible'] = 1;
207 $this->fields['myfield']['noteditable'] = 0;
208 }*/
209
210 // Unset fields that are disabled
211 foreach ($this->fields as $key => $val) {
212 if (isset($val['enabled']) && empty($val['enabled'])) {
213 unset($this->fields[$key]);
214 }
215 }
216
217 // Translate some data of arrayofkeyval
218 if (is_object($langs)) {
219 foreach ($this->fields as $key => $val) {
220 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
221 foreach ($val['arrayofkeyval'] as $key2 => $val2) {
222 $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
223 }
224 }
225 }
226 }
227 }
228
236 public function create(User $user, $notrigger = 0)
237 {
238 $resultcreate = $this->createCommon($user, $notrigger);
239
240 //$resultvalidate = $this->validate($user, $notrigger);
241
242 return $resultcreate;
243 }
244
252 public function createFromClone(User $user, $fromid)
253 {
254 global $langs, $extrafields;
255 $error = 0;
256
257 dol_syslog(__METHOD__, LOG_DEBUG);
258
259 $object = new self($this->db);
260
261 $this->db->begin();
262
263 // Load source object
264 $result = $object->fetchCommon($fromid);
265 if ($result > 0 && !empty($object->table_element_line)) {
266 $object->fetchLines();
267 }
268
269 // get lines so they will be clone
270 //foreach($this->lines as $line)
271 // $line->fetch_optionals();
272
273 // Reset some properties
274 unset($object->id);
275 unset($object->fk_user_creat);
276 unset($object->import_key);
277
278 // Clear fields
279 if (property_exists($object, 'ref')) {
280 $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
281 }
282 if (property_exists($object, 'label')) {
283 $object->label = empty($this->fields['label']['default']) ? $langs->trans("CopyOf")." ".$object->label : $this->fields['label']['default'];
284 }
285 if (property_exists($object, 'status')) {
286 $object->status = self::STATUS_DRAFT;
287 }
288 if (property_exists($object, 'date_creation')) {
289 $object->date_creation = dol_now();
290 }
291 if (property_exists($object, 'date_modification')) {
292 $object->date_modification = null;
293 }
294 // ...
295 // Clear extrafields that are unique
296 if (is_array($object->array_options) && count($object->array_options) > 0) {
297 $extrafields->fetch_name_optionals_label($this->table_element);
298 foreach ($object->array_options as $key => $option) {
299 $shortkey = preg_replace('/options_/', '', $key);
300 if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
301 //var_dump($key);
302 //var_dump($clonedObj->array_options[$key]); exit;
303 unset($object->array_options[$key]);
304 }
305 }
306 }
307
308 // Create clone
309 $object->context['createfromclone'] = 'createfromclone';
310 $result = $object->createCommon($user);
311 if ($result < 0) {
312 $error++;
313 $this->error = $object->error;
314 $this->errors = $object->errors;
315 }
316
317 if (!$error) {
318 // copy internal contacts
319 if ($this->copy_linked_contact($object, 'internal') < 0) {
320 $error++;
321 }
322 }
323
324 if (!$error) {
325 // copy external contacts if same company
326 if (!empty($object->socid) && property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
327 if ($this->copy_linked_contact($object, 'external') < 0) {
328 $error++;
329 }
330 }
331 }
332
333 unset($object->context['createfromclone']);
334
335 // End
336 if (!$error) {
337 $this->db->commit();
338 return $object;
339 } else {
340 $this->db->rollback();
341 return -1;
342 }
343 }
344
352 public function fetch($id, $ref = null)
353 {
354 $result = $this->fetchCommon($id, $ref);
355 if ($result > 0 && !empty($this->table_element_line)) {
356 $this->fetchLines();
357 }
358 return $result;
359 }
360
366 public function fetchLines()
367 {
368 $this->lines = array();
369
370 $result = $this->fetchLinesCommon();
371 return $result;
372 }
373
374
387 public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, $filter = '', $filtermode = 'AND')
388 {
389 dol_syslog(__METHOD__, LOG_DEBUG);
390
391 $records = array();
392
393 $sql = "SELECT ";
394 $sql .= $this->getFieldList('t');
395 $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
396 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
397 $sql .= " WHERE t.entity IN (".getEntity($this->element).")";
398 } else {
399 $sql .= " WHERE 1 = 1";
400 }
401
402 // Manage filter
403 $errormessage = '';
404 $sql .= forgeSQLFromUniversalSearchCriteria($filter, $errormessage);
405 if ($errormessage) {
406 $this->errors[] = $errormessage;
407 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
408 return -1;
409 }
410
411 if (!empty($sortfield)) {
412 $sql .= $this->db->order($sortfield, $sortorder);
413 }
414 if (!empty($limit)) {
415 $sql .= $this->db->plimit($limit, $offset);
416 }
417
418 $resql = $this->db->query($sql);
419 if ($resql) {
420 $num = $this->db->num_rows($resql);
421 $i = 0;
422 while ($i < ($limit ? min($limit, $num) : $num)) {
423 $obj = $this->db->fetch_object($resql);
424
425 $record = new self($this->db);
426 $record->setVarsFromFetchObj($obj);
427
428 $records[$record->id] = $record;
429
430 $i++;
431 }
432 $this->db->free($resql);
433
434 return $records;
435 } else {
436 $this->errors[] = 'Error '.$this->db->lasterror();
437 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
438
439 return -1;
440 }
441 }
442
450 public function update(User $user, $notrigger = 0)
451 {
452 return $this->updateCommon($user, $notrigger);
453 }
454
462 public function delete(User $user, $notrigger = 0)
463 {
464 return $this->deleteCommon($user, $notrigger);
465 //return $this->deleteCommon($user, $notrigger, 1);
466 }
467
476 public function deleteLine(User $user, $idline, $notrigger = 0)
477 {
478 if ($this->status < 0) {
479 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
480 return -2;
481 }
482
483 return $this->deleteLineCommon($user, $idline, $notrigger);
484 }
485
486
494 public function validate($user, $notrigger = 0)
495 {
496 global $conf, $langs;
497
498 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
499
500 $error = 0;
501
502 // Protection
503 if ($this->status == self::STATUS_VALIDATED) {
504 dol_syslog(get_class($this)."::validate action abandoned: already validated", LOG_WARNING);
505 return 0;
506 }
507
508 $now = dol_now();
509
510 $this->db->begin();
511
512 // Define new ref
513 if (!$error && (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
514 $num = $this->getNextNumRef();
515 } else {
516 $num = $this->ref;
517 }
518 $this->newref = $num;
519
520 if (!empty($num)) {
521 // Validate
522 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
523 $sql .= " SET label = '".$this->db->escape($num)."',";
524 $sql .= " status = ".self::STATUS_VALIDATED;
525 if (!empty($this->fields['date_validation'])) {
526 $sql .= ", date_validation = '".$this->db->idate($now)."'";
527 }
528 if (!empty($this->fields['fk_user_valid'])) {
529 $sql .= ", fk_user_valid = ".((int) $user->id);
530 }
531 $sql .= " WHERE rowid = ".((int) $this->id);
532
533 dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
534 $resql = $this->db->query($sql);
535 if (!$resql) {
536 dol_print_error($this->db);
537 $this->error = $this->db->lasterror();
538 $error++;
539 }
540
541 if (!$error && !$notrigger) {
542 // Call trigger
543 $result = $this->call_trigger('AVAILABILITIES_VALIDATE', $user);
544 if ($result < 0) {
545 $error++;
546 }
547 // End call triggers
548 }
549 }
550
551 if (!$error) {
552 $this->oldref = $this->ref;
553
554 // Rename directory if dir was a temporary ref
555 if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
556 // Now we rename also files into index
557 $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)."'";
558 $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'availabilities/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
559 $resql = $this->db->query($sql);
560 if (!$resql) {
561 $error++;
562 $this->error = $this->db->lasterror();
563 }
564 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'availabilities/".$this->db->escape($this->newref)."'";
565 $sql .= " WHERE filepath = 'availabilities/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
566 $resql = $this->db->query($sql);
567 if (!$resql) {
568 $error++;
569 $this->error = $this->db->lasterror();
570 }
571
572 // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
573 $oldref = dol_sanitizeFileName($this->ref);
574 $newref = dol_sanitizeFileName($num);
575 $dirsource = $conf->bookcal->dir_output.'/availabilities/'.$oldref;
576 $dirdest = $conf->bookcal->dir_output.'/availabilities/'.$newref;
577 if (!$error && file_exists($dirsource)) {
578 dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
579
580 if (@rename($dirsource, $dirdest)) {
581 dol_syslog("Rename ok");
582 // Rename docs starting with $oldref with $newref
583 $listoffiles = dol_dir_list($conf->bookcal->dir_output.'/availabilities/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
584 foreach ($listoffiles as $fileentry) {
585 $dirsource = $fileentry['name'];
586 $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
587 $dirsource = $fileentry['path'].'/'.$dirsource;
588 $dirdest = $fileentry['path'].'/'.$dirdest;
589 @rename($dirsource, $dirdest);
590 }
591 }
592 }
593 }
594 }
595
596 // Set new ref and current status
597 if (!$error) {
598 $this->ref = $num;
599 $this->status = self::STATUS_VALIDATED;
600 }
601
602 if (!$error) {
603 $this->db->commit();
604 return 1;
605 } else {
606 $this->db->rollback();
607 return -1;
608 }
609 }
610
611
619 public function setDraft($user, $notrigger = 0)
620 {
621 // Protection
622 if ($this->status <= self::STATUS_DRAFT) {
623 return 0;
624 }
625
626 return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'AVAILABILITIES_UNVALIDATE');
627 }
628
636 public function cancel($user, $notrigger = 0)
637 {
638 // Protection
639 if ($this->status != self::STATUS_VALIDATED) {
640 return 0;
641 }
642
643 return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'AVAILABILITIES_CANCEL');
644 }
645
653 public function reopen($user, $notrigger = 0)
654 {
655 // Protection
656 if ($this->status != self::STATUS_CANCELED) {
657 return 0;
658 }
659
660 return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'AVAILABILITIES_REOPEN');
661 }
662
673 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
674 {
675 global $conf, $langs, $hookmanager;
676
677 if (!empty($conf->dol_no_mouse_hover)) {
678 $notooltip = 1; // Force disable tooltips
679 }
680
681 $result = '';
682
683 $label = img_picto('', $this->picto).' <u>'.$langs->trans("Availabilities").'</u>';
684 if (isset($this->status)) {
685 $label .= ' '.$this->getLibStatut(5);
686 }
687 $label .= '<br>';
688 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
689
690 $url = dol_buildpath('/bookcal/availabilities_card.php', 1).'?id='.$this->id;
691
692 if ($option != 'nolink') {
693 // Add param to save lastsearch_values or not
694 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
695 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
696 $add_save_lastsearch_values = 1;
697 }
698 if ($url && $add_save_lastsearch_values) {
699 $url .= '&save_lastsearch_values=1';
700 }
701 }
702
703 $linkclose = '';
704 if (empty($notooltip)) {
705 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
706 $label = $langs->trans("ShowAvailabilities");
707 $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
708 }
709 $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
710 $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
711 } else {
712 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
713 }
714
715 if ($option == 'nolink' || empty($url)) {
716 $linkstart = '<span';
717 } else {
718 $linkstart = '<a href="'.$url.'"';
719 }
720 $linkstart .= $linkclose.'>';
721 if ($option == 'nolink' || empty($url)) {
722 $linkend = '</span>';
723 } else {
724 $linkend = '</a>';
725 }
726
727 $result .= $linkstart;
728
729 if (empty($this->showphoto_on_popup)) {
730 if ($withpicto) {
731 $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);
732 }
733 } else {
734 if ($withpicto) {
735 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
736
737 list($class, $module) = explode('@', $this->picto);
738 $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
739 $filearray = dol_dir_list($upload_dir, "files");
740 $filename = $filearray[0]['name'];
741 if (!empty($filename)) {
742 $pospoint = strpos($filearray[0]['name'], '.');
743
744 $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
745 if (!getDolGlobalString(strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS')) {
746 $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>';
747 } else {
748 $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>';
749 }
750
751 $result .= '</div>';
752 } else {
753 $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);
754 }
755 }
756 }
757
758 if ($withpicto != 2) {
759 $result .= $this->ref;
760 }
761
762 $result .= $linkend;
763 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
764
765 global $action, $hookmanager;
766 $hookmanager->initHooks(array('availabilitiesdao'));
767 $parameters = array('id' => $this->id, 'getnomurl' => &$result);
768 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
769 if ($reshook > 0) {
770 $result = $hookmanager->resPrint;
771 } else {
772 $result .= $hookmanager->resPrint;
773 }
774
775 return $result;
776 }
777
785 public function getKanbanView($option = '', $arraydata = null)
786 {
787 global $conf, $langs;
788
789 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
790
791 $return = '<div class="box-flex-item box-flex-grow-zero">';
792 $return .= '<div class="info-box info-box-sm">';
793 $return .= '<span class="info-box-icon bg-infobox-action">';
794 $return .= img_picto('', $this->picto);
795 $return .= '</span>';
796 $return .= '<div class="info-box-content">';
797 $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).'</span>';
798 if ($selected >= 0) {
799 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
800 }
801 if (property_exists($this, 'label')) {
802 $return .= ' <div class="inline-block opacitymedium valignmiddle tdoverflowmax100">'.$this->label.'</div>';
803 }
804 if (property_exists($this, 'amount')) {
805 $return .= '<br>';
806 $return .= '<span class="info-box-label amount">'.price($this->amount, 0, $langs, 1, -1, -1, $conf->currency).'</span>';
807 }
808 if (method_exists($this, 'getLibStatut')) {
809 $return .= '<br><div class="info-box-status">'.$this->getLibStatut(3).'</div>';
810 }
811 $return .= '</div>';
812 $return .= '</div>';
813 $return .= '</div>';
814
815 return $return;
816 }
817
824 public function getLabelStatus($mode = 0)
825 {
826 return $this->LibStatut($this->status, $mode);
827 }
828
835 public function getLibStatut($mode = 0)
836 {
837 return $this->LibStatut($this->status, $mode);
838 }
839
840 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
848 public function LibStatut($status, $mode = 0)
849 {
850 // phpcs:enable
851 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
852 global $langs;
853 //$langs->load("agenda");
854 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
855 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
856 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
857 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
858 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
859 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
860 }
861
862 $statusType = 'status'.$status;
863 if ($status == self::STATUS_VALIDATED) {
864 $statusType = 'status4';
865 }
866 if ($status == self::STATUS_CANCELED) {
867 $statusType = 'status6';
868 }
869
870 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
871 }
872
879 public function info($id)
880 {
881 $sql = "SELECT rowid,";
882 $sql .= " date_creation as datec, tms as datem,";
883 $sql .= " fk_user_creat, fk_user_modif";
884 $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
885 $sql .= " WHERE t.rowid = ".((int) $id);
886
887 $result = $this->db->query($sql);
888 if ($result) {
889 if ($this->db->num_rows($result)) {
890 $obj = $this->db->fetch_object($result);
891
892 $this->id = $obj->rowid;
893
894 $this->user_creation_id = $obj->fk_user_creat;
895 $this->user_modification_id = $obj->fk_user_modif;
896 $this->date_creation = $this->db->jdate($obj->datec);
897 $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
898 }
899
900 $this->db->free($result);
901 } else {
902 dol_print_error($this->db);
903 }
904 }
905
912 public function initAsSpecimen()
913 {
914 // Set here init that are not commonf fields
915 // $this->property1 = ...
916 // $this->property2 = ...
917
918 return $this->initAsSpecimenCommon();
919 }
920
926 public function getLinesArray()
927 {
928 $this->lines = array();
929
930 $objectline = new AvailabilitiesLine($this->db);
931 $result = $objectline->fetchAll('ASC', 'position', 0, 0, '(fk_availabilities:=:'.((int) $this->id).')');
932
933 if (is_numeric($result)) {
934 $this->error = $objectline->error;
935 $this->errors = $objectline->errors;
936 return $result;
937 } else {
938 $this->lines = $result;
939 return $this->lines;
940 }
941 }
942
948 public function getNextNumRef()
949 {
950 global $langs, $conf;
951 $langs->load("agenda");
952
953 if (!getDolGlobalString('BOOKCAL_AVAILABILITIES_ADDON')) {
954 $conf->global->BOOKCAL_AVAILABILITIES_ADDON = 'mod_availabilities_standard';
955 }
956
957 if (getDolGlobalString('BOOKCAL_AVAILABILITIES_ADDON')) {
958 $mybool = false;
959
960 $file = getDolGlobalString('BOOKCAL_AVAILABILITIES_ADDON') . ".php";
961 $classname = getDolGlobalString('BOOKCAL_AVAILABILITIES_ADDON');
962
963 // Include file with class
964 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
965 foreach ($dirmodels as $reldir) {
966 $dir = dol_buildpath($reldir."core/modules/bookcal/");
967
968 // Load file with numbering class (if found)
969 $mybool = ((bool) @include_once $dir.$file) || $mybool;
970 }
971
972 if ($mybool === false) {
973 dol_print_error(null, "Failed to include file ".$file);
974 return '';
975 }
976
977 if (class_exists($classname)) {
978 $obj = new $classname();
979 $numref = $obj->getNextValue($this);
980
981 if ($numref != '' && $numref != '-1') {
982 return $numref;
983 } else {
984 $this->error = $obj->error;
985 //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
986 return "";
987 }
988 } else {
989 print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
990 return "";
991 }
992 } else {
993 print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
994 return "";
995 }
996 }
997
1009 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
1010 {
1011 global $conf, $langs;
1012
1013 $result = 0;
1014 $includedocgeneration = 0;
1015
1016 $langs->load("agenda");
1017
1018 if (!dol_strlen($modele)) {
1019 $modele = 'standard_availabilities';
1020
1021 if (!empty($this->model_pdf)) {
1022 $modele = $this->model_pdf;
1023 } elseif (getDolGlobalString('AVAILABILITIES_ADDON_PDF')) {
1024 $modele = getDolGlobalString('AVAILABILITIES_ADDON_PDF');
1025 }
1026 }
1027
1028 $modelpath = "core/modules/bookcal/doc/";
1029
1030 if ($includedocgeneration && !empty($modele)) {
1031 $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1032 }
1033
1034 return $result;
1035 }
1036
1044 public function doScheduledJob()
1045 {
1046 global $conf, $langs;
1047
1048 //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log';
1049
1050 $error = 0;
1051 $this->output = '';
1052 $this->error = '';
1053
1054 dol_syslog(__METHOD__, LOG_DEBUG);
1055
1056 $now = dol_now();
1057
1058 $this->db->begin();
1059
1060 // ...
1061
1062 $this->db->commit();
1063
1064 return $error;
1065 }
1066}
1067
1068
1069require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
1070
1075{
1076 // To complete with content of an object AvailabilitiesLine
1077 // We should have a field rowid, fk_availabilities and position
1078
1084 public function __construct(DoliDB $db)
1085 {
1086 $this->db = $db;
1087 $this->isextrafieldmanaged = 0;
1088 }
1089}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Definition security.php:626
$object ref
Definition info.php:79
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.
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.
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($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:63
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
dol_now($mode='auto')
Return date for now.
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.
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 dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.