This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
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 | require_once $GLOBALS['babInstallPath'].'utilit/defines.php'; |
||
27 | include_once dirname(__FILE__)."/functions.php"; |
||
28 | include_once dirname(__FILE__)."/utilit/vacincl.php"; |
||
29 | include_once dirname(__FILE__)."/utilit/planningincl.php"; |
||
30 | include_once dirname(__FILE__)."/utilit/agent.class.php"; |
||
31 | |||
32 | |||
33 | |||
34 | |||
35 | |||
36 | |||
37 | |||
38 | class absences_PlanningTreeView |
||
39 | { |
||
40 | public $altbg = true; |
||
41 | |||
42 | |||
43 | private $res; |
||
44 | |||
45 | public function __construct() |
||
46 | { |
||
47 | global $babDB; |
||
48 | |||
49 | $this->t_name = absences_translate('Search by name'); |
||
50 | $this->t_quantity = absences_translate('Quantity'); |
||
51 | |||
52 | } |
||
53 | |||
54 | |||
55 | private function addEntitesToTree(Widget_SimpleTreeView $tree, $root) |
||
56 | { |
||
57 | global $babDB; |
||
58 | $W = bab_Widgets(); |
||
59 | $addon = absences_addon(); |
||
60 | |||
61 | $id_chart = absences_getVacationOption('id_chart'); |
||
62 | $res = $babDB->db_query('SELECT e.id entity, e.name, t.id, t.id_parent |
||
63 | FROM |
||
64 | |||
65 | bab_oc_trees t |
||
66 | LEFT JOIN bab_oc_entities e ON e.id_node=t.id |
||
67 | |||
68 | WHERE t.id_user='.$babDB->quote($id_chart).' ORDER BY name |
||
69 | '); |
||
70 | |||
71 | while ($arr = $babDB->db_fetch_assoc($res)) { |
||
72 | |||
73 | $id_parent = $arr['id_parent'] ? 'entity'.$arr['id_parent'] : $root; |
||
74 | $entity = $W->Link($arr['name'], $addon->getUrl().'planning&idx=entity_cal&ide='.$arr['entity'], 'entity'.$arr['id']); |
||
75 | $entity->addClass('icon')->addClass(Func_Icons::OBJECTS_ORGANIZATION); |
||
76 | |||
77 | $element = $tree->createElement($entity->getId()); |
||
78 | $element->setItem($entity); |
||
79 | |||
80 | $tree->appendElement($element, $id_parent); |
||
81 | |||
82 | $element->addAction( |
||
83 | 'edit_entity', |
||
84 | absences_translate('Edit entity planning'), |
||
85 | $GLOBALS['babSkinPath'] . 'images/Puces/edit.png', |
||
86 | $addon->getUrl().'planning&idx=edit_entity&ide='.$arr['entity'], |
||
87 | '' |
||
88 | ); |
||
89 | } |
||
90 | } |
||
91 | |||
92 | |||
93 | private function addCustomToTree(Widget_SimpleTreeView $tree, $root) |
||
94 | { |
||
95 | global $babDB; |
||
96 | $W = bab_Widgets(); |
||
97 | $addon = absences_addon(); |
||
98 | |||
99 | $res = $babDB->db_query('SELECT id, name FROM absences_custom_planning ORDER BY name'); |
||
100 | while($arr = $babDB->db_fetch_assoc($res)) { |
||
101 | |||
102 | $custom = $W->Link($arr['name'], $addon->getUrl().'planning&idx=custom&id='.$arr['id'], 'custom'.$arr['id']); |
||
103 | $custom->addClass('icon')->addClass(Func_Icons::OBJECTS_ORGANIZATION); |
||
104 | |||
105 | $element = $tree->createElement($custom->getId()); |
||
106 | $element->setItem($custom); |
||
107 | |||
108 | $tree->appendElement($element, $root); |
||
109 | |||
110 | $element->addAction( |
||
111 | 'set_users_custom', |
||
112 | absences_translate('Set custom planning displayed users'), |
||
113 | $GLOBALS['babSkinPath'] . 'images/Puces/user-group-new.png', |
||
114 | $addon->getUrl().'planning&idx=setusers&id='.$arr['id'], |
||
115 | '' |
||
116 | ); |
||
117 | |||
118 | |||
119 | $element->addAction( |
||
120 | 'edit_custom', |
||
121 | absences_translate('Edit custom planning'), |
||
122 | $GLOBALS['babSkinPath'] . 'images/Puces/edit.png', |
||
123 | $addon->getUrl().'planning&idx=edit&id='.$arr['id'], |
||
124 | '' |
||
125 | ); |
||
126 | |||
127 | |||
128 | |||
129 | } |
||
130 | } |
||
131 | |||
132 | |||
133 | public function display() |
||
134 | { |
||
135 | bab_functionality::includefile('Icons'); |
||
136 | |||
137 | $addon = absences_addon(); |
||
138 | $W = bab_Widgets(); |
||
139 | $tree = $W->SimpleTreeView('plannings'); |
||
140 | $tree->setPersistent(); |
||
141 | $tree->addClass(Func_Icons::ICON_LEFT_16); |
||
142 | |||
143 | |||
144 | $rootNode = $tree->createRootNode(absences_translate('Plannings')); |
||
145 | |||
146 | |||
147 | // create nodes for each types |
||
148 | |||
149 | $entities = $W->Icon(absences_translate('Entities'), Func_Icons::APPS_ORGCHARTS)->setId('entities'); |
||
150 | $tree->addItem($entities, 'Root'); |
||
151 | $this->addEntitesToTree($tree, $entities->getId()); |
||
152 | |||
153 | |||
154 | // custom plannings |
||
155 | |||
156 | $item = $W->Icon(absences_translate('Custom plannings'), Func_Icons::APPS_USERS)->setId('custom'); |
||
157 | $element = $tree->createElement($item->getId()); |
||
158 | $element->setItem($item); |
||
159 | |||
160 | $tree->appendElement($element, 'Root'); |
||
161 | $this->addCustomToTree($tree, $item->getId()); |
||
162 | |||
163 | $element->addAction( |
||
164 | 'add', |
||
165 | absences_translate('Add custom planning'), |
||
166 | $GLOBALS['babSkinPath'] . 'images/Puces/edit_add.png', |
||
167 | $addon->getUrl().'planning&idx=edit', |
||
168 | '' |
||
169 | ); |
||
170 | |||
171 | |||
172 | // complete planning |
||
173 | |||
174 | if (bab_isAccessValid('absences_public_planning_groups', 1)) { |
||
175 | $complete = $W->Link(absences_translate('Complete planning'), $addon->getUrl().'planning&idx=public') |
||
176 | ->setId('public') |
||
177 | ->addClass('icon') |
||
178 | ->addClass(Func_Icons::APPS_DIRECTORIES); |
||
179 | |||
180 | $element = $tree->createElement($complete->getId()); |
||
181 | $element->setItem($complete); |
||
182 | |||
183 | $tree->appendElement($element, 'Root'); |
||
184 | } |
||
185 | |||
186 | |||
187 | |||
188 | /* |
||
189 | $element->addAction( |
||
190 | 'configure_public_planning', |
||
191 | absences_translate('configure complete planning'), |
||
192 | $GLOBALS['babSkinPath'] . 'images/Puces/edit.png', |
||
193 | $addon->getUrl().'planning&idx=configure_public_planning', |
||
194 | '' |
||
195 | ); |
||
196 | */ |
||
197 | |||
198 | bab_getBody()->babEcho($tree->display($W->HtmlCanvas())); |
||
199 | } |
||
200 | } |
||
201 | |||
202 | |||
203 | |||
204 | function absences_PlanningSave() |
||
205 | { |
||
206 | global $babDB; |
||
207 | require_once $GLOBALS['babInstallPath'].'admin/acl.php'; |
||
208 | $id_planning = 0; |
||
209 | $arr = bab_pp('planning'); |
||
210 | |||
211 | if (isset($arr['id'])) { |
||
212 | $id_planning = $arr['id']; |
||
213 | } |
||
214 | |||
215 | if ($id_planning) { |
||
216 | $babDB->db_query('UPDATE absences_custom_planning SET name='.$babDB->quote($arr['name']).' |
||
217 | WHERE id='.$babDB->quote($id_planning)); |
||
218 | |||
219 | } else { |
||
220 | |||
221 | $babDB->db_query('INSERT INTO absences_custom_planning (name) VALUES ('.$babDB->quote($arr['name']).')'); |
||
222 | $id_planning = $babDB->db_insert_id(); |
||
223 | } |
||
224 | |||
225 | aclSetRightsString('absences_custom_planning_groups', $id_planning, $arr['groups']); |
||
226 | |||
227 | $url = bab_url::get_request('tg'); |
||
228 | $url->idx = 'list'; |
||
229 | |||
230 | $url->location(); |
||
231 | } |
||
232 | |||
233 | |||
234 | |||
235 | View Code Duplication | function absences_getPlanningValues($id) |
|
236 | { |
||
237 | require_once $GLOBALS['babInstallPath'].'admin/acl.php'; |
||
238 | global $babDB; |
||
239 | |||
240 | $res = $babDB->db_query('SELECT * FROM absences_custom_planning WHERE id='.$babDB->quote($id)); |
||
241 | $arr = $babDB->db_fetch_assoc($res); |
||
242 | |||
243 | $arr['groups'] = aclGetRightsString('absences_custom_planning_groups', $id); |
||
244 | |||
245 | return $arr; |
||
246 | } |
||
247 | |||
248 | |||
249 | |||
250 | |||
251 | function absences_PlanningEdit() |
||
252 | { |
||
253 | |||
254 | if (isset($_POST['planning'])) { |
||
255 | absences_PlanningSave(); |
||
256 | } |
||
257 | |||
258 | |||
259 | $id_planning = (int) bab_rp('id'); |
||
260 | |||
261 | |||
262 | $W = bab_Widgets(); |
||
263 | |||
264 | $page = $W->BabPage(); |
||
265 | |||
266 | if (empty($id_planning)) { |
||
267 | $page->setTitle(absences_translate('Create new planning')); |
||
268 | } else { |
||
269 | $page->setTitle(absences_translate('Edit planning')); |
||
270 | } |
||
271 | |||
272 | |||
273 | $form = $W->Form(null, $W->VBoxLayout()->setVerticalSpacing(2, 'em')); |
||
274 | $form->setHiddenValue('tg', bab_rp('tg')); |
||
275 | $form->setHiddenValue('idx', bab_rp('idx')); |
||
276 | |||
277 | $form->setName('planning'); |
||
278 | $form->addClass(Func_Icons::ICON_LEFT_16); |
||
279 | |||
280 | $form->addClass('BabLoginMenuBackground'); |
||
281 | $form->addClass('widget-bordered'); |
||
282 | |||
283 | $form->addItem($W->LabelledWidget(absences_translate('Name'), $W->LineEdit()->setSize(80), 'name')); |
||
284 | $form->addItem($W->Acl()->setName('groups')->setTitle(absences_translate('Who can view this planning?'))); |
||
285 | |||
286 | $buttons = $W->FlowLayout()->setHorizontalSpacing(3, 'em'); |
||
287 | $buttons->addItem($W->SubmitButton()->setLabel(absences_translate('Save'))); |
||
288 | |||
289 | $form->addItem($buttons); |
||
290 | |||
291 | if ($id_planning) { |
||
292 | |||
293 | $form->setHiddenValue('planning[id]', $id_planning); |
||
294 | $form->setValues(array('planning' => absences_getPlanningValues($id_planning))); |
||
295 | |||
296 | |||
297 | $url = bab_url::get_request('tg', 'id'); |
||
298 | $url->idx = 'delete'; |
||
299 | $buttons->addItem($W->Link(absences_translate('Delete'), $url->toString()) |
||
300 | ->setConfirmationMessage(absences_translate('Do you really want to delete this planning?')) |
||
301 | ->addClass('icon') |
||
302 | ->addClass(Func_Icons::ACTIONS_EDIT_DELETE)); |
||
303 | } |
||
304 | |||
305 | $form->display($W->HtmlCanvas()); |
||
306 | |||
307 | $page->addItem($form); |
||
308 | $page->displayHtml(); |
||
309 | } |
||
310 | |||
311 | |||
312 | |||
313 | function absences_savePlanningUsers($arr) |
||
314 | { |
||
315 | global $babDB; |
||
316 | $id_planning = (int) bab_rp('id'); |
||
317 | |||
318 | $babDB->db_query('DELETE FROM absences_custom_planning_users WHERE id_planning='.$babDB->quote($id_planning)); |
||
319 | |||
320 | foreach($arr as $id_user) { |
||
321 | $babDB->db_query('INSERT INTO absences_custom_planning_users (id_planning, id_user) |
||
322 | VALUES ('.$babDB->quote($id_planning).', '.$babDB->quote($id_user).')'); |
||
323 | } |
||
324 | |||
325 | $url = bab_url::get_request('tg', 'id'); |
||
326 | $url->idx = 'list'; |
||
327 | $url->location(); |
||
328 | } |
||
329 | |||
330 | |||
331 | |||
332 | function absences_PlanningSetUsers() |
||
333 | { |
||
334 | global $babDB; |
||
335 | |||
336 | $babBody = bab_getBody(); |
||
337 | $id_planning = (int) bab_rp('id'); |
||
338 | |||
339 | $res = $babDB->db_query('SELECT name FROM absences_custom_planning WHERE id='.$babDB->quote($id_planning)); |
||
340 | $arr = $babDB->db_fetch_assoc($res); |
||
341 | |||
342 | if (!$arr) { |
||
343 | throw new Exception('This planning does not exists'); |
||
344 | } |
||
345 | |||
346 | $babBody->setTitle(absences_translate("Planning members").' : '.$arr['name']); |
||
347 | |||
348 | include_once $GLOBALS['babInstallPath'].'utilit/selectusers.php'; |
||
349 | global $babBody, $babDB; |
||
350 | $obj = new bab_selectusers(); |
||
351 | $obj->addVar('id', $id_planning); |
||
352 | $res = $babDB->db_query("SELECT id_user FROM absences_custom_planning_users WHERE id_planning=".$babDB->quote($id_planning)); |
||
353 | while (list($id) = $babDB->db_fetch_array($res)) { |
||
354 | $obj->addUser($id); |
||
355 | } |
||
356 | $obj->setRecordCallback('absences_savePlanningUsers'); |
||
357 | $babBody->babecho($obj->getHtml()); |
||
358 | } |
||
359 | |||
360 | |||
361 | |||
362 | |||
363 | function absences_planningDelete() |
||
364 | { |
||
365 | global $babDB; |
||
366 | $id_planning = (int) bab_rp('id'); |
||
367 | |||
368 | $babDB->db_query('DELETE FROM absences_custom_planning WHERE id='.$babDB->quote($id_planning)); |
||
369 | |||
370 | $url = bab_url::get_request('tg'); |
||
371 | $url->idx = 'list'; |
||
372 | |||
373 | $url->location(); |
||
374 | } |
||
375 | |||
376 | View Code Duplication | function absences_getPlanningName($id) |
|
377 | { |
||
378 | global $babDB; |
||
379 | $res = $babDB->db_query("SELECT name FROM absences_custom_planning WHERE id=".$babDB->quote($id)); |
||
380 | $arr = $babDB->db_fetch_assoc($res); |
||
381 | return $arr['name']; |
||
382 | } |
||
383 | |||
384 | function absences_getPlanningUsers($id) |
||
385 | { |
||
386 | global $babDB; |
||
387 | $users = array(); |
||
388 | $res = $babDB->db_query("SELECT id_user FROM absences_custom_planning_users WHERE id_planning=".$babDB->quote($id)); |
||
389 | while (list($id) = $babDB->db_fetch_array($res)) { |
||
390 | $users[$id] = $id; |
||
391 | } |
||
392 | |||
393 | return $users; |
||
394 | } |
||
395 | |||
396 | /** |
||
397 | * Display a vacation calendar, do not test access right per user |
||
398 | * |
||
399 | * @param array $users array of id_user to display |
||
400 | * @param boolean $period allow period selection, first step of vacation request |
||
401 | */ |
||
402 | function absences_displayCalendar($users, $period = false) { |
||
403 | |||
404 | $display_users = false; |
||
405 | $defaultNbMonth = 12; |
||
406 | if (count($users) > 1) { |
||
407 | $display_users = true; |
||
408 | $defaultNbMonth = 1; |
||
409 | } |
||
410 | |||
411 | $nbmonth = (int) bab_rp('nbmonth', $defaultNbMonth); |
||
412 | absences_viewVacationCalendar($users, $period, true, $nbmonth, $display_users); |
||
413 | } |
||
414 | |||
415 | |||
416 | |||
417 | /** |
||
418 | * Display a vacation calendar |
||
419 | * test access rights |
||
420 | * @param array $users array of id_user to display |
||
421 | * @param boolean $period allow period selection, first step of vacation request |
||
422 | */ |
||
423 | function absences_userViewVacationCalendar($users, $period = false) { |
||
424 | |||
425 | global $babBody, $babDB; |
||
426 | $current_agent = absences_Agent::getCurrentUser(); |
||
427 | |||
428 | foreach($users as $uid) { |
||
429 | $target_agent = absences_Agent::getFromIdUser($uid); |
||
430 | if (!$current_agent->canViewCalendarOf($target_agent)) { |
||
431 | $babBody->addError(absences_translate('Access denied')); |
||
432 | $babBody->babPopup(''); |
||
433 | return; |
||
434 | } |
||
435 | } |
||
436 | |||
437 | absences_displayCalendar($users, $period); |
||
438 | } |
||
439 | |||
440 | |||
441 | |||
442 | /** |
||
443 | * Get users to display in a entity calendar |
||
444 | * @param int $ide |
||
445 | */ |
||
446 | function absences_getEntityUsers($ide) |
||
447 | { |
||
448 | global $babDB; |
||
449 | $users = array(); |
||
450 | $res = bab_OCSelectEntityCollaborators($ide); |
||
451 | while ($arr = $babDB->db_fetch_assoc($res)) { |
||
452 | $users[$arr['id_user']] = $arr['id_user']; |
||
453 | } |
||
454 | |||
455 | return $users; |
||
456 | } |
||
457 | |||
458 | |||
459 | /** |
||
460 | * Affiche le planning d'une entite d'organigramme |
||
461 | * @param int $ide |
||
462 | */ |
||
463 | function entity_cal($ide) |
||
464 | { |
||
465 | |||
466 | global $babDB, $babBody; |
||
467 | |||
468 | $agent = absences_Agent::getCurrentUser(); |
||
469 | |||
470 | $entity_planning = (bool) absences_getVacationOption('entity_planning'); |
||
471 | |||
472 | if (!$entity_planning && !$agent->isEntityManager() && !$agent->isManager()) { |
||
473 | $babBody->msgerror = absences_translate("Access denied to entity planning, access has been disabled by administrator"); |
||
474 | return; |
||
475 | } |
||
476 | |||
477 | $entity = bab_OCGetEntity($ide); |
||
478 | bab_getBody()->setTitle($entity['name']); |
||
479 | |||
480 | $display_types = (bool) absences_getVacationOption('entity_planning_display_types'); |
||
481 | |||
482 | |||
483 | $calendars = $agent->getCalendarEntities(); |
||
484 | |||
485 | if (!$display_types) { |
||
486 | // les personnes autorisees peuvent quand meme voir les types |
||
487 | $display_types = (isset($calendars[$ide]) || $agent->isEntityManagerOf($ide)); |
||
488 | } |
||
489 | |||
490 | $users = absences_getEntityUsers($ide); |
||
491 | $all = (bool) bab_rp('all'); |
||
492 | |||
493 | if ($all) { |
||
494 | foreach (absences_getChildsEntities($ide) as $entity) { |
||
495 | $users += absences_getEntityUsers($entity['id']); |
||
496 | } |
||
497 | } |
||
498 | |||
499 | |||
500 | $defaultNbMonth = 12; |
||
501 | if (count($users) > 1) { |
||
502 | $defaultNbMonth = 1; |
||
503 | } |
||
504 | |||
505 | $nbmonth = (int) bab_rp('nbmonth', $defaultNbMonth); |
||
506 | |||
507 | absences_viewVacationCalendar($users, false, $display_types, $nbmonth, true); |
||
508 | |||
509 | } |
||
510 | |||
511 | |||
512 | |||
513 | |||
514 | |||
515 | |||
516 | function absences_saveEntityPlanning($userids, $params) |
||
517 | { |
||
518 | $ide = $params['ide']; |
||
519 | global $babDB; |
||
520 | $babDB->db_query("DELETE FROM ".ABSENCES_PLANNING_TBL." WHERE id_entity = ".$babDB->quote($ide)); |
||
521 | |||
522 | View Code Duplication | foreach ($userids as $uid) |
|
523 | { |
||
524 | $babDB->db_query("INSERT INTO ".ABSENCES_PLANNING_TBL." (id_user, id_entity) VALUES ('".$babDB->db_escape_string($uid)."','".$babDB->db_escape_string($ide)."')"); |
||
525 | } |
||
526 | |||
527 | $agent = absences_Agent::getCurrentUser(); |
||
528 | if ($agent->isManager()) { |
||
529 | header('location:'.absences_addon()->getUrl()."planning&idx=list"); |
||
530 | exit; |
||
531 | } |
||
532 | |||
533 | header('location:'.absences_addon()->getUrl()."vacchart&idx=entities"); |
||
534 | exit; |
||
535 | } |
||
536 | |||
537 | |||
538 | |||
539 | function absences_edit_entity($ide) |
||
540 | { |
||
541 | |||
542 | include_once $GLOBALS['babInstallPath'].'utilit/selectusers.php'; |
||
543 | global $babBody, $babDB; |
||
544 | |||
545 | $e = bab_OCGetEntity($ide); |
||
546 | $babBody->setTitle(sprintf(absences_translate('Planning access "%s" (other than delegated managers above this entity)'),$e['name'])); |
||
547 | |||
548 | $obj = new bab_selectusers(); |
||
549 | $obj->addVar('ide', $ide); |
||
550 | $res = $babDB->db_query("SELECT id_user FROM ".ABSENCES_PLANNING_TBL." WHERE id_entity=".$babDB->quote($ide)); |
||
551 | while (list($id) = $babDB->db_fetch_array($res)) { |
||
552 | $obj->addUser($id); |
||
553 | } |
||
554 | $obj->setRecordCallback('absences_saveEntityPlanning'); |
||
555 | $babBody->babecho($obj->getHtml()); |
||
556 | } |
||
557 | |||
558 | |||
559 | |||
560 | |||
561 | |||
562 | |||
563 | |||
564 | function absences_publicCalendar() |
||
565 | { |
||
566 | global $babBody, $babDB; |
||
567 | |||
568 | if (!bab_isAccessValid('absences_public_planning_groups', 1)) |
||
569 | { |
||
570 | $babBody->addError(absences_translate('Access denied to public calendar')); |
||
571 | return; |
||
572 | } |
||
573 | |||
574 | |||
575 | $nbmonth = (int) bab_rp('nbmonth', 1); |
||
576 | $initusers = absences_getSearchLimit($nbmonth); |
||
577 | |||
578 | $users = array(); |
||
579 | $res = absences_publicCalendarUsers(bab_rp('keyword', null), bab_rp('departments', null), bab_rp('searchtype'), bab_rp('dateb'), bab_rp('datee'), bab_rp('date')); |
||
580 | |||
581 | $i = 0; |
||
582 | View Code Duplication | while ($arr = $babDB->db_fetch_assoc($res)) |
|
583 | { |
||
584 | $users[] = $arr['id']; |
||
585 | if ($i > $initusers) { |
||
586 | break; |
||
587 | } |
||
588 | |||
589 | $i++; |
||
590 | } |
||
591 | |||
592 | absences_viewVacationCalendar($users, false, true, $nbmonth, true, $babDB->db_num_rows($res)); |
||
593 | } |
||
594 | |||
595 | |||
596 | |||
597 | |||
598 | |||
599 | |||
600 | function absence_canViewCalendarOf(absences_Agent $agent) |
||
601 | { |
||
602 | if (bab_isAccessValid('absences_public_planning_groups', 1)) { |
||
603 | return true; |
||
604 | } |
||
605 | |||
606 | require_once $GLOBALS['babInstallPath'].'utilit/userincl.php'; |
||
607 | |||
608 | if (!bab_isUserLogged()) { |
||
609 | return false; |
||
610 | } |
||
611 | |||
612 | $currentAgent = absences_Agent::getCurrentUser(); |
||
613 | if ($currentAgent->canViewCalendarOf($agent)) { |
||
614 | return true; |
||
615 | } |
||
616 | |||
617 | return false; |
||
618 | } |
||
619 | |||
620 | |||
621 | /** |
||
622 | * Ouput JSON for a list of users in one month |
||
623 | * |
||
624 | * @param array $users |
||
625 | * @param int $month |
||
626 | * @param int $year |
||
627 | * @param string $dateb Search by entry dates, datepicker input |
||
628 | * @param string $datee Search by entry dates, datepicker input |
||
629 | * @throws Exception |
||
630 | */ |
||
631 | function absences_ouputUserMonthJson($users, $month, $year, $dateb, $datee) |
||
632 | { |
||
633 | require_once $GLOBALS['babInstallPath'].'utilit/json.php'; |
||
634 | require_once dirname(__FILE__).'/utilit/agent.class.php'; |
||
635 | |||
636 | $users = (array) $users; |
||
637 | $month = (int) $month; |
||
638 | $year = (int) $year; |
||
639 | |||
640 | // convert dates to ISO |
||
641 | |||
642 | $datePicker = bab_Widgets()->DatePicker(); |
||
643 | |||
644 | $dateb = $datePicker->getISODate($dateb); |
||
645 | $datee = $datePicker->getISODate($datee); |
||
646 | |||
647 | |||
648 | $output = array(); |
||
649 | |||
650 | if (empty($users) || 0 === $month || 0 === $year) |
||
651 | { |
||
652 | throw new Exception('Wrong parameters'); |
||
653 | } |
||
654 | |||
655 | |||
656 | |||
657 | foreach($users as $id_user) |
||
658 | { |
||
659 | $id_user = (int) $id_user; |
||
660 | $target_agent = absences_Agent::getFromIdUser($id_user); |
||
661 | |||
662 | if (!absence_canViewCalendarOf($target_agent)) { |
||
663 | continue; |
||
664 | } |
||
665 | |||
666 | $arr = absences_getPeriodIndex($id_user, $month, $year, $dateb, $datee); |
||
667 | foreach($arr as &$v) |
||
668 | { |
||
669 | $v['title'] = bab_convertStringFromDatabase($v['title'], 'UTF-8'); |
||
670 | } |
||
671 | $output[] = $arr; |
||
672 | } |
||
673 | |||
674 | |||
675 | echo bab_json_encode($output); |
||
676 | die(); |
||
677 | } |
||
678 | |||
679 | |||
680 | |||
681 | |||
682 | |||
683 | /** |
||
684 | * Output in json format |
||
685 | * Get the list of user to display in planning, if keyword is empty, return all users |
||
686 | * Get total number of result |
||
687 | * |
||
688 | * @param string $keyword |
||
689 | * @param array $departments |
||
690 | * |
||
691 | */ |
||
692 | function absences_searchUsers($keyword, $departments, $searchtype, $dateb, $datee, $date, $pos, $limit) |
||
693 | { |
||
694 | |||
695 | require_once $GLOBALS['babInstallPath'].'utilit/json.php'; |
||
696 | global $babDB; |
||
697 | |||
698 | if (!bab_isAccessValid('absences_public_planning_groups', 1)) |
||
699 | { |
||
700 | die('Access denied to public calendar'); |
||
701 | } |
||
702 | |||
703 | $pos = (int) $pos; |
||
704 | $limit = (int) $limit; |
||
705 | |||
706 | |||
707 | $res = absences_publicCalendarUsers($keyword, $departments, $searchtype, $dateb, $datee, $date); |
||
708 | $count = $babDB->db_num_rows($res); |
||
709 | |||
710 | if ($pos > $count) |
||
711 | { |
||
712 | die('pos must be lower than total count'); |
||
713 | } |
||
714 | |||
715 | $babDB->db_data_seek($res, $pos); |
||
716 | |||
717 | $return = array( |
||
718 | 'count' => $count, |
||
719 | 'users' => array() |
||
720 | ); |
||
721 | |||
722 | $i = 0; |
||
723 | while($arr = $babDB->db_fetch_assoc($res)) |
||
724 | { |
||
725 | $return['users'][] = array( |
||
726 | 'id' => $arr['id'], |
||
727 | 'name' => bab_convertStringFromDatabase($arr['lastname'].' '.$arr['firstname'], 'UTF-8') |
||
728 | ); |
||
729 | $i++; |
||
730 | |||
731 | if ($i > $limit) |
||
732 | { |
||
733 | break; |
||
734 | } |
||
735 | } |
||
736 | |||
737 | echo bab_json_encode($return); |
||
738 | die(); |
||
739 | } |
||
740 | |||
741 | |||
742 | |||
743 | |||
744 | |||
745 | |||
746 | |||
747 | |||
748 | |||
749 | |||
750 | |||
751 | |||
752 | |||
753 | |||
754 | |||
755 | |||
756 | |||
757 | class absences_AccessiblePlanningsCls |
||
758 | { |
||
759 | var $altbg = true; |
||
760 | |||
761 | private $plannings = array(); |
||
762 | |||
763 | function __construct() |
||
0 ignored issues
–
show
|
|||
764 | { |
||
765 | |||
766 | $this->t_name = absences_translate('Name'); |
||
767 | $this->t_calendar = absences_translate('Planning'); |
||
768 | |||
769 | } |
||
770 | |||
771 | |||
772 | public function addEntities(array $entities) |
||
773 | { |
||
774 | $addon = absences_addon(); |
||
775 | $baseurl = new bab_url($addon->getUrl().'planning'); |
||
776 | $baseurl->idx = 'entity_cal'; |
||
777 | $baseurl->popup = 1; |
||
778 | |||
779 | foreach($entities as $e) { |
||
780 | |||
781 | $url = clone $baseurl; |
||
782 | $url->ide = $e['id']; |
||
783 | |||
784 | $this->plannings[] = array( |
||
785 | 'name' => $e['name'], |
||
786 | 'url' => $url |
||
787 | ); |
||
788 | } |
||
789 | } |
||
790 | |||
791 | |||
792 | public function addCustomPlannings() |
||
793 | { |
||
794 | global $babDB; |
||
795 | |||
796 | $addon = absences_addon(); |
||
797 | $baseurl = new bab_url($addon->getUrl().'planning'); |
||
798 | $baseurl->idx = 'custom'; |
||
799 | $baseurl->popup = 1; |
||
800 | |||
801 | $accessibles = bab_getUserIdObjects('absences_custom_planning_groups'); |
||
802 | |||
803 | $res = $babDB->db_query('SELECT * FROM absences_custom_planning WHERE id IN('.$babDB->quote($accessibles).')'); |
||
804 | while ($arr = $babDB->db_fetch_assoc($res)) { |
||
805 | |||
806 | $url = clone $baseurl; |
||
807 | $url->id = $arr['id']; |
||
808 | |||
809 | $this->plannings[] = array( |
||
810 | 'name' => $arr['name'], |
||
811 | 'url' => $url |
||
812 | ); |
||
813 | } |
||
814 | } |
||
815 | |||
816 | |||
817 | public function addPublicPlanning() |
||
818 | { |
||
819 | if (!bab_isAccessValid('absences_public_planning_groups', 1)) { |
||
820 | return; |
||
821 | } |
||
822 | |||
823 | $addon = absences_addon(); |
||
824 | $url = new bab_url($addon->getUrl().'planning'); |
||
825 | $url->idx = 'public'; |
||
826 | $url->popup = 1; |
||
827 | |||
828 | |||
829 | $this->plannings[] = array( |
||
830 | 'name' => absences_translate('Complete planning'), |
||
831 | 'url' => $url |
||
832 | ); |
||
833 | } |
||
834 | |||
835 | |||
836 | public function sort() |
||
837 | { |
||
838 | bab_Sort::asort($this->plannings, 'name', bab_Sort::CASE_INSENSITIVE); |
||
839 | } |
||
840 | |||
841 | |||
842 | |||
843 | function getnext() |
||
0 ignored issues
–
show
|
|||
844 | { |
||
845 | if (list(,$arr) = each($this->plannings)) { |
||
846 | $this->altbg = !$this->altbg; |
||
847 | $this->name = bab_toHtml($arr['name']); |
||
848 | $this->url = bab_toHtml($arr['url']->toString()); |
||
849 | return true; |
||
850 | } |
||
851 | else |
||
852 | return false; |
||
853 | } |
||
854 | } |
||
855 | |||
856 | |||
857 | |||
858 | |||
859 | |||
860 | |||
861 | |||
862 | |||
863 | /** |
||
864 | * |
||
865 | */ |
||
866 | function absences_accessible_plannings() |
||
867 | { |
||
868 | $babBody = bab_getBody(); |
||
869 | |||
870 | $babBody->setTitle(absences_translate('Plannings list')); |
||
871 | |||
872 | $agent = absences_Agent::getCurrentUser(); |
||
873 | |||
874 | if ($agent->isInPersonnel()) { |
||
875 | $babBody->addItemMenu("lvreq", absences_translate("Requests"), absences_addon()->getUrl()."vacuser&idx=lvreq"); |
||
876 | if (absences_getVacationOption('display_personal_history')) |
||
877 | { |
||
878 | $babBody->addItemMenu("movement", absences_translate("History"), absences_addon()->getUrl()."vacuser&idx=movement"); |
||
879 | } |
||
880 | |||
881 | if (absences_getVacationOption('user_add_email')) |
||
882 | { |
||
883 | $babBody->addItemMenu("options", absences_translate("Options"), absences_addon()->getUrl()."vacuser&idx=options"); |
||
884 | } |
||
885 | } |
||
886 | |||
887 | if( $agent->isManager()) |
||
888 | { |
||
889 | $babBody->addItemMenu("list", absences_translate("Management"), absences_addon()->getUrl()."vacadm"); |
||
890 | } |
||
891 | |||
892 | if ($agent->isEntityManager()) |
||
893 | { |
||
894 | $babBody->addItemMenu("entities", absences_translate("Delegate management"), absences_addon()->getUrl()."vacchart&idx=entities"); |
||
895 | } |
||
896 | |||
897 | $babBody->addItemMenu("userlist", absences_translate("Plannings"), absences_addon()->getUrl()."planning&idx=userlist"); |
||
898 | |||
899 | |||
900 | $entities = $agent->getManagedEntities(); |
||
901 | |||
902 | |||
903 | global $babDB; |
||
904 | $id_oc = absences_getVacationOption('id_chart'); |
||
905 | |||
906 | $res =$babDB->db_query("SELECT e.id, e.name, e.description |
||
907 | FROM ".ABSENCES_PLANNING_TBL." p, |
||
908 | bab_oc_entities e |
||
909 | WHERE p.id_user='".$babDB->db_escape_string($GLOBALS['BAB_SESS_USERID'])."' |
||
910 | AND p.id_entity=e.id |
||
911 | AND e.id_oc=".$babDB->quote($id_oc)); |
||
912 | $entities = array(); |
||
913 | while ($arr = $babDB->db_fetch_assoc($res)) { |
||
914 | $entities[] = $arr; |
||
915 | } |
||
916 | |||
917 | |||
918 | $temp = new absences_AccessiblePlanningsCls(); |
||
919 | $temp->addEntities($entities); |
||
920 | $temp->addCustomPlannings(); |
||
921 | $temp->addPublicPlanning(); |
||
922 | $temp->sort(); |
||
923 | |||
924 | $babBody->babecho(bab_printTemplate($temp, absences_addon()->getRelativePath()."planning.html", 'userlist')); |
||
925 | |||
926 | } |
||
927 | |||
928 | |||
929 | |||
930 | |||
931 | |||
932 | |||
933 | |||
934 | |||
935 | |||
936 | |||
937 | |||
938 | |||
939 | |||
940 | |||
941 | |||
942 | // main |
||
943 | |||
944 | |||
945 | $idx = bab_rp('idx', "cal"); |
||
946 | |||
947 | |||
948 | |||
949 | |||
950 | switch($idx) |
||
951 | { |
||
952 | |||
953 | case 'userlist': |
||
954 | |||
955 | |||
956 | // liste des planning partages accessible a l'utilisateur |
||
957 | // les entites accessibles (gestion delegue et co-gestion), les entites partages, les plannings personnalises accessibles |
||
958 | // et le planning complet |
||
959 | absences_accessible_plannings(); |
||
960 | break; |
||
961 | |||
962 | |||
963 | case 'list': |
||
964 | bab_requireCredential(); |
||
965 | $agent = absences_Agent::getCurrentUser(); |
||
966 | if(!$agent->isManager()) { |
||
967 | $babBody->msgerror = absences_translate("Access denied to planning list"); |
||
968 | return; |
||
969 | } |
||
970 | |||
971 | $treeview = new absences_PlanningTreeView(); |
||
972 | $treeview->display(); |
||
973 | |||
974 | break; |
||
975 | |||
976 | |||
977 | |||
978 | View Code Duplication | case 'edit': // create / edit custom planning |
|
979 | bab_requireCredential(); |
||
980 | $agent = absences_Agent::getCurrentUser(); |
||
981 | if(!$agent->isManager()) { |
||
982 | $babBody->addError(absences_translate("Access denied to planning")); |
||
983 | return; |
||
984 | } |
||
985 | |||
986 | absences_PlanningEdit(); |
||
987 | |||
988 | break; |
||
989 | |||
990 | |||
991 | View Code Duplication | case 'setusers': |
|
992 | bab_requireCredential(); |
||
993 | $agent = absences_Agent::getCurrentUser(); |
||
994 | if(!$agent->isManager()) { |
||
995 | $babBody->addError(absences_translate("Access denied to planning")); |
||
996 | return; |
||
997 | } |
||
998 | |||
999 | absences_PlanningSetUsers(); |
||
1000 | break; |
||
1001 | |||
1002 | |||
1003 | View Code Duplication | case 'delete': |
|
1004 | bab_requireCredential(); |
||
1005 | $agent = absences_Agent::getCurrentUser(); |
||
1006 | if(!$agent->isManager()) { |
||
1007 | $babBody->addError(absences_translate("Access denied to planning")); |
||
1008 | return; |
||
1009 | } |
||
1010 | |||
1011 | absences_planningDelete(); |
||
1012 | break; |
||
1013 | |||
1014 | |||
1015 | case 'custom': |
||
1016 | $agent = absences_Agent::getCurrentUser(); |
||
1017 | if (!$agent->canViewCustomPlanning(bab_rp('id'))) { |
||
1018 | $babBody->addError(absences_translate("Access denied to planning")); |
||
1019 | return; |
||
1020 | } |
||
1021 | $babBody->setTitle(absences_getPlanningName(bab_rp('id'))); |
||
1022 | absences_displayCalendar(absences_getPlanningUsers(bab_rp('id'))); |
||
1023 | break; |
||
1024 | |||
1025 | case "cal": |
||
1026 | bab_requireCredential(); |
||
1027 | $agent = absences_Agent::getCurrentUser(); |
||
1028 | |||
1029 | View Code Duplication | if(!$agent->isInPersonnel() && !$agent->isEntityManager() && !$agent->isManager() && !$agent->isApprover()) |
|
1030 | { |
||
1031 | $babBody->msgerror = absences_translate("Access denied to planning"); |
||
1032 | return; |
||
1033 | } |
||
1034 | |||
1035 | $users = explode(',',bab_rp('idu')); |
||
1036 | absences_userViewVacationCalendar($users); |
||
1037 | break; |
||
1038 | |||
1039 | case 'entity_cal': |
||
1040 | bab_requireCredential(); |
||
1041 | $agent = absences_Agent::getCurrentUser(); |
||
1042 | |||
1043 | $myplanning = false; |
||
1044 | $myEntity = $agent->getMainEntity(); |
||
1045 | if (isset($myEntity)) |
||
1046 | { |
||
1047 | $myplanning = ($myEntity['id'] == bab_rp('ide')); |
||
1048 | } |
||
1049 | |||
1050 | if(!$agent->canViewEntityPlanning(bab_rp('ide'))) |
||
1051 | { |
||
1052 | $babBody->msgerror = absences_translate("Access denied to planning"); |
||
1053 | return; |
||
1054 | } |
||
1055 | |||
1056 | |||
1057 | entity_cal(bab_rp('ide')); |
||
1058 | break; |
||
1059 | |||
1060 | |||
1061 | |||
1062 | case 'edit_entity': // configure partage |
||
1063 | bab_requireCredential(); |
||
1064 | $agent = absences_Agent::getCurrentUser(); |
||
1065 | $babBody->addItemMenu("edit_entity", absences_translate("Planning access"), absences_addon()->getUrl()."planning&idx=entity_requests"); |
||
1066 | |||
1067 | $ide = bab_rp('ide'); |
||
1068 | |||
1069 | if($agent->canViewEntityPlanning($ide)) { |
||
1070 | absences_edit_entity($ide); |
||
1071 | } |
||
1072 | break; |
||
1073 | |||
1074 | |||
1075 | |||
1076 | case 'public': |
||
1077 | absences_publicCalendar(); |
||
1078 | break; |
||
1079 | |||
1080 | |||
1081 | case 'load': // ajax |
||
1082 | |||
1083 | $GLOBALS['babLanguage'] = bab_getLanguage(); |
||
1084 | |||
1085 | // for ovidentia < 8.4.91 |
||
1086 | $babBody = bab_getBody(); |
||
1087 | |||
1088 | absences_ouputUserMonthJson(bab_rp('users'), bab_rp('month'), bab_rp('year'), bab_rp('dateb'), bab_rp('datee')); |
||
1089 | break; |
||
1090 | |||
1091 | |||
1092 | case 'users': // ajax, public calendar only |
||
1093 | $departments = bab_rp('departments'); |
||
1094 | if (empty($departments)) { |
||
1095 | $departments = null; |
||
1096 | } |
||
1097 | |||
1098 | absences_searchUsers(bab_rp('keyword'), $departments, bab_rp('searchtype'), bab_rp('dateb'), bab_rp('datee'), bab_rp('date'), bab_rp('pos'), bab_rp('limit')); |
||
1099 | break; |
||
1100 | } |
||
1101 | |||
1102 | |||
1103 | |||
1104 | $babBody->setCurrentItemMenu($idx); |
||
1105 | bab_siteMap::setPosition('absences','User'); |
Adding explicit visibility (
private
,protected
, orpublic
) is generally recommend to communicate to other developers how, and from where this method is intended to be used.