source: branches/2.2/workflow/inc/class.so_orgchart.inc.php @ 3167

Revision 3167, 56.7 KB checked in by viani, 14 years ago (diff)

Ticket #1135 - Merged r1990:3166 from /trunk/workflow into /branches/2.2/workflow

  • 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 = &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);
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
1105                /* here we need fresh information. Let's access ldap first */
1106                $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE);
1107                $employeeEntry = $cachedLDAP->getEntryByID($employeeID);
1108
1109                if ($entry === false)
1110                        return array('error' => 'Funcionário não encontrado.');
1111
1112                $outputInfo[] = array(
1113                        'name' => 'Nome',
1114                        'value' => $employeeEntry['cn']);
1115
1116                $outputInfo[] = array(
1117                        'name' => 'Telefone',
1118                        'value' => ( ! empty( $employeeEntry['telephonenumber'] ) ? $employeeEntry['telephonenumber'] : '' ) );
1119
1120                if (!empty($employeeEntry['employeenumber']))
1121                {
1122                        $outputInfo[] = array(
1123                                'name' => 'Matrícula',
1124                                'value' => $employeeEntry['employeenumber']);
1125                }
1126
1127                $outputInfo[] = array(
1128                        'name' => 'UIDNumber',
1129                        'value' => $employeeID);
1130
1131                $employeeInfo = $orgchart->getEmployee($employeeID);
1132                $employeeStatusInfo = $orgchart->getEmployeeStatus($employeeInfo['funcionario_status_id']);
1133
1134                $outputInfo[] = array(
1135                        'name' => 'Status',
1136                        'value' => $employeeStatusInfo['descricao']);
1137
1138                if (!empty($employeeInfo['funcionario_categoria_id']))
1139                {
1140                        $categoryInfo = $orgchart->getEmployeeCategory($employeeInfo['funcionario_categoria_id']);
1141                        $outputInfo[] = array(
1142                                'name' => 'Vínculo',
1143                                'value' => $categoryInfo['descricao']);
1144                }
1145
1146                $titulo = NULL;
1147                if ( !empty( $employeeInfo['titulo'] ) )
1148                {
1149                        $titulo = $employeeInfo['titulo'];
1150                }
1151
1152                $outputInfo[] = array(
1153                        'name' => 'Título',
1154                        'value' => ( $titulo ? $titulo : '' )
1155                );
1156
1157                $cargo = NULL;
1158                if ( !empty($employeeInfo['cargo_id']) )
1159                {
1160                        $jobTitleInfo = $orgchart->getJobTitle($employeeInfo['cargo_id']);
1161                        $cargo = $jobTitleInfo['descricao'];
1162                }
1163
1164                $outputInfo[] = array(
1165                        'name' => 'Cargo',
1166                        'value' => ( $cargo ? $cargo : '' )
1167                );
1168
1169                $nivel = NULL;
1170                if ( !empty($employeeInfo['nivel']) )
1171                {
1172                        $nivel = $employeeInfo['nivel'];
1173                }
1174
1175                $outputInfo[] = array(
1176                        'name' => 'Nível',
1177                        'value' => ( $nivel ? $nivel : '' )
1178                );
1179
1180                $areaInfo = $orgchart->getArea($employeeInfo['area_id']);
1181                $outputInfo[] = array(
1182                        'name' => 'Área',
1183                        'value' => $areaInfo['sigla']);
1184
1185                $outputInfo[] = array(
1186                        'name' => 'ÁreaID',
1187                        'value' => $employeeInfo['area_id']);
1188
1189                $localInfo = $orgchart->getLocal($employeeInfo['localidade_id']);
1190                $outputInfo[] = array(
1191                        'name' => 'Localidade',
1192                        'value' => $localInfo['descricao']);
1193
1194                $outputInfo[] = array(
1195                        'name' => 'Empresa',
1196                        'value' => ( ! empty( $localInfo['empresa'] ) ? $localInfo['empresa'] : '') );;
1197
1198                $outputInfo[] = array(
1199                        'name' => 'Endereço',
1200                        'value' => ( ! empty( $localInfo['endereco'] ) ? $localInfo['endereco'] : '') );
1201
1202                $outputInfo[] = array(
1203                        'name' => 'Complemento',
1204                        'value' => ( ! empty( $localInfo['complemento'] ) ? $localInfo['complemento'] : '') );;
1205
1206                $outputInfo[] = array(
1207                        'name' => 'Cep',
1208                        'value' => ( ! empty( $localInfo['cep'] ) ? $localInfo['cep'] : '') );
1209
1210                $outputInfo[] = array(
1211                        'name' => 'Bairro',
1212                        'value' => ( ! empty( $localInfo['bairro'] ) ? $localInfo['bairro'] : '') );
1213
1214                $outputInfo[] = array(
1215                        'name' => 'Cidade',
1216                        'value' => ( ! empty( $localInfo['cidade'] ) ? $localInfo['cidade'] : '') );
1217
1218                $outputInfo[] = array(
1219                        'name' => 'UF',
1220                        'value' => ( ! empty( $localInfo['uf'] ) ? $localInfo['uf'] : '') );
1221
1222                if (!empty($employeeInfo['centro_custo_id']))
1223                        $costCenterInfo = $orgchart->getCostCenter($employeeInfo['centro_custo_id']);
1224                else
1225                        $costCenterInfo = $orgchart->getCostCenter($areaInfo['centro_custo_id']);
1226                $outputInfo[] = array(
1227                        'name' => 'Centro de Custo',
1228                        'value' => $costCenterInfo['descricao']);
1229
1230                $outputInfo[] = array(
1231                        'name' => 'e-mail',
1232                        'value' => $employeeEntry['mail']);
1233
1234                $organizationInfo = $orgchart->getOrganization( $employeeInfo['organizacao_id'] );
1235
1236                $outputInfo[] = array(
1237                        'name' => 'sitio',
1238                        'value' => $organizationInfo['sitio']);
1239
1240                return array('info' => $outputInfo);
1241        }
1242
1243        /**
1244         * Busca informações sobre uma área.
1245         * @param array $params Uma array contendo o ID da área cujas informações serão extraídas e de sua organização (Ajax).
1246         * @param int $areaID O ID da área.
1247         * @param int $organizationID O ID da organização.
1248         * @return array Informações sobre o funcionário.
1249         * @access public
1250         */
1251        function getAreaInfo($areaID, $organizationID)
1252        {
1253                $this->_checkAccess($organizationID, false, true);
1254
1255                $areaID = (int) $areaID;
1256                $organizationID = (int) $organizationID;
1257
1258                require_once dirname(__FILE__) . '/local/classes/class.wf_orgchart.php';
1259                $orgchart = new wf_orgchart();
1260
1261                $outputInfo = array();
1262                $areaInfo = $orgchart->getArea($areaID);
1263
1264                $outputInfo[] = array(
1265                        'name' => 'Nome',
1266                        'value' => $areaInfo['descricao']
1267                );
1268
1269                $cachedLDAP = Factory::newInstance('CachedLDAP');
1270                $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE);
1271                if (!empty($areaInfo['titular_funcionario_id']))
1272                {
1273                        $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['titular_funcionario_id']);
1274                        $outputInfo[] = array(
1275                                'name' => 'Titular',
1276                                'value' => $employeeInfo['cn']
1277                        );
1278                }
1279
1280                if (!empty($areaInfo['substituto_funcionario_id']))
1281                {
1282                        $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['substituto_funcionario_id']);
1283                        $outputInfo[] = array(
1284                                'name' => 'Substituto',
1285                                'value' => $employeeInfo['cn']
1286                        );
1287                }
1288
1289                if (!empty($areaInfo['auxiliar_funcionario_id']))
1290                {
1291                        $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['auxiliar_funcionario_id']);
1292                        $outputInfo[] = array(
1293                                'name' => 'Auxiliar Administrativo',
1294                                'value' => $employeeInfo['cn']
1295                        );
1296                }
1297
1298                $outputInfo[] = array(
1299                        'name' => 'No. de Funcionários',
1300                        '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))
1301                );
1302
1303                return array('info' => $outputInfo);
1304        }
1305
1306        /**
1307         * Lista todos os telefones da organização.
1308         * @return array Lista de telefones da organização.
1309         * @access public
1310         */
1311        function getTelephones( $organizationID )
1312        {
1313                $this -> _checkAccess( $organizationID );
1314
1315                $query = "SELECT organizacao_id, telefone_id, descricao, numero FROM telefone WHERE organizacao_id = ? ORDER BY descricao";
1316                $result = $this -> db -> query( $query, array( $organizationID ) );
1317                $this -> _checkError( $result );
1318
1319                $output = $result->GetArray(-1);
1320                for ($i = 0; $i < count($output); $i++)
1321                        for ($j = 0; $j < $result->_numOfFields; $j++)
1322                                unset($output[$i][$j]);
1323
1324                return $output;
1325        }
1326
1327        /**
1328         * Adiciona um telefone a uma organização.
1329         * @param int $organizationID O ID da organização.
1330         * @param string $description A descrição da localidade.
1331         * @param string $number String com os números de telefones.
1332         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
1333         * @access public
1334         */
1335        function addTelephone( $organizationID, $description, $number )
1336        {
1337                $this->_checkAccess( $organizationID );
1338
1339                $query = "INSERT INTO telefone( organizacao_id, descricao, numero ) VALUES( ?, ?, ? )";
1340                $result = $this -> db -> query( $query, array( $organizationID, $description, $number ) );
1341                $this -> _checkError( $result );
1342
1343                return (($result === false) ? false : true);
1344        }
1345
1346        /**
1347         * Remove um telefone.
1348         * @param int $organizationID O ID da organização.
1349         * @param int $telephoneID O ID do telefone.
1350         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
1351         * @access public
1352         */
1353        function removeTelephone( $organizationID, $telephoneID )
1354        {
1355                $this->_checkAccess( $organizationID );
1356
1357                $query = "DELETE FROM telefone WHERE (telefone_id = ?) AND (organizacao_id = ?)";
1358                $result = $this -> db -> query( $query, array( $telephoneID, $organizationID ) );
1359                $this -> _checkError( $result );
1360
1361                return ( ( $result === false ) ? false : true );
1362        }
1363
1364        /**
1365         * Atualiza um telefone.
1366         * @param int $organizationID O ID da organização.
1367         * @param int $telephoneID O ID do telefone.
1368         * @param string $description A descrição do telefone.
1369         * @param string $number String com os números de telefones.
1370         * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
1371         * @access public
1372         */
1373        function updateTelephone( $organizationID, $telephoneID, $description, $number )
1374        {
1375                $this->_checkAccess( $organizationID );
1376
1377                $query = "UPDATE telefone SET descricao = ?, numero = ? WHERE (telefone_id = ?)";
1378                $result = $this -> db -> query( $query, array( $description, $number, $telephoneID ) );
1379                $this->_checkError( $result );
1380
1381                return ( ( $result === false ) ? false : true );
1382        }
1383
1384        /**
1385         * Validate start and end dates for a substitution
1386         * @param int $areaID Area's ID.
1387         * @param string $date_start Substitution's start date.
1388         * @param string $date_start Substitution's end date.
1389         * @return bool
1390         * @access private
1391         */
1392        function validateSubstitutionDates($areaID, $date_start, $date_end, $substitutionID = -1)
1393        {
1394                /* TODO
1395                * I'm not supose to be here.. (date validations speaking)
1396                * move me to some validation class!
1397                */
1398
1399                /* validating dates */
1400                $date_pattern = '/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/[12][0-9]{3}$/';
1401
1402                if (!preg_match($date_pattern, $date_start))
1403                        $this->endExecution("Formato inválido para data de início.");
1404                if (!preg_match($date_pattern, $date_end))
1405                        $this->endExecution("Formato inválido para data de término. ");
1406
1407                $date_start_arr = explode('/', $date_start);
1408                $date_end_arr = explode('/', $date_end);
1409
1410                /* is it a gregorian date? */
1411                if (!checkdate($date_start_arr[1], $date_start_arr[0], $date_start_arr[2]))
1412                        $this->endExecution("Data de início inválida.");
1413                if (!checkdate($date_end_arr[1], $date_end_arr[0], $date_end_arr[2]))
1414                        $this->endExecution("Data de término inválida. ");
1415
1416                /* is date_end greater then date_start? */
1417                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]))
1418                        $this->endExecution("A data de término deve ser maior que a data de início.");
1419
1420                /* preparing dates to database */
1421                $date_start = implode('-', array_reverse($date_start_arr));
1422                $date_end = implode('-', array_reverse($date_end_arr));
1423
1424                /* checking if there is a substitution in conflict with these dates */
1425                $query  = "SELECT * FROM substituicao WHERE ";
1426                $query .= "     area_id = ? ";
1427                $query .= " AND ";
1428                $query .= "     substituicao_id != ? ";
1429                $query .= " AND ";
1430                $query .= "     (";
1431                $query .= "             (? BETWEEN data_inicio AND data_fim) ";
1432                $query .= "     OR ";
1433                $query .= "             (? BETWEEN data_inicio AND data_fim)";
1434                $query .= "     OR ";
1435                $query .= "             (data_inicio BETWEEN ? AND ?)";
1436                $query .= "     ) ";
1437
1438                // raise an error if there is any record
1439                if ($row = $this->db->query($query, array( $areaID, $substitutionID, $date_start, $date_end, $date_start, $date_end ))->fetchRow())
1440                {
1441                        $row['data_inicio'] = implode('/', array_reverse(explode('-', $row['data_inicio'])));
1442                        $row['data_fim'] = implode('/', array_reverse(explode('-', $row['data_fim'])));
1443                        $this->endExecution('Já existe uma substituição no período de '. $row['data_inicio'] . ' a ' . $row['data_fim']);
1444                }
1445                return true;
1446        }
1447
1448        /**
1449         * Add a substitution.
1450         * @param int $organizationID Organization's ID.
1451         * @param int $areaID Area's ID.
1452         * @param int $substituteID Substitute's employee ID.
1453         * @param string $date_start Substitution's start date.
1454         * @param string $date_start Substitution's end date.
1455         * @return bool
1456         * @access public
1457         */
1458        function addSubstitution( $organizationID, $areaID, $substituteID, $date_start, $date_end )
1459        {
1460                $this->_checkAccess( $organizationID );
1461
1462                if (!$this->validateSubstitutionDates($areaID, $date_start, $date_end))
1463                        return false;
1464
1465                /* formating dates */
1466                $date_start = implode('-', array_reverse(explode('/', $date_start)));
1467                $date_end = implode('-', array_reverse(explode('/', $date_end)));
1468
1469                $query = "INSERT INTO substituicao (area_id, funcionario_id, data_inicio, data_fim) VALUES (?, ?, ?, ?)";
1470                $result = $this -> db -> query( $query, array( $areaID, $substituteID, $date_start, $date_end ) );
1471                $this->_checkError( $result );
1472               
1473                return ( ( $result === false ) ? false : true );
1474        }
1475
1476        /**
1477         * Update a substitution.
1478         * @param int $organizationID Organization's ID.
1479         * @param int $areaID Area's ID.
1480         * @param int $substituteID Substitute's employee ID.
1481         * @param string $date_start Substitution's start date.
1482         * @param string $date_start Substitution's end date.
1483         * @return bool
1484         * @access public
1485         */
1486        function updateSubstitution( $organizationID, $areaID, $substituteID, $date_start, $date_end, $substitutionID )
1487        {
1488                $this->_checkAccess( $organizationID );
1489
1490                if (!$this->validateSubstitutionDates($areaID, $date_start, $date_end, $substitutionID))
1491                        return false;
1492
1493                /* formating dates */
1494                $date_start = implode('-', array_reverse(explode('/', $date_start)));
1495                $date_end = implode('-', array_reverse(explode('/', $date_end)));
1496
1497                $query = "UPDATE substituicao SET funcionario_id = ?, data_inicio = ?, data_fim = ? WHERE substituicao_id = ?";
1498                $result = $this -> db -> query( $query, array( $substituteID, $date_start, $date_end, $substitutionID ) );
1499                $this->_checkError( $result );
1500               
1501                return ( ( $result === false ) ? false : true );
1502        }
1503
1504        /**
1505         * List all the substituions for a given area
1506         * @return array List of the substitutions
1507         * @access public
1508         */
1509        function getSubstitutions( $organizationID, $areaID )
1510        {
1511                $this -> _checkAccess( $organizationID );
1512
1513                /* we must join area table to get organizacao_id */
1514                $query = "SELECT s.*, a.organizacao_id FROM substituicao s INNER JOIN area a USING(area_id) WHERE area_id = ? ORDER BY data_inicio DESC";
1515                $result = $this -> db -> query( $query, array( $areaID ) );
1516                $this -> _checkError( $result );
1517
1518                /* we must query ldap to get full user names. In workflow db we just store uids */
1519                $cachedLDAP = Factory::getInstance('CachedLDAP');
1520
1521                $output = $result->GetArray(-1);
1522                for ($i = 0; $i < count($output); $i++) {
1523                        for ($j = 0; $j < $result->_numOfFields; $j++)
1524                                unset($output[$i][$j]);
1525
1526                        /* including substitute full name */
1527                        $ldap_result = $cachedLDAP->getEntryByID($output[$i]['funcionario_id']);
1528                        $output[$i]['substituto_funcionario_id'] = $output[$i]['funcionario_id'];
1529                        $output[$i]['substituto_funcionario_id_desc'] = $ldap_result['cn'];
1530
1531                        /* formating dates */
1532                        $output[$i]['data_inicio'] = implode('/', array_reverse(explode('-', $output[$i]['data_inicio'])));
1533                        $output[$i]['data_fim'] = implode('/', array_reverse(explode('-', $output[$i]['data_fim'])));
1534                }
1535                return $output;
1536        }
1537
1538        /**
1539         * Remove a substitution
1540         * @param int $organizationID Organization's ID
1541         * @param int $telephoneID Substitution's ID
1542         * @return bool
1543         * @access public
1544         */
1545        function removeSubstitution( $organizationID, $substitutionID )
1546        {
1547                $this->_checkAccess( $organizationID );
1548
1549                $query = "DELETE FROM substituicao WHERE substituicao_id = ?";
1550                $result = $this -> db -> query( $query, array( $substitutionID ) );
1551                $this -> _checkError( $result );
1552
1553                return ( ( $result === false ) ? false : true );
1554        }
1555}
1556?>
Note: See TracBrowser for help on using the repository browser.