dolibarr 20.0.0
holiday.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2011 Dimitri Mouillard <dmouillard@teclib.com>
3 * Copyright (C) 2012-2014 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2012-2016 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
6 * Copyright (C) 2016 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2018-2024 Frédéric France <frederic.france@free.fr>
8 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
29require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
30
31
35class Holiday extends CommonObject
36{
40 public $element = 'holiday';
41
45 public $table_element = 'holiday';
46
50 public $fk_element = 'fk_holiday';
51
55 public $picto = 'holiday';
56
60 public $fk_user;
61
62 public $date_create = '';
63
67 public $description;
68
72 public $date_debut = '';
73
77 public $date_fin = '';
78
82 public $date_debut_gmt = '';
83
87 public $date_fin_gmt = '';
88
92 public $halfday = '';
93
98 public $statut = 0;
99
103 public $fk_validator;
104
108 public $date_valid = 0;
109
113 public $fk_user_valid;
114
118 public $date_approval;
119
123 public $fk_user_approve;
124
128 public $date_refuse = 0;
129
133 public $fk_user_refuse;
134
138 public $date_cancel = 0;
139
143 public $fk_user_cancel;
144
148 public $fk_user_create;
149
153 public $detail_refuse = '';
154
158 public $fk_type;
159
160 public $holiday = array();
161 public $events = array();
162 public $logs = array();
163
164 public $optName = '';
165 public $optValue = '';
166 public $optRowid = '';
167
171 const STATUS_DRAFT = 1;
187 const STATUS_REFUSED = 5;
188
189
195 public function __construct($db)
196 {
197 $this->db = $db;
198
199 $this->ismultientitymanaged = 0;
200 }
201
202
210 public function getNextNumRef($objsoc)
211 {
212 global $langs, $conf;
213 $langs->load("order");
214
215 if (!getDolGlobalString('HOLIDAY_ADDON')) {
216 $conf->global->HOLIDAY_ADDON = 'mod_holiday_madonna';
217 }
218
219 if (getDolGlobalString('HOLIDAY_ADDON')) {
220 $mybool = false;
221
222 $file = getDolGlobalString('HOLIDAY_ADDON') . ".php";
223 $classname = getDolGlobalString('HOLIDAY_ADDON');
224
225 // Include file with class
226 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
227 foreach ($dirmodels as $reldir) {
228 $dir = dol_buildpath($reldir."core/modules/holiday/");
229
230 // Load file with numbering class (if found)
231 $mybool = ((bool) @include_once $dir.$file) || $mybool;
232 }
233
234 if ($mybool === false) {
235 dol_print_error(null, "Failed to include file ".$file);
236 return '';
237 }
238
239 $obj = new $classname();
240 $numref = $obj->getNextValue($objsoc, $this);
241
242 if ($numref != "") {
243 return $numref;
244 } else {
245 $this->error = $obj->error;
246 //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
247 return "";
248 }
249 } else {
250 print $langs->trans("Error")." ".$langs->trans("Error_HOLIDAY_ADDON_NotDefined");
251 return "";
252 }
253 }
254
260 public function updateBalance()
261 {
262 $this->db->begin();
263
264 // Update sold of vocations
265 $result = $this->updateSoldeCP();
266
267 // Check nb of users into table llx_holiday_users and update with empty lines
268 //if ($result > 0) $result = $this->verifNbUsers($this->countActiveUsersWithoutCP(), $this->getConfCP('nbUser'));
269
270 if ($result >= 0) {
271 $this->db->commit();
272 return 0; // for cronjob use (0 is OK, any other value is an error code)
273 } else {
274 $this->db->rollback();
275 return -1;
276 }
277 }
278
286 public function create($user, $notrigger = 0)
287 {
288 global $conf;
289 $error = 0;
290
291 $now = dol_now();
292
293 // Check parameters
294 if (empty($this->fk_user) || !is_numeric($this->fk_user) || $this->fk_user < 0) {
295 $this->error = "ErrorBadParameterFkUser";
296 return -1;
297 }
298 if (empty($this->fk_validator) || !is_numeric($this->fk_validator) || $this->fk_validator < 0) {
299 $this->error = "ErrorBadParameterFkValidator";
300 return -1;
301 }
302 if (empty($this->fk_type) || !is_numeric($this->fk_type) || $this->fk_type < 0) {
303 $this->error = "ErrorBadParameterFkType";
304 return -1;
305 }
306
307 // Insert request
308 $sql = "INSERT INTO ".MAIN_DB_PREFIX."holiday(";
309 $sql .= "ref,";
310 $sql .= "fk_user,";
311 $sql .= "date_create,";
312 $sql .= "description,";
313 $sql .= "date_debut,";
314 $sql .= "date_fin,";
315 $sql .= "halfday,";
316 $sql .= "statut,";
317 $sql .= "fk_validator,";
318 $sql .= "fk_type,";
319 $sql .= "fk_user_create,";
320 $sql .= "entity";
321 $sql .= ") VALUES (";
322 $sql .= "'(PROV)',";
323 $sql .= " ".((int) $this->fk_user).",";
324 $sql .= " '".$this->db->idate($now)."',";
325 $sql .= " '".$this->db->escape($this->description)."',";
326 $sql .= " '".$this->db->idate($this->date_debut)."',";
327 $sql .= " '".$this->db->idate($this->date_fin)."',";
328 $sql .= " ".((int) $this->halfday).",";
329 $sql .= " '1',";
330 $sql .= " ".((int) $this->fk_validator).",";
331 $sql .= " ".((int) $this->fk_type).",";
332 $sql .= " ".((int) $user->id).",";
333 $sql .= " ".((int) $conf->entity);
334 $sql .= ")";
335
336 $this->db->begin();
337
338 dol_syslog(get_class($this)."::create", LOG_DEBUG);
339 $resql = $this->db->query($sql);
340 if (!$resql) {
341 $error++;
342 $this->errors[] = "Error ".$this->db->lasterror();
343 }
344
345 if (!$error) {
346 $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."holiday");
347
348 if ($this->id) {
349 // update ref
350 $initialref = '(PROV'.$this->id.')';
351 if (!empty($this->ref)) {
352 $initialref = $this->ref;
353 }
354
355 $sql = 'UPDATE '.MAIN_DB_PREFIX."holiday SET ref='".$this->db->escape($initialref)."' WHERE rowid=".((int) $this->id);
356 if ($this->db->query($sql)) {
357 $this->ref = $initialref;
358
359 if (!$error) {
360 $result = $this->insertExtraFields();
361 if ($result < 0) {
362 $error++;
363 }
364 }
365
366 if (!$error && !$notrigger) {
367 // Call trigger
368 $result = $this->call_trigger('HOLIDAY_CREATE', $user);
369 if ($result < 0) {
370 $error++;
371 }
372 // End call triggers
373 }
374 }
375 }
376 }
377
378 // Commit or rollback
379 if ($error) {
380 foreach ($this->errors as $errmsg) {
381 dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR);
382 $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
383 }
384 $this->db->rollback();
385 return -1 * $error;
386 } else {
387 $this->db->commit();
388 return $this->id;
389 }
390 }
391
392
400 public function fetch($id, $ref = '')
401 {
402 $sql = "SELECT";
403 $sql .= " cp.rowid,";
404 $sql .= " cp.ref,";
405 $sql .= " cp.fk_user,";
406 $sql .= " cp.date_create,";
407 $sql .= " cp.description,";
408 $sql .= " cp.date_debut,";
409 $sql .= " cp.date_fin,";
410 $sql .= " cp.halfday,";
411 $sql .= " cp.statut as status,";
412 $sql .= " cp.fk_validator,";
413 $sql .= " cp.date_valid,";
414 $sql .= " cp.fk_user_valid,";
415 $sql .= " cp.date_approval,";
416 $sql .= " cp.fk_user_approve,";
417 $sql .= " cp.date_refuse,";
418 $sql .= " cp.fk_user_refuse,";
419 $sql .= " cp.date_cancel,";
420 $sql .= " cp.fk_user_cancel,";
421 $sql .= " cp.detail_refuse,";
422 $sql .= " cp.note_private,";
423 $sql .= " cp.note_public,";
424 $sql .= " cp.fk_user_create,";
425 $sql .= " cp.fk_type,";
426 $sql .= " cp.entity";
427 $sql .= " FROM ".MAIN_DB_PREFIX."holiday as cp";
428 if ($id > 0) {
429 $sql .= " WHERE cp.rowid = ".((int) $id);
430 } else {
431 $sql .= " WHERE cp.ref = '".$this->db->escape($ref)."'";
432 }
433
434 dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
435 $resql = $this->db->query($sql);
436 if ($resql) {
437 if ($this->db->num_rows($resql)) {
438 $obj = $this->db->fetch_object($resql);
439
440 $this->id = $obj->rowid;
441 $this->ref = ($obj->ref ? $obj->ref : $obj->rowid);
442 $this->fk_user = $obj->fk_user;
443 $this->date_create = $this->db->jdate($obj->date_create);
444 $this->description = $obj->description;
445 $this->date_debut = $this->db->jdate($obj->date_debut);
446 $this->date_fin = $this->db->jdate($obj->date_fin);
447 $this->date_debut_gmt = $this->db->jdate($obj->date_debut, 1);
448 $this->date_fin_gmt = $this->db->jdate($obj->date_fin, 1);
449 $this->halfday = $obj->halfday;
450 $this->status = $obj->status;
451 $this->statut = $obj->status; // deprecated
452 $this->fk_validator = $obj->fk_validator;
453 $this->date_valid = $this->db->jdate($obj->date_valid);
454 $this->fk_user_valid = $obj->fk_user_valid;
455 $this->user_validation_id = $obj->fk_user_valid;
456 $this->date_approval = $this->db->jdate($obj->date_approval);
457 $this->fk_user_approve = $obj->fk_user_approve;
458 $this->date_refuse = $this->db->jdate($obj->date_refuse);
459 $this->fk_user_refuse = $obj->fk_user_refuse;
460 $this->date_cancel = $this->db->jdate($obj->date_cancel);
461 $this->fk_user_cancel = $obj->fk_user_cancel;
462 $this->detail_refuse = $obj->detail_refuse;
463 $this->note_private = $obj->note_private;
464 $this->note_public = $obj->note_public;
465 $this->fk_user_create = $obj->fk_user_create;
466 $this->fk_type = $obj->fk_type;
467 $this->entity = $obj->entity;
468
469 $this->fetch_optionals();
470
471 $result = 1;
472 } else {
473 $result = 0;
474 }
475 $this->db->free($resql);
476
477 return $result;
478 } else {
479 $this->error = "Error ".$this->db->lasterror();
480 return -1;
481 }
482 }
483
492 public function fetchByUser($user_id, $order = '', $filter = '')
493 {
494 $sql = "SELECT";
495 $sql .= " cp.rowid,";
496 $sql .= " cp.ref,";
497
498 $sql .= " cp.fk_user,";
499 $sql .= " cp.fk_type,";
500 $sql .= " cp.date_create,";
501 $sql .= " cp.description,";
502 $sql .= " cp.date_debut,";
503 $sql .= " cp.date_fin,";
504 $sql .= " cp.halfday,";
505 $sql .= " cp.statut as status,";
506 $sql .= " cp.fk_validator,";
507 $sql .= " cp.date_valid,";
508 $sql .= " cp.fk_user_valid,";
509 $sql .= " cp.date_approval,";
510 $sql .= " cp.fk_user_approve,";
511 $sql .= " cp.date_refuse,";
512 $sql .= " cp.fk_user_refuse,";
513 $sql .= " cp.date_cancel,";
514 $sql .= " cp.fk_user_cancel,";
515 $sql .= " cp.detail_refuse,";
516
517 $sql .= " uu.lastname as user_lastname,";
518 $sql .= " uu.firstname as user_firstname,";
519 $sql .= " uu.login as user_login,";
520 $sql .= " uu.statut as user_status,";
521 $sql .= " uu.photo as user_photo,";
522
523 $sql .= " ua.lastname as validator_lastname,";
524 $sql .= " ua.firstname as validator_firstname,";
525 $sql .= " ua.login as validator_login,";
526 $sql .= " ua.statut as validator_status,";
527 $sql .= " ua.photo as validator_photo";
528
529 $sql .= " FROM ".MAIN_DB_PREFIX."holiday as cp, ".MAIN_DB_PREFIX."user as uu, ".MAIN_DB_PREFIX."user as ua";
530 $sql .= " WHERE cp.entity IN (".getEntity('holiday').")";
531 $sql .= " AND cp.fk_user = uu.rowid AND cp.fk_validator = ua.rowid"; // Hack pour la recherche sur le tableau
532 $sql .= " AND cp.fk_user IN (".$this->db->sanitize($user_id).")";
533
534 // Selection filter
535 if (!empty($filter)) {
536 $sql .= $filter;
537 }
538
539 // Order of display of the result
540 if (!empty($order)) {
541 $sql .= $order;
542 }
543
544 dol_syslog(get_class($this)."::fetchByUser", LOG_DEBUG);
545 $resql = $this->db->query($sql);
546
547 // If no SQL error
548 if ($resql) {
549 $i = 0;
550 $tab_result = $this->holiday;
551 $num = $this->db->num_rows($resql);
552
553 // If no registration
554 if (!$num) {
555 return 2;
556 }
557
558 // List the records and add them to the table
559 while ($i < $num) {
560 $obj = $this->db->fetch_object($resql);
561
562 $tab_result[$i]['rowid'] = $obj->rowid;
563 $tab_result[$i]['id'] = $obj->rowid;
564 $tab_result[$i]['ref'] = ($obj->ref ? $obj->ref : $obj->rowid);
565
566 $tab_result[$i]['fk_user'] = $obj->fk_user;
567 $tab_result[$i]['fk_type'] = $obj->fk_type;
568 $tab_result[$i]['date_create'] = $this->db->jdate($obj->date_create);
569 $tab_result[$i]['description'] = $obj->description;
570 $tab_result[$i]['date_debut'] = $this->db->jdate($obj->date_debut);
571 $tab_result[$i]['date_fin'] = $this->db->jdate($obj->date_fin);
572 $tab_result[$i]['date_debut_gmt'] = $this->db->jdate($obj->date_debut, 1);
573 $tab_result[$i]['date_fin_gmt'] = $this->db->jdate($obj->date_fin, 1);
574 $tab_result[$i]['halfday'] = $obj->halfday;
575 $tab_result[$i]['statut'] = $obj->status;
576 $tab_result[$i]['status'] = $obj->status;
577 $tab_result[$i]['fk_validator'] = $obj->fk_validator;
578 $tab_result[$i]['date_valid'] = $this->db->jdate($obj->date_valid);
579 $tab_result[$i]['fk_user_valid'] = $obj->fk_user_valid;
580 $tab_result[$i]['date_approval'] = $this->db->jdate($obj->date_approval);
581 $tab_result[$i]['fk_user_approve'] = $obj->fk_user_approve;
582 $tab_result[$i]['date_refuse'] = $this->db->jdate($obj->date_refuse);
583 $tab_result[$i]['fk_user_refuse'] = $obj->fk_user_refuse;
584 $tab_result[$i]['date_cancel'] = $this->db->jdate($obj->date_cancel);
585 $tab_result[$i]['fk_user_cancel'] = $obj->fk_user_cancel;
586 $tab_result[$i]['detail_refuse'] = $obj->detail_refuse;
587
588 $tab_result[$i]['user_firstname'] = $obj->user_firstname;
589 $tab_result[$i]['user_lastname'] = $obj->user_lastname;
590 $tab_result[$i]['user_login'] = $obj->user_login;
591 $tab_result[$i]['user_statut'] = $obj->user_status;
592 $tab_result[$i]['user_status'] = $obj->user_status;
593 $tab_result[$i]['user_photo'] = $obj->user_photo;
594
595 $tab_result[$i]['validator_firstname'] = $obj->validator_firstname;
596 $tab_result[$i]['validator_lastname'] = $obj->validator_lastname;
597 $tab_result[$i]['validator_login'] = $obj->validator_login;
598 $tab_result[$i]['validator_statut'] = $obj->validator_status;
599 $tab_result[$i]['validator_status'] = $obj->validator_status;
600 $tab_result[$i]['validator_photo'] = $obj->validator_photo;
601
602 $i++;
603 }
604
605 // Returns 1 with the filled array
606 $this->holiday = $tab_result;
607 return 1;
608 } else {
609 // SQL Error
610 $this->error = "Error ".$this->db->lasterror();
611 return -1;
612 }
613 }
614
622 public function fetchAll($order, $filter)
623 {
624 $sql = "SELECT";
625 $sql .= " cp.rowid,";
626 $sql .= " cp.ref,";
627 $sql .= " cp.fk_user,";
628 $sql .= " cp.fk_type,";
629 $sql .= " cp.date_create,";
630 $sql .= " cp.tms as date_modification,";
631 $sql .= " cp.description,";
632 $sql .= " cp.date_debut,";
633 $sql .= " cp.date_fin,";
634 $sql .= " cp.halfday,";
635 $sql .= " cp.statut as status,";
636 $sql .= " cp.fk_validator,";
637 $sql .= " cp.date_valid,";
638 $sql .= " cp.fk_user_valid,";
639 $sql .= " cp.date_approval,";
640 $sql .= " cp.fk_user_approve,";
641 $sql .= " cp.date_refuse,";
642 $sql .= " cp.fk_user_refuse,";
643 $sql .= " cp.date_cancel,";
644 $sql .= " cp.fk_user_cancel,";
645 $sql .= " cp.detail_refuse,";
646
647 $sql .= " uu.lastname as user_lastname,";
648 $sql .= " uu.firstname as user_firstname,";
649 $sql .= " uu.login as user_login,";
650 $sql .= " uu.statut as user_status,";
651 $sql .= " uu.photo as user_photo,";
652
653 $sql .= " ua.lastname as validator_lastname,";
654 $sql .= " ua.firstname as validator_firstname,";
655 $sql .= " ua.login as validator_login,";
656 $sql .= " ua.statut as validator_status,";
657 $sql .= " ua.photo as validator_photo";
658
659 $sql .= " FROM ".MAIN_DB_PREFIX."holiday as cp, ".MAIN_DB_PREFIX."user as uu, ".MAIN_DB_PREFIX."user as ua";
660 $sql .= " WHERE cp.entity IN (".getEntity('holiday').")";
661 $sql .= " AND cp.fk_user = uu.rowid AND cp.fk_validator = ua.rowid "; // Hack pour la recherche sur le tableau
662
663 // Selection filtering
664 if (!empty($filter)) {
665 $sql .= $filter;
666 }
667
668 // order of display
669 if (!empty($order)) {
670 $sql .= $order;
671 }
672
673 dol_syslog(get_class($this)."::fetchAll", LOG_DEBUG);
674 $resql = $this->db->query($sql);
675
676 // If no SQL error
677 if ($resql) {
678 $i = 0;
679 $tab_result = $this->holiday;
680 $num = $this->db->num_rows($resql);
681
682 // If no registration
683 if (!$num) {
684 return 2;
685 }
686
687 // List the records and add them to the table
688 while ($i < $num) {
689 $obj = $this->db->fetch_object($resql);
690
691 $tab_result[$i]['rowid'] = $obj->rowid;
692 $tab_result[$i]['id'] = $obj->rowid;
693 $tab_result[$i]['ref'] = ($obj->ref ? $obj->ref : $obj->rowid);
694
695 $tab_result[$i]['fk_user'] = $obj->fk_user;
696 $tab_result[$i]['fk_type'] = $obj->fk_type;
697 $tab_result[$i]['date_create'] = $this->db->jdate($obj->date_create);
698 $tab_result[$i]['date_modification'] = $this->db->jdate($obj->date_modification);
699 $tab_result[$i]['description'] = $obj->description;
700 $tab_result[$i]['date_debut'] = $this->db->jdate($obj->date_debut);
701 $tab_result[$i]['date_fin'] = $this->db->jdate($obj->date_fin);
702 $tab_result[$i]['date_debut_gmt'] = $this->db->jdate($obj->date_debut, 1);
703 $tab_result[$i]['date_fin_gmt'] = $this->db->jdate($obj->date_fin, 1);
704 $tab_result[$i]['halfday'] = $obj->halfday;
705 $tab_result[$i]['statut'] = $obj->status;
706 $tab_result[$i]['status'] = $obj->status;
707 $tab_result[$i]['fk_validator'] = $obj->fk_validator;
708 $tab_result[$i]['date_valid'] = $this->db->jdate($obj->date_valid);
709 $tab_result[$i]['fk_user_valid'] = $obj->fk_user_valid;
710 $tab_result[$i]['date_approval'] = $this->db->jdate($obj->date_approval);
711 $tab_result[$i]['fk_user_approve'] = $obj->fk_user_approve;
712 $tab_result[$i]['date_refuse'] = $obj->date_refuse;
713 $tab_result[$i]['fk_user_refuse'] = $obj->fk_user_refuse;
714 $tab_result[$i]['date_cancel'] = $obj->date_cancel;
715 $tab_result[$i]['fk_user_cancel'] = $obj->fk_user_cancel;
716 $tab_result[$i]['detail_refuse'] = $obj->detail_refuse;
717
718 $tab_result[$i]['user_firstname'] = $obj->user_firstname;
719 $tab_result[$i]['user_lastname'] = $obj->user_lastname;
720 $tab_result[$i]['user_login'] = $obj->user_login;
721 $tab_result[$i]['user_statut'] = $obj->user_status;
722 $tab_result[$i]['user_status'] = $obj->user_status;
723 $tab_result[$i]['user_photo'] = $obj->user_photo;
724
725 $tab_result[$i]['validator_firstname'] = $obj->validator_firstname;
726 $tab_result[$i]['validator_lastname'] = $obj->validator_lastname;
727 $tab_result[$i]['validator_login'] = $obj->validator_login;
728 $tab_result[$i]['validator_statut'] = $obj->validator_status;
729 $tab_result[$i]['validator_status'] = $obj->validator_status;
730 $tab_result[$i]['validator_photo'] = $obj->validator_photo;
731
732 $i++;
733 }
734 // Returns 1 and adds the array to the variable
735 $this->holiday = $tab_result;
736 return 1;
737 } else {
738 // SQL Error
739 $this->error = "Error ".$this->db->lasterror();
740 return -1;
741 }
742 }
743
744
752 public function validate($user = null, $notrigger = 0)
753 {
754 global $conf, $langs;
755 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
756 $error = 0;
757
758 $checkBalance = getDictionaryValue('c_holiday_types', 'block_if_negative', $this->fk_type, true);
759
760 if ($checkBalance > 0) {
761 $balance = $this->getCPforUser($this->fk_user, $this->fk_type);
762
763 if ($balance < 0) {
764 $this->error = 'LeaveRequestCreationBlockedBecauseBalanceIsNegative';
765 return -1;
766 }
767 }
768
769 // Define new ref
770 if (!$error && (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref) || $this->ref == $this->id)) {
771 $num = $this->getNextNumRef(null);
772 } else {
773 $num = $this->ref;
774 }
775 $this->newref = dol_sanitizeFileName($num);
776
777 // Update status
778 $sql = "UPDATE ".MAIN_DB_PREFIX."holiday SET";
779 $sql .= " fk_user_valid = ".((int) $user->id).",";
780 $sql .= " date_valid = '".$this->db->idate(dol_now())."',";
781 if (!empty($this->status) && is_numeric($this->status)) {
782 $sql .= " statut = ".((int) $this->status).",";
783 } else {
784 $this->error = 'Property status must be a numeric value';
785 $error++;
786 }
787 $sql .= " ref = '".$this->db->escape($num)."'";
788 $sql .= " WHERE rowid = ".((int) $this->id);
789
790 $this->db->begin();
791
792 dol_syslog(get_class($this)."::validate", LOG_DEBUG);
793 $resql = $this->db->query($sql);
794 if (!$resql) {
795 $error++;
796 $this->errors[] = "Error ".$this->db->lasterror();
797 }
798
799 if (!$error) {
800 if (!$notrigger) {
801 // Call trigger
802 $result = $this->call_trigger('HOLIDAY_VALIDATE', $user);
803 if ($result < 0) {
804 $error++;
805 }
806 // End call triggers
807 }
808 }
809
810 if (!$error) {
811 $this->oldref = $this->ref;
812
813 // Rename directory if dir was a temporary ref
814 if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
815 // Now we rename also files into index
816 $sql = 'UPDATE ' . MAIN_DB_PREFIX . "ecm_files set filename = CONCAT('" . $this->db->escape($this->newref) . "', SUBSTR(filename, " . (strlen($this->ref) + 1) . ")), filepath = 'holiday/" . $this->db->escape($this->newref) . "'";
817 $sql .= " WHERE filename LIKE '" . $this->db->escape($this->ref) . "%' AND filepath = 'holiday/" . $this->db->escape($this->ref) . "' and entity = " . ((int) $conf->entity);
818 $resql = $this->db->query($sql);
819 if (!$resql) {
820 $error++;
821 $this->error = $this->db->lasterror();
822 }
823 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'holiday/".$this->db->escape($this->newref)."'";
824 $sql .= " WHERE filepath = 'holiday/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
825 $resql = $this->db->query($sql);
826 if (!$resql) {
827 $error++;
828 $this->error = $this->db->lasterror();
829 }
830
831 // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
832 $oldref = dol_sanitizeFileName($this->ref);
833 $newref = dol_sanitizeFileName($num);
834 $dirsource = $conf->holiday->multidir_output[$this->entity] . '/' . $oldref;
835 $dirdest = $conf->holiday->multidir_output[$this->entity] . '/' . $newref;
836 if (!$error && file_exists($dirsource)) {
837 dol_syslog(get_class($this) . "::validate rename dir " . $dirsource . " into " . $dirdest);
838 if (@rename($dirsource, $dirdest)) {
839 dol_syslog("Rename ok");
840 // Rename docs starting with $oldref with $newref
841 $listoffiles = dol_dir_list($dirdest, 'files', 1, '^' . preg_quote($oldref, '/'));
842 foreach ($listoffiles as $fileentry) {
843 $dirsource = $fileentry['name'];
844 $dirdest = preg_replace('/^' . preg_quote($oldref, '/') . '/', $newref, $dirsource);
845 $dirsource = $fileentry['path'] . '/' . $dirsource;
846 $dirdest = $fileentry['path'] . '/' . $dirdest;
847 @rename($dirsource, $dirdest);
848 }
849 }
850 }
851 }
852 }
853
854
855 // Commit or rollback
856 if ($error) {
857 foreach ($this->errors as $errmsg) {
858 dol_syslog(get_class($this)."::validate ".$errmsg, LOG_ERR);
859 $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
860 }
861 $this->db->rollback();
862 return -1 * $error;
863 } else {
864 $this->db->commit();
865 return 1;
866 }
867 }
868
869
877 public function approve($user = null, $notrigger = 0)
878 {
879 $error = 0;
880
881 $checkBalance = getDictionaryValue('c_holiday_types', 'block_if_negative', $this->fk_type, true);
882
883 if ($checkBalance > 0) {
884 $balance = $this->getCPforUser($this->fk_user, $this->fk_type);
885
886 if ($balance < 0) {
887 $this->error = 'LeaveRequestCreationBlockedBecauseBalanceIsNegative';
888 return -1;
889 }
890 }
891
892 // Update request
893 $sql = "UPDATE ".MAIN_DB_PREFIX."holiday SET";
894 $sql .= " description= '".$this->db->escape($this->description)."',";
895 if (!empty($this->date_debut)) {
896 $sql .= " date_debut = '".$this->db->idate($this->date_debut)."',";
897 } else {
898 $error++;
899 }
900 if (!empty($this->date_fin)) {
901 $sql .= " date_fin = '".$this->db->idate($this->date_fin)."',";
902 } else {
903 $error++;
904 }
905 $sql .= " halfday = ".((int) $this->halfday).",";
906 if (!empty($this->status) && is_numeric($this->status)) {
907 $sql .= " statut = ".((int) $this->status).",";
908 } else {
909 $error++;
910 }
911 if (!empty($this->fk_validator)) {
912 $sql .= " fk_validator = ".((int) $this->fk_validator).",";
913 } else {
914 $error++;
915 }
916 if (!empty($this->date_valid)) {
917 $sql .= " date_valid = '".$this->db->idate($this->date_valid)."',";
918 } else {
919 $sql .= " date_valid = NULL,";
920 }
921 if (!empty($this->fk_user_valid)) {
922 $sql .= " fk_user_valid = ".((int) $this->fk_user_valid).",";
923 } else {
924 $sql .= " fk_user_valid = NULL,";
925 }
926 if (!empty($this->date_approval)) {
927 $sql .= " date_approval = '".$this->db->idate($this->date_approval)."',";
928 } else {
929 $sql .= " date_approval = NULL,";
930 }
931 if (!empty($this->fk_user_approve)) {
932 $sql .= " fk_user_approve = ".((int) $this->fk_user_approve).",";
933 } else {
934 $sql .= " fk_user_approve = NULL,";
935 }
936 if (!empty($this->date_refuse)) {
937 $sql .= " date_refuse = '".$this->db->idate($this->date_refuse)."',";
938 } else {
939 $sql .= " date_refuse = NULL,";
940 }
941 if (!empty($this->fk_user_refuse)) {
942 $sql .= " fk_user_refuse = ".((int) $this->fk_user_refuse).",";
943 } else {
944 $sql .= " fk_user_refuse = NULL,";
945 }
946 if (!empty($this->date_cancel)) {
947 $sql .= " date_cancel = '".$this->db->idate($this->date_cancel)."',";
948 } else {
949 $sql .= " date_cancel = NULL,";
950 }
951 if (!empty($this->fk_user_cancel)) {
952 $sql .= " fk_user_cancel = ".((int) $this->fk_user_cancel).",";
953 } else {
954 $sql .= " fk_user_cancel = NULL,";
955 }
956 if (!empty($this->detail_refuse)) {
957 $sql .= " detail_refuse = '".$this->db->escape($this->detail_refuse)."'";
958 } else {
959 $sql .= " detail_refuse = NULL";
960 }
961 $sql .= " WHERE rowid = ".((int) $this->id);
962
963 $this->db->begin();
964
965 dol_syslog(get_class($this)."::approve", LOG_DEBUG);
966 $resql = $this->db->query($sql);
967 if (!$resql) {
968 $error++;
969 $this->errors[] = "Error ".$this->db->lasterror();
970 }
971
972 if (!$error) {
973 if (!$notrigger) {
974 // Call trigger
975 $result = $this->call_trigger('HOLIDAY_APPROVE', $user);
976 if ($result < 0) {
977 $error++;
978 }
979 // End call triggers
980 }
981 }
982
983 // Commit or rollback
984 if ($error) {
985 foreach ($this->errors as $errmsg) {
986 dol_syslog(get_class($this)."::approve ".$errmsg, LOG_ERR);
987 $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
988 }
989 $this->db->rollback();
990 return -1 * $error;
991 } else {
992 $this->db->commit();
993 return 1;
994 }
995 }
996
1004 public function update($user = null, $notrigger = 0)
1005 {
1006 global $conf, $langs;
1007 $error = 0;
1008
1009 $checkBalance = getDictionaryValue('c_holiday_types', 'block_if_negative', $this->fk_type, true);
1010
1011 if ($checkBalance > 0 && $this->status != self::STATUS_DRAFT) {
1012 $balance = $this->getCPforUser($this->fk_user, $this->fk_type);
1013
1014 if ($balance < 0) {
1015 $this->error = 'LeaveRequestCreationBlockedBecauseBalanceIsNegative';
1016 return -1;
1017 }
1018 }
1019
1020 // Update request
1021 $sql = "UPDATE ".MAIN_DB_PREFIX."holiday SET";
1022
1023 $sql .= " description= '".$this->db->escape($this->description)."',";
1024
1025 if (!empty($this->date_debut)) {
1026 $sql .= " date_debut = '".$this->db->idate($this->date_debut)."',";
1027 } else {
1028 $error++;
1029 }
1030 if (!empty($this->date_fin)) {
1031 $sql .= " date_fin = '".$this->db->idate($this->date_fin)."',";
1032 } else {
1033 $error++;
1034 }
1035 $sql .= " halfday = ".$this->halfday.",";
1036 if (!empty($this->status) && is_numeric($this->status)) {
1037 $sql .= " statut = ".$this->status.",";
1038 } else {
1039 $error++;
1040 }
1041 if (!empty($this->fk_validator)) {
1042 $sql .= " fk_validator = '".$this->db->escape($this->fk_validator)."',";
1043 } else {
1044 $error++;
1045 }
1046 if (!empty($this->date_valid)) {
1047 $sql .= " date_valid = '".$this->db->idate($this->date_valid)."',";
1048 } else {
1049 $sql .= " date_valid = NULL,";
1050 }
1051 if (!empty($this->fk_user_valid)) {
1052 $sql .= " fk_user_valid = ".((int) $this->fk_user_valid).",";
1053 } else {
1054 $sql .= " fk_user_valid = NULL,";
1055 }
1056 if (!empty($this->date_approval)) {
1057 $sql .= " date_approval = '".$this->db->idate($this->date_approval)."',";
1058 } else {
1059 $sql .= " date_approval = NULL,";
1060 }
1061 if (!empty($this->fk_user_approve)) {
1062 $sql .= " fk_user_approve = ".((int) $this->fk_user_approve).",";
1063 } else {
1064 $sql .= " fk_user_approve = NULL,";
1065 }
1066 if (!empty($this->date_refuse)) {
1067 $sql .= " date_refuse = '".$this->db->idate($this->date_refuse)."',";
1068 } else {
1069 $sql .= " date_refuse = NULL,";
1070 }
1071 if (!empty($this->fk_user_refuse)) {
1072 $sql .= " fk_user_refuse = ".((int) $this->fk_user_refuse).",";
1073 } else {
1074 $sql .= " fk_user_refuse = NULL,";
1075 }
1076 if (!empty($this->date_cancel)) {
1077 $sql .= " date_cancel = '".$this->db->idate($this->date_cancel)."',";
1078 } else {
1079 $sql .= " date_cancel = NULL,";
1080 }
1081 if (!empty($this->fk_user_cancel)) {
1082 $sql .= " fk_user_cancel = ".((int) $this->fk_user_cancel).",";
1083 } else {
1084 $sql .= " fk_user_cancel = NULL,";
1085 }
1086 if (!empty($this->detail_refuse)) {
1087 $sql .= " detail_refuse = '".$this->db->escape($this->detail_refuse)."'";
1088 } else {
1089 $sql .= " detail_refuse = NULL";
1090 }
1091
1092 $sql .= " WHERE rowid = ".((int) $this->id);
1093
1094 $this->db->begin();
1095
1096 dol_syslog(get_class($this)."::update", LOG_DEBUG);
1097 $resql = $this->db->query($sql);
1098 if (!$resql) {
1099 $error++;
1100 $this->errors[] = "Error ".$this->db->lasterror();
1101 }
1102
1103 if (!$error) {
1104 if (!$notrigger) {
1105 // Call trigger
1106 $result = $this->call_trigger('HOLIDAY_MODIFY', $user);
1107 if ($result < 0) {
1108 $error++;
1109 }
1110 // End call triggers
1111 }
1112 }
1113
1114 // Commit or rollback
1115 if ($error) {
1116 foreach ($this->errors as $errmsg) {
1117 dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR);
1118 $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
1119 }
1120 $this->db->rollback();
1121 return -1 * $error;
1122 } else {
1123 $this->db->commit();
1124 return 1;
1125 }
1126 }
1127
1128
1136 public function delete($user, $notrigger = 0)
1137 {
1138 global $conf, $langs;
1139 $error = 0;
1140
1141 $sql = "DELETE FROM ".MAIN_DB_PREFIX."holiday";
1142 $sql .= " WHERE rowid=".((int) $this->id);
1143
1144 $this->db->begin();
1145
1146 dol_syslog(get_class($this)."::delete", LOG_DEBUG);
1147 $resql = $this->db->query($sql);
1148 if (!$resql) {
1149 $error++;
1150 $this->errors[] = "Error ".$this->db->lasterror();
1151 }
1152
1153 if (!$error) {
1154 if (!$notrigger) {
1155 // Call trigger
1156 $result = $this->call_trigger('HOLIDAY_DELETE', $user);
1157 if ($result < 0) {
1158 $error++;
1159 }
1160 // End call triggers
1161 }
1162 }
1163
1164 // Commit or rollback
1165 if ($error) {
1166 foreach ($this->errors as $errmsg) {
1167 dol_syslog(get_class($this)."::delete ".$errmsg, LOG_ERR);
1168 $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
1169 }
1170 $this->db->rollback();
1171 return -1 * $error;
1172 } else {
1173 $this->db->commit();
1174 return 1;
1175 }
1176 }
1177
1191 public function verifDateHolidayCP($fk_user, $dateStart, $dateEnd, $halfday = 0)
1192 {
1193 $this->fetchByUser($fk_user, '', '');
1194
1195 foreach ($this->holiday as $infos_CP) {
1196 if ($infos_CP['statut'] == Holiday::STATUS_CANCELED) {
1197 continue; // ignore not validated holidays
1198 }
1199 if ($infos_CP['statut'] == Holiday::STATUS_REFUSED) {
1200 continue; // ignore refused holidays
1201 }
1202 //var_dump("--");
1203 //var_dump("old: ".dol_print_date($infos_CP['date_debut'],'dayhour').' '.dol_print_date($infos_CP['date_fin'],'dayhour').' '.$infos_CP['halfday']);
1204 //var_dump("new: ".dol_print_date($dateStart,'dayhour').' '.dol_print_date($dateEnd,'dayhour').' '.$halfday);
1205
1206 if ($halfday == 0) {
1207 if ($dateStart >= $infos_CP['date_debut'] && $dateStart <= $infos_CP['date_fin']) {
1208 return false;
1209 }
1210 if ($dateEnd <= $infos_CP['date_fin'] && $dateEnd >= $infos_CP['date_debut']) {
1211 return false;
1212 }
1213 } elseif ($halfday == -1) {
1214 // new start afternoon, new end afternoon
1215 if ($dateStart >= $infos_CP['date_debut'] && $dateStart <= $infos_CP['date_fin']) {
1216 if ($dateStart < $infos_CP['date_fin'] || in_array($infos_CP['halfday'], array(0, -1))) {
1217 return false;
1218 }
1219 }
1220 if ($dateEnd <= $infos_CP['date_fin'] && $dateEnd >= $infos_CP['date_debut']) {
1221 if ($dateStart < $dateEnd) {
1222 return false;
1223 }
1224 if ($dateEnd < $infos_CP['date_fin'] || in_array($infos_CP['halfday'], array(0, -1))) {
1225 return false;
1226 }
1227 }
1228 } elseif ($halfday == 1) {
1229 // new start morning, new end morning
1230 if ($dateStart >= $infos_CP['date_debut'] && $dateStart <= $infos_CP['date_fin']) {
1231 if ($dateStart < $dateEnd) {
1232 return false;
1233 }
1234 if ($dateStart > $infos_CP['date_debut'] || in_array($infos_CP['halfday'], array(0, 1))) {
1235 return false;
1236 }
1237 }
1238 if ($dateEnd <= $infos_CP['date_fin'] && $dateEnd >= $infos_CP['date_debut']) {
1239 if ($dateEnd > $infos_CP['date_debut'] || in_array($infos_CP['halfday'], array(0, 1))) {
1240 return false;
1241 }
1242 }
1243 } elseif ($halfday == 2) {
1244 // new start afternoon, new end morning
1245 if ($dateStart >= $infos_CP['date_debut'] && $dateStart <= $infos_CP['date_fin']) {
1246 if ($dateStart < $infos_CP['date_fin'] || in_array($infos_CP['halfday'], array(0, -1))) {
1247 return false;
1248 }
1249 }
1250 if ($dateEnd <= $infos_CP['date_fin'] && $dateEnd >= $infos_CP['date_debut']) {
1251 if ($dateEnd > $infos_CP['date_debut'] || in_array($infos_CP['halfday'], array(0, 1))) {
1252 return false;
1253 }
1254 }
1255 } else {
1256 dol_print_error(null, 'Bad value of parameter halfday when calling function verifDateHolidayCP');
1257 }
1258 }
1259
1260 return true;
1261 }
1262
1263
1273 public function verifDateHolidayForTimestamp($fk_user, $timestamp, $status = '-1')
1274 {
1275 $isavailablemorning = true;
1276 $isavailableafternoon = true;
1277
1278 // Check into leave requests
1279 $sql = "SELECT cp.rowid, cp.date_debut as date_start, cp.date_fin as date_end, cp.halfday, cp.statut as status";
1280 $sql .= " FROM ".MAIN_DB_PREFIX."holiday as cp";
1281 $sql .= " WHERE cp.entity IN (".getEntity('holiday').")";
1282 $sql .= " AND cp.fk_user = ".(int) $fk_user;
1283 $sql .= " AND cp.date_debut <= '".$this->db->idate($timestamp)."' AND cp.date_fin >= '".$this->db->idate($timestamp)."'";
1284 if ($status != '-1') {
1285 $sql .= " AND cp.statut IN (".$this->db->sanitize($status).")";
1286 }
1287
1288 $resql = $this->db->query($sql);
1289 if ($resql) {
1290 $num_rows = $this->db->num_rows($resql); // Note, we can have 2 records if on is morning and the other one is afternoon
1291 if ($num_rows > 0) {
1292 $arrayofrecord = array();
1293 $i = 0;
1294 while ($i < $num_rows) {
1295 $obj = $this->db->fetch_object($resql);
1296
1297 // Note: $obj->halfday is 0:Full days, 2:Start afternoon end morning, -1:Start afternoon, 1:End morning
1298 $arrayofrecord[$obj->rowid] = array('date_start' => $this->db->jdate($obj->date_start), 'date_end' => $this->db->jdate($obj->date_end), 'halfday' => $obj->halfday, 'status' => $obj->status);
1299 $i++;
1300 }
1301
1302 // We found a record, user is on holiday by default, so is not available is true.
1303 $isavailablemorning = true;
1304 foreach ($arrayofrecord as $record) {
1305 if ($timestamp == $record['date_start'] && $record['halfday'] == 2) {
1306 continue;
1307 }
1308 if ($timestamp == $record['date_start'] && $record['halfday'] == -1) {
1309 continue;
1310 }
1311 $isavailablemorning = false;
1312 break;
1313 }
1314 $isavailableafternoon = true;
1315 foreach ($arrayofrecord as $record) {
1316 if ($timestamp == $record['date_end'] && $record['halfday'] == 2) {
1317 continue;
1318 }
1319 if ($timestamp == $record['date_end'] && $record['halfday'] == 1) {
1320 continue;
1321 }
1322 $isavailableafternoon = false;
1323 break;
1324 }
1325 }
1326 } else {
1327 dol_print_error($this->db);
1328 }
1329
1330 $result = array('morning' => $isavailablemorning, 'afternoon' => $isavailableafternoon);
1331 if (!$isavailablemorning) {
1332 $result['morning_reason'] = 'leave_request';
1333 }
1334 if (!$isavailableafternoon) {
1335 $result['afternoon_reason'] = 'leave_request';
1336 }
1337 return $result;
1338 }
1339
1347 public function getTooltipContentArray($params)
1348 {
1349 global $langs;
1350
1351 $langs->load('holiday');
1352 $nofetch = !empty($params['nofetch']);
1353
1354 $datas = array();
1355 $datas['picto'] = img_picto('', $this->picto).' <u class="paddingrightonly">'.$langs->trans("Holiday").'</u>';
1356 if (isset($this->status)) {
1357 $datas['picto'] .= ' '.$this->getLibStatut(5);
1358 }
1359 $datas['ref'] = '<br><b>'.$langs->trans('Ref').':</b> '.$this->ref;
1360 // show type for this record only in ajax to not overload lists
1361 if (!$nofetch && !empty($this->fk_type)) {
1362 $typeleaves = $this->getTypes(1, -1);
1363 if (empty($typeleaves[$this->fk_type])) {
1364 $labeltoshow = $langs->trans("TypeWasDisabledOrRemoved", $this->fk_type);
1365 } else {
1366 $labeltoshow = (($typeleaves[$this->fk_type]['code'] && $langs->trans($typeleaves[$this->fk_type]['code']) != $typeleaves[$this->fk_type]['code']) ? $langs->trans($typeleaves[$this->fk_type]['code']) : $typeleaves[$this->fk_type]['label']);
1367 }
1368 $datas['type'] = '<br><b>'.$langs->trans("Type") . ':</b> ' . $labeltoshow;
1369 }
1370 if (isset($this->halfday) && !empty($this->date_debut) && !empty($this->date_fin)) {
1371 $listhalfday = array(
1372 'morning' => $langs->trans("Morning"),
1373 "afternoon" => $langs->trans("Afternoon")
1374 );
1375 $starthalfday = ($this->halfday == -1 || $this->halfday == 2) ? 'afternoon' : 'morning';
1376 $endhalfday = ($this->halfday == 1 || $this->halfday == 2) ? 'morning' : 'afternoon';
1377 $datas['date_start'] = '<br><b>'.$langs->trans('DateDebCP') . '</b>: '. dol_print_date($this->date_debut, 'day') . '&nbsp;&nbsp;<span class="opacitymedium">'.$langs->trans($listhalfday[$starthalfday]).'</span>';
1378 $datas['date_end'] = '<br><b>'.$langs->trans('DateFinCP') . '</b>: '. dol_print_date($this->date_fin, 'day') . '&nbsp;&nbsp;<span class="opacitymedium">'.$langs->trans($listhalfday[$endhalfday]).'</span>';
1379 }
1380
1381
1382 return $datas;
1383 }
1384
1394 public function getNomUrl($withpicto = 0, $save_lastsearch_value = -1, $notooltip = 0, $morecss = '')
1395 {
1396 global $conf, $langs, $hookmanager;
1397
1398 if (!empty($conf->dol_no_mouse_hover)) {
1399 $notooltip = 1; // Force disable tooltips
1400 }
1401
1402 $result = '';
1403 $params = [
1404 'id' => $this->id,
1405 'objecttype' => $this->element,
1406 'nofetch' => 1,
1407 ];
1408 $classfortooltip = 'classfortooltip';
1409 $dataparams = '';
1410 if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
1411 $classfortooltip = 'classforajaxtooltip';
1412 $dataparams = ' data-params="'.dol_escape_htmltag(json_encode($params)).'"';
1413 $label = '';
1414 } else {
1415 $label = implode($this->getTooltipContentArray($params));
1416 }
1417
1418 $url = DOL_URL_ROOT.'/holiday/card.php?id='.$this->id;
1419
1420 //if ($option != 'nolink')
1421 //{
1422 // Add param to save lastsearch_values or not
1423 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1424 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
1425 $add_save_lastsearch_values = 1;
1426 }
1427 if ($add_save_lastsearch_values) {
1428 $url .= '&save_lastsearch_values=1';
1429 }
1430 //}
1431
1432 $linkclose = '';
1433 if (empty($notooltip)) {
1434 if (getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER')) {
1435 $label = $langs->trans("ShowMyObject");
1436 $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
1437 }
1438 $linkclose .= ($label ? ' title="'.dol_escape_htmltag($label, 1).'"' : ' title="tocomplete"');
1439 $linkclose .= $dataparams.' class="'.$classfortooltip.($morecss ? ' '.$morecss : '').'"';
1440 } else {
1441 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
1442 }
1443
1444 $linkstart = '<a href="'.$url.'"';
1445 $linkstart .= $linkclose.'>';
1446 $linkend = '</a>';
1447
1448 $result .= $linkstart;
1449
1450 if ($withpicto) {
1451 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'"'), 0, 0, $notooltip ? 0 : 1);
1452 }
1453 if ($withpicto != 2) {
1454 $result .= $this->ref;
1455 }
1456 $result .= $linkend;
1457
1458 global $action;
1459 $hookmanager->initHooks(array($this->element . 'dao'));
1460 $parameters = array('id' => $this->id, 'getnomurl' => &$result);
1461 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
1462 if ($reshook > 0) {
1463 $result = $hookmanager->resPrint;
1464 } else {
1465 $result .= $hookmanager->resPrint;
1466 }
1467 return $result;
1468 }
1469
1470
1477 public function getLibStatut($mode = 0)
1478 {
1479 return $this->LibStatut($this->status, $mode, $this->date_debut);
1480 }
1481
1482 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1491 public function LibStatut($status, $mode = 0, $startdate = '')
1492 {
1493 // phpcs:enable
1494 global $langs;
1495
1496 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
1497 global $langs;
1498 //$langs->load("mymodule");
1499 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('DraftCP');
1500 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('ToReviewCP');
1501 $this->labelStatus[self::STATUS_APPROVED] = $langs->transnoentitiesnoconv('ApprovedCP');
1502 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('CancelCP');
1503 $this->labelStatus[self::STATUS_REFUSED] = $langs->transnoentitiesnoconv('RefuseCP');
1504 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('DraftCP');
1505 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('ToReviewCP');
1506 $this->labelStatusShort[self::STATUS_APPROVED] = $langs->transnoentitiesnoconv('ApprovedCP');
1507 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('CancelCP');
1508 $this->labelStatusShort[self::STATUS_REFUSED] = $langs->transnoentitiesnoconv('RefuseCP');
1509 }
1510
1511 $params = array();
1512 $statusType = 'status6';
1513 if (!empty($startdate) && $startdate >= dol_now()) { // If not yet passed, we use a green "in live" color
1514 $statusType = 'status4';
1515 $params = array('tooltip' => $this->labelStatus[$status].' - '.$langs->trans("Forthcoming"));
1516 }
1517 if ($status == self::STATUS_DRAFT) {
1518 $statusType = 'status0';
1519 }
1520 if ($status == self::STATUS_VALIDATED) {
1521 $statusType = 'status1';
1522 }
1523 if ($status == self::STATUS_CANCELED) {
1524 $statusType = 'status9';
1525 }
1526 if ($status == self::STATUS_REFUSED) {
1527 $statusType = 'status9';
1528 }
1529
1530 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode, '', $params);
1531 }
1532
1533
1542 public function selectStatutCP($selected = 0, $htmlname = 'select_statut', $morecss = 'minwidth125')
1543 {
1544 global $langs;
1545
1546 // List of status label
1547 $name = array('DraftCP', 'ToReviewCP', 'ApprovedCP', 'CancelCP', 'RefuseCP');
1548 $nb = count($name) + 1;
1549
1550 // Select HTML
1551 $out = '<select name="'.$htmlname.'" id="'.$htmlname.'" class="flat'.($morecss ? ' '.$morecss : '').'">'."\n";
1552 $out .= '<option value="-1">&nbsp;</option>'."\n";
1553
1554 // Loop on status
1555 for ($i = 1; $i < $nb; $i++) {
1556 if ($i == $selected) {
1557 $out .= '<option value="'.$i.'" selected>'.$langs->trans($name[$i - 1]).'</option>'."\n";
1558 } else {
1559 $out .= '<option value="'.$i.'">'.$langs->trans($name[$i - 1]).'</option>'."\n";
1560 }
1561 }
1562
1563 $out .= "</select>\n";
1564
1565 $showempty = 0;
1566 $out .= ajax_combobox($htmlname, array(), 0, 0, 'resolve', ($showempty < 0 ? (string) $showempty : '-1'), $morecss);
1567
1568 return $out;
1569 }
1570
1578 public function updateConfCP($name, $value)
1579 {
1580 $sql = "UPDATE ".MAIN_DB_PREFIX."holiday_config SET";
1581 $sql .= " value = '".$this->db->escape($value)."'";
1582 $sql .= " WHERE name = '".$this->db->escape($name)."'";
1583
1584 dol_syslog(get_class($this).'::updateConfCP name='.$name, LOG_DEBUG);
1585 $result = $this->db->query($sql);
1586 if ($result) {
1587 return true;
1588 }
1589
1590 return false;
1591 }
1592
1601 public function getConfCP($name, $createifnotfound = '')
1602 {
1603 $sql = "SELECT value";
1604 $sql .= " FROM ".MAIN_DB_PREFIX."holiday_config";
1605 $sql .= " WHERE name = '".$this->db->escape($name)."'";
1606
1607 dol_syslog(get_class($this).'::getConfCP name='.$name.' createifnotfound='.$createifnotfound, LOG_DEBUG);
1608 $result = $this->db->query($sql);
1609
1610 if ($result) {
1611 $obj = $this->db->fetch_object($result);
1612 // Return value
1613 if (empty($obj)) {
1614 if ($createifnotfound) {
1615 $sql = "INSERT INTO ".MAIN_DB_PREFIX."holiday_config(name, value)";
1616 $sql .= " VALUES('".$this->db->escape($name)."', '".$this->db->escape($createifnotfound)."')";
1617 $result = $this->db->query($sql);
1618 if ($result) {
1619 return $createifnotfound;
1620 } else {
1621 $this->error = $this->db->lasterror();
1622 return -2;
1623 }
1624 } else {
1625 return '';
1626 }
1627 } else {
1628 return $obj->value;
1629 }
1630 } else {
1631 // Erreur SQL
1632 $this->error = $this->db->lasterror();
1633 return -1;
1634 }
1635 }
1636
1645 public function updateSoldeCP($userID = 0, $nbHoliday = 0, $fk_type = 0)
1646 {
1647 global $user, $langs;
1648
1649 $error = 0;
1650
1651 if (empty($userID) && empty($nbHoliday) && empty($fk_type)) {
1652 $langs->load("holiday");
1653
1654 // Si mise à jour pour tout le monde en début de mois
1655 $now = dol_now();
1656
1657 $month = date('m', $now);
1658 $newdateforlastupdate = dol_print_date($now, '%Y%m%d%H%M%S');
1659
1660 // Get month of last update
1661 $lastUpdate = $this->getConfCP('lastUpdate', $newdateforlastupdate);
1662 $monthLastUpdate = $lastUpdate[4].$lastUpdate[5];
1663 //print 'month: '.$month.' lastUpdate:'.$lastUpdate.' monthLastUpdate:'.$monthLastUpdate;exit;
1664
1665 // If month date is not same than the one of last update (the one we saved in database), then we update the timestamp and balance of each open user.
1666 if ($month != $monthLastUpdate) {
1667 $this->db->begin();
1668
1669 $users = $this->fetchUsers(false, false, ' AND u.statut > 0');
1670 $nbUser = count($users);
1671
1672 $sql = "UPDATE ".MAIN_DB_PREFIX."holiday_config SET";
1673 $sql .= " value = '".$this->db->escape($newdateforlastupdate)."'";
1674 $sql .= " WHERE name = 'lastUpdate'";
1675 $result = $this->db->query($sql);
1676
1677 $typeleaves = $this->getTypes(1, 1);
1678
1679 // Update each user counter
1680 foreach ($users as $userCounter) {
1681 $nbDaysToAdd = (isset($typeleaves[$userCounter['type']]['newbymonth']) ? $typeleaves[$userCounter['type']]['newbymonth'] : 0);
1682 if (empty($nbDaysToAdd)) {
1683 continue;
1684 }
1685
1686 dol_syslog("We update leave type id ".$userCounter['type']." for user id ".$userCounter['rowid'], LOG_DEBUG);
1687
1688 $nowHoliday = $userCounter['nb_holiday'];
1689 $newSolde = $nowHoliday + $nbDaysToAdd;
1690
1691 // We add a log for each user
1692 $this->addLogCP($user->id, $userCounter['rowid'], $langs->trans('HolidaysMonthlyUpdate'), $newSolde, $userCounter['type']);
1693
1694 $result = $this->updateSoldeCP($userCounter['rowid'], $newSolde, $userCounter['type']);
1695
1696 if ($result < 0) {
1697 $error++;
1698 break;
1699 }
1700 }
1701
1702 if (!$error) {
1703 $this->db->commit();
1704 return 1;
1705 } else {
1706 $this->db->rollback();
1707 return -1;
1708 }
1709 }
1710
1711 return 0;
1712 } else {
1713 // Mise à jour pour un utilisateur
1714 $nbHoliday = price2num($nbHoliday, 5);
1715
1716 $sql = "SELECT nb_holiday FROM ".MAIN_DB_PREFIX."holiday_users";
1717 $sql .= " WHERE fk_user = ".(int) $userID." AND fk_type = ".(int) $fk_type;
1718 $resql = $this->db->query($sql);
1719 if ($resql) {
1720 $num = $this->db->num_rows($resql);
1721
1722 if ($num > 0) {
1723 // Update for user
1724 $sql = "UPDATE ".MAIN_DB_PREFIX."holiday_users SET";
1725 $sql .= " nb_holiday = ".((float) $nbHoliday);
1726 $sql .= " WHERE fk_user = ".(int) $userID." AND fk_type = ".(int) $fk_type;
1727 $result = $this->db->query($sql);
1728 if (!$result) {
1729 $error++;
1730 $this->errors[] = $this->db->lasterror();
1731 }
1732 } else {
1733 // Insert for user
1734 $sql = "INSERT INTO ".MAIN_DB_PREFIX."holiday_users(nb_holiday, fk_user, fk_type) VALUES (";
1735 $sql .= ((float) $nbHoliday);
1736 $sql .= ", ".(int) $userID.", ".(int) $fk_type.")";
1737 $result = $this->db->query($sql);
1738 if (!$result) {
1739 $error++;
1740 $this->errors[] = $this->db->lasterror();
1741 }
1742 }
1743 } else {
1744 $this->errors[] = $this->db->lasterror();
1745 $error++;
1746 }
1747
1748 if (!$error) {
1749 return 1;
1750 } else {
1751 return -1;
1752 }
1753 }
1754 }
1755
1763 public function createCPusers($single = false, $userid = 0)
1764 {
1765 // do we have to add balance for all users ?
1766 if (!$single) {
1767 dol_syslog(get_class($this).'::createCPusers');
1768 $arrayofusers = $this->fetchUsers(false, true);
1769
1770 foreach ($arrayofusers as $users) {
1771 $sql = "INSERT INTO ".MAIN_DB_PREFIX."holiday_users";
1772 $sql .= " (fk_user, nb_holiday)";
1773 $sql .= " VALUES (".((int) $users['rowid'])."', '0')";
1774
1775 $resql = $this->db->query($sql);
1776 if (!$resql) {
1777 dol_print_error($this->db);
1778 }
1779 }
1780 } else {
1781 $sql = "INSERT INTO ".MAIN_DB_PREFIX."holiday_users";
1782 $sql .= " (fk_user, nb_holiday)";
1783 $sql .= " VALUES (".((int) $userid)."', '0')";
1784
1785 $resql = $this->db->query($sql);
1786 if (!$resql) {
1787 dol_print_error($this->db);
1788 }
1789 }
1790 }
1791
1799 public function getCPforUser($user_id, $fk_type = 0)
1800 {
1801 $sql = "SELECT nb_holiday";
1802 $sql .= " FROM ".MAIN_DB_PREFIX."holiday_users";
1803 $sql .= " WHERE fk_user = ".(int) $user_id;
1804 if ($fk_type > 0) {
1805 $sql .= " AND fk_type = ".(int) $fk_type;
1806 }
1807
1808 dol_syslog(get_class($this).'::getCPforUser user_id='.$user_id.' type_id='.$fk_type, LOG_DEBUG);
1809 $result = $this->db->query($sql);
1810 if ($result) {
1811 $obj = $this->db->fetch_object($result);
1812 //return number_format($obj->nb_holiday,2);
1813 if ($obj) {
1814 return $obj->nb_holiday;
1815 } else {
1816 return null;
1817 }
1818 } else {
1819 return null;
1820 }
1821 }
1822
1831 public function fetchUsers($stringlist = true, $type = true, $filters = '')
1832 {
1833 global $conf;
1834
1835 dol_syslog(get_class($this)."::fetchUsers", LOG_DEBUG);
1836
1837 if ($stringlist) {
1838 if ($type) {
1839 // If user of Dolibarr
1840 $sql = "SELECT";
1841 if (isModEnabled('multicompany') && getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE')) {
1842 $sql .= " DISTINCT";
1843 }
1844 $sql .= " u.rowid";
1845 $sql .= " FROM ".MAIN_DB_PREFIX."user as u";
1846
1847 if (isModEnabled('multicompany') && getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE')) {
1848 $sql .= ", ".MAIN_DB_PREFIX."usergroup_user as ug";
1849 $sql .= " WHERE ((ug.fk_user = u.rowid";
1850 $sql .= " AND ug.entity IN (".getEntity('usergroup')."))";
1851 $sql .= " OR u.entity = 0)"; // Show always superadmin
1852 } else {
1853 $sql .= " WHERE u.entity IN (".getEntity('user').")";
1854 }
1855 $sql .= " AND u.statut > 0";
1856 $sql .= " AND u.employee = 1"; // We only want employee users for holidays
1857 if ($filters) {
1858 $sql .= $filters;
1859 }
1860
1861 $resql = $this->db->query($sql);
1862
1863 // Si pas d'erreur SQL
1864 if ($resql) {
1865 $i = 0;
1866 $num = $this->db->num_rows($resql);
1867 $stringlist = '';
1868
1869 // Boucles du listage des utilisateurs
1870 while ($i < $num) {
1871 $obj = $this->db->fetch_object($resql);
1872
1873 if ($i == 0) {
1874 $stringlist .= $obj->rowid;
1875 } else {
1876 $stringlist .= ', '.$obj->rowid;
1877 }
1878
1879 $i++;
1880 }
1881 // Retoune le tableau des utilisateurs
1882 return $stringlist;
1883 } else {
1884 // Erreur SQL
1885 $this->error = "Error ".$this->db->lasterror();
1886 return -1;
1887 }
1888 } else {
1889 // We want only list of vacation balance for user ids
1890 $sql = "SELECT DISTINCT cpu.fk_user";
1891 $sql .= " FROM ".MAIN_DB_PREFIX."holiday_users as cpu, ".MAIN_DB_PREFIX."user as u";
1892 $sql .= " WHERE cpu.fk_user = u.rowid";
1893 if ($filters) {
1894 $sql .= $filters;
1895 }
1896
1897 $resql = $this->db->query($sql);
1898
1899 // Si pas d'erreur SQL
1900 if ($resql) {
1901 $i = 0;
1902 $num = $this->db->num_rows($resql);
1903 $stringlist = '';
1904
1905 // Boucles du listage des utilisateurs
1906 while ($i < $num) {
1907 $obj = $this->db->fetch_object($resql);
1908
1909 if ($i == 0) {
1910 $stringlist .= $obj->fk_user;
1911 } else {
1912 $stringlist .= ', '.$obj->fk_user;
1913 }
1914
1915 $i++;
1916 }
1917 // Retoune le tableau des utilisateurs
1918 return $stringlist;
1919 } else {
1920 // Erreur SQL
1921 $this->error = "Error ".$this->db->lasterror();
1922 return -1;
1923 }
1924 }
1925 } else {
1926 // Si faux donc return array
1927 // List for Dolibarr users
1928 if ($type) {
1929 // If we need users of Dolibarr
1930 $sql = "SELECT";
1931 if (isModEnabled('multicompany') && getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE')) {
1932 $sql .= " DISTINCT";
1933 }
1934 $sql .= " u.rowid, u.lastname, u.firstname, u.gender, u.photo, u.employee, u.statut as status, u.fk_user";
1935 $sql .= " FROM ".MAIN_DB_PREFIX."user as u";
1936
1937 if (isModEnabled('multicompany') && getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE')) {
1938 $sql .= ", ".MAIN_DB_PREFIX."usergroup_user as ug";
1939 $sql .= " WHERE ((ug.fk_user = u.rowid";
1940 $sql .= " AND ug.entity IN (".getEntity('usergroup')."))";
1941 $sql .= " OR u.entity = 0)"; // Show always superadmin
1942 } else {
1943 $sql .= " WHERE u.entity IN (".getEntity('user').")";
1944 }
1945
1946 $sql .= " AND u.statut > 0";
1947 $sql .= " AND u.employee = 1"; // We only want employee users for holidays
1948 if ($filters) {
1949 $sql .= $filters;
1950 }
1951
1952 $resql = $this->db->query($sql);
1953
1954 // Si pas d'erreur SQL
1955 if ($resql) {
1956 $i = 0;
1957 $tab_result = $this->holiday;
1958 $num = $this->db->num_rows($resql);
1959
1960 // Boucles du listage des utilisateurs
1961 while ($i < $num) {
1962 $obj = $this->db->fetch_object($resql);
1963
1964 $tab_result[$i]['rowid'] = $obj->rowid; // rowid of user
1965 $tab_result[$i]['id'] = $obj->rowid; // id of user
1966 $tab_result[$i]['name'] = $obj->lastname; // deprecated
1967 $tab_result[$i]['lastname'] = $obj->lastname;
1968 $tab_result[$i]['firstname'] = $obj->firstname;
1969 $tab_result[$i]['gender'] = $obj->gender;
1970 $tab_result[$i]['status'] = $obj->status;
1971 $tab_result[$i]['employee'] = $obj->employee;
1972 $tab_result[$i]['photo'] = $obj->photo;
1973 $tab_result[$i]['fk_user'] = $obj->fk_user; // rowid of manager
1974 //$tab_result[$i]['type'] = $obj->type;
1975 //$tab_result[$i]['nb_holiday'] = $obj->nb_holiday;
1976
1977 $i++;
1978 }
1979 // Retoune le tableau des utilisateurs
1980 return $tab_result;
1981 } else {
1982 // Erreur SQL
1983 $this->errors[] = "Error ".$this->db->lasterror();
1984 return -1;
1985 }
1986 } else {
1987 // List of vacation balance users
1988 $sql = "SELECT cpu.fk_type, cpu.nb_holiday, u.rowid, u.lastname, u.firstname, u.gender, u.photo, u.employee, u.statut as status, u.fk_user";
1989 $sql .= " FROM ".MAIN_DB_PREFIX."holiday_users as cpu, ".MAIN_DB_PREFIX."user as u";
1990 $sql .= " WHERE cpu.fk_user = u.rowid";
1991 if ($filters) {
1992 $sql .= $filters;
1993 }
1994
1995 $resql = $this->db->query($sql);
1996
1997 // Si pas d'erreur SQL
1998 if ($resql) {
1999 $i = 0;
2000 $tab_result = $this->holiday;
2001 $num = $this->db->num_rows($resql);
2002
2003 // Boucles du listage des utilisateurs
2004 while ($i < $num) {
2005 $obj = $this->db->fetch_object($resql);
2006
2007 $tab_result[$i]['rowid'] = $obj->rowid; // rowid of user
2008 $tab_result[$i]['id'] = $obj->rowid; // id of user
2009 $tab_result[$i]['name'] = $obj->lastname; // deprecated
2010 $tab_result[$i]['lastname'] = $obj->lastname;
2011 $tab_result[$i]['firstname'] = $obj->firstname;
2012 $tab_result[$i]['gender'] = $obj->gender;
2013 $tab_result[$i]['status'] = $obj->status;
2014 $tab_result[$i]['employee'] = $obj->employee;
2015 $tab_result[$i]['photo'] = $obj->photo;
2016 $tab_result[$i]['fk_user'] = $obj->fk_user; // rowid of manager
2017
2018 $tab_result[$i]['type'] = $obj->fk_type;
2019 $tab_result[$i]['nb_holiday'] = $obj->nb_holiday;
2020
2021 $i++;
2022 }
2023 // Retoune le tableau des utilisateurs
2024 return $tab_result;
2025 } else {
2026 // Erreur SQL
2027 $this->error = "Error ".$this->db->lasterror();
2028 return -1;
2029 }
2030 }
2031 }
2032 }
2033
2034
2035 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2043 {
2044 // phpcs:enable
2045 $users_validator = array();
2046
2047 $sql = "SELECT DISTINCT ur.fk_user";
2048 $sql .= " FROM ".MAIN_DB_PREFIX."user_rights as ur, ".MAIN_DB_PREFIX."rights_def as rd";
2049 $sql .= " WHERE ur.fk_id = rd.id and rd.module = 'holiday' AND rd.perms = 'approve'"; // Permission 'Approve';
2050 $sql .= "UNION";
2051 $sql .= " SELECT DISTINCT ugu.fk_user";
2052 $sql .= " FROM ".MAIN_DB_PREFIX."usergroup_user as ugu, ".MAIN_DB_PREFIX."usergroup_rights as ur, ".MAIN_DB_PREFIX."rights_def as rd";
2053 $sql .= " WHERE ugu.fk_usergroup = ur.fk_usergroup AND ur.fk_id = rd.id and rd.module = 'holiday' AND rd.perms = 'approve'"; // Permission 'Approve';
2054 //print $sql;
2055
2056 dol_syslog(get_class($this)."::fetch_users_approver_holiday sql=".$sql);
2057 $result = $this->db->query($sql);
2058 if ($result) {
2059 $num_rows = $this->db->num_rows($result);
2060 $i = 0;
2061 while ($i < $num_rows) {
2062 $objp = $this->db->fetch_object($result);
2063 array_push($users_validator, $objp->fk_user);
2064 $i++;
2065 }
2066 return $users_validator;
2067 } else {
2068 $this->error = $this->db->lasterror();
2069 dol_syslog(get_class($this)."::fetch_users_approver_holiday Error ".$this->error, LOG_ERR);
2070 return -1;
2071 }
2072 }
2073
2074
2080 public function countActiveUsers()
2081 {
2082 $sql = "SELECT count(u.rowid) as compteur";
2083 $sql .= " FROM ".MAIN_DB_PREFIX."user as u";
2084 $sql .= " WHERE u.statut > 0";
2085
2086 $result = $this->db->query($sql);
2087 $object = $this->db->fetch_object($result);
2088
2089 return $object->compteur;
2090 }
2097 {
2098 $sql = "SELECT count(u.rowid) as compteur";
2099 $sql .= " FROM ".MAIN_DB_PREFIX."user as u LEFT OUTER JOIN ".MAIN_DB_PREFIX."holiday_users hu ON (hu.fk_user=u.rowid)";
2100 $sql .= " WHERE u.statut > 0 AND hu.fk_user IS NULL";
2101
2102 $result = $this->db->query($sql);
2103 $object = $this->db->fetch_object($result);
2104
2105 return $object->compteur;
2106 }
2107
2115 public function verifNbUsers($userDolibarrWithoutCP, $userCP)
2116 {
2117 if (empty($userCP)) {
2118 $userCP = 0;
2119 }
2120 dol_syslog(get_class($this).'::verifNbUsers userDolibarr='.$userDolibarrWithoutCP.' userCP='.$userCP);
2121 return 1;
2122 }
2123
2124
2135 public function addLogCP($fk_user_action, $fk_user_update, $label, $new_solde, $fk_type)
2136 {
2137 global $conf, $langs;
2138
2139 $error = 0;
2140
2141 $prev_solde = price2num($this->getCPforUser($fk_user_update, $fk_type), 5);
2142 $new_solde = price2num($new_solde, 5);
2143 //print "$prev_solde == $new_solde";
2144
2145 if ($prev_solde == $new_solde) {
2146 return 0;
2147 }
2148
2149 $this->db->begin();
2150
2151 // Insert request
2152 $sql = "INSERT INTO ".MAIN_DB_PREFIX."holiday_logs (";
2153 $sql .= "date_action,";
2154 $sql .= "fk_user_action,";
2155 $sql .= "fk_user_update,";
2156 $sql .= "type_action,";
2157 $sql .= "prev_solde,";
2158 $sql .= "new_solde,";
2159 $sql .= "fk_type";
2160 $sql .= ") VALUES (";
2161 $sql .= " '".$this->db->idate(dol_now())."',";
2162 $sql .= " ".((int) $fk_user_action).",";
2163 $sql .= " ".((int) $fk_user_update).",";
2164 $sql .= " '".$this->db->escape($label)."',";
2165 $sql .= " ".((float) $prev_solde).",";
2166 $sql .= " ".((float) $new_solde).",";
2167 $sql .= " ".((int) $fk_type);
2168 $sql .= ")";
2169
2170 $resql = $this->db->query($sql);
2171 if (!$resql) {
2172 $error++;
2173 $this->errors[] = "Error ".$this->db->lasterror();
2174 }
2175
2176 if (!$error) {
2177 $this->optRowid = $this->db->last_insert_id(MAIN_DB_PREFIX."holiday_logs");
2178 }
2179
2180 // Commit or rollback
2181 if ($error) {
2182 foreach ($this->errors as $errmsg) {
2183 dol_syslog(get_class($this)."::addLogCP ".$errmsg, LOG_ERR);
2184 $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
2185 }
2186 $this->db->rollback();
2187 return -1 * $error;
2188 } else {
2189 $this->db->commit();
2190 return $this->optRowid;
2191 }
2192 }
2193
2201 public function fetchLog($order, $filter)
2202 {
2203 $sql = "SELECT";
2204 $sql .= " cpl.rowid,";
2205 $sql .= " cpl.date_action,";
2206 $sql .= " cpl.fk_user_action,";
2207 $sql .= " cpl.fk_user_update,";
2208 $sql .= " cpl.type_action,";
2209 $sql .= " cpl.prev_solde,";
2210 $sql .= " cpl.new_solde,";
2211 $sql .= " cpl.fk_type";
2212 $sql .= " FROM ".MAIN_DB_PREFIX."holiday_logs as cpl";
2213 $sql .= " WHERE cpl.rowid > 0"; // To avoid error with other search and criteria
2214
2215 // Filtrage de séléction
2216 if (!empty($filter)) {
2217 $sql .= " ".$filter;
2218 }
2219
2220 // Ordre d'affichage
2221 if (!empty($order)) {
2222 $sql .= " ".$order;
2223 }
2224
2225 dol_syslog(get_class($this)."::fetchLog", LOG_DEBUG);
2226 $resql = $this->db->query($sql);
2227
2228 // Si pas d'erreur SQL
2229 if ($resql) {
2230 $i = 0;
2231 $tab_result = $this->logs;
2232 $num = $this->db->num_rows($resql);
2233
2234 // Si pas d'enregistrement
2235 if (!$num) {
2236 return 2;
2237 }
2238
2239 // On liste les résultats et on les ajoutent dans le tableau
2240 while ($i < $num) {
2241 $obj = $this->db->fetch_object($resql);
2242
2243 $tab_result[$i]['rowid'] = $obj->rowid;
2244 $tab_result[$i]['id'] = $obj->rowid;
2245 $tab_result[$i]['date_action'] = $obj->date_action;
2246 $tab_result[$i]['fk_user_action'] = $obj->fk_user_action;
2247 $tab_result[$i]['fk_user_update'] = $obj->fk_user_update;
2248 $tab_result[$i]['type_action'] = $obj->type_action;
2249 $tab_result[$i]['prev_solde'] = $obj->prev_solde;
2250 $tab_result[$i]['new_solde'] = $obj->new_solde;
2251 $tab_result[$i]['fk_type'] = $obj->fk_type;
2252
2253 $i++;
2254 }
2255 // Retourne 1 et ajoute le tableau à la variable
2256 $this->logs = $tab_result;
2257 return 1;
2258 } else {
2259 // Erreur SQL
2260 $this->error = "Error ".$this->db->lasterror();
2261 return -1;
2262 }
2263 }
2264
2265
2273 public function getTypes($active = -1, $affect = -1)
2274 {
2275 global $mysoc;
2276
2277 $sql = "SELECT rowid, code, label, affect, delay, newbymonth";
2278 $sql .= " FROM ".MAIN_DB_PREFIX."c_holiday_types";
2279 $sql .= " WHERE (fk_country IS NULL OR fk_country = ".((int) $mysoc->country_id).')';
2280 $sql .= " AND entity IN (".getEntity('c_holiday_types').")";
2281 if ($active >= 0) {
2282 $sql .= " AND active = ".((int) $active);
2283 }
2284 if ($affect >= 0) {
2285 $sql .= " AND affect = ".((int) $affect);
2286 }
2287 $sql .= " ORDER BY sortorder";
2288
2289 $result = $this->db->query($sql);
2290 if ($result) {
2291 $num = $this->db->num_rows($result);
2292 if ($num) {
2293 $types = array();
2294 while ($obj = $this->db->fetch_object($result)) {
2295 $types[$obj->rowid] = array('id' => $obj->rowid, 'rowid' => $obj->rowid, 'code' => $obj->code, 'label' => $obj->label, 'affect' => $obj->affect, 'delay' => $obj->delay, 'newbymonth' => $obj->newbymonth);
2296 }
2297
2298 return $types;
2299 }
2300 } else {
2301 dol_print_error($this->db);
2302 }
2303
2304 return array();
2305 }
2306
2307
2314 public function info($id)
2315 {
2316 global $conf;
2317
2318 $sql = "SELECT f.rowid, f.statut as status,";
2319 $sql .= " f.date_create as datec,";
2320 $sql .= " f.tms as date_modification,";
2321 $sql .= " f.date_valid as datev,";
2322 $sql .= " f.date_approval as datea,";
2323 $sql .= " f.date_refuse as dater,";
2324 $sql .= " f.fk_user_create as fk_user_creation,";
2325 $sql .= " f.fk_user_modif as fk_user_modification,";
2326 $sql .= " f.fk_user_valid as fk_user_validation,";
2327 $sql .= " f.fk_user_approve as fk_user_approval_done,";
2328 $sql .= " f.fk_validator as fk_user_approval_expected,";
2329 $sql .= " f.fk_user_refuse as fk_user_refuse";
2330 $sql .= " FROM ".MAIN_DB_PREFIX."holiday as f";
2331 $sql .= " WHERE f.rowid = ".((int) $id);
2332 $sql .= " AND f.entity = ".$conf->entity;
2333
2334 $resql = $this->db->query($sql);
2335 if ($resql) {
2336 if ($this->db->num_rows($resql)) {
2337 $obj = $this->db->fetch_object($resql);
2338
2339 $this->id = $obj->rowid;
2340
2341 $this->date_creation = $this->db->jdate($obj->datec);
2342 $this->date_modification = $this->db->jdate($obj->date_modification);
2343 $this->date_validation = $this->db->jdate($obj->datev);
2344 $this->date_approval = $this->db->jdate($obj->datea);
2345
2346 $this->user_creation_id = $obj->fk_user_creation;
2347 $this->user_validation_id = $obj->fk_user_validation;
2348 $this->user_modification_id = $obj->fk_user_modification;
2349
2350 if ($obj->status == Holiday::STATUS_APPROVED || $obj->status == Holiday::STATUS_CANCELED) {
2351 if ($obj->fk_user_approval_done) {
2352 $this->fk_user_approve = $obj->fk_user_approval_done;
2353 }
2354 }
2355 }
2356 $this->db->free($resql);
2357 } else {
2358 dol_print_error($this->db);
2359 }
2360 }
2361
2362
2370 public function initAsSpecimen()
2371 {
2372 global $user, $langs;
2373
2374 // Initialise parameters
2375 $this->id = 0;
2376 $this->specimen = 1;
2377
2378 $this->fk_user = $user->id;
2379 $this->description = 'SPECIMEN description';
2380 $this->date_debut = dol_now();
2381 $this->date_fin = dol_now() + (24 * 3600);
2382 $this->date_valid = dol_now();
2383 $this->fk_validator = $user->id;
2384 $this->halfday = 0;
2385 $this->fk_type = 1;
2387
2388 return 1;
2389 }
2390
2396 public function loadStateBoard()
2397 {
2398 global $user;
2399
2400 $this->nb = array();
2401
2402 $sql = "SELECT count(h.rowid) as nb";
2403 $sql .= " FROM ".MAIN_DB_PREFIX."holiday as h";
2404 $sql .= " WHERE h.statut > 1";
2405 $sql .= " AND h.entity IN (".getEntity('holiday').")";
2406 if (!$user->hasRight('expensereport', 'readall')) {
2407 $userchildids = $user->getAllChildIds(1);
2408 $sql .= " AND (h.fk_user IN (".$this->db->sanitize(implode(',', $userchildids)).")";
2409 $sql .= " OR h.fk_validator IN (".$this->db->sanitize(implode(',', $userchildids))."))";
2410 }
2411
2412 $resql = $this->db->query($sql);
2413 if ($resql) {
2414 while ($obj = $this->db->fetch_object($resql)) {
2415 $this->nb["holidays"] = $obj->nb;
2416 }
2417 $this->db->free($resql);
2418 return 1;
2419 } else {
2420 dol_print_error($this->db);
2421 $this->error = $this->db->error();
2422 return -1;
2423 }
2424 }
2425
2426 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2433 public function load_board($user)
2434 {
2435 // phpcs:enable
2436 global $conf, $langs;
2437
2438 if ($user->socid) {
2439 return -1; // protection pour eviter appel par utilisateur externe
2440 }
2441
2442 $now = dol_now();
2443
2444 $sql = "SELECT h.rowid, h.date_debut";
2445 $sql .= " FROM ".MAIN_DB_PREFIX."holiday as h";
2446 $sql .= " WHERE h.statut = 2";
2447 $sql .= " AND h.entity IN (".getEntity('holiday').")";
2448 if (!$user->hasRight('expensereport', 'read_all')) {
2449 $userchildids = $user->getAllChildIds(1);
2450 $sql .= " AND (h.fk_user IN (".$this->db->sanitize(implode(',', $userchildids)).")";
2451 $sql .= " OR h.fk_validator IN (".$this->db->sanitize(implode(',', $userchildids))."))";
2452 }
2453
2454 $resql = $this->db->query($sql);
2455 if ($resql) {
2456 $langs->load("members");
2457
2458 $response = new WorkboardResponse();
2459 $response->warning_delay = $conf->holiday->approve->warning_delay / 60 / 60 / 24;
2460 $response->label = $langs->trans("HolidaysToApprove");
2461 $response->labelShort = $langs->trans("ToApprove");
2462 $response->url = DOL_URL_ROOT.'/holiday/list.php?search_status=2&amp;mainmenu=hrm&amp;leftmenu=holiday';
2463 $response->img = img_object('', "holiday");
2464
2465 while ($obj = $this->db->fetch_object($resql)) {
2466 $response->nbtodo++;
2467
2468 if ($this->db->jdate($obj->date_debut) < ($now - $conf->holiday->approve->warning_delay)) {
2469 $response->nbtodolate++;
2470 }
2471 }
2472
2473 return $response;
2474 } else {
2475 dol_print_error($this->db);
2476 $this->error = $this->db->error();
2477 return -1;
2478 }
2479 }
2487 public function getKanbanView($option = '', $arraydata = null)
2488 {
2489 global $langs;
2490
2491 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
2492
2493 $return = '<div class="box-flex-item box-flex-grow-zero">';
2494 $return .= '<div class="info-box info-box-sm">';
2495 $return .= '<span class="info-box-icon bg-infobox-action">';
2496 $return .= img_picto('', $this->picto);
2497 $return .= '</span>';
2498 $return .= '<div class="info-box-content">';
2499 $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.$arraydata['user']->getNomUrl(-1).'</span>';
2500 if ($selected >= 0) {
2501 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
2502 }
2503 if (property_exists($this, 'fk_type')) {
2504 $return .= '<br>';
2505 //$return .= '<span class="opacitymedium">'.$langs->trans("Type").'</span> : ';
2506 $return .= '<div class="info_box-label tdoverflowmax100" title="'.dol_escape_htmltag($arraydata['labeltype']).'">'.dol_escape_htmltag($arraydata['labeltype']).'</div>';
2507 }
2508 if (property_exists($this, 'date_debut') && property_exists($this, 'date_fin')) {
2509 $return .= '<span class="info-box-label small">'.dol_print_date($this->date_debut, 'day').'</span>';
2510 $return .= ' <span class="opacitymedium small">'.$langs->trans("To").'</span> ';
2511 $return .= '<span class="info-box-label small">'.dol_print_date($this->date_fin, 'day').'</span>';
2512 if (!empty($arraydata['nbopenedday'])) {
2513 $return .= ' ('.$arraydata['nbopenedday'].')';
2514 }
2515 }
2516 if (method_exists($this, 'getLibStatut')) {
2517 $return .= '<div class="info-box-status">'.$this->getLibStatut(3).'</div>';
2518 }
2519 $return .= '</div>';
2520 $return .= '</div>';
2521 $return .= '</div>';
2522 return $return;
2523 }
2524}
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:637
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
Definition ajax.lib.php:456
$object ref
Definition info.php:79
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class of the module paid holiday.
getTypes($active=-1, $affect=-1)
Return array with list of types.
getNomUrl($withpicto=0, $save_lastsearch_value=-1, $notooltip=0, $morecss='')
Return clicable name (with picto eventually)
verifDateHolidayCP($fk_user, $dateStart, $dateEnd, $halfday=0)
Check if a user is on holiday (partially or completely) into a period.
validate($user=null, $notrigger=0)
Validate leave request.
info($id)
Load information on object.
updateBalance()
Update balance of vacations and check table of users for holidays is complete.
updateConfCP($name, $value)
Met à jour une option du module Holiday Payés.
const STATUS_VALIDATED
Validated status.
const STATUS_DRAFT
Draft status.
fetch($id, $ref='')
Load object in memory from database.
addLogCP($fk_user_action, $fk_user_update, $label, $new_solde, $fk_type)
addLogCP
verifNbUsers($userDolibarrWithoutCP, $userCP)
Compare le nombre d'utilisateur actif de Dolibarr à celui des utilisateurs des congés payés.
verifDateHolidayForTimestamp($fk_user, $timestamp, $status='-1')
Check that a user is not on holiday for a particular timestamp.
approve($user=null, $notrigger=0)
Approve leave request.
getNextNumRef($objsoc)
Returns the reference to the following non used Order depending on the active numbering module define...
const STATUS_REFUSED
Refused.
getConfCP($name, $createifnotfound='')
Return value of a conf parameter for leave module TODO Move this into llx_const table.
load_board($user)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
initAsSpecimen()
Initialise an instance with random values.
create($user, $notrigger=0)
Créer un congés payés dans la base de données.
selectStatutCP($selected=0, $htmlname='select_statut', $morecss='minwidth125')
Show select with list of leave status.
countActiveUsersWithoutCP()
Compte le nombre d'utilisateur actifs dans Dolibarr sans CP.
updateSoldeCP($userID=0, $nbHoliday=0, $fk_type=0)
Met à jour le timestamp de la dernière mise à jour du solde des CP.
fetchLog($order, $filter)
Liste le log des congés payés.
update($user=null, $notrigger=0)
Update database.
getCPforUser($user_id, $fk_type=0)
Return the balance of annual leave of a user.
fetch_users_approver_holiday()
Return list of people with permission to validate leave requests.
__construct($db)
Constructor.
loadStateBoard()
Load this->nb for dashboard.
getLibStatut($mode=0)
Returns the label status.
createCPusers($single=false, $userid=0)
Create entries for each user at setup step.
fetchAll($order, $filter)
List all holidays of all users.
const STATUS_CANCELED
Canceled.
countActiveUsers()
Compte le nombre d'utilisateur actifs dans Dolibarr.
fetchByUser($user_id, $order='', $filter='')
List holidays for a particular user or list of users.
const STATUS_APPROVED
Approved.
getTooltipContentArray($params)
getTooltipContentArray
fetchUsers($stringlist=true, $type=true, $filters='')
Get list of Users or list of vacation balance.
getKanbanView($option='', $arraydata=null)
Return clicable link of object (with eventually picto)
LibStatut($status, $mode=0, $startdate='')
Returns the label of a status.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
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)
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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.
getDictionaryValue($tablename, $field, $id, $checkentity=false, $rowidfield='rowid')
Return the value of a filed into a dictionary for the record $id.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e e e e e statut
Definition invoice.php:1991