Completed
Push — master ( 6fc3a1...47798a )
by Paul
03:19
created

absences_saveVacation   D

Complexity

Total Complexity 94

Size/Duplication

Total Lines 723
Duplicated Lines 1.11 %

Coupling/Cohesion

Components 1
Dependencies 9

Importance

Changes 8
Bugs 2 Features 1
Metric Value
c 8
b 2
f 1
dl 8
loc 723
rs 4.4444
wmc 94
lcom 1
cbo 9

12 Methods

Rating   Name   Duplication   Size   Complexity  
B selectFolderSimilarRequests() 0 28 3
C testRightsQuantity() 0 49 11
B testRightsAvailability() 0 39 6
A getPeriodSpanOnEdit() 0 16 3
A saveInCalendar() 0 11 2
D addVacationRight() 0 77 20
F save() 0 151 23
F savePeriod() 0 170 16
A submitRequest() 0 22 3
A addNoApprovalMovment() 0 11 2
B createInstance() 0 39 4
A gotoList() 8 8 1

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like absences_saveVacation often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use absences_saveVacation, and based on these observations, apply Extract Interface, too.

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

class MyClass { }

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

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

class MyClass {
    public $foo;
}

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

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

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

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

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

Let’s take a look at an example:

class Author {
    private $name;

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

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

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

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

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

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

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

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

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

Let’s take a look at an example:

class Author {
    private $name;

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

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

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

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

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

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

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

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

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

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

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

function acceptsInteger($int) { }

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

// Instead of
acceptsInteger($x);

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

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

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

Loading history...
1944
		bab_fireEvent($event);
1945
		
1946
		
1947
		
1948
1949
		if (!isset($_POST['previsional']))
1950
		{
1951
		    $author = absences_Agent::getCurrentUser();
1952
		    $approbCreated = false;
1953
		    
1954
		    if (!$author->isManager() || bab_pp('force_approval')) {
1955
    			// create approbation
1956
    			if (self::createInstance($entry, !empty($id_request))) {
1957
    			    $approbCreated = true;
1958
    			}
1959
		    } else {
1960
		        self::addNoApprovalMovment($entry, !empty($id_request));
1961
		    }
1962
		    
1963
		    if (!$approbCreated)
1964
		    {
1965
		        // ex : retirer des RTT en fonction des arret maladie, l'absences maladie est cree par le gestionnaire sans approbation
1966
		        $entry->applyDynamicRight();
1967
		        
1968
		        // notify owner and other emails about the confirmed vacation request
1969
		        $entry->notifyOwner();
1970
		    }
1971
			
1972
			if (!empty($id_request))
1973
			{
1974
				// notification de modification
1975
				$entry = absences_Entry::getById($id);
1976
				absences_notifyOnRequestChange(array($entry), $entry->id_user);
1977
				absences_notifyManagers::send($id);
1978
			}
1979
		}
1980
		
1981
		
1982
1983
		return true;
1984
	}
1985
1986
	
1987
	
1988
	public static function submitRequest($id)
1989
	{
1990
	    require_once dirname(__FILE__).'/utilit/entry.class.php';
1991
	    global $babBody;
1992
	    
1993
	    $entry = absences_Entry::getById($id);
1994
	    
1995
	    try {
1996
	        $entry->checkAvailable();
1997
	    } catch(Exception $e) {
1998
	        $babBody->addNextPageError($e->getMessage());
1999
	        return false;
2000
	    }
2001
	    
2002
	    if (!self::createInstance($entry)) {
2003
	        // ex : retirer des RTT en fonction des arret maladie, l'absences maladie est cree par le gestionnaire sans approbation
2004
	        $entry->applyDynamicRight();
2005
	        
2006
	        // notify owner and other emails about the confirmed vacation request
2007
	        $entry->notifyOwner();
2008
	    }
2009
	}	
2010
	
2011
	
2012
	protected static function addNoApprovalMovment($entry, $modify)
2013
	{
2014
	    if ($modify)
2015
	    {
2016
	        $text = absences_translate('The %s has been modified without approval');
2017
	    } else {
2018
	        $text = absences_translate('The %s has been created without approval');
2019
	    }
2020
	    
2021
	    $entry->addMovement(sprintf($text, $entry->getTitle()));
2022
	}
2023
	
2024
	
2025
	/**
2026
	 * Create approbation instance, set status in waiting state
2027
	 * @param 	absences_Entry 	$entry
2028
	 * @param	bool	        $modify
2029
	 * 
2030
	 * @return bool
2031
	 */
2032
	public static function createInstance(absences_Entry $entry, $modify = false)
2033
	{
2034
		require_once dirname(__FILE__).'/utilit/request.notify.php';
2035
		global $babBody;
2036
		
2037
		
2038
		
2039
		if (!$entry->requireApproval())
2040
		{
2041
2042
		    self::addNoApprovalMovment($entry, $modify);
2043
			return false;
2044
		} else {
2045
		    
2046
		    
2047
		    if ($modify)
2048
		    {
2049
		        $text = absences_translate('The %s has been modified');
2050
		    } else {
2051
		        $text = absences_translate('The %s has been created');
2052
		    }
2053
		    
2054
		    $entry->addMovement(sprintf($text, $entry->getTitle()));
2055
		}
2056
		
2057
		
2058
		if (!$entry->createApprobationInstance()) {
2059
		    // impossible de crer une instance, 
2060
		    // l'utilisateur peut etre en auto-approbation ou le schema ne retourne aucun approbateur
2061
    		$entry->status = 'Y';
2062
    		$entry->onConfirm();
2063
    		$entry->save();
2064
    		return false;
2065
		}
2066
		
2067
		
2068
		
2069
		return true;
2070
	}
2071
	
2072
	
2073
	
2074 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...
2075
	{
2076
		require_once $GLOBALS['babInstallPath'].'utilit/urlincl.php';
2077
		
2078
		$url = bab_url::get_request('tg');
2079
		$url->idx = 'lvreq';
2080
		$url->location();
2081
	}
2082
2083
}
2084
2085
2086
2087
2088
2089
2090
2091
2092
/**
2093
 * Test period validity
2094
 * verifie qu'il n'y a pas de chevauchements de periodes
2095
 * 
2096
 * @param int $id_entry
2097
 * @param int $id_user
2098
 * @param int $begin
2099
 * @param int $end
2100
 * @return boolean
2101
 */
2102
function test_periodValidity($id_entry,$id_user,$begin,$end)
2103
{
2104
	global $babBody, $babDB;
2105
	
2106
	if( $begin >= $end)
2107
		{
2108
		$babBody->msgerror = absences_translate("ERROR: End date must be older")." !";
2109
		return false;
2110
		}
2111
		
2112
2113
	$date_begin = date('Y-m-d H:i:s',$begin);
2114
	$date_end = date('Y-m-d H:i:s',$end);
2115
2116
	$req = "SELECT
2117
				COUNT(*)
2118
		FROM ".ABSENCES_ENTRIES_TBL."
2119
			WHERE
2120
			id_user='".$babDB->db_escape_string($id_user)."'
2121
			AND date_begin < '".$babDB->db_escape_string($date_end)."'  
2122
			AND date_end > '".$babDB->db_escape_string($date_begin)."' 
2123
			AND id <> '".$babDB->db_escape_string($id_entry)."'
2124
			AND status<>'N'";
2125
2126
	$res = $babDB->db_query($req);
2127
	list($n) = $babDB->db_fetch_array($res);
2128
2129
	if ($n > 0) {
2130
		$babBody->msgerror = absences_translate("ERROR: a request is already defined on this period");
2131
		return false;
2132
	}
2133
2134
	return true;
2135
}
2136
2137
/**
2138
 * Test period validaity from posted first step
2139
 * @return boolean
2140
 */
2141
function test_period()
2142
{
2143
global $babBody;
2144
include_once $GLOBALS['babInstallPath']."utilit/dateTime.php";
2145
2146
if (!isset($_POST['daybegin']) ||
2147
	!isset($_POST['monthbegin']) ||
2148
	!isset($_POST['yearbegin']) ||
2149
	!isset($_POST['hourbegin']) ||
2150
	!isset($_POST['dayend']) ||
2151
	!isset($_POST['monthend']) ||
2152
	!isset($_POST['yearend']) ||
2153
	!isset($_POST['hourend']) ||
2154
	!isset($_POST['id_user'])
2155
	)
2156
	{
2157
	$babBody->msgerror = absences_translate("Error");
2158
	return false;
2159
	}
2160
2161
	$yearbegin = $_POST['year'] + $_POST['yearbegin'] - 1;
2162
	$yearend = $_POST['year'] + $_POST['yearend'] - 1;
2163
2164
	$begin	= BAB_DateTime::fromIsoDateTime($yearbegin.'-'.$_POST['monthbegin'].'-'.$_POST['daybegin'].' '.$_POST['hourbegin']);
2165
	$end	= BAB_DateTime::fromIsoDateTime($yearend.'-'.$_POST['monthend'].'-'.$_POST['dayend'].' '.$_POST['hourend']);
2166
2167
	$id_entry = isset($_POST['id']) ? $_POST['id'] : 0;
2168
2169
return test_periodValidity($id_entry, $_POST['id_user'], $begin->getTimeStamp(), $end->getTimeStamp());
2170
}
2171
2172
2173
2174
2175
/**
2176
 * Get posted date from the first step edit form or from the hidden field
2177
 *
2178
 */
2179
class absences_PostedDate
2180
{
2181
	/**
2182
	 * @return string ISO datetime
2183
	 */
2184
	public static function begin()
2185
	{
2186
		if (isset($_POST['daybegin']))
2187
		{
2188
			$yearbegin = $_POST['year'] + $_POST['yearbegin'] -1;
2189
			return $yearbegin.'-'.$_POST['monthbegin'].'-'.$_POST['daybegin'].' '.$_POST['hourbegin'];
2190
		}
2191
		
2192
		if (isset($_POST['begin']))
2193
		{
2194
			return $_POST['begin'];
2195
		}
2196
		
2197
		if (isset($_POST['period']))
2198
		{
2199
			return key($_POST['period']);
2200
		}
2201
	}
2202
	
2203
	/**
2204
	 * @return string ISO datetime
2205
	 */
2206
	public static function end()
2207
	{
2208
		if (isset($_POST['dayend']))
2209
		{
2210
			
2211
			$yearend = $_POST['year'] + $_POST['yearend'] -1;
2212
			return $yearend.'-'.$_POST['monthend'].'-'.$_POST['dayend'].' '.$_POST['hourend'];
2213
		}
2214
		
2215
		if (isset($_POST['end']))
2216
		{
2217
			return $_POST['end'];
2218
		}
2219
		
2220
		if (isset($_POST['period']))
2221
		{
2222
			return reset($_POST['period']);
2223
		}
2224
	}
2225
}
2226
2227
2228
2229
2230 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...
2231
{
2232
    $agent = absences_Agent::getCurrentUser();
2233
    
2234
    if (!empty($_POST['workperiod']['id_user'])) {
2235
        
2236
        
2237
        if ($agent->isManager()) {
2238
            $url = new bab_url(absences_addon()->getUrl().'vacadmwd');
2239
            $url->location();
2240
            return;
2241
        }
2242
        
2243
        //TODO: liste des demandes de l'entite si gestionnaire delegue
2244
    }
2245
    
2246
    $url = bab_url::get_request('tg');
2247
    $url->idx = 'lvreq';
2248
    $url->location();
2249
}
2250
2251
2252
2253
2254
/**
2255
 * Save form
2256
 * @param array 							$workperiod
2257
 * @param absences_WorkperiodRecoverRequest	$workperiodRecover
2258
 * @throws Exception
2259
 */
2260
function absences_saveWorkperiodRecoverRequest(Array $workperiod, absences_WorkperiodRecoverRequest $workperiodRecover = null)
2261
{
2262
	$babBody = bab_getInstance('babBody');
2263
	/* @var $babBody babBody */
2264
	
2265
	if (absences_lockedForMainteance())
2266
	{
2267
		return false;
2268
	}
2269
	
2270
	
2271
	if (!absences_WorkperiodRecoverRequest::checkForm($workperiod, $workperiodRecover))
2272
	{
2273
		return false;
2274
	}
2275
	
2276
	
2277
	
2278
	
2279
	
2280
	$type = absences_WorkperiodType::getFromId($workperiod['id_type']);
2281
	
2282
	if (!$type->getRow())
2283
	{
2284
		throw new Exception(absences_translate('This type does not exits'));
2285
	}
2286
	
2287
	$agent = absences_Agent::getCurrentUser();
2288
	
2289
	if (!isset($workperiodRecover))
2290
	{
2291
		$workperiodRecover = new absences_WorkperiodRecoverRequest();
2292
		
2293
		if (!empty($workperiod['id_user'])) {
2294
    		$spoofed = absences_Agent::getFromIdUser($workperiod['id_user']);
2295
    		if (!$agent->isManager() && !$agent->isSuperiorOf($spoofed)) {
2296
    		    throw new Exception(absences_translate('This type does not exits'));
2297
    		}
2298
    		
2299
    		$workperiodRecover->id_user = $spoofed->getIdUser();
2300
    		
2301
		} else {
2302
		    $workperiodRecover->id_user = bab_getUserId();
2303
		}
2304
	}
2305
	
2306
	$workperiodRecover->date_begin = absences_dateTimeForm($workperiod['datebegin'], $workperiod['hourbegin']);
2307
	$workperiodRecover->date_end = absences_dateTimeForm($workperiod['dateend'], $workperiod['hourend']);
2308
	$workperiodRecover->id_type = $type->id;
2309
	$workperiodRecover->comment = $workperiod['comment'];
2310
	$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...
2311
	$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...
2312
	$workperiodRecover->status = 'Y';
2313
	$workperiodRecover->id_right = 0;
2314
	$workperiodRecover->save();
2315
	
2316
2317
	if ($workperiodRecover->createApprobationInstance())
2318
	{
2319
		$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...
2320
	} else {
2321
		$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...
2322
	}
2323
	
2324
	$defer = (bool) absences_getVacationOption('approb_email_defer');
2325
	
2326
	if (!$defer)
2327
	{
2328
		require_once dirname(__FILE__).'/utilit/request.notify.php';
2329
		absences_notifyRequestApprovers();
2330
	}
2331
2332
	
2333
	absences_workperiodGotoList();
2334
}
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
/**
2346
 * Display form
2347
 */
2348
function absences_createWorkperiodRecoverRequest()
2349
{
2350
	require_once dirname(__FILE__).'/utilit/workperiod_recover_request.class.php';
2351
	require_once dirname(__FILE__).'/utilit/workperiod_recover_request.ui.php';
2352
	
2353
	
2354
	$babBody = bab_getBody();
2355
	
2356
	
2357
	
2358
	$agent = absences_Agent::getCurrentUser();
2359
	
2360
	if ($id_user = (int) bab_rp('id_user')) {
2361
	    $spoofed = absences_Agent::getFromIdUser($id_user);
2362
	    if (!$agent->isManager() && !$agent->isSuperiorOf($spoofed)) {
2363
	        return $babBody->addError('Spoofing failed workperiod recover request creation, you must be superior of the spoofed agent');
2364
	    }
2365
	    
2366
	    $agent = $spoofed;
2367
	}
2368
	
2369
	
2370
	
2371
	$request = null;
2372
	$id = bab_rp('id', null);
2373
	if (isset($id))
2374
	{
2375
		$request = absences_WorkperiodRecoverRequest::getById($id);
2376
		if (!$request->canModify())
2377
		{
2378
			return;
2379
		}
2380
	} else if (!$agent->canCreateWorkperiodRecoverRequest()) {
2381
		return $babBody->addError('Agent not allowed to create workperiod recover requests');
2382
	}
2383
	
2384
	
2385
	if (!isset($request) && $id_user) {
2386
	    $request = new absences_WorkperiodRecoverRequest();
2387
	    $request->id_user = $id_user;
2388
	}
2389
	
2390
	
2391
	$W = bab_Widgets();
2392
	$page = $W->BabPage();
2393
	
2394 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...
2395
	{
2396
		if ( isset($_POST['workperiod']['cancel']) )
2397
		{
2398
			absences_workperiodGotoList();
2399
		}
2400
	
2401
	
2402
		if( isset($_POST['workperiod']['save'] ))
2403
		{
2404
			try {
2405
				absences_saveWorkperiodRecoverRequest($_POST['workperiod'], $request);
2406
				
2407
			} catch (Exception $e)
2408
			{
2409
				$page->addError($e->getMessage());
2410
			}
2411
		}
2412
	}
2413
	
2414
	
2415
	$page->setTitle(absences_translate('Create a working days report entitling recovery'));
2416
	
2417 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...
2418
	{
2419
		$page->addError(absences_getMaintenanceMessage());
2420
		
2421
	} else {
2422
	
2423
		$editor = new absences_WorkperiodRecoverRequestEditor($request, isset($spoofed), false);
2424
		$page->addItem($editor);
2425
		
2426
	}
2427
	
2428
	$page->displayHtml();
2429
}
2430
2431
2432
2433
2434 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...
2435
{
2436
    $agent = absences_Agent::getCurrentUser();
2437
2438
    if (!empty($_POST['cet']['id_user'])) {
2439
2440
2441
        if ($agent->isManager()) {
2442
            $url = new bab_url(absences_addon()->getUrl().'vacadmcet');
2443
            $url->location();
2444
            return;
2445
        }
2446
2447
        //TODO: liste des demandes de l'entite si gestionnaire delegue
2448
    }
2449
2450
    $url = bab_url::get_request('tg');
2451
    $url->idx = 'lvreq';
2452
    $url->location();
2453
}
2454
2455
2456
/**
2457
 * Save a CET request
2458
 * 
2459
 * 
2460
 * @param array 					 $cet					posted form
2461
 * @param absences_CetDepositRequest $cet_deposit_request	Current request to modify or null for new request
2462
 */
2463
function absences_saveCetDepositRequest(Array $cet, absences_CetDepositRequest $cet_deposit_request = null)
2464
{
2465
	require_once $GLOBALS['babInstallPath'].'utilit/wfincl.php';
2466
	require_once dirname(__FILE__).'/utilit/agent_right.class.php';
2467
	
2468
	$babBody = bab_getInstance('babBody');
2469
	/* @var $babBody babBody */
2470
	
2471
	
2472
	if (absences_lockedForMainteance())
2473
	{
2474
		return false;
2475
	}
2476
	
2477
2478
	$quantity = (float) str_replace(',', '.', $cet['quantity']);
2479
	$agent_right = absences_AgentRight::getById((int) $cet['id_agent_right_source']);
2480
	
2481
	
2482
	$agent = $agent_right->getAgent();
2483
	
2484
	if (!isset($cet['id_user']) && bab_getUserId() !== $agent->getIdUser())
2485
	{
2486
		throw new Exception('Not accessible agentRight');
2487
	}
2488
	
2489
	if (isset($cet['id_user']))
2490
	{
2491
	    $currentUser = absences_Agent::getCurrentUser();
2492
	    if (!$currentUser->isManager() && !$currentUser->isSuperiorOf($agent)) {
2493
	        throw new Exception(absences_translate('Access denied to this account'));
2494
	    }
2495
	}
2496
	
2497
	
2498
	$AgentCet = $agent->Cet();
2499
	if (!$AgentCet->testDepositQuantity($agent_right, $quantity))
2500
	{
2501
		return false;
2502
	}
2503
	
2504
	
2505
	
2506
	if (!isset($cet_deposit_request))
2507
	{
2508
		// create the request
2509
		$cet_deposit_request = new absences_CetDepositRequest();
2510
	}
2511
	
2512
	$cet_deposit_request->id_user 				= $agent->getIdUser();
2513
	$cet_deposit_request->id_agent_right_cet 	= $AgentCet->getDepositAgentRight()->id;
2514
	$cet_deposit_request->id_agent_right_source = $agent_right->id;
2515
	$cet_deposit_request->quantity				= $quantity;
2516
	$cet_deposit_request->idfai					= 0;
2517
	$cet_deposit_request->comment				= $cet['comment'];
2518
	$cet_deposit_request->status				= 'Y';
2519
	
2520
	$cet_deposit_request->save();
2521
	
2522
2523
	if ($cet_deposit_request->createApprobationInstance())
2524
	{
2525
		$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...
2526
	} else {
2527
		$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...
2528
	}
2529
	
2530
	
2531
	$defer = (bool) absences_getVacationOption('approb_email_defer');
2532
	
2533
	if (!$defer)
2534
	{
2535
		require_once dirname(__FILE__).'/utilit/request.notify.php';
2536
		absences_notifyRequestApprovers();
2537
	}
2538
	
2539
	absences_cetGotoList();
2540
}
2541
2542
2543
2544
function absences_createCetDepositRequest()
2545
{
2546
	require_once dirname(__FILE__).'/utilit/cet_deposit_request.class.php';
2547
	require_once dirname(__FILE__).'/utilit/cet_deposit_request.ui.php';
2548
	
2549
	$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...
2550
	
2551
	$id = bab_rp('id', null);
2552
	$request = null;
2553
	
2554
	$W = bab_Widgets();
2555
	$page = $W->BabPage();
2556
	
2557
	if (isset($id))
2558
	{
2559
		$request = absences_CetDepositRequest::getById($id);
2560
		if (!$request->canModify())
2561
		{
2562
		    $page->addError(absences_translate('This request is not modifiable'));
2563
		    $page->displayHtml();
2564
			return;
2565
		}
2566
	} elseif (bab_rp('id_user')) {
2567
	    
2568
	    $request = new absences_CetDepositRequest();
2569
	    $request->id_user = bab_rp('id_user');
2570
	    $request->status = '';
2571
	    $request->quantity = 0;
2572
	    
2573
	    $agent = absences_Agent::getFromIdUser($request->id_user);
2574
	    
2575
	    if (!$agent->Cet()->canAdd()) {
2576
	        $page->addError(sprintf(absences_translate('%s is not allowed to use time saving account'), $agent->getName()));
2577
	        $page->displayHtml();
2578
	        return;
2579
	    }
2580
	}
2581
	
2582
	
2583
	
2584
	
2585
	
2586
	
2587
2588
	
2589 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...
2590
	{
2591
		if ( isset($_POST['cet']['cancel']) )
2592
		{
2593
			absences_cetGotoList();
2594
		}
2595
	
2596
	
2597
		if( isset($_POST['cet']['save'] ))
2598
		{
2599
			try {
2600
				absences_saveCetDepositRequest($_POST['cet'], $request);
2601
			} catch (Exception $e)
2602
			{
2603
				$page->addError($e->getMessage());
2604
			}
2605
		}
2606
	}
2607
	
2608
	if (isset($request) && $request->id)
2609
	{
2610
		$page->setTitle(absences_translate('Edit the time saving account deposit'));
2611
	} else {
2612
		$page->setTitle(absences_translate('Request a deposit in my time saving account'));
2613
	}
2614
2615 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...
2616
	{
2617
		$page->addError(absences_getMaintenanceMessage());
2618
2619
	} else {
2620
	
2621
		$editor = new absences_CetDepositRequestEditor($request, isset($_REQUEST['id_user']));
2622
		$page->addItem($editor);
2623
	}
2624
	
2625
	$page->displayHtml();
2626
}
2627
2628
2629
2630
2631
2632
2633
2634
/**
2635
 * Display a menu to create vacation request, CET request, workingdays recovery request
2636
 * @return string
2637
 */
2638
function absences_requestMenu()
2639
{
2640
	$toolbar = absences_getToolbar();
2641
	$agent = absences_Agent::getCurrentUser();
2642
	$addon = absences_addon();
2643
	
2644
	$sImgPath = $GLOBALS['babInstallPath'] . 'skins/ovidentia/images/Puces/';
2645
	
2646
	
2647
	
2648
	$toolbar->addToolbarItem(
2649
			new BAB_ToolbarItem(absences_translate('Request a vacation'), $addon->getUrl().'vacuser&idx=period',
2650
					$sImgPath . 'edit_add.png', '', '', '')
2651
	);
2652
	
2653 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...
2654
		$toolbar->addToolbarItem(
2655
				new BAB_ToolbarItem(absences_translate("Recovery request"), $addon->getUrl().'vacuser&idx=workperiod',
2656
						$sImgPath . 'edit_add.png', '', '', '')
2657
		);
2658
	}
2659
	
2660 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...
2661
		$toolbar->addToolbarItem(
2662
				new BAB_ToolbarItem(absences_translate("Deposit on my time saving account"), $addon->getUrl().'vacuser&idx=cet',
2663
						$sImgPath . 'edit_add.png', '', '', '')
2664
		);
2665
	}
2666
	
2667
	return $toolbar->printTemplate();
2668
}
2669
2670
2671
2672
function absences_personalMovements()
2673
{
2674
	require_once dirname(__FILE__).'/utilit/agent.class.php';
2675
	require_once dirname(__FILE__).'/utilit/agent.ui.php';
2676
	
2677
	$babBody = bab_getBody();
2678
	$agent = absences_Agent::getCurrentUser();
2679
	
2680
	
2681
	$list = new absences_AgentMovementList($agent);
2682
	
2683
	$babBody->setTitle(absences_translate('My history'));
2684
	
2685
	$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
2686
	$babBody->addItemMenu("movement", absences_translate("History"), absences_addon()->getUrl()."vacuser&idx=movement");
2687
	
2688
	if (absences_getVacationOption('user_add_email'))
2689
	{
2690
		$babBody->addItemMenu("options", absences_translate("Options"), absences_addon()->getUrl()."vacuser&idx=options");
2691
	}
2692
2693
	$babBody->babEcho($list->getHtml());
2694
}
2695
2696
2697
2698
2699
/**
2700
 * 
2701
 */
2702
function absences_personalOptions()
2703
{
2704
	global $babBody;
2705
	
2706
	require_once dirname(__FILE__).'/utilit/agent.class.php';
2707
	require_once dirname(__FILE__).'/utilit/agent.ui.php';
2708
	require_once $GLOBALS['babInstallPath'].'utilit/urlincl.php';
2709
	
2710
	$agent = absences_Agent::getCurrentUser();
2711
	
2712
	
2713
	
2714
	
2715
	
2716
	$W = bab_Widgets();
2717
	$page = $W->BabPage();
2718
	
2719
	
2720
	if ($options = bab_pp('options'))
2721
	{
2722
		$emails = $options['emails'];
2723
		$agent->setEmails($emails);
2724
		
2725
		$babBody->addNextPageMessage(absences_translate('The emails were saved'));
2726
		
2727
		$url = bab_url::get_request('tg', 'idx');
2728
		$url->location();
2729
	}
2730
	
2731
	
2732
	
2733
	$page->setTitle(absences_translate('My options'));
2734
	
2735
	$page->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
2736
	
2737
	if (absences_getVacationOption('display_personal_history'))
2738
	{
2739
		$page->addItemMenu("movement", absences_translate("History"), absences_addon()->getUrl()."vacuser&idx=movement");
2740
	}
2741
	
2742
	$page->addItemMenu("options", absences_translate("Options"), absences_addon()->getUrl()."vacuser&idx=options");
2743
	
2744
	
2745
	$editor = new absences_PersonalOptionsEditor;
2746
	$page->addItem($editor);
2747
	
2748
	
2749
	$page->displayHtml();
2750
}
2751
2752
2753
2754
2755
2756
2757
function absences_personalRights_addRightInTable(Widget_TableView $table, $row, absences_Right $right, absences_AgentRight $agentRight)
2758
{
2759
    $W = bab_Widgets();
2760
    $type = $right->getType();
2761
    
2762
    $icon = $W->Frame();
2763
    $icon->setCanvasOptions($icon->Options()->width(10,'px')->height(10,'px')->backgroundColor('#'.$type->color));
2764
    $icon->setTitle($type->name);
2765
2766
    $col = 0;
2767
    
2768
    $table->addItem($W->HBoxItems($icon,$W->Label($right->description))
2769
        ->setHorizontalSpacing(.8,'em')->setVerticalAlign('middle')									, $row, $col++);
2770
    $table->addItem($W->Label(absences_quantity($agentRight->getQuantity(), $right->quantity_unit))				, $row, $col++);
2771
    $table->addItem($W->Label(absences_quantity($agentRight->getConfirmedQuantity(), $right->quantity_unit))	, $row, $col++);
2772
    $table->addItem($W->Label(absences_quantity($agentRight->getWaitingQuantity(), $right->quantity_unit))		, $row, $col++);
2773
    $balance = $agentRight->getQuantity() - $agentRight->getConfirmedQuantity() - $agentRight->getWaitingQuantity();
2774
    $table->addItem($W->Label(absences_quantity($balance, $right->quantity_unit))								, $row, $col++);
2775
    $previsional = $agentRight->getPrevisionalQuantity();
2776
    $table->addItem($W->Label(absences_quantity($previsional, $right->quantity_unit))		                    , $row, $col++);
2777
    $table->addItem($W->Label(absences_quantity($balance - $previsional, $right->quantity_unit))		        , $row, $col++);
2778
    $table->addItem($W->Label(bab_shortDate(bab_mktime($right->date_begin), false))								, $row, $col++);
2779
    $table->addItem($W->Label(bab_shortDate(bab_mktime($right->date_end), false))								, $row, $col++);
2780
}
2781
2782
2783
2784
function absences_personalRights()
2785
{
2786
	$W = bab_Widgets();
2787
	$agent = absences_Agent::getCurrentUser();
2788
	
2789
	if (!$agent->exists())
2790
	{
2791
		return;
2792
	}
2793
	
2794
	$page = $W->BabPage()->setEmbedded(false);
2795
	$page->setTitle(absences_translate('My vacations rights'));
2796
	
2797
	$table = $W->BabTableView();
2798
	
2799
	$row = 0;
2800
	$col = 0;
2801
	$table->addHeadRow(0);
2802
	
2803
	$table->addItem($W->Label(absences_translate('Description'))	, $row, $col++);
2804
	$table->addItem($W->Label(absences_translate('Rights'))			, $row, $col++);
2805
	$table->addItem($W->Label(absences_translate('Consumed'))		, $row, $col++);
2806
	$table->addItem($W->Label(absences_translate('Waiting'))		, $row, $col++);
2807
	$table->addItem($W->Label(absences_translate('Balance'))		, $row, $col++);
2808
	$table->addItem($W->Label(absences_translate('Previsional'))	, $row, $col++);
2809
	$table->addItem($W->Label(absences_translate('Previ. Bal.'))	, $row, $col++);
2810
	$table->addItem($W->Label(absences_translate('Begin date'))		, $row, $col++);
2811
	$table->addItem($W->Label(absences_translate('End date'))		, $row, $col++);
2812
	$row++;	
2813
	
2814
	$I = $agent->getAgentRightUserIterator();
2815
	
2816
	$rows = array();
2817
	
2818
	foreach($I as $agentRight)
2819
	{
2820
		
2821
	    $right = $agentRight->getRight();
2822
		$rgroup = $right->getRgroupLabel();
2823
2824
2825
		if ($rgroup)
2826
		{
2827
			if (!isset($rows['rgroup'.$right->id_rgroup])) {
2828
    			$rows['rgroup'.$right->id_rgroup] = array(
2829
    			    'sortkey' => $right->getRgroupSortkey(),
2830
    			    'rgroup' => array()
2831
    			);
2832
			}
2833
			
2834
			$rows['rgroup'.$right->id_rgroup]['rgroup'][] = $agentRight;
2835
			continue;
2836
		}
2837
		
2838
		$rows['right'.$right->id] = array(
2839
		    'sortkey' => $right->sortkey,
2840
		    'agentRight' => $agentRight
2841
		);		
2842
	}
2843
	
2844
	bab_Sort::asort($rows, 'sortkey');
2845
	
2846
	foreach($rows as $arr_row) {
2847
	    
2848
	    if (isset($arr_row['rgroup'])) {
2849
	        $rgroup = reset($arr_row['rgroup'])->getRight()->getRgroupLabel();
2850
	        $table->addItem($W->Label($rgroup)->addClass('widget-strong'), $row, 0, -1, 9);
2851
	        $row++;
2852
	        
2853
	        foreach($arr_row['rgroup'] as $agentRight) {
2854
	            $right = $agentRight->getRight();
2855
	            $right->description = bab_nbsp().bab_nbsp().bab_nbsp().bab_nbsp().$right->description;
2856
	            absences_personalRights_addRightInTable($table, $row, $right, $agentRight);
2857
	            $row++;
2858
	        }
2859
	        
2860
	        continue;
2861
	    }
2862
	    
2863
	    
2864
	    $agentRight = $arr_row['agentRight'];
2865
	    $right = $agentRight->getRight();
2866
	    
2867
	    absences_personalRights_addRightInTable($table, $row, $right, $agentRight);
2868
	    $row++;
2869
	}
2870
	
2871
	
2872
	
2873
	
2874
	$page->addItem($table);
2875
	$print = $W->Link($W->Icon(absences_translate('Print'), Func_Icons::ACTIONS_DOCUMENT_PRINT), 'javascript:window.print()');
2876
	$page->addItem($W->Frame()->addClass(Func_Icons::ICON_LEFT_16)->addClass('widget-align-center')->addItem($print));
2877
	
2878
	$page->displayHtml();
2879
}
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
/**
2890
 * @param string $date
2891
 * @return array
2892
 */
2893
function absences_getDayWorkingHours($date)
2894
{
2895
    require_once $GLOBALS['babInstallPath'].'utilit/dateTime.php';
2896
    
2897
    $id_user = bab_gp('id_user');
2898
    $agent = absences_Agent::getFromIdUser(bab_getUserId());
2899
    
2900
    if ($id_user != $agent->getIdUser() && !absences_IsUserUnderSuperior($id_user) && !$agent->isManager()) {
2901
        throw new Exception('Access denied');
2902
    }
2903
    
2904
    $wh = bab_functionality::get('WorkingHours');
2905
    /* @var $wh Func_WorkingHours */
2906
    
2907
    $begin = BAB_DateTime::fromIsoDateTime(bab_gp('date').' 00:00:00');
2908
    $end = clone $begin;
2909
    $end->add(1, BAB_DATETIME_DAY);
2910
    
2911
    return $wh->selectPeriods($id_user, $begin, $end);
2912
}
2913
2914
2915
2916
2917
2918
2919
2920
2921
/**
2922
 * Create or edit a request period 
2923
 * first step of a vacation request
2924
 */
2925
function absences_requestPeriod()
2926
{
2927
	include_once dirname(__FILE__)."/utilit/planningincl.php";
2928
	global $babBody;
2929
	$agent = absences_Agent::getCurrentUser();
2930
	
2931
	
2932
	
2933
	
2934
	
2935
	
2936
	if (!empty($_REQUEST['id']))
2937
	{
2938
		// request modification
2939
		
2940
		
2941 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...
2942
		{
2943
			if ($agent->isManager() && !bab_rp('ide'))
2944
			{
2945
				// request modification from a manager
2946
			
2947
				$babBody->addItemMenu("menu", absences_translate("Management"), absences_addon()->getUrl()."vacadm&idx=menu");
2948
				$babBody->addItemMenu("lper", absences_translate("Requests"), absences_addon()->getUrl()."vacadmb&idx=lreq");
2949
				$babBody->addItemMenu("period", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=period");
2950
			}
2951
			
2952
			if ($agent->isEntityManager() && bab_rp('ide'))
2953
			{
2954
				// request modification from a delegated manager
2955
			
2956
				$babBody->addItemMenu("entities", absences_translate("Delegated management"), absences_addon()->getUrl()."vacchart&idx=entities");
2957
				$babBody->addItemMenu("entity_members", absences_translate("Entity requests"), absences_addon()->getUrl()."vacchart&idx=entity_requests&ide=".bab_rp('ide'));
2958
				$babBody->addItemMenu("period", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=period&ide=".bab_rp('ide'));
2959
			}
2960
			
2961
			
2962
		} else {
2963
			
2964
			// request modification from agent
2965
		
2966
			$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
2967
			$babBody->addItemMenu("period", absences_translate("Edit"), absences_addon()->getUrl()."vacuser&idx=period&id=".bab_rp('id'));
2968
			
2969
			if( $agent->isManager())
2970
			{
2971
				$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
2972
			}
2973
			if ($agent->isEntityManager())
2974
			{
2975
				$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
2976
			}
2977
		
2978
		
2979
		}
2980
		
2981
		
2982
		$babBody->setTitle(absences_translate("Edit vacation request"));
2983
		
2984
		if (absences_lockedForMainteance())
2985
		{
2986
			$babBody->addError(absences_getMaintenanceMessage());
2987
			return false;
2988
		}
2989
		
2990
		
2991
		$id_user = bab_isEntryEditable($_REQUEST['id']);
2992
		if (!$id_user)
2993
		{
2994
			$babBody->addError(absences_translate("Access denied, this request is not modifiable"));
2995
			return false;
2996
		}
2997 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...
2998
		{
2999
			absences_viewVacationCalendar(array($id_user), true, true, bab_rp('nbmonth', 12), false);
3000
			period($id_user, $_REQUEST['id']);
3001
			return true;
3002
		}
3003
	}
3004
	else
3005
	{
3006
		
3007
		// request creation
3008
		
3009
		if (isset($_GET['idu']) && is_numeric($_GET['idu'])) {
3010
			$id_user = $_GET['idu']; // deprecated?
3011
		}
3012 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...
3013
			$id_user = bab_rp('id_user', bab_getUserId());
3014
			
3015
			if (bab_rp('rfrom'))
3016
			{
3017
			
3018
				if ($agent->isManager() && !bab_rp('ide'))
3019
				{
3020
					// request creation from a manager
3021
					
3022
					$babBody->addItemMenu("menu", absences_translate("Management"), absences_addon()->getUrl()."vacadm&idx=menu");
3023
					$babBody->addItemMenu("lper", absences_translate("Personnel"), absences_addon()->getUrl()."vacadm&idx=lper");
3024
					$babBody->addItemMenu("period", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=period");
3025
				}
3026
				
3027
				if ($agent->isEntityManager() && bab_rp('ide'))
3028
				{
3029
					// request creation from a delegated manager
3030
					
3031
					$babBody->addItemMenu("entities", absences_translate("Delegated management"), absences_addon()->getUrl()."vacchart&idx=entities");
3032
					$babBody->addItemMenu("entity_members", absences_translate("Entity members"), absences_addon()->getUrl()."vacchart&idx=entity_members&ide=".bab_rp('ide'));
3033
					$babBody->addItemMenu("period", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=period");
3034
				}
3035
			
3036
			} else {
3037
				
3038
				// request creation from agent
3039
				
3040
				$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3041
				$babBody->addItemMenu("period", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=period");
3042
				
3043
				
3044
				if( $agent->isManager())
3045
				{
3046
					$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3047
				}
3048
				if ($agent->isEntityManager())
3049
				{
3050
					$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3051
				}
3052
				
3053
			}
3054
		}
3055
		
3056
		
3057
		if ($id_user == bab_getUserId())
3058
		{
3059
			$babBody->setTitle(absences_translate("Request vacation"));
3060
		} else {
3061
			$babBody->setTitle(absences_translate("Request vacation for another user")); // rfrom=1
3062
		}
3063
		
3064
		if (absences_lockedForMainteance())
3065
		{
3066
			$babBody->addError(absences_getMaintenanceMessage());
3067
			return false;
3068
		}
3069
		
3070
	
3071 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...
3072
			absences_viewVacationCalendar(array($id_user), true, true, bab_rp('nbmonth', 12), false);
3073
			period($id_user);
3074
			return true;
3075
		}
3076
	}
3077
	
3078
	$babBody->addError(absences_translate("Access denied, no access to create a request"));
3079
	return false;
3080
}
3081
3082
3083
3084
3085
3086
/* main */
3087
bab_requireCredential();
3088
$agent = absences_Agent::getCurrentUser();
3089
$idx = bab_rp('idx', "lvreq");
3090
3091
3092 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...
3093
	{
3094
	$babBody->msgerror = absences_translate("Access denied");
3095
	return;
3096
	}
3097
3098
3099
3100
if (isset($_POST['action']))
3101
{
3102
switch ($_POST['action'])
3103
	{
3104
	case 'period':
3105
		if (!test_period()) {
3106
			$idx = 'period';
3107
		}
3108
		break;
3109
3110
	case 'vacation_request':
3111
		
3112
		$id = bab_pp('id');
3113
		
3114
		if (bab_isEntryEditable($id))
3115
		{
3116
		if(!absences_saveVacation::save()) {
3117
			$idx = "vunew";
3118
			}
3119
		elseif ($_POST['id_user'] == bab_getUserId())
3120
			{
3121
			// demande pour moi meme, retour a la liste de mes demandes
3122
			header("Location: ". absences_addon()->getUrl()."vacuser&idx=lvreq");
3123
			exit;
3124
			}
3125 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...
3126
			{
3127
			// modification d'une demande, retour liste des demandes	
3128
			if (bab_pp('ide')) {
3129
				header("Location: ". absences_addon()->getUrl().'vacchart&idx=entity_requests&ide='.bab_pp('ide'));
3130
				exit;
3131
			}
3132
3133
			header("Location: ". absences_addon()->getUrl()."vacadmb&idx=lreq");
3134
			exit;
3135
			}
3136 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...
3137
			{
3138
			// creation d'une demande, retour a la liste des agents
3139
			if (bab_pp('ide')) {
3140
				header("Location: ". absences_addon()->getUrl().'vacchart&idx=entity_members&ide='.bab_pp('ide'));
3141
				exit;
3142
			}
3143
			
3144
			header("Location: ". absences_addon()->getUrl()."vacadm&idx=lper");
3145
			exit;
3146
			}
3147
		}
3148
		break;
3149
3150
	case 'delete_request':
3151
		
3152
		if ($id_entry = bab_pp('id_entry'))
3153
		{
3154
			$id_user = bab_isEntryEditable($id_entry);
3155
			if ($id_user || $agent->isManager())
3156
			{
3157
				if (absences_delete_request(bab_pp('id_entry'), bab_pp('folder', 0), (int) bab_pp('rfrom', 0)))
3158
				{
3159
					header("Location: ". bab_pp('url'));
3160
					exit;
3161
				} else {
3162
					$babBody->addError(absences_translate('Failed to delete the vacation request'));
3163
				}
3164
			}
3165
		}
3166
		
3167
		
3168 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...
3169
		{
3170
			require_once dirname(__FILE__).'/utilit/cet_deposit_request.class.php';
3171
			$deposit = absences_CetDepositRequest::getById($id_deposit);
3172
			if ($deposit->canDelete())
3173
			{
3174
				$deposit->delete();
3175
				$url = new bab_url(bab_pp('url'));
3176
				$url->location();
3177
			}
3178
		}
3179
		
3180
		
3181 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...
3182
		{
3183
			require_once dirname(__FILE__).'/utilit/workperiod_recover_request.class.php';
3184
			$recovery = absences_WorkperiodRecoverRequest::getById($id_recovery);
3185
			if ($recovery->canDelete())
3186
			{
3187
				$recovery->delete();
3188
				$url = new bab_url(bab_pp('url'));
3189
				$url->location();
3190
			}
3191
		}
3192
		
3193
		break;
3194
	}
3195
}
3196
3197
3198
3199
3200
3201
switch($idx)
3202
	{
3203
3204
	case "unload":
3205
		vedUnload();
3206
		exit;
3207
		break;
3208
3209 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...
3210
		require_once dirname(__FILE__).'/utilit/request.ui.php';
3211
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3212
		$babBody->addItemMenu("morve", absences_translate("View request"), absences_addon()->getUrl()."vacuser&idx=lvreq&id=".bab_rp('id'));
3213
		absences_viewVacationRequestDetail(bab_rp('id'));
3214
		break;
3215
		
3216 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...
3217
		require_once dirname(__FILE__).'/utilit/request.ui.php';
3218
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3219
		$babBody->addItemMenu("view_cet_deposit", absences_translate("View request"), absences_addon()->getUrl()."vacuser&idx=view_cet_deposit&id=".bab_rp('id'));
3220
		absences_viewCetDepositDetail(bab_rp('id'));
3221
		break;
3222
3223 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...
3224
		require_once dirname(__FILE__).'/utilit/request.ui.php';
3225
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3226
		$babBody->addItemMenu("view_wp_recovery", absences_translate("View request"), absences_addon()->getUrl()."vacuser&idx=view_wp_recovery&id=".bab_rp('id'));
3227
		absences_viewWpRecoveryDetail(bab_rp('id'));
3228
		break;
3229
		
3230
	case "period":
3231
		// demande, premiere etape
3232
		absences_requestPeriod();
3233
		break;
3234
		
3235
		
3236
	case 'recurring':
3237
		if( bab_isEntryEditable($_POST['id']) )
3238
		{
3239
			absences_recurringVacation(absences_PostedDate::begin(), absences_PostedDate::end(), $_POST['id']);
3240
			
3241
			$babBody->addItemMenu("recurring", absences_translate("Request"), absences_addon()->getUrl()."vacuser&idx=vunew");
3242
			$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3243
		}
3244
		if($agent->isManager())
3245
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3246
		if ($agent->isEntityManager())
3247
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3248
		break;
3249
3250
	case "vunew":
3251
		// demande, deuxieme etape
3252
		requestVacation(absences_PostedDate::begin(), absences_PostedDate::end(), $_POST['id'], bab_pp('rfrom'), bab_pp('ide'));
3253
		break;
3254
3255
	case 'delete':
3256
		
3257
		$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3258
		
3259
		if ($id_entry = bab_rp('id_entry'))
3260
		{
3261
			$babBody->addItemMenu("delete", absences_translate("Delete request"), absences_addon()->getUrl()."vacuser&idx=delete&id_entry=".$id_entry);
3262
			absences_deleteVacationRequest($id_entry);
3263
		}
3264
		
3265
		if ($id_cetdeposit = bab_rp('id_cetdeposit'))
3266
		{
3267
			$babBody->addItemMenu("delete", absences_translate("Delete request"), absences_addon()->getUrl()."vacuser&idx=delete&id_cetdeposit=".$id_cetdeposit);
3268
			absences_deleteCetDepositRequest($id_cetdeposit);
3269
		}
3270
		
3271
		if ($id_recovery = bab_rp('id_recovery'))
3272
		{
3273
			$babBody->addItemMenu("delete", absences_translate("Delete request"), absences_addon()->getUrl()."vacuser&idx=delete&id_recovery=".$id_recovery);
3274
			absences_deleteWpRecoveryRequest($id_recovery);
3275
		}
3276
		
3277
		break;
3278
3279
	case 'viewrights':
3280
		if (absences_IsUserUnderSuperior($_GET['id_user']) || $agent->isManager()) {
3281
			$babBody->setTitle(absences_translate("Balance").' : '.bab_getUserName($_GET['id_user']));
3282
3283
			if (isset($_GET['ide'])) {
3284
				$babBody->addItemMenu("entity_members", absences_translate("Entity members"), absences_addon()->getUrl()."vacchart&idx=entity_members&ide=".$_GET['ide']);
3285
			}
3286
3287
			$babBody->addItemMenu("viewrights", absences_translate("Balance"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3288
			viewrights($_GET['id_user']);
3289
		} else {
3290
			$babBody->msgerror = absences_translate("Access denied");
3291
		}
3292
		break;
3293
3294
		
3295
	case 'subprev':
3296
		$id_entry = (int) bab_rp('id_entry');
3297
		if ($id_entry && bab_isEntryEditable($id_entry))
3298
		{
3299
			absences_saveVacation::submitRequest($id_entry);
3300
			absences_saveVacation::gotoList();
3301
		} else {
3302
			$babBody->msgerror = absences_translate("Access denied to request modification");
3303
		}
3304
			
3305
		break;
3306
		
3307 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...
3308
		absences_createWorkperiodRecoverRequest();
3309
		
3310
		
3311
		if (!bab_rp('id_user')) {
3312
		  $babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3313
		}
3314
		
3315
		$babBody->addItemMenu("workperiod", absences_translate("Working day"), absences_addon()->getUrl()."vacuser&idx=workperiod");
3316
		
3317
		if( $agent->isManager())
3318
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3319
		
3320
		if ($agent->isEntityManager())
3321
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3322
		break;
3323
		
3324 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...
3325
		absences_createCetDepositRequest();
3326
		
3327
		if (!bab_rp('id_user')) {
3328
		    $babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3329
		}
3330
		
3331
		$babBody->addItemMenu("cet", absences_translate("Time saving account"), absences_addon()->getUrl()."vacuser&idx=cet");
3332
		
3333
		if( $agent->isManager())
3334
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3335
		
3336
		if ($agent->isEntityManager())
3337
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3338
		break;
3339
		
3340
	case 'movement':
3341
		
3342
		absences_personalMovements();
3343
		break;
3344
		
3345
	case 'options':
3346
		absences_personalOptions();
3347
		break;
3348
		
3349
	case 'myrights':
3350
		absences_personalRights();
3351
		die();
3352
		break;
3353
		
3354
		
3355
	case 'workinghours':
3356
	    require_once $GLOBALS['babInstallPath'].'utilit/json.php';
3357
	    echo bab_json_encode(absences_getDayWorkingHours(bab_gp('date')));
3358
	    die();
3359
3360
	case 'clear':
3361
		$babDB->db_query("TRUNCATE ".ABSENCES_CALENDAR_TBL);
3362
3363
	case "lvreq":
3364
	default:
3365
		$babBody->title = absences_translate("My already filed requests");
3366
		if( $agent->isInPersonnel() )
3367
		{
3368
			$babBody->babEcho(absences_requestMenu());
3369
			absences_listVacationRequests(bab_getUserId(), false);
3370
			$babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq");
3371
			if (absences_getVacationOption('display_personal_history'))
3372
			{
3373
				$babBody->addItemMenu("movement", absences_translate("History"), absences_addon()->getUrl()."vacuser&idx=movement");
3374
			}
3375
			
3376
			if (absences_getVacationOption('user_add_email'))
3377
			{
3378
				$babBody->addItemMenu("options", absences_translate("Options"), absences_addon()->getUrl()."vacuser&idx=options");
3379
			}
3380
			
3381
		} else {
3382
			
3383 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...
3384
			{
3385
				// manager only
3386
				$url = new bab_url;
3387
				$url->tg = 'addon/absences/vacadm';
3388
				$url->location();
3389
			}
3390
			
3391 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...
3392
			{
3393
				// delegated manager only
3394
				$url = new bab_url;
3395
				$url->tg = 'addon/absences/vacchart';
3396
				$url->location();
3397
			}
3398
		}
3399
			
3400
		if( $agent->isManager())
3401
		{
3402
			$babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm");
3403
		}
3404
3405
		if ($agent->isEntityManager())
3406
		{
3407
			$babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities");
3408
		}
3409
		break;
3410
	}
3411
3412
if ( absences_isPlanningAccessValid())
3413
{
3414
	$babBody->addItemMenu("planning", absences_translate("Plannings"), absences_addon()->getUrl()."planning&idx=userlist");
3415
}
3416
3417
3418
3419
3420
$babBody->setCurrentItemMenu($idx);
3421
bab_siteMap::setPosition('absences','User');
3422
3423