source: branches/2.4/workflow/inc/class.so_orgchart.inc.php @ 7228

Revision 7228, 59.0 KB checked in by douglas, 7 years ago (diff)

Ticket #0000 - Copiadas as alterações do Trunk. Versão final da 2.4.2.

  • Property svn:executable set to *
Line 
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 */
18class 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->SetFetchMode(ADODB_FETCH_ASSOC);
131        }
132
133        /**
134         * Lista todas as organizações do Organograma.
135         * @return array Lista de organizações.
136         * @access public
137         */
138        function getOrganizations()
139        {
140                $this->_checkAccess(null, true);
141
142                if ($this->isAdmin)
143                        $query = "SELECT organizacao_id, nome, descricao, ativa, url_imagem, sitio FROM organizacao ORDER BY nome";
144                else
145                {
146                        $organizations = $this->acl->getUserPermissions("ORG", $this->userID, 0);
147                        $organizations[] = -1;
148                        $query = "SELECT organizacao_id, nome, descricao, ativa, url_imagem, sitio FROM organizacao WHERE (organizacao_id IN (" . implode(',', $organizations)  . ")) ORDER BY nome";
149                }
150                $result = $this->db->query($query);
151                $this->_checkError($result);
152
153                $output = $result->GetArray(-1);
154                for ($i = 0; $i < count($output); $i++)
155                        for ($j = 0; $j < $result->_numOfFields; $j++)
156                                unset($output[$i][$j]);
157
158                return $output;
159        }
160
161        /**
162         * Adiciona uma organização.
163         * @param string $name O nome da organização.
164         * @param string $description A descrição da organização.
165         * @param string $imageURL O caminho da imagem que representa o organograma da organização.
166         * @param char $active 'S' se a organização estiver ativa e 'N' caso contrário.
167         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
168         * @access public
169         */
170        function addOrganization($name, $description, $imageURL, $active, $siteURL)
171        {
172                $this->_checkAccess(null, true);
173
174                $query = "INSERT INTO organizacao(nome, descricao, url_imagem, ativa, sitio) VALUES(?, ?, ?, ?, ?)";
175                $result = $this->db->query($query, array($name, $description, $imageURL, $active, $siteURL));
176                $this->_checkError($result);
177
178                return (($result === false) ? false : true);
179        }
180
181        /**
182         * Atualiza as informações sobre uma organização.
183         * @param string $name O nome da organização.
184         * @param string $description A descrição da organização.
185         * @param string $imageURL O caminho da imagem que representa o organograma da organização.
186         * @param char $active 'S' se a organização estiver ativa e 'N' caso contrário.
187         * @param int $organizationID O ID da organização do Orgranograma.
188         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
189         * @access public
190         */
191        function updateOrganization($name, $description, $imageURL, $active, $organizationID, $siteURL)
192        {
193                $this->_checkAccess($organizationID);
194
195                $query = "UPDATE organizacao SET nome = ?, descricao = ?, url_imagem = ?, ativa = ?, sitio = ? WHERE (organizacao_id = ?)";
196                $result = $this->db->query($query, array($name, $description, $imageURL, $active, $siteURL, $organizationID));
197                $this->_checkError($result);
198
199                return (($result === false) ? false : true);
200        }
201
202        /**
203         * Remove uma organização.
204         * @param int $organizationID O ID da organização do Orgranograma.
205         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
206         * @access public
207         */
208        function removeOrganization($organizationID)
209        {
210                $this->_checkAccess($organizationID);
211
212                $query = "DELETE FROM organizacao WHERE (organizacao_id = ?)";
213                $result = $this->db->query($query, array($organizationID));
214                $this->_checkError($result);
215
216                return (($result === false) ? false : true);
217        }
218
219        /**
220         * Lista os possíveis status dos funcionários.
221         * @param int $organizationID O ID da organização do Orgranograma.
222         * @return array Lista dos possíveis status dos empregados.
223         * @access public
224         */
225        function getEmployeeStatus($organizationID)
226        {
227                $this->_checkAccess($organizationID);
228
229                $query = "SELECT funcionario_status_id, descricao, exibir, organizacao_id FROM funcionario_status WHERE (organizacao_id = ?) ORDER BY descricao";
230                $result = $this->db->query($query, array($organizationID));
231                $this->_checkError($result);
232
233                $output = $result->GetArray(-1);
234
235                return $output;
236        }
237
238        /**
239         * Adiciona um Status de funcionário.
240         * @param int $organizationID O ID da organização do Orgranograma.
241         * @param string $description A descrição do status.
242         * @param char $show 'S' se o funcionário será exibido na interface de organograma do usuário ou 'N' caso contrário.
243         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
244         * @access public
245         */
246        function addEmployeeStatus($organizationID, $description, $show)
247        {
248                $this->_checkAccess($organizationID);
249
250                $query = "INSERT INTO funcionario_status(organizacao_id, descricao, exibir) VALUES(?, ?, ?)";
251                $result = $this->db->query($query, array($organizationID, $description, $show));
252                $this->_checkError($result);
253
254                return (($result === false) ? false : true);
255        }
256
257        /**
258         * Atualiza um Status de funcionário.
259         * @param int $employeeStatusID O ID do status de funcionário.
260         * @param int $organizationID O ID da organização do Orgranograma.
261         * @param string $description A descrição do status.
262         * @param char $show 'S' se o funcionário será exibido na interface de organograma do usuário ou 'N' caso contrário.
263         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
264         * @access public
265         */
266        function updateEmployeeStatus($employeeStatusID, $organizationID, $description, $show)
267        {
268                $this->_checkAccess($organizationID);
269
270                $query = "UPDATE funcionario_status SET descricao = ?, exibir = ? WHERE (funcionario_status_id = ?) AND (organizacao_id = ?)";
271                $result = $this->db->query($query, array($description, $show, $employeeStatusID, $organizationID));
272                $this->_checkError($result);
273
274                return (($result === false) ? false : true);
275        }
276
277        /**
278         * Remove um Status de funcionário.
279         * @param int $employeeStatusID O ID do status de funcionário.
280         * @param int $organizationID O ID da organização do Orgranograma.
281         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
282         * @access public
283         */
284        function removeEmployeeStatus($employeeStatusID, $organizationID)
285        {
286                $this->_checkAccess($organizationID);
287
288                $query = "DELETE FROM funcionario_status WHERE (funcionario_status_id = ?) AND (organizacao_id = ?)";
289                $result = $this->db->query($query, array($employeeStatusID, $organizationID));
290                $this->_checkError($result);
291
292                return (($result === false) ? false : true);
293        }
294
295        /**
296         * Lista as possíveis categorias de uma organização.
297         * @param int $organizationID O ID da organização.
298         * @return array Lista das possíveis categorias de uma organização.
299         * @access public
300         */
301        function getEmployeeCategory($organizationID)
302        {
303                $this->_checkAccess($organizationID);
304
305                $query = "SELECT funcionario_categoria_id, organizacao_id, descricao FROM funcionario_categoria WHERE (organizacao_id = ?) ORDER BY descricao";
306                $result = $this->db->query($query, array($organizationID));
307                $this->_checkError($result);
308
309                $output = $result->GetArray(-1);
310                for ($i = 0; $i < count($output); $i++)
311                        for ($j = 0; $j < $result->_numOfFields; $j++)
312                                unset($output[$i][$j]);
313
314                return $output;
315        }
316
317        /**
318         * Adiciona uma categoria.
319         * @param int $organizationID O ID da organização.
320         * @param string $description A descrição da categoria.
321         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
322         * @access public
323         */
324        function addEmployeeCategory($organizationID, $description)
325        {
326                $this->_checkAccess($organizationID);
327
328                $query = "INSERT INTO funcionario_categoria(organizacao_id, descricao) VALUES(?, ?)";
329                $result = $this->db->query($query, array($organizationID, $description));
330                $this->_checkError($result);
331
332                return (($result === false) ? false : true);
333        }
334
335        /**
336         * Atualiza uma categoria.
337         * @param int $employeeCategoryID O ID da categoria.
338         * @param int $organizationID O ID da organização.
339         * @param string $description A descrição da categoria.
340         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
341         * @access public
342         */
343        function updateEmployeeCategory($employeeCategoryID, $organizationID, $description)
344        {
345                $this->_checkAccess($organizationID);
346
347                $query = "UPDATE funcionario_categoria SET descricao = ? WHERE (funcionario_categoria_id = ?) AND (organizacao_id = ?)";
348                $result = $this->db->query($query, array($description, $employeeCategoryID, $organizationID));
349                $this->_checkError($result);
350
351                return (($result === false) ? false : true);
352        }
353
354        /**
355         * Remove uma categoria.
356         * @param int $employeeCategoryID O ID da categoria.
357         * @param int $organizationID O ID da organização.
358         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
359         * @access public
360         */
361        function removeEmployeeCategory($employeeCategoryID, $organizationID)
362        {
363                $this->_checkAccess($organizationID);
364
365                $query = "DELETE FROM funcionario_categoria WHERE (funcionario_categoria_id = ?) AND (organizacao_id = ?)";
366                $result = $this->db->query($query, array($employeeCategoryID, $organizationID));
367                $this->_checkError($result);
368
369                return (($result === false) ? false : true);
370        }
371
372        /**
373         * Lista os possíveis cargos de uma organização.
374         * @param int $organizationID O ID da organização.
375         * @return array Lista dos possíveis cargos de uma organização.
376         * @access public
377         */
378        function getJobTitle($organizationID)
379        {
380                $this->_checkAccess($organizationID);
381
382                $query = "SELECT cargo_id, organizacao_id, descricao FROM cargo WHERE (organizacao_id = ?) ORDER BY descricao";
383                $result = $this->db->query($query, array($organizationID));
384                $this->_checkError($result);
385
386                $output = $result->GetArray(-1);
387                for ($i = 0; $i < count($output); $i++)
388                        for ($j = 0; $j < $result->_numOfFields; $j++)
389                                unset($output[$i][$j]);
390
391                return $output;
392        }
393
394        /**
395         * Adiciona um cargo.
396         * @param int $organizationID O ID da organização.
397         * @param string $description A descrição do cargo.
398         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
399         * @access public
400         */
401        function addJobTitle($organizationID, $description)
402        {
403                $this->_checkAccess($organizationID);
404
405                $query = "INSERT INTO cargo(organizacao_id, descricao) VALUES(?, ?)";
406                $result = $this->db->query($query, array($organizationID, $description));
407                $this->_checkError($result);
408
409                return (($result === false) ? false : true);
410        }
411
412        /**
413         * Atualiza um cargo.
414         * @param int $jobTitleID O ID do cargo.
415         * @param int $organizationID O ID da organização.
416         * @param string $description A descrição do cargo.
417         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
418         * @access public
419         */
420        function updateJobTitle($jobTitleID, $organizationID, $description)
421        {
422                $this->_checkAccess($organizationID);
423
424                $query = "UPDATE cargo SET descricao = ? WHERE (cargo_id = ?) AND (organizacao_id = ?)";
425                $result = $this->db->query($query, array($description, $jobTitleID, $organizationID));
426                $this->_checkError($result);
427
428                return (($result === false) ? false : true);
429        }
430
431        /**
432         * Remove um cargo.
433         * @param int $jobTitleID O ID do cargo.
434         * @param int $organizationID O ID da organização.
435         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
436         * @access public
437         */
438        function removeJobTitle($jobTitleID, $organizationID)
439        {
440                $this->_checkAccess($organizationID);
441
442                $query = "DELETE FROM cargo WHERE (cargo_id = ?) AND (organizacao_id = ?)";
443                $result = $this->db->query($query, array($jobTitleID, $organizationID));
444                $this->_checkError($result);
445
446                return (($result === false) ? false : true);
447        }
448
449        /**
450         * Lista os possíveis status das áreas de uma organização.
451         * @param int $organizationID O ID da organização.
452         * @return array Lista dos possíveis status das áreas de uma organização.
453         * @access public
454         */
455        function getAreaStatus($organizationID)
456        {
457                $this->_checkAccess($organizationID);
458
459                $query = "SELECT area_status_id, organizacao_id, descricao, nivel FROM area_status WHERE organizacao_id = ? ORDER BY descricao";
460                $result = $this->db->query($query, array($organizationID));
461                $this->_checkError($result);
462
463                $output = $result->GetArray(-1);
464                for ($i = 0; $i < count($output); $i++)
465                        for ($j = 0; $j < $result->_numOfFields; $j++)
466                                unset($output[$i][$j]);
467
468                return $output;
469        }
470
471        /**
472         * Adiciona um status de área.
473         * @param int $organizationID O ID da organização.
474         * @param string $description A descrição do status.
475         * @param int $level O nível do status.
476         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
477         * @access public
478         */
479        function addAreaStatus($organizationID, $description, $level)
480        {
481                $this->_checkAccess($organizationID);
482
483                $query = "INSERT INTO area_status(organizacao_id, descricao, nivel) VALUES(?, ?, ?)";
484                $result = $this->db->query($query, array($organizationID, $description, $level));
485                $this->_checkError($result);
486
487                return (($result === false) ? false : true);
488        }
489
490        /**
491         * Atualiza um status de área.
492         * @param int $areaStatusID O ID do status da área.
493         * @param int $organizationID O ID da organização.
494         * @param string $description A descrição do status.
495         * @param int $level O nível do status.
496         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
497         * @access public
498         */
499        function updateAreaStatus($areaStatusID, $organizationID, $description, $level)
500        {
501                $this->_checkAccess($organizationID);
502
503                $query = "UPDATE area_status SET descricao = ?, nivel = ? WHERE (area_status_id = ?) AND (organizacao_id = ?)";
504                $result = $this->db->query($query, array($description, $level, $areaStatusID, $organizationID));
505                $this->_checkError($result);
506
507                return (($result === false) ? false : true);
508        }
509
510        /**
511         * Remove um status de área.
512         * @param int $areaStatusID O ID do status da área.
513         * @param int $organizationID O ID da organização.
514         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
515         * @access public
516         */
517        function removeAreaStatus($areaStatusID, $organizationID)
518        {
519                $this->_checkAccess($organizationID);
520
521                $query = "DELETE FROM area_status WHERE (area_status_id = ?) AND (organizacao_id = ?)";
522                $result = $this->db->query($query, array($areaStatusID, $organizationID));
523                $this->_checkError($result);
524
525                return (($result === false) ? false : true);
526        }
527
528        /**
529         * Lista os centros de custo de uma organização.
530         * @param int $organizationID O ID da organização.
531         * @return array Lista dos centros de custo de uma organização.
532         * @access public
533         */
534        function getCostCenter($organizationID)
535        {
536                $this->_checkAccess($organizationID);
537
538                $query = "SELECT organizacao_id, centro_custo_id, nm_centro_custo, descricao, grupo FROM centro_custo WHERE organizacao_id = ? ORDER BY descricao";
539                $result = $this->db->query($query, array($organizationID));
540                $this->_checkError($result);
541
542                $output = $result->GetArray(-1);
543                for ($i = 0; $i < count($output); $i++)
544                        for ($j = 0; $j < $result->_numOfFields; $j++)
545                                unset($output[$i][$j]);
546
547                return $output;
548        }
549
550        /**
551         * Adiciona um centro de custo.
552         * @param int $organizationID O ID da organização.
553         * @param int $number O número do centro de custo.
554         * @param string $description A descrição do centro de custo.
555         * @param string $group O grupo do centro de custo.
556         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
557         * @access public
558         */
559        function addCostCenter($organizationID, $number, $description, $group)
560        {
561                $this->_checkAccess($organizationID);
562
563                $query = "INSERT INTO centro_custo(organizacao_id, nm_centro_custo, descricao, grupo) VALUES(?, ?, ?, ?)";
564                $result = $this->db->query($query, array($organizationID, $number, $description, $group));
565                $this->_checkError($result);
566
567                return (($result === false) ? false : true);
568        }
569
570        /**
571         * Atualiza um centro de custo.
572         * @param int $organizationID O ID da organização.
573         * @param int $number O número do centro de custo.
574         * @param string $description A descrição do centro de custo.
575         * @param string $group O grupo do centro de custo.
576         * @param int $costCenterID O ID do centro de custo.
577         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
578         * @access public
579         */
580        function updateCostCenter($organizationID, $number, $description, $group, $costCenterID)
581        {
582                $this->_checkAccess($organizationID);
583
584                $query = "UPDATE centro_custo SET organizacao_id = ?, nm_centro_custo = ?, descricao = ?, grupo = ? WHERE (centro_custo_id = ?)";
585                $result = $this->db->query($query, array($organizationID, $number, $description, $group, $costCenterID));
586                $this->_checkError($result);
587
588                return (($result === false) ? false : true);
589        }
590
591        /**
592         * Remove um centro de custo.
593         * @param int $costCenterID O ID do centro de custo.
594         * @param int $organizationID O ID da organização.
595         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
596         * @access public
597         */
598        function removeCostCenter($costCenterID, $organizationID)
599        {
600                $this->_checkAccess($organizationID);
601
602                $query = "DELETE FROM centro_custo WHERE (centro_custo_id = ?) AND (organizacao_id = ?)";
603                $result = $this->db->query($query, array($costCenterID, $organizationID));
604                $this->_checkError($result);
605
606                return (($result === false) ? false : true);
607        }
608
609        /**
610         * Lista as localidade de uma organização.
611         * @param int $organizationID O ID da organização.
612         * @return array Lista das localidades de uma organização.
613         * @access public
614         */
615        function getLocal($organizationID)
616        {
617                $this->_checkAccess($organizationID);
618
619                $query_fields = 'organizacao_id, localidade_id, centro_custo_id, descricao, empresa, endereco, complemento, cep, bairro, cidade, uf, externa';
620                $query = "SELECT {$query_fields} 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                        $output[$i]['centro_custo_id'] = empty($output[$i]['centro_custo_id']) ? 'NULL' : $output[$i]['centro_custo_id'];
629                }
630
631                return $output;
632        }
633
634        /**
635         * Adiciona uma localidade.
636         * @param int $organizationID O ID da organização.
637         * @param int $costCenterID O ID do centro de custo.
638         * @param string $description A descrição da localidade.
639         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
640         * @access public
641         */
642        function addLocal($organizationID, $costCenter, $description, $company, $address, $complement, $zipCode, $neighborhood, $city, $state, $external )
643        {
644                $this->_checkAccess($organizationID);
645
646                $query = "INSERT INTO localidade(organizacao_id, centro_custo_id, descricao, empresa, endereco, complemento, cep, bairro, cidade, uf, externa) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
647                $result = $this->db->query($query, array($organizationID, $costCenter, $description, $company, $address, $complement, $zipCode, $neighborhood, $city, $state, $external ));
648                $this->_checkError($result);
649
650                return (($result === false) ? false : true);
651        }
652
653        /**
654         * Atualiza uma localidade.
655         * @param int $organizationID O ID da organização.
656         * @param int $costCenterID O ID do centro de custo.
657         * @param string $description A descrição da localidade.
658         * @param int $localID O ID da localidade.
659         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
660         * @access public
661         */
662        function updateLocal($organizationID, $costCenter, $description, $localID, $company, $address, $complement, $zipCode, $neighborhood, $city, $state, $external )
663        {
664                $this->_checkAccess($organizationID);
665
666                $query = "UPDATE localidade SET organizacao_id = ?, centro_custo_id = ?, descricao = ?, empresa = ?, endereco = ?, complemento = ?, cep = ?, bairro = ?, cidade = ?, uf = ?, externa = ? WHERE (localidade_id = ?)";
667                $result = $this->db->query($query, array($organizationID, $costCenter, $description, $company, $address, $complement, $zipCode, $neighborhood, $city, $state, $external, $localID) );
668                $this->_checkError($result);
669
670                return (($result === false) ? false : true);
671        }
672
673        /**
674         * Remove uma localidade.
675         * @param int $organizationID O ID da organização.
676         * @param int $localID O ID da localidade.
677         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
678         * @access public
679         */
680        function removeLocal($localID, $organizationID)
681        {
682                $this->_checkAccess($organizationID);
683
684                $query = "DELETE FROM localidade WHERE (localidade_id = ?) AND (organizacao_id = ?)";
685                $result = $this->db->query($query, array($localID, $organizationID));
686                $this->_checkError($result);
687
688                return (($result === false) ? false : true);
689        }
690
691        /**
692         * Lista os funcionários de uma determinada área da organização.
693         * @param int $areaID O ID da área.
694         * @param int $organizationID O ID da organização.
695         * @return array Lista dos funcionários de uma determinada área da organização.
696         * @access public
697         */
698        function getAreaEmployee($areaID, $organizationID)
699        {
700                $this->_checkAccess($organizationID);
701
702                /* gather some info from the area */
703                $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);
704                if (empty($areaInfo))
705                        return false;
706                $areaInfo = $areaInfo[0];
707                $supervisors = '{' . implode(', ', $areaInfo) . '}';
708
709                $query = "SELECT funcionario_id, funcionario_status_id, centro_custo_id, localidade_id, organizacao_id, area_id, cargo_id, nivel, funcionario_categoria_id, titulo, funcao, to_char(data_admissao,'DD/MM/YYYY') as data_admissao, apelido FROM funcionario WHERE ((area_id = ?) AND (organizacao_id = ?)) OR (funcionario_id = ANY (?))";
710                $result = $this->db->query($query, array($areaID, $organizationID, $supervisors));
711                $this->_checkError($result);
712
713                $output = $result->GetArray(-1);
714                $cachedLDAP = Factory::newInstance('CachedLDAP');
715                $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE);
716                for ($i = 0; $i < count($output); $i++)
717                {
718                        $output[$i]['funcionario_id_desc'] = '';
719                        $output[$i]['uid'] = '';
720
721                        if (in_array($output[$i]['funcionario_id'], $areaInfo))
722                                $output[$i]['chief'] = ($output[$i]['funcionario_id'] == $areaInfo['titular_funcionario_id']) ? 1 : 2;
723
724                        if (($entry = $cachedLDAP->getEntryByID($output[$i]['funcionario_id'])))
725                        {
726                                $output[$i]['funcionario_id_desc'] = $entry['cn'];
727                                $output[$i]['uid'] = $entry['uid'];
728                                $output[$i]['removed'] = is_null($entry['last_update']);
729                        }
730                }
731
732                usort($output, create_function('$a,$b', 'return strcasecmp($a[\'funcionario_id_desc\'],$b[\'funcionario_id_desc\']);'));
733                return $output;
734        }
735
736        /**
737         * Procura por funcionários de acordo com um termo de busca.
738         * @param string $searchTerm O termo de busca. Pode ser referente ao ID do funcionário ou ao nome do mesmo.
739         * @param int $organizationID O ID da organização.
740         * @return array Lista dos funcionários que satisfazem o critério de busca.
741         * @access public
742         */
743        function searchEmployee($searchTerm, $organizationID)
744        {
745                $organizationID = (int) $organizationID;
746                $this->_checkAccess($organizationID);
747
748                /* initialize some variables */
749                $output = array();
750                $unifiedResult = array();
751
752                /* FIXME - this piece of code should use the new CacheLdap class */
753                if (is_numeric($searchTerm))
754                {
755                        $searchTerm = (int) $searchTerm;
756                        $ldapSearch = "(&(|(employeenumber={$searchTerm})(uidnumber={$searchTerm}))(phpgwaccounttype=u))";
757                        $DBSearch = "SELECT uidnumber, cn, uid, last_update FROM egw_wf_user_cache WHERE (employeenumber = ?) OR (uidnumber = ?)";
758                        $DBValues = array($searchTerm, $searchTerm);
759                }
760                else
761                {
762                        $ldapSearch = "(&(cn=*{$searchTerm}*)(phpgwaccounttype=u))";
763                        $DBSearch = "SELECT uidnumber, cn, uid, last_update FROM egw_wf_user_cache WHERE (cn ILIKE ?)";
764                        $DBValues = array("%{$searchTerm}%");
765                }
766
767                /* search for the $searchTerm in the LDAP */
768                $ldap = &Factory::getInstance('WorkflowObjects')->getLDAP();
769                $list = @ldap_search($ldap, Factory::getInstance('WorkflowLDAP')->getLDAPContext(), $ldapSearch, array('uidnumber', 'cn', 'uid'));
770                if ($list === false)
771                        die(serialize("O sistema de busca não pode ser utilizado nesta organização."));
772                $entries = ldap_get_entries($ldap, $list);
773                for ($i=0; $i < $entries['count']; $i++)
774                        $unifiedResult[$entries[$i]['uidnumber'][0]] = array('name' => $entries[$i]['cn'][0], 'uid' => $entries[$i]['uid'][0], 'removed' => false);
775
776                /* search for the $searchTerm in the DB */
777                $resultSet = Factory::getInstance('WorkflowObjects')->getDBGalaxia()->Link_ID->query($DBSearch, $DBValues)->GetArray(-1);
778                foreach ($resultSet as $row)
779                        if (!isset($unifiedResult[$row['uidnumber']]))
780                                $unifiedResult[$row['uidnumber']] = array('name' => $row['cn'], 'uid' => $row['uid'], 'removed' => is_null($row['last_update']));
781
782                /* check if any result was found */
783                if (count($unifiedResult) < 1)
784                        return $output;
785
786                /* load employee information */
787                $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, f.apelido, f.funcao, to_char(f.data_admissao, 'DD/MM/YYYY') as data_admissao, 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))  ."))";
788                $result = $this->db->query($query);
789                $this->_checkError($result);
790
791                $output = $result->GetArray(-1);
792                for ($i = 0; $i < count($output); $i++)
793                {
794                        for ($j = 0; $j < $result->_numOfFields; $j++)
795                                unset($output[$i][$j]);
796                        $output[$i]['funcionario_id_desc'] = $unifiedResult[$output[$i]['funcionario_id']]['name'];
797                        $output[$i]['uid'] = $unifiedResult[$output[$i]['funcionario_id']]['uid'];
798                        $output[$i]['removed'] = $unifiedResult[$output[$i]['funcionario_id']]['removed'];
799                }
800
801                return $output;
802        }
803
804
805        /**
806         * Valida se o formato da data está correto..
807         * @param $date data a ser validada.
808         **/
809
810        function validateDate($date)
811        {
812                $date_pattern = '/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/[12][0-9]{3}$/';
813
814                if (!preg_match($date_pattern, $date))
815                        $this->endExecution("Formato inválido para data (dd/mm/aaaa).");
816        }
817
818        /**
819         * Adiciona um funcionário.
820         * @param int $employeeID O ID do funcionário.
821         * @param int $organizationID O ID da organização.
822         * @param int $areaID O ID da área.
823         * @param int $costCenterID O ID do centro de custo.
824         * @param int $localID O ID da localidade.
825         * @param int $employeeStatusID O ID do status do funcionário.
826         * @param int $jobTitleID O ID do cargo do funcionário.
827         * @param int $level O nível do cargo do funcionário.
828         * @param int $title O título do funcionário.
829         * @param int $nickname O apelido do funcionário.
830         * @param int $jobDesc A descrição do cargo (função).
831         * @param int $admDate Data de admissão do funcionário.
832         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
833         * @access public
834         */
835        function addEmployee($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title, $nickname, $jobDesc, $admDate)
836        {
837                $this->_checkAccess($organizationID);
838                if ($admDate!='')
839                {
840                        $this->validateDate($admDate);
841                        $admission_date = implode('-', array_reverse(explode('/', $admDate)));
842                }
843                else
844                {
845                        $admission_date=NULL;
846                }
847
848                $query = 'SELECT area.sigla FROM funcionario, area WHERE (funcionario.area_id = area.area_id) AND (funcionario.funcionario_id = ?)';
849                if (($row = $this->db->query($query, $employeeID)->fetchRow()))
850                {
851                        $errors = array(
852                                "O funcionário \"" . Factory::getInstance('WorkflowLDAP')->getName($employeeID) . "\" já pertença à área \"{$row['sigla']}\".",
853                                '-----------------',
854                                '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.'
855                        );
856                        $this->endExecution($errors);
857                }
858
859                $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, apelido, funcao, data_admissao) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
860                $result = $this->db->query($query, array($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title, $nickname, $jobDesc, $admission_date));
861                $this->_checkError($result);
862
863                return (($result === false) ? false : true);
864        }
865
866        /**
867         * Atualiza o funcionário.
868         * @param int $employeeID O ID do funcionário.
869         * @param int $organizationID O ID da organização.
870         * @param int $areaID O ID da área.
871         * @param int $costCenterID O ID do centro de custo.
872         * @param int $localID O ID da localidade.
873         * @param int $employeeStatusID O ID do status do funcionário.
874         * @param int $jobTitleID O ID do cargo do funcionário.
875         * @param int $level O nível do cargo do funcionário.
876         * @param int $employeeCategoryID O ID da categoria do funcionário.
877         * @param int $title O título do funcionário.
878         * @param int $nickname O apelido do funcionário.
879         * @param int $jobDesc A descrição do cargo (função).
880         * @param int $admDate Data de admissão do funcionário.
881         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
882         * @access public
883         */
884        function updateEmployee($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title, $nickname, $jobDesc, $admDate)
885        {
886                $this->_checkAccess($organizationID);
887                if ($admDate!='')
888                {
889                        $this->validateDate($admDate);
890                        $admission_date = implode('-', array_reverse(explode('/', $admDate)));
891                }
892                else
893                {
894                        $admission_date=NULL;
895                }
896
897                $query = "UPDATE funcionario SET area_id = ?, centro_custo_id = ?, localidade_id = ?, funcionario_status_id = ?, cargo_id = ?, nivel = ?, funcionario_categoria_id = ?, titulo = ?, apelido = ?, funcao = ?, data_admissao =? WHERE (funcionario_id = ?) AND (organizacao_id = ?)";
898                       
899                $result = $this->db->query($query, array($areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title,$nickname, $jobDesc, $admission_date, $employeeID, $organizationID));
900               
901                $this->_checkError($result);
902               
903                return (($result === false) ? false : true);
904        }
905
906        /**
907         * Remove um funcionário.
908         * @param int $employeeID O ID do funcionário.
909         * @param int $organizationID O ID da organização.
910         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
911         * @access public
912         */
913        function removeEmployee($employeeID, $organizationID)
914        {
915                $this->_checkAccess($organizationID);
916
917                $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))';
918                $areas = array();
919                $resultSet = $this->db->query($query, $employeeID);
920                while (($row = $resultSet->fetchRow()))
921                        $areas[] = $row['sigla'];
922                if (count($areas) > 0)
923                {
924                        $errors = array(
925                                "O funcionário \"" . Factory::getInstance('WorkflowLDAP')->getName($employeeID) . "\" é titular, substituto, já participou de substituição ou é auxiliar administrativo das seguintes áreas: " . implode(", ", $areas),
926                                '-----------------',
927                                'Se você quiser excluir este funcionário, precisa removê-lo dos "cargos" que ele possui nas áreas citadas.'
928                        );
929                        $this->endExecution($errors);
930                }
931
932                $query = "DELETE FROM funcionario WHERE (funcionario_id = ?) AND (organizacao_id = ?)";
933                $result = $this->db->query($query, array($employeeID, $organizationID));
934                $this->_checkError($result);
935
936                return (($result === false) ? false : true);
937        }
938
939        /**
940         * Lista as áreas de uma organização.
941         * @param int $organizationID O ID da organização.
942         * @return array Lista das áreas de uma organização.
943         * @access public
944         */
945        function getArea($organizationID, $areaID = -1)
946        {
947                $this->_checkAccess($organizationID);
948
949                $output = array();
950                $values = array($organizationID);
951
952                // if we are looking for a specific area
953                $area_condition = "";
954                if (($areaID != -1) && !empty($areaID)) {
955                        $area_condition = " AND a.area_id = ? ";
956                        $values[]= $areaID;
957                }
958
959                $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";
960                $result = $this->db->query($query, $values);
961                $this->_checkError($result);
962
963                $ldap = &Factory::getInstance('WorkflowLDAP');
964                while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC))
965                {
966                        for ($j = 0; $j < $result->_numOfFields; $j++)
967                                unset($row[$j]);
968                        $row['substituto_funcionario_id_desc'] = ($row['substituto_funcionario_id'] != '') ? $ldap->getName($row['substituto_funcionario_id']) : '';
969                        $row['titular_funcionario_id_desc'] = ($row['titular_funcionario_id'] != '') ? $ldap->getName($row['titular_funcionario_id']) : '';
970                        $row['auxiliar_funcionario_id_desc'] = ($row['auxiliar_funcionario_id'] != '') ? $ldap->getName($row['auxiliar_funcionario_id']) : '';
971                        $row['superior_area_id'] = empty($row['superior_area_id']) ? 'NULL' : $row['superior_area_id'];
972                        $output[] = $row;
973                }
974
975                return $output;
976        }
977
978        /**
979         * Lista, hierarquicamente, as áreas de uma organização.
980         * @param int $organizationID O ID da organização.
981         * @param int $parent O ID da área superior (ou NULL para buscar todas as áreas).
982         * @param int $depth O nível hierárquico da área (profundidade do nó na árvore do Organograma).
983         * @return array Lista hierárquica das áreas de uma organização.
984         * @access public
985         */
986        function getHierarchicalArea($organizationID, $parent, $depth)
987        {
988                $this->_checkAccess($organizationID);
989
990                if (is_null($parent)){
991                        $query = "SELECT a.area_id, a.sigla, a.titular_funcionario_id FROM area a";
992                        $query .=" INNER JOIN area_status a_s ON (a_s.area_status_id = a.area_status_id)";
993                        $query .=" WHERE (a.superior_area_id IS NULL) AND (a.organizacao_id = ?) AND (a.ativa = 'S') ORDER BY a_s.nivel, a.sigla";
994                        $result = $this->db->query($query, array($organizationID));
995                } else {
996                        $query = "SELECT a.area_id, a.sigla, a.titular_funcionario_id FROM area a";
997                        $query .=" INNER JOIN area_status a_s ON (a_s.area_status_id = a.area_status_id)";
998                        $query .=" WHERE (a.superior_area_id = ?) AND (a.ativa = 'S') ORDER BY a_s.nivel, a.sigla";
999                        $result = $this->db->query($query, array($parent));
1000                }
1001
1002                $this->_checkError($result);
1003
1004                $output = $result->GetArray(-1);
1005                for ($i = 0; $i < count($output); $i++)
1006                {
1007                        for ($j = 0; $j < $result->_numOfFields; $j++)
1008                                unset($output[$i][$j]);
1009
1010                        $output[$i]['children'] = $this->getHierarchicalArea($organizationID, $output[$i]['area_id'], $depth + 1);
1011                        $output[$i]['depth'] = $depth;
1012                }
1013
1014                return $output;
1015        }
1016
1017        /**
1018         * Adiciona uma área em uma organização.
1019         * @param int $costCenterID O ID do centro de custo.
1020         * @param int $organizationID O ID da organização.
1021         * @param int $areaStatusID O ID do status da área.
1022         * @param int $supervisorID O ID do funcionário que é superior da área.
1023         * @param int $superiorAreaID O ID da área que é superior a que está sendo adicionada (NULL caso não possua área superior).
1024         * @param string $acronym A sigla da área.
1025         * @param string $description A descrição da área.
1026         * @param char $active 'S' se a área estiver ativa e 'N' caso contrário.
1027         * @param int $assistantID O ID do funcionário que está auxiliando o superior da área.
1028         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
1029         * @access public
1030         */
1031        function addArea($costCenterID, $organizationID, $areaStatusID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID)
1032        {
1033                $this->_checkAccess($organizationID);
1034
1035                $checkEmployees = array($supervisorID, $assistantID);
1036                $errors = array();
1037                foreach ($checkEmployees as $checkEmployee)
1038                {
1039                        if (is_null($checkEmployee))
1040                                continue;
1041
1042                        $query = 'SELECT 1 FROM funcionario WHERE (funcionario_id = ?)';
1043                        if (!$this->db->query($query, $checkEmployee)->fetchRow())
1044                                $errors[] = "O funcionário \"" . Factory::getInstance('WorkflowLDAP')->getName($checkEmployee) . "\" não está vinculado a uma área.";
1045                }
1046
1047                if (count($errors) > 0)
1048                {
1049                        $errors[] = '-----------------';
1050                        $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.';
1051                        $this->endExecution($errors);
1052                }
1053
1054                $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 (?, ?, ?, ?, ?, ?, ?, ?, ?)";
1055                $result = $this->db->query($query, array($costCenterID, $organizationID, $areaStatusID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID));
1056                $this->_checkError($result);
1057
1058                return (($result === false) ? false : true);
1059        }
1060
1061        /**
1062         * Atualiza a área de uma organização.
1063         * @param int $costCenterID O ID do centro de custo.
1064         * @param int $organizationID O ID da organização.
1065         * @param int $areaStatusID O ID do status da área.
1066         * @param int $supervisorID O ID do funcionário que é superior da área.
1067         * @param int $superiorAreaID O ID da área que é superior a que está sendo atualizada (NULL caso não possua área superior).
1068         * @param string $acronym A sigla da área.
1069         * @param string $description A descrição da área.
1070         * @param char $active 'S' se a área estiver ativa e 'N' caso contrário.
1071         * @param int $areaID O ID da área.
1072         * @param int $assistantID O ID do funcionário que está auxiliando o superior da área.
1073         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
1074         * @access public
1075         */
1076        function updateArea($costCenterID, $organizationID, $areaStatusID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID, $areaID)
1077        {
1078                $this->_checkAccess($organizationID);
1079
1080                $checkEmployees = array($supervisorID, $assistantID);
1081                $errors = array();
1082                foreach ($checkEmployees as $checkEmployee)
1083                {
1084                        if (is_null($checkEmployee))
1085                                continue;
1086
1087                        $query = 'SELECT 1 FROM funcionario WHERE (funcionario_id = ?)';
1088                        if (!$this->db->query($query, $checkEmployee)->fetchRow())
1089                                $errors[] = "O funcionário \"" . Factory::getInstance('WorkflowLDAP')->getName($checkEmployee) . "\" não está vinculado a uma área.";
1090                }
1091
1092                if (count($errors) > 0)
1093                {
1094                        $errors[] = '-----------------';
1095                        $errors[] = 'Somente funcionários que estão vinculados a alguma área podem ser colocados na posição de titular ou auxiliar administrativo.';
1096                        $this->endExecution($errors);
1097                }
1098
1099                $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 = ?)";
1100                $result = $this->db->query($query, array($costCenterID, $organizationID, $areaStatusID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID, $areaID));
1101                $this->_checkError($result);
1102
1103                return (($result === false) ? false : true);
1104        }
1105
1106        /**
1107         * Remove a área de uma organização.
1108         * @param int $areaID O ID da área.
1109         * @param int $organizationID O ID da organização.
1110         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
1111         * @access public
1112         */
1113        function removeArea($areaID, $organizationID)
1114        {
1115                $this->_checkAccess($organizationID);
1116
1117                $query = "DELETE FROM area WHERE (area_id = ?) AND (organizacao_id = ?)";
1118                $result = $this->db->query($query, array($areaID, $organizationID));
1119                $this->_checkError($result);
1120
1121                return (($result === false) ? false : true);
1122        }
1123
1124        /**
1125         * Busca informações sobre um funcionário.
1126         * @param array $params Uma array contendo o ID do funcionário cujas informações serão extraídas e de sua organização (Ajax).
1127         * @param int $employeeID O ID do funcionário.
1128         * @param int $organizationID O ID da organização.
1129         * @return array Informações sobre o funcionário.
1130         * @access public
1131         */
1132        function getEmployeeInfo($employeeID, $organizationID)
1133        {
1134                $this->_checkAccess($organizationID, false, true);
1135
1136                /**
1137                 * This is so wrong.. We should always use the factory to
1138                 * instantiate stuff. Besides, module class should not
1139                 * use process classes; the correct is to do the inverse.
1140                 */
1141                require_once dirname(__FILE__) . '/local/classes/class.wf_orgchart.php';
1142                $orgchart = new wf_orgchart();
1143
1144                $outputInfo = array();
1145
1146                $cachedLDAP = Factory::newInstance('CachedLDAP');
1147                $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE);
1148
1149                /* here we need fresh information. Let's access ldap first */
1150                $employeeEntry = $cachedLDAP->getEntryByID($employeeID);
1151
1152                if ($entry === false)
1153                        return array('error' => 'Funcionário não encontrado.');
1154
1155                $employeeInfo                           = $orgchart->getEmployee($employeeID);
1156                $employeeStatusInfo                     = $orgchart->getEmployeeStatus($employeeInfo['funcionario_status_id']);
1157                $account_id                                     = $_SESSION['phpgw_info']['workflow']['account_id'];
1158
1159                $mobile         = '';
1160                $homePhone  = '';
1161               
1162                /*
1163                 * Check if the current user can view the mobile and homePhone of the employee
1164                 * This condition is true if the current user is the same user that's being retrieved
1165                 */
1166                $authorized = $this->acl->checkUserAccessToResource('ORG', $account_id, (int) $organizationID, 1);
1167                if (($account_id == $employeeID) || ($authorized)) {
1168                        $mobile         = $employeeEntry['mobile'];
1169                        $homePhone      = $employeeEntry['homephone'];
1170                }
1171
1172                $outputInfo[] = array(
1173                        'name' => 'Mobile',
1174                        'value' => ( ! empty( $mobile ) ? $mobile : '' ) );
1175
1176                $outputInfo[] = array(
1177                        'name' => 'homePhone',
1178                        'value' => ( ! empty( $homePhone ) ? $homePhone : '' ) );
1179
1180
1181                $outputInfo[] = array(
1182                        'name' => 'Nome',
1183                        'value' => $employeeEntry['cn']);
1184
1185                $outputInfo[] = array(
1186                        'name' => 'Telefone',
1187                        'value' => ( ! empty( $employeeEntry['telephonenumber'] ) ? $employeeEntry['telephonenumber'] : '' ) );
1188
1189                if (!empty($employeeEntry['employeenumber']))
1190                {
1191                        $outputInfo[] = array(
1192                                'name' => 'Matrícula',
1193                                'value' => $employeeEntry['employeenumber']);
1194                }
1195
1196                $outputInfo[] = array(
1197                        'name' => 'UIDNumber',
1198                        'value' => $employeeID);
1199
1200                $outputInfo[] = array(
1201                        'name' => 'Status',
1202                        'value' => $employeeStatusInfo['descricao']);
1203
1204                if (!empty($employeeInfo['funcionario_categoria_id']))
1205                {
1206                        $categoryInfo = $orgchart->getEmployeeCategory($employeeInfo['funcionario_categoria_id']);
1207                        $outputInfo[] = array(
1208                                'name' => 'Vínculo',
1209                                'value' => $categoryInfo['descricao']);
1210                }
1211
1212                $titulo = NULL;
1213                if ( !empty( $employeeInfo['titulo'] ) )
1214                {
1215                        $titulo = $employeeInfo['titulo'];
1216                }
1217
1218                $outputInfo[] = array(
1219                        'name' => 'Título',
1220                        'value' => ( $titulo ? $titulo : '' )
1221                );
1222
1223                $cargo = NULL;
1224                if ( !empty($employeeInfo['cargo_id']) )
1225                {
1226                        $jobTitleInfo = $orgchart->getJobTitle($employeeInfo['cargo_id']);
1227                        $cargo = $jobTitleInfo['descricao'];
1228                }
1229
1230                $outputInfo[] = array(
1231                        'name' => 'Cargo',
1232                        'value' => ( $cargo ? $cargo : '' )
1233                );
1234
1235                $nivel = NULL;
1236                if ( !empty($employeeInfo['nivel']) )
1237                {
1238                        $nivel = $employeeInfo['nivel'];
1239                }
1240
1241                $outputInfo[] = array(
1242                        'name' => 'Nível',
1243                        'value' => ( $nivel ? $nivel : '' )
1244                );
1245
1246                $areaInfo = $orgchart->getArea($employeeInfo['area_id']);
1247                $outputInfo[] = array(
1248                        'name' => 'Área',
1249                        'value' => $areaInfo['sigla']);
1250
1251                $outputInfo[] = array(
1252                        'name' => 'ÁreaID',
1253                        'value' => $employeeInfo['area_id']);
1254
1255                $localInfo = $orgchart->getLocal($employeeInfo['localidade_id']);
1256                $outputInfo[] = array(
1257                        'name' => 'Localidade',
1258                        'value' => $localInfo['descricao']);
1259
1260                $outputInfo[] = array(
1261                        'name' => 'Empresa',
1262                        'value' => ( ! empty( $localInfo['empresa'] ) ? $localInfo['empresa'] : '') );;
1263
1264                $outputInfo[] = array(
1265                        'name' => 'Endereço',
1266                        'value' => ( ! empty( $localInfo['endereco'] ) ? $localInfo['endereco'] : '') );
1267
1268                $outputInfo[] = array(
1269                        'name' => 'Complemento',
1270                        'value' => ( ! empty( $localInfo['complemento'] ) ? $localInfo['complemento'] : '') );;
1271
1272                $outputInfo[] = array(
1273                        'name' => 'Cep',
1274                        'value' => ( ! empty( $localInfo['cep'] ) ? $localInfo['cep'] : '') );
1275
1276                $outputInfo[] = array(
1277                        'name' => 'Bairro',
1278                        'value' => ( ! empty( $localInfo['bairro'] ) ? $localInfo['bairro'] : '') );
1279
1280                $outputInfo[] = array(
1281                        'name' => 'Cidade',
1282                        'value' => ( ! empty( $localInfo['cidade'] ) ? $localInfo['cidade'] : '') );
1283
1284                $outputInfo[] = array(
1285                        'name' => 'UF',
1286                        'value' => ( ! empty( $localInfo['uf'] ) ? $localInfo['uf'] : '') );
1287
1288                if (!empty($employeeInfo['centro_custo_id']))
1289                        $costCenterInfo = $orgchart->getCostCenter($employeeInfo['centro_custo_id']);
1290                else
1291                        $costCenterInfo = $orgchart->getCostCenter($areaInfo['centro_custo_id']);
1292                $outputInfo[] = array(
1293                        'name' => 'Centro de Custo',
1294                        'value' => $costCenterInfo['descricao']);
1295
1296                $outputInfo[] = array(
1297                        'name' => 'e-mail',
1298                        'value' => $employeeEntry['mail']);
1299
1300                $organizationInfo = $orgchart->getOrganization( $employeeInfo['organizacao_id'] );
1301
1302                $outputInfo[] = array(
1303                        'name' => 'sitio',
1304                        'value' => $organizationInfo['sitio']);
1305
1306                return array('info' => $outputInfo);
1307        }
1308
1309        /**
1310         * Busca informações sobre uma área.
1311         * @param array $params Uma array contendo o ID da área cujas informações serão extraídas e de sua organização (Ajax).
1312         * @param int $areaID O ID da área.
1313         * @param int $organizationID O ID da organização.
1314         * @return array Informações sobre o funcionário.
1315         * @access public
1316         */
1317        function getAreaInfo($areaID, $organizationID)
1318        {
1319                $this->_checkAccess($organizationID, false, true);
1320
1321                $areaID = (int) $areaID;
1322                $organizationID = (int) $organizationID;
1323
1324                require_once dirname(__FILE__) . '/local/classes/class.wf_orgchart.php';
1325                $orgchart = new wf_orgchart();
1326
1327                $outputInfo = array();
1328                $areaInfo = $orgchart->getArea($areaID);
1329
1330                $outputInfo[] = array(
1331                        'name' => 'Nome',
1332                        'value' => $areaInfo['descricao']
1333                );
1334
1335                $cachedLDAP = Factory::newInstance('CachedLDAP');
1336                $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE);
1337                if (!empty($areaInfo['titular_funcionario_id']))
1338                {
1339                        $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['titular_funcionario_id']);
1340                        $outputInfo[] = array(
1341                                'name' => 'Titular',
1342                                'value' => $employeeInfo['cn']
1343                        );
1344                }
1345
1346                if (!empty($areaInfo['substituto_funcionario_id']))
1347                {
1348                        $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['substituto_funcionario_id']);
1349                        $outputInfo[] = array(
1350                                'name' => 'Substituto',
1351                                'value' => $employeeInfo['cn']
1352                        );
1353                }
1354
1355                if (!empty($areaInfo['auxiliar_funcionario_id']))
1356                {
1357                        $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['auxiliar_funcionario_id']);
1358                        $outputInfo[] = array(
1359                                'name' => 'Auxiliar Administrativo',
1360                                'value' => $employeeInfo['cn']
1361                        );
1362                }
1363
1364                $outputInfo[] = array(
1365                        'name' => 'No. de Funcionários',
1366                        '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))
1367                );
1368
1369                return array('info' => $outputInfo);
1370        }
1371
1372        /**
1373         * Lista todos os telefones da organização.
1374         * @return array Lista de telefones da organização.
1375         * @access public
1376         */
1377        function getTelephones( $organizationID )
1378        {
1379                $this -> _checkAccess( $organizationID );
1380
1381                $query = "SELECT organizacao_id, telefone_id, descricao, numero FROM telefone WHERE organizacao_id = ? ORDER BY descricao";
1382                $result = $this -> db -> query( $query, array( $organizationID ) );
1383                $this -> _checkError( $result );
1384
1385                $output = $result->GetArray(-1);
1386                for ($i = 0; $i < count($output); $i++)
1387                        for ($j = 0; $j < $result->_numOfFields; $j++)
1388                                unset($output[$i][$j]);
1389
1390                return $output;
1391        }
1392
1393        /**
1394         * Adiciona um telefone a uma organização.
1395         * @param int $organizationID O ID da organização.
1396         * @param string $description A descrição da localidade.
1397         * @param string $number String com os números de telefones.
1398         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
1399         * @access public
1400         */
1401        function addTelephone( $organizationID, $description, $number )
1402        {
1403                $this->_checkAccess( $organizationID );
1404
1405                $query = "INSERT INTO telefone( organizacao_id, descricao, numero ) VALUES( ?, ?, ? )";
1406                $result = $this -> db -> query( $query, array( $organizationID, $description, $number ) );
1407                $this -> _checkError( $result );
1408
1409                return (($result === false) ? false : true);
1410        }
1411
1412        /**
1413         * Remove um telefone.
1414         * @param int $organizationID O ID da organização.
1415         * @param int $telephoneID O ID do telefone.
1416         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
1417         * @access public
1418         */
1419        function removeTelephone( $organizationID, $telephoneID )
1420        {
1421                $this->_checkAccess( $organizationID );
1422
1423                $query = "DELETE FROM telefone WHERE (telefone_id = ?) AND (organizacao_id = ?)";
1424                $result = $this -> db -> query( $query, array( $telephoneID, $organizationID ) );
1425                $this -> _checkError( $result );
1426
1427                return ( ( $result === false ) ? false : true );
1428        }
1429
1430        /**
1431         * Atualiza um telefone.
1432         * @param int $organizationID O ID da organização.
1433         * @param int $telephoneID O ID do telefone.
1434         * @param string $description A descrição do telefone.
1435         * @param string $number String com os números de telefones.
1436         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
1437         * @access public
1438         */
1439        function updateTelephone( $organizationID, $telephoneID, $description, $number )
1440        {
1441                $this->_checkAccess( $organizationID );
1442
1443                $query = "UPDATE telefone SET descricao = ?, numero = ? WHERE (telefone_id = ?)";
1444                $result = $this -> db -> query( $query, array( $description, $number, $telephoneID ) );
1445                $this->_checkError( $result );
1446
1447                return ( ( $result === false ) ? false : true );
1448        }
1449
1450        /**
1451         * Validate start and end dates for a substitution
1452         * @param int $areaID Area's ID.
1453         * @param string $date_start Substitution's start date.
1454         * @param string $date_start Substitution's end date.
1455         * @return bool
1456         * @access private
1457         */
1458        function validateSubstitutionDates($areaID, $date_start, $date_end, $substitutionID = -1)
1459        {
1460                /* TODO
1461                * I'm not supose to be here.. (date validations speaking)
1462                * move me to some validation class!
1463                */
1464
1465                /* validating dates */
1466                $date_pattern = '/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/[12][0-9]{3}$/';
1467
1468                if (!preg_match($date_pattern, $date_start))
1469                        $this->endExecution("Formato inválido para data de início.");
1470                if (!preg_match($date_pattern, $date_end))
1471                        $this->endExecution("Formato inválido para data de término. ");
1472
1473                $date_start_arr = explode('/', $date_start);
1474                $date_end_arr = explode('/', $date_end);
1475
1476                /* is it a gregorian date? */
1477                if (!checkdate($date_start_arr[1], $date_start_arr[0], $date_start_arr[2]))
1478                        $this->endExecution("Data de início inválida.");
1479                if (!checkdate($date_end_arr[1], $date_end_arr[0], $date_end_arr[2]))
1480                        $this->endExecution("Data de término inválida. ");
1481
1482                /* is date_end greater then date_start? */
1483                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]))
1484                        $this->endExecution("A data de término deve ser maior que a data de início.");
1485
1486                /* preparing dates to database */
1487                $date_start = implode('-', array_reverse($date_start_arr));
1488                $date_end = implode('-', array_reverse($date_end_arr));
1489
1490                /* checking if there is a substitution in conflict with these dates */
1491                $query  = "SELECT * FROM substituicao WHERE ";
1492                $query .= "     area_id = ? ";
1493                $query .= " AND ";
1494                $query .= "     substituicao_id != ? ";
1495                $query .= " AND ";
1496                $query .= "     (";
1497                $query .= "             (? BETWEEN data_inicio AND data_fim) ";
1498                $query .= "     OR ";
1499                $query .= "             (? BETWEEN data_inicio AND data_fim)";
1500                $query .= "     OR ";
1501                $query .= "             (data_inicio BETWEEN ? AND ?)";
1502                $query .= "     ) ";
1503
1504                // raise an error if there is any record
1505                if ($row = $this->db->query($query, array( $areaID, $substitutionID, $date_start, $date_end, $date_start, $date_end ))->fetchRow())
1506                {
1507                        $row['data_inicio'] = implode('/', array_reverse(explode('-', $row['data_inicio'])));
1508                        $row['data_fim'] = implode('/', array_reverse(explode('-', $row['data_fim'])));
1509                        $this->endExecution('Já existe uma substituição no período de '. $row['data_inicio'] . ' a ' . $row['data_fim']);
1510                }
1511                return true;
1512        }
1513
1514        /**
1515         * Add a substitution.
1516         * @param int $organizationID Organization's ID.
1517         * @param int $areaID Area's ID.
1518         * @param int $substituteID Substitute's employee ID.
1519         * @param string $date_start Substitution's start date.
1520         * @param string $date_start Substitution's end date.
1521         * @return bool
1522         * @access public
1523         */
1524        function addSubstitution( $organizationID, $areaID, $substituteID, $date_start, $date_end )
1525        {
1526                $this->_checkAccess( $organizationID );
1527
1528                if (!$this->validateSubstitutionDates($areaID, $date_start, $date_end))
1529                        return false;
1530
1531                /* formating dates */
1532                $date_start = implode('-', array_reverse(explode('/', $date_start)));
1533                $date_end = implode('-', array_reverse(explode('/', $date_end)));
1534
1535                $query = "INSERT INTO substituicao (area_id, funcionario_id, data_inicio, data_fim) VALUES (?, ?, ?, ?)";
1536                $result = $this -> db -> query( $query, array( $areaID, $substituteID, $date_start, $date_end ) );
1537                $this->_checkError( $result );
1538
1539                return ( ( $result === false ) ? false : true );
1540        }
1541
1542        /**
1543         * Update a substitution.
1544         * @param int $organizationID Organization's ID.
1545         * @param int $areaID Area's ID.
1546         * @param int $substituteID Substitute's employee ID.
1547         * @param string $date_start Substitution's start date.
1548         * @param string $date_start Substitution's end date.
1549         * @return bool
1550         * @access public
1551         */
1552        function updateSubstitution( $organizationID, $areaID, $substituteID, $date_start, $date_end, $substitutionID )
1553        {
1554                $this->_checkAccess( $organizationID );
1555
1556                if (!$this->validateSubstitutionDates($areaID, $date_start, $date_end, $substitutionID))
1557                        return false;
1558
1559                /* formating dates */
1560                $date_start = implode('-', array_reverse(explode('/', $date_start)));
1561                $date_end = implode('-', array_reverse(explode('/', $date_end)));
1562
1563                $query = "UPDATE substituicao SET funcionario_id = ?, data_inicio = ?, data_fim = ? WHERE substituicao_id = ?";
1564                $result = $this -> db -> query( $query, array( $substituteID, $date_start, $date_end, $substitutionID ) );
1565                $this->_checkError( $result );
1566
1567                return ( ( $result === false ) ? false : true );
1568        }
1569
1570        /**
1571         * List all the substituions for a given area
1572         * @return array List of the substitutions
1573         * @access public
1574         */
1575        function getSubstitutions( $organizationID, $areaID )
1576        {
1577                $this -> _checkAccess( $organizationID );
1578
1579                /* we must join area table to get organizacao_id */
1580                $query = "SELECT s.*, a.organizacao_id FROM substituicao s INNER JOIN area a USING(area_id) WHERE area_id = ? ORDER BY data_inicio DESC";
1581                $result = $this -> db -> query( $query, array( $areaID ) );
1582                $this -> _checkError( $result );
1583
1584                /* we must query ldap to get full user names. In workflow db we just store uids */
1585                $cachedLDAP = Factory::getInstance('CachedLDAP');
1586
1587                $output = $result->GetArray(-1);
1588                for ($i = 0; $i < count($output); $i++) {
1589                        for ($j = 0; $j < $result->_numOfFields; $j++)
1590                                unset($output[$i][$j]);
1591
1592                        /* including substitute full name */
1593                        $ldap_result = $cachedLDAP->getEntryByID($output[$i]['funcionario_id']);
1594                        $output[$i]['substituto_funcionario_id'] = $output[$i]['funcionario_id'];
1595                        $output[$i]['substituto_funcionario_id_desc'] = $ldap_result['cn'];
1596
1597                        /* formating dates */
1598                        $output[$i]['data_inicio'] = implode('/', array_reverse(explode('-', $output[$i]['data_inicio'])));
1599                        $output[$i]['data_fim'] = implode('/', array_reverse(explode('-', $output[$i]['data_fim'])));
1600                }
1601                return $output;
1602        }
1603
1604        /**
1605         * Remove a substitution
1606         * @param int $organizationID Organization's ID
1607         * @param int $telephoneID Substitution's ID
1608         * @return bool
1609         * @access public
1610         */
1611        function removeSubstitution( $organizationID, $substitutionID )
1612        {
1613                $this->_checkAccess( $organizationID );
1614
1615                $query = "DELETE FROM substituicao WHERE substituicao_id = ?";
1616                $result = $this -> db -> query( $query, array( $substitutionID ) );
1617                $this -> _checkError( $result );
1618
1619                return ( ( $result === false ) ? false : true );
1620        }
1621}
1622?>
Note: See TracBrowser for help on using the repository browser.