source: trunk/workflow/inc/local/classes/class.wf_orgchart.php @ 7264

Revision 7264, 50.0 KB checked in by asaikawa, 12 years ago (diff)

Ticket #3119 - Alterado o parametro para buscar funcionarios ativos e adicionado uid na busca do ldap

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