source: branches/2.4/workflow/inc/local/classes/class.wf_orgchart.php @ 7228

Revision 7228, 49.8 KB checked in by douglas, 12 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 * Classe que permite aos processos workflow fazer consultas ao Organograma
4 *
5 * @author Sidnei Augusto Drovetto Junior - drovetto@gmail.com
6 * @version 1.2
7 * @license http://www.gnu.org/copyleft/gpl.html GPL
8 * @package Workflow
9 * @subpackage local
10 */
11class wf_orgchart
12{
13        /**
14         * @var object $db Link para o Banco de Dados do Workflow.
15         * @access private
16         */
17        var $db;
18        var $ldap;
19
20        /**
21         * Construtor da classe wf_orgchart
22         * @return object
23         * @access public
24         */
25        function wf_orgchart()
26        {
27                $this->db = &Factory::getInstance('WorkflowObjects')->getDBWorkflow()->Link_ID;
28                $this->db->setFetchMode(ADODB_FETCH_ASSOC);
29
30                $this->ldap = Factory::getInstance('CachedLDAP');
31        }
32
33        /**
34         * Busca uma organização pelo seu ID.
35         *
36         * Este método irá procurar uma organização na tabela de organizações, pelo seu ID, e retornará seu dados básicos.
37         * @param int $organizationID O ID da organização.
38         * @return array Uma array associativa contendo os atributos de uma organização:
39         * - organizacao_id
40         * - nome: o nome abreviado da organização
41         * - descrição: o nome completo da organização
42         * - url_imagem: a url onde se encontra o gráfico da organização
43         * - ativa: se a organização está ativa ou não
44         * - sitio: a url da página web da organização
45         * @access public
46         */
47        function getOrganization($organizationID)
48        {
49                $query = "SELECT organizacao_id, nome, descricao, url_imagem, ativa, sitio" .
50                                 "  FROM organizacao" .
51                                 " WHERE (organizacao_id = ?)";
52
53                $result = $this->db->query($query, array($organizationID));
54                if (!$result)
55                        return false;
56
57                $output = $result->fetchRow();
58
59                return $output;
60        }
61
62        /**
63         * Busca uma organização pelo seu nome.
64         *
65         * Este método irá buscar os dados básicos de uma organização, procurando pela sua sigla.
66         * @param string $name A sigla da organização.
67         * @return array Uma array associativa contendo os atributos de uma organização:
68         * - organizacao_id
69         * - nome: a sigla da organização
70         * - descricao: o nome completo
71         * - url_imagem: a url onde se encontra o gráfico da organização
72         * - ativa: se a organização está ativa ou não
73         * - sitio: a url da página web da organização
74         * @access public
75         */
76        function getOrganizationByName($name)
77        {
78                $query = "SELECT organizacao_id, nome, descricao, url_imagem, ativa, sitio" .
79                                 "  FROM organizacao" .
80                                 " WHERE (UPPER(nome) = UPPER(?))";
81
82                $result = $this->db->query($query, array($name));
83                if (!$result)
84                        return false;
85
86                $output = $result->fetchRow();
87
88                return $output;
89        }
90
91        /**
92         * Lista todos os telefones úteis de uma organização.
93         *
94         * Este método irá listar a tabela telefone.
95         * @param int $organizationID O ID da organização.
96         * @return array Uma array de arrays associativas contendo a lista dos telefones de uma organização:
97         * - telefone_id
98         * - descricao
99         * - organizacao_id
100         * @access public
101         */
102        function getOrganizationTelephones($organizationID)
103        {
104                $query = "SELECT telefone_id, descricao, organizacao_id" .
105                                 "  FROM telefone" .
106                                 "      WHERE organizacao_id = ?";
107
108                $result = $this->db->query($query, array((int) $organizationID));
109                if (!$result)
110                        return false;
111
112                $output = $result->GetArray(-1);
113
114                return $output;
115        }
116
117        /**
118         * Busca os funcionários de uma organização
119         *
120         * Este método irá buscar na tabela de funcionários, todos os funcionários que pertencem à organização solicitada.
121         * @param int $organizationID O ID da organização.
122         * @param boolean $searchLdap True, caso seja necessário buscar no LDAP os dados dos usuários. Ou false, caso contrário.
123         * @param int $employeeStatusID O ID do status dos funcionários a serem listados.
124         * @return array Uma array seqüencial contendo os funcionários de uma organização. Cada linha do array conterá:
125         * - organizacao_id
126         * - funcionario_id: uidNumber do funcionário
127         * - localidade_id
128         * - localidade_descricao
129         * - area_id
130         * - area_sigla
131         * - centro_custo_id
132         * - nm_centro_custo: número do centro de custo
133         * - centro_custo_descricao
134         * - nome: nome do funcionário (quando busca no Ldap)
135         * - email: email do funcionário (quando busca no Ldap)
136         * - telefone: telefone do funcionário (quando busca no Ldap)
137         * @access public
138         */
139        function getOrganizationEmployees($organizationID, $searchLdap = false, $employeeStatusID = null)
140        {
141                $query = "SELECT f.organizacao_id, " .
142                                 "       f.funcionario_id, " .
143                                 "       l.localidade_id, " .
144                                 "       l.descricao AS localidade_descricao, " .
145                                 "       a.area_id, " .
146                                 "       a.sigla AS area_sigla, " .
147                                 "       c.centro_custo_id, " .
148                                 "       c.nm_centro_custo, " .
149                                 "       c.descricao AS centro_custo_descricao " .
150                                 " FROM funcionario f " .
151                                 "  INNER JOIN area a " .
152                                 "  ON (f.area_id = a.area_id) " .
153                                 "  INNER JOIN localidade l " .
154                                 "  ON (f.localidade_id = l.localidade_id) " .
155                                 "  LEFT OUTER JOIN centro_custo c " .
156                                 "  ON (COALESCE(f.centro_custo_id, l.centro_custo_id, a.centro_custo_id) = c.centro_custo_id) " .
157                                 " WHERE " .
158                                 "      f.organizacao_id = ? ";
159
160                $bindValues = array($organizationID);
161
162                // Se desejar somente retornar as áreas que estão ativas
163                if(!empty($employeeStatusID)){
164                        $query .=" AND f.funcionario_status_id = ? ";
165                        $bindValues[] = $employeeStatusID;
166                }
167
168                $query .= " ORDER BY f.funcionario_id";
169
170                $result = $this->db->query($query, $bindValues);
171                if (!$result)
172                        return false;
173
174                $output = $result->GetArray(-1);
175
176                if($searchLdap){
177                        $output = $this->searchEmployeeDataInLdap($output);
178                }
179
180                return $output;
181        }
182
183        /**
184         * Busca as áreas de uma organização
185         *
186         * Este método irá buscar na tabela de áreas, todas as áreas que pertencem à organização solicitada.
187         * @param int $organizationID O ID da organização.
188         * @param int $onlyActiveAreas false= recupera todas as áreas; true= recupera somente as áreas ativas.
189         * @return array Uma array seqüencial contendo as áreas de uma organização. Cada linha do array conterá:
190         * - organizacao_id
191         * - area_id
192         * - area_status_id: corresponde ao nível hierárquico da area
193         * - superior_area_id: o id da área acima da atual
194         * - centro_custo_id: o id do centro de custo da area
195         * - titular_funcionario_id: o id do funcionario titular da área. Corresponde ao uidNumber do funcionário no catálogo Ldap.
196         * - substituto_funcionario_id: o id do funcionario que está substituindo o titular temporariamente
197         * - sigla: sigla da area
198         * - descrição: nome completo da area
199         * - ativa: indicativo de situação da area, sendo 's' ativa, e 'n' inativa
200         * - auxiliar_funcionario_id: id da secretária da área
201         * @access public
202         */
203        function getOrganizationAreas($organizationID, $onlyActiveAreas = false)
204        {
205                $query = "SELECT a.organizacao_id, a.area_id, a.area_status_id, " .
206                                 "       a.superior_area_id, a.centro_custo_id, a.titular_funcionario_id, " .
207                                 "       a.sigla, a.descricao, a.ativa, a.auxiliar_funcionario_id, " .
208                                 "               s.funcionario_id as substituto_funcionario_id " .
209                                 " FROM area a " .
210                                 "  LEFT OUTER JOIN substituicao s " .
211                                 "  ON ((a.area_id = s.area_id) AND (CURRENT_DATE BETWEEN s.data_inicio AND s.data_fim)) " .
212                                 " WHERE " .
213                                 "      (a.organizacao_id = ?) ";
214                // Se desejar somente retornar as áreas que estão ativas
215                if($onlyActiveAreas)
216                        $query .=" AND a.ativa = 'S' ";
217
218                $query .= " ORDER BY a.sigla, a.descricao";
219
220                $result = $this->db->query($query, array($organizationID));
221                if (!$result)
222                        return false;
223
224                $output = $result->GetArray(-1);
225
226                return $output;
227        }
228
229        /**
230         * Searches for all the supervisors of an organization.
231         *
232         * This method will search in table areas for all the supervisors and replacement in the organization.
233         * @param int $organizationID the ID of the Organization.
234         * @return array Uma array seqüencial contendo as áreas de uma organização e seus titulares e substitutos. Cada linha do array conterá:
235         * - area_id
236         * - titular_funcionario_id: o id do funcionario titular da área. Corresponde ao uidNumber do funcionário no catálogo Ldap.
237         * - substituto_funcionario_id: o id do funcionario que está substituindo o titular temporariamente
238         * @access public
239         */
240        function getOrganizationSupervisors($organizationID) {
241                $query = "  SELECT
242                                                a.titular_funcionario_id,
243                                                s.funcionario_id as substituto_funcionario_id,
244                                                a.area_id
245                                        FROM
246                                                area a
247                                                LEFT OUTER JOIN substituicao s
248                                                ON ((a.area_id = s.area_id) AND (CURRENT_DATE BETWEEN s.data_inicio AND s.data_fim))
249                                        WHERE
250                                                a.titular_funcionario_id is not null
251                                                and a.ativa = 'S'
252                                                AND a.organizacao_id = ?
253                                        GROUP BY
254                                                a.titular_funcionario_id,
255                                                s.funcionario_id,
256                                                a.area_id";
257                $result = $this->db->query($query, array($organizationID));
258                $output = $result->GetArray(-1);
259                return $output;
260        }
261
262        /**
263         * Busca os status de área de uma organização.
264         *
265         * O status de área deve ser compreendido como um nível hirárquico das áreas da organização.
266         * Por exemplo: presidência, assessoria, diretoria, gerência, divisão, etc.
267         * @param int $organizationID O ID da organização.
268         * @return array Uma array de arrays associativas contendo os atributos dos status de área. Cada linha do array conterá:
269         * - area_status_id
270         * - organização_id
271         * - descrição
272         * - nível: a posição hierárquica do nível no organograma. Por exemplo: 1 - presidencia, 2 - assessoria, etc
273         * @access public
274         */
275        function getOrganizationAreaStatus($organizationID)
276        {
277                $query = "SELECT area_status_id, organizacao_id, descricao, nivel" .
278                                 "  FROM area_status" .
279                                 " WHERE (organizacao_id = ?)";
280
281                $result = $this->db->query($query, array($organizationID));
282                if (!$result)
283                        return false;
284
285                $output = $result->GetArray(-1);
286
287                return $output;
288        }
289
290        /**
291         * Busca as localidades de uma organização.
292         *
293         * As localidades de uma organização representam o local físico de trabalho dos funcionários.
294         * @param int $organizationID O ID da organização.
295         * @return array Uma array de arrays associativas contendo os atributos das localidades. Cada linha do array conterá:
296         * - organizacao_id
297         * - localidade_id
298         * - centro_custo_id
299         * - descricao: o nome simplificado localidade
300         * - empresa: o nome completo da localidade
301         * - endereço: o logradouro da empresa, com o número
302         * - complemento: dado adicional do endereço
303         * - cep: código de endereçamento postal, máscara nnnnnn-nnn
304         * - bairro: nome do bairro
305         * - cidade: nome da cidade
306         * - uf: unidade da federação
307         * @access public
308         */
309        function getOrganizationLocals($organizationID)
310        {
311                $query = "SELECT organizacao_id, localidade_id, centro_custo_id, descricao, empresa,
312                                                        endereco, complemento, cep, bairro, cidade, uf" .
313                                 "  FROM localidade" .
314                                 " WHERE (organizacao_id = ?)";
315
316                $result = $this->db->query($query, array($organizationID));
317                if (!$result)
318                        return false;
319
320                $output = $result->GetArray(-1);
321
322                return $output;
323        }
324
325        /**
326         * Busca os centros de custo de uma organização.
327         *
328         * Este método retornará todos os centros de custo de uma organização.
329         * Centros de custo são como códigos contábeis para faturamento de serviços.
330         * @param int $organizationID O ID da organização.
331         * @return array Uma array de arrays associativas contendo os atributos dos centros de custo. Cada linha do array conterá:
332         * - organizacao_id
333         * - centro_custo_id
334         * - nm_centro_custo: número do centro de custo
335         * - grupo: estrutura numerica a qual o centro de custo pertence
336         * - descrição: nome do centro de custo
337         * @access public
338         */
339        function getOrganizationCostCenters($organizationID)
340        {
341                $query = "SELECT organizacao_id, centro_custo_id, nm_centro_custo, grupo, descricao" .
342                                 "  FROM centro_custo" .
343                                 " WHERE (organizacao_id = ?)" .
344                                 " ORDER BY descricao";
345
346                $result = $this->db->query($query, array($organizationID));
347                if (!$result)
348                        return false;
349
350                $output = $result->GetArray(-1);
351
352                return $output;
353        }
354
355        /**
356         * Lista todas as categorias possíveis para um funcionário em uma organização.
357         *
358         * Este método listará a tabela de categorias.
359         * Por exemplo: funcionário, estagiário, terceirizado, etc.
360         * @param int $organizationID O ID da organização.
361         * @return array Uma array de arrays associativas contendo os atributos das categorias. Cada linha do array conterá:
362         * - funcionario_categoria_id: o id da categoria
363         * - descricao
364         * - organizacao_id
365         * @access public
366         */
367        function getOrganizationEmployeeCategories($organizationID)
368        {
369                $query = "SELECT funcionario_categoria_id, descricao, organizacao_id" .
370                                 "  FROM funcionario_categoria" .
371                                 "      WHERE organizacao_id = ?" .
372                                 "  ORDER BY funcionario_categoria_id";
373
374                $result = $this->db->query($query, array((int) $organizationID));
375                if (!$result)
376                        return false;
377
378                $output = $result->GetArray(-1);
379
380                return $output;
381        }
382
383        /**
384         * Lista todas as organizações do Organograma.
385         *
386         * Este método irá listar a tabela de organizações
387         * O modelo de dados do organograma foi construído para abrigar mais de uma organização
388         * @return um array de arrays associativas contendo a lista de organizações. Cada linha do array conterá:
389         * - organizacao_id
390         * - nome: sigla da organizacao
391         * - descricao
392         * - url_imagem: a url onde se encontra o gráfico da organização
393         * - ativa: se a organização está ativa ou não
394         * - sitio: a url da página web da organização
395         * @access public
396         */
397        function getOrganizations()
398        {
399                $query = "SELECT organizacao_id, nome, descricao, url_imagem, ativa, sitio" .
400                                 "  FROM organizacao ORDER BY nome";
401
402                $result = $this->db->query($query);
403                if (!$result)
404                        return false;
405
406                $output = $result->GetArray(-1);
407
408                return $output;
409        }
410
411
412        /**
413         * Busca uma área pelo seu ID.
414         *
415         * Este método irá retornar os dados de uma área buscando pelo seu ID.
416         * @param int $areaID O ID da área.
417         * @return array Uma array associativa contendo os atributos de uma área:
418         * - organizacao_id
419         * - area_id
420         * - area_status: o nível hierárquico da área
421         * - superior_area_id: o id da área acima da atual
422         * - centro_custo_id: o centro de custo da área
423         * - titular_funcionario_id: o id do chefe da área
424         * - substituto_funcionario_id: o id do funcionario que esta substituindo o titular temporariamente
425         * - sigla
426         * - descicao
427         * - ativa: indicativo de situação da área: 's' ativa, 'n' inativa
428         * - auxiliar_funcionario_id: o id da secretária da área
429         * @access public
430         */
431        function getArea($areaID)
432        {
433                $query = "SELECT a.organizacao_id, a.area_id, a.area_status_id, " .
434                                 "       a.superior_area_id, a.centro_custo_id, a.titular_funcionario_id, " .
435                                 "       a.sigla, a.descricao, a.ativa, a.auxiliar_funcionario_id, " .
436                                 "               s.funcionario_id as substituto_funcionario_id " .
437                                 " FROM area a " .
438                                 "  LEFT OUTER JOIN substituicao s " .
439                                 "  ON ((a.area_id = s.area_id) AND (CURRENT_DATE BETWEEN s.data_inicio AND s.data_fim)) " .
440                                 " WHERE " .
441                                 "      (a.area_id = ?) " .
442                                 " ORDER BY a.sigla, a.descricao";
443
444
445                $result = $this->db->query($query, array($areaID));
446                if (!$result)
447                        return false;
448
449                $output = $result->fetchRow();
450
451                return $output;
452        }
453
454        /**
455         * Busca uma área pela sua sigla.
456         *
457         * Este método retornará os atributos de uma área buscando pela sua sigla.
458         * @param string $acronym A sigla da área.
459         * @param int $organizationID O id da organização
460         * @return array Uma array associativa contendo os atributos de uma área:
461         * - organizacao_id
462         * - area_id
463         * - area_status: o nível hierárquico da área
464         * - superior_area_id: o id da área acima da atual
465         * - centro_custo_id: o centro de custo da área
466         * - titular_funcionario_id: o id do chefe da área
467         * - substituto_funcionario_id: o id do funcionario que esta substituindo o titular temporariamente
468         * - sigla
469         * - descicao
470         * - ativa: indicativo de situação da área: 's' ativa, 'n' inativa
471         * - auxiliar_funcionario_id: o id da secretária da área
472         * @access public
473         */
474        function getAreaByName($acronym, $organizationID = 1)
475        {
476                $query = "SELECT a.organizacao_id, a.area_id, a.area_status_id, " .
477                                 "       a.superior_area_id, a.centro_custo_id, a.titular_funcionario_id, " .
478                                 "       a.sigla, a.descricao, a.ativa, a.auxiliar_funcionario_id, " .
479                                 "               s.funcionario_id as substituto_funcionario_id " .
480                                 " FROM area a " .
481                                 "  LEFT OUTER JOIN substituicao s " .
482                                 "  ON ((a.area_id = s.area_id) AND (CURRENT_DATE BETWEEN s.data_inicio AND s.data_fim)) " .
483                                 " WHERE " .
484                                 "      (UPPER(a.sigla) = UPPER(?)) " .
485                                 " AND " .
486                                 "      (a.organizacao_id = ?) " .
487                                 " ORDER BY a.sigla, a.descricao";
488
489
490                $result = $this->db->query($query, array($acronym, (int) $organizationID));
491                if (!$result)
492                        return false;
493
494                $output = $result->fetchRow();
495
496                return $output;
497        }
498
499        /**
500         * Busca as áreas que possuem um determinado status de área.
501         *
502         * Este método irá retornar todas as áreas cujo status (nível hierárquico) seja o solicitado.
503         * @param int $areaStatusID O ID do status de área.
504         * @return array Uma array de arrays associativas contendo os atributos de uma área. Cada linha do array conterá:
505         * - organizacao_id
506         * - area_id
507         * - area_status: o nível hierárquico da área
508         * - superior_area_id: o id da área acima da atual
509         * - centro_custo_id: o centro de custo da área
510         * - titular_funcionario_id: o id do chefe da área
511         * - substituto_funcionario_id: o id do funcionario que esta substituindo o titular temporariamente
512         * - sigla
513         * - descicao
514         * - ativa: indicativo de situação da área: 's' ativa, 'n' inativa
515         * - auxiliar_funcionario_id: o id da secretária da área
516         * @access public
517         */
518        function getAreaByStatus($areaStatusID)
519        {
520                $result = array();
521
522                $query = "SELECT a.organizacao_id, a.area_id, a.area_status_id, " .
523                                 "       a.superior_area_id, a.centro_custo_id, a.titular_funcionario_id, " .
524                                 "       a.sigla, a.descricao, a.ativa, a.auxiliar_funcionario_id, " .
525                                 "               s.funcionario_id as substituto_funcionario_id " .
526                                 " FROM area a " .
527                                 "  LEFT OUTER JOIN substituicao s " .
528                                 "  ON ((a.area_id = s.area_id) AND (CURRENT_DATE BETWEEN s.data_inicio AND s.data_fim)) " .
529                                 " WHERE " .
530                                 "      (a.area_status_id = ?) " .
531                                 " ORDER BY a.sigla, a.descricao";
532
533
534
535                $result = $this->db->query($query, array($areaStatusID));
536                if (!$result)
537                        return false;
538
539                $output = $result->GetArray(-1);
540
541                return $output;
542        }
543
544        /**
545         * Busca várias áreas através de uma array de IDs
546         *
547         * Este método irá buscar de uma vez só os dados de mais de uma área.
548         * @param array $areaIDs Array com os IDs das áreas
549         * @return array Um array de arrays associativos contendo os atributos de várias áreas. Cada linha do array conterá:
550         * - organizacao_id
551         * - area_id
552         * - area_status: o nível hierárquico da área
553         * - superior_area_id: o id da área acima da atual
554         * - centro_custo_id: o centro de custo da área
555         * - titular_funcionario_id: o id do chefe da área
556         * - substituto_funcionario_id: o id do funcionario que esta substituindo o titular temporariamente
557         * - sigla
558         * - descicao
559         * - ativa: indicativo de situação da área: 's' ativa, 'n' inativa
560         * - auxiliar_funcionario_id: o id da secretária da área
561         * @access public
562         */
563        function getAreas($areaIDs)
564        {
565                if (!is_array($areaIDs))
566                        return false;
567
568                $areas = implode(', ', $areaIDs);
569
570                $query = "SELECT a.organizacao_id, a.area_id, a.area_status_id, " .
571                                 "       a.superior_area_id, a.centro_custo_id, a.titular_funcionario_id, " .
572                                 "       a.sigla, a.descricao, a.ativa, a.auxiliar_funcionario_id, " .
573                                 "               s.funcionario_id as substituto_funcionario_id " .
574                                 " FROM area a " .
575                                 "  LEFT OUTER JOIN substituicao s " .
576                                 "  ON ((a.area_id = s.area_id) AND (CURRENT_DATE BETWEEN s.data_inicio AND s.data_fim)) " .
577                                 " WHERE " .
578                                 "      (a.area_id IN ($areas)) " .
579                                 " ORDER BY a.sigla, a.descricao";
580
581                // A execução é realizada sem o segundo parâmetro pois este não pode estar entre aspas
582                $result = $this->db->query($query);
583                if (!$result)
584                        return false;
585
586                $output = $result->GetArray(-1);
587                return $output;
588        }
589
590        /**
591         * Return all areas that the employee is a supervisor.
592         *
593         * Search in the organization for all areas that the employee is a supervisor.
594         * @param int $employeeID The ID of employee
595         * @return array Array containing all the areas that the employeee is a supervisor.
596         * @access public
597         */
598        function getSupervisorAreas($employeeID) {
599
600                if (!$employeeID) {
601                        return false;
602                }
603
604                $query = "SELECT
605                                                a.area_id
606                                        FROM
607                                                area a
608                                                LEFT OUTER JOIN substituicao s ON ((a.area_id = s.area_id)
609                                                AND (CURRENT_DATE BETWEEN s.data_inicio AND s.data_fim))
610                                        WHERE
611                                                a.titular_funcionario_id = ? OR
612                                                s.funcionario_id = ?
613                                        GROUP BY
614                                                a.area_id";
615
616                $result = $this->db->query($query, array($employeeID,$employeeID));
617                if (!$result)
618                        return false;
619
620                $output = $result->GetArray(-1);
621                return $output;
622        }
623
624        /**
625         * Busca o ID da área superior a uma dada área.
626         *
627         * Este método irá buscar a área imediatamente superior à solicitada, ou então subirá na hierarquia até chegar no nível solicitado.
628         * @param int $areaID O ID da área da qual se quer saber a área superior.
629         * @param int $areaStatusID O ID do status de área (nível) da área pai. Utilizar -1 caso se queira a área imediatamente superior.
630         * - Por exemplo: área atual está no nível 5 (Divisão) e se quer buscar a área de nivel 3 (Diretoria).
631         * @return int O ID da área que é superior à área informada.
632         * @access public
633         */
634        function getParentAreaID($areaID, $areaStatusID = -1)
635        {
636                $query  = "SELECT area_id, area_status_id" .
637                                  "  FROM area" .
638                                  " WHERE area_id = (SELECT superior_area_id" .
639                                  "                    FROM area" .
640                                  "                   WHERE (area_id = ?))";
641
642                $result = $this->db->query($query, array($areaID));
643                if (!$result)
644                        return false;
645
646                $output = $result->fetchRow();
647                if (!$output)
648                        return false;
649
650                if (($areaStatusID == -1) || ($output['area_status_id'] == $areaStatusID))
651                        return $output['area_id'];
652                else
653                        return $this->getParentAreaID($output['area_id'], $areaStatusID);
654        }
655
656        /**
657         * Busca as áreas abaixo de uma determinada área.
658         *
659         * Este método irá buscar as áreas imediatamente inferiores à solicitada, não descendo nos próximos níveis da hierarquia.
660         * @param int $parentAreaID O ID da área da qual se quer saber as áreas imediatamente inferiores.
661         * @param boolean $onlyActiveAreas Valor lógico que, caso verdadeiro, faz com que o método retorne somente as áreas ativas
662         * @return array Um array de arrays associativos contendo os atributos de várias áreas. Cada linha do array conterá:
663         * - organizacao_id
664         * - area_id
665         * - area_status: o nível hierárquico da área
666         * - superior_area_id: o id da área acima da atual
667         * - centro_custo_id: o centro de custo da área
668         * - titular_funcionario_id: o id do chefe da área
669         * - substituto_funcionario_id: o id do funcionario que esta substituindo o titular temporariamente
670         * - sigla
671         * - descicao
672         * - ativa: indicativo de situação da área: 's' ativa, 'n' inativa
673         * - auxiliar_funcionario_id: o id da secretária da área
674         * @access public
675         */
676        function getSubAreasByParentAreaID($parentAreaID, $onlyActiveAreas = false)
677        {
678                $query = "SELECT a.organizacao_id, a.area_id, a.area_status_id, " .
679                                 "       a.superior_area_id, a.centro_custo_id, a.titular_funcionario_id, " .
680                                 "       a.sigla, a.descricao, a.ativa, a.auxiliar_funcionario_id, " .
681                                 "               s.funcionario_id as substituto_funcionario_id " .
682                                 " FROM area a " .
683                                 "  LEFT OUTER JOIN substituicao s " .
684                                 "  ON ((a.area_id = s.area_id) AND (CURRENT_DATE BETWEEN s.data_inicio AND s.data_fim)) " .
685                                 " WHERE " .
686                                 "      (a.superior_area_id = ?) ";
687
688
689                if ($onlyActiveAreas){
690                        $query .= " AND ativa = 'S'";
691                }
692                $query .= " ORDER BY a.sigla, a.descricao";
693
694                $result = $this->db->query($query, array($parentAreaID));
695                if (!$result)
696                        return false;
697
698                $output = $result->GetArray(-1);
699                return $output;
700        }
701
702        /**
703         * Busca um status de área pelo seu ID.
704         *
705         * Procura na tabela de status de área (nível hierárquico de áreas) o registro que corresponde ao ID solicitado.
706         * @param int $areaStatusID O ID do status de área.
707         * @return array Uma array associativa contendo os atributos de um status de área:
708         * - area_status_id
709         * - organizacao_id
710         * - descricao: nome do nível hierárquivo. Por exemplo: presidência, assessoria, diretoria, gerência, etc.
711         * - nivel: valor numérico que identifica o nível: 1, 2, 3, ...
712         * @access public
713         */
714        function getAreaStatus($areaStatusID)
715        {
716                $query = "SELECT area_status_id, organizacao_id, descricao, nivel" .
717                                 "  FROM area_status" .
718                                 " WHERE (area_status_id = ?)";
719
720                $result = $this->db->query($query, array($areaStatusID));
721                if (!$result)
722                        return false;
723
724                $output = $result->fetchRow();
725
726                return $output;
727        }
728
729        /**
730         * Busca um status de área pelo seu nome.
731         *
732         * Este método irá retornar os dados de um status, procurando o registro na tabela através do seu nome.
733         * @param string $description O nome do status de área.
734         * @param int $organizationID O id da organização.
735         * @return array Uma array associativa contendo os atributos de um status de área:
736         * - area_status_id
737         * - organizacao_id
738         * - descricao: nome do nível hierárquivo. Por exemplo: presidência, assessoria, diretoria, gerência, etc.
739         * - nivel: valor numérico que identifica o nível: 1, 2, 3, ...
740         * @access public
741         */
742        function getAreaStatusByName($description, $organizationID = 1)
743        {
744                $query = "SELECT area_status_id, organizacao_id, descricao, nivel" .
745                                 "  FROM area_status" .
746                                 " WHERE (UPPER(descricao) = UPPER(?) and (organizacao_id = ?))";
747
748                $result = $this->db->query($query, array($description, (int) $organizationID));
749                if (!$result)
750                        return false;
751
752                $output = $result->fetchRow();
753
754                return $output;
755        }
756
757        /**
758         * Busca um status de área pelo seu nível.
759         *
760         * Este método irá retornar os dados de um status, procurando o registro na tabela através do seu nível.
761         * @param int $level O nível do status de área.
762         * @param int $organizationID O id da organização.
763         * @return array Uma array associativa contendo os atributos de um status de área:
764         * - area_status_id
765         * - organizacao_id
766         * - descricao: nome do nível hierárquivo. Por exemplo: presidência, assessoria, diretoria, gerência, etc.
767         * - nivel: valor numérico que identifica o nível: 1, 2, 3, ...
768         * @access public
769         */
770        function getAreaStatusByLevel($level, $organizationID = 1)
771        {
772                $query = "SELECT area_status_id, organizacao_id, descricao, nivel" .
773                                 " FROM area_status" .
774                                 " WHERE (nivel = ?) AND (organizacao_id = ?)";
775
776                $result = $this->db->query($query, array((int) $level, (int) $organizationID));
777                if (!$result)
778                        return false;
779
780                $output = $result->fetchRow();
781
782                return $output;
783        }
784
785        /**
786         * Busca o ID do titular de uma área.
787         *
788         * Este método busca uma área e retorna o atributo titular_funcionario_id
789         * @param int $areaID O ID da área.
790         * @return int O ID do titular da área.
791         * @access public
792         */
793        function getAreaSupervisorID($areaID)
794        {
795                $area = $this->getArea($areaID);
796                if (!$area)
797                        return false;
798
799                return $area['titular_funcionario_id'];
800        }
801
802        /**
803         * Busca o ID do substituto de uma área.
804         *
805         * Este método irá buscar uma área e retornar o atributo substituto_funcionario_id.
806         * Note que o substituro é um campo opcional na área e poderá retornar vazio.
807         * @param int $areaID O ID da área.
808         * @return int O ID do substituto da área.
809         * @access public
810         */
811        function getAreaBackupSupervisorID($areaID)
812        {
813                $area = $this->getArea($areaID);
814                if (!$area)
815                        return false;
816
817                return $area['substituto_funcionario_id'];
818        }
819
820        /**
821         * Busca o ID do auxiliar administrativo de uma área.
822         *
823         * Este método busca uma área e retorna o atributo auxiliar_funcionario_id
824         * Nem todas as áreas possuem funcionários auxiliares (secretárias)
825         * @param int $areaID O ID da área.
826         * @return int O ID do auxiliar administrativo da área.
827         * @access public
828         */
829        function getAreaAssistantID($areaID)
830        {
831                $area = $this->getArea($areaID);
832                if (!$area)
833                        return false;
834
835                return $area['auxiliar_funcionario_id'];
836        }
837
838        /**
839         * Busca o ID do titular atual de uma área.
840         *
841         * Este método irá buscar uma área e caso haja um substituto, este será o titular atual; caso contrário, o titular atual é o próprio titular da área.
842         * @param int $areaID O ID da área.
843         * @return int O ID do titular atual da área, podendo ser um dos campos abaixo:
844         * - substituto_funcionario_id
845         * - titular_funcionario_id
846         * @access public
847         */
848        function getAreaCurrentSupervisorID($areaID)
849        {
850                $area = $this->getArea($areaID);
851                if (!$area)
852                        return false;
853
854                return is_null($area['substituto_funcionario_id']) ? $area['titular_funcionario_id'] : $area['substituto_funcionario_id'];
855        }
856
857        /**
858         * Busca o ID do responsável administrativo atual de uma área.
859         *
860         * A precedência para definir quem é o responsável administrativo é: auxiliar administrativo, substituto e titular.
861         * @param int $areaID O ID da área.
862         * @return int O ID do responsável administrativo da área, podendo ser um dos atributos abaixo:
863         * - auxiliar_funcionario_id
864         * - substituto_funcionario_id
865         * - titular_funcionario_id
866         * @access public
867         */
868        function getAreaCurrentAdministrativeResponsibleID($areaID)
869        {
870                $area = $this->getArea($areaID);
871                if (!$area)
872                        return false;
873
874                return !is_null($area['auxiliar_funcionario_id']) ? $area['auxiliar_funcionario_id'] : (!is_null($area['substituto_funcionario_id']) ? $area['substituto_funcionario_id'] : $area['titular_funcionario_id']);
875        }
876
877        /**
878         * Busca uma localidade pelo seu ID.
879         *
880         * Este método listará os atributos e uma localidade. Lembrando que localidade também pode ser entendida como o local físico de trabalho.
881         * @param int $localID O ID da localidade.
882         * @return array Uma array associativa contendo os atributos de uma localidade:
883         * - organizacao_id
884         * - localidade_id
885         * - centro_custo_id
886         * - descricao
887         * - empresa: o nome completo da localidade
888         * - endereço: o logradouro da empresa, com o número
889         * - complemento: dado adicional do endereço
890         * - cep: código de endereçamento postal, máscara nnnnnn-nnn
891         * - bairro: nome do bairro
892         * - cidade: nome da cidade
893         * - uf: unidade da federação
894         * @access public
895         */
896        function getLocal($localID)
897        {
898                $query = "SELECT organizacao_id, localidade_id, centro_custo_id, descricao,
899                                                        empresa, endereco, complemento, cep, bairro, cidade, uf" .
900                                 "  FROM localidade" .
901                                 " WHERE (localidade_id = ?)";
902
903                $result = $this->db->query($query, array($localID));
904                if (!$result)
905                        return false;
906
907                $output = $result->fetchRow();
908
909                return $output;
910        }
911
912        /**
913         * Busca uma localidade pelo seu nome.
914         *
915         *
916         * @param string $description O nome da localidade.
917         * @param int $organizationID O id da organização.
918         * @return array Uma array associativa contendo os atributos de uma localidade:
919         * - organizacao_id
920         * - localidade_id
921         * - centro_custo_id
922         * - descricao
923         * - empresa: o nome completo da localidade
924         * - endereço: o logradouro da empresa, com o número
925         * - complemento: dado adicional do endereço
926         * - cep: código de endereçamento postal, máscara nnnnnn-nnn
927         * - bairro: nome do bairro
928         * - cidade: nome da cidade
929         * - uf: unidade da federação
930         * @access public
931         */
932        function getLocalByName($description, $organizationID = 1)
933        {
934                $query = "SELECT organizacao_id, localidade_id, centro_custo_id, descricao,
935                                                        empresa, endereco, complemento, cep, bairro, cidade, uf" .
936                                 "  FROM localidade" .
937                                 " WHERE (UPPER(descricao) = UPPER(?) and (organizacao_id = ?))";
938
939                $result = $this->db->query($query, array($description, (int) $organizationID));
940                if (!$result)
941                        return false;
942
943                $output = $result->fetchRow();
944
945                return $output;
946        }
947
948        /**
949         * Busca um centro de custo pelo seu ID.
950         *
951         * Este método irá mostrar os atributos de um centro de custo, buscando na tabela pelo seu id.
952         * @param int $costCenterID O ID do centro de custo.
953         * @return array Uma array associativa contendo os atributos de um centro de custo:
954         * - organizacao_id
955         * - centro_custo_id
956         * - nm_centro_custo: número do centro de custo
957         * - grupo: estrutura numerica a qual o centro de custo pertence
958         * - descrição: nome do centro de custo
959         * @access public
960         */
961        function getCostCenter($costCenterID)
962        {
963                $query = "SELECT organizacao_id, centro_custo_id, nm_centro_custo, grupo, descricao" .
964                                 "  FROM centro_custo" .
965                                 " WHERE (centro_custo_id  = ?)";
966
967                $result = $this->db->query($query, array($costCenterID));
968                if (!$result)
969                        return false;
970
971                $output = $result->fetchRow();
972
973                return $output;
974        }
975
976        /**
977         * Busca um centro de custo pelo seu número.
978         *
979         * Este método retornará os atributos de um centro de custo buscando pelo seu ID.
980         * @param int $number O número do centro de custo.
981         * @param ind $organizationID O id da organização
982         * @return array Uma array associativa contendo os atributos de um centro de custo:
983         * - organizacao_id
984         * - centro_custo_id
985         * - nm_centro_custo: número do centro de custo
986         * - grupo: estrutura numerica a qual o centro de custo pertence
987         * - descrição: nome do centro de custo
988         * @access public
989         */
990        function getCostCenterByNumber($number, $organizationID = 1)
991        {
992                $query = "SELECT organizacao_id, centro_custo_id, nm_centro_custo, grupo, descricao" .
993                                 "  FROM centro_custo" .
994                                 " WHERE ((nm_centro_custo = ?) and (organizacao_id = ?))";
995
996                $result = $this->db->query($query, array($number, (int) $organizationID));
997                if (!$result)
998                        return false;
999
1000                $output = $result->fetchRow();
1001
1002                return $output;
1003        }
1004
1005        /**
1006         * Busca um centro de custo pelo seu nome.
1007         *
1008         * Este método irá retornar os atributos de um centro de custo buscando pelo seu nome.
1009         * @param string $description O nome do centro de custo.
1010         * @param int $organizationID O id da organização
1011         * @return array Uma array associativa contendo os atributos de um centro de custo.
1012         * - organizacao_id
1013         * - centro_custo_id
1014         * - nm_centro_custo: número do centro de custo
1015         * - grupo: estrutura numerica a qual o centro de custo pertence
1016         * - descrição: nome do centro de custo
1017         *       * @access public
1018         */
1019        function getCostCenterByName($description, $organizationID = 1)
1020        {
1021                $query = "SELECT organizacao_id, centro_custo_id, nm_centro_custo, grupo, descricao" .
1022                                 "  FROM centro_custo" .
1023                                 " WHERE (UPPER(descricao) = UPPER(?) and (organizacao_id = ?))";
1024
1025                $result = $this->db->query($query, array($description, (int) $organizationID));
1026                if (!$result)
1027                        return false;
1028
1029                $output = $result->fetchRow();
1030
1031                return $output;
1032        }
1033
1034        /**
1035         * Busca as informações de categoria a partir do ID.
1036         *
1037         * Este método irá retornar os atributos de uma linha da tabela de categorias de funcionários.
1038         * @param int $categoryID O ID da categoria.
1039         * @return array Uma array associativa contendo os atributos da categoria:
1040         * - funcionario_categoria_id
1041         * - descricao
1042         * - organizacao_id
1043         * @access public
1044         */
1045        function getEmployeeCategory($categoryID)
1046        {
1047                $query  = "SELECT funcionario_categoria_id, descricao, organizacao_id" .
1048                                  "  FROM funcionario_categoria" .
1049                                  " WHERE (funcionario_categoria_id = ?)";
1050
1051                $result = $this->db->query($query, array($categoryID));
1052                if (!$result)
1053                        return false;
1054
1055                $output = $result->fetchRow();
1056
1057                return $output;
1058        }
1059
1060        /**
1061         * Busca uma categoria a partir da sua descrição.
1062         *
1063         * Este método irá mostrar os atributos de uma categoria, buscando pela sua descrição.
1064         * @param string $description O nome da categoria.
1065         * @param int $organizationID O id da organização
1066         * @return array Uma array associativa contendo os atributos de uma categoria:
1067         * - funcionario_categoria_id
1068         * - descricao
1069         * - organizacao_id
1070         * @access public
1071         */
1072        function getEmployeeCategoryByName($description, $organizationID = 1)
1073        {
1074                $query = "SELECT funcionario_categoria_id, descricao, organizacao_id" .
1075                                 "  FROM funcionario_categoria" .
1076                                 " WHERE (UPPER(descricao) = UPPER(?) and (organizacao_id = ?))";
1077
1078                $result = $this->db->query($query, array($description, (int) $organizationID));
1079                if (!$result)
1080                        return false;
1081
1082                $output = $result->fetchRow();
1083
1084                return $output;
1085        }
1086
1087        /**
1088         * Lista todos os cargos de uma organização.
1089         *
1090         * Este método irá listar a tabela localidade.
1091         * @param int $organizationID O ID da organização.
1092         * @return array Uma array de arrays associativas contendo a lista dos cargos de uma organização:
1093         * - cargo_id
1094         * - descricao
1095         * - organizacao_id
1096         * @access public
1097         */
1098        function getJobTitles($organizationID)
1099        {
1100                $query = "SELECT cargo_id, descricao, organizacao_id" .
1101                                 "  FROM cargo" .
1102                                 "      WHERE organizacao_id = ?" .
1103                                 "  ORDER BY cargo_id";
1104
1105                $result = $this->db->query($query, array((int) $organizationID));
1106                if (!$result)
1107                        return false;
1108
1109                $output = $result->GetArray(-1);
1110
1111                return $output;
1112        }
1113
1114        /**
1115         * Busca as informações de cargo a partir do ID.
1116         *
1117         * Este método irá listar os atributos de um cargo, buscando na tabela a partir do seu ID.
1118         * @param int $jobTitleID O ID do cargo.
1119         * @return array Uma array associativa contendo os atributos do cargo.
1120         * - cargo_id
1121         * - descricao
1122         * - organizacao_id
1123         * @access public
1124         */
1125        function getJobTitle($jobTitleID)
1126        {
1127                $query  = "SELECT cargo_id, descricao, organizacao_id" .
1128                                  "  FROM cargo" .
1129                                  " WHERE (cargo_id = ?)";
1130
1131                $result = $this->db->query($query, array($jobTitleID));
1132                if (!$result)
1133                        return false;
1134
1135                $output = $result->fetchRow();
1136
1137                return $output;
1138        }
1139
1140        /**
1141         * Busca um cargo a partir da sua descrição.
1142         *
1143         * Este método irá mostrar os atributos de um cargo, buscando pela sua descrição.
1144         * @param string $description O nome do cargo.
1145         * @param int $organizationID O id da organização.
1146         * @return array Uma array associativa contendo os atributos de um cargo:
1147         * - cargo_id
1148         * - descricao
1149         * - organizacao_id
1150         * @access public
1151         */
1152        function getJobTitleByName($description, $organizationID = 1)
1153        {
1154                $query = "SELECT cargo_id, descricao, organizacao_id" .
1155                                 "  FROM cargo" .
1156                                 " WHERE (UPPER(descricao) = UPPER(?) and (organizacao_id = ?))";
1157
1158                $result = $this->db->query($query, array($description, (int) $organizationID));
1159                if (!$result)
1160                        return false;
1161
1162                $output = $result->fetchRow();
1163
1164                return $output;
1165        }
1166
1167        /**
1168         * Busca um funcionário pelo seu ID.
1169         *
1170         * Este método retorna os atributos de um funcionário buscando pelo se id.
1171         * O ID corresponde ao uidNumber do funcionário no catálogo LDAP.
1172         * Se necessitar de outros atributos como o nome, cpf, email, matrícula, é necessário fazer uma consulta ao Ldap.
1173         * @param int $employeeID O ID do funcionário.
1174         * @return array Uma array associativa contendo os atributos de um funcionário:
1175         * - funcionario_id
1176         * - area_id
1177         * - localidade_id
1178         * - centro_custo_id
1179         * - organizacao_id
1180         * - funcionario_status_id
1181         * - cargo_id
1182         * - nivel: o nível numérico dentro do cargo
1183         * - funcionario_categoria_id
1184         * - titulo: nome pelo qual o funcionário e reconhecido na organização, por exemplo: gerente comercial
1185         * @access public
1186         */
1187        function getEmployee($employeeID)
1188        {
1189                if (!is_numeric($employeeID))
1190                        return false;
1191
1192                $query  = "SELECT funcionario_id, area_id, localidade_id, centro_custo_id, organizacao_id,
1193                                                        funcionario_status_id, cargo_id, nivel, funcionario_categoria_id, titulo" .
1194                                  "  FROM funcionario" .
1195                                  " WHERE (funcionario_id = ?)";
1196
1197                $result = $this->db->query($query, array($employeeID));
1198                if (!$result)
1199                        return false;
1200
1201                $output = $result->fetchRow();
1202
1203                return $output;
1204        }
1205
1206        /**
1207         * Busca lista de funcionários pela sua localidade.
1208         *
1209         * Este método busca todos os funcionários de uma localidade, ou, caso a localidade não seja passada, retorna todos os funcionários.
1210         * @param int $localID O ID da localidade.
1211         * @param int $organizationID O ID da organização.
1212         * @param boolean $searchLdap True, caso seja necessário buscar no LDAP os dados dos usuários. Ou false, caso contrário.
1213         * @param string $external Null, caso deseje-se recuperar localidades externas e internas à organização. 'S', para recuperar apenas as externas e 'N', para apenas as internas.
1214         * @return array Uma array contendo os dados dos usários e sua localidade
1215         * @access public
1216         */
1217        function getEmployeesByLocalID($localID = 0, $organizationID = 1, $searchLdap = false, $external = null)
1218        {
1219                if(!is_numeric($localID) || !is_numeric($organizationID))
1220                        return false;
1221
1222                $query = "SELECT DISTINCT " .
1223                                 " l.organizacao_id, " .
1224                                 " l.localidade_id, " .
1225                                 " l.descricao AS localidade_descricao, " .
1226                                 " f.funcionario_id, " .
1227                                 " f.area_id, " .
1228                                 " a.sigla AS area_sigla " .
1229                                 "FROM funcionario f " .
1230                                 "INNER JOIN localidade l " .
1231                                 "ON (f.localidade_id = l.localidade_id) " .
1232                                 "INNER JOIN area a " .
1233                                 "ON (f.area_id = a.area_id) " .
1234                                 "INNER JOIN funcionario_status fs " .
1235                                 "ON (f.funcionario_status_id = fs.funcionario_status_id) " .
1236                                 "WHERE (l.organizacao_id = ?) AND (fs.exibir = 'S') ";
1237
1238                $param[] = $organizationID;
1239                if(!empty($localID)){
1240                        $query  .= " AND l.localidade_id = ? ";
1241                        $param[] = $localID;
1242                }
1243
1244                if(!empty($external) && ($external == 'S' || $external == 'N')){
1245                        $query  .= " AND l.externa = ? ";
1246                        $param[] = $external;
1247                }
1248
1249                $query .= "ORDER BY l.descricao, a.sigla ";
1250
1251                $result = $this->db->query($query, $param);
1252                if (!$result)
1253                        return false;
1254
1255                $output = $result->GetArray(-1);
1256
1257                if($searchLdap){
1258                        $output = $this->searchEmployeeDataInLdap($output);
1259                }
1260
1261                return $output;
1262        }
1263
1264        /**
1265         * Percorre o array passado por parâmetro, buscando os dados dos funcionários no Ldap. Adiciona estes dados no array e o retorna.
1266         *
1267         * @param array $output Array contendo os usuários que deverão ser consultados no Ldap
1268         * @return array Retorna o mesmo array passado por parâmetro, adicionados os dados dos usuários buscados no Ldap
1269         */
1270        function searchEmployeeDataInLdap($output)
1271        {
1272                if(is_array($output)){
1273                        foreach($output AS $k => $value){
1274                                if(is_numeric($value['funcionario_id'])){
1275                                        $user_data = $this->ldap->getEntryByID($value['funcionario_id']);
1276                                        $output[$k]['nome']     = $user_data['cn'];
1277                                        $output[$k]['email']    = $user_data['mail'];
1278                                        $output[$k]['telefone'] = $user_data['telephonenumber'];
1279                                }
1280                        }
1281                }
1282                return $output;
1283        }
1284
1285        /**
1286         * Busca lista de funcionários de uma área pelo ID da área.
1287         *
1288         * Este método retornará todos os funcionários de uma área.
1289         * @param int $areaID O ID da área.
1290         * @param boolean $onlyActiveUsers true para retornar somente usuários ativos e false caso contrário
1291         * @return array Uma array sequencial de arrays associativos contendo contendo o ID dos funcionários de uma área:
1292         * - funcionario_id
1293         * @access public
1294         */
1295        function getEmployeesAreaID($areaID, $onlyActiveUsers = false)
1296        {
1297                if($onlyActiveUsers){
1298                        $query = "SELECT funcionario_id " .
1299                                         "FROM funcionario " .
1300                                         "INNER JOIN funcionario_status " .
1301                                         "ON (funcionario.funcionario_status_id = funcionario_status.funcionario_status_id) " .
1302                                         "WHERE (area_id = ?) AND (funcionario_status.exibir = 'S')";
1303                } else {
1304                        $query = "SELECT funcionario_id " .
1305                                     "FROM funcionario " .
1306                                         "WHERE (area_id = ?)";
1307                }
1308
1309                $result = $this->db->query($query, array($areaID));
1310                if (!$result)
1311                        return false;
1312
1313                $output = $result->GetArray(-1);
1314
1315                return $output;
1316        }
1317
1318        /**
1319         * Busca um status de funcionário pelo seu ID.
1320         *
1321         * Este método irá retornar os dados de um status de funcionário, buscando pelo ID solicitado.
1322         * @param int $employeeStatusID O ID do status.
1323         * @return array Uma array associativa contendo os atributos de um status de funcionário:
1324         * - funcionario_status_id
1325         * - descricao
1326         * - exibir: indicativo booleado 'S' funcionário será listado no organograma, 'N' funcionário ficará oculto na aba organograma.
1327         * @access public
1328         */
1329        function getEmployeeStatus($employeeStatusID)
1330        {
1331                $query = "SELECT funcionario_status_id, descricao, exibir " .
1332                                 "  FROM funcionario_status" .
1333                                 " WHERE (funcionario_status_id = ?)";
1334
1335                $result = $this->db->query($query, array($employeeStatusID));
1336                if (!$result)
1337                        return false;
1338
1339                $output = $result->fetchRow();
1340
1341                return $output;
1342        }
1343
1344        /**
1345         * Busca o ID da área (podendo ser de outros níveis) de um funcionário.
1346         *
1347         * Este método irá retornar o ID da área do funcionário. Fará uma busca para cima na hierarquia se for solicitado.
1348         * @param int $employeeID O ID do funcionário do qual se quer saber a área.
1349         * @param int $areaStatusID O ID do status de área (nível) da área do funcionário que se quer. Utilizar -1 caso se queira a área imediata do funcionário.
1350         * - Por exemplo: o funcionário está em uma área de status 5 (Divisão) e se quer a área superior de nível 3 (Diretoria).
1351         * @return int O ID da área do funcionário.
1352         * @access public
1353         */
1354        function getEmployeeAreaID($employeeID, $areaStatusID = -1)
1355        {
1356                $employee = $this->getEmployee($employeeID);
1357                if (!$employee)
1358                        return false;
1359
1360                /* requer a área do funcionário */
1361                if ($areaStatusID == -1)
1362                        return $employee['area_id'];
1363                else
1364                {
1365                        /* verifica se a área do funcionário já está no nível solicitado */
1366                        $currentArea = $this->getArea($employee['area_id']);
1367                        if ($currentArea['area_status_id'] == $areaStatusID)
1368                                return $currentArea['area_id'];
1369                        else
1370                                return $this->getParentAreaID($currentArea['area_id'], $areaStatusID);
1371                }
1372        }
1373
1374        /**
1375         * Busca o ID da localidade de um funcionário.
1376         *
1377         * Este método buscará o funcionário pelo seu ID e retornará o ID da sua localidade.
1378         * @param int $employeeID O ID do funcionário.
1379         * @return int O ID da localidade do funcionário.
1380         * @access public
1381         */
1382        function getEmployeeLocalID($employeeID)
1383        {
1384                $employee = $this->getEmployee($employeeID);
1385                if (!$employee)
1386                        return false;
1387
1388                return $employee['localidade_id'];
1389        }
1390
1391        /**
1392         * Busca o ID do status de um funcionário.
1393         *
1394         * Este método buscará um funcionário pelo seu ID e retornará o ID de status do funcionário.
1395         * Status de funcionário corresponde à sua situação: ativo, desligado, etc.
1396         * @param int $employeeID O ID do funcionário.
1397         * @return int O ID do status do funcionário.
1398         * @access public
1399         */
1400        function getEmployeeStatusID($employeeID)
1401        {
1402                $employee = $this->getEmployee($employeeID);
1403                if (!$employee)
1404                        return false;
1405
1406                return $employee['funcionario_status_id'];
1407        }
1408
1409        /**
1410         * Busca o ID do centro de custo de um funcionário.
1411         *
1412         * Este método irá buscar um funcionário pelo seu ID e retornará o ID do centro de custo do funcionário.
1413         * O centro de custo não é obrigatório por funcionário. Neste caso, se necessário, busque o centro de custo da área ou da localidade.
1414         * @param int $employeeID O ID do funcionário.
1415         * @return int O ID do centro de custo do funcionário.
1416         * @access public
1417         */
1418        function getEmployeeCostCenterID($employeeID)
1419        {
1420                $employee = $this->getEmployee($employeeID);
1421                if (!$employee)
1422                        return false;
1423
1424                $costCenterID = $employee['centro_custo_id'];
1425                if(!empty($costCenterID)){
1426                        return $costCenterID;
1427                } else {
1428                        $employeeArea = $this->getArea($employee['area_id']);
1429                        return $employeeArea['centro_custo_id'];
1430                }
1431        }
1432
1433        /**
1434         * Busca o ID do cargo de um funcionário.
1435         *
1436         * Este método buscará um funcionário pelo seu ID e retornará o ID do cargo do funcionário.
1437         * @param int $employeeID O ID do funcionário.
1438         * @return int O ID do cargo do funcionário.
1439         * @access public
1440         */
1441        function getEmployeeJobTitleID($employeeID)
1442        {
1443                $employee = $this->getEmployee($employeeID);
1444                if (!$employee)
1445                        return false;
1446
1447                return $employee['cargo_id'];
1448        }
1449
1450        /**
1451         * Busca o ID da categoria de um funcionário.
1452         *
1453         * Este método buscará um funcionário pelo seu ID e retornará o ID da categoria do funcionário.
1454         * A categoria corresponde ao tipo de vínculo do funcionário com a organizacao. Por exemplo:
1455         * - funcionário
1456         * - estagiário
1457         * - terceirizado, etc
1458         * @param int $employeeID O ID do funcionário.
1459         * @return int O ID do categoria do funcionário.
1460         * @access public
1461         */
1462        function getEmployeeCategoryID($employeeID)
1463        {
1464                $employee = $this->getEmployee($employeeID);
1465                if (!$employee)
1466                        return false;
1467
1468                return $employee['funcionario_categoria_id'];
1469        }
1470
1471        /**
1472         * Busca o nível de um funcionário.
1473         *
1474         * Este método buscará o funcionário pelo seu ID e retornará o nível do funcionário dentro do cargo.
1475         * Geralmente um cargo (por exemplo: auxiliar tecnico) é composto por níveis de evolução na carreira: 1,2,3,...
1476         * @param int $employeeID O ID do funcionário.
1477         * @return int A quantidade de níveis do funcionário.
1478         * @access public
1479         */
1480        function getEmployeeLevel($employeeID)
1481        {
1482                $employee = $this->getEmployee($employeeID);
1483                if (!$employee)
1484                        return false;
1485
1486                if ($employee['nivel'] === null)
1487                        return false;
1488
1489                return $employee['nivel'];
1490        }
1491
1492        /**
1493         * Busca o ID do titular da área de um funcionário.
1494         *
1495         * Este método buscará o titular da área do funcionário, e poderá subir na hierarquia, buscando o titular de áreas superiores à área do funcionário.
1496         * @param int $employeeID O ID do funcionário.
1497         * @param int $areaStatusID O ID do status de área (nível) da área do funcionário que se quer o titular. Utilizar -1 caso se queira o titular da área imediata do funcionário.
1498         * @return int O ID do titular da área do funcionário:
1499         * - titular_funcionario_id
1500         * @access public
1501         */
1502        function getEmployeeSupervisorID($employeeID, $areaStatusID = -1)
1503        {
1504                return $this->getAreaSupervisorID($this->getEmployeeAreaID($employeeID, $areaStatusID));
1505        }
1506
1507        /**
1508         * Busca o ID do titular atual da área do funcionário.
1509         *
1510         * Caso haja um substituto, este será o titular atual; caso contrário, o titular atual é o próprio titular da área.
1511         * @param int $employeeID O ID do funcionário.
1512         * @param int $areaStatusID O ID do status de área (nível) da área do funcionário que se quer o titular atual. Utilizar -1 caso se queira o titular atual da área imediata do funcionário.
1513         * @return int O ID do titular atual da área do funcionário:
1514         * - titular_funcionário_id ou
1515         * - substituto_funcionario_id
1516         * @access public
1517         */
1518        function getEmployeeCurrentSupervisorID($employeeID, $areaStatusID = -1)
1519        {
1520                return $this->getAreaCurrentSupervisorID($this->getEmployeeAreaID($employeeID, $areaStatusID));
1521        }
1522
1523        /**
1524         * Busca o ID do responsável administrativo atual de uma área.
1525         *
1526         * A precedência para definir quem é o responsável administrativo é: auxiliar administrativo, substituto e titular.
1527         * @param int $employeeID O ID do funcionário.
1528         * @param int $areaStatusID O ID do status de área (nível) da área do funcionário que se quer o responsável administrativo. Utilizar -1 caso se queira o responsável administrativo da área imediata do funcionário.
1529         * @return int O ID do responsável administrativo atual da área do funcionário:
1530         * - titular_funcionário_id ou
1531         * - substituto_funcionario_id ou
1532         * - auxiliar_funcionario_id
1533         * @access public
1534         */
1535        function getEmployeeCurrentAdministrativeResponsibleID($employeeID, $areaStatusID = -1)
1536        {
1537                return $this->getAreaCurrentAdministrativeResponsibleID($this->getEmployeeAreaID($employeeID, $areaStatusID));
1538        }
1539}
1540?>
Note: See TracBrowser for help on using the repository browser.