29require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
40 public $element =
'holiday';
45 public $table_element =
'holiday';
50 public $fk_element =
'fk_holiday';
55 public $picto =
'holiday';
62 public $date_create =
'';
72 public $date_debut =
'';
77 public $date_fin =
'';
82 public $date_debut_gmt =
'';
87 public $date_fin_gmt =
'';
103 public $fk_validator;
108 public $date_valid = 0;
113 public $fk_user_valid;
118 public $date_approval;
123 public $fk_user_approve;
128 public $date_refuse = 0;
133 public $fk_user_refuse;
138 public $date_cancel = 0;
143 public $fk_user_cancel;
148 public $fk_user_create;
153 public $detail_refuse =
'';
160 public $holiday = array();
161 public $events = array();
162 public $logs = array();
164 public $optName =
'';
165 public $optValue =
'';
166 public $optRowid =
'';
199 $this->ismultientitymanaged = 0;
212 global $langs, $conf;
213 $langs->load(
"order");
216 $conf->global->HOLIDAY_ADDON =
'mod_holiday_madonna';
226 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
227 foreach ($dirmodels as $reldir) {
231 $mybool = ((bool) @include_once $dir.$file) || $mybool;
234 if ($mybool ===
false) {
239 $obj =
new $classname();
240 $numref = $obj->getNextValue($objsoc, $this);
245 $this->error = $obj->error;
250 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_HOLIDAY_ADDON_NotDefined");
274 $this->db->rollback();
286 public function create($user, $notrigger = 0)
294 if (empty($this->fk_user) || !is_numeric($this->fk_user) || $this->fk_user < 0) {
295 $this->error =
"ErrorBadParameterFkUser";
298 if (empty($this->fk_validator) || !is_numeric($this->fk_validator) || $this->fk_validator < 0) {
299 $this->error =
"ErrorBadParameterFkValidator";
302 if (empty($this->fk_type) || !is_numeric($this->fk_type) || $this->fk_type < 0) {
303 $this->error =
"ErrorBadParameterFkType";
308 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"holiday(";
311 $sql .=
"date_create,";
312 $sql .=
"description,";
313 $sql .=
"date_debut,";
317 $sql .=
"fk_validator,";
319 $sql .=
"fk_user_create,";
321 $sql .=
") VALUES (";
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).
",";
330 $sql .=
" ".((int) $this->fk_validator).
",";
331 $sql .=
" ".((int) $this->fk_type).
",";
332 $sql .=
" ".((int) $user->id).
",";
333 $sql .=
" ".((int) $conf->entity);
338 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
339 $resql = $this->db->query($sql);
342 $this->errors[] =
"Error ".$this->db->lasterror();
346 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"holiday");
350 $initialref =
'(PROV'.$this->id.
')';
351 if (!empty($this->
ref)) {
352 $initialref = $this->ref;
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;
366 if (!$error && !$notrigger) {
380 foreach ($this->errors as $errmsg) {
381 dol_syslog(get_class($this).
"::create ".$errmsg, LOG_ERR);
382 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
384 $this->db->rollback();
400 public function fetch($id, $ref =
'')
403 $sql .=
" cp.rowid,";
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";
429 $sql .=
" WHERE cp.rowid = ".((int) $id);
431 $sql .=
" WHERE cp.ref = '".$this->db->escape($ref).
"'";
434 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
435 $resql = $this->db->query($sql);
437 if ($this->db->num_rows($resql)) {
438 $obj = $this->db->fetch_object($resql);
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);
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;
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;
475 $this->db->free($resql);
479 $this->error =
"Error ".$this->db->lasterror();
495 $sql .=
" cp.rowid,";
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,";
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,";
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";
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";
532 $sql .=
" AND cp.fk_user IN (".$this->db->sanitize($user_id).
")";
535 if (!empty($filter)) {
540 if (!empty($order)) {
544 dol_syslog(get_class($this).
"::fetchByUser", LOG_DEBUG);
545 $resql = $this->db->query($sql);
550 $tab_result = $this->holiday;
551 $num = $this->db->num_rows($resql);
560 $obj = $this->db->fetch_object($resql);
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);
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;
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;
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;
606 $this->holiday = $tab_result;
610 $this->error =
"Error ".$this->db->lasterror();
625 $sql .=
" cp.rowid,";
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,";
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,";
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";
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 ";
664 if (!empty($filter)) {
669 if (!empty($order)) {
673 dol_syslog(get_class($this).
"::fetchAll", LOG_DEBUG);
674 $resql = $this->db->query($sql);
679 $tab_result = $this->holiday;
680 $num = $this->db->num_rows($resql);
689 $obj = $this->db->fetch_object($resql);
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);
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;
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;
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;
735 $this->holiday = $tab_result;
739 $this->error =
"Error ".$this->db->lasterror();
752 public function validate($user =
null, $notrigger = 0)
754 global $conf, $langs;
755 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
758 $checkBalance =
getDictionaryValue(
'c_holiday_types',
'block_if_negative', $this->fk_type,
true);
760 if ($checkBalance > 0) {
761 $balance = $this->
getCPforUser($this->fk_user, $this->fk_type);
764 $this->error =
'LeaveRequestCreationBlockedBecauseBalanceIsNegative';
770 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref) || $this->
ref == $this->
id)) {
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).
",";
784 $this->error =
'Property status must be a numeric value';
787 $sql .=
" ref = '".$this->db->escape($num).
"'";
788 $sql .=
" WHERE rowid = ".((int) $this->
id);
792 dol_syslog(get_class($this).
"::validate", LOG_DEBUG);
793 $resql = $this->db->query($sql);
796 $this->errors[] =
"Error ".$this->db->lasterror();
802 $result = $this->
call_trigger(
'HOLIDAY_VALIDATE', $user);
811 $this->oldref = $this->ref;
814 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
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);
821 $this->error = $this->db->lasterror();
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);
828 $this->error = $this->db->lasterror();
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)) {
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);
857 foreach ($this->errors as $errmsg) {
858 dol_syslog(get_class($this).
"::validate ".$errmsg, LOG_ERR);
859 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
861 $this->db->rollback();
877 public function approve($user =
null, $notrigger = 0)
881 $checkBalance =
getDictionaryValue(
'c_holiday_types',
'block_if_negative', $this->fk_type,
true);
883 if ($checkBalance > 0) {
884 $balance = $this->
getCPforUser($this->fk_user, $this->fk_type);
885 $daysAsked =
num_open_day($this->date_debut, $this->date_fin, 0, 1);
887 if (($balance - $daysAsked) < 0) {
888 $this->error =
'LeaveRequestCreationBlockedBecauseBalanceIsNegative';
894 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"holiday SET";
895 $sql .=
" description= '".$this->db->escape($this->
description).
"',";
896 if (!empty($this->date_debut)) {
897 $sql .=
" date_debut = '".$this->db->idate($this->date_debut).
"',";
901 if (!empty($this->date_fin)) {
902 $sql .=
" date_fin = '".$this->db->idate($this->date_fin).
"',";
906 $sql .=
" halfday = ".((int) $this->halfday).
",";
907 if (!empty($this->
status) && is_numeric($this->
status)) {
908 $sql .=
" statut = ".((int) $this->
status).
",";
912 if (!empty($this->fk_validator)) {
913 $sql .=
" fk_validator = ".((int) $this->fk_validator).
",";
917 if (!empty($this->date_valid)) {
918 $sql .=
" date_valid = '".$this->db->idate($this->date_valid).
"',";
920 $sql .=
" date_valid = NULL,";
922 if (!empty($this->fk_user_valid)) {
923 $sql .=
" fk_user_valid = ".((int) $this->fk_user_valid).
",";
925 $sql .=
" fk_user_valid = NULL,";
927 if (!empty($this->date_approval)) {
928 $sql .=
" date_approval = '".$this->db->idate($this->date_approval).
"',";
930 $sql .=
" date_approval = NULL,";
932 if (!empty($this->fk_user_approve)) {
933 $sql .=
" fk_user_approve = ".((int) $this->fk_user_approve).
",";
935 $sql .=
" fk_user_approve = NULL,";
937 if (!empty($this->date_refuse)) {
938 $sql .=
" date_refuse = '".$this->db->idate($this->date_refuse).
"',";
940 $sql .=
" date_refuse = NULL,";
942 if (!empty($this->fk_user_refuse)) {
943 $sql .=
" fk_user_refuse = ".((int) $this->fk_user_refuse).
",";
945 $sql .=
" fk_user_refuse = NULL,";
947 if (!empty($this->date_cancel)) {
948 $sql .=
" date_cancel = '".$this->db->idate($this->date_cancel).
"',";
950 $sql .=
" date_cancel = NULL,";
952 if (!empty($this->fk_user_cancel)) {
953 $sql .=
" fk_user_cancel = ".((int) $this->fk_user_cancel).
",";
955 $sql .=
" fk_user_cancel = NULL,";
957 if (!empty($this->detail_refuse)) {
958 $sql .=
" detail_refuse = '".$this->db->escape($this->detail_refuse).
"'";
960 $sql .=
" detail_refuse = NULL";
962 $sql .=
" WHERE rowid = ".((int) $this->
id);
966 dol_syslog(get_class($this).
"::approve", LOG_DEBUG);
967 $resql = $this->db->query($sql);
970 $this->errors[] =
"Error ".$this->db->lasterror();
976 $result = $this->
call_trigger(
'HOLIDAY_APPROVE', $user);
986 foreach ($this->errors as $errmsg) {
987 dol_syslog(get_class($this).
"::approve ".$errmsg, LOG_ERR);
988 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
990 $this->db->rollback();
1005 public function update($user =
null, $notrigger = 0)
1007 global $conf, $langs;
1010 $checkBalance =
getDictionaryValue(
'c_holiday_types',
'block_if_negative', $this->fk_type,
true);
1012 if ($checkBalance > 0 && $this->
status != self::STATUS_DRAFT) {
1013 $balance = $this->
getCPforUser($this->fk_user, $this->fk_type);
1016 $this->error =
'LeaveRequestCreationBlockedBecauseBalanceIsNegative';
1022 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"holiday SET";
1024 $sql .=
" description= '".$this->db->escape($this->
description).
"',";
1026 if (!empty($this->date_debut)) {
1027 $sql .=
" date_debut = '".$this->db->idate($this->date_debut).
"',";
1031 if (!empty($this->date_fin)) {
1032 $sql .=
" date_fin = '".$this->db->idate($this->date_fin).
"',";
1036 $sql .=
" halfday = ".$this->halfday.
",";
1037 if (!empty($this->
status) && is_numeric($this->
status)) {
1038 $sql .=
" statut = ".$this->status.
",";
1042 if (!empty($this->fk_validator)) {
1043 $sql .=
" fk_validator = '".$this->db->escape($this->fk_validator).
"',";
1047 if (!empty($this->date_valid)) {
1048 $sql .=
" date_valid = '".$this->db->idate($this->date_valid).
"',";
1050 $sql .=
" date_valid = NULL,";
1052 if (!empty($this->fk_user_valid)) {
1053 $sql .=
" fk_user_valid = ".((int) $this->fk_user_valid).
",";
1055 $sql .=
" fk_user_valid = NULL,";
1057 if (!empty($this->date_approval)) {
1058 $sql .=
" date_approval = '".$this->db->idate($this->date_approval).
"',";
1060 $sql .=
" date_approval = NULL,";
1062 if (!empty($this->fk_user_approve)) {
1063 $sql .=
" fk_user_approve = ".((int) $this->fk_user_approve).
",";
1065 $sql .=
" fk_user_approve = NULL,";
1067 if (!empty($this->date_refuse)) {
1068 $sql .=
" date_refuse = '".$this->db->idate($this->date_refuse).
"',";
1070 $sql .=
" date_refuse = NULL,";
1072 if (!empty($this->fk_user_refuse)) {
1073 $sql .=
" fk_user_refuse = ".((int) $this->fk_user_refuse).
",";
1075 $sql .=
" fk_user_refuse = NULL,";
1077 if (!empty($this->date_cancel)) {
1078 $sql .=
" date_cancel = '".$this->db->idate($this->date_cancel).
"',";
1080 $sql .=
" date_cancel = NULL,";
1082 if (!empty($this->fk_user_cancel)) {
1083 $sql .=
" fk_user_cancel = ".((int) $this->fk_user_cancel).
",";
1085 $sql .=
" fk_user_cancel = NULL,";
1087 if (!empty($this->detail_refuse)) {
1088 $sql .=
" detail_refuse = '".$this->db->escape($this->detail_refuse).
"'";
1090 $sql .=
" detail_refuse = NULL";
1093 $sql .=
" WHERE rowid = ".((int) $this->
id);
1097 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
1098 $resql = $this->db->query($sql);
1101 $this->errors[] =
"Error ".$this->db->lasterror();
1114 $result = $this->
call_trigger(
'HOLIDAY_MODIFY', $user);
1124 foreach ($this->errors as $errmsg) {
1125 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1126 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1128 $this->db->rollback();
1131 $this->db->commit();
1144 public function delete($user, $notrigger = 0)
1146 global $conf, $langs;
1149 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"holiday";
1150 $sql .=
" WHERE rowid=".((int) $this->
id);
1154 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1155 $resql = $this->db->query($sql);
1158 $this->errors[] =
"Error ".$this->db->lasterror();
1164 $result = $this->
call_trigger(
'HOLIDAY_DELETE', $user);
1174 foreach ($this->errors as $errmsg) {
1175 dol_syslog(get_class($this).
"::delete ".$errmsg, LOG_ERR);
1176 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1178 $this->db->rollback();
1181 $this->db->commit();
1203 foreach ($this->holiday as $infos_CP) {
1214 if ($halfday == 0) {
1215 if ($dateStart >= $infos_CP[
'date_debut'] && $dateStart <= $infos_CP[
'date_fin']) {
1218 if ($dateEnd <= $infos_CP[
'date_fin'] && $dateEnd >= $infos_CP[
'date_debut']) {
1221 } elseif ($halfday == -1) {
1223 if ($dateStart >= $infos_CP[
'date_debut'] && $dateStart <= $infos_CP[
'date_fin']) {
1224 if ($dateStart < $infos_CP[
'date_fin'] || in_array($infos_CP[
'halfday'], array(0, -1))) {
1228 if ($dateEnd <= $infos_CP[
'date_fin'] && $dateEnd >= $infos_CP[
'date_debut']) {
1229 if ($dateStart < $dateEnd) {
1232 if ($dateEnd < $infos_CP[
'date_fin'] || in_array($infos_CP[
'halfday'], array(0, -1))) {
1236 } elseif ($halfday == 1) {
1238 if ($dateStart >= $infos_CP[
'date_debut'] && $dateStart <= $infos_CP[
'date_fin']) {
1239 if ($dateStart < $dateEnd) {
1242 if ($dateStart > $infos_CP[
'date_debut'] || in_array($infos_CP[
'halfday'], array(0, 1))) {
1246 if ($dateEnd <= $infos_CP[
'date_fin'] && $dateEnd >= $infos_CP[
'date_debut']) {
1247 if ($dateEnd > $infos_CP[
'date_debut'] || in_array($infos_CP[
'halfday'], array(0, 1))) {
1251 } elseif ($halfday == 2) {
1253 if ($dateStart >= $infos_CP[
'date_debut'] && $dateStart <= $infos_CP[
'date_fin']) {
1254 if ($dateStart < $infos_CP[
'date_fin'] || in_array($infos_CP[
'halfday'], array(0, -1))) {
1258 if ($dateEnd <= $infos_CP[
'date_fin'] && $dateEnd >= $infos_CP[
'date_debut']) {
1259 if ($dateEnd > $infos_CP[
'date_debut'] || in_array($infos_CP[
'halfday'], array(0, 1))) {
1264 dol_print_error(
null,
'Bad value of parameter halfday when calling function verifDateHolidayCP');
1283 $isavailablemorning =
true;
1284 $isavailableafternoon =
true;
1287 $sql =
"SELECT cp.rowid, cp.date_debut as date_start, cp.date_fin as date_end, cp.halfday, cp.statut as status";
1288 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday as cp";
1289 $sql .=
" WHERE cp.entity IN (".getEntity(
'holiday').
")";
1290 $sql .=
" AND cp.fk_user = ".(int) $fk_user;
1291 $sql .=
" AND cp.date_debut <= '".$this->db->idate($timestamp).
"' AND cp.date_fin >= '".$this->db->idate($timestamp).
"'";
1292 if ($status !=
'-1') {
1293 $sql .=
" AND cp.statut IN (".$this->db->sanitize($status).
")";
1296 $resql = $this->db->query($sql);
1298 $num_rows = $this->db->num_rows($resql);
1299 if ($num_rows > 0) {
1300 $arrayofrecord = array();
1302 while ($i < $num_rows) {
1303 $obj = $this->db->fetch_object($resql);
1306 $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);
1311 $isavailablemorning =
true;
1312 foreach ($arrayofrecord as $record) {
1313 if ($timestamp == $record[
'date_start'] && $record[
'halfday'] == 2) {
1316 if ($timestamp == $record[
'date_start'] && $record[
'halfday'] == -1) {
1319 $isavailablemorning =
false;
1322 $isavailableafternoon =
true;
1323 foreach ($arrayofrecord as $record) {
1324 if ($timestamp == $record[
'date_end'] && $record[
'halfday'] == 2) {
1327 if ($timestamp == $record[
'date_end'] && $record[
'halfday'] == 1) {
1330 $isavailableafternoon =
false;
1338 $result = array(
'morning' => $isavailablemorning,
'afternoon' => $isavailableafternoon);
1339 if (!$isavailablemorning) {
1340 $result[
'morning_reason'] =
'leave_request';
1342 if (!$isavailableafternoon) {
1343 $result[
'afternoon_reason'] =
'leave_request';
1359 $langs->load(
'holiday');
1360 $nofetch = !empty($params[
'nofetch']);
1363 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"Holiday").
'</u>';
1364 if (isset($this->
status)) {
1365 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
1367 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1369 if (!$nofetch && !empty($this->fk_type)) {
1370 $typeleaves = $this->
getTypes(1, -1);
1371 if (empty($typeleaves[$this->fk_type])) {
1372 $labeltoshow = $langs->trans(
"TypeWasDisabledOrRemoved", $this->fk_type);
1374 $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']);
1376 $datas[
'type'] =
'<br><b>'.$langs->trans(
"Type") .
':</b> ' . $labeltoshow;
1378 if (isset($this->halfday) && !empty($this->date_debut) && !empty($this->date_fin)) {
1379 $listhalfday = array(
1380 'morning' => $langs->trans(
"Morning"),
1381 "afternoon" => $langs->trans(
"Afternoon")
1383 $starthalfday = ($this->halfday == -1 || $this->halfday == 2) ?
'afternoon' :
'morning';
1384 $endhalfday = ($this->halfday == 1 || $this->halfday == 2) ?
'morning' :
'afternoon';
1385 $datas[
'date_start'] =
'<br><b>'.$langs->trans(
'DateDebCP') .
'</b>: '.
dol_print_date($this->date_debut,
'day') .
' <span class="opacitymedium">'.$langs->trans($listhalfday[$starthalfday]).
'</span>';
1386 $datas[
'date_end'] =
'<br><b>'.$langs->trans(
'DateFinCP') .
'</b>: '.
dol_print_date($this->date_fin,
'day') .
' <span class="opacitymedium">'.$langs->trans($listhalfday[$endhalfday]).
'</span>';
1402 public function getNomUrl($withpicto = 0, $save_lastsearch_value = -1, $notooltip = 0, $morecss =
'')
1404 global $conf, $langs, $hookmanager;
1406 if (!empty($conf->dol_no_mouse_hover)) {
1413 'objecttype' => $this->element,
1416 $classfortooltip =
'classfortooltip';
1419 $classfortooltip =
'classforajaxtooltip';
1420 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
1426 $url = DOL_URL_ROOT.
'/holiday/card.php?id='.$this->id;
1431 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1432 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1433 $add_save_lastsearch_values = 1;
1435 if ($add_save_lastsearch_values) {
1436 $url .=
'&save_lastsearch_values=1';
1441 if (empty($notooltip)) {
1443 $label = $langs->trans(
"ShowMyObject");
1444 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
1446 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
1447 $linkclose .= $dataparams.
' class="'.$classfortooltip.($morecss ?
' '.$morecss :
'').
'"';
1449 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
1452 $linkstart =
'<a href="'.$url.
'"';
1453 $linkstart .= $linkclose.
'>';
1456 $result .= $linkstart;
1459 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'"'), 0, 0, $notooltip ? 0 : 1);
1461 if ($withpicto != 2) {
1462 $result .= $this->ref;
1464 $result .= $linkend;
1467 $hookmanager->initHooks(array($this->element .
'dao'));
1468 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1469 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1471 $result = $hookmanager->resPrint;
1473 $result .= $hookmanager->resPrint;
1499 public function LibStatut($status, $mode = 0, $startdate =
'')
1504 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
1512 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'DraftCP');
1520 $statusType =
'status6';
1521 if (!empty($startdate) && $startdate >=
dol_now()) {
1522 $statusType =
'status4';
1523 $params = array(
'tooltip' => $this->labelStatus[$status].
' - '.$langs->trans(
"Forthcoming"));
1525 if ($status == self::STATUS_DRAFT) {
1526 $statusType =
'status0';
1528 if ($status == self::STATUS_VALIDATED) {
1529 $statusType =
'status1';
1531 if ($status == self::STATUS_CANCELED) {
1532 $statusType =
'status9';
1534 if ($status == self::STATUS_REFUSED) {
1535 $statusType =
'status9';
1538 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode,
'', $params);
1550 public function selectStatutCP($selected = 0, $htmlname =
'select_statut', $morecss =
'minwidth125')
1555 $name = array(
'DraftCP',
'ToReviewCP',
'ApprovedCP',
'CancelCP',
'RefuseCP');
1556 $nb = count($name) + 1;
1559 $out =
'<select name="'.$htmlname.
'" id="'.$htmlname.
'" class="flat'.($morecss ?
' '.$morecss :
'').
'">'.
"\n";
1560 $out .=
'<option value="-1"> </option>'.
"\n";
1563 for ($i = 1; $i < $nb; $i++) {
1564 if ($i == $selected) {
1565 $out .=
'<option value="'.$i.
'" selected>'.$langs->trans($name[$i - 1]).
'</option>'.
"\n";
1567 $out .=
'<option value="'.$i.
'">'.$langs->trans($name[$i - 1]).
'</option>'.
"\n";
1571 $out .=
"</select>\n";
1574 $out .=
ajax_combobox($htmlname, array(), 0, 0,
'resolve', ($showempty < 0 ? (
string) $showempty :
'-1'), $morecss);
1588 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"holiday_config SET";
1589 $sql .=
" value = '".$this->db->escape($value).
"'";
1590 $sql .=
" WHERE name = '".$this->db->escape($name).
"'";
1592 dol_syslog(get_class($this).
'::updateConfCP name='.$name, LOG_DEBUG);
1593 $result = $this->db->query($sql);
1611 $sql =
"SELECT value";
1612 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday_config";
1613 $sql .=
" WHERE name = '".$this->db->escape($name).
"'";
1615 dol_syslog(get_class($this).
'::getConfCP name='.$name.
' createifnotfound='.$createifnotfound, LOG_DEBUG);
1616 $result = $this->db->query($sql);
1619 $obj = $this->db->fetch_object($result);
1622 if ($createifnotfound) {
1623 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"holiday_config(name, value)";
1624 $sql .=
" VALUES('".$this->db->escape($name).
"', '".$this->db->escape($createifnotfound).
"')";
1625 $result = $this->db->query($sql);
1627 return $createifnotfound;
1629 $this->error = $this->db->lasterror();
1640 $this->error = $this->db->lasterror();
1655 global $user, $langs;
1659 if (empty($userID) && empty($nbHoliday) && empty($fk_type)) {
1660 $langs->load(
"holiday");
1665 $month = date(
'm', $now);
1669 $lastUpdate = $this->
getConfCP(
'lastUpdate', $newdateforlastupdate);
1670 $monthLastUpdate = $lastUpdate[4].$lastUpdate[5];
1674 if ($month != $monthLastUpdate) {
1677 $users = $this->
fetchUsers(
false,
false,
' AND u.statut > 0');
1678 $nbUser = count($users);
1680 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"holiday_config SET";
1681 $sql .=
" value = '".$this->db->escape($newdateforlastupdate).
"'";
1682 $sql .=
" WHERE name = 'lastUpdate'";
1683 $result = $this->db->query($sql);
1685 $typeleaves = $this->
getTypes(1, 1);
1688 foreach ($users as $userCounter) {
1689 $nbDaysToAdd = (isset($typeleaves[$userCounter[
'type']][
'newbymonth']) ? $typeleaves[$userCounter[
'type']][
'newbymonth'] : 0);
1690 if (empty($nbDaysToAdd)) {
1694 dol_syslog(
"We update leave type id ".$userCounter[
'type'].
" for user id ".$userCounter[
'rowid'], LOG_DEBUG);
1696 $nowHoliday = $userCounter[
'nb_holiday'];
1697 $newSolde = $nowHoliday + $nbDaysToAdd;
1700 $this->
addLogCP($user->id, $userCounter[
'rowid'], $langs->trans(
'HolidaysMonthlyUpdate'), $newSolde, $userCounter[
'type']);
1702 $result = $this->
updateSoldeCP($userCounter[
'rowid'], $newSolde, $userCounter[
'type']);
1711 $this->db->commit();
1714 $this->db->rollback();
1724 $sql =
"SELECT nb_holiday FROM ".MAIN_DB_PREFIX.
"holiday_users";
1725 $sql .=
" WHERE fk_user = ".(int) $userID.
" AND fk_type = ".(
int) $fk_type;
1726 $resql = $this->db->query($sql);
1728 $num = $this->db->num_rows($resql);
1732 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"holiday_users SET";
1733 $sql .=
" nb_holiday = ".((float) $nbHoliday);
1734 $sql .=
" WHERE fk_user = ".(int) $userID.
" AND fk_type = ".(
int) $fk_type;
1735 $result = $this->db->query($sql);
1738 $this->errors[] = $this->db->lasterror();
1742 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"holiday_users(nb_holiday, fk_user, fk_type) VALUES (";
1743 $sql .= ((float) $nbHoliday);
1744 $sql .=
", ".(int) $userID.
", ".(
int) $fk_type.
")";
1745 $result = $this->db->query($sql);
1748 $this->errors[] = $this->db->lasterror();
1752 $this->errors[] = $this->db->lasterror();
1775 dol_syslog(get_class($this).
'::createCPusers');
1776 $arrayofusers = $this->
fetchUsers(
false,
true);
1778 foreach ($arrayofusers as $users) {
1779 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"holiday_users";
1780 $sql .=
" (fk_user, nb_holiday)";
1781 $sql .=
" VALUES (".((int) $users[
'rowid']).
"', '0')";
1783 $resql = $this->db->query($sql);
1789 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"holiday_users";
1790 $sql .=
" (fk_user, nb_holiday)";
1791 $sql .=
" VALUES (".((int) $userid).
"', '0')";
1793 $resql = $this->db->query($sql);
1809 $sql =
"SELECT nb_holiday";
1810 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday_users";
1811 $sql .=
" WHERE fk_user = ".(int) $user_id;
1813 $sql .=
" AND fk_type = ".(int) $fk_type;
1816 dol_syslog(get_class($this).
'::getCPforUser user_id='.$user_id.
' type_id='.$fk_type, LOG_DEBUG);
1817 $result = $this->db->query($sql);
1819 $obj = $this->db->fetch_object($result);
1822 return $obj->nb_holiday;
1839 public function fetchUsers($stringlist =
true, $type =
true, $filters =
'')
1843 dol_syslog(get_class($this).
"::fetchUsers", LOG_DEBUG);
1849 if (isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) {
1850 $sql .=
" DISTINCT";
1853 $sql .=
" FROM ".MAIN_DB_PREFIX.
"user as u";
1855 if (isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) {
1856 $sql .=
", ".MAIN_DB_PREFIX.
"usergroup_user as ug";
1857 $sql .=
" WHERE ((ug.fk_user = u.rowid";
1858 $sql .=
" AND ug.entity IN (".getEntity(
'usergroup').
"))";
1859 $sql .=
" OR u.entity = 0)";
1861 $sql .=
" WHERE u.entity IN (".getEntity(
'user').
")";
1863 $sql .=
" AND u.statut > 0";
1864 $sql .=
" AND u.employee = 1";
1869 $resql = $this->db->query($sql);
1874 $num = $this->db->num_rows($resql);
1879 $obj = $this->db->fetch_object($resql);
1882 $stringlist .= $obj->rowid;
1884 $stringlist .=
', '.$obj->rowid;
1893 $this->error =
"Error ".$this->db->lasterror();
1898 $sql =
"SELECT DISTINCT cpu.fk_user";
1899 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday_users as cpu, ".MAIN_DB_PREFIX.
"user as u";
1900 $sql .=
" WHERE cpu.fk_user = u.rowid";
1905 $resql = $this->db->query($sql);
1910 $num = $this->db->num_rows($resql);
1915 $obj = $this->db->fetch_object($resql);
1918 $stringlist .= $obj->fk_user;
1920 $stringlist .=
', '.$obj->fk_user;
1929 $this->error =
"Error ".$this->db->lasterror();
1939 if (isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) {
1940 $sql .=
" DISTINCT";
1942 $sql .=
" u.rowid, u.lastname, u.firstname, u.gender, u.photo, u.employee, u.statut as status, u.fk_user";
1943 $sql .=
" FROM ".MAIN_DB_PREFIX.
"user as u";
1945 if (isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) {
1946 $sql .=
", ".MAIN_DB_PREFIX.
"usergroup_user as ug";
1947 $sql .=
" WHERE ((ug.fk_user = u.rowid";
1948 $sql .=
" AND ug.entity IN (".getEntity(
'usergroup').
"))";
1949 $sql .=
" OR u.entity = 0)";
1951 $sql .=
" WHERE u.entity IN (".getEntity(
'user').
")";
1954 $sql .=
" AND u.statut > 0";
1955 $sql .=
" AND u.employee = 1";
1960 $resql = $this->db->query($sql);
1965 $tab_result = $this->holiday;
1966 $num = $this->db->num_rows($resql);
1970 $obj = $this->db->fetch_object($resql);
1972 $tab_result[$i][
'rowid'] = $obj->rowid;
1973 $tab_result[$i][
'id'] = $obj->rowid;
1974 $tab_result[$i][
'name'] = $obj->lastname;
1975 $tab_result[$i][
'lastname'] = $obj->lastname;
1976 $tab_result[$i][
'firstname'] = $obj->firstname;
1977 $tab_result[$i][
'gender'] = $obj->gender;
1978 $tab_result[$i][
'status'] = $obj->status;
1979 $tab_result[$i][
'employee'] = $obj->employee;
1980 $tab_result[$i][
'photo'] = $obj->photo;
1981 $tab_result[$i][
'fk_user'] = $obj->fk_user;
1991 $this->errors[] =
"Error ".$this->db->lasterror();
1996 $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";
1997 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday_users as cpu, ".MAIN_DB_PREFIX.
"user as u";
1998 $sql .=
" WHERE cpu.fk_user = u.rowid";
2003 $resql = $this->db->query($sql);
2008 $tab_result = $this->holiday;
2009 $num = $this->db->num_rows($resql);
2013 $obj = $this->db->fetch_object($resql);
2015 $tab_result[$i][
'rowid'] = $obj->rowid;
2016 $tab_result[$i][
'id'] = $obj->rowid;
2017 $tab_result[$i][
'name'] = $obj->lastname;
2018 $tab_result[$i][
'lastname'] = $obj->lastname;
2019 $tab_result[$i][
'firstname'] = $obj->firstname;
2020 $tab_result[$i][
'gender'] = $obj->gender;
2021 $tab_result[$i][
'status'] = $obj->status;
2022 $tab_result[$i][
'employee'] = $obj->employee;
2023 $tab_result[$i][
'photo'] = $obj->photo;
2024 $tab_result[$i][
'fk_user'] = $obj->fk_user;
2026 $tab_result[$i][
'type'] = $obj->fk_type;
2027 $tab_result[$i][
'nb_holiday'] = $obj->nb_holiday;
2035 $this->error =
"Error ".$this->db->lasterror();
2053 $users_validator = array();
2055 $sql =
"SELECT DISTINCT ur.fk_user";
2056 $sql .=
" FROM ".MAIN_DB_PREFIX.
"user_rights as ur, ".MAIN_DB_PREFIX.
"rights_def as rd";
2057 $sql .=
" WHERE ur.fk_id = rd.id and rd.module = 'holiday' AND rd.perms = 'approve'";
2059 $sql .=
" SELECT DISTINCT ugu.fk_user";
2060 $sql .=
" FROM ".MAIN_DB_PREFIX.
"usergroup_user as ugu, ".MAIN_DB_PREFIX.
"usergroup_rights as ur, ".MAIN_DB_PREFIX.
"rights_def as rd";
2061 $sql .=
" WHERE ugu.fk_usergroup = ur.fk_usergroup AND ur.fk_id = rd.id and rd.module = 'holiday' AND rd.perms = 'approve'";
2064 dol_syslog(get_class($this).
"::fetch_users_approver_holiday sql=".$sql);
2065 $result = $this->db->query($sql);
2067 $num_rows = $this->db->num_rows($result);
2069 while ($i < $num_rows) {
2070 $objp = $this->db->fetch_object($result);
2071 array_push($users_validator, $objp->fk_user);
2074 return $users_validator;
2076 $this->error = $this->db->lasterror();
2077 dol_syslog(get_class($this).
"::fetch_users_approver_holiday Error ".$this->error, LOG_ERR);
2090 $sql =
"SELECT count(u.rowid) as compteur";
2091 $sql .=
" FROM ".MAIN_DB_PREFIX.
"user as u";
2092 $sql .=
" WHERE u.statut > 0";
2094 $result = $this->db->query($sql);
2095 $object = $this->db->fetch_object($result);
2106 $sql =
"SELECT count(u.rowid) as compteur";
2107 $sql .=
" FROM ".MAIN_DB_PREFIX.
"user as u LEFT OUTER JOIN ".MAIN_DB_PREFIX.
"holiday_users hu ON (hu.fk_user=u.rowid)";
2108 $sql .=
" WHERE u.statut > 0 AND hu.fk_user IS NULL";
2110 $result = $this->db->query($sql);
2111 $object = $this->db->fetch_object($result);
2125 if (empty($userCP)) {
2128 dol_syslog(get_class($this).
'::verifNbUsers userDolibarr='.$userDolibarrWithoutCP.
' userCP='.$userCP);
2143 public function addLogCP($fk_user_action, $fk_user_update, $label, $new_solde, $fk_type)
2145 global $conf, $langs;
2153 if ($prev_solde == $new_solde) {
2160 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"holiday_logs (";
2161 $sql .=
"date_action,";
2162 $sql .=
"fk_user_action,";
2163 $sql .=
"fk_user_update,";
2164 $sql .=
"type_action,";
2165 $sql .=
"prev_solde,";
2166 $sql .=
"new_solde,";
2168 $sql .=
") VALUES (";
2169 $sql .=
" '".$this->db->idate(
dol_now()).
"',";
2170 $sql .=
" ".((int) $fk_user_action).
",";
2171 $sql .=
" ".((int) $fk_user_update).
",";
2172 $sql .=
" '".$this->db->escape($label).
"',";
2173 $sql .=
" ".((float) $prev_solde).
",";
2174 $sql .=
" ".((float) $new_solde).
",";
2175 $sql .=
" ".((int) $fk_type);
2178 $resql = $this->db->query($sql);
2181 $this->errors[] =
"Error ".$this->db->lasterror();
2185 $this->optRowid = $this->db->last_insert_id(MAIN_DB_PREFIX.
"holiday_logs");
2190 foreach ($this->errors as $errmsg) {
2191 dol_syslog(get_class($this).
"::addLogCP ".$errmsg, LOG_ERR);
2192 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2194 $this->db->rollback();
2197 $this->db->commit();
2198 return $this->optRowid;
2212 $sql .=
" cpl.rowid,";
2213 $sql .=
" cpl.date_action,";
2214 $sql .=
" cpl.fk_user_action,";
2215 $sql .=
" cpl.fk_user_update,";
2216 $sql .=
" cpl.type_action,";
2217 $sql .=
" cpl.prev_solde,";
2218 $sql .=
" cpl.new_solde,";
2219 $sql .=
" cpl.fk_type";
2220 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday_logs as cpl";
2221 $sql .=
" WHERE cpl.rowid > 0";
2224 if (!empty($filter)) {
2225 $sql .=
" ".$filter;
2229 if (!empty($order)) {
2233 dol_syslog(get_class($this).
"::fetchLog", LOG_DEBUG);
2234 $resql = $this->db->query($sql);
2239 $tab_result = $this->logs;
2240 $num = $this->db->num_rows($resql);
2249 $obj = $this->db->fetch_object($resql);
2251 $tab_result[$i][
'rowid'] = $obj->rowid;
2252 $tab_result[$i][
'id'] = $obj->rowid;
2253 $tab_result[$i][
'date_action'] = $obj->date_action;
2254 $tab_result[$i][
'fk_user_action'] = $obj->fk_user_action;
2255 $tab_result[$i][
'fk_user_update'] = $obj->fk_user_update;
2256 $tab_result[$i][
'type_action'] = $obj->type_action;
2257 $tab_result[$i][
'prev_solde'] = $obj->prev_solde;
2258 $tab_result[$i][
'new_solde'] = $obj->new_solde;
2259 $tab_result[$i][
'fk_type'] = $obj->fk_type;
2264 $this->logs = $tab_result;
2268 $this->error =
"Error ".$this->db->lasterror();
2285 $sql =
"SELECT rowid, code, label, affect, delay, newbymonth";
2286 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_holiday_types";
2287 $sql .=
" WHERE (fk_country IS NULL OR fk_country = ".((int) $mysoc->country_id).
')';
2288 $sql .=
" AND entity IN (".getEntity(
'c_holiday_types').
")";
2290 $sql .=
" AND active = ".((int) $active);
2293 $sql .=
" AND affect = ".((int) $affect);
2295 $sql .=
" ORDER BY sortorder";
2297 $result = $this->db->query($sql);
2299 $num = $this->db->num_rows($result);
2302 while ($obj = $this->db->fetch_object($result)) {
2303 $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);
2326 $sql =
"SELECT f.rowid, f.statut as status,";
2327 $sql .=
" f.date_create as datec,";
2328 $sql .=
" f.tms as date_modification,";
2329 $sql .=
" f.date_valid as datev,";
2330 $sql .=
" f.date_approval as datea,";
2331 $sql .=
" f.date_refuse as dater,";
2332 $sql .=
" f.fk_user_create as fk_user_creation,";
2333 $sql .=
" f.fk_user_modif as fk_user_modification,";
2334 $sql .=
" f.fk_user_valid as fk_user_validation,";
2335 $sql .=
" f.fk_user_approve as fk_user_approval_done,";
2336 $sql .=
" f.fk_validator as fk_user_approval_expected,";
2337 $sql .=
" f.fk_user_refuse as fk_user_refuse";
2338 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday as f";
2339 $sql .=
" WHERE f.rowid = ".((int) $id);
2340 $sql .=
" AND f.entity = ".$conf->entity;
2342 $resql = $this->db->query($sql);
2344 if ($this->db->num_rows($resql)) {
2345 $obj = $this->db->fetch_object($resql);
2347 $this->
id = $obj->rowid;
2349 $this->date_creation = $this->db->jdate($obj->datec);
2350 $this->date_modification = $this->db->jdate($obj->date_modification);
2351 $this->date_validation = $this->db->jdate($obj->datev);
2352 $this->date_approval = $this->db->jdate($obj->datea);
2354 $this->user_creation_id = $obj->fk_user_creation;
2355 $this->user_validation_id = $obj->fk_user_validation;
2356 $this->user_modification_id = $obj->fk_user_modification;
2359 if ($obj->fk_user_approval_done) {
2360 $this->fk_user_approve = $obj->fk_user_approval_done;
2364 $this->db->free($resql);
2380 global $user, $langs;
2384 $this->specimen = 1;
2386 $this->fk_user = $user->id;
2388 $this->date_debut =
dol_now();
2389 $this->date_fin =
dol_now() + (24 * 3600);
2390 $this->date_valid =
dol_now();
2391 $this->fk_validator = $user->id;
2408 $this->nb = array();
2410 $sql =
"SELECT count(h.rowid) as nb";
2411 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday as h";
2412 $sql .=
" WHERE h.statut > 1";
2413 $sql .=
" AND h.entity IN (".getEntity(
'holiday').
")";
2414 if (!$user->hasRight(
'expensereport',
'readall')) {
2415 $userchildids = $user->getAllChildIds(1);
2416 $sql .=
" AND (h.fk_user IN (".$this->db->sanitize(implode(
',', $userchildids)).
")";
2417 $sql .=
" OR h.fk_validator IN (".$this->db->sanitize(implode(
',', $userchildids)).
"))";
2420 $resql = $this->db->query($sql);
2422 while ($obj = $this->db->fetch_object($resql)) {
2423 $this->nb[
"holidays"] = $obj->nb;
2425 $this->db->free($resql);
2429 $this->error = $this->db->error();
2444 global $conf, $langs;
2452 $sql =
"SELECT h.rowid, h.date_debut";
2453 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday as h";
2454 $sql .=
" WHERE h.statut = 2";
2455 $sql .=
" AND h.entity IN (".getEntity(
'holiday').
")";
2456 if (!$user->hasRight(
'expensereport',
'read_all')) {
2457 $userchildids = $user->getAllChildIds(1);
2458 $sql .=
" AND (h.fk_user IN (".$this->db->sanitize(implode(
',', $userchildids)).
")";
2459 $sql .=
" OR h.fk_validator IN (".$this->db->sanitize(implode(
',', $userchildids)).
"))";
2462 $resql = $this->db->query($sql);
2464 $langs->load(
"members");
2467 $response->warning_delay = $conf->holiday->approve->warning_delay / 60 / 60 / 24;
2468 $response->label = $langs->trans(
"HolidaysToApprove");
2469 $response->labelShort = $langs->trans(
"ToApprove");
2470 $response->url = DOL_URL_ROOT.
'/holiday/list.php?search_status=2&mainmenu=hrm&leftmenu=holiday';
2473 while ($obj = $this->db->fetch_object($resql)) {
2474 $response->nbtodo++;
2476 if ($this->db->jdate($obj->date_debut) < ($now - $conf->holiday->approve->warning_delay)) {
2477 $response->nbtodolate++;
2484 $this->error = $this->db->error();
2499 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
2501 $return =
'<div class="box-flex-item box-flex-grow-zero">';
2502 $return .=
'<div class="info-box info-box-sm">';
2503 $return .=
'<span class="info-box-icon bg-infobox-action">';
2505 $return .=
'</span>';
2506 $return .=
'<div class="info-box-content">';
2507 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.$arraydata[
'user']->getNomUrl(-1).
'</span>';
2508 if ($selected >= 0) {
2509 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
2511 if (property_exists($this,
'fk_type')) {
2514 $return .=
'<div class="info_box-label tdoverflowmax100" title="'.dol_escape_htmltag($arraydata[
'labeltype']).
'">'.
dol_escape_htmltag($arraydata[
'labeltype']).
'</div>';
2516 if (property_exists($this,
'date_debut') && property_exists($this,
'date_fin')) {
2517 $return .=
'<span class="info-box-label small">'.dol_print_date($this->date_debut,
'day').
'</span>';
2518 $return .=
' <span class="opacitymedium small">'.$langs->trans(
"To").
'</span> ';
2519 $return .=
'<span class="info-box-label small">'.dol_print_date($this->date_fin,
'day').
'</span>';
2520 if (!empty($arraydata[
'nbopenedday'])) {
2521 $return .=
' ('.$arraydata[
'nbopenedday'].
')';
2524 if (method_exists($this,
'getLibStatut')) {
2525 $return .=
'<div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
2527 $return .=
'</div>';
2528 $return .=
'</div>';
2529 $return .=
'</div>';
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
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...
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
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.
num_open_day($timestampStart, $timestampEnd, $inhour=0, $lastday=0, $halfday=0, $country_code='')
Function to return number of working days (and text of units) between two dates (working days)
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.
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