1 | <?php |
---|
2 | /**************************************************************************\ |
---|
3 | * eGroupWare * |
---|
4 | * http://www.egroupware.org * |
---|
5 | * -------------------------------------------- * |
---|
6 | * This program is free software; you can redistribute it and/or modify it * |
---|
7 | * under the terms of the GNU General Public License as published by the * |
---|
8 | * Free Software Foundation; either version 2 of the License, or (at your * |
---|
9 | * option) any later version. * |
---|
10 | \**************************************************************************/ |
---|
11 | |
---|
12 | /** |
---|
13 | * Camada Model do Organograma. |
---|
14 | * @package Workflow |
---|
15 | * @author Sidnei Augusto Drovetto Jr. - drovetto@gmail.com |
---|
16 | * @license http://www.gnu.org/copyleft/gpl.html GPL |
---|
17 | */ |
---|
18 | class so_orgchart |
---|
19 | { |
---|
20 | /** |
---|
21 | * @var bool True se o usuário for administrador do expresso. |
---|
22 | * @access private |
---|
23 | */ |
---|
24 | private $isAdmin; |
---|
25 | |
---|
26 | /** |
---|
27 | * @var int ID do usuário logado no Expresso |
---|
28 | * @access private |
---|
29 | */ |
---|
30 | private $userID; |
---|
31 | |
---|
32 | /** |
---|
33 | * @var object Link para a ACL do Workflow. |
---|
34 | * @access private |
---|
35 | */ |
---|
36 | private $acl; |
---|
37 | |
---|
38 | /** |
---|
39 | * @var object Link para o Banco de Dados do Workflow. |
---|
40 | * @access private |
---|
41 | */ |
---|
42 | private $db; |
---|
43 | |
---|
44 | /** |
---|
45 | * @var bool Indica se alguns métodos desta classe poderão ser chamados por métodos externos |
---|
46 | * @access private |
---|
47 | */ |
---|
48 | private $externalCalls = false; |
---|
49 | |
---|
50 | /** |
---|
51 | * Checa se o usuário possui acesso ao Organograma ou permissão para modificar determinada organização. |
---|
52 | * @param int $organizationID O ID da organização do Orgranograma. |
---|
53 | * @param bool $checkType Indica se a checagem não depende do ID da organização. |
---|
54 | * @param bool $safeMethod Indica que a checagem pode ser ignorada quando chamada por outras partes do módulo Workflow |
---|
55 | * @return void |
---|
56 | * @access private |
---|
57 | */ |
---|
58 | private function _checkAccess($organizationID = null, $checkType = false, $safeMethod = false) |
---|
59 | { |
---|
60 | /* the user is an administrator */ |
---|
61 | if ($this->isAdmin) |
---|
62 | return true; |
---|
63 | |
---|
64 | if ($safeMethod) |
---|
65 | if ($this->externalCalls) |
---|
66 | return true; |
---|
67 | |
---|
68 | $authorized = false; |
---|
69 | if ($checkType) |
---|
70 | $authorized = $this->acl->checkUserAccessToType('ORG', $this->userID); |
---|
71 | else |
---|
72 | { |
---|
73 | if (!is_numeric($organizationID)) |
---|
74 | $authorized = false; |
---|
75 | else |
---|
76 | $authorized = $this->acl->checkUserAccessToResource('ORG', $this->userID, (int) $organizationID); |
---|
77 | } |
---|
78 | |
---|
79 | if (!$authorized) |
---|
80 | $this->endExecution("Você não tem permissão para executar este procedimento!"); |
---|
81 | } |
---|
82 | |
---|
83 | /** |
---|
84 | * Finaliza a execução e envia uma mensagem serializada (para ser exibida no retorno do Ajax). |
---|
85 | * @param mixed A mensagem que será exibida. Pode ser uma array de mensagens ou uma string. |
---|
86 | * @return void |
---|
87 | * @access private |
---|
88 | */ |
---|
89 | private function endExecution($message) |
---|
90 | { |
---|
91 | if (!is_array($message)) |
---|
92 | $message = array($message); |
---|
93 | |
---|
94 | die(serialize(implode("\n", $message))); |
---|
95 | } |
---|
96 | |
---|
97 | /** |
---|
98 | * Define que alguns métodos desta classe poderão ser chamados. |
---|
99 | * @param bool $satus O status. true para permitir e false para restringir. |
---|
100 | * @return void |
---|
101 | * @access public |
---|
102 | */ |
---|
103 | public function setExternalCalls($status) |
---|
104 | { |
---|
105 | $this->externalCalls = ($status === true); |
---|
106 | } |
---|
107 | |
---|
108 | /** |
---|
109 | * Verifica se houve erro em alguma query do Banco de Dados. |
---|
110 | * @param object $result O resultado de alguma query |
---|
111 | * @return void |
---|
112 | * @access private |
---|
113 | */ |
---|
114 | private function _checkError($result) |
---|
115 | { |
---|
116 | if ($result === false) |
---|
117 | die(serialize("Ocorreu um erro ao se tentar executar a operação solicitada.")); |
---|
118 | } |
---|
119 | |
---|
120 | /** |
---|
121 | * Construtor da classe so_orgchart |
---|
122 | * @return object |
---|
123 | */ |
---|
124 | function so_orgchart() |
---|
125 | { |
---|
126 | $this->userID = $_SESSION['phpgw_info']['workflow']['account_id']; |
---|
127 | $this->isAdmin = $_SESSION['phpgw_info']['workflow']['user_is_admin']; |
---|
128 | $this->acl = &$GLOBALS['ajax']->acl; |
---|
129 | $this->db = &$GLOBALS['workflow']['workflowObjects']->getDBWorkflow()->Link_ID; |
---|
130 | $this->db = &$GLOBALS['workflow']['workflowObjects']->getDBWorkflow()->Link_ID; |
---|
131 | $this->db->SetFetchMode(ADODB_FETCH_ASSOC); |
---|
132 | } |
---|
133 | |
---|
134 | /** |
---|
135 | * Lista todas as organizações do Organograma. |
---|
136 | * @return array Lista de organizações. |
---|
137 | * @access public |
---|
138 | */ |
---|
139 | function getOrganizations() |
---|
140 | { |
---|
141 | $this->_checkAccess(null, true); |
---|
142 | |
---|
143 | if ($this->isAdmin) |
---|
144 | $query = "SELECT organizacao_id, nome, descricao, ativa, url_imagem FROM organizacao ORDER BY nome"; |
---|
145 | else |
---|
146 | { |
---|
147 | $organizations = $this->acl->getUserPermissions("ORG", $this->userID); |
---|
148 | $organizations[] = -1; |
---|
149 | $query = "SELECT organizacao_id, nome, descricao, url_imagem, ativa FROM organizacao WHERE (organizacao_id IN (" . implode(',', $organizations) . ")) ORDER BY nome"; |
---|
150 | } |
---|
151 | $result = $this->db->query($query); |
---|
152 | $this->_checkError($result); |
---|
153 | |
---|
154 | $output = $result->GetArray(-1); |
---|
155 | for ($i = 0; $i < count($output); $i++) |
---|
156 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
157 | unset($output[$i][$j]); |
---|
158 | |
---|
159 | return $output; |
---|
160 | } |
---|
161 | |
---|
162 | /** |
---|
163 | * Adiciona uma organização. |
---|
164 | * @param string $name O nome da organização. |
---|
165 | * @param string $description A descrição da organização. |
---|
166 | * @param string $imageURL O caminho da imagem que representa o organograma da organização. |
---|
167 | * @param char $active 'S' se a organização estiver ativa e 'N' caso contrário. |
---|
168 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
169 | * @access public |
---|
170 | */ |
---|
171 | function addOrganization($name, $description, $imageURL, $active) |
---|
172 | { |
---|
173 | $this->_checkAccess(null, true); |
---|
174 | |
---|
175 | $query = "INSERT INTO organizacao(nome, descricao, url_imagem, ativa) VALUES(?, ?, ?, ?)"; |
---|
176 | $result = $this->db->query($query, array($name, $description, $imageURL, $active)); |
---|
177 | $this->_checkError($result); |
---|
178 | |
---|
179 | return (($result === false) ? false : true); |
---|
180 | } |
---|
181 | |
---|
182 | /** |
---|
183 | * Atualiza as informações sobre uma organização. |
---|
184 | * @param string $name O nome da organização. |
---|
185 | * @param string $description A descrição da organização. |
---|
186 | * @param string $imageURL O caminho da imagem que representa o organograma da organização. |
---|
187 | * @param char $active 'S' se a organização estiver ativa e 'N' caso contrário. |
---|
188 | * @param int $organizationID O ID da organização do Orgranograma. |
---|
189 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
190 | * @access public |
---|
191 | */ |
---|
192 | function updateOrganization($name, $description, $imageURL, $active, $organizationID) |
---|
193 | { |
---|
194 | $this->_checkAccess($organizationID); |
---|
195 | |
---|
196 | $query = "UPDATE organizacao SET nome = ?, descricao = ?, url_imagem = ?, ativa = ? WHERE (organizacao_id = ?)"; |
---|
197 | $result = $this->db->query($query, array($name, $description, $imageURL, $active, $organizationID)); |
---|
198 | $this->_checkError($result); |
---|
199 | |
---|
200 | return (($result === false) ? false : true); |
---|
201 | } |
---|
202 | |
---|
203 | /** |
---|
204 | * Remove uma organização. |
---|
205 | * @param int $organizationID O ID da organização do Orgranograma. |
---|
206 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
207 | * @access public |
---|
208 | */ |
---|
209 | function removeOrganization($organizationID) |
---|
210 | { |
---|
211 | $this->_checkAccess($organizationID); |
---|
212 | |
---|
213 | $query = "DELETE FROM organizacao WHERE (organizacao_id = ?)"; |
---|
214 | $result = $this->db->query($query, array($organizationID)); |
---|
215 | $this->_checkError($result); |
---|
216 | |
---|
217 | return (($result === false) ? false : true); |
---|
218 | } |
---|
219 | |
---|
220 | /** |
---|
221 | * Lista os possíveis status dos funcionários. |
---|
222 | * @param int $organizationID O ID da organização do Orgranograma. |
---|
223 | * @return array Lista dos possíveis status dos empregados. |
---|
224 | * @access public |
---|
225 | */ |
---|
226 | function getEmployeeStatus($organizationID) |
---|
227 | { |
---|
228 | $this->_checkAccess($organizationID); |
---|
229 | |
---|
230 | $query = "SELECT funcionario_status_id, descricao, exibir, organizacao_id FROM funcionario_status WHERE (organizacao_id = ?) ORDER BY descricao"; |
---|
231 | $result = $this->db->query($query, array($organizationID)); |
---|
232 | $this->_checkError($result); |
---|
233 | |
---|
234 | $output = $result->GetArray(-1); |
---|
235 | |
---|
236 | return $output; |
---|
237 | } |
---|
238 | |
---|
239 | /** |
---|
240 | * Adiciona um Status de funcionário. |
---|
241 | * @param int $organizationID O ID da organização do Orgranograma. |
---|
242 | * @param string $description A descrição do status. |
---|
243 | * @param char $show 'S' se o funcionário será exibido na interface de organograma do usuário ou 'N' caso contrário. |
---|
244 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
245 | * @access public |
---|
246 | */ |
---|
247 | function addEmployeeStatus($organizationID, $description, $show) |
---|
248 | { |
---|
249 | $this->_checkAccess($organizationID); |
---|
250 | |
---|
251 | $query = "INSERT INTO funcionario_status(organizacao_id, descricao, exibir) VALUES(?, ?, ?)"; |
---|
252 | $result = $this->db->query($query, array($organizationID, $description, $show)); |
---|
253 | $this->_checkError($result); |
---|
254 | |
---|
255 | return (($result === false) ? false : true); |
---|
256 | } |
---|
257 | |
---|
258 | /** |
---|
259 | * Atualiza um Status de funcionário. |
---|
260 | * @param int $employeeStatusID O ID do status de funcionário. |
---|
261 | * @param int $organizationID O ID da organização do Orgranograma. |
---|
262 | * @param string $description A descrição do status. |
---|
263 | * @param char $show 'S' se o funcionário será exibido na interface de organograma do usuário ou 'N' caso contrário. |
---|
264 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
265 | * @access public |
---|
266 | */ |
---|
267 | function updateEmployeeStatus($employeeStatusID, $organizationID, $description, $show) |
---|
268 | { |
---|
269 | $this->_checkAccess($organizationID); |
---|
270 | |
---|
271 | $query = "UPDATE funcionario_status SET descricao = ?, exibir = ? WHERE (funcionario_status_id = ?) AND (organizacao_id = ?)"; |
---|
272 | $result = $this->db->query($query, array($description, $show, $employeeStatusID, $organizationID)); |
---|
273 | $this->_checkError($result); |
---|
274 | |
---|
275 | return (($result === false) ? false : true); |
---|
276 | } |
---|
277 | |
---|
278 | /** |
---|
279 | * Remove um Status de funcionário. |
---|
280 | * @param int $employeeStatusID O ID do status de funcionário. |
---|
281 | * @param int $organizationID O ID da organização do Orgranograma. |
---|
282 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
283 | * @access public |
---|
284 | */ |
---|
285 | function removeEmployeeStatus($employeeStatusID, $organizationID) |
---|
286 | { |
---|
287 | $this->_checkAccess($organizationID); |
---|
288 | |
---|
289 | $query = "DELETE FROM funcionario_status WHERE (funcionario_status_id = ?) AND (organizacao_id = ?)"; |
---|
290 | $result = $this->db->query($query, array($employeeStatusID, $organizationID)); |
---|
291 | $this->_checkError($result); |
---|
292 | |
---|
293 | return (($result === false) ? false : true); |
---|
294 | } |
---|
295 | |
---|
296 | /** |
---|
297 | * Lista as possíveis categorias de uma organização. |
---|
298 | * @param int $organizationID O ID da organização. |
---|
299 | * @return array Lista das possíveis categorias de uma organização. |
---|
300 | * @access public |
---|
301 | */ |
---|
302 | function getEmployeeCategory($organizationID) |
---|
303 | { |
---|
304 | $this->_checkAccess($organizationID); |
---|
305 | |
---|
306 | $query = "SELECT funcionario_categoria_id, organizacao_id, descricao FROM funcionario_categoria WHERE (organizacao_id = ?) ORDER BY descricao"; |
---|
307 | $result = $this->db->query($query, array($organizationID)); |
---|
308 | $this->_checkError($result); |
---|
309 | |
---|
310 | $output = $result->GetArray(-1); |
---|
311 | for ($i = 0; $i < count($output); $i++) |
---|
312 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
313 | unset($output[$i][$j]); |
---|
314 | |
---|
315 | return $output; |
---|
316 | } |
---|
317 | |
---|
318 | /** |
---|
319 | * Adiciona uma categoria. |
---|
320 | * @param int $organizationID O ID da organização. |
---|
321 | * @param string $description A descrição da categoria. |
---|
322 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
323 | * @access public |
---|
324 | */ |
---|
325 | function addEmployeeCategory($organizationID, $description) |
---|
326 | { |
---|
327 | $this->_checkAccess($organizationID); |
---|
328 | |
---|
329 | $query = "INSERT INTO funcionario_categoria(organizacao_id, descricao) VALUES(?, ?)"; |
---|
330 | $result = $this->db->query($query, array($organizationID, $description)); |
---|
331 | $this->_checkError($result); |
---|
332 | |
---|
333 | return (($result === false) ? false : true); |
---|
334 | } |
---|
335 | |
---|
336 | /** |
---|
337 | * Atualiza uma categoria. |
---|
338 | * @param int $employeeCategoryID O ID da categoria. |
---|
339 | * @param int $organizationID O ID da organização. |
---|
340 | * @param string $description A descrição da categoria. |
---|
341 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
342 | * @access public |
---|
343 | */ |
---|
344 | function updateEmployeeCategory($employeeCategoryID, $organizationID, $description) |
---|
345 | { |
---|
346 | $this->_checkAccess($organizationID); |
---|
347 | |
---|
348 | $query = "UPDATE funcionario_categoria SET descricao = ? WHERE (funcionario_categoria_id = ?) AND (organizacao_id = ?)"; |
---|
349 | $result = $this->db->query($query, array($description, $employeeCategoryID, $organizationID)); |
---|
350 | $this->_checkError($result); |
---|
351 | |
---|
352 | return (($result === false) ? false : true); |
---|
353 | } |
---|
354 | |
---|
355 | /** |
---|
356 | * Remove uma categoria. |
---|
357 | * @param int $employeeCategoryID O ID da categoria. |
---|
358 | * @param int $organizationID O ID da organização. |
---|
359 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
360 | * @access public |
---|
361 | */ |
---|
362 | function removeEmployeeCategory($employeeCategoryID, $organizationID) |
---|
363 | { |
---|
364 | $this->_checkAccess($organizationID); |
---|
365 | |
---|
366 | $query = "DELETE FROM funcionario_categoria WHERE (funcionario_categoria_id = ?) AND (organizacao_id = ?)"; |
---|
367 | $result = $this->db->query($query, array($employeeCategoryID, $organizationID)); |
---|
368 | $this->_checkError($result); |
---|
369 | |
---|
370 | return (($result === false) ? false : true); |
---|
371 | } |
---|
372 | |
---|
373 | /** |
---|
374 | * Lista os possíveis cargos de uma organização. |
---|
375 | * @param int $organizationID O ID da organização. |
---|
376 | * @return array Lista dos possíveis cargos de uma organização. |
---|
377 | * @access public |
---|
378 | */ |
---|
379 | function getJobTitle($organizationID) |
---|
380 | { |
---|
381 | $this->_checkAccess($organizationID); |
---|
382 | |
---|
383 | $query = "SELECT cargo_id, organizacao_id, descricao FROM cargo WHERE (organizacao_id = ?) ORDER BY descricao"; |
---|
384 | $result = $this->db->query($query, array($organizationID)); |
---|
385 | $this->_checkError($result); |
---|
386 | |
---|
387 | $output = $result->GetArray(-1); |
---|
388 | for ($i = 0; $i < count($output); $i++) |
---|
389 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
390 | unset($output[$i][$j]); |
---|
391 | |
---|
392 | return $output; |
---|
393 | } |
---|
394 | |
---|
395 | /** |
---|
396 | * Adiciona um cargo. |
---|
397 | * @param int $organizationID O ID da organização. |
---|
398 | * @param string $description A descrição do cargo. |
---|
399 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
400 | * @access public |
---|
401 | */ |
---|
402 | function addJobTitle($organizationID, $description) |
---|
403 | { |
---|
404 | $this->_checkAccess($organizationID); |
---|
405 | |
---|
406 | $query = "INSERT INTO cargo(organizacao_id, descricao) VALUES(?, ?)"; |
---|
407 | $result = $this->db->query($query, array($organizationID, $description)); |
---|
408 | $this->_checkError($result); |
---|
409 | |
---|
410 | return (($result === false) ? false : true); |
---|
411 | } |
---|
412 | |
---|
413 | /** |
---|
414 | * Atualiza um cargo. |
---|
415 | * @param int $jobTitleID O ID do cargo. |
---|
416 | * @param int $organizationID O ID da organização. |
---|
417 | * @param string $description A descrição do cargo. |
---|
418 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
419 | * @access public |
---|
420 | */ |
---|
421 | function updateJobTitle($jobTitleID, $organizationID, $description) |
---|
422 | { |
---|
423 | $this->_checkAccess($organizationID); |
---|
424 | |
---|
425 | $query = "UPDATE cargo SET descricao = ? WHERE (cargo_id = ?) AND (organizacao_id = ?)"; |
---|
426 | $result = $this->db->query($query, array($description, $jobTitleID, $organizationID)); |
---|
427 | $this->_checkError($result); |
---|
428 | |
---|
429 | return (($result === false) ? false : true); |
---|
430 | } |
---|
431 | |
---|
432 | /** |
---|
433 | * Remove um cargo. |
---|
434 | * @param int $jobTitleID O ID do cargo. |
---|
435 | * @param int $organizationID O ID da organização. |
---|
436 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
437 | * @access public |
---|
438 | */ |
---|
439 | function removeJobTitle($jobTitleID, $organizationID) |
---|
440 | { |
---|
441 | $this->_checkAccess($organizationID); |
---|
442 | |
---|
443 | $query = "DELETE FROM cargo WHERE (cargo_id = ?) AND (organizacao_id = ?)"; |
---|
444 | $result = $this->db->query($query, array($jobTitleID, $organizationID)); |
---|
445 | $this->_checkError($result); |
---|
446 | |
---|
447 | return (($result === false) ? false : true); |
---|
448 | } |
---|
449 | |
---|
450 | /** |
---|
451 | * Lista os possíveis status das áreas de uma organização. |
---|
452 | * @param int $organizationID O ID da organização. |
---|
453 | * @return array Lista dos possíveis status das áreas de uma organização. |
---|
454 | * @access public |
---|
455 | */ |
---|
456 | function getAreaStatus($organizationID) |
---|
457 | { |
---|
458 | $this->_checkAccess($organizationID); |
---|
459 | |
---|
460 | $query = "SELECT area_status_id, organizacao_id, descricao, nivel FROM area_status WHERE organizacao_id = ? ORDER BY descricao"; |
---|
461 | $result = $this->db->query($query, array($organizationID)); |
---|
462 | $this->_checkError($result); |
---|
463 | |
---|
464 | $output = $result->GetArray(-1); |
---|
465 | for ($i = 0; $i < count($output); $i++) |
---|
466 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
467 | unset($output[$i][$j]); |
---|
468 | |
---|
469 | return $output; |
---|
470 | } |
---|
471 | |
---|
472 | /** |
---|
473 | * Adiciona um status de área. |
---|
474 | * @param int $organizationID O ID da organização. |
---|
475 | * @param string $description A descrição do status. |
---|
476 | * @param int $level O nível do status. |
---|
477 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
478 | * @access public |
---|
479 | */ |
---|
480 | function addAreaStatus($organizationID, $description, $level) |
---|
481 | { |
---|
482 | $this->_checkAccess($organizationID); |
---|
483 | |
---|
484 | $query = "INSERT INTO area_status(organizacao_id, descricao, nivel) VALUES(?, ?, ?)"; |
---|
485 | $result = $this->db->query($query, array($organizationID, $description, $level)); |
---|
486 | $this->_checkError($result); |
---|
487 | |
---|
488 | return (($result === false) ? false : true); |
---|
489 | } |
---|
490 | |
---|
491 | /** |
---|
492 | * Atualiza um status de área. |
---|
493 | * @param int $areaStatusID O ID do status da área. |
---|
494 | * @param int $organizationID O ID da organização. |
---|
495 | * @param string $description A descrição do status. |
---|
496 | * @param int $level O nível do status. |
---|
497 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
498 | * @access public |
---|
499 | */ |
---|
500 | function updateAreaStatus($areaStatusID, $organizationID, $description, $level) |
---|
501 | { |
---|
502 | $this->_checkAccess($organizationID); |
---|
503 | |
---|
504 | $query = "UPDATE area_status SET descricao = ?, nivel = ? WHERE (area_status_id = ?) AND (organizacao_id = ?)"; |
---|
505 | $result = $this->db->query($query, array($description, $level, $areaStatusID, $organizationID)); |
---|
506 | $this->_checkError($result); |
---|
507 | |
---|
508 | return (($result === false) ? false : true); |
---|
509 | } |
---|
510 | |
---|
511 | /** |
---|
512 | * Remove um status de área. |
---|
513 | * @param int $areaStatusID O ID do status da área. |
---|
514 | * @param int $organizationID O ID da organização. |
---|
515 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
516 | * @access public |
---|
517 | */ |
---|
518 | function removeAreaStatus($areaStatusID, $organizationID) |
---|
519 | { |
---|
520 | $this->_checkAccess($organizationID); |
---|
521 | |
---|
522 | $query = "DELETE FROM area_status WHERE (area_status_id = ?) AND (organizacao_id = ?)"; |
---|
523 | $result = $this->db->query($query, array($areaStatusID, $organizationID)); |
---|
524 | $this->_checkError($result); |
---|
525 | |
---|
526 | return (($result === false) ? false : true); |
---|
527 | } |
---|
528 | |
---|
529 | /** |
---|
530 | * Lista os centros de custo de uma organização. |
---|
531 | * @param int $organizationID O ID da organização. |
---|
532 | * @return array Lista dos centros de custo de uma organização. |
---|
533 | * @access public |
---|
534 | */ |
---|
535 | function getCostCenter($organizationID) |
---|
536 | { |
---|
537 | $this->_checkAccess($organizationID); |
---|
538 | |
---|
539 | $query = "SELECT organizacao_id, centro_custo_id, nm_centro_custo, descricao, grupo FROM centro_custo WHERE organizacao_id = ? ORDER BY descricao"; |
---|
540 | $result = $this->db->query($query, array($organizationID)); |
---|
541 | $this->_checkError($result); |
---|
542 | |
---|
543 | $output = $result->GetArray(-1); |
---|
544 | for ($i = 0; $i < count($output); $i++) |
---|
545 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
546 | unset($output[$i][$j]); |
---|
547 | |
---|
548 | return $output; |
---|
549 | } |
---|
550 | |
---|
551 | /** |
---|
552 | * Adiciona um centro de custo. |
---|
553 | * @param int $organizationID O ID da organização. |
---|
554 | * @param int $number O número do centro de custo. |
---|
555 | * @param string $description A descrição do centro de custo. |
---|
556 | * @param string $group O grupo do centro de custo. |
---|
557 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
558 | * @access public |
---|
559 | */ |
---|
560 | function addCostCenter($organizationID, $number, $description, $group) |
---|
561 | { |
---|
562 | $this->_checkAccess($organizationID); |
---|
563 | |
---|
564 | $query = "INSERT INTO centro_custo(organizacao_id, nm_centro_custo, descricao, grupo) VALUES(?, ?, ?, ?)"; |
---|
565 | $result = $this->db->query($query, array($organizationID, $number, $description, $group)); |
---|
566 | $this->_checkError($result); |
---|
567 | |
---|
568 | return (($result === false) ? false : true); |
---|
569 | } |
---|
570 | |
---|
571 | /** |
---|
572 | * Atualiza um centro de custo. |
---|
573 | * @param int $organizationID O ID da organização. |
---|
574 | * @param int $number O número do centro de custo. |
---|
575 | * @param string $description A descrição do centro de custo. |
---|
576 | * @param string $group O grupo do centro de custo. |
---|
577 | * @param int $costCenterID O ID do centro de custo. |
---|
578 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
579 | * @access public |
---|
580 | */ |
---|
581 | function updateCostCenter($organizationID, $number, $description, $group, $costCenterID) |
---|
582 | { |
---|
583 | $this->_checkAccess($organizationID); |
---|
584 | |
---|
585 | $query = "UPDATE centro_custo SET organizacao_id = ?, nm_centro_custo = ?, descricao = ?, grupo = ? WHERE (centro_custo_id = ?)"; |
---|
586 | $result = $this->db->query($query, array($organizationID, $number, $description, $group, $costCenterID)); |
---|
587 | $this->_checkError($result); |
---|
588 | |
---|
589 | return (($result === false) ? false : true); |
---|
590 | } |
---|
591 | |
---|
592 | /** |
---|
593 | * Remove um centro de custo. |
---|
594 | * @param int $costCenterID O ID do centro de custo. |
---|
595 | * @param int $organizationID O ID da organização. |
---|
596 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
597 | * @access public |
---|
598 | */ |
---|
599 | function removeCostCenter($costCenterID, $organizationID) |
---|
600 | { |
---|
601 | $this->_checkAccess($organizationID); |
---|
602 | |
---|
603 | $query = "DELETE FROM centro_custo WHERE (centro_custo_id = ?) AND (organizacao_id = ?)"; |
---|
604 | $result = $this->db->query($query, array($costCenterID, $organizationID)); |
---|
605 | $this->_checkError($result); |
---|
606 | |
---|
607 | return (($result === false) ? false : true); |
---|
608 | } |
---|
609 | |
---|
610 | /** |
---|
611 | * Lista as localidade de uma organização. |
---|
612 | * @param int $organizationID O ID da organização. |
---|
613 | * @return array Lista das localidades de uma organização. |
---|
614 | * @access public |
---|
615 | */ |
---|
616 | function getLocal($organizationID) |
---|
617 | { |
---|
618 | $this->_checkAccess($organizationID); |
---|
619 | |
---|
620 | $query = "SELECT organizacao_id, localidade_id, centro_custo_id, descricao FROM localidade WHERE organizacao_id = ? ORDER BY descricao"; |
---|
621 | $result = $this->db->query($query, array($organizationID)); |
---|
622 | $this->_checkError($result); |
---|
623 | |
---|
624 | $output = $result->GetArray(-1); |
---|
625 | for ($i = 0; $i < count($output); $i++) |
---|
626 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
627 | unset($output[$i][$j]); |
---|
628 | |
---|
629 | return $output; |
---|
630 | } |
---|
631 | |
---|
632 | /** |
---|
633 | * Adiciona uma localidade. |
---|
634 | * @param int $organizationID O ID da organização. |
---|
635 | * @param int $costCenterID O ID do centro de custo. |
---|
636 | * @param string $description A descrição da localidade. |
---|
637 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
638 | * @access public |
---|
639 | */ |
---|
640 | function addLocal($organizationID, $costCenter, $description) |
---|
641 | { |
---|
642 | $this->_checkAccess($organizationID); |
---|
643 | |
---|
644 | $query = "INSERT INTO localidade(organizacao_id, centro_custo_id, descricao) VALUES(?, ?, ?)"; |
---|
645 | $result = $this->db->query($query, array($organizationID, $costCenter, $description)); |
---|
646 | $this->_checkError($result); |
---|
647 | |
---|
648 | return (($result === false) ? false : true); |
---|
649 | } |
---|
650 | |
---|
651 | /** |
---|
652 | * Atualiza uma localidade. |
---|
653 | * @param int $organizationID O ID da organização. |
---|
654 | * @param int $costCenterID O ID do centro de custo. |
---|
655 | * @param string $description A descrição da localidade. |
---|
656 | * @param int $localID O ID da localidade. |
---|
657 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
658 | * @access public |
---|
659 | */ |
---|
660 | function updateLocal($organizationID, $costCenter, $description, $localID) |
---|
661 | { |
---|
662 | $this->_checkAccess($organizationID); |
---|
663 | |
---|
664 | $query = "UPDATE localidade SET organizacao_id = ?, centro_custo_id = ?, descricao = ? WHERE (localidade_id = ?)"; |
---|
665 | $result = $this->db->query($query, array($organizationID, $costCenter, $description, $localID)); |
---|
666 | $this->_checkError($result); |
---|
667 | |
---|
668 | return (($result === false) ? false : true); |
---|
669 | } |
---|
670 | |
---|
671 | /** |
---|
672 | * Remove uma localidade. |
---|
673 | * @param int $organizationID O ID da organização. |
---|
674 | * @param int $localID O ID da localidade. |
---|
675 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
676 | * @access public |
---|
677 | */ |
---|
678 | function removeLocal($localID, $organizationID) |
---|
679 | { |
---|
680 | $this->_checkAccess($organizationID); |
---|
681 | |
---|
682 | $query = "DELETE FROM localidade WHERE (localidade_id = ?) AND (organizacao_id = ?)"; |
---|
683 | $result = $this->db->query($query, array($localID, $organizationID)); |
---|
684 | $this->_checkError($result); |
---|
685 | |
---|
686 | return (($result === false) ? false : true); |
---|
687 | } |
---|
688 | |
---|
689 | /** |
---|
690 | * Lista os funcionários de uma determinada área da organização. |
---|
691 | * @param int $areaID O ID da área. |
---|
692 | * @param int $organizationID O ID da organização. |
---|
693 | * @return array Lista dos funcionários de uma determinada área da organização. |
---|
694 | * @access public |
---|
695 | */ |
---|
696 | function getAreaEmployee($areaID, $organizationID) |
---|
697 | { |
---|
698 | $this->_checkAccess($organizationID); |
---|
699 | |
---|
700 | $supervisors = '{' . implode(', ', $this->db->GetRow('SELECT COALESCE(titular_funcionario_id, -1) AS titular_funcionario_id, COALESCE(substituto_funcionario_id, -1) AS substituto_funcionario_id FROM area WHERE (area_id = ?) AND (organizacao_id = ?)', array($areaID, $organizationID))) . '}'; |
---|
701 | $query = "SELECT funcionario_id, funcionario_status_id, centro_custo_id, localidade_id, organizacao_id, area_id, cargo_id, nivel, funcionario_categoria_id FROM funcionario WHERE ((area_id = ?) AND (organizacao_id = ?)) OR (funcionario_id = ANY (?))"; |
---|
702 | $result = $this->db->query($query, array($areaID, $organizationID, $supervisors)); |
---|
703 | $this->_checkError($result); |
---|
704 | |
---|
705 | $output = $result->GetArray(-1); |
---|
706 | $cachedLDAP = $GLOBALS['workflow']['factory']->newInstance('CachedLDAP'); |
---|
707 | $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE); |
---|
708 | for ($i = 0; $i < count($output); $i++) |
---|
709 | { |
---|
710 | $output[$i]['funcionario_id_desc'] = ''; |
---|
711 | $output[$i]['uid'] = ''; |
---|
712 | if (($entry = $cachedLDAP->getEntryByID($output[$i]['funcionario_id']))) |
---|
713 | { |
---|
714 | $output[$i]['funcionario_id_desc'] = $entry['cn']; |
---|
715 | $output[$i]['uid'] = $entry['uid']; |
---|
716 | $output[$i]['removed'] = is_null($entry['last_update']); |
---|
717 | } |
---|
718 | } |
---|
719 | |
---|
720 | usort($output, create_function('$a,$b', 'return strcasecmp($a[\'funcionario_id_desc\'],$b[\'funcionario_id_desc\']);')); |
---|
721 | return $output; |
---|
722 | } |
---|
723 | |
---|
724 | /** |
---|
725 | * Procura por funcionários de acordo com um termo de busca. |
---|
726 | * @param string $searchTerm O termo de busca. Pode ser referente ao ID do funcionário ou ao nome do mesmo. |
---|
727 | * @param int $organizationID O ID da organização. |
---|
728 | * @return array Lista dos funcionários que satisfazem o critério de busca. |
---|
729 | * @access public |
---|
730 | */ |
---|
731 | function searchEmployee($searchTerm, $organizationID) |
---|
732 | { |
---|
733 | $organizationID = (int) $organizationID; |
---|
734 | $this->_checkAccess($organizationID); |
---|
735 | |
---|
736 | /* initialize some variables */ |
---|
737 | $output = array(); |
---|
738 | $unifiedResult = array(); |
---|
739 | |
---|
740 | if (is_numeric($searchTerm)) |
---|
741 | { |
---|
742 | $searchTerm = (int) $searchTerm; |
---|
743 | $ldapSearch = "(&(|(employeenumber={$searchTerm})(uidnumber={$searchTerm}))(phpgwaccounttype=u))"; |
---|
744 | $DBSearch = "SELECT uidnumber, cn, uid, last_update FROM egw_wf_user_cache WHERE (employeenumber = ?) OR (uidnumber = ?)"; |
---|
745 | $DBValues = array($searchTerm, $searchTerm); |
---|
746 | } |
---|
747 | else |
---|
748 | { |
---|
749 | $ldapSearch = "(&(cn=*{$searchTerm}*)(phpgwaccounttype=u))"; |
---|
750 | $DBSearch = "SELECT uidnumber, cn, uid, last_update FROM egw_wf_user_cache WHERE (cn ILIKE ?)"; |
---|
751 | $DBValues = array("%{$searchTerm}%"); |
---|
752 | } |
---|
753 | |
---|
754 | /* search for the $searchTerm in the LDAP */ |
---|
755 | $ldap = &$GLOBALS['workflow']['workflowObjects']->getLDAP(); |
---|
756 | $list = @ldap_search($ldap, $GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP')->getLDAPContext(), $ldapSearch, array('uidnumber', 'cn', 'uid')); |
---|
757 | if ($list === false) |
---|
758 | die(serialize("O sistema de busca não pode ser utilizado nesta organização.")); |
---|
759 | $entries = ldap_get_entries($ldap, $list); |
---|
760 | for ($i=0; $i < $entries['count']; $i++) |
---|
761 | $unifiedResult[$entries[$i]['uidnumber'][0]] = array('name' => $entries[$i]['cn'][0], 'uid' => $entries[$i]['uid'][0], 'removed' => false); |
---|
762 | |
---|
763 | /* search for the $searchTerm in the DB */ |
---|
764 | $resultSet = $GLOBALS['workflow']['workflowObjects']->getDBGalaxia()->Link_ID->query($DBSearch, $DBValues)->GetArray(-1); |
---|
765 | foreach ($resultSet as $row) |
---|
766 | if (!isset($unifiedResult[$row['uidnumber']])) |
---|
767 | $unifiedResult[$row['uidnumber']] = array('name' => $row['cn'], 'uid' => $row['uid'], 'removed' => is_null($row['last_update'])); |
---|
768 | |
---|
769 | /* check if any result was found */ |
---|
770 | if (count($unifiedResult) < 1) |
---|
771 | return $output; |
---|
772 | |
---|
773 | /* load employee information */ |
---|
774 | $query = "SELECT f.funcionario_id, f.funcionario_status_id, f.centro_custo_id, f.localidade_id, f.organizacao_id, f.area_id, f.cargo_id, f.nivel, f.funcionario_categoria_id, a.sigla AS area_sigla FROM funcionario f, area a WHERE (f.area_id = a.area_id) AND (f.organizacao_id = $organizationID) AND (f.funcionario_id IN (" . implode(',', array_keys($unifiedResult)) ."))"; |
---|
775 | $result = $this->db->query($query); |
---|
776 | $this->_checkError($result); |
---|
777 | |
---|
778 | $output = $result->GetArray(-1); |
---|
779 | for ($i = 0; $i < count($output); $i++) |
---|
780 | { |
---|
781 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
782 | unset($output[$i][$j]); |
---|
783 | $output[$i]['funcionario_id_desc'] = $unifiedResult[$output[$i]['funcionario_id']]['name']; |
---|
784 | $output[$i]['uid'] = $unifiedResult[$output[$i]['funcionario_id']]['uid']; |
---|
785 | $output[$i]['removed'] = $unifiedResult[$output[$i]['funcionario_id']]['removed']; |
---|
786 | } |
---|
787 | |
---|
788 | return $output; |
---|
789 | } |
---|
790 | |
---|
791 | /** |
---|
792 | * Adiciona um funcionário. |
---|
793 | * @param int $employeeID O ID do funcionário. |
---|
794 | * @param int $organizationID O ID da organização. |
---|
795 | * @param int $areaID O ID da área. |
---|
796 | * @param int $costCenterID O ID do centro de custo. |
---|
797 | * @param int $localID O ID da localidade. |
---|
798 | * @param int $employeeStatusID O ID do status do funcionário. |
---|
799 | * @param int $jobTitleID O ID do cargo do funcionário. |
---|
800 | * @param int $level O nível do cargo do funcionário. |
---|
801 | * @param int $employeeCategoryID O ID da categoria do funcionário. |
---|
802 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
803 | * @access public |
---|
804 | */ |
---|
805 | function addEmployee($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID) |
---|
806 | { |
---|
807 | $this->_checkAccess($organizationID); |
---|
808 | |
---|
809 | $query = 'SELECT area.sigla FROM funcionario, area WHERE (funcionario.area_id = area.area_id) AND (funcionario.funcionario_id = ?)'; |
---|
810 | if (($row = $this->db->query($query, $employeeID)->fetchRow())) |
---|
811 | { |
---|
812 | $errors = array( |
---|
813 | "O funcionário \"" . $GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP')->getName($employeeID) . "\" já pertença à área \"{$row['sigla']}\".", |
---|
814 | '-----------------', |
---|
815 | 'Caso você queira colocá-lo na área selecionada, siga o procedimento: faça uma busca por seu nome, clique para editá-lo e, troque pela área desejada.' |
---|
816 | ); |
---|
817 | $this->endExecution($errors); |
---|
818 | } |
---|
819 | |
---|
820 | $query = "INSERT INTO funcionario(funcionario_id, organizacao_id, area_id, centro_custo_id, localidade_id, funcionario_status_id, cargo_id, nivel, funcionario_categoria_id) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)"; |
---|
821 | $result = $this->db->query($query, array($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID)); |
---|
822 | $this->_checkError($result); |
---|
823 | |
---|
824 | return (($result === false) ? false : true); |
---|
825 | } |
---|
826 | |
---|
827 | /** |
---|
828 | * Atualiza o funcionário. |
---|
829 | * @param int $employeeID O ID do funcionário. |
---|
830 | * @param int $organizationID O ID da organização. |
---|
831 | * @param int $areaID O ID da área. |
---|
832 | * @param int $costCenterID O ID do centro de custo. |
---|
833 | * @param int $localID O ID da localidade. |
---|
834 | * @param int $employeeStatusID O ID do status do funcionário. |
---|
835 | * @param int $jobTitleID O ID do cargo do funcionário. |
---|
836 | * @param int $level O nível do cargo do funcionário. |
---|
837 | * @param int $employeeCategoryID O ID da categoria do funcionário. |
---|
838 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
839 | * @access public |
---|
840 | */ |
---|
841 | function updateEmployee($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID) |
---|
842 | { |
---|
843 | $this->_checkAccess($organizationID); |
---|
844 | |
---|
845 | $query = "UPDATE funcionario SET area_id = ?, centro_custo_id = ?, localidade_id = ?, funcionario_status_id = ?, cargo_id = ?, nivel = ?, funcionario_categoria_id = ? WHERE (funcionario_id = ?) AND (organizacao_id = ?)"; |
---|
846 | $result = $this->db->query($query, array($areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $employeeID, $organizationID)); |
---|
847 | $this->_checkError($result); |
---|
848 | |
---|
849 | return (($result === false) ? false : true); |
---|
850 | } |
---|
851 | |
---|
852 | /** |
---|
853 | * Remove um funcionário. |
---|
854 | * @param int $employeeID O ID do funcionário. |
---|
855 | * @param int $organizationID O ID da organização. |
---|
856 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
857 | * @access public |
---|
858 | */ |
---|
859 | function removeEmployee($employeeID, $organizationID) |
---|
860 | { |
---|
861 | $this->_checkAccess($organizationID); |
---|
862 | |
---|
863 | $query = 'SELECT sigla FROM area WHERE (? IN (titular_funcionario_id, substituto_funcionario_id, auxiliar_funcionario_id))'; |
---|
864 | $areas = array(); |
---|
865 | $resultSet = $this->db->query($query, $employeeID); |
---|
866 | while (($row = $resultSet->fetchRow())) |
---|
867 | $areas[] = $row['sigla']; |
---|
868 | if (count($areas) > 0) |
---|
869 | { |
---|
870 | $errors = array( |
---|
871 | "O funcionário \"" . $GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP')->getName($employeeID) . "\" é titular, substituto ou auxiliar administrativo das seguintes áreas: " . implode(", ", $areas), |
---|
872 | '-----------------', |
---|
873 | 'Se você quiser excluir este funcionário, precisa removê-lo dos "cargos" que ele possui nas áreas citadas.' |
---|
874 | ); |
---|
875 | $this->endExecution($errors); |
---|
876 | } |
---|
877 | |
---|
878 | $query = "DELETE FROM funcionario WHERE (funcionario_id = ?) AND (organizacao_id = ?)"; |
---|
879 | $result = $this->db->query($query, array($employeeID, $organizationID)); |
---|
880 | $this->_checkError($result); |
---|
881 | |
---|
882 | return (($result === false) ? false : true); |
---|
883 | } |
---|
884 | |
---|
885 | /** |
---|
886 | * Lista as áreas de uma organização. |
---|
887 | * @param int $organizationID O ID da organização. |
---|
888 | * @return array Lista das áreas de uma organização. |
---|
889 | * @access public |
---|
890 | */ |
---|
891 | function getArea($organizationID) |
---|
892 | { |
---|
893 | $this->_checkAccess($organizationID); |
---|
894 | |
---|
895 | $output = array(); |
---|
896 | |
---|
897 | $query = "SELECT area_id, centro_custo_id, organizacao_id, area_status_id, substituto_funcionario_id, titular_funcionario_id, superior_area_id, sigla, descricao, ativa, auxiliar_funcionario_id FROM area WHERE organizacao_id = ? ORDER BY sigla"; |
---|
898 | $result = $this->db->query($query, array($organizationID)); |
---|
899 | $this->_checkError($result); |
---|
900 | |
---|
901 | $ldap = &$GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP'); |
---|
902 | while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) |
---|
903 | { |
---|
904 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
905 | unset($row[$j]); |
---|
906 | $row['substituto_funcionario_id_desc'] = ($row['substituto_funcionario_id'] != '') ? $ldap->getName($row['substituto_funcionario_id']) : ''; |
---|
907 | $row['titular_funcionario_id_desc'] = ($row['titular_funcionario_id'] != '') ? $ldap->getName($row['titular_funcionario_id']) : ''; |
---|
908 | $row['auxiliar_funcionario_id_desc'] = ($row['auxiliar_funcionario_id'] != '') ? $ldap->getName($row['auxiliar_funcionario_id']) : ''; |
---|
909 | $output[] = $row; |
---|
910 | } |
---|
911 | |
---|
912 | return $output; |
---|
913 | } |
---|
914 | |
---|
915 | /** |
---|
916 | * Lista, hierarquicamente, as áreas de uma organização. |
---|
917 | * @param int $organizationID O ID da organização. |
---|
918 | * @param int $parent O ID da área superior (ou NULL para buscar todas as áreas). |
---|
919 | * @param int $depth O nível hierárquico da área (profundidade do nó na árvore do Organograma). |
---|
920 | * @return array Lista hierárquica das áreas de uma organização. |
---|
921 | * @access public |
---|
922 | */ |
---|
923 | function getHierarchicalArea($organizationID, $parent, $depth) |
---|
924 | { |
---|
925 | $this->_checkAccess($organizationID); |
---|
926 | |
---|
927 | if (is_null($parent)){ |
---|
928 | $query = "SELECT a.area_id, a.sigla, a.titular_funcionario_id FROM area a"; |
---|
929 | $query .=" INNER JOIN area_status a_s ON (a_s.area_status_id = a.area_status_id)"; |
---|
930 | $query .=" WHERE (a.superior_area_id IS NULL) AND (a.organizacao_id = ?) AND (a.ativa = 'S') ORDER BY a_s.nivel, a.sigla"; |
---|
931 | $result = $this->db->query($query, array($organizationID)); |
---|
932 | } else { |
---|
933 | $query = "SELECT a.area_id, a.sigla, a.titular_funcionario_id FROM area a"; |
---|
934 | $query .=" INNER JOIN area_status a_s ON (a_s.area_status_id = a.area_status_id)"; |
---|
935 | $query .=" WHERE (a.superior_area_id = ?) AND (a.ativa = 'S') ORDER BY a_s.nivel, a.sigla"; |
---|
936 | $result = $this->db->query($query, array($parent)); |
---|
937 | } |
---|
938 | |
---|
939 | $this->_checkError($result); |
---|
940 | |
---|
941 | $output = $result->GetArray(-1); |
---|
942 | for ($i = 0; $i < count($output); $i++) |
---|
943 | { |
---|
944 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
945 | unset($output[$i][$j]); |
---|
946 | |
---|
947 | $output[$i]['children'] = $this->getHierarchicalArea($organizationID, $output[$i]['area_id'], $depth + 1); |
---|
948 | $output[$i]['depth'] = $depth; |
---|
949 | } |
---|
950 | |
---|
951 | return $output; |
---|
952 | } |
---|
953 | |
---|
954 | /** |
---|
955 | * Adiciona uma área em uma organização. |
---|
956 | * @param int $costCenterID O ID do centro de custo. |
---|
957 | * @param int $organizationID O ID da organização. |
---|
958 | * @param int $areaStatusID O ID do status da área. |
---|
959 | * @param int $backupEmployeeID O ID do funcionário que está substituindo o superior da área. |
---|
960 | * @param int $supervisorID O ID do funcionário que é superior da área. |
---|
961 | * @param int $superiorAreaID O ID da área que é superior a que está sendo adicionada (NULL caso não possua área superior). |
---|
962 | * @param string $acronym A sigla da área. |
---|
963 | * @param string $description A descrição da área. |
---|
964 | * @param char $active 'S' se a área estiver ativa e 'N' caso contrário. |
---|
965 | * @param int $assistantID O ID do funcionário que está auxiliando o superior da área. |
---|
966 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
967 | * @access public |
---|
968 | */ |
---|
969 | function addArea($costCenterID, $organizationID, $areaStatusID, $backupEmployeeID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID) |
---|
970 | { |
---|
971 | $this->_checkAccess($organizationID); |
---|
972 | |
---|
973 | $checkEmployees = array($backupEmployeeID, $supervisorID, $assistantID); |
---|
974 | $errors = array(); |
---|
975 | foreach ($checkEmployees as $checkEmployee) |
---|
976 | { |
---|
977 | if (is_null($checkEmployee)) |
---|
978 | continue; |
---|
979 | |
---|
980 | $query = 'SELECT 1 FROM funcionario WHERE (funcionario_id = ?)'; |
---|
981 | if (!$this->db->query($query, $checkEmployee)->fetchRow()) |
---|
982 | $errors[] = "O funcionário \"" . $GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP')->getName($checkEmployee) . "\" não está vinculado a uma área."; |
---|
983 | } |
---|
984 | |
---|
985 | if (count($errors) > 0) |
---|
986 | { |
---|
987 | $errors[] = '-----------------'; |
---|
988 | $errors[] = 'Se você está iniciando a construção de um organograma, crie as áreas sem titulares/substitutos/auxiliares administrativos e, adicione os funcionários a elas. Só então, adicione os titulares, substitutos, etc. A razão disto, é que estes "cargos" só podem ser ocupados por pessoas que estão vinculadas a alguma área.'; |
---|
989 | $this->endExecution($errors); |
---|
990 | } |
---|
991 | |
---|
992 | $query = "INSERT INTO area(centro_custo_id, organizacao_id, area_status_id, substituto_funcionario_id, titular_funcionario_id, superior_area_id, sigla, descricao, ativa, auxiliar_funcionario_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; |
---|
993 | $result = $this->db->query($query, array($costCenterID, $organizationID, $areaStatusID, $backupEmployeeID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID)); |
---|
994 | $this->_checkError($result); |
---|
995 | |
---|
996 | return (($result === false) ? false : true); |
---|
997 | } |
---|
998 | |
---|
999 | /** |
---|
1000 | * Atualiza a área de uma organização. |
---|
1001 | * @param int $costCenterID O ID do centro de custo. |
---|
1002 | * @param int $organizationID O ID da organização. |
---|
1003 | * @param int $areaStatusID O ID do status da área. |
---|
1004 | * @param int $backupEmployeeID O ID do funcionário que está substituindo o superior da área. |
---|
1005 | * @param int $supervisorID O ID do funcionário que é superior da área. |
---|
1006 | * @param int $superiorAreaID O ID da área que é superior a que está sendo atualizada (NULL caso não possua área superior). |
---|
1007 | * @param string $acronym A sigla da área. |
---|
1008 | * @param string $description A descrição da área. |
---|
1009 | * @param char $active 'S' se a área estiver ativa e 'N' caso contrário. |
---|
1010 | * @param int $areaID O ID da área. |
---|
1011 | * @param int $assistantID O ID do funcionário que está auxiliando o superior da área. |
---|
1012 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
1013 | * @access public |
---|
1014 | */ |
---|
1015 | function updateArea($costCenterID, $organizationID, $areaStatusID, $backupEmployeeID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID, $areaID) |
---|
1016 | { |
---|
1017 | $this->_checkAccess($organizationID); |
---|
1018 | |
---|
1019 | $checkEmployees = array($backupEmployeeID, $supervisorID, $assistantID); |
---|
1020 | $errors = array(); |
---|
1021 | foreach ($checkEmployees as $checkEmployee) |
---|
1022 | { |
---|
1023 | if (is_null($checkEmployee)) |
---|
1024 | continue; |
---|
1025 | |
---|
1026 | $query = 'SELECT 1 FROM funcionario WHERE (funcionario_id = ?)'; |
---|
1027 | if (!$this->db->query($query, $checkEmployee)->fetchRow()) |
---|
1028 | $errors[] = "O funcionário \"" . $GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP')->getName($checkEmployee) . "\" não está vinculado a uma área."; |
---|
1029 | } |
---|
1030 | |
---|
1031 | if (count($errors) > 0) |
---|
1032 | { |
---|
1033 | $errors[] = '-----------------'; |
---|
1034 | $errors[] = 'Somente funcionários que estão vinculados a alguma área podem ser colocados na posição de titular, substituto ou auxiliar administrativo.'; |
---|
1035 | $this->endExecution($errors); |
---|
1036 | } |
---|
1037 | |
---|
1038 | $query = "UPDATE area SET centro_custo_id = ?, organizacao_id = ?, area_status_id = ?, substituto_funcionario_id = ?, titular_funcionario_id = ?, superior_area_id = ?, sigla = ?, descricao = ?, ativa = ?, auxiliar_funcionario_id = ? WHERE (area_id = ?)"; |
---|
1039 | $result = $this->db->query($query, array($costCenterID, $organizationID, $areaStatusID, $backupEmployeeID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID, $areaID)); |
---|
1040 | $this->_checkError($result); |
---|
1041 | |
---|
1042 | return (($result === false) ? false : true); |
---|
1043 | } |
---|
1044 | |
---|
1045 | /** |
---|
1046 | * Remove a área de uma organização. |
---|
1047 | * @param int $areaID O ID da área. |
---|
1048 | * @param int $organizationID O ID da organização. |
---|
1049 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
1050 | * @access public |
---|
1051 | */ |
---|
1052 | function removeArea($areaID, $organizationID) |
---|
1053 | { |
---|
1054 | $this->_checkAccess($organizationID); |
---|
1055 | |
---|
1056 | $query = "DELETE FROM area WHERE (area_id = ?) AND (organizacao_id = ?)"; |
---|
1057 | $result = $this->db->query($query, array($areaID, $organizationID)); |
---|
1058 | $this->_checkError($result); |
---|
1059 | |
---|
1060 | return (($result === false) ? false : true); |
---|
1061 | } |
---|
1062 | |
---|
1063 | /** |
---|
1064 | * Busca informações sobre um funcionário. |
---|
1065 | * @param array $params Uma array contendo o ID do funcionário cujas informações serão extraídas e de sua organização (Ajax). |
---|
1066 | * @param int $employeeID O ID do funcionário. |
---|
1067 | * @param int $organizationID O ID da organização. |
---|
1068 | * @return array Informações sobre o funcionário. |
---|
1069 | * @access public |
---|
1070 | */ |
---|
1071 | function getEmployeeInfo($employeeID, $organizationID) |
---|
1072 | { |
---|
1073 | $this->_checkAccess($organizationID, false, true); |
---|
1074 | |
---|
1075 | require_once dirname(__FILE__) . '/local/classes/class.wf_orgchart.php'; |
---|
1076 | $orgchart = new wf_orgchart(); |
---|
1077 | |
---|
1078 | $outputInfo = array(); |
---|
1079 | |
---|
1080 | $cachedLDAP = $GLOBALS['workflow']['factory']->newInstance('CachedLDAP'); |
---|
1081 | $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE); |
---|
1082 | $employeeEntry = $cachedLDAP->getEntryByID($employeeID); |
---|
1083 | |
---|
1084 | if ($entry === false) |
---|
1085 | return array('error' => 'Funcionário não encontrado.'); |
---|
1086 | $outputInfo[] = array( |
---|
1087 | 'name' => 'Nome', |
---|
1088 | 'value' => $employeeEntry['cn']); |
---|
1089 | |
---|
1090 | if (!empty($employeeEntry['employeenumber'])) |
---|
1091 | { |
---|
1092 | $outputInfo[] = array( |
---|
1093 | 'name' => 'Matrícula', |
---|
1094 | 'value' => $employeeEntry['employeenumber']); |
---|
1095 | } |
---|
1096 | |
---|
1097 | $outputInfo[] = array( |
---|
1098 | 'name' => 'UIDNumber', |
---|
1099 | 'value' => $employeeID); |
---|
1100 | |
---|
1101 | $employeeInfo = $orgchart->getEmployee($employeeID); |
---|
1102 | $employeeStatusInfo = $orgchart->getEmployeeStatus($employeeInfo['funcionario_status_id']); |
---|
1103 | $outputInfo[] = array( |
---|
1104 | 'name' => 'Status', |
---|
1105 | 'value' => $employeeStatusInfo['descricao']); |
---|
1106 | |
---|
1107 | if (!empty($employeeInfo['funcionario_categoria_id'])) |
---|
1108 | { |
---|
1109 | $categoryInfo = $orgchart->getEmployeeCategory($employeeInfo['funcionario_categoria_id']); |
---|
1110 | $outputInfo[] = array( |
---|
1111 | 'name' => 'Vínculo', |
---|
1112 | 'value' => $categoryInfo['descricao']); |
---|
1113 | } |
---|
1114 | |
---|
1115 | if (!empty($employeeInfo['cargo_id'])) |
---|
1116 | { |
---|
1117 | $jobTitleInfo = $orgchart->getJobTitle($employeeInfo['cargo_id']); |
---|
1118 | $outputInfo[] = array( |
---|
1119 | 'name' => 'Cargo', |
---|
1120 | 'value' => $jobTitleInfo['descricao'] . ((!empty($employeeInfo['nivel'])) ? (' (Nível: ' . $employeeInfo['nivel'] . ')') : '')); |
---|
1121 | } |
---|
1122 | |
---|
1123 | $areaInfo = $orgchart->getArea($employeeInfo['area_id']); |
---|
1124 | $outputInfo[] = array( |
---|
1125 | 'name' => 'Área', |
---|
1126 | 'value' => $areaInfo['sigla']); |
---|
1127 | |
---|
1128 | $localInfo = $orgchart->getLocal($employeeInfo['localidade_id']); |
---|
1129 | $outputInfo[] = array( |
---|
1130 | 'name' => 'Localidade', |
---|
1131 | 'value' => $localInfo['descricao']); |
---|
1132 | |
---|
1133 | if (!empty($employeeInfo['centro_custo_id'])) |
---|
1134 | $costCenterInfo = $orgchart->getCostCenter($employeeInfo['centro_custo_id']); |
---|
1135 | else |
---|
1136 | $costCenterInfo = $orgchart->getCostCenter($areaInfo['centro_custo_id']); |
---|
1137 | $outputInfo[] = array( |
---|
1138 | 'name' => 'Centro de Custo', |
---|
1139 | 'value' => $costCenterInfo['descricao']); |
---|
1140 | |
---|
1141 | return array('info' => $outputInfo); |
---|
1142 | } |
---|
1143 | |
---|
1144 | /** |
---|
1145 | * Busca informações sobre uma área. |
---|
1146 | * @param array $params Uma array contendo o ID da área cujas informações serão extraídas e de sua organização (Ajax). |
---|
1147 | * @param int $areaID O ID da área. |
---|
1148 | * @param int $organizationID O ID da organização. |
---|
1149 | * @return array Informações sobre o funcionário. |
---|
1150 | * @access public |
---|
1151 | */ |
---|
1152 | function getAreaInfo($areaID, $organizationID) |
---|
1153 | { |
---|
1154 | $this->_checkAccess($organizationID, false, true); |
---|
1155 | |
---|
1156 | $areaID = (int) $areaID; |
---|
1157 | $organizationID = (int) $organizationID; |
---|
1158 | |
---|
1159 | require_once dirname(__FILE__) . '/local/classes/class.wf_orgchart.php'; |
---|
1160 | $orgchart = new wf_orgchart(); |
---|
1161 | |
---|
1162 | $outputInfo = array(); |
---|
1163 | $areaInfo = $orgchart->getArea($areaID); |
---|
1164 | |
---|
1165 | $outputInfo[] = array( |
---|
1166 | 'name' => 'Nome', |
---|
1167 | 'value' => $areaInfo['descricao'] |
---|
1168 | ); |
---|
1169 | |
---|
1170 | $cachedLDAP = $GLOBALS['workflow']['factory']->newInstance('CachedLDAP'); |
---|
1171 | $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE); |
---|
1172 | if (!empty($areaInfo['titular_funcionario_id'])) |
---|
1173 | { |
---|
1174 | $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['titular_funcionario_id']); |
---|
1175 | $outputInfo[] = array( |
---|
1176 | 'name' => 'Titular', |
---|
1177 | 'value' => $employeeInfo['cn'] |
---|
1178 | ); |
---|
1179 | } |
---|
1180 | |
---|
1181 | if (!empty($areaInfo['substituto_funcionario_id'])) |
---|
1182 | { |
---|
1183 | $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['substituto_funcionario_id']); |
---|
1184 | $outputInfo[] = array( |
---|
1185 | 'name' => 'Substituto', |
---|
1186 | 'value' => $employeeInfo['cn'] |
---|
1187 | ); |
---|
1188 | } |
---|
1189 | |
---|
1190 | if (!empty($areaInfo['auxiliar_funcionario_id'])) |
---|
1191 | { |
---|
1192 | $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['auxiliar_funcionario_id']); |
---|
1193 | $outputInfo[] = array( |
---|
1194 | 'name' => 'Auxiliar Administrativo', |
---|
1195 | 'value' => $employeeInfo['cn'] |
---|
1196 | ); |
---|
1197 | } |
---|
1198 | |
---|
1199 | $outputInfo[] = array( |
---|
1200 | 'name' => 'No. de Funcionários', |
---|
1201 | 'value' => $this->db->GetOne("SELECT COUNT(*) FROM funcionario f, funcionario_status s WHERE (s.funcionario_status_id = f.funcionario_status_id) AND (s.exibir = 'S') AND (f.area_id = ?) AND (f.organizacao_id = ?)", array($areaID, $organizationID)) |
---|
1202 | ); |
---|
1203 | |
---|
1204 | return array('info' => $outputInfo); |
---|
1205 | } |
---|
1206 | } |
---|
1207 | ?> |
---|