Completed
Push — master ( a182e4...7f1093 )
by Paul
04:26
created

vacuser.php ➔ absences_requestPeriod()   D

Complexity

Conditions 23
Paths 78

Size

Total Lines 156
Code Lines 67

Duplication

Lines 93
Ratio 59.62 %
Metric Value
cc 23
eloc 67
nc 78
nop 0
dl 93
loc 156
rs 4.6303

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/************************************************************************
3
 * OVIDENTIA http://www.ovidentia.org                                   *
4
 ************************************************************************
5
 * Copyright (c) 2003 by CANTICO ( http://www.cantico.fr )              *
6
 *                                                                      *
7
 * This file is part of Ovidentia.                                      *
8
 *                                                                      *
9
 * Ovidentia is free software; you can redistribute it and/or modify    *
10
 * it under the terms of the GNU General Public License as published by *
11
 * the Free Software Foundation; either version 2, or (at your option)  *
12
 * any later version.													*
13
 *																		*
14
 * This program is distributed in the hope that it will be useful, but  *
15
 * WITHOUT ANY WARRANTY; without even the implied warranty of			*
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.					*
17
 * See the  GNU General Public License for more details.				*
18
 *																		*
19
 * You should have received a copy of the GNU General Public License	*
20
 * along with this program; if not, write to the Free Software			*
21
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,*
22
 * USA.																	*
23
************************************************************************/
24
25
26
27
include_once dirname(__FILE__)."/functions.php";
28
include_once $GLOBALS['babInstallPath']."utilit/afincl.php";
29
include_once $GLOBALS['babInstallPath']."utilit/mailincl.php";
30
include_once dirname(__FILE__)."/utilit/vacincl.php";
31
require_once $GLOBALS['babInstallPath'].'utilit/dateTime.php';
32
require_once dirname(__FILE__).'/utilit/agent.class.php';
33
require_once $GLOBALS['babInstallPath'].'utilit/urlincl.php';
34
35
36
37
/**
38
 * 
39
 */
40
function bab_isEntryEditable($id)
41
{
42
	if ($id == 0) {
43
		// request creation
44
		return true;
45
		}
46
47
	$agent = absences_Agent::getCurrentUser();
48
	
49
	require_once dirname(__FILE__).'/utilit/entry.class.php';
50
	$entry = absences_Entry::getById($id);
51
	
52
	
53
	if ($agent->isManager()) {
54
		// le gestionnaire peut tout modifier
55
		return (int) $entry->id_user;
56
	}
57
	
58
	
59
	if ($entry->canModify()) {
60
	    return (int) $entry->id_user;
61
	}
62
	
63
	return false;
64
}
65
66
67
68
/**
69
 * Test if the current logged in user can create a vacation request in the name of $id_user
70
 * @param unknown_type $id_user
71
 * 
72
 * @return bool
73
 */
74
function bab_vacRequestCreate($id_user) {
75
	global $babBody;
76
	
77
	
78
	$target_agent = absences_Agent::getFromIdUser($id_user);
79
80
81
	if (!$target_agent->isInPersonnel()) {
82
		$babBody->addError(sprintf(absences_translate("The user %s is not registered in the personnel members"), $target_agent->getName()));
83
		return false;
84
	}
85
		
86
	if (!$target_agent->haveRights()) {
87
		$babBody->addError(absences_translate("No accessibles vacations rights"));
88
		return false;
89
	}
90
91
	if ($id_user == bab_getUserId()) {
92
		return true;
93
		}
94
	else
95
		{
96
		$current_agent = absences_Agent::getCurrentUser();
97
		if($current_agent->isManager())
98
			{
99
			return true;
100
			}
101
102
		if (absences_getVacationOption('chart_superiors_create_request') && absences_IsUserUnderSuperior($id_user)) {
103
			return true;
104
			}
105
		}
106
107
	$babBody->addError(sprintf(absences_translate("Access denied for %s"), $target_agent->getName()));
108
	return false;
109
	}
110
111
	
112
function absences_recurringVacation($begin, $end, $id)
113
{
114
	global $babBody;
115
	class temp
0 ignored issues
show
Comprehensibility Best Practice introduced by
The type temp has been defined more than once; this definition is ignored, only the first definition in programs/vacadm.php (L38-118) is considered.

This check looks for classes that have been defined more than once.

If you can, we would recommend to use standard object-oriented programming techniques. For example, to avoid multiple types, it might make sense to create a common interface, and then multiple, different implementations for that interface.

This also has the side-effect of providing you with better IDE auto-completion, static analysis and also better OPCode caching from PHP.

Loading history...
116
	{
117
		/**
118
		 * 
119
		 * @var Func_CalendarBackend
120
		 */
121
		private $calendarBackend;
122
		
123
		/**
124
		 * 
125
		 * @var array
126
		 */
127
		private $rrule;
128
		
129
		
130
		public $begin;
131
		public $end;
132
		public $id;
133
		public $duration;
134
		public $id_user;
135
		public $rfrom;
136
		
137
		public $datebegintxt;
138
		public $dateendtxt;
139
		public $t_loaddates;
140
		public $t_daily;
141
		public $t_weekly;
142
		public $t_monthly;
143
		public $t_all_the;
144
		public $t_years;
145
		public $t_months;
146
		public $t_weeks;
147
		public $t_days;
148
		public $repeat_dateendtxt;
149
		public $t_sun;
150
		public $t_mon;
151
		public $t_tue;
152
		public $t_wen;
153
		public $t_thu;
154
		public $t_fri;
155
		public $t_sat;
156
		public $calendar;
157
		public $addvac;
158
		public $t_vacation_request;
159
			
160
		public $calurl;
161
		public $datebegin;
162
		public $dateend;
163
		public $username;
164
		public $nbdays;
165
		public $end_day;
166
		public $end_month;
167
		public $end_year;
168
		public $curyear;
169
		public $ymin;
170
		public $ymax;
171
		public $yearmin;
172
		public $repeat;
173
		public $repeat_n_1;
174
		public $repeat_n_2;
175
		public $repeat_n_3;
176
		public $repeat_wd_checked;
177
		
178
	
179
		public function __construct($begin, $end, $id)
180
		{
181
			global $babBody;
182
			
183
			$this->begin = $begin;
0 ignored issues
show
Bug introduced by
The property begin does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
184
			$this->end = $end;
0 ignored issues
show
Bug introduced by
The property end does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
185
			$this->id = $id;
0 ignored issues
show
Bug introduced by
The property id does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
186
			$this->duration = bab_mktime($this->end) - bab_mktime($this->begin);
0 ignored issues
show
Bug introduced by
The property duration does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
187
			
188
			$this->id_user = bab_pp('id_user');
0 ignored issues
show
Bug introduced by
The property id_user does not seem to exist. Did you mean iduser?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
189
			$this->rfrom = bab_pp('rfrom', 0);
0 ignored issues
show
Bug introduced by
The property rfrom does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
190
			
191
			$this->datebegintxt = absences_translate("Begin date");
0 ignored issues
show
Bug introduced by
The property datebegintxt does not seem to exist. Did you mean begintxt?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
192
			$this->dateendtxt = absences_translate("End date");
0 ignored issues
show
Bug introduced by
The property dateendtxt does not seem to exist. Did you mean endtxt?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
193
			$this->t_loaddates = absences_translate("Load dates");
0 ignored issues
show
Bug introduced by
The property t_loaddates does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
194
			$this->t_daily = absences_translate("Daily");
0 ignored issues
show
Bug introduced by
The property t_daily does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
195
			$this->t_weekly = absences_translate("Weekly");
0 ignored issues
show
Bug introduced by
The property t_weekly does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
196
			$this->t_monthly = absences_translate("Monthly");
0 ignored issues
show
Bug introduced by
The property t_monthly does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
197
			$this->t_all_the = absences_translate("Every");
0 ignored issues
show
Bug introduced by
The property t_all_the does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
198
			$this->t_years = absences_translate("years");
0 ignored issues
show
Bug introduced by
The property t_years does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
199
			$this->t_months = absences_translate("months");
0 ignored issues
show
Bug introduced by
The property t_months does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
200
			$this->t_weeks = absences_translate("weeks");
0 ignored issues
show
Bug introduced by
The property t_weeks does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
201
			$this->t_days = absences_translate("days");
202
			$this->repeat_dateendtxt = absences_translate("Periodicity end date");
0 ignored issues
show
Bug introduced by
The property repeat_dateendtxt does not seem to exist. Did you mean endtxt?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
203
			$this->t_sun = mb_substr(absences_translate("Sunday"),0,3);
0 ignored issues
show
Bug introduced by
The property t_sun does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
204
			$this->t_mon = mb_substr(absences_translate("Monday"),0,3);
0 ignored issues
show
Bug introduced by
The property t_mon does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
205
			$this->t_tue = mb_substr(absences_translate("Tuesday"),0,3);
0 ignored issues
show
Bug introduced by
The property t_tue does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
206
			$this->t_wen = mb_substr(absences_translate("Wednesday"),0,3);
0 ignored issues
show
Bug introduced by
The property t_wen does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
207
			$this->t_thu = mb_substr(absences_translate("Thursday"),0,3);
0 ignored issues
show
Bug introduced by
The property t_thu does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
208
			$this->t_fri = mb_substr(absences_translate("Friday"),0,3);
0 ignored issues
show
Bug introduced by
The property t_fri does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
209
			$this->t_sat = mb_substr(absences_translate("Saturday"),0,3);
0 ignored issues
show
Bug introduced by
The property t_sat does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
210
			$this->calendar = absences_translate("Planning");
0 ignored issues
show
Bug introduced by
The property calendar does not seem to exist. Did you mean t_calendar?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
211
			$this->addvac = absences_translate('Confirm the period selection');
212
			$this->t_vacation_request = absences_translate('Create a vacation request on the following periods:');
0 ignored issues
show
Bug introduced by
The property t_vacation_request does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
213
			
214
			$this->calurl = bab_toHtml(absences_addon()->getUrl()."planning&idx=cal&idu=".$this->id_user."&popup=1");
0 ignored issues
show
Bug introduced by
The property calurl does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
Bug introduced by
The property id_user does not seem to exist. Did you mean iduser?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
215
			
216
			$this->datebegin = absences_longDate(bab_mktime($begin));
0 ignored issues
show
Bug introduced by
The property datebegin does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
217
			$end_timestamp = bab_mktime($end);
218
			$this->dateend = absences_longDate($end_timestamp);
0 ignored issues
show
Bug introduced by
The property dateend does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
219
			
220
221
			$this->username = bab_toHtml(bab_getUserName($this->id_user));
0 ignored issues
show
Bug introduced by
The property id_user does not seem to exist. Did you mean iduser?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
Bug introduced by
The property username does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
222
			
223
			$this->nbdays = 31;
0 ignored issues
show
Bug introduced by
The property nbdays does not seem to exist. Did you mean nbdaystxt?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
224
			$this->end_day = bab_pp('repeat_dayend', date('d', $end_timestamp));
0 ignored issues
show
Bug introduced by
The property end_day does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
225
			$this->end_month = bab_pp('repeat_monthend', date('m', $end_timestamp));
0 ignored issues
show
Bug introduced by
The property end_month does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
226
			$this->end_year = bab_pp('repeat_yearend', date('Y', $end_timestamp));
0 ignored issues
show
Bug introduced by
The property end_year does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
227
			
228
			
229
			$this->curyear = date('Y');
0 ignored issues
show
Bug introduced by
The property curyear does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
230
			
231
			$this->ymin = 2;
0 ignored issues
show
Bug introduced by
The property ymin does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
232
			$this->ymax = 5;
0 ignored issues
show
Bug introduced by
The property ymax does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
233
			$this->yearmin = $this->curyear - $this->ymin;
0 ignored issues
show
Bug introduced by
The property yearmin does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
234
			
235
			
236
			$this->repeat = (int) bab_pp('repeat', 1);
0 ignored issues
show
Bug introduced by
The property repeat does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
237
			$this->repeat_n_1 = bab_pp('repeat_n_1');
0 ignored issues
show
Bug introduced by
The property repeat_n_1 does not seem to exist. Did you mean repeat?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
238
			$this->repeat_n_2 = bab_pp('repeat_n_2');
0 ignored issues
show
Bug introduced by
The property repeat_n_2 does not seem to exist. Did you mean repeat?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
239
			$this->repeat_n_3 = bab_pp('repeat_n_3');
0 ignored issues
show
Bug introduced by
The property repeat_n_3 does not seem to exist. Did you mean repeat?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
240
			
241
			$weekdays = array('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA');
242
			$repeat_wd = (array) bab_pp('repeat_wd', array());
243
			$repeat_wd = array_flip($repeat_wd);
244
			$this->repeat_wd_checked = array();
0 ignored issues
show
Bug introduced by
The property repeat_wd_checked does not seem to exist. Did you mean repeat?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
245
			
246
			foreach($weekdays as $wd)
247
			{
248
				$this->repeat_wd_checked[$wd] = isset($repeat_wd[$wd]) ? 'checked="checked"' : '';
0 ignored issues
show
Bug introduced by
The property repeat_wd_checked does not seem to exist. Did you mean repeat?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
249
			}
250
			
251
			if (isset($_POST['loaddates']))
252
			{
253
				$backendName = bab_getICalendars($this->id_user)->calendar_backend;
0 ignored issues
show
Bug introduced by
The property id_user does not seem to exist. Did you mean iduser?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
254
				if (!$backendName)
255
				{
256
					$backendName = 'Ovi';
257
				}
258
				
259
				$this->calendarBackend = bab_functionality::get('CalendarBackend/'.$backendName);
0 ignored issues
show
Bug introduced by
The property calendarBackend does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
260
				
261
				try {
262
					$this->rrule = $this->loaddates();
0 ignored issues
show
Bug introduced by
The property rrule does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
Bug introduced by
The method loaddates() does not seem to exist on object<temp>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
263
					$this->dates_loaded = true;
0 ignored issues
show
Bug introduced by
The property dates_loaded does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
264
				} catch (ErrorException $e)
265
				{
266
					$babBody->addError($e->getMessage());
267
				}
268
				
269
			}
270
		}
271
		
272
		/**
273
		 * Get an array with posted rules
274
		 * @return array
275
		 */
276
		private function getPostedRecurringParameters()
277
		{
278
			$args = array();
279
			
280
281
			$args['until'] = array(
282
					'year'	=> (int) $_POST['repeat_yearend'],
283
					'month'	=> (int) $_POST['repeat_monthend'],
284
					'day'	=> (int) $_POST['repeat_dayend']
285
			);
286
		
287
			$_POST['repeat'] = isset($_POST['repeat']) ? $_POST['repeat'] : '';
288
			switch ($_POST['repeat']) {
289
		
290
				case ABSENCES_RECUR_WEEKLY:
291
					$args['rrule'] = ABSENCES_RECUR_WEEKLY;
292
					if( empty($_POST['repeat_n_2']))
293
					{
294
						$_POST['repeat_n_2'] = 1;
295
					}
296
		
297
					$args['nweeks'] = (int) $_POST['repeat_n_2'];
298
		
299
					if( isset($_POST['repeat_wd']) )
300
					{
301
						$args['rdays'] = $_POST['repeat_wd'];
302
					}
303
		
304
					break;
305
		
306
				case ABSENCES_RECUR_MONTHLY: 
307
					$args['rrule'] = ABSENCES_RECUR_MONTHLY;
308
					if( empty($_POST['repeat_n_3']))
309
					{
310
						$_POST['repeat_n_3'] = 1;
311
					}
312
		
313
					$args['nmonths'] = (int) $_POST['repeat_n_3'];
314
					break;
315
		
316
				case ABSENCES_RECUR_YEARLY:
317
					$args['rrule'] = ABSENCES_RECUR_YEARLY;
318
					if( empty($_POST['repeat_n_4']))
319
					{
320
						$_POST['repeat_n_4'] = 1;
321
					}
322
					$args['nyears'] = (int) $_POST['repeat_n_4'];
323
					break;
324
		
325
				case ABSENCES_RECUR_DAILY:
326
				default:
327
					$args['rrule'] = ABSENCES_RECUR_DAILY;
328
					if( empty($_POST['repeat_n_1']))
329
					{
330
						$_POST['repeat_n_1'] = 1;
331
					}
332
		
333
					$args['ndays'] = (int) $_POST['repeat_n_1'];
334
					break;
335
			}
336
			
337
			
338
			
339
			return $args;
340
		}
341
		
342
		
343
		/**
344
		 * Convert posted data to a standard RRULE icaldendar property
345
		 * @throws ErrorException
346
		 */
347
		private function getRRule()
348
		{
349
			$args = $this->getPostedRecurringParameters();
0 ignored issues
show
Bug introduced by
The method getPostedRecurringParameters() does not seem to exist on object<temp>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
350
			
351
			if(!isset($args['rrule']) ) {
352
				return null;
353
			}
354
355
			$duration = $this->duration;
356
			$rrule = array();
357
		
358
			switch( $args['rrule'] )
359
			{
360
				case ABSENCES_RECUR_WEEKLY:
361
					if( $duration > 24 * 3600 * 7 * $args['nweeks']) {
362
						throw new ErrorException(absences_translate("The duration of the event must be shorter than how frequently it occurs"));
363
					}
364
		
365
					$rrule[]= 'INTERVAL='.$args['nweeks'];
366
		
367
					if( !isset($args['rdays']) ) {
368
						// no week day specified, reapeat event every week
369
						$rrule[]= 'FREQ=WEEKLY';
370
					}
371
					else {
372
						$rrule[]= 'FREQ=WEEKLY';
373
						// BYDAY : add list of weekday    = "SU" / "MO" / "TU" / "WE" / "TH" / "FR" / "SA"
374
						$rrule[] = 'BYDAY='.implode(',', $args['rdays']);
375
					}
376
		
377
					break;
378
		
379
		
380 View Code Duplication
				case ABSENCES_RECUR_MONTHLY:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
381
					if( $duration > 24*3600*28*$args['nmonths']) {
382
						throw new ErrorException(absences_translate("The duration of the event must be shorter than how frequently it occurs"));
383
					}
384
		
385
					$rrule[]= 'INTERVAL='.$args['nmonths'];
386
					$rrule[]= 'FREQ=MONTHLY';
387
					break;
388
		
389 View Code Duplication
				case ABSENCES_RECUR_YEARLY: /* yearly */
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
390
		
391
					if( $duration > 24*3600*365*$args['nyears']) {
392
						throw new ErrorException(absences_translate("The duration of the event must be shorter than how frequently it occurs"));
393
					}
394
					$rrule[]= 'INTERVAL='.$args['nyears'];
395
					$rrule[]= 'FREQ=YEARLY';
396
					break;
397
		
398 View Code Duplication
				case ABSENCES_RECUR_DAILY: /* daily */
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
399
					if( $duration > 24*3600*$args['ndays'] ) {
400
						throw new ErrorException(absences_translate("The duration of the event must be shorter than how frequently it occurs"));
401
					}
402
					$rrule[]= 'INTERVAL='.$args['ndays'];
403
					$rrule[]= 'FREQ=DAILY';
404
					break;
405
			}
406
		
407
		
408
			
409
			if (isset($args['until'])) {
410
			
411
				$until = self::getDateTime($args['until']);
0 ignored issues
show
Bug introduced by
The method getDateTime() does not seem to exist on object<temp>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
412
				$until->add(1, BAB_DATETIME_DAY);
413
			
414
				if( $until->getTimeStamp() < bab_mktime($this->end)) {
415
					throw new ErrorException(absences_translate("Repeat date must be older than end date"));
416
				}
417
			
418
			
419
				$rrule[] = 'UNTIL='.$until->getICal(true);
420
			}
421
			
422
			return implode(';',$rrule);
423
		}
424
		
425
		
426
		/**
427
		 * Get dateTime object from date as array with keys
428
		 * <ul>
429
		 *	<li>year</li>
430
		 *	<li>month<li>
431
		 *	<li>day</li>
432
		 *	<li>hours (optional)</li>
433
		 *	<li>minutes (optional)</li>
434
		 * <ul>
435
		 *
436
		 *
437
		 * @param	array	$arr
438
		 *
439
		 * @param	int		$default_ts default timestamp value to use if values of date are not set
440
		 *
441
		 * @return 	BAB_DateTime
442
		 */
443
		public static function getDateTime($arr, $default_ts = null) {
444
		
445
		
446
			if (!isset($default_ts) && (!isset($arr['year']) || !isset($arr['month']) || !isset($arr['day']))) {
447
				return null;
448
			}
449
		
450
			if (!isset($arr['year'])) {
451
				$arr['year'] = date('Y', $default_ts);
452
			}
453
		
454
			if (!isset($arr['month'])) {
455
				$arr['month'] = date('m', $default_ts);
456
			}
457
		
458
			if (!isset($arr['day'])) {
459
				$arr['day'] = date('d', $default_ts);
460
			}
461
		
462
			if (!isset($arr['hours'])) {
463
				$arr['hours'] = 0;
464
			}
465
		
466
			if (!isset($arr['minutes'])) {
467
				$arr['minutes'] = 0;
468
			}
469
		
470
			return new BAB_DateTime($arr['year'], $arr['month'], $arr['day'], $arr['hours'],$arr['minutes']);
471
		}
472
		
473
		
474
		/**
475
		 * @return RRule
476
		 */
477
		private function loaddates()
478
		{
479
			if (null === $rrule = $this->getRRule())
0 ignored issues
show
Bug introduced by
The method getRRule() does not seem to exist on object<temp>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
480
			{
481
				return null;
482
			}
483
			
484
			$arr = array();
485
			
486
			
487
			require_once dirname(__FILE__).'/utilit/RRule.php';
488
			
489
			$o = new RRule(new iCalDate(bab_mktime($this->begin)), $rrule);
490
			
491
			
492
			while($date = $o->GetNext())
493
			{
494
				$begin = BAB_DateTime::fromIsoDateTime($date->Render());
495
				$end = clone $begin;
496
				$end->add($this->duration, BAB_DATETIME_SECOND);
497
				
498
				// do not add the unavailable periods
499
				
500
				$hd_index = absences_getHalfDaysIndex($this->id_user, $begin, $end);
0 ignored issues
show
Bug introduced by
The property id_user does not seem to exist. Did you mean iduser?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
501
				
502
				if (count($hd_index[2]) > 0) // free half day on the requested period
503
				{
504
					$arr[$begin->getTimeStamp()] = array($begin, $end);
505
				}
506
			}
507
			
508
			ksort($arr);
509
			
510
			return $arr;
511
		}
512
		
513
		
514
		public function getnextday()
515
		{
516
			static $i = 1;
517
			if( $i <= $this->nbdays)
0 ignored issues
show
Bug introduced by
The property nbdays does not seem to exist. Did you mean nbdaystxt?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
518
			{
519
				$this->dayid = $i;
520
				if($this->end_day == $i)
521
				{
522
					$this->selected = "selected";
0 ignored issues
show
Bug introduced by
The property selected does not seem to exist. Did you mean yselected?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
523
				}
524
				else
525
					$this->selected = "";
0 ignored issues
show
Bug introduced by
The property selected does not seem to exist. Did you mean yselected?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
526
		
527
				$i++;
528
				return true;
529
			}
530
			else
531
			{
532
				$i = 1;
533
				return false;
534
			}
535
		
536
		}
537
		
538
		public function getnextmonth()
539
		{
540
			static $i = 1;
541
		
542
			if( $i < 13)
543
			{
544
				$this->monthid = $i;
545
				$this->monthname = bab_toHtml(bab_DateStrings::getMonth($i));
546
				if($this->end_month == $i)
547
				{
548
					$this->selected = "selected";
0 ignored issues
show
Bug introduced by
The property selected does not seem to exist. Did you mean yselected?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
549
				}
550
				else
551
					$this->selected = "";
0 ignored issues
show
Bug introduced by
The property selected does not seem to exist. Did you mean yselected?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
552
		
553
				$i++;
554
				return true;
555
			}
556
			else
557
			{
558
				$i = 1;
559
				return false;
560
			}
561
		
562
		}
563
		
564
		public function getnextyear()
565
		{
566
			static $i = 0;
567
			if( $i < $this->ymin + $this->ymax + 1)
568
			{
569
				$this->yearidval = ($this->yearmin + $i);
570
				$this->yearid = $this->yearidval;
0 ignored issues
show
Bug introduced by
The property yearid does not seem to exist. Did you mean yearidval?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
571
				if($this->end_year == $this->yearidval)
572
				{
573
					$this->selected = "selected";
0 ignored issues
show
Bug introduced by
The property selected does not seem to exist. Did you mean yselected?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
574
				}
575
				else
576
					$this->selected = "";
0 ignored issues
show
Bug introduced by
The property selected does not seem to exist. Did you mean yselected?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
577
				$i++;
578
				return true;
579
			}
580
			else
581
			{
582
				$i = 0;
583
				return false;
584
			}
585
		
586
		}
587
		
588
	
589
		/**
590
		 * list periods computed from posted recurring parameters
591
		 */
592
		public function getnextperiod()
593
		{
594
			if (isset($this->rrule) && list(,$arr) = each($this->rrule))
595
			{
596
				$begin = $arr[0];
597
				$end = $arr[1];
598
				
599
				$this->p_begin = $begin->getIsoDateTime();
0 ignored issues
show
Bug introduced by
The property p_begin does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
600
				$this->p_end = $end->getIsoDateTime();
0 ignored issues
show
Bug introduced by
The property p_end does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
601
				
602
				$this->period = sprintf(absences_translate('from %s to %s'), $begin->shortFormat(), $end->shortFormat());
0 ignored issues
show
Bug introduced by
The property period does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
603
				$this->checked = (isset($_POST['loaddates']) || isset($_POST['period'][$this->p_begin]));
0 ignored issues
show
Bug introduced by
The property checked does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
604
				return true;
605
			}
606
			return false;
607
		}
608
	
609
	}
610
	
611
	$temp = new temp($begin,$end, $id);
0 ignored issues
show
Bug introduced by
The call to temp::temp() misses some required arguments starting with $description.
Loading history...
612
	$babBody->babecho(	bab_printTemplate($temp, absences_addon()->getRelativePath()."vacuser.html", "recurring"));
0 ignored issues
show
Deprecated Code introduced by
The method bab_addonInfos::getRelativePath() has been deprecated with message: Do not use relative path in addons Addons are subject to move out of the core folder in futures version for bab_printTemplate, replace with $addon->printTemplate() for babBody->addStyleSheet use $addon->getStylePath() instead of relative path the addStyleSheet method support full path starting with vendor/ since the 8.1.98 version

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
613
}
614
	
615
	
616
617
618
619
class absences_RequestVacation
620
{
621
622
	public $recurring;
623
	
624
	
625
	/**
626
	 * @var array
627
	 */
628
	public $rights;
629
	
630
	/**
631
	 * @var array
632
	 */
633
	public $right;
634
	
635
	public $id;
636
	public $id_user;
637
	public $ide;
638
	public $username;
639
	
640
	public $datebegintxt;
641
	public $dateendtxt;
642
	public $vactype;
643
	public $addvac;
644
	public $save_previsional;
645
	public $remark;
646
	public $nbdaystxt;
647
	public $invaliddate;
648
	public $invaliddate2;
649
	public $invalidentry;
650
	public $invalidentry1;
651
	public $invalidentry2;
652
	public $invalidentry3;
653
	public $totaltxt;
654
	public $balancetxt;
655
	public $previsionalbalancetxt;
656
	public $calendar;
657
	public $total_days;
658
	public $total_hours;
659
	public $maxallowed;
660
	public $t_days;
661
	public $t_alert_nomatch;
662
	public $t_confirm_nomatch;
663
	public $t_or;
664
	public $t_recurring;
665
	public $t_recurring_help;
666
	public $t_previsional;
667
	public $t_no_approval;
668
	public $t_force_approval;
669
	public $allow_mismatch;
670
671
672
	public function __construct($begin, $end, $id)
673
	{
674
		global $babBody, $babDB;
675
		require_once dirname(__FILE__).'/utilit/entry.class.php';
676
677
		$begin = $this->formatInputDate($begin);
678
		$end = $this->formatInputDate($end);
679
680
681
		if ($end < date('Y-m-d H:i:s') && !$id)
682
		{
683
			$babBody->addMessage(absences_translate('Warning, the request is in the past, do you really want to create a request at this date?'));
684
		}
685
686
		$this->recurring = (!empty($_POST['period']) && is_array($_POST['period']));
687
		$nb_request = $this->recurring ? count($_POST['period']) : 1;
688
689
		$this->datebegintxt = absences_translate("Begin date");
690
		$this->dateendtxt = absences_translate("End date");
691
		$this->vactype = absences_translate("Vacation type");
692 View Code Duplication
		if ($id)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
693
		{
694
			$this->addvac = absences_translate("Edit vacation request");
695
			$this->save_previsional = absences_translate("Edit previsional request");
696
		} else {
697
			$this->addvac = absences_translate("Send vacation request");
698
			$this->save_previsional = absences_translate("Save previsional request");
699
		}
700
		$this->remark = absences_translate("Description:");
701
		$this->nbdaystxt = absences_translate("Quantity");
702
		$this->invaliddate = bab_toHtml(absences_translate("ERROR: End date must be older"), BAB_HTML_JS);
703
		$this->invaliddate2 = bab_toHtml(absences_translate("Total number of days does not fit between dates"), BAB_HTML_JS);
704
		$this->invalidentry = bab_toHtml(absences_translate("Invalid entry!  Only numbers are accepted or . !"), BAB_HTML_JS);
705
		$this->invalidentry1 = absences_translate("Invalid entry");
706
		$this->invalidentry2 = absences_translate("Days must be multiple of 0.5");
707
		$this->invalidentry3 = absences_translate("The number of days exceed the total allowed");
708
		$this->totaltxt = absences_translate("Total:");
709
		$this->balancetxt = absences_translate("Balance");
710
		$this->previsionalbalancetxt = absences_translate("Previsional balance");
711
		$this->calendar = absences_translate("Planning");
712
		$this->total_days = 0;
713
		$this->total_hours = 0;
714
		$this->maxallowed = 0;
715
		$this->id = $id;
716
		$this->id_user = $_POST['id_user'];
717
		$this->ide = bab_pp('ide');
718
		$this->username = bab_toHtml(bab_getUserName($this->id_user));
719
		$this->t_days = absences_translate("working days");
720
		$this->t_alert_nomatch = bab_toHtml(absences_translate("Total number of affected days does not match the period."),BAB_HTML_JS);
721
		$this->t_confirm_nomatch = bab_toHtml(absences_translate("Total number of affected days does not match the period, do you really want to submit your request with this mismatch?"),BAB_HTML_JS);
722
		$this->t_or = absences_translate('Or');
723
		$this->t_recurring = absences_translate('All periods:');
724
		$this->t_recurring_help = absences_translate('The allocation is made on a single period, the other will be reserved with the same configuration');
725
		$this->t_previsional = absences_translate('Previsional request (will not be sent to approval)', 'Previsional requests (will not be sent to approval)', $nb_request);
726
		$this->t_no_approval = absences_translate('This right do not require approval');
727
        $this->t_force_approval = absences_translate('Launch the approval process on this request');
728
729
		$this->allow_mismatch = absences_getVacationOption('allow_mismatch');
730
731
        
732
733
		if (empty($this->id))
734
		{
735
736
			// create a new entry (not saved)
737
			$entry = new absences_Entry();
738
			$entry->setRow(array(
739
					'id_user' 	 => $this->id_user,
740
					'date_begin' => $begin,
741
					'date_end'	 => $end
742
			));
743
744
			$this->previsional = true;
0 ignored issues
show
Bug introduced by
The property previsional does not seem to exist. Did you mean save_previsional?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
745
			$this->previsional_checked = isset($_POST['previsional']);
0 ignored issues
show
Bug introduced by
The property previsional_checked does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
746
747
			$this->upd_recurring = false;
0 ignored issues
show
Bug introduced by
The property upd_recurring does not seem to exist. Did you mean recurring?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
748
749
		} else {
750
			$entry = absences_Entry::getById($this->id);
751
			$dates_modified = ($entry->date_begin !== $begin || $entry->date_end !== $end);
752
753
			$entry->date_begin = $begin;
754
			$entry->date_end = $end;
755
			if ($this->previsional = $entry->isPrevisonal())
0 ignored issues
show
Bug introduced by
The property previsional does not seem to exist. Did you mean save_previsional?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
756
			{
757
				$this->previsional_checked = true;
758
			}
759
760
			if ($entry->folder && !$dates_modified)
761
			{
762
				$this->t_upd_recurring = absences_translate('Update description and rights for all periods with same total quantity in the recurring request');
0 ignored issues
show
Bug introduced by
The property t_upd_recurring does not seem to exist. Did you mean recurring?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
763
				$this->upd_recurring = true;
0 ignored issues
show
Bug introduced by
The property upd_recurring does not seem to exist. Did you mean recurring?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
764
			} else {
765
				$this->upd_recurring = false;
0 ignored issues
show
Bug introduced by
The property upd_recurring does not seem to exist. Did you mean recurring?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
766
			}
767
		}
768
769
770
		$days = $entry->getDurationDays();
771
		$hours = $entry->getDurationHours();
772
773
774
775
		$this->period_nbdays = $days;
0 ignored issues
show
Bug introduced by
The property period_nbdays does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
776
		$this->period_nbhours = $hours;
0 ignored issues
show
Bug introduced by
The property period_nbhours does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
777
778
		/**
779
		 * nombre de jours non utilises restant, initialisation
780
		 */
781
		$this->last_days = $days;
0 ignored issues
show
Bug introduced by
The property last_days does not seem to exist. Did you mean t_days?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
782
783
		/**
784
		 * nombre d'heures non utilises restantes, initialisation
785
		 */
786
		$this->last_hours = $hours;
0 ignored issues
show
Bug introduced by
The property last_hours does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
787
788
789
		$this->t_days = absences_translate("Day(s)");
790
791
792
793
		$this->begin		= $entry->date_begin;
0 ignored issues
show
Bug introduced by
The property begin does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
794
		$this->end			= $entry->date_end;
0 ignored issues
show
Bug introduced by
The property end does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
795
796
		$this->rfrom = isset($_POST['rfrom'])? $_POST['rfrom'] : 0;
0 ignored issues
show
Bug introduced by
The property rfrom does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
797
		$this->rights = array();
798
		$rights = absences_getRightsOnPeriod($this->begin, $this->end, $this->id_user, $this->rfrom);
799
800
		$this->contain_hours_rights = false;
0 ignored issues
show
Bug introduced by
The property contain_hours_rights does not seem to exist. Did you mean rights?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
801
802
		$this->no_approval_message = false;
0 ignored issues
show
Bug introduced by
The property no_approval_message does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
803
		$one_approval = false;
804
805
806
		foreach($rights as $right) {
807
			$id		= empty($right['id_rgroup']) ? 'r'.$right['id'] : 'g'.$right['id_rgroup'];
808
809
			if ('H' === $right['quantity_unit'])
810
			{
811
				$this->contain_hours_rights = true;
0 ignored issues
show
Bug introduced by
The property contain_hours_rights does not seem to exist. Did you mean rights?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
812
			}
813
814
			if (isset($this->rights[$id])) {
815
				$this->rights[$id]['rights'][$right['id']] = array(
816
					'description'			=> $right['description'],
817
					'quantity_available'	=> $right['quantity_available'] - $right['waiting'],
818
			        'previsional_available'	=> $right['quantity_available'] - $right['agentRight']->getPrevisionalQuantity() - $right['waiting'],
819
			        'sortkey'               => $this->getOptionSortKey($right)
820
				);
821
				continue;
822
823
			} elseif(!empty($right['id_rgroup'])) {
824
			    
825
			    // les droits avec regroupement sont ajoutes dans ['rights']
826
			    
827
			    
828
				$right['rights'] = array(
829
					$right['id'] => array(
830
						'description' 			=> $right['description'],
831
						'quantity_available'	=> $right['quantity_available'] - $right['waiting'],
832
				        'previsional_available'	=> $right['quantity_available'] - $right['agentRight']->getPrevisionalQuantity() - $right['waiting'],
833
				        'sortkey'               => $this->getOptionSortKey($right)
834
					)
835
				);
836
			}
837
838
			$this->rights[$id] = $right;
839
840
			$agentRight = $right['agentRight'];
841
			if (0 === (int) $agentRight->getRight()->require_approval) {
842
				$this->no_approval_message = true;
843
			} else {
844
			    $one_approval = true;
845
			}
846
			
847
			
848
		}
849
		
850
		
851
		$author = absences_Agent::getCurrentUser();
852
		$this->manager_propose_approval = ($author->isManager() && $one_approval);
0 ignored issues
show
Bug introduced by
The property manager_propose_approval does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
853
		
854
		
855
		if (empty($this->rights)) {
856
			$babBody->addError(absences_translate('No rights accessibles on this period'));
857
		}
858
859
860
		bab_Sort::asort($this->rights, 'sortkey');
861
862
863
		$s_days = sprintf('<strong>%s</strong>', absences_editQuantity($days, 'D'));
864
		$s_hours = sprintf('<strong>%s</strong>', absences_editQuantity($hours, 'H'));
865
866
		$r_days = sprintf('<strong>%s</strong>', absences_editQuantity($nb_request*$days, 'D'));
867
		$r_hours = sprintf('<strong>%s</strong>', absences_editQuantity($nb_request*$hours, 'H'));
868
869
870
		if ($this->contain_hours_rights)
0 ignored issues
show
Bug introduced by
The property contain_hours_rights does not seem to exist. Did you mean rights?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
871
		{
872
			$this->period_infos = sprintf(absences_translate('The period contain %s day(s) or %s hour(s)', 'Each period contain %s day(s) or %s hour(s)', $nb_request), $s_days, $s_hours);
0 ignored issues
show
Bug introduced by
The property period_infos does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
873
			$this->recurring_total = sprintf(absences_translate('Total in all periods: %s day(s) or %s hour(s)'), $r_days, $r_hours);
0 ignored issues
show
Bug introduced by
The property recurring_total does not seem to exist. Did you mean recurring?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
874
		} else {
875
			$this->period_infos = sprintf(absences_translate('The period contain %s day(s)', 'Each period contain %s day(s)', $nb_request), $s_days);
876
			$this->recurring_total = sprintf(absences_translate('All periods contains %s day(s)'), $r_days);
0 ignored issues
show
Bug introduced by
The property recurring_total does not seem to exist. Did you mean recurring?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
877
		}
878
879
880
881
		if (!empty($this->id))
882
		{
883
			$res = $babDB->db_query("SELECT id_right, quantity FROM ".ABSENCES_ENTRIES_ELEM_TBL." WHERE id_entry='".$babDB->db_escape_string($this->id)."'");
884
			while ($arr = $babDB->db_fetch_array($res))
885
			{
886
				$this->current['r'.$arr['id_right']] = $arr['quantity'];
0 ignored issues
show
Bug introduced by
The property current does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
887
			}
888
		}
889
890
		$this->recorded = array();
0 ignored issues
show
Bug introduced by
The property recorded does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
891
		if (!empty($this->id))
892
		{
893
			$res = $babDB->db_query("
894
					SELECT
895
					e.id_right,
896
					r.id_rgroup,
897
					e.quantity
898
					FROM
899
					".ABSENCES_ENTRIES_ELEM_TBL." e,
900
					".ABSENCES_RIGHTS_TBL." r
901
902
					WHERE
903
					e.id_entry='".$babDB->db_escape_string($this->id)."'
904
					AND e.id_right = r.id
905
					");
906
			while($arr = $babDB->db_fetch_array($res))
907
			{
908
				if (empty($arr['id_rgroup'])) {
909
					$this->recorded['r'.$arr['id_right']] = $arr['quantity'];
910
				} else {
911
					$this->recorded['g'.$arr['id_rgroup']] = $arr['quantity'];
912
				}
913
			}
914
915
			list($this->remarks) = $babDB->db_fetch_array($babDB->db_query("SELECT comment FROM ".ABSENCES_ENTRIES_TBL." WHERE id=".$babDB->quote($this->id)));
0 ignored issues
show
Bug introduced by
The property remarks does not seem to exist. Did you mean remark?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
916
		}
917
		else
918
		{
919
			$this->remarks = isset($_POST['remarks']) ? stripslashes($_POST['remarks']) : '';
0 ignored issues
show
Bug introduced by
The property remarks does not seem to exist. Did you mean remark?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
920
		}
921
922
		$this->datebegin = absences_longDate(bab_mktime($begin));
0 ignored issues
show
Bug introduced by
The property datebegin does not seem to exist. Did you mean datebegintxt?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
923
		$this->dateend = absences_longDate(bab_mktime($end));
0 ignored issues
show
Bug introduced by
The property dateend does not seem to exist. Did you mean dateendtxt?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
924
925
926
		$this->calurl = absences_addon()->getUrl()."planning&idx=cal&idu=".$this->id_user."&popup=1";
0 ignored issues
show
Bug introduced by
The property calurl does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
927
928
	}
929
	
930
	
931
	private function getOptionSortKey(Array $right)
932
	{
933
	    // T8618 ordonner en fonction de la date de fin de validite
934
	     
935
	    $sortkey = $right['date_end_valid'];
936
	    if ('0000-00-00' === $sortkey) {
937
	        $sortkey = $right['date_end'];
938
	    }
939
	    
940
	    $sortkey .= ' '.$right['description'];
941
	    
942
	    return $sortkey;
943
	}
944
	
945
946
947
	/**
948
	 * Correct errors in the DATETIME format
949
	 * @param string $str
950
	 * @return string
951
	 */
952
	private function formatInputDate($str)
953
	{
954
	    $m = null;
955
		preg_match('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', $str, $m);
956
		return sprintf('%04d-%02d-%02d %02d:%02d:%02d', $m[1], $m[2], $m[3], $m[4], $m[5], $m[6]);
957
	}
958
959
960
961
	/**
962
	 * Convert days to hours
963
	 * @param float $days
964
	 * @return float
965
	 */
966 View Code Duplication
	private function daysToHours($days)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
967
	{
968
		if (0 == $this->period_nbdays)
969
		{
970
			return 0;
971
		}
972
973
		$ratio = $this->period_nbhours / $this->period_nbdays;
974
		return round(($ratio * $days), 2);
975
	}
976
977
	/**
978
	 * Convert hours to days
979
	 * @param float $hours
980
	 * @return float
981
	 */
982 View Code Duplication
	private function hoursToDays($hours)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
983
	{
984
		if (0 == $this->period_nbhours)
985
		{
986
			return 0;
987
		}
988
989
		$ratio = $this->period_nbdays / $this->period_nbhours;
990
		return round(($ratio * $hours), 2);
991
	}
992
993
	/**
994
	 *
995
	 * @param string 	$unit		D | H
996
	 * @param float		$set
997
	 *
998
	 * @return float | null
999
	 */
1000
	private function last($unit = null, $set = null)
1001
	{
1002
		if (null === $set)
1003
		{
1004
			switch($unit)
1005
			{
1006
				case 'D':
1007
					return $this->last_days;
0 ignored issues
show
Bug introduced by
The property last_days does not seem to exist. Did you mean t_days?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1008
1009
				case 'H':
1010
					return $this->last_hours;
1011
			}
1012
		}
1013
		else
1014
		{
1015
			switch($unit)
1016
			{
1017
				case 'D':
1018
					$this->last_days = $set;
0 ignored issues
show
Bug introduced by
The property last_days does not seem to exist. Did you mean t_days?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1019
					$this->last_hours = $this->daysToHours($set);
1020
					break;
1021
1022
				case 'H':
1023
					$this->last_days = $this->hoursToDays($set);
0 ignored issues
show
Bug introduced by
The property last_days does not seem to exist. Did you mean t_days?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1024
					$this->last_hours = $set;
1025
					break;
1026
			}
1027
		}
1028
1029
	}
1030
1031
1032
	public function getnextright()
1033
	{
1034
1035
		if (list($id,$this->right) = each($this->rights))
1036
		{
1037
		    // ordonner les listes deroulantes
1038
		    
1039
	        if (!empty($this->right['rights'])) {
1040
	            bab_Sort::asort($this->rights[$id]['rights'], 'sortkey', bab_Sort::CASE_INSENSITIVE);
1041
	        }
1042
		    
1043
1044
	        $agentRight = $this->right['agentRight'];
1045
	        /*@var $agentRight absences_AgentRight */
1046
1047
			$this->id_rgroup = $this->right['id_rgroup'];
0 ignored issues
show
Bug introduced by
The property id_rgroup does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1048
			$this->rgroup = bab_toHtml($this->right['rgroup']);
0 ignored issues
show
Bug introduced by
The property rgroup does not seem to exist. Did you mean id_rgroup?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1049
1050
			$this->right['description'] = bab_toHtml($this->right['description']);
1051
			$this->right['current_quantity'] = 
1052
			$this->right['quantity_available'] = $this->right['quantity_available'] - $this->right['waiting'];
1053
			$this->right['previsional_available'] = $this->right['quantity_available'] - $agentRight->getPrevisionalQuantity();
1054
			
1055
			$this->current_quantity = '';
0 ignored issues
show
Bug introduced by
The property current_quantity does not seem to exist. Did you mean current?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1056
			if (isset($this->current[$id])) {
1057
			    $this->current_quantity = bab_toHtml($this->current[$id]);
0 ignored issues
show
Bug introduced by
The property current_quantity does not seem to exist. Did you mean current?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1058
			}
1059
			$this->quantity_available = bab_toHtml(absences_quantity($this->right['quantity_available'], $this->right['quantity_unit']));
0 ignored issues
show
Bug introduced by
The property quantity_available does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1060
			$this->previsional_quantity_available = bab_toHtml(absences_quantity($this->right['previsional_available'], $this->right['quantity_unit']));
0 ignored issues
show
Bug introduced by
The property previsional_quantity_available does not seem to exist. Did you mean quantity_available?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1061
1062
			
1063
			$right = $agentRight->getRight();
1064
1065
			$this->no_approval = !((bool) $right->require_approval);
0 ignored issues
show
Bug introduced by
The property no_approval does not seem to exist. Did you mean t_no_approval?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1066
1067
1068 View Code Duplication
			switch($this->right['quantity_unit'])
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1069
			{
1070
				case 'D':
1071
					$this->unit = absences_translate('day(s)');
0 ignored issues
show
Bug introduced by
The property unit does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1072
					break;
1073
1074
				case 'H':
1075
					$this->unit = absences_translate('hour(s)');
1076
					break;
1077
			}
1078
1079
1080
			$float_quantity = 0.0;
1081
1082
1083
			if (isset($_POST['nbdays'][$id]))
1084
			{
1085
				$float_quantity = (float) str_replace(',', '.', $_POST['quantity'][$id]);
1086
				$this->quantity = $_POST['quantity'][$id];
0 ignored issues
show
Bug introduced by
The property quantity does not seem to exist. Did you mean quantity_available?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1087
			}
1088
			elseif( count($this->recorded) > 0) {
1089
				if (isset($this->recorded[$id])) {
1090
					$float_quantity = (float) $this->recorded[$id];
1091
					$this->quantity = absences_editQuantity($this->recorded[$id], $this->right['quantity_unit']);
0 ignored issues
show
Bug introduced by
The property quantity does not seem to exist. Did you mean quantity_available?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1092
				}
1093
				else {
1094
					$this->quantity = '0';
0 ignored issues
show
Bug introduced by
The property quantity does not seem to exist. Did you mean quantity_available?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1095
					$float_quantity = 0.0;
1096
				}
1097
			}
1098
			elseif (0 == $this->right['no_distribution'] && $this->last($this->right['quantity_unit']) > 0 && $this->right['quantity_available'] > 0)
1099
			{
1100
1101
				$last = $this->last($this->right['quantity_unit']);
1102
1103
1104
				if ($last >= $this->right['quantity_available'])
1105
				{
1106
					$float_quantity = $this->right['quantity_available'];
1107
					$this->quantity = absences_editQuantity($this->right['quantity_available'], $this->right['quantity_unit']);
0 ignored issues
show
Bug introduced by
The property quantity does not seem to exist. Did you mean quantity_available?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1108
1109
					$last -= $this->right['quantity_available'];
1110
					$this->last($this->right['quantity_unit'], $last);
1111
				}
1112
				elseif ($this->right['quantity_available'] > 0)
1113
				{
1114
					$float_quantity = $last;
1115
					$this->quantity = absences_editQuantity($last, $this->right['quantity_unit']);
0 ignored issues
show
Bug introduced by
The property quantity does not seem to exist. Did you mean quantity_available?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1116
					$this->last($this->right['quantity_unit'], 0);
1117
				}
1118
1119
			}
1120
			else
1121
			{
1122
				$float_quantity = 0.0;
1123
				$this->quantity = '0';
0 ignored issues
show
Bug introduced by
The property quantity does not seem to exist. Did you mean quantity_available?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1124
1125
			}
1126
1127
1128
1129
1130
			switch($this->right['quantity_unit'])
1131
			{
1132
				case 'D':
1133
					$this->total_days += $float_quantity;
1134
					$this->total_hours += $this->daysToHours($this->quantity);
0 ignored issues
show
Bug introduced by
The property quantity does not seem to exist. Did you mean quantity_available?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1135
					break;
1136
				case 'H':
1137
					$this->total_hours += $float_quantity;
1138
					$this->total_days += $this->hoursToDays($this->quantity);
0 ignored issues
show
Bug introduced by
The property quantity does not seem to exist. Did you mean quantity_available?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1139
					break;
1140
			}
1141
1142
1143
1144
			return true;
1145
		}
1146
		else
1147
			return false;
1148
1149
	}
1150
1151
1152
	public function getnextrgroupright() {
1153
		if (list($id, $arr) = each($this->right['rights'])) {
1154
			$this->id_right = bab_toHtml($id);
0 ignored issues
show
Bug introduced by
The property id_right does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1155
			$this->description = bab_toHtml($arr['description']);
0 ignored issues
show
Bug introduced by
The property description does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1156
1157
			$recorded = isset($this->current['r'.$id]) ? $this->current['r'.$id] : 0;
1158
			$this->current_quantity = bab_toHtml($recorded);
0 ignored issues
show
Bug introduced by
The property current_quantity does not seem to exist. Did you mean current?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1159
			$this->quantity_available = bab_toHtml($arr['quantity_available']);
1160
			$this->previsional_available = bab_toHtml($arr['previsional_available']);
0 ignored issues
show
Bug introduced by
The property previsional_available does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1161
			$this->selected = isset($this->current['r'.$id]);
0 ignored issues
show
Bug introduced by
The property selected does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1162
			return true;
1163
		}
1164
		return false;
1165
	}
1166
1167
	public function getnextrecurring() {
1168
		if (list($begin, $end) = each($_POST['period'])) {
1169
			$this->period = bab_toHtml(sprintf(absences_translate('from %s to %s'), bab_shortDate(bab_mktime($begin)), bab_shortDate(bab_mktime($end))));
0 ignored issues
show
Bug introduced by
The property period does not seem to exist. Did you mean period_nbdays?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1170
			$this->p_begin = bab_toHtml($begin);
0 ignored issues
show
Bug introduced by
The property p_begin does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1171
			$this->p_end = bab_toHtml($end);
0 ignored issues
show
Bug introduced by
The property p_end does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1172
			return true;
1173
		}
1174
		return false;
1175
	}
1176
1177
}
1178
1179
1180
1181
1182
1183
function requestVacation($begin,$end, $id, $rfrom, $ide)
1184
	{
1185
	global $babBody;
1186
	
1187
	if ($id)
1188
	{
1189
		$babBody->setTitle(absences_translate("Edit vacation request"));
1190
	} else
1191
	{
1192
		$babBody->setTitle(absences_translate("Request vacation"));
1193
	}
1194
	
1195
	
1196
	if( !bab_isEntryEditable($id) )
1197
	{
1198
		return false;
1199
	}
1200
	
1201
	if (absences_lockedForMainteance())
1202
	{
1203
		$babBody->addError(absences_getMaintenanceMessage());
1204
		return false;
1205
	}
1206
	
1207
	$agent = absences_Agent::getCurrentUser();
1208
	
1209
	if ($id)
1210
	{
1211
		if ($rfrom)
1212
		{
1213
			if ($ide && $agent->isEntityManagerOf($ide))
1214
			{
1215
				// modification d'une demande par un gestionnaire delegue
1216
				$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
1217
				$babBody->addItemMenu("entity_members", absences_translate("Entity requests"), absences_addon()->getUrl()."vacchart&idx=entity_requests&ide=".$ide);
1218
				$babBody->addItemMenu("vunew", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=vunew&id=".$id."&rfrom=1&ide=".$ide);
1219
				
1220 View Code Duplication
			} elseif (!$ide && $agent->isManager()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1221
				// modification d'une demande par un gestionnaire
1222
				$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
1223
				$babBody->addItemMenu("lper", absences_translate("Requests"), absences_addon()->getUrl()."vacadmb&idx=lreq");
1224
				$babBody->addItemMenu("vunew", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=vunew&id=".$id."&rfrom=1");
1225
			}
1226 View Code Duplication
		} else {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1227
			// modification d'une demande par un agent
1228
			$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
1229
			$babBody->addItemMenu("vunew", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=vunew&id=".$id);
1230
		}
1231
	} else {
1232
		
1233
		if ($rfrom)
1234
		{
1235
			if ($ide && $agent->isEntityManagerOf($ide))
1236
			{
1237
				// creation d'une demande par un gestionnaire delegue
1238
				$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
1239
				$babBody->addItemMenu("entity_members", absences_translate("Entity requests"), absences_addon()->getUrl()."vacchart&idx=entity_requests&ide=".$ide);
1240
				$babBody->addItemMenu("vunew", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=vunew&rfrom=1&ide=".$ide);
1241
		
1242 View Code Duplication
			} elseif (!$ide && $agent->isManager()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1243
				// creation d'une demande par un gestionnaire
1244
				$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
1245
				$babBody->addItemMenu("lper", absences_translate("Requests"), absences_addon()->getUrl()."vacadmb&idx=lreq");
1246
				$babBody->addItemMenu("vunew", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=vunew&rfrom=1");
1247
			}
1248 View Code Duplication
		} else {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1249
			// creation d'une demande par un agent
1250
			$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
1251
			$babBody->addItemMenu("vunew", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=vunew");
1252
		}
1253
		
1254
	}
1255
	
1256
1257
	$temp = new absences_RequestVacation($begin,$end, $id);
1258
	$babBody->babecho(	bab_printTemplate($temp, absences_addon()->getRelativePath()."vacuser.html", "newvacation"));
0 ignored issues
show
Deprecated Code introduced by
The method bab_addonInfos::getRelativePath() has been deprecated with message: Do not use relative path in addons Addons are subject to move out of the core folder in futures version for bab_printTemplate, replace with $addon->printTemplate() for babBody->addStyleSheet use $addon->getStylePath() instead of relative path the addStyleSheet method support full path starting with vendor/ since the 8.1.98 version

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
1259
	}
1260
1261
1262
1263
function period($id_user, $id = 0)
1264
	{
1265
	    require_once dirname(__FILE__).'/utilit/period.ui.php';
1266
	    
1267
		$temp = new absences_PeriodFrame($id_user, $id);
1268
		$GLOBALS['babBody']->babecho(bab_printTemplate($temp,  absences_addon()->getRelativePath()."vacuser.html", "period"));
0 ignored issues
show
Deprecated Code introduced by
The method bab_addonInfos::getRelativePath() has been deprecated with message: Do not use relative path in addons Addons are subject to move out of the core folder in futures version for bab_printTemplate, replace with $addon->printTemplate() for babBody->addStyleSheet use $addon->getStylePath() instead of relative path the addStyleSheet method support full path starting with vendor/ since the 8.1.98 version

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
1269
	}
1270
1271
1272
1273
1274
function viewrights($id_user)
1275
	{
1276
	class temp
0 ignored issues
show
Comprehensibility Best Practice introduced by
The type temp has been defined more than once; this definition is ignored, only the first definition in programs/vacadm.php (L38-118) is considered.

This check looks for classes that have been defined more than once.

If you can, we would recommend to use standard object-oriented programming techniques. For example, to avoid multiple types, it might make sense to create a common interface, and then multiple, different implementations for that interface.

This also has the side-effect of providing you with better IDE auto-completion, static analysis and also better OPCode caching from PHP.

Loading history...
1277
		{
1278
1279
		var $altbg = true;
1280
1281
		function temp($id_user) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
1282
			$this->rights = absences_getRightsByGroupOnPeriod($id_user);
0 ignored issues
show
Bug introduced by
The property rights does not seem to exist. Did you mean t_rights?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1283
			$this->total = 0;
0 ignored issues
show
Bug introduced by
The property total does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1284
			$this->total_waiting = 0;
0 ignored issues
show
Bug introduced by
The property total_waiting does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1285
			$this->t_avariable_days = absences_translate("Avariable days");
0 ignored issues
show
Bug introduced by
The property t_avariable_days does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1286
			$this->t_waiting_days = absences_translate("Waiting days");
0 ignored issues
show
Bug introduced by
The property t_waiting_days does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1287
			$this->t_period_nbdays = absences_translate("Period days");
0 ignored issues
show
Bug introduced by
The property t_period_nbdays does not seem to exist. Did you mean period?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1288
			$this->t_total = absences_translate("Total");
0 ignored issues
show
Bug introduced by
The property t_total does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1289
1290
			$this->t_available = absences_translate("Available");
0 ignored issues
show
Bug introduced by
The property t_available does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1291
			$this->t_waiting = absences_translate("Waiting");
0 ignored issues
show
Bug introduced by
The property t_waiting does not seem to exist. Did you mean t_waiting_days?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1292
1293
			$this->total = array('D' => 0, 'H' => 0);
1294
			$this->total_waiting = array('D' => 0, 'H' => 0);
1295
		}
1296
1297
		function getnextright()
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
1298
			{
1299
			if ($right = & current($this->rights))
0 ignored issues
show
Bug introduced by
The property rights does not seem to exist. Did you mean t_rights?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1300
				{
1301
				$this->altbg = !$this->altbg;
1302
				next($this->rights);
0 ignored issues
show
Bug introduced by
The property rights does not seem to exist. Did you mean t_rights?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1303
				$quantity_available = $right['quantity_available'] - $right['waiting'];
1304
				$this->description = bab_toHtml($right['description']);
1305
1306
				$this->quantity_available = array('D' => 0, 'H' => 0);
0 ignored issues
show
Bug introduced by
The property quantity_available does not seem to exist. Did you mean quantity?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1307
				$this->waiting = array('D' => 0, 'H' => 0);
0 ignored issues
show
Bug introduced by
The property waiting does not seem to exist. Did you mean total_waiting?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1308
1309
				$this->quantity_available[$right['quantity_unit']] = $quantity_available;
0 ignored issues
show
Bug introduced by
The property quantity_available does not seem to exist. Did you mean quantity?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1310
				$this->waiting[$right['quantity_unit']] = $right['waiting'];
0 ignored issues
show
Bug introduced by
The property waiting does not seem to exist. Did you mean total_waiting?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1311
1312
				$this->total[$right['quantity_unit']] += $this->quantity_available[$right['quantity_unit']];
0 ignored issues
show
Bug introduced by
The property quantity_available does not seem to exist. Did you mean quantity?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1313
				$this->total_waiting[$right['quantity_unit']] += $this->waiting[$right['quantity_unit']];
0 ignored issues
show
Bug introduced by
The property waiting does not seem to exist. Did you mean total_waiting?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
1314
				return true;
1315
				}
1316
			else
1317
				return false;
1318
1319
			}
1320
1321
		}
1322
		$temp = new temp($id_user);
0 ignored issues
show
Bug introduced by
The call to temp::temp() misses some required arguments starting with $what.
Loading history...
1323
		
1324
		global $babBody;
1325
		
1326
		$html = bab_printTemplate($temp,  absences_addon()->getRelativePath()."vacuser.html", "viewrights");
0 ignored issues
show
Deprecated Code introduced by
The method bab_addonInfos::getRelativePath() has been deprecated with message: Do not use relative path in addons Addons are subject to move out of the core folder in futures version for bab_printTemplate, replace with $addon->printTemplate() for babBody->addStyleSheet use $addon->getStylePath() instead of relative path the addStyleSheet method support full path starting with vendor/ since the 8.1.98 version

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
1327
		
1328
		if (1 === (int) bab_rp('popup'))
1329
		{
1330
		    $babBody->babPopup($html);
1331
		} else {
1332
		    $babBody->babEcho($html);
1333
		}
1334
	}
1335
1336
1337
1338
function vedUnload()
1339
	{
1340
	class temp
0 ignored issues
show
Comprehensibility Best Practice introduced by
The type temp has been defined more than once; this definition is ignored, only the first definition in programs/vacadm.php (L38-118) is considered.

This check looks for classes that have been defined more than once.

If you can, we would recommend to use standard object-oriented programming techniques. For example, to avoid multiple types, it might make sense to create a common interface, and then multiple, different implementations for that interface.

This also has the side-effect of providing you with better IDE auto-completion, static analysis and also better OPCode caching from PHP.

Loading history...
1341
		{
1342
		var $message;
1343
		var $close;
1344
		var $redirecturl;
1345
1346
		function temp()
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
1347
			{
1348
			$this->message = absences_translate("Vacation entry has been updated");
1349
			$this->close = absences_translate("Close");
0 ignored issues
show
Bug introduced by
The property close does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1350
			$this->redirecturl = absences_addon()->getUrl()."vacuser&idx=lval";
0 ignored issues
show
Bug introduced by
The property redirecturl does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1351
			}
1352
		}
1353
1354
	$temp = new temp();
0 ignored issues
show
Bug introduced by
The call to temp::temp() misses some required arguments starting with $vtid.
Loading history...
1355
	global $babBody;
1356
	$babBody->babPopup(bab_printTemplate($temp, absences_addon()->getRelativePath()."vacuser.html", "vedunload"));
0 ignored issues
show
Deprecated Code introduced by
The method bab_addonInfos::getRelativePath() has been deprecated with message: Do not use relative path in addons Addons are subject to move out of the core folder in futures version for bab_printTemplate, replace with $addon->printTemplate() for babBody->addStyleSheet use $addon->getStylePath() instead of relative path the addStyleSheet method support full path starting with vendor/ since the 8.1.98 version

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
1357
	}
1358
1359
1360
1361
class absences_saveVacation
1362
{
1363
1364
1365
	/**
1366
	 * Test la quantite dispo sur un droit
1367
	 * 
1368
	 *
1369
	 * @param	array	&$nbdays	list of rights to save in request, rows are added on each valid calls
1370
	 * @param	Array	$arr		vacation rights properties
1371
	 * @param	float	$quantity	requested quantity in form
1372
	 * @param	int		$id_request	if this is a request modification
1373
	 * 
1374
	 * @throws Exception
1375
	 * 
1376
	 * @return bool
1377
	 */
1378
	private static function addVacationRight(&$nbdays, Array $arr, $quantity, $id_request, &$used_in_previous_periods)
1379
	{
1380
		$quantity = str_replace(',','.', $quantity);
1381
		$available = ($arr['quantity_available'] - $arr['waiting']);
1382
		
1383
		if (!isset($used_in_previous_periods[$arr['id']]))
1384
		{
1385
			$used_in_previous_periods[$arr['id']] = 0;
1386
		}
1387
1388
		if (!empty($id_request)) {
1389
			
1390
			$entry = absences_Entry::getById($id_request);
1391
			
1392
			if (!$entry->isPrevisonal()) {
1393
    			$element = $entry->getElement($arr['id']);
1394
    			
1395
    			if (isset($element)) {
1396
        			// quantity in current request is unavailable, add it to $available (waiting or confirmed)
1397
        			$available += $element->quantity;
1398
    			}
1399
			}
1400
		}
1401
1402
		
1403
		if ('' === $quantity) {
1404
			$quantity = 0;
1405
		}
1406
		
1407
1408
		if(!is_numeric($quantity) || $quantity < 0 ) {
1409
			throw new Exception(sprintf(absences_translate("You must specify a correct number days on right %s"), $arr['description']));
1410
		}
1411
1412
		if (!empty($quantity) && $arr['cbalance'] != 'Y' && ($available - $quantity - $used_in_previous_periods[$arr['id']]) < 0) {
1413
			throw new Exception(sprintf(absences_translate("You can't take more than %s on the right %s"), absences_quantity($available, $arr['quantity_unit']), $arr['description']));
1414
		}
1415
		
1416
		
1417
		// si le droit est un compte epargne temps, verifier les conditions d'utilisations speciales
1418
		if (!empty($quantity))
1419
		{
1420
			$agentRight = $arr['agentRight'];
1421
			/*@var $agentRight absences_agentRight */
1422
			$right = $agentRight->getRight();
1423
			
1424
			if (absences_Right::CET === $right->getKind() && ($cet = $right->getRightCet()))
1425
			{
1426
				if (0 !== (int) round(10*$cet->min_use)) // 0 = min_use disabled
1427
				{
1428
					// -1 = force using all available
1429
					
1430
					$min_use = (float) $cet->min_use;
1431
					
1432
					if ($min_use < 0 && $quantity < $available)
1433
					{
1434
						throw new Exception(sprintf(absences_translate("The quantity available in %s must be used all in one request"), $arr['description']));
1435
					}
1436
					
1437
					
1438
					if ($min_use > 0 && ((int) round(10*$quantity)) < ((int) round(10*$min_use)))
1439
					{
1440
						throw new Exception(sprintf(absences_translate("The minimal quantity usable in one request for the right %s is %s"), $arr['description'], absences_quantity($min_use, 'D')));
1441
					}
1442
				}
1443
			}
1444
		}
1445
		
1446
1447
		if( $quantity > 0 ) {
1448
			$nbdays['id'][] = (int) $arr['id'];
1449
			$nbdays['val'][] = $quantity;
1450
			$used_in_previous_periods[$arr['id']] += $quantity;
1451
		}
1452
1453
		return true;
1454
	}
1455
	
1456
	
1457
	/**
1458
	 * requests in same folder and with same quantity and with same status
1459
	 * @param absences_Entry $entry
1460
	 * @return array
1461
	 */
1462
	private static function selectFolderSimilarRequests($entry)
1463
	{
1464
		require_once dirname(__FILE__).'/utilit/entry.class.php';
1465
		global $babDB;
1466
		
1467
		$res = $babDB->db_query('SELECT
1468
				e.* 
1469
			FROM
1470
				absences_entries e 
1471
			WHERE e.folder='.$babDB->quote($entry->folder).'
1472
				AND e.status='.$babDB->quote($entry->status).'
1473
				AND e.id<>'.$babDB->quote($entry->id).' 
1474
		');
1475
		
1476
		$return = array();
1477
		while($arr = $babDB->db_fetch_assoc($res))
1478
		{
1479
			$e = new absences_Entry();
1480
			$e->setRow($arr);
1481
			
1482
			if ($e->getTotalDays() == $entry->getTotalDays())
1483
			{
1484
				$return[] = $e;
1485
			}
1486
		}
1487
		
1488
		return $return;
1489
	}
1490
	
1491
	
1492
	/**
1493
	 * Save posted data
1494
	 */
1495
	public static function save()
1496
	{
1497
		global $babBody;
1498
		
1499
		if (absences_lockedForMainteance())
1500
		{
1501
			return false;
1502
		}
1503
		
1504
		
1505
		$id_request		= (int) $_POST['id'];
1506
		$id_user		= (int) $_POST['id_user'];
1507
		$rfrom			= $_POST['rfrom'];
1508
		
1509
		if( $rfrom == 1 )
1510
		{
1511
			$agent = absences_Agent::getCurrentUser();
1512
			if( !$agent->isManager())
1513
			{
1514
				$rfrom = 0;
1515
			}
1516
		}
1517
		
1518
		
1519
		
1520
		if (isset($_POST['period']) && is_array($_POST['period']))
1521
		{
1522
			// recurring request
1523
			
1524
			$period_list = $_POST['period'];
1525
			$folder = count($period_list) > 1 ? time() : 0;
1526
			$period_list_id = array();
1527
			
1528
		} else if (isset($_POST['upd_recurring']) && $id_request > 0) 
1529
		{
1530
1531
			// update recurring request
1532
1533
			require_once dirname(__FILE__).'/utilit/entry.class.php';
1534
			$entry = absences_Entry::getById($id_request);
1535
			
1536
			$folder = (int) $entry->folder;
1537
			
1538
			$period_list = array(
1539
					$_POST['begin'] => $_POST['end']
1540
			);
1541
			
1542
			$period_list_id = array(
1543
					$_POST['begin'] => $id_request
1544
			);
1545
			
1546
			$list = self::selectFolderSimilarRequests($entry);
1547
			
1548
			foreach($list as $e)
1549
			{
1550
				$period_list[$e->date_begin] = $e->date_end;
1551
				$period_list_id[$e->date_begin] = $e->id;
1552
			}
1553
			
1554
			
1555
			
1556
	    } else {
1557
		
1558
			$period_list = array(
1559
				$_POST['begin'] => $_POST['end']
1560
			);
1561
			
1562
			$period_list_id = array(
1563
				$_POST['begin'] => $id_request
1564
			);
1565
			
1566
			$folder = 0;
1567
		}
1568
		
1569
		/**
1570
		 * Les droits utilises pour les tests sont les droits affiches a l'ecran
1571
		 * dans une demande repetitive, c'est la premiere periode qui est utilise pour les tests d'affichage
1572
		 */
1573
		$rights = absences_getRightsOnPeriod(key($period_list), reset($period_list), $id_user, $rfrom);
1574
		
1575
		// test phase
1576
		
1577
		$used_in_previous_periods = array();
1578
		
1579
		
1580
		$nbdays = null;
1581
		
1582
		
1583
		foreach($period_list as $begin => $end)
1584
		{
1585
			$id_request = isset($period_list_id[$begin]) ? $period_list_id[$begin] : 0;
1586
			
1587
			
1588
			try {
1589
			    // la repartition des jours sur les droits
1590
			    $_nbdays = self::testRightsQuantity($id_request, $rights, $used_in_previous_periods);
1591
			    if (!isset($nbdays)) {
1592
			        $nbdays = $_nbdays;
1593
			    }
1594
			    
1595
			} catch (Exception $e)
1596
			{
1597
			    $babBody->addError($e->getMessage());
1598
			    return false;
1599
			}
1600
			
1601
			
1602
			// verifier que le droit est dispo sur la periode
1603
			// utile pour les demandes repetitives
1604
			if (!test_periodValidity($id_request, $id_user, bab_mktime($begin), bab_mktime($end))) {
1605
				return false;
1606
			}
1607
1608
			try {
1609
				self::testRightsAvailability($rights, $nbdays, $begin, $end);
1610
			} catch (Exception $e)
1611
			{
1612
				$babBody->addError($e->getMessage());
1613
				return false;
1614
			}
1615
		}
1616
		
1617
		
1618
		if (!isset($nbdays)) {
1619
		    throw new Exception('missing quantity');
1620
		}
1621
		
1622
		
1623
		
1624
		// save phase
1625
		$saved = false;
1626
		foreach ($period_list as $begin => $end) {
1627
			$id_request = isset($period_list_id[$begin]) ? $period_list_id[$begin] : 0;
1628
			
1629
			if (self::savePeriod($id_request, $begin, $end, $id_user, $rfrom, $nbdays, $folder)) {
1630
				$saved = true;
1631
			}
1632
		}
1633
		
1634
		
1635
		if ($saved && !isset($_POST['previsional']))
1636
		{
1637
			$defer = (bool) absences_getVacationOption('approb_email_defer');
1638
			if (!$defer) {
1639
			    require_once dirname(__FILE__).'/utilit/request.notify.php';
1640
				absences_notifyRequestApprovers();
1641
			}
1642
		}
1643
1644
		return true;
1645
	}
1646
	
1647
	
1648
	
1649
	
1650
	
1651
	
1652
	
1653
	/**
1654
	 * Test des soldes 
1655
	 * retourne la liste des droit qui devons etre inseres ou false si la demande n'est pas autorise
1656
	 * 
1657
	 * @throws Exception
1658
	 * 
1659
	 * @return array | false
1660
	 */
1661
	private static function testRightsQuantity($id_request, $rights, &$used_in_previous_periods)
1662
	{
1663
		
1664
		
1665
		$rgroups = array();
1666
		$nbdays = array(
1667
			'id' => array(),
1668
			'val' => array()		
1669
		);
1670
		
1671
		// regular vacation rights
1672
		foreach($rights as &$arr)
1673
		{
1674
			if( isset($_POST['quantity'][$arr['id']]))
1675
			{
1676
				$quantity = $_POST['quantity'][$arr['id']];
1677
				if (!self::addVacationRight($nbdays, $arr, $quantity, $id_request, $used_in_previous_periods))
1678
				{
1679
					return false;
0 ignored issues
show
Bug Best Practice introduced by
The return type of return false; (false) is incompatible with the return type documented by absences_saveVacation::testRightsQuantity of type array.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
1680
				}
1681
			}
1682
		
1683
			if ($arr['id_rgroup'] > 0) {
1684
				$rgroups[$arr['id']] = $arr['id_rgroup'];
1685
			}
1686
		}
1687
		
1688
		// right groups
1689
		
1690
		if (isset($_POST['rgroup_right'])) {
1691
			foreach($_POST['rgroup_right'] as $id_rgroup => $id_right) {
1692
				if (isset($rgroups[$id_right]) && $rgroups[$id_right] == $id_rgroup) {
1693
					$quantity = $_POST['rgroup_value'][$id_rgroup];
1694
1695
					if (!self::addVacationRight($nbdays, $rights[$id_right], $quantity, $id_request, $used_in_previous_periods))
1696
					{
1697
						return false;
0 ignored issues
show
Bug Best Practice introduced by
The return type of return false; (false) is incompatible with the return type documented by absences_saveVacation::testRightsQuantity of type array.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
1698
					}
1699
				}
1700
			}
1701
		}
1702
		
1703
		if (empty($nbdays['val']))
1704
		{
1705
			throw new Exception(absences_translate("Empty requests are not allowed"));
1706
		}
1707
		
1708
		return $nbdays;
1709
	}
1710
	
1711
	
1712
	
1713
	/**
1714
	 * Tester pour une periode si les droits avec une quantite saisie est disponibe
1715
	 * 
1716
	 * @param array $rights			Array from absences_getRightsOnPeriod
1717
	 * @param array $nbdays
1718
	 * @param string $begin			ISO datetime
1719
	 * @param string $end			ISO datetime
1720
	 * 
1721
	 * @throws Exception
1722
	 * 
1723
	 * @return bool
1724
	 */
1725
	private static function testRightsAvailability(Array $rights, Array $nbdays, $begin, $end)
1726
	{
1727
		$begin_ts = bab_mktime($begin);
1728
		$end_ts = bab_mktime($end);
1729
		
1730
		
1731
		foreach($nbdays['id'] as $k => $id_right)
1732
		{
1733
			if (isset($nbdays['val'][$k]) && !empty($nbdays['val'][$k]))
1734
			{
1735
				$agentRight = $rights[$id_right]['agentRight'];
1736
				
1737
1738
				
1739
				if (!$agentRight->isAccessibleOnPeriod($begin_ts, $end_ts))
1740
				{
1741
					throw new Exception(sprintf(
1742
							absences_translate('The right "%s" is not accessible %s, in a recurring request, all periods must be inside the used right validity period'), 
1743
							$rights[$id_right]['description'], 
1744
							mb_strtolower(absences_DateTimePeriod($begin, $end))
1745
					));
1746
				}
1747
				
1748
				if (!$agentRight->isAccessibleOnDelay($begin_ts))
1749
				{
1750
					$right = $agentRight->getRight();
1751
					$rightRule = $right->getRightRule();
1752
					
1753
					throw new Exception(sprintf(
1754
							absences_translate('The right "%s" is not accessible in the next %s days'), 
1755
							$right[$id_right]['description'], 
1756
							$rightRule->delay_before
1757
					));
1758
				}
1759
			}
1760
		}
1761
		
1762
		return true;
1763
	}
1764
	
1765
	
1766
	
1767
	private static function getPeriodSpanOnEdit($old_date_begin, $old_date_end, BAB_DateTime $date_begin, BAB_DateTime $date_end)
1768
	{
1769
	    $old_date_begin_obj = BAB_DateTime::fromIsoDateTime($old_date_begin);
1770
	    $old_date_end_obj = BAB_DateTime::fromIsoDateTime($old_date_end);
1771
	    
1772
	    $old_date_begin = $old_date_begin_obj->getTimeStamp();
1773
	    $old_date_end = $old_date_end_obj->getTimeStamp();
1774
	    
1775
	    $new_date_begin = $date_begin->getTimeStamp();
1776
	    $new_date_end = $date_end->getTimeStamp();
1777
	    
1778
	    $period_begin	= $old_date_begin 	< $new_date_begin 	? $old_date_begin 	: $new_date_begin;
1779
	    $period_end 	= $old_date_end 	> $new_date_end 	? $old_date_end 	: $new_date_end;
1780
	    
1781
	    return array($period_begin, $period_end);
1782
	}
1783
	
1784
	
1785
	
1786
	/**
1787
	 * Save in calendar
1788
	 * 
1789
	 * 
1790
	 * @param int $id_request
1791
	 * @param BAB_DateTime | null $old_date_begin_obj
1792
	 * @param BAB_DateTime | null $old_date_end_obj
1793
	 */
1794
	private static function saveInCalendar($id_request, $id, $old_date_begin_obj, $old_date_end_obj)
1795
	{
1796
	    if (empty($id_request)) {
1797
	        // event creation
1798
	        absences_createPeriod($id);
1799
	    
1800
	    } else {
1801
	        // event modification
1802
	        absences_updatePeriod($id, $old_date_begin_obj, $old_date_end_obj);
1803
	    }
1804
	}
1805
1806
1807
	/**
1808
	 * 
1809
	 * @param string   $begin		ISO datetime
1810
	 * @param string   $end		    ISO datetime
1811
	 * @param int      $id_user     Request owner
1812
	 * @param int      $rfrom       rfrom=1 if modification from a manager and from the back-office
1813
	 * @return boolean
1814
	 */
1815
	private static function savePeriod($id_request, $begin, $end, $id_user, $rfrom, $nbdays, $folder = 0)
1816
	{
1817
		require_once $GLOBALS['babInstallPath'].'utilit/dateTime.php';
1818
		require_once dirname(__FILE__).'/utilit/entry.class.php';
1819
		require_once dirname(__FILE__).'/utilit/entry_elem.class.php';
1820
		global $babBody;
1821
1822
1823
		
1824
		$remarks		= $_POST['remarks'];
1825
		
1826
		
1827
		$date_begin = BAB_DateTime::fromIsoDateTime($begin);
1828
		$date_end	= BAB_DateTime::fromIsoDateTime($end);
1829
		$status = isset($_POST['previsional']) ? 'P' : 'Y';
1830
		
1831
		
1832
1833
1834
		if (empty($id_request)) {
1835
			// event creation
1836
			
1837
			$entry = new absences_Entry;
1838
			$entry->id_user = $id_user;
1839
			$entry->createdBy = bab_getUserId();
1840
			$entry->date_begin = $begin;
1841
			$entry->date_end = $end;
1842
			$entry->comment = $remarks;
1843
			$entry->createdOn = date('Y-m-d H:i:s');
1844
			$entry->idfai = 0;
1845
			$entry->status = $status;
1846
			$entry->folder = $folder;
1847
			    
1848
			$entry->save();
1849
			
1850
			$id = $entry->id;
1851
1852
			$period_begin = bab_mktime($begin);
1853
			$period_end = bab_mktime($end);
1854
			
1855
			$old_date_begin_obj = null;
1856
			$old_date_end_obj = null;
1857
1858
1859
		}
1860
		else {
1861
			// event modification
1862
1863
			$entry = absences_Entry::getById($id_request);
1864
1865
			$old_date_begin = $entry->date_begin;
1866
			$old_date_end = $entry->date_end;
1867
1868
			if ($entry->idfai > 0) {
1869
				deleteFlowInstance($entry->idfai);
1870
			}
1871
				
1872
			$entry->date_begin = $date_begin->getIsoDateTime();
1873
			$entry->date_end = $date_end->getIsoDateTime();
1874
			$entry->comment = $remarks;
1875
			$entry->idfai = 0;
1876
			$entry->status = $status;
1877
			
1878
			$entry->save();
1879
			
1880
			$entry->loadElements();
1881
1882
			$id = $id_request;
1883
1884
			
1885
            list($period_begin, $period_end) = self::getPeriodSpanOnEdit($old_date_begin, $old_date_end, $date_begin, $date_end);
1886
            
1887
            $old_date_begin_obj = BAB_DateTime::fromIsoDateTime($old_date_begin);
1888
            $old_date_end_obj = BAB_DateTime::fromIsoDateTime($old_date_end);
1889
		}
1890
1891
1892
		// insert rights
1893
		
1894
	   $saved_rights = array();
1895
1896
		if (isset($nbdays['id'])) {
1897
		  $count = count($nbdays['id']);
1898
		  for( $i = 0; $i < $count; $i++) {
1899
			   
1900
		      $id_right = $nbdays['id'][$i];
1901
		      $saved_rights[$id_right] = $id_right;
1902
		      
1903
    			$elem = $entry->getElement($id_right);
1904
    			if (!isset($elem)) {
1905
    			     $elem = new absences_EntryElem();
1906
    			     $elem->setEntry($entry);
1907
    			     $entry->addElement($elem);
1908
    			}
1909
    			
1910
    			$elem->id_right = $id_right;
1911
    			$elem->date_begin = '0000-00-00 00:00:00';
1912
    			$elem->date_end = '0000-00-00 00:00:00';
1913
    			$elem->quantity = $nbdays['val'][$i];
1914
			}
1915
		}
1916
		
1917
		// remove elements set to zero
1918
		foreach($entry->getElements() as $element) {
1919
		    if (!isset($saved_rights[$element->id_right])) {
1920
		        $element->delete();
1921
		    }
1922
		}
1923
		
1924
		$entry->setElementsDates();
1925
		$entry->saveElements();
1926
		$entry->createPlannedPeriods();
1927
		$entry->savePlannedPeriods();
1928
		
1929
1930
		// set period into calendar backend if necessary
1931
		try {
1932
            self::saveInCalendar($id_request, $id, $old_date_begin_obj, $old_date_end_obj);
1933
		} catch (Exception $e) {
1934
		    // ex: caldav is not accessible
1935
		    
1936
		    /*@var $babBody babBody */
1937
		    $babBody->addNextPageError(sprintf(absences_translate('Failed to save event in calendar: %s'), $e->getMessage()));
0 ignored issues
show
Documentation introduced by
sprintf(absences_transla...%s'), $e->getMessage()) is of type string, but the function expects a object<unknown_type>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
1938
		}
1939
1940
1941
		include_once $GLOBALS['babInstallPath']."utilit/eventperiod.php";
1942
		$event = new bab_eventPeriodModified($period_begin, $period_end, $id_user);
1943
		$event->types = BAB_PERIOD_VACATION;
0 ignored issues
show
Bug introduced by
The property types cannot be accessed from this context as it is declared private in class bab_eventPeriodModified.

This check looks for access to properties that are not accessible from the current context.

If you need to make a property accessible to another context you can either raise its visibility level or provide an accessible getter in the defining class.

Loading history...
1944
		bab_fireEvent($event);
1945
		
1946
		
1947
		
1948
1949
		if (!isset($_POST['previsional']))
1950
		{
1951
		    $author = absences_Agent::getCurrentUser();
1952
		    
1953
		    if (!$author->isManager() || bab_pp('force_approval')) {
1954
    			// create approbation
1955
    			if (!self::createInstance($id, !empty($id_request))) {
1956
    			    return false;
1957
    			}
1958
		    }
1959
			
1960
			if (!empty($id_request))
1961
			{
1962
				// notification de modification
1963
				$entry = absences_Entry::getById($id);
1964
				absences_notifyOnRequestChange(array($entry), $entry->id_user);
1965
				absences_notifyManagers::send($id);
1966
			}
1967
		}
1968
		
1969
		
1970
1971
		return true;
1972
	}
1973
1974
	
1975
	
1976
	
1977
	/**
1978
	 * Create approbation instance, set status in waiting state
1979
	 * @param 	int 	$id
1980
	 * @param	bool	$modify
1981
	 * 
1982
	 * @return bool
1983
	 */
1984
	public static function createInstance($id, $modify = false, $test_available = false)
1985
	{
1986
		require_once dirname(__FILE__).'/utilit/entry.class.php';
1987
		require_once dirname(__FILE__).'/utilit/request.notify.php';
1988
		global $babBody;
1989
		
1990
		$entry = absences_Entry::getById($id);
1991
		
1992
1993
		if ($test_available) {
1994
    		$res = $entry->getElementsIterator();
1995
    		foreach($res as $element)
1996
    		{
1997
    		    /*@var $element absences_EntryElem */
1998
    		    if (!$element->isQuantityAvailable()) {
1999
    		        $babBody->addNextPageError(sprintf(absences_translate('Failed to submit this request, the quantity for right %s s not available'), $element->getRight()->description));
2000
    		        return false;
2001
    		    }
2002
    		}
2003
		}
2004
		
2005
		
2006
		if (!$entry->requireApproval())
2007
		{
2008
			// ex : retirer des RTT en fonction des arret maladie, l'absences maladie est cree par le gestionnaire sans approbation
2009
			$entry->applyDynamicRight();
2010
			
2011
			// notify owner and other emails about the confirmed vacation request
2012
			$entry->notifyOwner();
2013
			
2014
			
2015
			if ($modify)
2016
			{
2017
				$text = absences_translate('The %s has been modified without approval');
2018
			} else {
2019
				$text = absences_translate('The %s has been created without approval');
2020
			}
2021
			
2022
			
2023
			$entry->addMovement(sprintf($text, $entry->getTitle()));
2024
			return false;
2025
		} else {
2026
		    
2027
		    
2028
		    if ($modify)
2029
		    {
2030
		        $text = absences_translate('The %s has been modified');
2031
		    } else {
2032
		        $text = absences_translate('The %s has been created');
2033
		    }
2034
		    
2035
		    $entry->addMovement(sprintf($text, $entry->getTitle()));
2036
		}
2037
		
2038
		
2039
		if (!$entry->createApprobationInstance()) {
2040
		    // impossible de crer une instance, 
2041
		    // l'utilisateur peut etre en auto-approbation ou le schema ne retourne aucun approbateur
2042
    		$entry->status = 'Y';
2043
    		$entry->onConfirm();
2044
    		$entry->save();
2045
		}
2046
		
2047
		
2048
		
2049
		return true;
2050
	}
2051
	
2052
	
2053
	
2054 View Code Duplication
	public static function gotoList()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2055
	{
2056
		require_once $GLOBALS['babInstallPath'].'utilit/urlincl.php';
2057
		
2058
		$url = bab_url::get_request('tg');
2059
		$url->idx = 'lvreq';
2060
		$url->location();
2061
	}
2062
2063
}
2064
2065
2066
2067
2068
2069
2070
2071
2072
/**
2073
 * Test period validity
2074
 * verifie qu'il n'y a pas de chevauchements de periodes
2075
 * 
2076
 * @param int $id_entry
2077
 * @param int $id_user
2078
 * @param int $begin
2079
 * @param int $end
2080
 * @return boolean
2081
 */
2082
function test_periodValidity($id_entry,$id_user,$begin,$end)
2083
{
2084
	global $babBody, $babDB;
2085
	
2086
	if( $begin >= $end)
2087
		{
2088
		$babBody->msgerror = absences_translate("ERROR: End date must be older")." !";
2089
		return false;
2090
		}
2091
		
2092
2093
	$date_begin = date('Y-m-d H:i:s',$begin);
2094
	$date_end = date('Y-m-d H:i:s',$end);
2095
2096
	$req = "SELECT
2097
				COUNT(*)
2098
		FROM ".ABSENCES_ENTRIES_TBL."
2099
			WHERE
2100
			id_user='".$babDB->db_escape_string($id_user)."'
2101
			AND date_begin < '".$babDB->db_escape_string($date_end)."'  
2102
			AND date_end > '".$babDB->db_escape_string($date_begin)."' 
2103
			AND id <> '".$babDB->db_escape_string($id_entry)."'
2104
			AND status<>'N'";
2105
2106
	$res = $babDB->db_query($req);
2107
	list($n) = $babDB->db_fetch_array($res);
2108
2109
	if ($n > 0) {
2110
		$babBody->msgerror = absences_translate("ERROR: a request is already defined on this period");
2111
		return false;
2112
	}
2113
2114
	return true;
2115
}
2116
2117
/**
2118
 * Test period validaity from posted first step
2119
 * @return boolean
2120
 */
2121
function test_period()
2122
{
2123
global $babBody;
2124
include_once $GLOBALS['babInstallPath']."utilit/dateTime.php";
2125
2126
if (!isset($_POST['daybegin']) ||
2127
	!isset($_POST['monthbegin']) ||
2128
	!isset($_POST['yearbegin']) ||
2129
	!isset($_POST['hourbegin']) ||
2130
	!isset($_POST['dayend']) ||
2131
	!isset($_POST['monthend']) ||
2132
	!isset($_POST['yearend']) ||
2133
	!isset($_POST['hourend']) ||
2134
	!isset($_POST['id_user'])
2135
	)
2136
	{
2137
	$babBody->msgerror = absences_translate("Error");
2138
	return false;
2139
	}
2140
2141
	$yearbegin = $_POST['year'] + $_POST['yearbegin'] - 1;
2142
	$yearend = $_POST['year'] + $_POST['yearend'] - 1;
2143
2144
	$begin	= BAB_DateTime::fromIsoDateTime($yearbegin.'-'.$_POST['monthbegin'].'-'.$_POST['daybegin'].' '.$_POST['hourbegin']);
2145
	$end	= BAB_DateTime::fromIsoDateTime($yearend.'-'.$_POST['monthend'].'-'.$_POST['dayend'].' '.$_POST['hourend']);
2146
2147
	$id_entry = isset($_POST['id']) ? $_POST['id'] : 0;
2148
2149
return test_periodValidity($id_entry, $_POST['id_user'], $begin->getTimeStamp(), $end->getTimeStamp());
2150
}
2151
2152
2153
2154
2155
/**
2156
 * Get posted date from the first step edit form or from the hidden field
2157
 *
2158
 */
2159
class absences_PostedDate
2160
{
2161
	/**
2162
	 * @return string ISO datetime
2163
	 */
2164
	public static function begin()
2165
	{
2166
		if (isset($_POST['daybegin']))
2167
		{
2168
			$yearbegin = $_POST['year'] + $_POST['yearbegin'] -1;
2169
			return $yearbegin.'-'.$_POST['monthbegin'].'-'.$_POST['daybegin'].' '.$_POST['hourbegin'];
2170
		}
2171
		
2172
		if (isset($_POST['begin']))
2173
		{
2174
			return $_POST['begin'];
2175
		}
2176
		
2177
		if (isset($_POST['period']))
2178
		{
2179
			return key($_POST['period']);
2180
		}
2181
	}
2182
	
2183
	/**
2184
	 * @return string ISO datetime
2185
	 */
2186
	public static function end()
2187
	{
2188
		if (isset($_POST['dayend']))
2189
		{
2190
			
2191
			$yearend = $_POST['year'] + $_POST['yearend'] -1;
2192
			return $yearend.'-'.$_POST['monthend'].'-'.$_POST['dayend'].' '.$_POST['hourend'];
2193
		}
2194
		
2195
		if (isset($_POST['end']))
2196
		{
2197
			return $_POST['end'];
2198
		}
2199
		
2200
		if (isset($_POST['period']))
2201
		{
2202
			return reset($_POST['period']);
2203
		}
2204
	}
2205
}
2206
2207
2208
2209
2210 View Code Duplication
function absences_workperiodGotoList()
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2211
{
2212
    $agent = absences_Agent::getCurrentUser();
2213
    
2214
    if (!empty($_POST['workperiod']['id_user'])) {
2215
        
2216
        
2217
        if ($agent->isManager()) {
2218
            $url = new bab_url(absences_addon()->getUrl().'vacadmwd');
2219
            $url->location();
2220
            return;
2221
        }
2222
        
2223
        //TODO: liste des demandes de l'entite si gestionnaire delegue
2224
    }
2225
    
2226
    $url = bab_url::get_request('tg');
2227
    $url->idx = 'lvreq';
2228
    $url->location();
2229
}
2230
2231
2232
2233
2234
/**
2235
 * Save form
2236
 * @param array 							$workperiod
2237
 * @param absences_WorkperiodRecoverRequest	$workperiodRecover
2238
 * @throws Exception
2239
 */
2240
function absences_saveWorkperiodRecoverRequest(Array $workperiod, absences_WorkperiodRecoverRequest $workperiodRecover = null)
2241
{
2242
	$babBody = bab_getInstance('babBody');
2243
	/* @var $babBody babBody */
2244
	
2245
	if (absences_lockedForMainteance())
2246
	{
2247
		return false;
2248
	}
2249
	
2250
	
2251
	if (!absences_WorkperiodRecoverRequest::checkForm($workperiod, $workperiodRecover))
2252
	{
2253
		return false;
2254
	}
2255
	
2256
	
2257
	
2258
	
2259
	
2260
	$type = absences_WorkperiodType::getFromId($workperiod['id_type']);
2261
	
2262
	if (!$type->getRow())
2263
	{
2264
		throw new Exception(absences_translate('This type does not exits'));
2265
	}
2266
	
2267
	$agent = absences_Agent::getCurrentUser();
2268
	
2269
	if (!isset($workperiodRecover))
2270
	{
2271
		$workperiodRecover = new absences_WorkperiodRecoverRequest();
2272
		
2273
		if (!empty($workperiod['id_user'])) {
2274
    		$spoofed = absences_Agent::getFromIdUser($workperiod['id_user']);
2275
    		if (!$agent->isManager() && !$agent->isSuperiorOf($spoofed)) {
2276
    		    throw new Exception(absences_translate('This type does not exits'));
2277
    		}
2278
    		
2279
    		$workperiodRecover->id_user = $spoofed->getIdUser();
2280
    		
2281
		} else {
2282
		    $workperiodRecover->id_user = bab_getUserId();
2283
		}
2284
	}
2285
	
2286
	$workperiodRecover->date_begin = absences_dateTimeForm($workperiod['datebegin'], $workperiod['hourbegin']);
2287
	$workperiodRecover->date_end = absences_dateTimeForm($workperiod['dateend'], $workperiod['hourend']);
2288
	$workperiodRecover->id_type = $type->id;
2289
	$workperiodRecover->comment = $workperiod['comment'];
2290
	$workperiodRecover->quantity = $type->quantity;
0 ignored issues
show
Documentation introduced by
The property quantity does not exist on object<absences_WorkperiodType>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
2291
	$workperiodRecover->quantity_unit = $type->quantity_unit;
0 ignored issues
show
Documentation introduced by
The property quantity_unit does not exist on object<absences_WorkperiodType>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
2292
	$workperiodRecover->status = 'Y';
2293
	$workperiodRecover->id_right = 0;
2294
	$workperiodRecover->save();
2295
	
2296
2297
	if ($workperiodRecover->createApprobationInstance())
2298
	{
2299
		$babBody->addNextPageMessage(absences_translate('Your workperiod recovery request has been sent for approval'));
0 ignored issues
show
Documentation introduced by
absences_translate('Your...een sent for approval') is of type string, but the function expects a object<unknown_type>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
2300
	} else {
2301
		$babBody->addNextPageMessage(absences_translate('Your workperiod recovery request has been saved without approval'));
0 ignored issues
show
Documentation introduced by
absences_translate('Your...aved without approval') is of type string, but the function expects a object<unknown_type>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
2302
	}
2303
	
2304
	$defer = (bool) absences_getVacationOption('approb_email_defer');
2305
	
2306
	if (!$defer)
2307
	{
2308
		require_once dirname(__FILE__).'/utilit/request.notify.php';
2309
		absences_notifyRequestApprovers();
2310
	}
2311
2312
	
2313
	absences_workperiodGotoList();
2314
}
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
/**
2326
 * Display form
2327
 */
2328
function absences_createWorkperiodRecoverRequest()
2329
{
2330
	require_once dirname(__FILE__).'/utilit/workperiod_recover_request.class.php';
2331
	require_once dirname(__FILE__).'/utilit/workperiod_recover_request.ui.php';
2332
	
2333
	
2334
	$babBody = bab_getBody();
2335
	
2336
	
2337
	
2338
	$agent = absences_Agent::getCurrentUser();
2339
	
2340
	if ($id_user = (int) bab_rp('id_user')) {
2341
	    $spoofed = absences_Agent::getFromIdUser($id_user);
2342
	    if (!$agent->isManager() && !$agent->isSuperiorOf($spoofed)) {
2343
	        return $babBody->addError('Spoofing failed workperiod recover request creation, you must be superior of the spoofed agent');
2344
	    }
2345
	    
2346
	    $agent = $spoofed;
2347
	}
2348
	
2349
	
2350
	
2351
	$request = null;
2352
	$id = bab_rp('id', null);
2353
	if (isset($id))
2354
	{
2355
		$request = absences_WorkperiodRecoverRequest::getById($id);
2356
		if (!$request->canModify())
2357
		{
2358
			return;
2359
		}
2360
	} else if (!$agent->canCreateWorkperiodRecoverRequest()) {
2361
		return $babBody->addError('Agent not allowed to create workperiod recover requests');
2362
	}
2363
	
2364
	
2365
	if (!isset($request) && $id_user) {
2366
	    $request = new absences_WorkperiodRecoverRequest();
2367
	    $request->id_user = $id_user;
2368
	}
2369
	
2370
	
2371
	$W = bab_Widgets();
2372
	$page = $W->BabPage();
2373
	
2374 View Code Duplication
	if (isset($_POST['workperiod']))
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2375
	{
2376
		if ( isset($_POST['workperiod']['cancel']) )
2377
		{
2378
			absences_workperiodGotoList();
2379
		}
2380
	
2381
	
2382
		if( isset($_POST['workperiod']['save'] ))
2383
		{
2384
			try {
2385
				absences_saveWorkperiodRecoverRequest($_POST['workperiod'], $request);
2386
				
2387
			} catch (Exception $e)
2388
			{
2389
				$page->addError($e->getMessage());
2390
			}
2391
		}
2392
	}
2393
	
2394
	
2395
	$page->setTitle(absences_translate('Create a working days report entitling recovery'));
2396
	
2397 View Code Duplication
	if (absences_lockedForMainteance())
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2398
	{
2399
		$page->addError(absences_getMaintenanceMessage());
2400
		
2401
	} else {
2402
	
2403
		$editor = new absences_WorkperiodRecoverRequestEditor($request, isset($spoofed), false);
2404
		$page->addItem($editor);
2405
		
2406
	}
2407
	
2408
	$page->displayHtml();
2409
}
2410
2411
2412
2413
2414 View Code Duplication
function absences_cetGotoList()
0 ignored issues
show
Best Practice introduced by
The function absences_cetGotoList() has been defined more than once; this definition is ignored, only the first definition in programs/vacadmcet.php (L152-159) is considered.

This check looks for functions that have already been defined in other files.

Some Codebases, like WordPress, make a practice of defining functions multiple times. This may lead to problems with the detection of function parameters and types. If you really need to do this, you can mark the duplicate definition with the @ignore annotation.

/**
 * @ignore
 */
function getUser() {

}

function getUser($id, $realm) {

}

See also the PhpDoc documentation for @ignore.

Loading history...
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2415
{
2416
    $agent = absences_Agent::getCurrentUser();
2417
2418
    if (!empty($_POST['cet']['id_user'])) {
2419
2420
2421
        if ($agent->isManager()) {
2422
            $url = new bab_url(absences_addon()->getUrl().'vacadmcet');
2423
            $url->location();
2424
            return;
2425
        }
2426
2427
        //TODO: liste des demandes de l'entite si gestionnaire delegue
2428
    }
2429
2430
    $url = bab_url::get_request('tg');
2431
    $url->idx = 'lvreq';
2432
    $url->location();
2433
}
2434
2435
2436
/**
2437
 * Save a CET request
2438
 * 
2439
 * 
2440
 * @param array 					 $cet					posted form
2441
 * @param absences_CetDepositRequest $cet_deposit_request	Current request to modify or null for new request
2442
 */
2443
function absences_saveCetDepositRequest(Array $cet, absences_CetDepositRequest $cet_deposit_request = null)
2444
{
2445
	require_once $GLOBALS['babInstallPath'].'utilit/wfincl.php';
2446
	require_once dirname(__FILE__).'/utilit/agent_right.class.php';
2447
	
2448
	$babBody = bab_getInstance('babBody');
2449
	/* @var $babBody babBody */
2450
	
2451
	
2452
	if (absences_lockedForMainteance())
2453
	{
2454
		return false;
2455
	}
2456
	
2457
2458
	$quantity = (float) str_replace(',', '.', $cet['quantity']);
2459
	$agent_right = absences_AgentRight::getById((int) $cet['id_agent_right_source']);
2460
	
2461
	
2462
	$agent = $agent_right->getAgent();
2463
	
2464
	if (!isset($cet['id_user']) && bab_getUserId() !== $agent->getIdUser())
2465
	{
2466
		throw new Exception('Not accessible agentRight');
2467
	}
2468
	
2469
	if (isset($cet['id_user']))
2470
	{
2471
	    $currentUser = absences_Agent::getCurrentUser();
2472
	    if (!$currentUser->isManager() && !$currentUser->isSuperiorOf($agent)) {
2473
	        throw new Exception(absences_translate('Access denied to this account'));
2474
	    }
2475
	}
2476
	
2477
	
2478
	$AgentCet = $agent->Cet();
2479
	if (!$AgentCet->testDepositQuantity($agent_right, $quantity))
2480
	{
2481
		return false;
2482
	}
2483
	
2484
	
2485
	
2486
	if (!isset($cet_deposit_request))
2487
	{
2488
		// create the request
2489
		$cet_deposit_request = new absences_CetDepositRequest();
2490
	}
2491
	
2492
	$cet_deposit_request->id_user 				= $agent->getIdUser();
2493
	$cet_deposit_request->id_agent_right_cet 	= $AgentCet->getDepositAgentRight()->id;
2494
	$cet_deposit_request->id_agent_right_source = $agent_right->id;
2495
	$cet_deposit_request->quantity				= $quantity;
2496
	$cet_deposit_request->idfai					= 0;
2497
	$cet_deposit_request->comment				= $cet['comment'];
2498
	$cet_deposit_request->status				= 'Y';
2499
	
2500
	$cet_deposit_request->save();
2501
	
2502
2503
	if ($cet_deposit_request->createApprobationInstance())
2504
	{
2505
		$babBody->addNextPageMessage(absences_translate('Your time saving account deposit has been sent for approval'));
0 ignored issues
show
Documentation introduced by
absences_translate('Your...een sent for approval') is of type string, but the function expects a object<unknown_type>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
2506
	} else {
2507
		$babBody->addNextPageMessage(absences_translate('Your time saving account deposit has been saved without approval'));
0 ignored issues
show
Documentation introduced by
absences_translate('Your...aved without approval') is of type string, but the function expects a object<unknown_type>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
2508
	}
2509
	
2510
	
2511
	$defer = (bool) absences_getVacationOption('approb_email_defer');
2512
	
2513
	if (!$defer)
2514
	{
2515
		require_once dirname(__FILE__).'/utilit/request.notify.php';
2516
		absences_notifyRequestApprovers();
2517
	}
2518
	
2519
	absences_cetGotoList();
2520
}
2521
2522
2523
2524
function absences_createCetDepositRequest()
2525
{
2526
	require_once dirname(__FILE__).'/utilit/cet_deposit_request.class.php';
2527
	require_once dirname(__FILE__).'/utilit/cet_deposit_request.ui.php';
2528
	
2529
	$agent = absences_Agent::getCurrentUser();
0 ignored issues
show
Unused Code introduced by
$agent is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
2530
	
2531
	$id = bab_rp('id', null);
2532
	$request = null;
2533
	
2534
	$W = bab_Widgets();
2535
	$page = $W->BabPage();
2536
	
2537
	if (isset($id))
2538
	{
2539
		$request = absences_CetDepositRequest::getById($id);
2540
		if (!$request->canModify())
2541
		{
2542
		    $page->addError(absences_translate('This request is not modifiable'));
2543
		    $page->displayHtml();
2544
			return;
2545
		}
2546
	} elseif (bab_rp('id_user')) {
2547
	    
2548
	    $request = new absences_CetDepositRequest();
2549
	    $request->id_user = bab_rp('id_user');
2550
	    $request->status = '';
2551
	    $request->quantity = 0;
2552
	    
2553
	    $agent = absences_Agent::getFromIdUser($request->id_user);
2554
	    
2555
	    if (!$agent->Cet()->canAdd()) {
2556
	        $page->addError(sprintf(absences_translate('%s is not allowed to use time saving account'), $agent->getName()));
2557
	        $page->displayHtml();
2558
	        return;
2559
	    }
2560
	}
2561
	
2562
	
2563
	
2564
	
2565
	
2566
	
2567
2568
	
2569 View Code Duplication
	if (isset($_POST['cet']))
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2570
	{
2571
		if ( isset($_POST['cet']['cancel']) )
2572
		{
2573
			absences_cetGotoList();
2574
		}
2575
	
2576
	
2577
		if( isset($_POST['cet']['save'] ))
2578
		{
2579
			try {
2580
				absences_saveCetDepositRequest($_POST['cet'], $request);
2581
			} catch (Exception $e)
2582
			{
2583
				$page->addError($e->getMessage());
2584
			}
2585
		}
2586
	}
2587
	
2588
	if (isset($request) && $request->id)
2589
	{
2590
		$page->setTitle(absences_translate('Edit the time saving account deposit'));
2591
	} else {
2592
		$page->setTitle(absences_translate('Request a deposit in my time saving account'));
2593
	}
2594
2595 View Code Duplication
	if (absences_lockedForMainteance())
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2596
	{
2597
		$page->addError(absences_getMaintenanceMessage());
2598
2599
	} else {
2600
	
2601
		$editor = new absences_CetDepositRequestEditor($request, isset($_REQUEST['id_user']));
2602
		$page->addItem($editor);
2603
	}
2604
	
2605
	$page->displayHtml();
2606
}
2607
2608
2609
2610
2611
2612
2613
2614
/**
2615
 * Display a menu to create vacation request, CET request, workingdays recovery request
2616
 * @return string
2617
 */
2618
function absences_requestMenu()
2619
{
2620
	$toolbar = absences_getToolbar();
2621
	$agent = absences_Agent::getCurrentUser();
2622
	$addon = absences_addon();
2623
	
2624
	$sImgPath = $GLOBALS['babInstallPath'] . 'skins/ovidentia/images/Puces/';
2625
	
2626
	
2627
	
2628
	$toolbar->addToolbarItem(
2629
			new BAB_ToolbarItem(absences_translate('Request a vacation'), $addon->getUrl().'vacuser&idx=period',
2630
					$sImgPath . 'edit_add.png', '', '', '')
2631
	);
2632
	
2633 View Code Duplication
	if ($agent->canCreateWorkperiodRecoverRequest()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2634
		$toolbar->addToolbarItem(
2635
				new BAB_ToolbarItem(absences_translate("Recovery request"), $addon->getUrl().'vacuser&idx=workperiod',
2636
						$sImgPath . 'edit_add.png', '', '', '')
2637
		);
2638
	}
2639
	
2640 View Code Duplication
	if ($agent->Cet()->canAdd()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2641
		$toolbar->addToolbarItem(
2642
				new BAB_ToolbarItem(absences_translate("Deposit on my time saving account"), $addon->getUrl().'vacuser&idx=cet',
2643
						$sImgPath . 'edit_add.png', '', '', '')
2644
		);
2645
	}
2646
	
2647
	return $toolbar->printTemplate();
2648
}
2649
2650
2651
2652
function absences_personalMovements()
2653
{
2654
	require_once dirname(__FILE__).'/utilit/agent.class.php';
2655
	require_once dirname(__FILE__).'/utilit/agent.ui.php';
2656
	
2657
	$babBody = bab_getBody();
2658
	$agent = absences_Agent::getCurrentUser();
2659
	
2660
	
2661
	$list = new absences_AgentMovementList($agent);
2662
	
2663
	$babBody->setTitle(absences_translate('My history'));
2664
	
2665
	$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
2666
	$babBody->addItemMenu("movement", absences_translate("History"), absences_addon()->getUrl()."vacuser&idx=movement");
2667
	
2668
	if (absences_getVacationOption('user_add_email'))
2669
	{
2670
		$babBody->addItemMenu("options", absences_translate("Options"), absences_addon()->getUrl()."vacuser&idx=options");
2671
	}
2672
2673
	$babBody->babEcho($list->getHtml());
2674
}
2675
2676
2677
2678
2679
/**
2680
 * 
2681
 */
2682
function absences_personalOptions()
2683
{
2684
	global $babBody;
2685
	
2686
	require_once dirname(__FILE__).'/utilit/agent.class.php';
2687
	require_once dirname(__FILE__).'/utilit/agent.ui.php';
2688
	require_once $GLOBALS['babInstallPath'].'utilit/urlincl.php';
2689
	
2690
	$agent = absences_Agent::getCurrentUser();
2691
	
2692
	
2693
	
2694
	
2695
	
2696
	$W = bab_Widgets();
2697
	$page = $W->BabPage();
2698
	
2699
	
2700
	if ($options = bab_pp('options'))
2701
	{
2702
		$emails = $options['emails'];
2703
		$agent->setEmails($emails);
2704
		
2705
		$babBody->addNextPageMessage(absences_translate('The emails were saved'));
2706
		
2707
		$url = bab_url::get_request('tg', 'idx');
2708
		$url->location();
2709
	}
2710
	
2711
	
2712
	
2713
	$page->setTitle(absences_translate('My options'));
2714
	
2715
	$page->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
2716
	
2717
	if (absences_getVacationOption('display_personal_history'))
2718
	{
2719
		$page->addItemMenu("movement", absences_translate("History"), absences_addon()->getUrl()."vacuser&idx=movement");
2720
	}
2721
	
2722
	$page->addItemMenu("options", absences_translate("Options"), absences_addon()->getUrl()."vacuser&idx=options");
2723
	
2724
	
2725
	$editor = new absences_PersonalOptionsEditor;
2726
	$page->addItem($editor);
2727
	
2728
	
2729
	$page->displayHtml();
2730
}
2731
2732
2733
2734
2735
2736
2737
function absences_personalRights_addRightInTable(Widget_TableView $table, $row, absences_Right $right, absences_AgentRight $agentRight)
2738
{
2739
    $W = bab_Widgets();
2740
    $type = $right->getType();
2741
    
2742
    $icon = $W->Frame();
2743
    $icon->setCanvasOptions($icon->Options()->width(10,'px')->height(10,'px')->backgroundColor('#'.$type->color));
2744
    $icon->setTitle($type->name);
2745
2746
    $col = 0;
2747
    
2748
    $table->addItem($W->HBoxItems($icon,$W->Label($right->description))
2749
        ->setHorizontalSpacing(.8,'em')->setVerticalAlign('middle')									, $row, $col++);
2750
    $table->addItem($W->Label(absences_quantity($agentRight->getQuantity(), $right->quantity_unit))				, $row, $col++);
2751
    $table->addItem($W->Label(absences_quantity($agentRight->getConfirmedQuantity(), $right->quantity_unit))	, $row, $col++);
2752
    $table->addItem($W->Label(absences_quantity($agentRight->getWaitingQuantity(), $right->quantity_unit))		, $row, $col++);
2753
    $balance = $agentRight->getQuantity() - $agentRight->getConfirmedQuantity() - $agentRight->getWaitingQuantity();
2754
    $table->addItem($W->Label(absences_quantity($balance, $right->quantity_unit))								, $row, $col++);
2755
    $previsional = $agentRight->getPrevisionalQuantity();
2756
    $table->addItem($W->Label(absences_quantity($previsional, $right->quantity_unit))		                    , $row, $col++);
2757
    $table->addItem($W->Label(absences_quantity($balance - $previsional, $right->quantity_unit))		        , $row, $col++);
2758
    $table->addItem($W->Label(bab_shortDate(bab_mktime($right->date_begin), false))								, $row, $col++);
2759
    $table->addItem($W->Label(bab_shortDate(bab_mktime($right->date_end), false))								, $row, $col++);
2760
}
2761
2762
2763
2764
function absences_personalRights()
2765
{
2766
	$W = bab_Widgets();
2767
	$agent = absences_Agent::getCurrentUser();
2768
	
2769
	if (!$agent->exists())
2770
	{
2771
		return;
2772
	}
2773
	
2774
	$page = $W->BabPage()->setEmbedded(false);
2775
	$page->setTitle(absences_translate('My vacations rights'));
2776
	
2777
	$table = $W->BabTableView();
2778
	
2779
	$row = 0;
2780
	$col = 0;
2781
	$table->addHeadRow(0);
2782
	
2783
	$table->addItem($W->Label(absences_translate('Description'))	, $row, $col++);
2784
	$table->addItem($W->Label(absences_translate('Rights'))			, $row, $col++);
2785
	$table->addItem($W->Label(absences_translate('Consumed'))		, $row, $col++);
2786
	$table->addItem($W->Label(absences_translate('Waiting'))		, $row, $col++);
2787
	$table->addItem($W->Label(absences_translate('Balance'))		, $row, $col++);
2788
	$table->addItem($W->Label(absences_translate('Previsional'))	, $row, $col++);
2789
	$table->addItem($W->Label(absences_translate('Previ. Bal.'))	, $row, $col++);
2790
	$table->addItem($W->Label(absences_translate('Begin date'))		, $row, $col++);
2791
	$table->addItem($W->Label(absences_translate('End date'))		, $row, $col++);
2792
	$row++;	
2793
	
2794
	$I = $agent->getAgentRightUserIterator();
2795
	
2796
	$rows = array();
2797
	
2798
	foreach($I as $agentRight)
2799
	{
2800
		
2801
	    $right = $agentRight->getRight();
2802
		$rgroup = $right->getRgroupLabel();
2803
2804
2805
		if ($rgroup)
2806
		{
2807
			if (!isset($rows['rgroup'.$right->id_rgroup])) {
2808
    			$rows['rgroup'.$right->id_rgroup] = array(
2809
    			    'sortkey' => $right->getRgroupSortkey(),
2810
    			    'rgroup' => array()
2811
    			);
2812
			}
2813
			
2814
			$rows['rgroup'.$right->id_rgroup]['rgroup'][] = $agentRight;
2815
			continue;
2816
		}
2817
		
2818
		$rows['right'.$right->id] = array(
2819
		    'sortkey' => $right->sortkey,
2820
		    'agentRight' => $agentRight
2821
		);		
2822
	}
2823
	
2824
	bab_Sort::asort($rows, 'sortkey');
2825
	
2826
	foreach($rows as $arr_row) {
2827
	    
2828
	    if (isset($arr_row['rgroup'])) {
2829
	        $rgroup = reset($arr_row['rgroup'])->getRight()->getRgroupLabel();
2830
	        $table->addItem($W->Label($rgroup)->addClass('widget-strong'), $row, 0, -1, 9);
2831
	        $row++;
2832
	        
2833
	        foreach($arr_row['rgroup'] as $agentRight) {
2834
	            $right = $agentRight->getRight();
2835
	            $right->description = bab_nbsp().bab_nbsp().bab_nbsp().bab_nbsp().$right->description;
2836
	            absences_personalRights_addRightInTable($table, $row, $right, $agentRight);
2837
	            $row++;
2838
	        }
2839
	        
2840
	        continue;
2841
	    }
2842
	    
2843
	    
2844
	    $agentRight = $arr_row['agentRight'];
2845
	    $right = $agentRight->getRight();
2846
	    
2847
	    absences_personalRights_addRightInTable($table, $row, $right, $agentRight);
2848
	    $row++;
2849
	}
2850
	
2851
	
2852
	
2853
	
2854
	$page->addItem($table);
2855
	$print = $W->Link($W->Icon(absences_translate('Print'), Func_Icons::ACTIONS_DOCUMENT_PRINT), 'javascript:window.print()');
2856
	$page->addItem($W->Frame()->addClass(Func_Icons::ICON_LEFT_16)->addClass('widget-align-center')->addItem($print));
2857
	
2858
	$page->displayHtml();
2859
}
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
/**
2870
 * @param string $date
2871
 * @return array
2872
 */
2873
function absences_getDayWorkingHours($date)
2874
{
2875
    require_once $GLOBALS['babInstallPath'].'utilit/dateTime.php';
2876
    
2877
    $id_user = bab_gp('id_user');
2878
    $agent = absences_Agent::getFromIdUser(bab_getUserId());
2879
    
2880
    if ($id_user != $agent->getIdUser() && !absences_IsUserUnderSuperior($id_user) && !$agent->isManager()) {
2881
        throw new Exception('Access denied');
2882
    }
2883
    
2884
    $wh = bab_functionality::get('WorkingHours');
2885
    /* @var $wh Func_WorkingHours */
2886
    
2887
    $begin = BAB_DateTime::fromIsoDateTime(bab_gp('date').' 00:00:00');
2888
    $end = clone $begin;
2889
    $end->add(1, BAB_DATETIME_DAY);
2890
    
2891
    return $wh->selectPeriods($id_user, $begin, $end);
2892
}
2893
2894
2895
2896
2897
2898
2899
2900
2901
/**
2902
 * Create or edit a request period 
2903
 * first step of a vacation request
2904
 */
2905
function absences_requestPeriod()
2906
{
2907
	include_once dirname(__FILE__)."/utilit/planningincl.php";
2908
	global $babBody;
2909
	$agent = absences_Agent::getCurrentUser();
2910
	
2911
	
2912
	
2913
	
2914
	
2915
	
2916
	if (!empty($_REQUEST['id']))
2917
	{
2918
		// request modification
2919
		
2920
		
2921 View Code Duplication
		if (bab_rp('rfrom'))
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2922
		{
2923
			if ($agent->isManager() && !bab_rp('ide'))
2924
			{
2925
				// request modification from a manager
2926
			
2927
				$babBody->addItemMenu("menu", absences_translate("Management"), absences_addon()->getUrl()."vacadm&idx=menu");
2928
				$babBody->addItemMenu("lper", absences_translate("Requests"), absences_addon()->getUrl()."vacadmb&idx=lreq");
2929
				$babBody->addItemMenu("period", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=period");
2930
			}
2931
			
2932
			if ($agent->isEntityManager() && bab_rp('ide'))
2933
			{
2934
				// request modification from a delegated manager
2935
			
2936
				$babBody->addItemMenu("entities", absences_translate("Delegated management"), absences_addon()->getUrl()."vacchart&idx=entities");
2937
				$babBody->addItemMenu("entity_members", absences_translate("Entity requests"), absences_addon()->getUrl()."vacchart&idx=entity_requests&ide=".bab_rp('ide'));
2938
				$babBody->addItemMenu("period", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=period&ide=".bab_rp('ide'));
2939
			}
2940
			
2941
			
2942
		} else {
2943
			
2944
			// request modification from agent
2945
		
2946
			$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
2947
			$babBody->addItemMenu("period", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=period&id=".bab_rp('id'));
2948
			
2949
			if( $agent->isManager())
2950
			{
2951
				$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
2952
			}
2953
			if ($agent->isEntityManager())
2954
			{
2955
				$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
2956
			}
2957
		
2958
		
2959
		}
2960
		
2961
		
2962
		$babBody->setTitle(absences_translate("Edit vacation request"));
2963
		
2964
		if (absences_lockedForMainteance())
2965
		{
2966
			$babBody->addError(absences_getMaintenanceMessage());
2967
			return false;
2968
		}
2969
		
2970
		
2971
		$id_user = bab_isEntryEditable($_REQUEST['id']);
2972
		if (!$id_user)
2973
		{
2974
			$babBody->addError(absences_translate("Access denied, this request is not modifiable"));
2975
			return false;
2976
		}
2977 View Code Duplication
		else
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2978
		{
2979
			absences_viewVacationCalendar(array($id_user), true, true, bab_rp('nbmonth', 12), false);
2980
			period($id_user, $_REQUEST['id']);
2981
			return true;
2982
		}
2983
	}
2984
	else
2985
	{
2986
		
2987
		// request creation
2988
		
2989
		if (isset($_GET['idu']) && is_numeric($_GET['idu'])) {
2990
			$id_user = $_GET['idu']; // deprecated?
2991
		}
2992 View Code Duplication
		else {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2993
			$id_user = bab_rp('id_user', bab_getUserId());
2994
			
2995
			if (bab_rp('rfrom'))
2996
			{
2997
			
2998
				if ($agent->isManager() && !bab_rp('ide'))
2999
				{
3000
					// request creation from a manager
3001
					
3002
					$babBody->addItemMenu("menu", absences_translate("Management"), absences_addon()->getUrl()."vacadm&idx=menu");
3003
					$babBody->addItemMenu("lper", absences_translate("Personnel"), absences_addon()->getUrl()."vacadm&idx=lper");
3004
					$babBody->addItemMenu("period", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=period");
3005
				}
3006
				
3007
				if ($agent->isEntityManager() && bab_rp('ide'))
3008
				{
3009
					// request creation from a delegated manager
3010
					
3011
					$babBody->addItemMenu("entities", absences_translate("Delegated management"), absences_addon()->getUrl()."vacchart&idx=entities");
3012
					$babBody->addItemMenu("entity_members", absences_translate("Entity members"), absences_addon()->getUrl()."vacchart&idx=entity_members&ide=".bab_rp('ide'));
3013
					$babBody->addItemMenu("period", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=period");
3014
				}
3015
			
3016
			} else {
3017
				
3018
				// request creation from agent
3019
				
3020
				$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3021
				$babBody->addItemMenu("period", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=period");
3022
				
3023
				
3024
				if( $agent->isManager())
3025
				{
3026
					$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3027
				}
3028
				if ($agent->isEntityManager())
3029
				{
3030
					$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3031
				}
3032
				
3033
			}
3034
		}
3035
		
3036
		
3037
		if ($id_user == bab_getUserId())
3038
		{
3039
			$babBody->setTitle(absences_translate("Request vacation"));
3040
		} else {
3041
			$babBody->setTitle(absences_translate("Request vacation for another user")); // rfrom=1
3042
		}
3043
		
3044
		if (absences_lockedForMainteance())
3045
		{
3046
			$babBody->addError(absences_getMaintenanceMessage());
3047
			return false;
3048
		}
3049
		
3050
	
3051 View Code Duplication
		if (bab_vacRequestCreate($id_user)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3052
			absences_viewVacationCalendar(array($id_user), true, true, bab_rp('nbmonth', 12), false);
3053
			period($id_user);
3054
			return true;
3055
		}
3056
	}
3057
	
3058
	$babBody->addError(absences_translate("Access denied, no access to create a request"));
3059
	return false;
3060
}
3061
3062
3063
3064
3065
3066
/* main */
3067
bab_requireCredential();
3068
$agent = absences_Agent::getCurrentUser();
3069
$idx = bab_rp('idx', "lvreq");
3070
3071
3072 View Code Duplication
if(!$agent->isInPersonnel() && !$agent->isEntityManager() && !$agent->isManager())
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3073
	{
3074
	$babBody->msgerror = absences_translate("Access denied");
3075
	return;
3076
	}
3077
3078
3079
3080
if (isset($_POST['action']))
3081
{
3082
switch ($_POST['action'])
3083
	{
3084
	case 'period':
3085
		if (!test_period()) {
3086
			$idx = 'period';
3087
		}
3088
		break;
3089
3090
	case 'vacation_request':
3091
		
3092
		$id = bab_pp('id');
3093
		
3094
		if (bab_isEntryEditable($id))
3095
		{
3096
		if(!absences_saveVacation::save()) {
3097
			$idx = "vunew";
3098
			}
3099
		elseif ($_POST['id_user'] == bab_getUserId())
3100
			{
3101
			// demande pour moi meme, retour a la liste de mes demandes
3102
			header("Location: ". absences_addon()->getUrl()."vacuser&idx=lvreq");
3103
			exit;
3104
			}
3105 View Code Duplication
		elseif ($id)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3106
			{
3107
			// modification d'une demande, retour liste des demandes	
3108
			if (bab_pp('ide')) {
3109
				header("Location: ". absences_addon()->getUrl().'vacchart&idx=entity_requests&ide='.bab_pp('ide'));
3110
				exit;
3111
			}
3112
3113
			header("Location: ". absences_addon()->getUrl()."vacadmb&idx=lreq");
3114
			exit;
3115
			}
3116 View Code Duplication
		else 
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3117
			{
3118
			// creation d'une demande, retour a la liste des agents
3119
			if (bab_pp('ide')) {
3120
				header("Location: ". absences_addon()->getUrl().'vacchart&idx=entity_members&ide='.bab_pp('ide'));
3121
				exit;
3122
			}
3123
			
3124
			header("Location: ". absences_addon()->getUrl()."vacadm&idx=lper");
3125
			exit;
3126
			}
3127
		}
3128
		break;
3129
3130
	case 'delete_request':
3131
		
3132
		if ($id_entry = bab_pp('id_entry'))
3133
		{
3134
			$id_user = bab_isEntryEditable($id_entry);
3135
			if ($id_user || $agent->isManager())
3136
			{
3137
				if (absences_delete_request(bab_pp('id_entry'), bab_pp('folder', 0), (int) bab_pp('rfrom', 0)))
3138
				{
3139
					header("Location: ". bab_pp('url'));
3140
					exit;
3141
				} else {
3142
					$babBody->addError(absences_translate('Failed to delete the vacation request'));
3143
				}
3144
			}
3145
		}
3146
		
3147
		
3148 View Code Duplication
		if ($id_deposit = bab_pp('id_deposit'))
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3149
		{
3150
			require_once dirname(__FILE__).'/utilit/cet_deposit_request.class.php';
3151
			$deposit = absences_CetDepositRequest::getById($id_deposit);
3152
			if ($deposit->canDelete())
3153
			{
3154
				$deposit->delete();
3155
				$url = new bab_url(bab_pp('url'));
3156
				$url->location();
3157
			}
3158
		}
3159
		
3160
		
3161 View Code Duplication
		if ($id_recovery = bab_pp('id_recovery'))
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3162
		{
3163
			require_once dirname(__FILE__).'/utilit/workperiod_recover_request.class.php';
3164
			$recovery = absences_WorkperiodRecoverRequest::getById($id_recovery);
3165
			if ($recovery->canDelete())
3166
			{
3167
				$recovery->delete();
3168
				$url = new bab_url(bab_pp('url'));
3169
				$url->location();
3170
			}
3171
		}
3172
		
3173
		break;
3174
	}
3175
}
3176
3177
3178
3179
3180
3181
switch($idx)
3182
	{
3183
3184
	case "unload":
3185
		vedUnload();
3186
		exit;
3187
		break;
3188
3189 View Code Duplication
	case "morve":
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3190
		require_once dirname(__FILE__).'/utilit/request.ui.php';
3191
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3192
		$babBody->addItemMenu("morve", absences_translate("View request"), absences_addon()->getUrl()."vacuser&idx=lvreq&id=".bab_rp('id'));
3193
		absences_viewVacationRequestDetail(bab_rp('id'));
3194
		break;
3195
		
3196 View Code Duplication
	case 'view_cet_deposit':
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3197
		require_once dirname(__FILE__).'/utilit/request.ui.php';
3198
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3199
		$babBody->addItemMenu("view_cet_deposit", absences_translate("View request"), absences_addon()->getUrl()."vacuser&idx=view_cet_deposit&id=".bab_rp('id'));
3200
		absences_viewCetDepositDetail(bab_rp('id'));
3201
		break;
3202
3203 View Code Duplication
	case 'view_wp_recovery':
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3204
		require_once dirname(__FILE__).'/utilit/request.ui.php';
3205
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3206
		$babBody->addItemMenu("view_wp_recovery", absences_translate("View request"), absences_addon()->getUrl()."vacuser&idx=view_wp_recovery&id=".bab_rp('id'));
3207
		absences_viewWpRecoveryDetail(bab_rp('id'));
3208
		break;
3209
		
3210
	case "period":
3211
		// demande, premiere etape
3212
		absences_requestPeriod();
3213
		break;
3214
		
3215
		
3216
	case 'recurring':
3217
		if( bab_isEntryEditable($_POST['id']) )
3218
		{
3219
			absences_recurringVacation(absences_PostedDate::begin(), absences_PostedDate::end(), $_POST['id']);
3220
			
3221
			$babBody->addItemMenu("recurring", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=vunew");
3222
			$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3223
		}
3224
		if($agent->isManager())
3225
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3226
		if ($agent->isEntityManager())
3227
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3228
		break;
3229
3230
	case "vunew":
3231
		// demande, deuxieme etape
3232
		requestVacation(absences_PostedDate::begin(), absences_PostedDate::end(), $_POST['id'], bab_pp('rfrom'), bab_pp('ide'));
3233
		break;
3234
3235
	case 'delete':
3236
		
3237
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3238
		
3239
		if ($id_entry = bab_rp('id_entry'))
3240
		{
3241
			$babBody->addItemMenu("delete", absences_translate("Delete request"), absences_addon()->getUrl()."vacuser&idx=delete&id_entry=".$id_entry);
3242
			absences_deleteVacationRequest($id_entry);
3243
		}
3244
		
3245
		if ($id_cetdeposit = bab_rp('id_cetdeposit'))
3246
		{
3247
			$babBody->addItemMenu("delete", absences_translate("Delete request"), absences_addon()->getUrl()."vacuser&idx=delete&id_cetdeposit=".$id_cetdeposit);
3248
			absences_deleteCetDepositRequest($id_cetdeposit);
3249
		}
3250
		
3251
		if ($id_recovery = bab_rp('id_recovery'))
3252
		{
3253
			$babBody->addItemMenu("delete", absences_translate("Delete request"), absences_addon()->getUrl()."vacuser&idx=delete&id_recovery=".$id_recovery);
3254
			absences_deleteWpRecoveryRequest($id_recovery);
3255
		}
3256
		
3257
		break;
3258
3259
	case 'viewrights':
3260
		if (absences_IsUserUnderSuperior($_GET['id_user']) || $agent->isManager()) {
3261
			$babBody->setTitle(absences_translate("Balance").' : '.bab_getUserName($_GET['id_user']));
3262
3263
			if (isset($_GET['ide'])) {
3264
				$babBody->addItemMenu("entity_members", absences_translate("Entity members"), absences_addon()->getUrl()."vacchart&idx=entity_members&ide=".$_GET['ide']);
3265
			}
3266
3267
			$babBody->addItemMenu("viewrights", absences_translate("Balance"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3268
			viewrights($_GET['id_user']);
3269
		} else {
3270
			$babBody->msgerror = absences_translate("Access denied");
3271
		}
3272
		break;
3273
3274
		
3275
	case 'subprev':
3276
		$id_entry = (int) bab_rp('id_entry');
3277
		if ($id_entry && bab_isEntryEditable($id_entry))
3278
		{
3279
			absences_saveVacation::createInstance($id_entry, false, true);
3280
			absences_saveVacation::gotoList();
3281
		} else {
3282
			$babBody->msgerror = absences_translate("Access denied to request modification");
3283
		}
3284
			
3285
		break;
3286
		
3287 View Code Duplication
	case 'workperiod':
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3288
		absences_createWorkperiodRecoverRequest();
3289
		
3290
		
3291
		if (!bab_rp('id_user')) {
3292
		  $babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3293
		}
3294
		
3295
		$babBody->addItemMenu("workperiod", absences_translate("Working day"), absences_addon()->getUrl()."vacuser&idx=workperiod");
3296
		
3297
		if( $agent->isManager())
3298
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3299
		
3300
		if ($agent->isEntityManager())
3301
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3302
		break;
3303
		
3304 View Code Duplication
	case 'cet':
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3305
		absences_createCetDepositRequest();
3306
		
3307
		if (!bab_rp('id_user')) {
3308
		    $babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3309
		}
3310
		
3311
		$babBody->addItemMenu("cet", absences_translate("Time saving account"), absences_addon()->getUrl()."vacuser&idx=cet");
3312
		
3313
		if( $agent->isManager())
3314
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3315
		
3316
		if ($agent->isEntityManager())
3317
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3318
		break;
3319
		
3320
	case 'movement':
3321
		
3322
		absences_personalMovements();
3323
		break;
3324
		
3325
	case 'options':
3326
		absences_personalOptions();
3327
		break;
3328
		
3329
	case 'myrights':
3330
		absences_personalRights();
3331
		die();
3332
		break;
3333
		
3334
		
3335
	case 'workinghours':
3336
	    require_once $GLOBALS['babInstallPath'].'utilit/json.php';
3337
	    echo bab_json_encode(absences_getDayWorkingHours(bab_gp('date')));
3338
	    die();
3339
3340
	case 'clear':
3341
		$babDB->db_query("TRUNCATE ".ABSENCES_CALENDAR_TBL);
3342
3343
	case "lvreq":
3344
	default:
3345
		$babBody->title = absences_translate("My already filed requests");
3346
		if( $agent->isInPersonnel() )
3347
		{
3348
			$babBody->babEcho(absences_requestMenu());
3349
			absences_listVacationRequests(bab_getUserId(), false);
3350
			$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3351
			if (absences_getVacationOption('display_personal_history'))
3352
			{
3353
				$babBody->addItemMenu("movement", absences_translate("History"), absences_addon()->getUrl()."vacuser&idx=movement");
3354
			}
3355
			
3356
			if (absences_getVacationOption('user_add_email'))
3357
			{
3358
				$babBody->addItemMenu("options", absences_translate("Options"), absences_addon()->getUrl()."vacuser&idx=options");
3359
			}
3360
			
3361
		} else {
3362
			
3363 View Code Duplication
			if ($agent->isManager() && 'lvreq' === $idx)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3364
			{
3365
				// manager only
3366
				$url = new bab_url;
3367
				$url->tg = 'addon/absences/vacadm';
3368
				$url->location();
3369
			}
3370
			
3371 View Code Duplication
			if ($agent->isEntityManager() && 'lvreq' === $idx)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3372
			{
3373
				// delegated manager only
3374
				$url = new bab_url;
3375
				$url->tg = 'addon/absences/vacchart';
3376
				$url->location();
3377
			}
3378
		}
3379
			
3380
		if( $agent->isManager())
3381
		{
3382
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3383
		}
3384
3385
		if ($agent->isEntityManager())
3386
		{
3387
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3388
		}
3389
		break;
3390
	}
3391
3392
if ( absences_isPlanningAccessValid())
3393
{
3394
	$babBody->addItemMenu("planning", absences_translate("Plannings"), absences_addon()->getUrl()."planning&idx=userlist");
3395
}
3396
3397
3398
3399
3400
$babBody->setCurrentItemMenu($idx);
3401
bab_siteMap::setPosition('absences','User');
3402
3403