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);
887 $this->error =
'LeaveRequestCreationBlockedBecauseBalanceIsNegative';
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).
"',";
900 if (!empty($this->date_fin)) {
901 $sql .=
" date_fin = '".$this->db->idate($this->date_fin).
"',";
905 $sql .=
" halfday = ".((int) $this->halfday).
",";
906 if (!empty($this->
status) && is_numeric($this->
status)) {
907 $sql .=
" statut = ".((int) $this->
status).
",";
911 if (!empty($this->fk_validator)) {
912 $sql .=
" fk_validator = ".((int) $this->fk_validator).
",";
916 if (!empty($this->date_valid)) {
917 $sql .=
" date_valid = '".$this->db->idate($this->date_valid).
"',";
919 $sql .=
" date_valid = NULL,";
921 if (!empty($this->fk_user_valid)) {
922 $sql .=
" fk_user_valid = ".((int) $this->fk_user_valid).
",";
924 $sql .=
" fk_user_valid = NULL,";
926 if (!empty($this->date_approval)) {
927 $sql .=
" date_approval = '".$this->db->idate($this->date_approval).
"',";
929 $sql .=
" date_approval = NULL,";
931 if (!empty($this->fk_user_approve)) {
932 $sql .=
" fk_user_approve = ".((int) $this->fk_user_approve).
",";
934 $sql .=
" fk_user_approve = NULL,";
936 if (!empty($this->date_refuse)) {
937 $sql .=
" date_refuse = '".$this->db->idate($this->date_refuse).
"',";
939 $sql .=
" date_refuse = NULL,";
941 if (!empty($this->fk_user_refuse)) {
942 $sql .=
" fk_user_refuse = ".((int) $this->fk_user_refuse).
",";
944 $sql .=
" fk_user_refuse = NULL,";
946 if (!empty($this->date_cancel)) {
947 $sql .=
" date_cancel = '".$this->db->idate($this->date_cancel).
"',";
949 $sql .=
" date_cancel = NULL,";
951 if (!empty($this->fk_user_cancel)) {
952 $sql .=
" fk_user_cancel = ".((int) $this->fk_user_cancel).
",";
954 $sql .=
" fk_user_cancel = NULL,";
956 if (!empty($this->detail_refuse)) {
957 $sql .=
" detail_refuse = '".$this->db->escape($this->detail_refuse).
"'";
959 $sql .=
" detail_refuse = NULL";
961 $sql .=
" WHERE rowid = ".((int) $this->
id);
965 dol_syslog(get_class($this).
"::approve", LOG_DEBUG);
966 $resql = $this->db->query($sql);
969 $this->errors[] =
"Error ".$this->db->lasterror();
975 $result = $this->
call_trigger(
'HOLIDAY_APPROVE', $user);
985 foreach ($this->errors as $errmsg) {
986 dol_syslog(get_class($this).
"::approve ".$errmsg, LOG_ERR);
987 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
989 $this->db->rollback();
1004 public function update($user =
null, $notrigger = 0)
1006 global $conf, $langs;
1009 $checkBalance =
getDictionaryValue(
'c_holiday_types',
'block_if_negative', $this->fk_type,
true);
1011 if ($checkBalance > 0 && $this->
status != self::STATUS_DRAFT) {
1012 $balance = $this->
getCPforUser($this->fk_user, $this->fk_type);
1015 $this->error =
'LeaveRequestCreationBlockedBecauseBalanceIsNegative';
1021 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"holiday SET";
1023 $sql .=
" description= '".$this->db->escape($this->
description).
"',";
1025 if (!empty($this->date_debut)) {
1026 $sql .=
" date_debut = '".$this->db->idate($this->date_debut).
"',";
1030 if (!empty($this->date_fin)) {
1031 $sql .=
" date_fin = '".$this->db->idate($this->date_fin).
"',";
1035 $sql .=
" halfday = ".$this->halfday.
",";
1036 if (!empty($this->
status) && is_numeric($this->
status)) {
1037 $sql .=
" statut = ".$this->status.
",";
1041 if (!empty($this->fk_validator)) {
1042 $sql .=
" fk_validator = '".$this->db->escape($this->fk_validator).
"',";
1046 if (!empty($this->date_valid)) {
1047 $sql .=
" date_valid = '".$this->db->idate($this->date_valid).
"',";
1049 $sql .=
" date_valid = NULL,";
1051 if (!empty($this->fk_user_valid)) {
1052 $sql .=
" fk_user_valid = ".((int) $this->fk_user_valid).
",";
1054 $sql .=
" fk_user_valid = NULL,";
1056 if (!empty($this->date_approval)) {
1057 $sql .=
" date_approval = '".$this->db->idate($this->date_approval).
"',";
1059 $sql .=
" date_approval = NULL,";
1061 if (!empty($this->fk_user_approve)) {
1062 $sql .=
" fk_user_approve = ".((int) $this->fk_user_approve).
",";
1064 $sql .=
" fk_user_approve = NULL,";
1066 if (!empty($this->date_refuse)) {
1067 $sql .=
" date_refuse = '".$this->db->idate($this->date_refuse).
"',";
1069 $sql .=
" date_refuse = NULL,";
1071 if (!empty($this->fk_user_refuse)) {
1072 $sql .=
" fk_user_refuse = ".((int) $this->fk_user_refuse).
",";
1074 $sql .=
" fk_user_refuse = NULL,";
1076 if (!empty($this->date_cancel)) {
1077 $sql .=
" date_cancel = '".$this->db->idate($this->date_cancel).
"',";
1079 $sql .=
" date_cancel = NULL,";
1081 if (!empty($this->fk_user_cancel)) {
1082 $sql .=
" fk_user_cancel = ".((int) $this->fk_user_cancel).
",";
1084 $sql .=
" fk_user_cancel = NULL,";
1086 if (!empty($this->detail_refuse)) {
1087 $sql .=
" detail_refuse = '".$this->db->escape($this->detail_refuse).
"'";
1089 $sql .=
" detail_refuse = NULL";
1092 $sql .=
" WHERE rowid = ".((int) $this->
id);
1096 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
1097 $resql = $this->db->query($sql);
1100 $this->errors[] =
"Error ".$this->db->lasterror();
1113 $result = $this->
call_trigger(
'HOLIDAY_MODIFY', $user);
1123 foreach ($this->errors as $errmsg) {
1124 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1125 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1127 $this->db->rollback();
1130 $this->db->commit();
1143 public function delete($user, $notrigger = 0)
1145 global $conf, $langs;
1148 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"holiday";
1149 $sql .=
" WHERE rowid=".((int) $this->
id);
1153 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1154 $resql = $this->db->query($sql);
1157 $this->errors[] =
"Error ".$this->db->lasterror();
1163 $result = $this->
call_trigger(
'HOLIDAY_DELETE', $user);
1173 foreach ($this->errors as $errmsg) {
1174 dol_syslog(get_class($this).
"::delete ".$errmsg, LOG_ERR);
1175 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1177 $this->db->rollback();
1180 $this->db->commit();
1202 foreach ($this->holiday as $infos_CP) {
1213 if ($halfday == 0) {
1214 if ($dateStart >= $infos_CP[
'date_debut'] && $dateStart <= $infos_CP[
'date_fin']) {
1217 if ($dateEnd <= $infos_CP[
'date_fin'] && $dateEnd >= $infos_CP[
'date_debut']) {
1220 } elseif ($halfday == -1) {
1222 if ($dateStart >= $infos_CP[
'date_debut'] && $dateStart <= $infos_CP[
'date_fin']) {
1223 if ($dateStart < $infos_CP[
'date_fin'] || in_array($infos_CP[
'halfday'], array(0, -1))) {
1227 if ($dateEnd <= $infos_CP[
'date_fin'] && $dateEnd >= $infos_CP[
'date_debut']) {
1228 if ($dateStart < $dateEnd) {
1231 if ($dateEnd < $infos_CP[
'date_fin'] || in_array($infos_CP[
'halfday'], array(0, -1))) {
1235 } elseif ($halfday == 1) {
1237 if ($dateStart >= $infos_CP[
'date_debut'] && $dateStart <= $infos_CP[
'date_fin']) {
1238 if ($dateStart < $dateEnd) {
1241 if ($dateStart > $infos_CP[
'date_debut'] || in_array($infos_CP[
'halfday'], array(0, 1))) {
1245 if ($dateEnd <= $infos_CP[
'date_fin'] && $dateEnd >= $infos_CP[
'date_debut']) {
1246 if ($dateEnd > $infos_CP[
'date_debut'] || in_array($infos_CP[
'halfday'], array(0, 1))) {
1250 } elseif ($halfday == 2) {
1252 if ($dateStart >= $infos_CP[
'date_debut'] && $dateStart <= $infos_CP[
'date_fin']) {
1253 if ($dateStart < $infos_CP[
'date_fin'] || in_array($infos_CP[
'halfday'], array(0, -1))) {
1257 if ($dateEnd <= $infos_CP[
'date_fin'] && $dateEnd >= $infos_CP[
'date_debut']) {
1258 if ($dateEnd > $infos_CP[
'date_debut'] || in_array($infos_CP[
'halfday'], array(0, 1))) {
1263 dol_print_error(
null,
'Bad value of parameter halfday when calling function verifDateHolidayCP');
1282 $isavailablemorning =
true;
1283 $isavailableafternoon =
true;
1286 $sql =
"SELECT cp.rowid, cp.date_debut as date_start, cp.date_fin as date_end, cp.halfday, cp.statut as status";
1287 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday as cp";
1288 $sql .=
" WHERE cp.entity IN (".getEntity(
'holiday').
")";
1289 $sql .=
" AND cp.fk_user = ".(int) $fk_user;
1290 $sql .=
" AND cp.date_debut <= '".$this->db->idate($timestamp).
"' AND cp.date_fin >= '".$this->db->idate($timestamp).
"'";
1291 if ($status !=
'-1') {
1292 $sql .=
" AND cp.statut IN (".$this->db->sanitize($status).
")";
1295 $resql = $this->db->query($sql);
1297 $num_rows = $this->db->num_rows($resql);
1298 if ($num_rows > 0) {
1299 $arrayofrecord = array();
1301 while ($i < $num_rows) {
1302 $obj = $this->db->fetch_object($resql);
1305 $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);
1310 $isavailablemorning =
true;
1311 foreach ($arrayofrecord as $record) {
1312 if ($timestamp == $record[
'date_start'] && $record[
'halfday'] == 2) {
1315 if ($timestamp == $record[
'date_start'] && $record[
'halfday'] == -1) {
1318 $isavailablemorning =
false;
1321 $isavailableafternoon =
true;
1322 foreach ($arrayofrecord as $record) {
1323 if ($timestamp == $record[
'date_end'] && $record[
'halfday'] == 2) {
1326 if ($timestamp == $record[
'date_end'] && $record[
'halfday'] == 1) {
1329 $isavailableafternoon =
false;
1337 $result = array(
'morning' => $isavailablemorning,
'afternoon' => $isavailableafternoon);
1338 if (!$isavailablemorning) {
1339 $result[
'morning_reason'] =
'leave_request';
1341 if (!$isavailableafternoon) {
1342 $result[
'afternoon_reason'] =
'leave_request';
1358 $langs->load(
'holiday');
1359 $nofetch = !empty($params[
'nofetch']);
1362 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"Holiday").
'</u>';
1363 if (isset($this->
status)) {
1364 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
1366 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1368 if (!$nofetch && !empty($this->fk_type)) {
1369 $typeleaves = $this->
getTypes(1, -1);
1370 if (empty($typeleaves[$this->fk_type])) {
1371 $labeltoshow = $langs->trans(
"TypeWasDisabledOrRemoved", $this->fk_type);
1373 $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']);
1375 $datas[
'type'] =
'<br><b>'.$langs->trans(
"Type") .
':</b> ' . $labeltoshow;
1377 if (isset($this->halfday) && !empty($this->date_debut) && !empty($this->date_fin)) {
1378 $listhalfday = array(
1379 'morning' => $langs->trans(
"Morning"),
1380 "afternoon" => $langs->trans(
"Afternoon")
1382 $starthalfday = ($this->halfday == -1 || $this->halfday == 2) ?
'afternoon' :
'morning';
1383 $endhalfday = ($this->halfday == 1 || $this->halfday == 2) ?
'morning' :
'afternoon';
1384 $datas[
'date_start'] =
'<br><b>'.$langs->trans(
'DateDebCP') .
'</b>: '.
dol_print_date($this->date_debut,
'day') .
' <span class="opacitymedium">'.$langs->trans($listhalfday[$starthalfday]).
'</span>';
1385 $datas[
'date_end'] =
'<br><b>'.$langs->trans(
'DateFinCP') .
'</b>: '.
dol_print_date($this->date_fin,
'day') .
' <span class="opacitymedium">'.$langs->trans($listhalfday[$endhalfday]).
'</span>';
1401 public function getNomUrl($withpicto = 0, $save_lastsearch_value = -1, $notooltip = 0, $morecss =
'')
1403 global $conf, $langs, $hookmanager;
1405 if (!empty($conf->dol_no_mouse_hover)) {
1412 'objecttype' => $this->element,
1415 $classfortooltip =
'classfortooltip';
1418 $classfortooltip =
'classforajaxtooltip';
1419 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
1425 $url = DOL_URL_ROOT.
'/holiday/card.php?id='.$this->id;
1430 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1431 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1432 $add_save_lastsearch_values = 1;
1434 if ($add_save_lastsearch_values) {
1435 $url .=
'&save_lastsearch_values=1';
1440 if (empty($notooltip)) {
1442 $label = $langs->trans(
"ShowMyObject");
1443 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
1445 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
1446 $linkclose .= $dataparams.
' class="'.$classfortooltip.($morecss ?
' '.$morecss :
'').
'"';
1448 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
1451 $linkstart =
'<a href="'.$url.
'"';
1452 $linkstart .= $linkclose.
'>';
1455 $result .= $linkstart;
1458 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'"'), 0, 0, $notooltip ? 0 : 1);
1460 if ($withpicto != 2) {
1461 $result .= $this->ref;
1463 $result .= $linkend;
1466 $hookmanager->initHooks(array($this->element .
'dao'));
1467 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1468 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1470 $result = $hookmanager->resPrint;
1472 $result .= $hookmanager->resPrint;
1498 public function LibStatut($status, $mode = 0, $startdate =
'')
1503 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
1511 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'DraftCP');
1519 $statusType =
'status6';
1520 if (!empty($startdate) && $startdate >=
dol_now()) {
1521 $statusType =
'status4';
1522 $params = array(
'tooltip' => $this->labelStatus[$status].
' - '.$langs->trans(
"Forthcoming"));
1524 if ($status == self::STATUS_DRAFT) {
1525 $statusType =
'status0';
1527 if ($status == self::STATUS_VALIDATED) {
1528 $statusType =
'status1';
1530 if ($status == self::STATUS_CANCELED) {
1531 $statusType =
'status9';
1533 if ($status == self::STATUS_REFUSED) {
1534 $statusType =
'status9';
1537 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode,
'', $params);
1549 public function selectStatutCP($selected = 0, $htmlname =
'select_statut', $morecss =
'minwidth125')
1554 $name = array(
'DraftCP',
'ToReviewCP',
'ApprovedCP',
'CancelCP',
'RefuseCP');
1555 $nb = count($name) + 1;
1558 $out =
'<select name="'.$htmlname.
'" id="'.$htmlname.
'" class="flat'.($morecss ?
' '.$morecss :
'').
'">'.
"\n";
1559 $out .=
'<option value="-1"> </option>'.
"\n";
1562 for ($i = 1; $i < $nb; $i++) {
1563 if ($i == $selected) {
1564 $out .=
'<option value="'.$i.
'" selected>'.$langs->trans($name[$i - 1]).
'</option>'.
"\n";
1566 $out .=
'<option value="'.$i.
'">'.$langs->trans($name[$i - 1]).
'</option>'.
"\n";
1570 $out .=
"</select>\n";
1573 $out .=
ajax_combobox($htmlname, array(), 0, 0,
'resolve', ($showempty < 0 ? (
string) $showempty :
'-1'), $morecss);
1587 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"holiday_config SET";
1588 $sql .=
" value = '".$this->db->escape($value).
"'";
1589 $sql .=
" WHERE name = '".$this->db->escape($name).
"'";
1591 dol_syslog(get_class($this).
'::updateConfCP name='.$name, LOG_DEBUG);
1592 $result = $this->db->query($sql);
1610 $sql =
"SELECT value";
1611 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday_config";
1612 $sql .=
" WHERE name = '".$this->db->escape($name).
"'";
1614 dol_syslog(get_class($this).
'::getConfCP name='.$name.
' createifnotfound='.$createifnotfound, LOG_DEBUG);
1615 $result = $this->db->query($sql);
1618 $obj = $this->db->fetch_object($result);
1621 if ($createifnotfound) {
1622 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"holiday_config(name, value)";
1623 $sql .=
" VALUES('".$this->db->escape($name).
"', '".$this->db->escape($createifnotfound).
"')";
1624 $result = $this->db->query($sql);
1626 return $createifnotfound;
1628 $this->error = $this->db->lasterror();
1639 $this->error = $this->db->lasterror();
1654 global $user, $langs;
1658 if (empty($userID) && empty($nbHoliday) && empty($fk_type)) {
1659 $langs->load(
"holiday");
1664 $month = date(
'm', $now);
1668 $lastUpdate = $this->
getConfCP(
'lastUpdate', $newdateforlastupdate);
1669 $monthLastUpdate = $lastUpdate[4].$lastUpdate[5];
1673 if ($month != $monthLastUpdate) {
1676 $users = $this->
fetchUsers(
false,
false,
' AND u.statut > 0');
1677 $nbUser = count($users);
1679 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"holiday_config SET";
1680 $sql .=
" value = '".$this->db->escape($newdateforlastupdate).
"'";
1681 $sql .=
" WHERE name = 'lastUpdate'";
1682 $result = $this->db->query($sql);
1684 $typeleaves = $this->
getTypes(1, 1);
1687 foreach ($users as $userCounter) {
1688 $nbDaysToAdd = (isset($typeleaves[$userCounter[
'type']][
'newbymonth']) ? $typeleaves[$userCounter[
'type']][
'newbymonth'] : 0);
1689 if (empty($nbDaysToAdd)) {
1693 dol_syslog(
"We update leave type id ".$userCounter[
'type'].
" for user id ".$userCounter[
'rowid'], LOG_DEBUG);
1695 $nowHoliday = $userCounter[
'nb_holiday'];
1696 $newSolde = $nowHoliday + $nbDaysToAdd;
1699 $this->
addLogCP($user->id, $userCounter[
'rowid'], $langs->trans(
'HolidaysMonthlyUpdate'), $newSolde, $userCounter[
'type']);
1701 $result = $this->
updateSoldeCP($userCounter[
'rowid'], $newSolde, $userCounter[
'type']);
1710 $this->db->commit();
1713 $this->db->rollback();
1723 $sql =
"SELECT nb_holiday FROM ".MAIN_DB_PREFIX.
"holiday_users";
1724 $sql .=
" WHERE fk_user = ".(int) $userID.
" AND fk_type = ".(
int) $fk_type;
1725 $resql = $this->db->query($sql);
1727 $num = $this->db->num_rows($resql);
1731 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"holiday_users SET";
1732 $sql .=
" nb_holiday = ".((float) $nbHoliday);
1733 $sql .=
" WHERE fk_user = ".(int) $userID.
" AND fk_type = ".(
int) $fk_type;
1734 $result = $this->db->query($sql);
1737 $this->errors[] = $this->db->lasterror();
1741 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"holiday_users(nb_holiday, fk_user, fk_type) VALUES (";
1742 $sql .= ((float) $nbHoliday);
1743 $sql .=
", ".(int) $userID.
", ".(
int) $fk_type.
")";
1744 $result = $this->db->query($sql);
1747 $this->errors[] = $this->db->lasterror();
1751 $this->errors[] = $this->db->lasterror();
1774 dol_syslog(get_class($this).
'::createCPusers');
1775 $arrayofusers = $this->
fetchUsers(
false,
true);
1777 foreach ($arrayofusers as $users) {
1778 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"holiday_users";
1779 $sql .=
" (fk_user, nb_holiday)";
1780 $sql .=
" VALUES (".((int) $users[
'rowid']).
"', '0')";
1782 $resql = $this->db->query($sql);
1788 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"holiday_users";
1789 $sql .=
" (fk_user, nb_holiday)";
1790 $sql .=
" VALUES (".((int) $userid).
"', '0')";
1792 $resql = $this->db->query($sql);
1808 $sql =
"SELECT nb_holiday";
1809 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday_users";
1810 $sql .=
" WHERE fk_user = ".(int) $user_id;
1812 $sql .=
" AND fk_type = ".(int) $fk_type;
1815 dol_syslog(get_class($this).
'::getCPforUser user_id='.$user_id.
' type_id='.$fk_type, LOG_DEBUG);
1816 $result = $this->db->query($sql);
1818 $obj = $this->db->fetch_object($result);
1821 return $obj->nb_holiday;
1838 public function fetchUsers($stringlist =
true, $type =
true, $filters =
'')
1842 dol_syslog(get_class($this).
"::fetchUsers", LOG_DEBUG);
1848 if (isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) {
1849 $sql .=
" DISTINCT";
1852 $sql .=
" FROM ".MAIN_DB_PREFIX.
"user as u";
1854 if (isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) {
1855 $sql .=
", ".MAIN_DB_PREFIX.
"usergroup_user as ug";
1856 $sql .=
" WHERE ((ug.fk_user = u.rowid";
1857 $sql .=
" AND ug.entity IN (".getEntity(
'usergroup').
"))";
1858 $sql .=
" OR u.entity = 0)";
1860 $sql .=
" WHERE u.entity IN (".getEntity(
'user').
")";
1862 $sql .=
" AND u.statut > 0";
1863 $sql .=
" AND u.employee = 1";
1868 $resql = $this->db->query($sql);
1873 $num = $this->db->num_rows($resql);
1878 $obj = $this->db->fetch_object($resql);
1881 $stringlist .= $obj->rowid;
1883 $stringlist .=
', '.$obj->rowid;
1892 $this->error =
"Error ".$this->db->lasterror();
1897 $sql =
"SELECT DISTINCT cpu.fk_user";
1898 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday_users as cpu, ".MAIN_DB_PREFIX.
"user as u";
1899 $sql .=
" WHERE cpu.fk_user = u.rowid";
1904 $resql = $this->db->query($sql);
1909 $num = $this->db->num_rows($resql);
1914 $obj = $this->db->fetch_object($resql);
1917 $stringlist .= $obj->fk_user;
1919 $stringlist .=
', '.$obj->fk_user;
1928 $this->error =
"Error ".$this->db->lasterror();
1938 if (isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) {
1939 $sql .=
" DISTINCT";
1941 $sql .=
" u.rowid, u.lastname, u.firstname, u.gender, u.photo, u.employee, u.statut as status, u.fk_user";
1942 $sql .=
" FROM ".MAIN_DB_PREFIX.
"user as u";
1944 if (isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) {
1945 $sql .=
", ".MAIN_DB_PREFIX.
"usergroup_user as ug";
1946 $sql .=
" WHERE ((ug.fk_user = u.rowid";
1947 $sql .=
" AND ug.entity IN (".getEntity(
'usergroup').
"))";
1948 $sql .=
" OR u.entity = 0)";
1950 $sql .=
" WHERE u.entity IN (".getEntity(
'user').
")";
1953 $sql .=
" AND u.statut > 0";
1954 $sql .=
" AND u.employee = 1";
1959 $resql = $this->db->query($sql);
1964 $tab_result = $this->holiday;
1965 $num = $this->db->num_rows($resql);
1969 $obj = $this->db->fetch_object($resql);
1971 $tab_result[$i][
'rowid'] = $obj->rowid;
1972 $tab_result[$i][
'id'] = $obj->rowid;
1973 $tab_result[$i][
'name'] = $obj->lastname;
1974 $tab_result[$i][
'lastname'] = $obj->lastname;
1975 $tab_result[$i][
'firstname'] = $obj->firstname;
1976 $tab_result[$i][
'gender'] = $obj->gender;
1977 $tab_result[$i][
'status'] = $obj->status;
1978 $tab_result[$i][
'employee'] = $obj->employee;
1979 $tab_result[$i][
'photo'] = $obj->photo;
1980 $tab_result[$i][
'fk_user'] = $obj->fk_user;
1990 $this->errors[] =
"Error ".$this->db->lasterror();
1995 $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";
1996 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday_users as cpu, ".MAIN_DB_PREFIX.
"user as u";
1997 $sql .=
" WHERE cpu.fk_user = u.rowid";
2002 $resql = $this->db->query($sql);
2007 $tab_result = $this->holiday;
2008 $num = $this->db->num_rows($resql);
2012 $obj = $this->db->fetch_object($resql);
2014 $tab_result[$i][
'rowid'] = $obj->rowid;
2015 $tab_result[$i][
'id'] = $obj->rowid;
2016 $tab_result[$i][
'name'] = $obj->lastname;
2017 $tab_result[$i][
'lastname'] = $obj->lastname;
2018 $tab_result[$i][
'firstname'] = $obj->firstname;
2019 $tab_result[$i][
'gender'] = $obj->gender;
2020 $tab_result[$i][
'status'] = $obj->status;
2021 $tab_result[$i][
'employee'] = $obj->employee;
2022 $tab_result[$i][
'photo'] = $obj->photo;
2023 $tab_result[$i][
'fk_user'] = $obj->fk_user;
2025 $tab_result[$i][
'type'] = $obj->fk_type;
2026 $tab_result[$i][
'nb_holiday'] = $obj->nb_holiday;
2034 $this->error =
"Error ".$this->db->lasterror();
2052 $users_validator = array();
2054 $sql =
"SELECT DISTINCT ur.fk_user";
2055 $sql .=
" FROM ".MAIN_DB_PREFIX.
"user_rights as ur, ".MAIN_DB_PREFIX.
"rights_def as rd";
2056 $sql .=
" WHERE ur.fk_id = rd.id and rd.module = 'holiday' AND rd.perms = 'approve'";
2058 $sql .=
" SELECT DISTINCT ugu.fk_user";
2059 $sql .=
" FROM ".MAIN_DB_PREFIX.
"usergroup_user as ugu, ".MAIN_DB_PREFIX.
"usergroup_rights as ur, ".MAIN_DB_PREFIX.
"rights_def as rd";
2060 $sql .=
" WHERE ugu.fk_usergroup = ur.fk_usergroup AND ur.fk_id = rd.id and rd.module = 'holiday' AND rd.perms = 'approve'";
2063 dol_syslog(get_class($this).
"::fetch_users_approver_holiday sql=".$sql);
2064 $result = $this->db->query($sql);
2066 $num_rows = $this->db->num_rows($result);
2068 while ($i < $num_rows) {
2069 $objp = $this->db->fetch_object($result);
2070 array_push($users_validator, $objp->fk_user);
2073 return $users_validator;
2075 $this->error = $this->db->lasterror();
2076 dol_syslog(get_class($this).
"::fetch_users_approver_holiday Error ".$this->error, LOG_ERR);
2089 $sql =
"SELECT count(u.rowid) as compteur";
2090 $sql .=
" FROM ".MAIN_DB_PREFIX.
"user as u";
2091 $sql .=
" WHERE u.statut > 0";
2093 $result = $this->db->query($sql);
2094 $object = $this->db->fetch_object($result);
2105 $sql =
"SELECT count(u.rowid) as compteur";
2106 $sql .=
" FROM ".MAIN_DB_PREFIX.
"user as u LEFT OUTER JOIN ".MAIN_DB_PREFIX.
"holiday_users hu ON (hu.fk_user=u.rowid)";
2107 $sql .=
" WHERE u.statut > 0 AND hu.fk_user IS NULL";
2109 $result = $this->db->query($sql);
2110 $object = $this->db->fetch_object($result);
2124 if (empty($userCP)) {
2127 dol_syslog(get_class($this).
'::verifNbUsers userDolibarr='.$userDolibarrWithoutCP.
' userCP='.$userCP);
2142 public function addLogCP($fk_user_action, $fk_user_update, $label, $new_solde, $fk_type)
2144 global $conf, $langs;
2152 if ($prev_solde == $new_solde) {
2159 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"holiday_logs (";
2160 $sql .=
"date_action,";
2161 $sql .=
"fk_user_action,";
2162 $sql .=
"fk_user_update,";
2163 $sql .=
"type_action,";
2164 $sql .=
"prev_solde,";
2165 $sql .=
"new_solde,";
2167 $sql .=
") VALUES (";
2168 $sql .=
" '".$this->db->idate(
dol_now()).
"',";
2169 $sql .=
" ".((int) $fk_user_action).
",";
2170 $sql .=
" ".((int) $fk_user_update).
",";
2171 $sql .=
" '".$this->db->escape($label).
"',";
2172 $sql .=
" ".((float) $prev_solde).
",";
2173 $sql .=
" ".((float) $new_solde).
",";
2174 $sql .=
" ".((int) $fk_type);
2177 $resql = $this->db->query($sql);
2180 $this->errors[] =
"Error ".$this->db->lasterror();
2184 $this->optRowid = $this->db->last_insert_id(MAIN_DB_PREFIX.
"holiday_logs");
2189 foreach ($this->errors as $errmsg) {
2190 dol_syslog(get_class($this).
"::addLogCP ".$errmsg, LOG_ERR);
2191 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2193 $this->db->rollback();
2196 $this->db->commit();
2197 return $this->optRowid;
2211 $sql .=
" cpl.rowid,";
2212 $sql .=
" cpl.date_action,";
2213 $sql .=
" cpl.fk_user_action,";
2214 $sql .=
" cpl.fk_user_update,";
2215 $sql .=
" cpl.type_action,";
2216 $sql .=
" cpl.prev_solde,";
2217 $sql .=
" cpl.new_solde,";
2218 $sql .=
" cpl.fk_type";
2219 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday_logs as cpl";
2220 $sql .=
" WHERE cpl.rowid > 0";
2223 if (!empty($filter)) {
2224 $sql .=
" ".$filter;
2228 if (!empty($order)) {
2232 dol_syslog(get_class($this).
"::fetchLog", LOG_DEBUG);
2233 $resql = $this->db->query($sql);
2238 $tab_result = $this->logs;
2239 $num = $this->db->num_rows($resql);
2248 $obj = $this->db->fetch_object($resql);
2250 $tab_result[$i][
'rowid'] = $obj->rowid;
2251 $tab_result[$i][
'id'] = $obj->rowid;
2252 $tab_result[$i][
'date_action'] = $obj->date_action;
2253 $tab_result[$i][
'fk_user_action'] = $obj->fk_user_action;
2254 $tab_result[$i][
'fk_user_update'] = $obj->fk_user_update;
2255 $tab_result[$i][
'type_action'] = $obj->type_action;
2256 $tab_result[$i][
'prev_solde'] = $obj->prev_solde;
2257 $tab_result[$i][
'new_solde'] = $obj->new_solde;
2258 $tab_result[$i][
'fk_type'] = $obj->fk_type;
2263 $this->logs = $tab_result;
2267 $this->error =
"Error ".$this->db->lasterror();
2284 $sql =
"SELECT rowid, code, label, affect, delay, newbymonth";
2285 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_holiday_types";
2286 $sql .=
" WHERE (fk_country IS NULL OR fk_country = ".((int) $mysoc->country_id).
')';
2287 $sql .=
" AND entity IN (".getEntity(
'c_holiday_types').
")";
2289 $sql .=
" AND active = ".((int) $active);
2292 $sql .=
" AND affect = ".((int) $affect);
2294 $sql .=
" ORDER BY sortorder";
2296 $result = $this->db->query($sql);
2298 $num = $this->db->num_rows($result);
2301 while ($obj = $this->db->fetch_object($result)) {
2302 $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);
2325 $sql =
"SELECT f.rowid, f.statut as status,";
2326 $sql .=
" f.date_create as datec,";
2327 $sql .=
" f.tms as date_modification,";
2328 $sql .=
" f.date_valid as datev,";
2329 $sql .=
" f.date_approval as datea,";
2330 $sql .=
" f.date_refuse as dater,";
2331 $sql .=
" f.fk_user_create as fk_user_creation,";
2332 $sql .=
" f.fk_user_modif as fk_user_modification,";
2333 $sql .=
" f.fk_user_valid as fk_user_validation,";
2334 $sql .=
" f.fk_user_approve as fk_user_approval_done,";
2335 $sql .=
" f.fk_validator as fk_user_approval_expected,";
2336 $sql .=
" f.fk_user_refuse as fk_user_refuse";
2337 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday as f";
2338 $sql .=
" WHERE f.rowid = ".((int) $id);
2339 $sql .=
" AND f.entity = ".$conf->entity;
2341 $resql = $this->db->query($sql);
2343 if ($this->db->num_rows($resql)) {
2344 $obj = $this->db->fetch_object($resql);
2346 $this->
id = $obj->rowid;
2348 $this->date_creation = $this->db->jdate($obj->datec);
2349 $this->date_modification = $this->db->jdate($obj->date_modification);
2350 $this->date_validation = $this->db->jdate($obj->datev);
2351 $this->date_approval = $this->db->jdate($obj->datea);
2353 $this->user_creation_id = $obj->fk_user_creation;
2354 $this->user_validation_id = $obj->fk_user_validation;
2355 $this->user_modification_id = $obj->fk_user_modification;
2358 if ($obj->fk_user_approval_done) {
2359 $this->fk_user_approve = $obj->fk_user_approval_done;
2363 $this->db->free($resql);
2379 global $user, $langs;
2383 $this->specimen = 1;
2385 $this->fk_user = $user->id;
2387 $this->date_debut =
dol_now();
2388 $this->date_fin =
dol_now() + (24 * 3600);
2389 $this->date_valid =
dol_now();
2390 $this->fk_validator = $user->id;
2407 $this->nb = array();
2409 $sql =
"SELECT count(h.rowid) as nb";
2410 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday as h";
2411 $sql .=
" WHERE h.statut > 1";
2412 $sql .=
" AND h.entity IN (".getEntity(
'holiday').
")";
2413 if (!$user->hasRight(
'expensereport',
'readall')) {
2414 $userchildids = $user->getAllChildIds(1);
2415 $sql .=
" AND (h.fk_user IN (".$this->db->sanitize(implode(
',', $userchildids)).
")";
2416 $sql .=
" OR h.fk_validator IN (".$this->db->sanitize(implode(
',', $userchildids)).
"))";
2419 $resql = $this->db->query($sql);
2421 while ($obj = $this->db->fetch_object($resql)) {
2422 $this->nb[
"holidays"] = $obj->nb;
2424 $this->db->free($resql);
2428 $this->error = $this->db->error();
2443 global $conf, $langs;
2451 $sql =
"SELECT h.rowid, h.date_debut";
2452 $sql .=
" FROM ".MAIN_DB_PREFIX.
"holiday as h";
2453 $sql .=
" WHERE h.statut = 2";
2454 $sql .=
" AND h.entity IN (".getEntity(
'holiday').
")";
2455 if (!$user->hasRight(
'expensereport',
'read_all')) {
2456 $userchildids = $user->getAllChildIds(1);
2457 $sql .=
" AND (h.fk_user IN (".$this->db->sanitize(implode(
',', $userchildids)).
")";
2458 $sql .=
" OR h.fk_validator IN (".$this->db->sanitize(implode(
',', $userchildids)).
"))";
2461 $resql = $this->db->query($sql);
2463 $langs->load(
"members");
2466 $response->warning_delay = $conf->holiday->approve->warning_delay / 60 / 60 / 24;
2467 $response->label = $langs->trans(
"HolidaysToApprove");
2468 $response->labelShort = $langs->trans(
"ToApprove");
2469 $response->url = DOL_URL_ROOT.
'/holiday/list.php?search_status=2&mainmenu=hrm&leftmenu=holiday';
2472 while ($obj = $this->db->fetch_object($resql)) {
2473 $response->nbtodo++;
2475 if ($this->db->jdate($obj->date_debut) < ($now - $conf->holiday->approve->warning_delay)) {
2476 $response->nbtodolate++;
2483 $this->error = $this->db->error();
2498 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
2500 $return =
'<div class="box-flex-item box-flex-grow-zero">';
2501 $return .=
'<div class="info-box info-box-sm">';
2502 $return .=
'<span class="info-box-icon bg-infobox-action">';
2504 $return .=
'</span>';
2505 $return .=
'<div class="info-box-content">';
2506 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.$arraydata[
'user']->getNomUrl(-1).
'</span>';
2507 if ($selected >= 0) {
2508 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
2510 if (property_exists($this,
'fk_type')) {
2513 $return .=
'<div class="info_box-label tdoverflowmax100" title="'.dol_escape_htmltag($arraydata[
'labeltype']).
'">'.
dol_escape_htmltag($arraydata[
'labeltype']).
'</div>';
2515 if (property_exists($this,
'date_debut') && property_exists($this,
'date_fin')) {
2516 $return .=
'<span class="info-box-label small">'.dol_print_date($this->date_debut,
'day').
'</span>';
2517 $return .=
' <span class="opacitymedium small">'.$langs->trans(
"To").
'</span> ';
2518 $return .=
'<span class="info-box-label small">'.dol_print_date($this->date_fin,
'day').
'</span>';
2519 if (!empty($arraydata[
'nbopenedday'])) {
2520 $return .=
' ('.$arraydata[
'nbopenedday'].
')';
2523 if (method_exists($this,
'getLibStatut')) {
2524 $return .=
'<div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
2526 $return .=
'</div>';
2527 $return .=
'</div>';
2528 $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.
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