absences_RequestVacation::getOptionSortKey()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 6
c 0
b 0
f 0
nc 2
nop 1
dl 0
loc 13
rs 9.4285
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)
0 ignored issues
show
Bug introduced by
The class ErrorException does not exist. Did you forget a USE statement, or did you not list all dependencies?

Scrutinizer analyzes your composer.json/composer.lock file if available to determine the classes, and functions that are defined by your dependencies.

It seems like the listed class was neither found in your dependencies, nor was it found in the analyzed files in your repository. If you are using some other form of dependency management, you might want to disable this analysis.

Loading history...
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 && $this->rfrom);
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
			$nbdays['total'][$arr['quantity_unit']] += $quantity;
1451
			$used_in_previous_periods[$arr['id']] += $quantity;
1452
		}
1453
1454
		return true;
1455
	}
1456
	
1457
	
1458
	/**
1459
	 * requests in same folder and with same quantity and with same status
1460
	 * @param absences_Entry $entry
1461
	 * @return array
1462
	 */
1463
	private static function selectFolderSimilarRequests($entry)
1464
	{
1465
		require_once dirname(__FILE__).'/utilit/entry.class.php';
1466
		global $babDB;
1467
		
1468
		$res = $babDB->db_query('SELECT
1469
				e.* 
1470
			FROM
1471
				absences_entries e 
1472
			WHERE e.folder='.$babDB->quote($entry->folder).'
1473
				AND e.status='.$babDB->quote($entry->status).'
1474
				AND e.id<>'.$babDB->quote($entry->id).' 
1475
		');
1476
		
1477
		$return = array();
1478
		while($arr = $babDB->db_fetch_assoc($res))
1479
		{
1480
			$e = new absences_Entry();
1481
			$e->setRow($arr);
1482
			
1483
			if ($e->getTotalDays() == $entry->getTotalDays())
1484
			{
1485
				$return[] = $e;
1486
			}
1487
		}
1488
		
1489
		return $return;
1490
	}
1491
	
1492
	
1493
	/**
1494
	 * Save posted data
1495
	 */
1496
	public static function save()
1497
	{
1498
		global $babBody;
1499
		
1500
		if (absences_lockedForMainteance())
1501
		{
1502
			return false;
1503
		}
1504
		
1505
		
1506
		$id_request		= (int) $_POST['id'];
1507
		$id_user		= (int) $_POST['id_user'];
1508
		$rfrom			= $_POST['rfrom'];
1509
		
1510
		if( $rfrom == 1 )
1511
		{
1512
			$agent = absences_Agent::getCurrentUser();
1513
			if( !$agent->isManager())
1514
			{
1515
				$rfrom = 0;
1516
			}
1517
		}
1518
		
1519
		
1520
		
1521
		if (isset($_POST['period']) && is_array($_POST['period']))
1522
		{
1523
			// recurring request
1524
			
1525
			$period_list = $_POST['period'];
1526
			$folder = count($period_list) > 1 ? time() : 0;
1527
			$period_list_id = array();
1528
			
1529
		} else if (isset($_POST['upd_recurring']) && $id_request > 0) 
1530
		{
1531
1532
			// update recurring request
1533
1534
			require_once dirname(__FILE__).'/utilit/entry.class.php';
1535
			$entry = absences_Entry::getById($id_request);
1536
			
1537
			$folder = (int) $entry->folder;
1538
			
1539
			$period_list = array(
1540
					$_POST['begin'] => $_POST['end']
1541
			);
1542
			
1543
			$period_list_id = array(
1544
					$_POST['begin'] => $id_request
1545
			);
1546
			
1547
			$list = self::selectFolderSimilarRequests($entry);
1548
			
1549
			foreach($list as $e)
1550
			{
1551
				$period_list[$e->date_begin] = $e->date_end;
1552
				$period_list_id[$e->date_begin] = $e->id;
1553
			}
1554
			
1555
			
1556
			
1557
	    } else {
1558
		
1559
			$period_list = array(
1560
				$_POST['begin'] => $_POST['end']
1561
			);
1562
			
1563
			$period_list_id = array(
1564
				$_POST['begin'] => $id_request
1565
			);
1566
			
1567
			$folder = 0;
1568
		}
1569
		
1570
		$allow_mismatch = absences_getVacationOption('allow_mismatch');
1571
		
1572
		if (!$allow_mismatch) {
1573
    		// T9957 verification supplementaire pour les incoherence dans le nombre de jours
1574
    		$period_nbdays = str_replace(',', '.', $_POST['period_nbdays']);
1575
    		$req_nbdays = str_replace(',', '.', $_POST['total']['D']);
1576
    		
1577
    		if (!absences_cq($period_nbdays, $req_nbdays)) {
1578
    		    $babBody->addError(absences_translate('Total number of affected days does not match the period.'));
1579
    		    return false;
1580
    		}
1581
		}
1582
		
1583
		/**
1584
		 * Les droits utilises pour les tests sont les droits affiches a l'ecran
1585
		 * dans une demande repetitive, c'est la premiere periode qui est utilise pour les tests d'affichage
1586
		 */
1587
		$rights = absences_getRightsOnPeriod(key($period_list), reset($period_list), $id_user, $rfrom);
1588
		
1589
		// test phase
1590
		
1591
		$used_in_previous_periods = array();
1592
		
1593
		
1594
		$nbdays = null;
1595
		
1596
		
1597
		foreach($period_list as $begin => $end)
1598
		{
1599
			$id_request = isset($period_list_id[$begin]) ? $period_list_id[$begin] : 0;
1600
			
1601
			
1602
			try {
1603
			    // la repartition des jours sur les droits
1604
			    $_nbdays = self::testRightsQuantity($id_request, $rights, $used_in_previous_periods);
1605
			    if (!isset($nbdays)) {
1606
			        $nbdays = $_nbdays;
1607
			    }
1608
			    
1609
			} catch (Exception $e)
1610
			{
1611
			    $babBody->addError($e->getMessage());
1612
			    return false;
1613
			}
1614
			
1615
			
1616
			// verifier que le droit est dispo sur la periode
1617
			// utile pour les demandes repetitives
1618
			if (!test_periodValidity($id_request, $id_user, bab_mktime($begin), bab_mktime($end))) {
1619
				return false;
1620
			}
1621
1622
			try {
1623
				self::testRightsAvailability($rights, $nbdays, $begin, $end);
1624
			} catch (Exception $e)
1625
			{
1626
				$babBody->addError($e->getMessage());
1627
				return false;
1628
			}
1629
		}
1630
		
1631
		
1632
		if (!isset($nbdays)) {
1633
		    throw new Exception('missing quantity');
1634
		}
1635
		
1636
		
1637
		
1638
		// save phase
1639
		$saved = false;
1640
		foreach ($period_list as $begin => $end) {
1641
			$id_request = isset($period_list_id[$begin]) ? $period_list_id[$begin] : 0;
1642
			
1643
			if (self::savePeriod($id_request, $begin, $end, $id_user, $rfrom, $nbdays, $folder)) {
1644
				$saved = true;
1645
			}
1646
		}
1647
		
1648
		
1649
		if ($saved && !isset($_POST['previsional']))
1650
		{
1651
			$defer = (bool) absences_getVacationOption('approb_email_defer');
1652
			if (!$defer) {
1653
			    require_once dirname(__FILE__).'/utilit/request.notify.php';
1654
				absences_notifyRequestApprovers();
1655
			}
1656
		}
1657
1658
		return true;
1659
	}
1660
	
1661
	
1662
	
1663
	
1664
	
1665
	
1666
	
1667
	/**
1668
	 * Test des soldes 
1669
	 * retourne la liste des droit qui devons etre inseres ou false si la demande n'est pas autorise
1670
	 * 
1671
	 * @throws Exception
1672
	 * 
1673
	 * @return array | false
1674
	 */
1675
	private static function testRightsQuantity($id_request, $rights, &$used_in_previous_periods)
1676
	{
1677
		
1678
		
1679
		$rgroups = array();
1680
		$nbdays = array(
1681
			'id' => array(),
1682
			'val' => array(),
1683
		    'total' => array(
1684
		        'D' => 0,
1685
		        'H' => 0
1686
		    )
1687
		);
1688
		
1689
		// regular vacation rights
1690
		foreach($rights as &$arr)
1691
		{
1692
			if( isset($_POST['quantity'][$arr['id']]))
1693
			{
1694
				$quantity = $_POST['quantity'][$arr['id']];
1695
				if (!self::addVacationRight($nbdays, $arr, $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
			if ($arr['id_rgroup'] > 0) {
1702
				$rgroups[$arr['id']] = $arr['id_rgroup'];
1703
			}
1704
		}
1705
		
1706
		// right groups
1707
		
1708
		if (isset($_POST['rgroup_right'])) {
1709
			foreach($_POST['rgroup_right'] as $id_rgroup => $id_right) {
1710
				if (isset($rgroups[$id_right]) && $rgroups[$id_right] == $id_rgroup) {
1711
					$quantity = $_POST['rgroup_value'][$id_rgroup];
1712
1713
					if (!self::addVacationRight($nbdays, $rights[$id_right], $quantity, $id_request, $used_in_previous_periods))
1714
					{
1715
						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...
1716
					}
1717
				}
1718
			}
1719
		}
1720
		
1721
		if (empty($nbdays['val']))
1722
		{
1723
			throw new Exception(absences_translate("Empty requests are not allowed"));
1724
		}
1725
		
1726
		
1727
		$days = 0.0;
1728
		$hours = 0.0;
1729
		
1730 View Code Duplication
		if (isset($_POST['total']['D'])) {
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...
1731
		    $days = (float) str_replace(',', '.', $_POST['total']['D']);
1732
		}
1733
		
1734 View Code Duplication
		if (isset($_POST['total']['H'])) {
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...
1735
		    $hours = (float) str_replace(',', '.', $_POST['total']['H']);
1736
		}
1737
		
1738
		
1739
1740
		
1741 View Code Duplication
		if ($nbdays['total']['D'] > 0 && !absences_cq($nbdays['total']['D'], $days)) {
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...
1742
		    throw new Exception(absences_translate("Quantities must match total days"));
1743
		}
1744
		
1745 View Code Duplication
		if ($nbdays['total']['H'] > 0 && !absences_cq($nbdays['total']['H'], $hours)) {
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...
1746
		    throw new Exception(absences_translate("Quantities must match total hours"));
1747
		}
1748
		
1749
		return $nbdays;
1750
	}
1751
	
1752
	
1753
	
1754
	/**
1755
	 * Tester pour une periode si les droits avec une quantite saisie est disponibe
1756
	 * 
1757
	 * @param array $rights			Array from absences_getRightsOnPeriod
1758
	 * @param array $nbdays
1759
	 * @param string $begin			ISO datetime
1760
	 * @param string $end			ISO datetime
1761
	 * 
1762
	 * @throws Exception
1763
	 * 
1764
	 * @return bool
1765
	 */
1766
	private static function testRightsAvailability(Array $rights, Array $nbdays, $begin, $end)
1767
	{
1768
		$begin_ts = bab_mktime($begin);
1769
		$end_ts = bab_mktime($end);
1770
		
1771
		
1772
		foreach($nbdays['id'] as $k => $id_right)
1773
		{
1774
			if (isset($nbdays['val'][$k]) && !empty($nbdays['val'][$k]))
1775
			{
1776
				$agentRight = $rights[$id_right]['agentRight'];
1777
				
1778
1779
				
1780
				if (!$agentRight->isAccessibleOnPeriod($begin_ts, $end_ts))
1781
				{
1782
					throw new Exception(sprintf(
1783
							absences_translate('The right "%s" is not accessible %s, in a recurring request, all periods must be inside the used right validity period'), 
1784
							$rights[$id_right]['description'], 
1785
							mb_strtolower(absences_DateTimePeriod($begin, $end))
1786
					));
1787
				}
1788
				
1789
				if (!$agentRight->isAccessibleOnDelay($begin_ts))
1790
				{
1791
					$right = $agentRight->getRight();
1792
					$rightRule = $right->getRightRule();
1793
					
1794
					throw new Exception(sprintf(
1795
							absences_translate('The right "%s" is not accessible in the next %s days'), 
1796
							$right[$id_right]['description'], 
1797
							$rightRule->delay_before
1798
					));
1799
				}
1800
			}
1801
		}
1802
		
1803
		return true;
1804
	}
1805
	
1806
	
1807
	
1808
	private static function getPeriodSpanOnEdit($old_date_begin, $old_date_end, BAB_DateTime $date_begin, BAB_DateTime $date_end)
1809
	{
1810
	    $old_date_begin_obj = BAB_DateTime::fromIsoDateTime($old_date_begin);
1811
	    $old_date_end_obj = BAB_DateTime::fromIsoDateTime($old_date_end);
1812
	    
1813
	    $old_date_begin = $old_date_begin_obj->getTimeStamp();
1814
	    $old_date_end = $old_date_end_obj->getTimeStamp();
1815
	    
1816
	    $new_date_begin = $date_begin->getTimeStamp();
1817
	    $new_date_end = $date_end->getTimeStamp();
1818
	    
1819
	    $period_begin	= $old_date_begin 	< $new_date_begin 	? $old_date_begin 	: $new_date_begin;
1820
	    $period_end 	= $old_date_end 	> $new_date_end 	? $old_date_end 	: $new_date_end;
1821
	    
1822
	    return array($period_begin, $period_end);
1823
	}
1824
	
1825
	
1826
	
1827
	/**
1828
	 * Save in calendar
1829
	 * 
1830
	 * 
1831
	 * @param int $id_request
1832
	 * @param BAB_DateTime | null $old_date_begin_obj
1833
	 * @param BAB_DateTime | null $old_date_end_obj
1834
	 */
1835
	private static function saveInCalendar($id_request, $id, $old_date_begin_obj, $old_date_end_obj)
1836
	{
1837
	    if (empty($id_request)) {
1838
	        // event creation
1839
	        absences_createPeriod($id);
1840
	    
1841
	    } else {
1842
	        // event modification
1843
	        absences_updatePeriod($id, $old_date_begin_obj, $old_date_end_obj);
1844
	    }
1845
	}
1846
1847
1848
	/**
1849
	 * 
1850
	 * @param string   $begin		ISO datetime
1851
	 * @param string   $end		    ISO datetime
1852
	 * @param int      $id_user     Request owner
1853
	 * @param int      $rfrom       rfrom=1 if modification from a manager and from the back-office
1854
	 * @return boolean
1855
	 */
1856
	private static function savePeriod($id_request, $begin, $end, $id_user, $rfrom, $nbdays, $folder = 0)
1857
	{
1858
		require_once $GLOBALS['babInstallPath'].'utilit/dateTime.php';
1859
		require_once dirname(__FILE__).'/utilit/entry.class.php';
1860
		require_once dirname(__FILE__).'/utilit/entry_elem.class.php';
1861
		global $babBody;
1862
1863
1864
		
1865
		$remarks		= $_POST['remarks'];
1866
		
1867
		
1868
		$date_begin = BAB_DateTime::fromIsoDateTime($begin);
1869
		$date_end	= BAB_DateTime::fromIsoDateTime($end);
1870
		$status = isset($_POST['previsional']) ? 'P' : 'Y';
1871
		
1872
		
1873
1874
1875
		if (empty($id_request)) {
1876
			// event creation
1877
			
1878
			$entry = new absences_Entry;
1879
			$entry->id_user = $id_user;
1880
			$entry->createdBy = bab_getUserId();
1881
			$entry->date_begin = $begin;
1882
			$entry->date_end = $end;
1883
			$entry->comment = $remarks;
1884
			$entry->createdOn = date('Y-m-d H:i:s');
1885
			$entry->idfai = 0;
1886
			$entry->status = $status;
1887
			$entry->folder = $folder;
1888
			    
1889
			$entry->save();
1890
			
1891
			$id = $entry->id;
1892
1893
			$period_begin = bab_mktime($begin);
1894
			$period_end = bab_mktime($end);
1895
			
1896
			$old_date_begin_obj = null;
1897
			$old_date_end_obj = null;
1898
1899
1900
		}
1901
		else {
1902
			// event modification
1903
1904
			$entry = absences_Entry::getById($id_request);
1905
1906
			$old_date_begin = $entry->date_begin;
1907
			$old_date_end = $entry->date_end;
1908
1909
			if ($entry->idfai > 0) {
1910
				deleteFlowInstance($entry->idfai);
1911
			}
1912
				
1913
			$entry->date_begin = $date_begin->getIsoDateTime();
1914
			$entry->date_end = $date_end->getIsoDateTime();
1915
			$entry->comment = $remarks;
1916
			$entry->idfai = 0;
1917
			$entry->status = $status;
1918
			
1919
			$entry->save();
1920
			
1921
			$entry->loadElements();
1922
1923
			$id = $id_request;
1924
1925
			
1926
            list($period_begin, $period_end) = self::getPeriodSpanOnEdit($old_date_begin, $old_date_end, $date_begin, $date_end);
1927
            
1928
            $old_date_begin_obj = BAB_DateTime::fromIsoDateTime($old_date_begin);
1929
            $old_date_end_obj = BAB_DateTime::fromIsoDateTime($old_date_end);
1930
		}
1931
1932
1933
		// insert rights
1934
		
1935
	   $saved_rights = array();
1936
1937
		if (isset($nbdays['id'])) {
1938
		  $count = count($nbdays['id']);
1939
		  for( $i = 0; $i < $count; $i++) {
1940
			   
1941
		      $id_right = $nbdays['id'][$i];
1942
		      $saved_rights[$id_right] = $id_right;
1943
		      
1944
    			$elem = $entry->getElement($id_right);
1945
    			if (!isset($elem)) {
1946
    			     $elem = new absences_EntryElem();
1947
    			     $elem->setEntry($entry);
1948
    			     $entry->addElement($elem);
1949
    			}
1950
    			
1951
    			$elem->id_right = $id_right;
1952
    			$elem->date_begin = '0000-00-00 00:00:00';
1953
    			$elem->date_end = '0000-00-00 00:00:00';
1954
    			$elem->quantity = $nbdays['val'][$i];
1955
			}
1956
		}
1957
		
1958
		// remove elements set to zero
1959
		foreach($entry->getElements() as $element) {
1960
		    if (!isset($saved_rights[$element->id_right])) {
1961
		        $element->delete();
1962
		    }
1963
		}
1964
		
1965
		$entry->setElementsDates();
1966
		$entry->saveElements();
1967
		$entry->createPlannedPeriods();
1968
		$entry->savePlannedPeriods();
1969
		
1970
1971
		// set period into calendar backend if necessary
1972
		try {
1973
            self::saveInCalendar($id_request, $id, $old_date_begin_obj, $old_date_end_obj);
1974
		} catch (Exception $e) {
1975
		    // ex: caldav is not accessible
1976
		    
1977
		    /*@var $babBody babBody */
1978
		    $babBody->addNextPageError(sprintf(absences_translate('Failed to save event in calendar: %s'), $e->getMessage()));
1979
		}
1980
1981
1982
		include_once $GLOBALS['babInstallPath']."utilit/eventperiod.php";
1983
		$event = new bab_eventPeriodModified($period_begin, $period_end, $id_user);
1984
		$event->types = BAB_PERIOD_VACATION;
1985
		bab_fireEvent($event);
1986
		
1987
		
1988
		
1989
1990
		if (!isset($_POST['previsional']))
1991
		{
1992
		    $author = absences_Agent::getCurrentUser();
1993
		    $approbCreated = false;
1994
		    $startApproval = true;
1995
		    
1996
		    if ($author->isManager()) {
1997
		        if (isset($_POST['force_approval'])) { // checkbox does not exists if manager create his own request
1998
		            $startApproval = (bool) bab_pp('force_approval');
1999
		        }
2000
		    }
2001
		    
2002
		    
2003
		    if ($startApproval) {
2004
    			// create approbation
2005
    			if (self::createInstance($entry, !empty($id_request))) {
2006
    			    $approbCreated = true;
2007
    			}
2008
		    } else {
2009
		        self::addNoApprovalMovement($entry, !empty($id_request));
2010
		    }
2011
		    
2012
		    if (!$approbCreated)
2013
		    {
2014
		        // ex : retirer des RTT en fonction des arret maladie, l'absences maladie est cree par le gestionnaire sans approbation
2015
		        $entry->applyDynamicRight();
2016
		        
2017
		        // notify owner and other emails about the confirmed vacation request
2018
		        $entry->notifyOwner();
2019
		    }
2020
			
2021
			if (!empty($id_request))
2022
			{
2023
				// notification de modification
2024
				$entry = absences_Entry::getById($id);
2025
				absences_notifyOnRequestChange(array($entry), $entry->id_user);
2026
				absences_notifyManagers::send($id);
2027
			}
2028
			
2029
		} else {
2030
		    self::addPrevisionalMovement($entry, !empty($id_request));
2031
		}
2032
		
2033
		
2034
2035
		return true;
2036
	}
2037
2038
	
2039
	
2040
	public static function submitRequest($id)
2041
	{
2042
	    require_once dirname(__FILE__).'/utilit/entry.class.php';
2043
	    global $babBody;
2044
	    
2045
	    $entry = absences_Entry::getById($id);
2046
	    
2047
	    try {
2048
	        $entry->checkAvailable();
2049
	    } catch(Exception $e) {
2050
	        $babBody->addNextPageError($e->getMessage());
2051
	        return false;
2052
	    }
2053
	    
2054
	    if (!self::createInstance($entry)) {
2055
	        // ex : retirer des RTT en fonction des arret maladie, l'absences maladie est cree par le gestionnaire sans approbation
2056
	        $entry->applyDynamicRight();
2057
	        
2058
	        // notify owner and other emails about the confirmed vacation request
2059
	        $entry->notifyOwner();
2060
	    }
2061
	}
2062
	
2063
	
2064
	
2065 View Code Duplication
	protected static function addPrevisionalMovement($entry, $modify)
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...
2066
	{
2067
	    if ($modify)
2068
	    {
2069
	        $text = absences_translate('The previsional %s has been modified without approval');
2070
	    } else {
2071
	        $text = absences_translate('The previsional %s has been created without approval');
2072
	    }
2073
	     
2074
	    $entry->addMovement(sprintf($text, $entry->getTitle()));
2075
	}
2076
	
2077
	
2078 View Code Duplication
	protected static function addNoApprovalMovement($entry, $modify)
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...
2079
	{
2080
	    if ($modify)
2081
	    {
2082
	        $text = absences_translate('The %s has been modified without approval');
2083
	    } else {
2084
	        $text = absences_translate('The %s has been created without approval');
2085
	    }
2086
	    
2087
	    $entry->addMovement(sprintf($text, $entry->getTitle()));
2088
	}
2089
	
2090
	
2091
	/**
2092
	 * Create approbation instance, set status in waiting state
2093
	 * @param 	absences_Entry 	$entry
2094
	 * @param	bool	        $modify
2095
	 * 
2096
	 * @return bool
2097
	 */
2098
	public static function createInstance(absences_Entry $entry, $modify = false)
2099
	{
2100
		require_once dirname(__FILE__).'/utilit/request.notify.php';
2101
		global $babBody;
2102
		
2103
		
2104
		
2105
		if (!$entry->requireApproval())
2106
		{
2107
2108
		    self::addNoApprovalMovement($entry, $modify);
2109
			return false;
2110
		} else {
2111
		    
2112
		    
2113
		    if ($modify)
2114
		    {
2115
		        $text = absences_translate('The %s has been modified');
2116
		    } else {
2117
		        $text = absences_translate('The %s has been created');
2118
		    }
2119
		    
2120
		    $entry->addMovement(sprintf($text, $entry->getTitle()));
2121
		}
2122
		
2123
		
2124
		if (!$entry->createApprobationInstance()) {
2125
		    // impossible de crer une instance, 
2126
		    // l'utilisateur peut etre en auto-approbation ou le schema ne retourne aucun approbateur
2127
    		$entry->status = 'Y';
2128
    		$entry->onConfirm();
2129
    		$entry->save();
2130
    		return false;
2131
		}
2132
		
2133
		
2134
		
2135
		return true;
2136
	}
2137
	
2138
	
2139
	
2140 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...
2141
	{
2142
		require_once $GLOBALS['babInstallPath'].'utilit/urlincl.php';
2143
		
2144
		$url = bab_url::get_request('tg');
2145
		$url->idx = 'lvreq';
2146
		$url->location();
2147
	}
2148
2149
}
2150
2151
2152
2153
2154
2155
2156
2157
2158
/**
2159
 * Test period validity
2160
 * verifie qu'il n'y a pas de chevauchements de periodes
2161
 * 
2162
 * @param int $id_entry
2163
 * @param int $id_user
2164
 * @param int $begin
2165
 * @param int $end
2166
 * @return boolean
2167
 */
2168
function test_periodValidity($id_entry,$id_user,$begin,$end)
2169
{
2170
	global $babBody, $babDB;
2171
	
2172
	if( $begin >= $end)
2173
		{
2174
		$babBody->msgerror = absences_translate("ERROR: End date must be older")." !";
2175
		return false;
2176
		}
2177
		
2178
2179
	$date_begin = date('Y-m-d H:i:s',$begin);
2180
	$date_end = date('Y-m-d H:i:s',$end);
2181
2182
	$req = "SELECT
2183
				COUNT(*)
2184
		FROM ".ABSENCES_ENTRIES_TBL."
2185
			WHERE
2186
			id_user='".$babDB->db_escape_string($id_user)."'
2187
			AND date_begin < '".$babDB->db_escape_string($date_end)."'  
2188
			AND date_end > '".$babDB->db_escape_string($date_begin)."' 
2189
			AND id <> '".$babDB->db_escape_string($id_entry)."'
2190
			AND status<>'N'";
2191
2192
	$res = $babDB->db_query($req);
2193
	list($n) = $babDB->db_fetch_array($res);
2194
2195
	if ($n > 0) {
2196
		$babBody->msgerror = absences_translate("ERROR: a request is already defined on this period");
2197
		return false;
2198
	}
2199
2200
	return true;
2201
}
2202
2203
/**
2204
 * Test period validaity from posted first step
2205
 * @return boolean
2206
 */
2207
function test_period()
2208
{
2209
global $babBody;
2210
include_once $GLOBALS['babInstallPath']."utilit/dateTime.php";
2211
2212
if (!isset($_POST['daybegin']) ||
2213
	!isset($_POST['monthbegin']) ||
2214
	!isset($_POST['yearbegin']) ||
2215
	!isset($_POST['hourbegin']) ||
2216
	!isset($_POST['dayend']) ||
2217
	!isset($_POST['monthend']) ||
2218
	!isset($_POST['yearend']) ||
2219
	!isset($_POST['hourend']) ||
2220
	!isset($_POST['id_user'])
2221
	)
2222
	{
2223
	$babBody->msgerror = absences_translate("Error");
2224
	return false;
2225
	}
2226
2227
	$yearbegin = $_POST['year'] + $_POST['yearbegin'] - 1;
2228
	$yearend = $_POST['year'] + $_POST['yearend'] - 1;
2229
2230
	$begin	= BAB_DateTime::fromIsoDateTime($yearbegin.'-'.$_POST['monthbegin'].'-'.$_POST['daybegin'].' '.$_POST['hourbegin']);
2231
	$end	= BAB_DateTime::fromIsoDateTime($yearend.'-'.$_POST['monthend'].'-'.$_POST['dayend'].' '.$_POST['hourend']);
2232
2233
	$id_entry = isset($_POST['id']) ? $_POST['id'] : 0;
2234
2235
return test_periodValidity($id_entry, $_POST['id_user'], $begin->getTimeStamp(), $end->getTimeStamp());
2236
}
2237
2238
2239
2240
2241
/**
2242
 * Get posted date from the first step edit form or from the hidden field
2243
 *
2244
 */
2245
class absences_PostedDate
2246
{
2247
	/**
2248
	 * @return string ISO datetime
2249
	 */
2250
	public static function begin()
2251
	{
2252
		if (isset($_POST['daybegin']))
2253
		{
2254
			$yearbegin = $_POST['year'] + $_POST['yearbegin'] -1;
2255
			return $yearbegin.'-'.$_POST['monthbegin'].'-'.$_POST['daybegin'].' '.$_POST['hourbegin'];
2256
		}
2257
		
2258
		if (isset($_POST['begin']))
2259
		{
2260
			return $_POST['begin'];
2261
		}
2262
		
2263
		if (isset($_POST['period']))
2264
		{
2265
			return key($_POST['period']);
2266
		}
2267
	}
2268
	
2269
	/**
2270
	 * @return string ISO datetime
2271
	 */
2272
	public static function end()
2273
	{
2274
		if (isset($_POST['dayend']))
2275
		{
2276
			
2277
			$yearend = $_POST['year'] + $_POST['yearend'] -1;
2278
			return $yearend.'-'.$_POST['monthend'].'-'.$_POST['dayend'].' '.$_POST['hourend'];
2279
		}
2280
		
2281
		if (isset($_POST['end']))
2282
		{
2283
			return $_POST['end'];
2284
		}
2285
		
2286
		if (isset($_POST['period']))
2287
		{
2288
			return reset($_POST['period']);
2289
		}
2290
	}
2291
}
2292
2293
2294
2295
2296 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...
2297
{
2298
    $agent = absences_Agent::getCurrentUser();
2299
    
2300
    if (!empty($_POST['workperiod']['id_user'])) {
2301
        
2302
        
2303
        if ($agent->isManager()) {
2304
            $url = new bab_url(absences_addon()->getUrl().'vacadmwd');
2305
            $url->location();
2306
            return;
2307
        }
2308
        
2309
        //TODO: liste des demandes de l'entite si gestionnaire delegue
2310
    }
2311
    
2312
    $url = bab_url::get_request('tg');
2313
    $url->idx = 'lvreq';
2314
    $url->location();
2315
}
2316
2317
2318
2319
2320
/**
2321
 * Save form
2322
 * @param array 							$workperiod
2323
 * @param absences_WorkperiodRecoverRequest	$workperiodRecover
2324
 * @throws Exception
2325
 */
2326
function absences_saveWorkperiodRecoverRequest(Array $workperiod, absences_WorkperiodRecoverRequest $workperiodRecover = null)
2327
{
2328
	$babBody = bab_getInstance('babBody');
2329
	/* @var $babBody babBody */
2330
	
2331
	if (absences_lockedForMainteance())
2332
	{
2333
		return false;
2334
	}
2335
	
2336
	
2337
	if (!absences_WorkperiodRecoverRequest::checkForm($workperiod, $workperiodRecover))
2338
	{
2339
		return false;
2340
	}
2341
	
2342
	
2343
	
2344
	
2345
	
2346
	$type = absences_WorkperiodType::getFromId($workperiod['id_type']);
2347
	
2348
	if (!$type->getRow())
2349
	{
2350
		throw new Exception(absences_translate('This type does not exits'));
2351
	}
2352
	
2353
	$agent = absences_Agent::getCurrentUser();
2354
	
2355
	if (!isset($workperiodRecover))
2356
	{
2357
		$workperiodRecover = new absences_WorkperiodRecoverRequest();
2358
		
2359
		if (!empty($workperiod['id_user'])) {
2360
    		$spoofed = absences_Agent::getFromIdUser($workperiod['id_user']);
2361
    		if (!$agent->isManager() && !$agent->isSuperiorOf($spoofed)) {
2362
    		    throw new Exception(absences_translate('This type does not exits'));
2363
    		}
2364
    		
2365
    		$workperiodRecover->id_user = $spoofed->getIdUser();
2366
    		
2367
		} else {
2368
		    $workperiodRecover->id_user = bab_getUserId();
2369
		}
2370
	}
2371
	
2372
	$workperiodRecover->date_begin = absences_dateTimeForm($workperiod['datebegin'], $workperiod['hourbegin']);
2373
	$workperiodRecover->date_end = absences_dateTimeForm($workperiod['dateend'], $workperiod['hourend']);
2374
	$workperiodRecover->id_type = $type->id;
2375
	$workperiodRecover->comment = $workperiod['comment'];
2376
	$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...
2377
	$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...
2378
	$workperiodRecover->status = 'Y';
2379
	$workperiodRecover->id_right = 0;
2380
	$workperiodRecover->save();
2381
	
2382
2383
	if ($workperiodRecover->createApprobationInstance())
2384
	{
2385
		$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...
2386
	} else {
2387
		$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...
2388
	}
2389
	
2390
	$defer = (bool) absences_getVacationOption('approb_email_defer');
2391
	
2392
	if (!$defer)
2393
	{
2394
		require_once dirname(__FILE__).'/utilit/request.notify.php';
2395
		absences_notifyRequestApprovers();
2396
	}
2397
2398
	
2399
	absences_workperiodGotoList();
2400
}
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
/**
2412
 * Display form
2413
 */
2414
function absences_createWorkperiodRecoverRequest()
2415
{
2416
	require_once dirname(__FILE__).'/utilit/workperiod_recover_request.class.php';
2417
	require_once dirname(__FILE__).'/utilit/workperiod_recover_request.ui.php';
2418
	
2419
	
2420
	$babBody = bab_getBody();
2421
	
2422
	
2423
	
2424
	$agent = absences_Agent::getCurrentUser();
2425
	
2426
	if ($id_user = (int) bab_rp('id_user')) {
2427
	    $spoofed = absences_Agent::getFromIdUser($id_user);
2428
	    if (!$agent->isManager() && !$agent->isSuperiorOf($spoofed)) {
2429
	        return $babBody->addError('Spoofing failed workperiod recover request creation, you must be superior of the spoofed agent');
2430
	    }
2431
	    
2432
	    $agent = $spoofed;
2433
	}
2434
	
2435
	
2436
	
2437
	$request = null;
2438
	$id = bab_rp('id', null);
2439
	if (isset($id))
2440
	{
2441
		$request = absences_WorkperiodRecoverRequest::getById($id);
2442
		if (!$request->canModify())
2443
		{
2444
			return;
2445
		}
2446
	} else if (!$agent->canCreateWorkperiodRecoverRequest()) {
2447
		return $babBody->addError('Agent not allowed to create workperiod recover requests');
2448
	}
2449
	
2450
	
2451
	if (!isset($request) && $id_user) {
2452
	    $request = new absences_WorkperiodRecoverRequest();
2453
	    $request->id_user = $id_user;
2454
	}
2455
	
2456
	
2457
	$W = bab_Widgets();
2458
	$page = $W->BabPage();
2459
	
2460 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...
2461
	{
2462
		if ( isset($_POST['workperiod']['cancel']) )
2463
		{
2464
			absences_workperiodGotoList();
2465
		}
2466
	
2467
	
2468
		if( isset($_POST['workperiod']['save'] ))
2469
		{
2470
			try {
2471
				absences_saveWorkperiodRecoverRequest($_POST['workperiod'], $request);
2472
				
2473
			} catch (Exception $e)
2474
			{
2475
				$page->addError($e->getMessage());
2476
			}
2477
		}
2478
	}
2479
	
2480
	
2481
	$page->setTitle(absences_translate('Create a working days report entitling recovery'));
2482
	
2483 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...
2484
	{
2485
		$page->addError(absences_getMaintenanceMessage());
2486
		
2487
	} else {
2488
	
2489
		$editor = new absences_WorkperiodRecoverRequestEditor($request, isset($spoofed), false);
2490
		$page->addItem($editor);
2491
		
2492
	}
2493
	
2494
	$page->displayHtml();
2495
}
2496
2497
2498
2499
2500 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...
2501
{
2502
    $agent = absences_Agent::getCurrentUser();
2503
2504
    if (!empty($_POST['cet']['id_user'])) {
2505
2506
2507
        if ($agent->isManager()) {
2508
            $url = new bab_url(absences_addon()->getUrl().'vacadmcet');
2509
            $url->location();
2510
            return;
2511
        }
2512
2513
        //TODO: liste des demandes de l'entite si gestionnaire delegue
2514
    }
2515
2516
    $url = bab_url::get_request('tg');
2517
    $url->idx = 'lvreq';
2518
    $url->location();
2519
}
2520
2521
2522
/**
2523
 * Save a CET request
2524
 * 
2525
 * 
2526
 * @param array 					 $cet					posted form
2527
 * @param absences_CetDepositRequest $cet_deposit_request	Current request to modify or null for new request
2528
 */
2529
function absences_saveCetDepositRequest(Array $cet, absences_CetDepositRequest $cet_deposit_request = null)
2530
{
2531
	require_once $GLOBALS['babInstallPath'].'utilit/wfincl.php';
2532
	require_once dirname(__FILE__).'/utilit/agent_right.class.php';
2533
	
2534
	$babBody = bab_getInstance('babBody');
2535
	/* @var $babBody babBody */
2536
	
2537
	
2538
	if (absences_lockedForMainteance())
2539
	{
2540
		return false;
2541
	}
2542
	
2543
2544
	$quantity = (float) str_replace(',', '.', $cet['quantity']);
2545
	$agent_right = absences_AgentRight::getById((int) $cet['id_agent_right_source']);
2546
	
2547
	
2548
	$agent = $agent_right->getAgent();
2549
	
2550
	if (!isset($cet['id_user']) && bab_getUserId() !== $agent->getIdUser())
2551
	{
2552
		throw new Exception('Not accessible agentRight');
2553
	}
2554
	
2555
	if (isset($cet['id_user']))
2556
	{
2557
	    $currentUser = absences_Agent::getCurrentUser();
2558
	    if (!$currentUser->isManager() && !$currentUser->isSuperiorOf($agent)) {
2559
	        throw new Exception(absences_translate('Access denied to this account'));
2560
	    }
2561
	}
2562
	
2563
	
2564
	$AgentCet = $agent->Cet();
2565
	if (!$AgentCet->testDepositQuantity($agent_right, $quantity))
2566
	{
2567
		return false;
2568
	}
2569
	
2570
	
2571
	
2572
	if (!isset($cet_deposit_request))
2573
	{
2574
		// create the request
2575
		$cet_deposit_request = new absences_CetDepositRequest();
2576
	}
2577
	
2578
	$CetAgentRight = $AgentCet->getDepositAgentRight(true);
2579
	if (!isset($CetAgentRight)) {
2580
	    throw new Exception(absences_translate('No active time saving account found for this account'));
2581
	}
2582
	
2583
	$cet_deposit_request->id_user 				= $agent->getIdUser();
2584
	$cet_deposit_request->id_agent_right_cet 	= $CetAgentRight->id;
2585
	$cet_deposit_request->id_agent_right_source = $agent_right->id;
2586
	$cet_deposit_request->quantity				= $quantity;
2587
	$cet_deposit_request->idfai					= 0;
2588
	$cet_deposit_request->comment				= $cet['comment'];
2589
	$cet_deposit_request->status				= 'Y';
2590
	
2591
	$cet_deposit_request->save();
2592
	
2593
2594
	if ($cet_deposit_request->createApprobationInstance())
2595
	{
2596
		$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...
2597
	} else {
2598
		$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...
2599
	}
2600
	
2601
	
2602
	$defer = (bool) absences_getVacationOption('approb_email_defer');
2603
	
2604
	if (!$defer)
2605
	{
2606
		require_once dirname(__FILE__).'/utilit/request.notify.php';
2607
		absences_notifyRequestApprovers();
2608
	}
2609
	
2610
	absences_cetGotoList();
2611
}
2612
2613
2614
2615
function absences_createCetDepositRequest()
2616
{
2617
	require_once dirname(__FILE__).'/utilit/cet_deposit_request.class.php';
2618
	require_once dirname(__FILE__).'/utilit/cet_deposit_request.ui.php';
2619
	
2620
	$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...
2621
	
2622
	$id = bab_rp('id', null);
2623
	$request = null;
2624
	
2625
	$W = bab_Widgets();
2626
	$page = $W->BabPage();
2627
	
2628
	if (isset($id))
2629
	{
2630
		$request = absences_CetDepositRequest::getById($id);
2631
		if (!$request->canModify())
2632
		{
2633
		    $page->addError(absences_translate('This request is not modifiable'));
2634
		    $page->displayHtml();
2635
			return;
2636
		}
2637
	} elseif (bab_rp('id_user')) {
2638
	    
2639
	    $request = new absences_CetDepositRequest();
2640
	    $request->id_user = bab_rp('id_user');
2641
	    $request->status = '';
2642
	    $request->quantity = 0;
2643
	    
2644
	    $agent = absences_Agent::getFromIdUser($request->id_user);
2645
	    
2646
	    try {
2647
    	    if (!$agent->Cet()->canAdd()) {
2648
    	        $page->addError(sprintf(absences_translate('%s is not allowed to use time saving account'), $agent->getName()));
2649
    	        $page->displayHtml();
2650
    	        return;
2651
    	    }
2652
	    } catch (Exception $e) {
2653
	        $page->addError($e->getMessage());
2654
	        $page->displayHtml();
2655
	        return;
2656
	    }
2657
	}
2658
	
2659
	
2660
	
2661
	
2662
	
2663
	
2664
2665
	
2666 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...
2667
	{
2668
		if ( isset($_POST['cet']['cancel']) )
2669
		{
2670
			absences_cetGotoList();
2671
		}
2672
	
2673
	
2674
		if( isset($_POST['cet']['save'] ))
2675
		{
2676
			try {
2677
				absences_saveCetDepositRequest($_POST['cet'], $request);
2678
			} catch (Exception $e)
2679
			{
2680
				$page->addError($e->getMessage());
2681
			}
2682
		}
2683
	}
2684
	
2685
	if (isset($request) && $request->id)
2686
	{
2687
		$page->setTitle(absences_translate('Edit the time saving account deposit'));
2688
	} else {
2689
		$page->setTitle(absences_translate('Request a deposit in my time saving account'));
2690
	}
2691
2692 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...
2693
	{
2694
		$page->addError(absences_getMaintenanceMessage());
2695
2696
	} else {
2697
	
2698
		$editor = new absences_CetDepositRequestEditor($request, isset($_REQUEST['id_user']));
2699
		$page->addItem($editor);
2700
	}
2701
	
2702
	$page->displayHtml();
2703
}
2704
2705
2706
2707
2708
2709
2710
2711
/**
2712
 * Display a menu to create vacation request, CET request, workingdays recovery request
2713
 * @return string
2714
 */
2715
function absences_requestMenu()
2716
{
2717
	$toolbar = absences_getToolbar();
2718
	$agent = absences_Agent::getCurrentUser();
2719
	$addon = absences_addon();
2720
	
2721
	$sImgPath = $GLOBALS['babInstallPath'] . 'skins/ovidentia/images/Puces/';
2722
	
2723
	
2724
	
2725
	$toolbar->addToolbarItem(
2726
			new BAB_ToolbarItem(absences_translate('Request a vacation'), $addon->getUrl().'vacuser&idx=period',
2727
					$sImgPath . 'edit_add.png', '', '', '')
2728
	);
2729
	
2730 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...
2731
		$toolbar->addToolbarItem(
2732
				new BAB_ToolbarItem(absences_translate("Recovery request"), $addon->getUrl().'vacuser&idx=workperiod',
2733
						$sImgPath . 'edit_add.png', '', '', '')
2734
		);
2735
	}
2736
	
2737
	try {
2738 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...
2739
    		$toolbar->addToolbarItem(
2740
    				new BAB_ToolbarItem(absences_translate("Deposit on my time saving account"), $addon->getUrl().'vacuser&idx=cet',
2741
    						$sImgPath . 'edit_add.png', '', '', '')
2742
    		);
2743
    	}
2744
	} catch (Exception $e) {
2745
	    bab_debug($e->getMessage());
2746
	}
2747
	return $toolbar->printTemplate();
2748
}
2749
2750
2751
2752
function absences_personalMovements()
2753
{
2754
	require_once dirname(__FILE__).'/utilit/agent.class.php';
2755
	require_once dirname(__FILE__).'/utilit/agent.ui.php';
2756
	
2757
	$babBody = bab_getBody();
2758
	$agent = absences_Agent::getCurrentUser();
2759
	
2760
	
2761
	$list = new absences_AgentMovementList($agent);
2762
	
2763
	$babBody->setTitle(absences_translate('My history'));
2764
	
2765
	$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
2766
	$babBody->addItemMenu("movement", absences_translate("History"), absences_addon()->getUrl()."vacuser&idx=movement");
2767
	
2768
	if (absences_getVacationOption('user_add_email'))
2769
	{
2770
		$babBody->addItemMenu("options", absences_translate("Options"), absences_addon()->getUrl()."vacuser&idx=options");
2771
	}
2772
2773
	$babBody->babEcho($list->getHtml());
2774
}
2775
2776
2777
2778
2779
/**
2780
 * 
2781
 */
2782
function absences_personalOptions()
2783
{
2784
	global $babBody;
2785
	
2786
	require_once dirname(__FILE__).'/utilit/agent.class.php';
2787
	require_once dirname(__FILE__).'/utilit/agent.ui.php';
2788
	require_once $GLOBALS['babInstallPath'].'utilit/urlincl.php';
2789
	
2790
	$agent = absences_Agent::getCurrentUser();
2791
	
2792
	
2793
	
2794
	
2795
	
2796
	$W = bab_Widgets();
2797
	$page = $W->BabPage();
2798
	
2799
	
2800
	if ($options = bab_pp('options'))
2801
	{
2802
		$emails = $options['emails'];
2803
		$agent->setEmails($emails);
2804
		
2805
		$babBody->addNextPageMessage(absences_translate('The emails were saved'));
2806
		
2807
		$url = bab_url::get_request('tg', 'idx');
2808
		$url->location();
2809
	}
2810
	
2811
	
2812
	
2813
	$page->setTitle(absences_translate('My options'));
2814
	
2815
	$page->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
0 ignored issues
show
Deprecated Code introduced by
The method Widget_BabPage::addItemMenu() has been deprecated with message: Replaced by Widget_Tabs

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...
2816
	
2817
	if (absences_getVacationOption('display_personal_history'))
2818
	{
2819
		$page->addItemMenu("movement", absences_translate("History"), absences_addon()->getUrl()."vacuser&idx=movement");
0 ignored issues
show
Deprecated Code introduced by
The method Widget_BabPage::addItemMenu() has been deprecated with message: Replaced by Widget_Tabs

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...
2820
	}
2821
	
2822
	$page->addItemMenu("options", absences_translate("Options"), absences_addon()->getUrl()."vacuser&idx=options");
0 ignored issues
show
Deprecated Code introduced by
The method Widget_BabPage::addItemMenu() has been deprecated with message: Replaced by Widget_Tabs

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...
2823
	
2824
	
2825
	$editor = new absences_PersonalOptionsEditor;
2826
	$page->addItem($editor);
2827
	
2828
	
2829
	$page->displayHtml();
2830
}
2831
2832
2833
2834
2835
2836
2837
function absences_personalRights_addRightInTable(Widget_TableView $table, $row, absences_Right $right, absences_AgentRight $agentRight)
2838
{
2839
    $W = bab_Widgets();
2840
    $type = $right->getType();
2841
    
2842
    $icon = $W->Frame();
2843
    $icon->setCanvasOptions($icon->Options()->width(10,'px')->height(10,'px')->backgroundColor('#'.$type->color));
2844
    $icon->setTitle($type->name);
2845
2846
    $col = 0;
2847
    
2848
    $table->addItem($W->HBoxItems($icon,$W->Label($right->description))
2849
        ->setHorizontalSpacing(.8,'em')->setVerticalAlign('middle')									, $row, $col++);
2850
    $table->addItem($W->Label(absences_quantity($agentRight->getQuantity(), $right->quantity_unit))				, $row, $col++);
2851
    $table->addItem($W->Label(absences_quantity($agentRight->getConfirmedQuantity(), $right->quantity_unit))	, $row, $col++);
2852
    $table->addItem($W->Label(absences_quantity($agentRight->getWaitingQuantity(), $right->quantity_unit))		, $row, $col++);
2853
    $balance = $agentRight->getQuantity() - $agentRight->getConfirmedQuantity() - $agentRight->getWaitingQuantity();
2854
    $table->addItem($W->Label(absences_quantity($balance, $right->quantity_unit))								, $row, $col++);
2855
    $previsional = $agentRight->getPrevisionalQuantity();
2856
    $table->addItem($W->Label(absences_quantity($previsional, $right->quantity_unit))		                    , $row, $col++);
2857
    $table->addItem($W->Label(absences_quantity($balance - $previsional, $right->quantity_unit))		        , $row, $col++);
2858
    $table->addItem($W->Label(bab_shortDate(bab_mktime($right->date_begin), false))								, $row, $col++);
2859
    $table->addItem($W->Label(bab_shortDate(bab_mktime($right->date_end), false))								, $row, $col++);
2860
}
2861
2862
2863
2864
function absences_personalRights()
2865
{
2866
	$W = bab_Widgets();
2867
	$agent = absences_Agent::getCurrentUser();
2868
	
2869
	if (!$agent->exists())
2870
	{
2871
		return;
2872
	}
2873
	
2874
	$page = $W->BabPage()->setEmbedded(false);
2875
	$page->setTitle(absences_translate('My vacations rights'));
2876
	
2877
	$table = $W->BabTableView();
2878
	
2879
	$row = 0;
2880
	$col = 0;
2881
	$table->addHeadRow(0);
2882
	
2883
	$table->addItem($W->Label(absences_translate('Description'))	, $row, $col++);
2884
	$table->addItem($W->Label(absences_translate('Rights'))			, $row, $col++);
2885
	$table->addItem($W->Label(absences_translate('Consumed'))		, $row, $col++);
2886
	$table->addItem($W->Label(absences_translate('Waiting'))		, $row, $col++);
2887
	$table->addItem($W->Label(absences_translate('Balance'))		, $row, $col++);
2888
	$table->addItem($W->Label(absences_translate('Previsional'))	, $row, $col++);
2889
	$table->addItem($W->Label(absences_translate('Previ. Bal.'))	, $row, $col++);
2890
	$table->addItem($W->Label(absences_translate('Begin date'))		, $row, $col++);
2891
	$table->addItem($W->Label(absences_translate('End date'))		, $row, $col++);
2892
	$row++;	
2893
	
2894
	$I = $agent->getAgentRightUserIterator();
2895
	
2896
	$rows = array();
2897
	
2898
	foreach($I as $agentRight)
2899
	{
2900
		
2901
	    $right = $agentRight->getRight();
2902
		$rgroup = $right->getRgroupLabel();
2903
2904
2905
		if ($rgroup)
2906
		{
2907
			if (!isset($rows['rgroup'.$right->id_rgroup])) {
2908
    			$rows['rgroup'.$right->id_rgroup] = array(
2909
    			    'sortkey' => $right->getRgroupSortkey(),
2910
    			    'rgroup' => array()
2911
    			);
2912
			}
2913
			
2914
			$rows['rgroup'.$right->id_rgroup]['rgroup'][] = $agentRight;
2915
			continue;
2916
		}
2917
		
2918
		$rows['right'.$right->id] = array(
2919
		    'sortkey' => $right->sortkey,
2920
		    'agentRight' => $agentRight
2921
		);		
2922
	}
2923
	
2924
	bab_Sort::asort($rows, 'sortkey');
2925
	
2926
	foreach($rows as $arr_row) {
2927
	    
2928
	    if (isset($arr_row['rgroup'])) {
2929
	        $rgroup = reset($arr_row['rgroup'])->getRight()->getRgroupLabel();
2930
	        $table->addItem($W->Label($rgroup)->addClass('widget-strong'), $row, 0, -1, 9);
2931
	        $row++;
2932
	        
2933
	        foreach($arr_row['rgroup'] as $agentRight) {
2934
	            $right = $agentRight->getRight();
2935
	            $right->description = bab_nbsp().bab_nbsp().bab_nbsp().bab_nbsp().$right->description;
2936
	            absences_personalRights_addRightInTable($table, $row, $right, $agentRight);
2937
	            $row++;
2938
	        }
2939
	        
2940
	        continue;
2941
	    }
2942
	    
2943
	    
2944
	    $agentRight = $arr_row['agentRight'];
2945
	    $right = $agentRight->getRight();
2946
	    
2947
	    absences_personalRights_addRightInTable($table, $row, $right, $agentRight);
2948
	    $row++;
2949
	}
2950
	
2951
	
2952
	
2953
	
2954
	$page->addItem($table);
2955
	$print = $W->Link($W->Icon(absences_translate('Print'), Func_Icons::ACTIONS_DOCUMENT_PRINT), 'javascript:window.print()');
2956
	$page->addItem($W->Frame()->addClass(Func_Icons::ICON_LEFT_16)->addClass('widget-align-center')->addItem($print));
2957
	
2958
	$page->displayHtml();
2959
}
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
/**
2970
 * @param string $date
2971
 * @return array
2972
 */
2973
function absences_getDayWorkingHours($date)
2974
{
2975
    require_once $GLOBALS['babInstallPath'].'utilit/dateTime.php';
2976
    
2977
    $id_user = bab_gp('id_user');
2978
    $agent = absences_Agent::getFromIdUser(bab_getUserId());
2979
    
2980
    if ($id_user != $agent->getIdUser() && !absences_IsUserUnderSuperior($id_user) && !$agent->isManager()) {
2981
        throw new Exception('Access denied');
2982
    }
2983
    
2984
    $wh = bab_functionality::get('WorkingHours');
2985
    /* @var $wh Func_WorkingHours */
2986
    
2987
    $begin = BAB_DateTime::fromIsoDateTime(bab_gp('date').' 00:00:00');
2988
    $end = clone $begin;
2989
    $end->add(1, BAB_DATETIME_DAY);
2990
    
2991
    return $wh->selectPeriods($id_user, $begin, $end);
2992
}
2993
2994
2995
2996
2997
2998
2999
3000
3001
/**
3002
 * Create or edit a request period 
3003
 * first step of a vacation request
3004
 */
3005
function absences_requestPeriod()
3006
{
3007
	include_once dirname(__FILE__)."/utilit/planningincl.php";
3008
	global $babBody;
3009
	$agent = absences_Agent::getCurrentUser();
3010
	
3011
	
3012
	
3013
	
3014
	
3015
	
3016
	if (!empty($_REQUEST['id']))
3017
	{
3018
		// request modification
3019
		
3020
		
3021 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...
3022
		{
3023
			if ($agent->isManager() && !bab_rp('ide'))
3024
			{
3025
				// request modification from a manager
3026
			
3027
				$babBody->addItemMenu("menu", absences_translate("Management"), absences_addon()->getUrl()."vacadm&idx=menu");
3028
				$babBody->addItemMenu("lper", absences_translate("Requests"), absences_addon()->getUrl()."vacadmb&idx=lreq");
3029
				$babBody->addItemMenu("period", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=period");
3030
			}
3031
			
3032
			if ($agent->isEntityManager() && bab_rp('ide'))
3033
			{
3034
				// request modification from a delegated manager
3035
			
3036
				$babBody->addItemMenu("entities", absences_translate("Delegated management"), absences_addon()->getUrl()."vacchart&idx=entities");
3037
				$babBody->addItemMenu("entity_members", absences_translate("Entity requests"), absences_addon()->getUrl()."vacchart&idx=entity_requests&ide=".bab_rp('ide'));
3038
				$babBody->addItemMenu("period", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=period&ide=".bab_rp('ide'));
3039
			}
3040
			
3041
			
3042
		} else {
3043
			
3044
			// request modification from agent
3045
		
3046
			$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3047
			$babBody->addItemMenu("period", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=period&id=".bab_rp('id'));
3048
			
3049
			if( $agent->isManager())
3050
			{
3051
				$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3052
			}
3053
			if ($agent->isEntityManager())
3054
			{
3055
				$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3056
			}
3057
		
3058
		
3059
		}
3060
		
3061
		
3062
		$babBody->setTitle(absences_translate("Edit vacation request"));
3063
		
3064
		if (absences_lockedForMainteance())
3065
		{
3066
			$babBody->addError(absences_getMaintenanceMessage());
3067
			return false;
3068
		}
3069
		
3070
		
3071
		$id_user = bab_isEntryEditable($_REQUEST['id']);
3072
		if (!$id_user)
3073
		{
3074
			$babBody->addError(absences_translate("Access denied, this request is not modifiable"));
3075
			return false;
3076
		}
3077 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...
3078
		{
3079
			absences_viewVacationCalendar(array($id_user), true, true, bab_rp('nbmonth', 12), false);
3080
			period($id_user, $_REQUEST['id']);
3081
			return true;
3082
		}
3083
	}
3084
	else
3085
	{
3086
		
3087
		// request creation
3088
		
3089
		if (isset($_GET['idu']) && is_numeric($_GET['idu'])) {
3090
			$id_user = $_GET['idu']; // deprecated?
3091
		}
3092 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...
3093
			$id_user = bab_rp('id_user', bab_getUserId());
3094
			
3095
			if (bab_rp('rfrom'))
3096
			{
3097
			
3098
				if ($agent->isManager() && !bab_rp('ide'))
3099
				{
3100
					// request creation from a manager
3101
					
3102
					$babBody->addItemMenu("menu", absences_translate("Management"), absences_addon()->getUrl()."vacadm&idx=menu");
3103
					$babBody->addItemMenu("lper", absences_translate("Personnel"), absences_addon()->getUrl()."vacadm&idx=lper");
3104
					$babBody->addItemMenu("period", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=period");
3105
				}
3106
				
3107
				if ($agent->isEntityManager() && bab_rp('ide'))
3108
				{
3109
					// request creation from a delegated manager
3110
					
3111
					$babBody->addItemMenu("entities", absences_translate("Delegated management"), absences_addon()->getUrl()."vacchart&idx=entities");
3112
					$babBody->addItemMenu("entity_members", absences_translate("Entity members"), absences_addon()->getUrl()."vacchart&idx=entity_members&ide=".bab_rp('ide'));
3113
					$babBody->addItemMenu("period", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=period");
3114
				}
3115
			
3116
			} else {
3117
				
3118
				// request creation from agent
3119
				
3120
				$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3121
				$babBody->addItemMenu("period", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=period");
3122
				
3123
				
3124
				if( $agent->isManager())
3125
				{
3126
					$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3127
				}
3128
				if ($agent->isEntityManager())
3129
				{
3130
					$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3131
				}
3132
				
3133
			}
3134
		}
3135
		
3136
		
3137
		if ($id_user == bab_getUserId())
3138
		{
3139
			$babBody->setTitle(absences_translate("Request vacation"));
3140
		} else {
3141
			$babBody->setTitle(absences_translate("Request vacation for another user")); // rfrom=1
3142
		}
3143
		
3144
		if (absences_lockedForMainteance())
3145
		{
3146
			$babBody->addError(absences_getMaintenanceMessage());
3147
			return false;
3148
		}
3149
		
3150
	
3151 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...
3152
			absences_viewVacationCalendar(array($id_user), true, true, bab_rp('nbmonth', 12), false);
3153
			period($id_user);
3154
			return true;
3155
		}
3156
	}
3157
	
3158
	$babBody->addError(absences_translate("Access denied, no access to create a request"));
3159
	return false;
3160
}
3161
3162
3163
3164
3165
3166
/* main */
3167
bab_requireCredential();
3168
$agent = absences_Agent::getCurrentUser();
3169
$idx = bab_rp('idx', "lvreq");
3170
3171
3172 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...
3173
	{
3174
	$babBody->msgerror = absences_translate("Access denied");
3175
	return;
3176
	}
3177
3178
3179
3180
if (isset($_POST['action']))
3181
{
3182
switch ($_POST['action'])
3183
	{
3184
	case 'period':
3185
		if (!test_period()) {
3186
			$idx = 'period';
3187
		}
3188
		break;
3189
3190
	case 'vacation_request':
3191
		
3192
		$id = bab_pp('id');
3193
		
3194
		if (bab_isEntryEditable($id))
3195
		{
3196
		if(!absences_saveVacation::save()) {
3197
			$idx = "vunew";
3198
			}
3199
		elseif ($_POST['id_user'] == bab_getUserId())
3200
			{
3201
			// demande pour moi meme, retour a la liste de mes demandes
3202
			header("Location: ". absences_addon()->getUrl()."vacuser&idx=lvreq");
3203
			exit;
3204
			}
3205 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...
3206
			{
3207
			// modification d'une demande, retour liste des demandes	
3208
			if (bab_pp('ide')) {
3209
				header("Location: ". absences_addon()->getUrl().'vacchart&idx=entity_requests&ide='.bab_pp('ide'));
3210
				exit;
3211
			}
3212
3213
			header("Location: ". absences_addon()->getUrl()."vacadmb&idx=lreq");
3214
			exit;
3215
			}
3216 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...
3217
			{
3218
			// creation d'une demande, retour a la liste des agents
3219
			if (bab_pp('ide')) {
3220
				header("Location: ". absences_addon()->getUrl().'vacchart&idx=entity_members&ide='.bab_pp('ide'));
3221
				exit;
3222
			}
3223
			
3224
			header("Location: ". absences_addon()->getUrl()."vacadm&idx=lper");
3225
			exit;
3226
			}
3227
		}
3228
		break;
3229
3230
	case 'delete_request':
3231
		
3232
		if ($id_entry = bab_pp('id_entry'))
3233
		{
3234
			$id_user = bab_isEntryEditable($id_entry);
3235
			if ($id_user || $agent->isManager())
3236
			{
3237
				if (absences_delete_request(bab_pp('id_entry'), bab_pp('folder', 0), (int) bab_pp('rfrom', 0)))
3238
				{
3239
					header("Location: ". bab_pp('url'));
3240
					exit;
3241
				} else {
3242
					$babBody->addError(absences_translate('Failed to delete the vacation request'));
3243
				}
3244
			}
3245
		}
3246
		
3247
		
3248 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...
3249
		{
3250
			require_once dirname(__FILE__).'/utilit/cet_deposit_request.class.php';
3251
			$deposit = absences_CetDepositRequest::getById($id_deposit);
3252
			if ($deposit->canDelete())
3253
			{
3254
				$deposit->delete();
3255
				$url = new bab_url(bab_pp('url'));
3256
				$url->location();
3257
			}
3258
		}
3259
		
3260
		
3261 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...
3262
		{
3263
			require_once dirname(__FILE__).'/utilit/workperiod_recover_request.class.php';
3264
			$recovery = absences_WorkperiodRecoverRequest::getById($id_recovery);
3265
			if ($recovery->canDelete())
3266
			{
3267
				$recovery->delete();
3268
				$url = new bab_url(bab_pp('url'));
3269
				$url->location();
3270
			}
3271
		}
3272
		
3273
		break;
3274
	}
3275
}
3276
3277
3278
3279
3280
3281
switch($idx)
3282
	{
3283
3284
	case "unload":
3285
		vedUnload();
3286
		exit;
3287
		break;
3288
3289 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...
3290
		require_once dirname(__FILE__).'/utilit/request.ui.php';
3291
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3292
		$babBody->addItemMenu("morve", absences_translate("View request"), absences_addon()->getUrl()."vacuser&idx=lvreq&id=".bab_rp('id'));
3293
		absences_viewVacationRequestDetail(bab_rp('id'));
3294
		break;
3295
		
3296 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...
3297
		require_once dirname(__FILE__).'/utilit/request.ui.php';
3298
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3299
		$babBody->addItemMenu("view_cet_deposit", absences_translate("View request"), absences_addon()->getUrl()."vacuser&idx=view_cet_deposit&id=".bab_rp('id'));
3300
		absences_viewCetDepositDetail(bab_rp('id'));
3301
		break;
3302
3303 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...
3304
		require_once dirname(__FILE__).'/utilit/request.ui.php';
3305
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3306
		$babBody->addItemMenu("view_wp_recovery", absences_translate("View request"), absences_addon()->getUrl()."vacuser&idx=view_wp_recovery&id=".bab_rp('id'));
3307
		absences_viewWpRecoveryDetail(bab_rp('id'));
3308
		break;
3309
		
3310
	case "period":
3311
		// demande, premiere etape
3312
		absences_requestPeriod();
3313
		break;
3314
		
3315
		
3316
	case 'recurring':
3317
		if( bab_isEntryEditable($_POST['id']) )
3318
		{
3319
			absences_recurringVacation(absences_PostedDate::begin(), absences_PostedDate::end(), $_POST['id']);
3320
			
3321
			$babBody->addItemMenu("recurring", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=vunew");
3322
			$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3323
		}
3324
		if($agent->isManager())
3325
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3326
		if ($agent->isEntityManager())
3327
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3328
		break;
3329
3330
	case "vunew":
3331
		// demande, deuxieme etape
3332
		requestVacation(absences_PostedDate::begin(), absences_PostedDate::end(), $_POST['id'], bab_pp('rfrom'), bab_pp('ide'));
3333
		break;
3334
3335
	case 'delete':
3336
		
3337
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3338
		
3339
		if ($id_entry = bab_rp('id_entry'))
3340
		{
3341
			$babBody->addItemMenu("delete", absences_translate("Delete request"), absences_addon()->getUrl()."vacuser&idx=delete&id_entry=".$id_entry);
3342
			absences_deleteVacationRequest($id_entry);
3343
		}
3344
		
3345
		if ($id_cetdeposit = bab_rp('id_cetdeposit'))
3346
		{
3347
			$babBody->addItemMenu("delete", absences_translate("Delete request"), absences_addon()->getUrl()."vacuser&idx=delete&id_cetdeposit=".$id_cetdeposit);
3348
			absences_deleteCetDepositRequest($id_cetdeposit);
3349
		}
3350
		
3351
		if ($id_recovery = bab_rp('id_recovery'))
3352
		{
3353
			$babBody->addItemMenu("delete", absences_translate("Delete request"), absences_addon()->getUrl()."vacuser&idx=delete&id_recovery=".$id_recovery);
3354
			absences_deleteWpRecoveryRequest($id_recovery);
3355
		}
3356
		
3357
		break;
3358
3359
	case 'viewrights':
3360
		if (absences_IsUserUnderSuperior($_GET['id_user']) || $agent->isManager()) {
3361
			$babBody->setTitle(absences_translate("Balance").' : '.bab_getUserName($_GET['id_user']));
3362
3363
			if (isset($_GET['ide'])) {
3364
				$babBody->addItemMenu("entity_members", absences_translate("Entity members"), absences_addon()->getUrl()."vacchart&idx=entity_members&ide=".$_GET['ide']);
3365
			}
3366
3367
			$babBody->addItemMenu("viewrights", absences_translate("Balance"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3368
			viewrights($_GET['id_user']);
3369
		} else {
3370
			$babBody->msgerror = absences_translate("Access denied");
3371
		}
3372
		break;
3373
3374
		
3375
	case 'subprev':
3376
		$id_entry = (int) bab_rp('id_entry');
3377
		if ($id_entry && bab_isEntryEditable($id_entry))
3378
		{
3379
			absences_saveVacation::submitRequest($id_entry);
3380
			absences_saveVacation::gotoList();
3381
		} else {
3382
			$babBody->msgerror = absences_translate("Access denied to request modification");
3383
		}
3384
			
3385
		break;
3386
		
3387 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...
3388
		absences_createWorkperiodRecoverRequest();
3389
		
3390
		
3391
		if (!bab_rp('id_user')) {
3392
		  $babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3393
		}
3394
		
3395
		$babBody->addItemMenu("workperiod", absences_translate("Working day"), absences_addon()->getUrl()."vacuser&idx=workperiod");
3396
		
3397
		if( $agent->isManager())
3398
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3399
		
3400
		if ($agent->isEntityManager())
3401
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3402
		break;
3403
		
3404 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...
3405
		absences_createCetDepositRequest();
3406
		
3407
		if (!bab_rp('id_user')) {
3408
		    $babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3409
		}
3410
		
3411
		$babBody->addItemMenu("cet", absences_translate("Time saving account"), absences_addon()->getUrl()."vacuser&idx=cet");
3412
		
3413
		if( $agent->isManager())
3414
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3415
		
3416
		if ($agent->isEntityManager())
3417
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3418
		break;
3419
		
3420
	case 'movement':
3421
		
3422
		absences_personalMovements();
3423
		break;
3424
		
3425
	case 'options':
3426
		absences_personalOptions();
3427
		break;
3428
		
3429
	case 'myrights':
3430
		absences_personalRights();
3431
		die();
3432
		break;
3433
		
3434
		
3435
	case 'workinghours':
3436
	    require_once $GLOBALS['babInstallPath'].'utilit/json.php';
3437
	    echo bab_json_encode(absences_getDayWorkingHours(bab_gp('date')));
3438
	    die();
3439
3440
	case 'clear':
3441
		$babDB->db_query("TRUNCATE ".ABSENCES_CALENDAR_TBL);
3442
3443
	case "lvreq":
3444
	default:
3445
		$babBody->title = absences_translate("My already filed requests");
3446
		if( $agent->isInPersonnel() )
3447
		{
3448
			$babBody->babEcho(absences_requestMenu());
3449
			absences_listVacationRequests(bab_getUserId(), false);
3450
			$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3451
			if (absences_getVacationOption('display_personal_history'))
3452
			{
3453
				$babBody->addItemMenu("movement", absences_translate("History"), absences_addon()->getUrl()."vacuser&idx=movement");
3454
			}
3455
			
3456
			if (absences_getVacationOption('user_add_email'))
3457
			{
3458
				$babBody->addItemMenu("options", absences_translate("Options"), absences_addon()->getUrl()."vacuser&idx=options");
3459
			}
3460
			
3461
		} else {
3462
			
3463 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...
3464
			{
3465
				// manager only
3466
				$url = new bab_url;
3467
				$url->tg = 'addon/absences/vacadm';
3468
				$url->location();
3469
			}
3470
			
3471 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...
3472
			{
3473
				// delegated manager only
3474
				$url = new bab_url;
3475
				$url->tg = 'addon/absences/vacchart';
3476
				$url->location();
3477
			}
3478
		}
3479
			
3480
		if( $agent->isManager())
3481
		{
3482
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3483
		}
3484
3485
		if ($agent->isEntityManager())
3486
		{
3487
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3488
		}
3489
		break;
3490
	}
3491
3492
if ( absences_isPlanningAccessValid())
3493
{
3494
	$babBody->addItemMenu("planning", absences_translate("Plannings"), absences_addon()->getUrl()."planning&idx=userlist");
3495
}
3496
3497
3498
3499
3500
$babBody->setCurrentItemMenu($idx);
3501
bab_siteMap::setPosition('absences','User');
3502
3503