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 = &Factory::getInstance('WorkflowObjects')->getDBWorkflow()->Link_ID; |
---|
130 | $this->db = &Factory::getInstance('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, sitio FROM organizacao ORDER BY nome"; |
---|
145 | else |
---|
146 | { |
---|
147 | $organizations = $this->acl->getUserPermissions("ORG", $this->userID, 0); |
---|
148 | $organizations[] = -1; |
---|
149 | $query = "SELECT organizacao_id, nome, descricao, ativa, url_imagem, sitio 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, $siteURL) |
---|
172 | { |
---|
173 | $this->_checkAccess(null, true); |
---|
174 | |
---|
175 | $query = "INSERT INTO organizacao(nome, descricao, url_imagem, ativa, sitio) VALUES(?, ?, ?, ?, ?)"; |
---|
176 | $result = $this->db->query($query, array($name, $description, $imageURL, $active, $siteURL)); |
---|
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, $siteURL) |
---|
193 | { |
---|
194 | $this->_checkAccess($organizationID); |
---|
195 | |
---|
196 | $query = "UPDATE organizacao SET nome = ?, descricao = ?, url_imagem = ?, ativa = ?, sitio = ? WHERE (organizacao_id = ?)"; |
---|
197 | $result = $this->db->query($query, array($name, $description, $imageURL, $active, $siteURL, $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_fields = 'organizacao_id, localidade_id, centro_custo_id, descricao, empresa, endereco, complemento, cep, bairro, cidade, uf'; |
---|
621 | $query = "SELECT {$query_fields} FROM localidade WHERE organizacao_id = ? ORDER BY descricao"; |
---|
622 | $result = $this->db->query($query, array($organizationID)); |
---|
623 | $this->_checkError($result); |
---|
624 | |
---|
625 | $output = $result->GetArray(-1); |
---|
626 | for ($i = 0; $i < count($output); $i++) |
---|
627 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
628 | unset($output[$i][$j]); |
---|
629 | |
---|
630 | return $output; |
---|
631 | } |
---|
632 | |
---|
633 | /** |
---|
634 | * Adiciona uma localidade. |
---|
635 | * @param int $organizationID O ID da organização. |
---|
636 | * @param int $costCenterID O ID do centro de custo. |
---|
637 | * @param string $description A descrição da localidade. |
---|
638 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
639 | * @access public |
---|
640 | */ |
---|
641 | function addLocal($organizationID, $costCenter, $description, $company, $address, $complement, $zipCode, $neighborhood, $city, $state ) |
---|
642 | { |
---|
643 | $this->_checkAccess($organizationID); |
---|
644 | |
---|
645 | $query = "INSERT INTO localidade(organizacao_id, centro_custo_id, descricao, empresa, endereco, complemento, cep, bairro, cidade, uf) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; |
---|
646 | $result = $this->db->query($query, array($organizationID, $costCenter, $description, $company, $address, $complement, $zipCode, $neighborhood, $city, $state )); |
---|
647 | $this->_checkError($result); |
---|
648 | |
---|
649 | return (($result === false) ? false : true); |
---|
650 | } |
---|
651 | |
---|
652 | /** |
---|
653 | * Atualiza uma localidade. |
---|
654 | * @param int $organizationID O ID da organização. |
---|
655 | * @param int $costCenterID O ID do centro de custo. |
---|
656 | * @param string $description A descrição da localidade. |
---|
657 | * @param int $localID O ID da localidade. |
---|
658 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
659 | * @access public |
---|
660 | */ |
---|
661 | function updateLocal($organizationID, $costCenter, $description, $localID, $company, $address, $complement, $zipCode, $neighborhood, $city, $state ) |
---|
662 | { |
---|
663 | $this->_checkAccess($organizationID); |
---|
664 | |
---|
665 | $query = "UPDATE localidade SET organizacao_id = ?, centro_custo_id = ?, descricao = ?, empresa = ?, endereco = ?, complemento = ?, cep = ?, bairro = ?, cidade = ?, uf = ? WHERE (localidade_id = ?)"; |
---|
666 | $result = $this->db->query($query, array($organizationID, $costCenter, $description, $company, $address, $complement, $zipCode, $neighborhood, $city, $state, $localID) ); |
---|
667 | $this->_checkError($result); |
---|
668 | |
---|
669 | return (($result === false) ? false : true); |
---|
670 | } |
---|
671 | |
---|
672 | /** |
---|
673 | * Remove uma localidade. |
---|
674 | * @param int $organizationID O ID da organização. |
---|
675 | * @param int $localID O ID da localidade. |
---|
676 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
677 | * @access public |
---|
678 | */ |
---|
679 | function removeLocal($localID, $organizationID) |
---|
680 | { |
---|
681 | $this->_checkAccess($organizationID); |
---|
682 | |
---|
683 | $query = "DELETE FROM localidade WHERE (localidade_id = ?) AND (organizacao_id = ?)"; |
---|
684 | $result = $this->db->query($query, array($localID, $organizationID)); |
---|
685 | $this->_checkError($result); |
---|
686 | |
---|
687 | return (($result === false) ? false : true); |
---|
688 | } |
---|
689 | |
---|
690 | /** |
---|
691 | * Lista os funcionários de uma determinada área da organização. |
---|
692 | * @param int $areaID O ID da área. |
---|
693 | * @param int $organizationID O ID da organização. |
---|
694 | * @return array Lista dos funcionários de uma determinada área da organização. |
---|
695 | * @access public |
---|
696 | */ |
---|
697 | function getAreaEmployee($areaID, $organizationID) |
---|
698 | { |
---|
699 | $this->_checkAccess($organizationID); |
---|
700 | |
---|
701 | /* gather some info from the area */ |
---|
702 | $areaInfo = $this->db->query('SELECT COALESCE(a.titular_funcionario_id, -1) AS titular_funcionario_id, COALESCE(s.funcionario_id, -1) AS substituto_funcionario_id FROM area a LEFT OUTER JOIN substituicao s ON ((a.area_id = s.area_id) AND (CURRENT_DATE BETWEEN s.data_inicio AND s.data_fim)) WHERE (a.organizacao_id = ?) AND (a.area_id = ?)', array($organizationID, $areaID))->GetArray(-1); |
---|
703 | if (empty($areaInfo)) |
---|
704 | return false; |
---|
705 | $areaInfo = $areaInfo[0]; |
---|
706 | $supervisors = '{' . implode(', ', $areaInfo) . '}'; |
---|
707 | |
---|
708 | $query = "SELECT funcionario_id, funcionario_status_id, centro_custo_id, localidade_id, organizacao_id, area_id, cargo_id, nivel, funcionario_categoria_id, titulo FROM funcionario WHERE ((area_id = ?) AND (organizacao_id = ?)) OR (funcionario_id = ANY (?))"; |
---|
709 | $result = $this->db->query($query, array($areaID, $organizationID, $supervisors)); |
---|
710 | $this->_checkError($result); |
---|
711 | |
---|
712 | $output = $result->GetArray(-1); |
---|
713 | $cachedLDAP = Factory::newInstance('CachedLDAP'); |
---|
714 | $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE); |
---|
715 | for ($i = 0; $i < count($output); $i++) |
---|
716 | { |
---|
717 | $output[$i]['funcionario_id_desc'] = ''; |
---|
718 | $output[$i]['uid'] = ''; |
---|
719 | |
---|
720 | if (in_array($output[$i]['funcionario_id'], $areaInfo)) |
---|
721 | $output[$i]['chief'] = ($output[$i]['funcionario_id'] == $areaInfo['titular_funcionario_id']) ? 1 : 2; |
---|
722 | |
---|
723 | if (($entry = $cachedLDAP->getEntryByID($output[$i]['funcionario_id']))) |
---|
724 | { |
---|
725 | $output[$i]['funcionario_id_desc'] = $entry['cn']; |
---|
726 | $output[$i]['uid'] = $entry['uid']; |
---|
727 | $output[$i]['removed'] = is_null($entry['last_update']); |
---|
728 | } |
---|
729 | } |
---|
730 | |
---|
731 | usort($output, create_function('$a,$b', 'return strcasecmp($a[\'funcionario_id_desc\'],$b[\'funcionario_id_desc\']);')); |
---|
732 | return $output; |
---|
733 | } |
---|
734 | |
---|
735 | /** |
---|
736 | * Procura por funcionários de acordo com um termo de busca. |
---|
737 | * @param string $searchTerm O termo de busca. Pode ser referente ao ID do funcionário ou ao nome do mesmo. |
---|
738 | * @param int $organizationID O ID da organização. |
---|
739 | * @return array Lista dos funcionários que satisfazem o critério de busca. |
---|
740 | * @access public |
---|
741 | */ |
---|
742 | function searchEmployee($searchTerm, $organizationID) |
---|
743 | { |
---|
744 | $organizationID = (int) $organizationID; |
---|
745 | $this->_checkAccess($organizationID); |
---|
746 | |
---|
747 | /* initialize some variables */ |
---|
748 | $output = array(); |
---|
749 | $unifiedResult = array(); |
---|
750 | |
---|
751 | /* FIXME - this piece of code should use the new CacheLdap class */ |
---|
752 | if (is_numeric($searchTerm)) |
---|
753 | { |
---|
754 | $searchTerm = (int) $searchTerm; |
---|
755 | $ldapSearch = "(&(|(employeenumber={$searchTerm})(uidnumber={$searchTerm}))(phpgwaccounttype=u))"; |
---|
756 | $DBSearch = "SELECT uidnumber, cn, uid, last_update FROM egw_wf_user_cache WHERE (employeenumber = ?) OR (uidnumber = ?)"; |
---|
757 | $DBValues = array($searchTerm, $searchTerm); |
---|
758 | } |
---|
759 | else |
---|
760 | { |
---|
761 | $ldapSearch = "(&(cn=*{$searchTerm}*)(phpgwaccounttype=u))"; |
---|
762 | $DBSearch = "SELECT uidnumber, cn, uid, last_update FROM egw_wf_user_cache WHERE (cn ILIKE ?)"; |
---|
763 | $DBValues = array("%{$searchTerm}%"); |
---|
764 | } |
---|
765 | |
---|
766 | /* search for the $searchTerm in the LDAP */ |
---|
767 | $ldap = &Factory::getInstance('WorkflowObjects')->getLDAP(); |
---|
768 | $list = @ldap_search($ldap, Factory::getInstance('WorkflowLDAP')->getLDAPContext(), $ldapSearch, array('uidnumber', 'cn', 'uid')); |
---|
769 | if ($list === false) |
---|
770 | die(serialize("O sistema de busca não pode ser utilizado nesta organização.")); |
---|
771 | $entries = ldap_get_entries($ldap, $list); |
---|
772 | for ($i=0; $i < $entries['count']; $i++) |
---|
773 | $unifiedResult[$entries[$i]['uidnumber'][0]] = array('name' => $entries[$i]['cn'][0], 'uid' => $entries[$i]['uid'][0], 'removed' => false); |
---|
774 | |
---|
775 | /* search for the $searchTerm in the DB */ |
---|
776 | $resultSet = Factory::getInstance('WorkflowObjects')->getDBGalaxia()->Link_ID->query($DBSearch, $DBValues)->GetArray(-1); |
---|
777 | foreach ($resultSet as $row) |
---|
778 | if (!isset($unifiedResult[$row['uidnumber']])) |
---|
779 | $unifiedResult[$row['uidnumber']] = array('name' => $row['cn'], 'uid' => $row['uid'], 'removed' => is_null($row['last_update'])); |
---|
780 | |
---|
781 | /* check if any result was found */ |
---|
782 | if (count($unifiedResult) < 1) |
---|
783 | return $output; |
---|
784 | |
---|
785 | /* load employee information */ |
---|
786 | $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, f.titulo, 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)) ."))"; |
---|
787 | $result = $this->db->query($query); |
---|
788 | $this->_checkError($result); |
---|
789 | |
---|
790 | $output = $result->GetArray(-1); |
---|
791 | for ($i = 0; $i < count($output); $i++) |
---|
792 | { |
---|
793 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
794 | unset($output[$i][$j]); |
---|
795 | $output[$i]['funcionario_id_desc'] = $unifiedResult[$output[$i]['funcionario_id']]['name']; |
---|
796 | $output[$i]['uid'] = $unifiedResult[$output[$i]['funcionario_id']]['uid']; |
---|
797 | $output[$i]['removed'] = $unifiedResult[$output[$i]['funcionario_id']]['removed']; |
---|
798 | } |
---|
799 | |
---|
800 | return $output; |
---|
801 | } |
---|
802 | |
---|
803 | /** |
---|
804 | * Adiciona um funcionário. |
---|
805 | * @param int $employeeID O ID do funcionário. |
---|
806 | * @param int $organizationID O ID da organização. |
---|
807 | * @param int $areaID O ID da área. |
---|
808 | * @param int $costCenterID O ID do centro de custo. |
---|
809 | * @param int $localID O ID da localidade. |
---|
810 | * @param int $employeeStatusID O ID do status do funcionário. |
---|
811 | * @param int $jobTitleID O ID do cargo do funcionário. |
---|
812 | * @param int $level O nível do cargo do funcionário. |
---|
813 | * @param int $employeeCategoryID O ID da categoria do funcionário. |
---|
814 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
815 | * @access public |
---|
816 | */ |
---|
817 | function addEmployee($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title) |
---|
818 | { |
---|
819 | $this->_checkAccess($organizationID); |
---|
820 | |
---|
821 | $query = 'SELECT area.sigla FROM funcionario, area WHERE (funcionario.area_id = area.area_id) AND (funcionario.funcionario_id = ?)'; |
---|
822 | if (($row = $this->db->query($query, $employeeID)->fetchRow())) |
---|
823 | { |
---|
824 | $errors = array( |
---|
825 | "O funcionário \"" . Factory::getInstance('WorkflowLDAP')->getName($employeeID) . "\" já pertença à área \"{$row['sigla']}\".", |
---|
826 | '-----------------', |
---|
827 | '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.' |
---|
828 | ); |
---|
829 | $this->endExecution($errors); |
---|
830 | } |
---|
831 | |
---|
832 | $query = "INSERT INTO funcionario(funcionario_id, organizacao_id, area_id, centro_custo_id, localidade_id, funcionario_status_id, cargo_id, nivel, funcionario_categoria_id, titulo) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; |
---|
833 | $result = $this->db->query($query, array($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title)); |
---|
834 | $this->_checkError($result); |
---|
835 | |
---|
836 | return (($result === false) ? false : true); |
---|
837 | } |
---|
838 | |
---|
839 | /** |
---|
840 | * Atualiza o funcionário. |
---|
841 | * @param int $employeeID O ID do funcionário. |
---|
842 | * @param int $organizationID O ID da organização. |
---|
843 | * @param int $areaID O ID da área. |
---|
844 | * @param int $costCenterID O ID do centro de custo. |
---|
845 | * @param int $localID O ID da localidade. |
---|
846 | * @param int $employeeStatusID O ID do status do funcionário. |
---|
847 | * @param int $jobTitleID O ID do cargo do funcionário. |
---|
848 | * @param int $level O nível do cargo do funcionário. |
---|
849 | * @param int $employeeCategoryID O ID da categoria do funcionário. |
---|
850 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
851 | * @access public |
---|
852 | */ |
---|
853 | function updateEmployee($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title) |
---|
854 | { |
---|
855 | $this->_checkAccess($organizationID); |
---|
856 | |
---|
857 | $query = "UPDATE funcionario SET area_id = ?, centro_custo_id = ?, localidade_id = ?, funcionario_status_id = ?, cargo_id = ?, nivel = ?, funcionario_categoria_id = ?, titulo = ? WHERE (funcionario_id = ?) AND (organizacao_id = ?)"; |
---|
858 | $result = $this->db->query($query, array($areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title, $employeeID, $organizationID)); |
---|
859 | $this->_checkError($result); |
---|
860 | |
---|
861 | return (($result === false) ? false : true); |
---|
862 | } |
---|
863 | |
---|
864 | /** |
---|
865 | * Remove um funcionário. |
---|
866 | * @param int $employeeID O ID do funcionário. |
---|
867 | * @param int $organizationID O ID da organização. |
---|
868 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
869 | * @access public |
---|
870 | */ |
---|
871 | function removeEmployee($employeeID, $organizationID) |
---|
872 | { |
---|
873 | $this->_checkAccess($organizationID); |
---|
874 | |
---|
875 | $query = 'SELECT DISTINCT(a.sigla) FROM area a LEFT OUTER JOIN substituicao s USING (area_id) WHERE (? IN (a.titular_funcionario_id, s.funcionario_id, a.auxiliar_funcionario_id))'; |
---|
876 | $areas = array(); |
---|
877 | $resultSet = $this->db->query($query, $employeeID); |
---|
878 | while (($row = $resultSet->fetchRow())) |
---|
879 | $areas[] = $row['sigla']; |
---|
880 | if (count($areas) > 0) |
---|
881 | { |
---|
882 | $errors = array( |
---|
883 | "O funcionário \"" . Factory::getInstance('WorkflowLDAP')->getName($employeeID) . "\" é titular, substituto, já participou de substituição ou é auxiliar administrativo das seguintes áreas: " . implode(", ", $areas), |
---|
884 | '-----------------', |
---|
885 | 'Se você quiser excluir este funcionário, precisa removê-lo dos "cargos" que ele possui nas áreas citadas.' |
---|
886 | ); |
---|
887 | $this->endExecution($errors); |
---|
888 | } |
---|
889 | |
---|
890 | $query = "DELETE FROM funcionario WHERE (funcionario_id = ?) AND (organizacao_id = ?)"; |
---|
891 | $result = $this->db->query($query, array($employeeID, $organizationID)); |
---|
892 | $this->_checkError($result); |
---|
893 | |
---|
894 | return (($result === false) ? false : true); |
---|
895 | } |
---|
896 | |
---|
897 | /** |
---|
898 | * Lista as áreas de uma organização. |
---|
899 | * @param int $organizationID O ID da organização. |
---|
900 | * @return array Lista das áreas de uma organização. |
---|
901 | * @access public |
---|
902 | */ |
---|
903 | function getArea($organizationID, $areaID = -1) |
---|
904 | { |
---|
905 | $this->_checkAccess($organizationID); |
---|
906 | |
---|
907 | $output = array(); |
---|
908 | $values = array($organizationID); |
---|
909 | |
---|
910 | // if we are looking for a specific area |
---|
911 | $area_condition = ""; |
---|
912 | if (($areaID != -1) && !empty($areaID)) { |
---|
913 | $area_condition = " AND a.area_id = ? "; |
---|
914 | $values[]= $areaID; |
---|
915 | } |
---|
916 | |
---|
917 | $query = "SELECT a.area_id, a.centro_custo_id, a.organizacao_id, a.area_status_id, a.titular_funcionario_id, a.superior_area_id, a.sigla, a.descricao, a.ativa, a.auxiliar_funcionario_id, s.funcionario_id as substituto_funcionario_id FROM area a LEFT OUTER JOIN substituicao s ON ((a.area_id = s.area_id) AND (CURRENT_DATE BETWEEN s.data_inicio AND s.data_fim)) WHERE organizacao_id = ? " . $area_condition . " ORDER BY sigla"; |
---|
918 | $result = $this->db->query($query, $values); |
---|
919 | $this->_checkError($result); |
---|
920 | |
---|
921 | $ldap = &Factory::getInstance('WorkflowLDAP'); |
---|
922 | while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) |
---|
923 | { |
---|
924 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
925 | unset($row[$j]); |
---|
926 | $row['substituto_funcionario_id_desc'] = ($row['substituto_funcionario_id'] != '') ? $ldap->getName($row['substituto_funcionario_id']) : ''; |
---|
927 | $row['titular_funcionario_id_desc'] = ($row['titular_funcionario_id'] != '') ? $ldap->getName($row['titular_funcionario_id']) : ''; |
---|
928 | $row['auxiliar_funcionario_id_desc'] = ($row['auxiliar_funcionario_id'] != '') ? $ldap->getName($row['auxiliar_funcionario_id']) : ''; |
---|
929 | $output[] = $row; |
---|
930 | } |
---|
931 | |
---|
932 | return $output; |
---|
933 | } |
---|
934 | |
---|
935 | /** |
---|
936 | * Lista, hierarquicamente, as áreas de uma organização. |
---|
937 | * @param int $organizationID O ID da organização. |
---|
938 | * @param int $parent O ID da área superior (ou NULL para buscar todas as áreas). |
---|
939 | * @param int $depth O nível hierárquico da área (profundidade do nó na árvore do Organograma). |
---|
940 | * @return array Lista hierárquica das áreas de uma organização. |
---|
941 | * @access public |
---|
942 | */ |
---|
943 | function getHierarchicalArea($organizationID, $parent, $depth) |
---|
944 | { |
---|
945 | $this->_checkAccess($organizationID); |
---|
946 | |
---|
947 | if (is_null($parent)){ |
---|
948 | $query = "SELECT a.area_id, a.sigla, a.titular_funcionario_id FROM area a"; |
---|
949 | $query .=" INNER JOIN area_status a_s ON (a_s.area_status_id = a.area_status_id)"; |
---|
950 | $query .=" WHERE (a.superior_area_id IS NULL) AND (a.organizacao_id = ?) AND (a.ativa = 'S') ORDER BY a_s.nivel, a.sigla"; |
---|
951 | $result = $this->db->query($query, array($organizationID)); |
---|
952 | } else { |
---|
953 | $query = "SELECT a.area_id, a.sigla, a.titular_funcionario_id FROM area a"; |
---|
954 | $query .=" INNER JOIN area_status a_s ON (a_s.area_status_id = a.area_status_id)"; |
---|
955 | $query .=" WHERE (a.superior_area_id = ?) AND (a.ativa = 'S') ORDER BY a_s.nivel, a.sigla"; |
---|
956 | $result = $this->db->query($query, array($parent)); |
---|
957 | } |
---|
958 | |
---|
959 | $this->_checkError($result); |
---|
960 | |
---|
961 | $output = $result->GetArray(-1); |
---|
962 | for ($i = 0; $i < count($output); $i++) |
---|
963 | { |
---|
964 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
965 | unset($output[$i][$j]); |
---|
966 | |
---|
967 | $output[$i]['children'] = $this->getHierarchicalArea($organizationID, $output[$i]['area_id'], $depth + 1); |
---|
968 | $output[$i]['depth'] = $depth; |
---|
969 | } |
---|
970 | |
---|
971 | return $output; |
---|
972 | } |
---|
973 | |
---|
974 | /** |
---|
975 | * Adiciona uma área em uma organização. |
---|
976 | * @param int $costCenterID O ID do centro de custo. |
---|
977 | * @param int $organizationID O ID da organização. |
---|
978 | * @param int $areaStatusID O ID do status da área. |
---|
979 | * @param int $supervisorID O ID do funcionário que é superior da área. |
---|
980 | * @param int $superiorAreaID O ID da área que é superior a que está sendo adicionada (NULL caso não possua área superior). |
---|
981 | * @param string $acronym A sigla da área. |
---|
982 | * @param string $description A descrição da área. |
---|
983 | * @param char $active 'S' se a área estiver ativa e 'N' caso contrário. |
---|
984 | * @param int $assistantID O ID do funcionário que está auxiliando o superior da área. |
---|
985 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
986 | * @access public |
---|
987 | */ |
---|
988 | function addArea($costCenterID, $organizationID, $areaStatusID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID) |
---|
989 | { |
---|
990 | $this->_checkAccess($organizationID); |
---|
991 | |
---|
992 | $checkEmployees = array($supervisorID, $assistantID); |
---|
993 | $errors = array(); |
---|
994 | foreach ($checkEmployees as $checkEmployee) |
---|
995 | { |
---|
996 | if (is_null($checkEmployee)) |
---|
997 | continue; |
---|
998 | |
---|
999 | $query = 'SELECT 1 FROM funcionario WHERE (funcionario_id = ?)'; |
---|
1000 | if (!$this->db->query($query, $checkEmployee)->fetchRow()) |
---|
1001 | $errors[] = "O funcionário \"" . Factory::getInstance('WorkflowLDAP')->getName($checkEmployee) . "\" não está vinculado a uma área."; |
---|
1002 | } |
---|
1003 | |
---|
1004 | if (count($errors) > 0) |
---|
1005 | { |
---|
1006 | $errors[] = '-----------------'; |
---|
1007 | $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.'; |
---|
1008 | $this->endExecution($errors); |
---|
1009 | } |
---|
1010 | |
---|
1011 | $query = "INSERT INTO area(centro_custo_id, organizacao_id, area_status_id, titular_funcionario_id, superior_area_id, sigla, descricao, ativa, auxiliar_funcionario_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; |
---|
1012 | $result = $this->db->query($query, array($costCenterID, $organizationID, $areaStatusID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID)); |
---|
1013 | $this->_checkError($result); |
---|
1014 | |
---|
1015 | return (($result === false) ? false : true); |
---|
1016 | } |
---|
1017 | |
---|
1018 | /** |
---|
1019 | * Atualiza a área de uma organização. |
---|
1020 | * @param int $costCenterID O ID do centro de custo. |
---|
1021 | * @param int $organizationID O ID da organização. |
---|
1022 | * @param int $areaStatusID O ID do status da área. |
---|
1023 | * @param int $supervisorID O ID do funcionário que é superior da área. |
---|
1024 | * @param int $superiorAreaID O ID da área que é superior a que está sendo atualizada (NULL caso não possua área superior). |
---|
1025 | * @param string $acronym A sigla da área. |
---|
1026 | * @param string $description A descrição da área. |
---|
1027 | * @param char $active 'S' se a área estiver ativa e 'N' caso contrário. |
---|
1028 | * @param int $areaID O ID da área. |
---|
1029 | * @param int $assistantID O ID do funcionário que está auxiliando o superior da área. |
---|
1030 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
1031 | * @access public |
---|
1032 | */ |
---|
1033 | function updateArea($costCenterID, $organizationID, $areaStatusID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID, $areaID) |
---|
1034 | { |
---|
1035 | $this->_checkAccess($organizationID); |
---|
1036 | |
---|
1037 | $checkEmployees = array($supervisorID, $assistantID); |
---|
1038 | $errors = array(); |
---|
1039 | foreach ($checkEmployees as $checkEmployee) |
---|
1040 | { |
---|
1041 | if (is_null($checkEmployee)) |
---|
1042 | continue; |
---|
1043 | |
---|
1044 | $query = 'SELECT 1 FROM funcionario WHERE (funcionario_id = ?)'; |
---|
1045 | if (!$this->db->query($query, $checkEmployee)->fetchRow()) |
---|
1046 | $errors[] = "O funcionário \"" . Factory::getInstance('WorkflowLDAP')->getName($checkEmployee) . "\" não está vinculado a uma área."; |
---|
1047 | } |
---|
1048 | |
---|
1049 | if (count($errors) > 0) |
---|
1050 | { |
---|
1051 | $errors[] = '-----------------'; |
---|
1052 | $errors[] = 'Somente funcionários que estão vinculados a alguma área podem ser colocados na posição de titular ou auxiliar administrativo.'; |
---|
1053 | $this->endExecution($errors); |
---|
1054 | } |
---|
1055 | |
---|
1056 | $query = "UPDATE area SET centro_custo_id = ?, organizacao_id = ?, area_status_id = ?, titular_funcionario_id = ?, superior_area_id = ?, sigla = ?, descricao = ?, ativa = ?, auxiliar_funcionario_id = ? WHERE (area_id = ?)"; |
---|
1057 | $result = $this->db->query($query, array($costCenterID, $organizationID, $areaStatusID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID, $areaID)); |
---|
1058 | $this->_checkError($result); |
---|
1059 | |
---|
1060 | return (($result === false) ? false : true); |
---|
1061 | } |
---|
1062 | |
---|
1063 | /** |
---|
1064 | * Remove a área de uma organização. |
---|
1065 | * @param int $areaID O ID da área. |
---|
1066 | * @param int $organizationID O ID da organização. |
---|
1067 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
1068 | * @access public |
---|
1069 | */ |
---|
1070 | function removeArea($areaID, $organizationID) |
---|
1071 | { |
---|
1072 | $this->_checkAccess($organizationID); |
---|
1073 | |
---|
1074 | $query = "DELETE FROM area WHERE (area_id = ?) AND (organizacao_id = ?)"; |
---|
1075 | $result = $this->db->query($query, array($areaID, $organizationID)); |
---|
1076 | $this->_checkError($result); |
---|
1077 | |
---|
1078 | return (($result === false) ? false : true); |
---|
1079 | } |
---|
1080 | |
---|
1081 | /** |
---|
1082 | * Busca informações sobre um funcionário. |
---|
1083 | * @param array $params Uma array contendo o ID do funcionário cujas informações serão extraídas e de sua organização (Ajax). |
---|
1084 | * @param int $employeeID O ID do funcionário. |
---|
1085 | * @param int $organizationID O ID da organização. |
---|
1086 | * @return array Informações sobre o funcionário. |
---|
1087 | * @access public |
---|
1088 | */ |
---|
1089 | function getEmployeeInfo($employeeID, $organizationID) |
---|
1090 | { |
---|
1091 | $this->_checkAccess($organizationID, false, true); |
---|
1092 | |
---|
1093 | /** |
---|
1094 | * This is so wrong.. We should always use the factory to |
---|
1095 | * instantiate stuff. Besides, module class should not |
---|
1096 | * use process classes; the correct is to do the inverse. |
---|
1097 | */ |
---|
1098 | require_once dirname(__FILE__) . '/local/classes/class.wf_orgchart.php'; |
---|
1099 | $orgchart = new wf_orgchart(); |
---|
1100 | |
---|
1101 | $outputInfo = array(); |
---|
1102 | |
---|
1103 | $cachedLDAP = Factory::newInstance('CachedLDAP'); |
---|
1104 | $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE); |
---|
1105 | |
---|
1106 | /* here we need fresh information. Let's access ldap first */ |
---|
1107 | $employeeEntry = $cachedLDAP->getEntryByID($employeeID); |
---|
1108 | |
---|
1109 | if ($entry === false) |
---|
1110 | return array('error' => 'Funcionário não encontrado.'); |
---|
1111 | |
---|
1112 | $employeeInfo = $orgchart->getEmployee($employeeID); |
---|
1113 | $employeeStatusInfo = $orgchart->getEmployeeStatus($employeeInfo['funcionario_status_id']); |
---|
1114 | $account_id = $_SESSION['phpgw_info']['workflow']['account_id']; |
---|
1115 | |
---|
1116 | $mobile = ''; |
---|
1117 | $homePhone = ''; |
---|
1118 | |
---|
1119 | /* |
---|
1120 | * Check if the current user can view the mobile and homePhone of the employee |
---|
1121 | * This condition is true if the current user is the same user that's being retrieved |
---|
1122 | */ |
---|
1123 | $authorized = $this->acl->checkUserAccessToResource('ORG', $account_id, (int) $organizationID, 1); |
---|
1124 | if (($account_id == $employeeID) || ($authorized)) { |
---|
1125 | $mobile = $employeeEntry['mobile']; |
---|
1126 | $homePhone = $employeeEntry['homephone']; |
---|
1127 | } |
---|
1128 | |
---|
1129 | $outputInfo[] = array( |
---|
1130 | 'name' => 'Mobile', |
---|
1131 | 'value' => ( ! empty( $mobile ) ? $mobile : '' ) ); |
---|
1132 | |
---|
1133 | $outputInfo[] = array( |
---|
1134 | 'name' => 'homePhone', |
---|
1135 | 'value' => ( ! empty( $homePhone ) ? $homePhone : '' ) ); |
---|
1136 | |
---|
1137 | |
---|
1138 | $outputInfo[] = array( |
---|
1139 | 'name' => 'Nome', |
---|
1140 | 'value' => $employeeEntry['cn']); |
---|
1141 | |
---|
1142 | $outputInfo[] = array( |
---|
1143 | 'name' => 'Telefone', |
---|
1144 | 'value' => ( ! empty( $employeeEntry['telephonenumber'] ) ? $employeeEntry['telephonenumber'] : '' ) ); |
---|
1145 | |
---|
1146 | if (!empty($employeeEntry['employeenumber'])) |
---|
1147 | { |
---|
1148 | $outputInfo[] = array( |
---|
1149 | 'name' => 'Matrícula', |
---|
1150 | 'value' => $employeeEntry['employeenumber']); |
---|
1151 | } |
---|
1152 | |
---|
1153 | $outputInfo[] = array( |
---|
1154 | 'name' => 'UIDNumber', |
---|
1155 | 'value' => $employeeID); |
---|
1156 | |
---|
1157 | $outputInfo[] = array( |
---|
1158 | 'name' => 'Status', |
---|
1159 | 'value' => $employeeStatusInfo['descricao']); |
---|
1160 | |
---|
1161 | if (!empty($employeeInfo['funcionario_categoria_id'])) |
---|
1162 | { |
---|
1163 | $categoryInfo = $orgchart->getEmployeeCategory($employeeInfo['funcionario_categoria_id']); |
---|
1164 | $outputInfo[] = array( |
---|
1165 | 'name' => 'Vínculo', |
---|
1166 | 'value' => $categoryInfo['descricao']); |
---|
1167 | } |
---|
1168 | |
---|
1169 | $titulo = NULL; |
---|
1170 | if ( !empty( $employeeInfo['titulo'] ) ) |
---|
1171 | { |
---|
1172 | $titulo = $employeeInfo['titulo']; |
---|
1173 | } |
---|
1174 | |
---|
1175 | $outputInfo[] = array( |
---|
1176 | 'name' => 'Título', |
---|
1177 | 'value' => ( $titulo ? $titulo : '' ) |
---|
1178 | ); |
---|
1179 | |
---|
1180 | $cargo = NULL; |
---|
1181 | if ( !empty($employeeInfo['cargo_id']) ) |
---|
1182 | { |
---|
1183 | $jobTitleInfo = $orgchart->getJobTitle($employeeInfo['cargo_id']); |
---|
1184 | $cargo = $jobTitleInfo['descricao']; |
---|
1185 | } |
---|
1186 | |
---|
1187 | $outputInfo[] = array( |
---|
1188 | 'name' => 'Cargo', |
---|
1189 | 'value' => ( $cargo ? $cargo : '' ) |
---|
1190 | ); |
---|
1191 | |
---|
1192 | $nivel = NULL; |
---|
1193 | if ( !empty($employeeInfo['nivel']) ) |
---|
1194 | { |
---|
1195 | $nivel = $employeeInfo['nivel']; |
---|
1196 | } |
---|
1197 | |
---|
1198 | $outputInfo[] = array( |
---|
1199 | 'name' => 'Nível', |
---|
1200 | 'value' => ( $nivel ? $nivel : '' ) |
---|
1201 | ); |
---|
1202 | |
---|
1203 | $areaInfo = $orgchart->getArea($employeeInfo['area_id']); |
---|
1204 | $outputInfo[] = array( |
---|
1205 | 'name' => 'Área', |
---|
1206 | 'value' => $areaInfo['sigla']); |
---|
1207 | |
---|
1208 | $outputInfo[] = array( |
---|
1209 | 'name' => 'ÁreaID', |
---|
1210 | 'value' => $employeeInfo['area_id']); |
---|
1211 | |
---|
1212 | $localInfo = $orgchart->getLocal($employeeInfo['localidade_id']); |
---|
1213 | $outputInfo[] = array( |
---|
1214 | 'name' => 'Localidade', |
---|
1215 | 'value' => $localInfo['descricao']); |
---|
1216 | |
---|
1217 | $outputInfo[] = array( |
---|
1218 | 'name' => 'Empresa', |
---|
1219 | 'value' => ( ! empty( $localInfo['empresa'] ) ? $localInfo['empresa'] : '') );; |
---|
1220 | |
---|
1221 | $outputInfo[] = array( |
---|
1222 | 'name' => 'Endereço', |
---|
1223 | 'value' => ( ! empty( $localInfo['endereco'] ) ? $localInfo['endereco'] : '') ); |
---|
1224 | |
---|
1225 | $outputInfo[] = array( |
---|
1226 | 'name' => 'Complemento', |
---|
1227 | 'value' => ( ! empty( $localInfo['complemento'] ) ? $localInfo['complemento'] : '') );; |
---|
1228 | |
---|
1229 | $outputInfo[] = array( |
---|
1230 | 'name' => 'Cep', |
---|
1231 | 'value' => ( ! empty( $localInfo['cep'] ) ? $localInfo['cep'] : '') ); |
---|
1232 | |
---|
1233 | $outputInfo[] = array( |
---|
1234 | 'name' => 'Bairro', |
---|
1235 | 'value' => ( ! empty( $localInfo['bairro'] ) ? $localInfo['bairro'] : '') ); |
---|
1236 | |
---|
1237 | $outputInfo[] = array( |
---|
1238 | 'name' => 'Cidade', |
---|
1239 | 'value' => ( ! empty( $localInfo['cidade'] ) ? $localInfo['cidade'] : '') ); |
---|
1240 | |
---|
1241 | $outputInfo[] = array( |
---|
1242 | 'name' => 'UF', |
---|
1243 | 'value' => ( ! empty( $localInfo['uf'] ) ? $localInfo['uf'] : '') ); |
---|
1244 | |
---|
1245 | if (!empty($employeeInfo['centro_custo_id'])) |
---|
1246 | $costCenterInfo = $orgchart->getCostCenter($employeeInfo['centro_custo_id']); |
---|
1247 | else |
---|
1248 | $costCenterInfo = $orgchart->getCostCenter($areaInfo['centro_custo_id']); |
---|
1249 | $outputInfo[] = array( |
---|
1250 | 'name' => 'Centro de Custo', |
---|
1251 | 'value' => $costCenterInfo['descricao']); |
---|
1252 | |
---|
1253 | $outputInfo[] = array( |
---|
1254 | 'name' => 'e-mail', |
---|
1255 | 'value' => $employeeEntry['mail']); |
---|
1256 | |
---|
1257 | $organizationInfo = $orgchart->getOrganization( $employeeInfo['organizacao_id'] ); |
---|
1258 | |
---|
1259 | $outputInfo[] = array( |
---|
1260 | 'name' => 'sitio', |
---|
1261 | 'value' => $organizationInfo['sitio']); |
---|
1262 | |
---|
1263 | return array('info' => $outputInfo); |
---|
1264 | } |
---|
1265 | |
---|
1266 | /** |
---|
1267 | * Busca informações sobre uma área. |
---|
1268 | * @param array $params Uma array contendo o ID da área cujas informações serão extraídas e de sua organização (Ajax). |
---|
1269 | * @param int $areaID O ID da área. |
---|
1270 | * @param int $organizationID O ID da organização. |
---|
1271 | * @return array Informações sobre o funcionário. |
---|
1272 | * @access public |
---|
1273 | */ |
---|
1274 | function getAreaInfo($areaID, $organizationID) |
---|
1275 | { |
---|
1276 | $this->_checkAccess($organizationID, false, true); |
---|
1277 | |
---|
1278 | $areaID = (int) $areaID; |
---|
1279 | $organizationID = (int) $organizationID; |
---|
1280 | |
---|
1281 | require_once dirname(__FILE__) . '/local/classes/class.wf_orgchart.php'; |
---|
1282 | $orgchart = new wf_orgchart(); |
---|
1283 | |
---|
1284 | $outputInfo = array(); |
---|
1285 | $areaInfo = $orgchart->getArea($areaID); |
---|
1286 | |
---|
1287 | $outputInfo[] = array( |
---|
1288 | 'name' => 'Nome', |
---|
1289 | 'value' => $areaInfo['descricao'] |
---|
1290 | ); |
---|
1291 | |
---|
1292 | $cachedLDAP = Factory::newInstance('CachedLDAP'); |
---|
1293 | $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE); |
---|
1294 | if (!empty($areaInfo['titular_funcionario_id'])) |
---|
1295 | { |
---|
1296 | $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['titular_funcionario_id']); |
---|
1297 | $outputInfo[] = array( |
---|
1298 | 'name' => 'Titular', |
---|
1299 | 'value' => $employeeInfo['cn'] |
---|
1300 | ); |
---|
1301 | } |
---|
1302 | |
---|
1303 | if (!empty($areaInfo['substituto_funcionario_id'])) |
---|
1304 | { |
---|
1305 | $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['substituto_funcionario_id']); |
---|
1306 | $outputInfo[] = array( |
---|
1307 | 'name' => 'Substituto', |
---|
1308 | 'value' => $employeeInfo['cn'] |
---|
1309 | ); |
---|
1310 | } |
---|
1311 | |
---|
1312 | if (!empty($areaInfo['auxiliar_funcionario_id'])) |
---|
1313 | { |
---|
1314 | $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['auxiliar_funcionario_id']); |
---|
1315 | $outputInfo[] = array( |
---|
1316 | 'name' => 'Auxiliar Administrativo', |
---|
1317 | 'value' => $employeeInfo['cn'] |
---|
1318 | ); |
---|
1319 | } |
---|
1320 | |
---|
1321 | $outputInfo[] = array( |
---|
1322 | 'name' => 'No. de Funcionários', |
---|
1323 | '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)) |
---|
1324 | ); |
---|
1325 | |
---|
1326 | return array('info' => $outputInfo); |
---|
1327 | } |
---|
1328 | |
---|
1329 | /** |
---|
1330 | * Lista todos os telefones da organização. |
---|
1331 | * @return array Lista de telefones da organização. |
---|
1332 | * @access public |
---|
1333 | */ |
---|
1334 | function getTelephones( $organizationID ) |
---|
1335 | { |
---|
1336 | $this -> _checkAccess( $organizationID ); |
---|
1337 | |
---|
1338 | $query = "SELECT organizacao_id, telefone_id, descricao, numero FROM telefone WHERE organizacao_id = ? ORDER BY descricao"; |
---|
1339 | $result = $this -> db -> query( $query, array( $organizationID ) ); |
---|
1340 | $this -> _checkError( $result ); |
---|
1341 | |
---|
1342 | $output = $result->GetArray(-1); |
---|
1343 | for ($i = 0; $i < count($output); $i++) |
---|
1344 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
1345 | unset($output[$i][$j]); |
---|
1346 | |
---|
1347 | return $output; |
---|
1348 | } |
---|
1349 | |
---|
1350 | /** |
---|
1351 | * Adiciona um telefone a uma organização. |
---|
1352 | * @param int $organizationID O ID da organização. |
---|
1353 | * @param string $description A descrição da localidade. |
---|
1354 | * @param string $number String com os números de telefones. |
---|
1355 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
1356 | * @access public |
---|
1357 | */ |
---|
1358 | function addTelephone( $organizationID, $description, $number ) |
---|
1359 | { |
---|
1360 | $this->_checkAccess( $organizationID ); |
---|
1361 | |
---|
1362 | $query = "INSERT INTO telefone( organizacao_id, descricao, numero ) VALUES( ?, ?, ? )"; |
---|
1363 | $result = $this -> db -> query( $query, array( $organizationID, $description, $number ) ); |
---|
1364 | $this -> _checkError( $result ); |
---|
1365 | |
---|
1366 | return (($result === false) ? false : true); |
---|
1367 | } |
---|
1368 | |
---|
1369 | /** |
---|
1370 | * Remove um telefone. |
---|
1371 | * @param int $organizationID O ID da organização. |
---|
1372 | * @param int $telephoneID O ID do telefone. |
---|
1373 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
1374 | * @access public |
---|
1375 | */ |
---|
1376 | function removeTelephone( $organizationID, $telephoneID ) |
---|
1377 | { |
---|
1378 | $this->_checkAccess( $organizationID ); |
---|
1379 | |
---|
1380 | $query = "DELETE FROM telefone WHERE (telefone_id = ?) AND (organizacao_id = ?)"; |
---|
1381 | $result = $this -> db -> query( $query, array( $telephoneID, $organizationID ) ); |
---|
1382 | $this -> _checkError( $result ); |
---|
1383 | |
---|
1384 | return ( ( $result === false ) ? false : true ); |
---|
1385 | } |
---|
1386 | |
---|
1387 | /** |
---|
1388 | * Atualiza um telefone. |
---|
1389 | * @param int $organizationID O ID da organização. |
---|
1390 | * @param int $telephoneID O ID do telefone. |
---|
1391 | * @param string $description A descrição do telefone. |
---|
1392 | * @param string $number String com os números de telefones. |
---|
1393 | * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. |
---|
1394 | * @access public |
---|
1395 | */ |
---|
1396 | function updateTelephone( $organizationID, $telephoneID, $description, $number ) |
---|
1397 | { |
---|
1398 | $this->_checkAccess( $organizationID ); |
---|
1399 | |
---|
1400 | $query = "UPDATE telefone SET descricao = ?, numero = ? WHERE (telefone_id = ?)"; |
---|
1401 | $result = $this -> db -> query( $query, array( $description, $number, $telephoneID ) ); |
---|
1402 | $this->_checkError( $result ); |
---|
1403 | |
---|
1404 | return ( ( $result === false ) ? false : true ); |
---|
1405 | } |
---|
1406 | |
---|
1407 | /** |
---|
1408 | * Validate start and end dates for a substitution |
---|
1409 | * @param int $areaID Area's ID. |
---|
1410 | * @param string $date_start Substitution's start date. |
---|
1411 | * @param string $date_start Substitution's end date. |
---|
1412 | * @return bool |
---|
1413 | * @access private |
---|
1414 | */ |
---|
1415 | function validateSubstitutionDates($areaID, $date_start, $date_end, $substitutionID = -1) |
---|
1416 | { |
---|
1417 | /* TODO |
---|
1418 | * I'm not supose to be here.. (date validations speaking) |
---|
1419 | * move me to some validation class! |
---|
1420 | */ |
---|
1421 | |
---|
1422 | /* validating dates */ |
---|
1423 | $date_pattern = '/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/[12][0-9]{3}$/'; |
---|
1424 | |
---|
1425 | if (!preg_match($date_pattern, $date_start)) |
---|
1426 | $this->endExecution("Formato inválido para data de início."); |
---|
1427 | if (!preg_match($date_pattern, $date_end)) |
---|
1428 | $this->endExecution("Formato inválido para data de término. "); |
---|
1429 | |
---|
1430 | $date_start_arr = explode('/', $date_start); |
---|
1431 | $date_end_arr = explode('/', $date_end); |
---|
1432 | |
---|
1433 | /* is it a gregorian date? */ |
---|
1434 | if (!checkdate($date_start_arr[1], $date_start_arr[0], $date_start_arr[2])) |
---|
1435 | $this->endExecution("Data de início inválida."); |
---|
1436 | if (!checkdate($date_end_arr[1], $date_end_arr[0], $date_end_arr[2])) |
---|
1437 | $this->endExecution("Data de término inválida. "); |
---|
1438 | |
---|
1439 | /* is date_end greater then date_start? */ |
---|
1440 | if (mktime(0,0,0, $date_start_arr[1], $date_start_arr[0], $date_start_arr[2]) >= mktime(0,0,0, $date_end_arr[1], $date_end_arr[0], $date_end_arr[2])) |
---|
1441 | $this->endExecution("A data de término deve ser maior que a data de início."); |
---|
1442 | |
---|
1443 | /* preparing dates to database */ |
---|
1444 | $date_start = implode('-', array_reverse($date_start_arr)); |
---|
1445 | $date_end = implode('-', array_reverse($date_end_arr)); |
---|
1446 | |
---|
1447 | /* checking if there is a substitution in conflict with these dates */ |
---|
1448 | $query = "SELECT * FROM substituicao WHERE "; |
---|
1449 | $query .= " area_id = ? "; |
---|
1450 | $query .= " AND "; |
---|
1451 | $query .= " substituicao_id != ? "; |
---|
1452 | $query .= " AND "; |
---|
1453 | $query .= " ("; |
---|
1454 | $query .= " (? BETWEEN data_inicio AND data_fim) "; |
---|
1455 | $query .= " OR "; |
---|
1456 | $query .= " (? BETWEEN data_inicio AND data_fim)"; |
---|
1457 | $query .= " OR "; |
---|
1458 | $query .= " (data_inicio BETWEEN ? AND ?)"; |
---|
1459 | $query .= " ) "; |
---|
1460 | |
---|
1461 | // raise an error if there is any record |
---|
1462 | if ($row = $this->db->query($query, array( $areaID, $substitutionID, $date_start, $date_end, $date_start, $date_end ))->fetchRow()) |
---|
1463 | { |
---|
1464 | $row['data_inicio'] = implode('/', array_reverse(explode('-', $row['data_inicio']))); |
---|
1465 | $row['data_fim'] = implode('/', array_reverse(explode('-', $row['data_fim']))); |
---|
1466 | $this->endExecution('Já existe uma substituição no período de '. $row['data_inicio'] . ' a ' . $row['data_fim']); |
---|
1467 | } |
---|
1468 | return true; |
---|
1469 | } |
---|
1470 | |
---|
1471 | /** |
---|
1472 | * Add a substitution. |
---|
1473 | * @param int $organizationID Organization's ID. |
---|
1474 | * @param int $areaID Area's ID. |
---|
1475 | * @param int $substituteID Substitute's employee ID. |
---|
1476 | * @param string $date_start Substitution's start date. |
---|
1477 | * @param string $date_start Substitution's end date. |
---|
1478 | * @return bool |
---|
1479 | * @access public |
---|
1480 | */ |
---|
1481 | function addSubstitution( $organizationID, $areaID, $substituteID, $date_start, $date_end ) |
---|
1482 | { |
---|
1483 | $this->_checkAccess( $organizationID ); |
---|
1484 | |
---|
1485 | if (!$this->validateSubstitutionDates($areaID, $date_start, $date_end)) |
---|
1486 | return false; |
---|
1487 | |
---|
1488 | /* formating dates */ |
---|
1489 | $date_start = implode('-', array_reverse(explode('/', $date_start))); |
---|
1490 | $date_end = implode('-', array_reverse(explode('/', $date_end))); |
---|
1491 | |
---|
1492 | $query = "INSERT INTO substituicao (area_id, funcionario_id, data_inicio, data_fim) VALUES (?, ?, ?, ?)"; |
---|
1493 | $result = $this -> db -> query( $query, array( $areaID, $substituteID, $date_start, $date_end ) ); |
---|
1494 | $this->_checkError( $result ); |
---|
1495 | |
---|
1496 | return ( ( $result === false ) ? false : true ); |
---|
1497 | } |
---|
1498 | |
---|
1499 | /** |
---|
1500 | * Update a substitution. |
---|
1501 | * @param int $organizationID Organization's ID. |
---|
1502 | * @param int $areaID Area's ID. |
---|
1503 | * @param int $substituteID Substitute's employee ID. |
---|
1504 | * @param string $date_start Substitution's start date. |
---|
1505 | * @param string $date_start Substitution's end date. |
---|
1506 | * @return bool |
---|
1507 | * @access public |
---|
1508 | */ |
---|
1509 | function updateSubstitution( $organizationID, $areaID, $substituteID, $date_start, $date_end, $substitutionID ) |
---|
1510 | { |
---|
1511 | $this->_checkAccess( $organizationID ); |
---|
1512 | |
---|
1513 | if (!$this->validateSubstitutionDates($areaID, $date_start, $date_end, $substitutionID)) |
---|
1514 | return false; |
---|
1515 | |
---|
1516 | /* formating dates */ |
---|
1517 | $date_start = implode('-', array_reverse(explode('/', $date_start))); |
---|
1518 | $date_end = implode('-', array_reverse(explode('/', $date_end))); |
---|
1519 | |
---|
1520 | $query = "UPDATE substituicao SET funcionario_id = ?, data_inicio = ?, data_fim = ? WHERE substituicao_id = ?"; |
---|
1521 | $result = $this -> db -> query( $query, array( $substituteID, $date_start, $date_end, $substitutionID ) ); |
---|
1522 | $this->_checkError( $result ); |
---|
1523 | |
---|
1524 | return ( ( $result === false ) ? false : true ); |
---|
1525 | } |
---|
1526 | |
---|
1527 | /** |
---|
1528 | * List all the substituions for a given area |
---|
1529 | * @return array List of the substitutions |
---|
1530 | * @access public |
---|
1531 | */ |
---|
1532 | function getSubstitutions( $organizationID, $areaID ) |
---|
1533 | { |
---|
1534 | $this -> _checkAccess( $organizationID ); |
---|
1535 | |
---|
1536 | /* we must join area table to get organizacao_id */ |
---|
1537 | $query = "SELECT s.*, a.organizacao_id FROM substituicao s INNER JOIN area a USING(area_id) WHERE area_id = ? ORDER BY data_inicio DESC"; |
---|
1538 | $result = $this -> db -> query( $query, array( $areaID ) ); |
---|
1539 | $this -> _checkError( $result ); |
---|
1540 | |
---|
1541 | /* we must query ldap to get full user names. In workflow db we just store uids */ |
---|
1542 | $cachedLDAP = Factory::getInstance('CachedLDAP'); |
---|
1543 | |
---|
1544 | $output = $result->GetArray(-1); |
---|
1545 | for ($i = 0; $i < count($output); $i++) { |
---|
1546 | for ($j = 0; $j < $result->_numOfFields; $j++) |
---|
1547 | unset($output[$i][$j]); |
---|
1548 | |
---|
1549 | /* including substitute full name */ |
---|
1550 | $ldap_result = $cachedLDAP->getEntryByID($output[$i]['funcionario_id']); |
---|
1551 | $output[$i]['substituto_funcionario_id'] = $output[$i]['funcionario_id']; |
---|
1552 | $output[$i]['substituto_funcionario_id_desc'] = $ldap_result['cn']; |
---|
1553 | |
---|
1554 | /* formating dates */ |
---|
1555 | $output[$i]['data_inicio'] = implode('/', array_reverse(explode('-', $output[$i]['data_inicio']))); |
---|
1556 | $output[$i]['data_fim'] = implode('/', array_reverse(explode('-', $output[$i]['data_fim']))); |
---|
1557 | } |
---|
1558 | return $output; |
---|
1559 | } |
---|
1560 | |
---|
1561 | /** |
---|
1562 | * Remove a substitution |
---|
1563 | * @param int $organizationID Organization's ID |
---|
1564 | * @param int $telephoneID Substitution's ID |
---|
1565 | * @return bool |
---|
1566 | * @access public |
---|
1567 | */ |
---|
1568 | function removeSubstitution( $organizationID, $substitutionID ) |
---|
1569 | { |
---|
1570 | $this->_checkAccess( $organizationID ); |
---|
1571 | |
---|
1572 | $query = "DELETE FROM substituicao WHERE substituicao_id = ?"; |
---|
1573 | $result = $this -> db -> query( $query, array( $substitutionID ) ); |
---|
1574 | $this -> _checkError( $result ); |
---|
1575 | |
---|
1576 | return ( ( $result === false ) ? false : true ); |
---|
1577 | } |
---|
1578 | } |
---|
1579 | ?> |
---|