function excluiDisciplinas()
 {
     $obj_servidor_disciplina = new clsPmieducarServidorDisciplina(NULL, $this->ref_cod_instituicao, $this->cod_servidor);
     $obj_servidor_disciplina->excluirTodos();
 }
 function Inicializar()
 {
     $retorno = 'Novo';
     @session_start();
     $this->pessoa_logada = $_SESSION['id_pessoa'];
     @session_write_close();
     $this->cod_servidor = $_GET['ref_cod_servidor'];
     $this->ref_cod_instituicao = $_GET['ref_cod_instituicao'];
     $obj_permissoes = new clsPermissoes();
     $obj_permissoes->permissao_cadastra(635, $this->pessoa_logada, 7, 'educar_servidor_lst.php');
     if (is_numeric($this->cod_servidor) && is_numeric($this->ref_cod_instituicao)) {
         $obj = new clsPmieducarServidor($this->cod_servidor, NULL, NULL, NULL, NULL, NULL, NULL, $this->ref_cod_instituicao);
         $registro = $obj->detalhe();
         if ($registro) {
             $retorno = 'Editar';
         }
     }
     @session_start();
     $this->cursos_disciplina = $_SESSION['cursos_disciplina'];
     @session_write_close();
     if (!$this->cursos_disciplina) {
         $obj_servidor_disciplina = new clsPmieducarServidorDisciplina();
         $lst_servidor_disciplina = $obj_servidor_disciplina->lista(NULL, $this->ref_cod_instituicao, $this->cod_servidor);
         if ($lst_servidor_disciplina) {
             foreach ($lst_servidor_disciplina as $disciplina) {
                 $componenteMapper = new ComponenteCurricular_Model_ComponenteDataMapper();
                 $componente = $componenteMapper->find($disciplina['ref_cod_disciplina']);
                 $this->cursos_disciplina[$disciplina['ref_cod_curso']][$disciplina['ref_cod_disciplina']] = $disciplina['ref_cod_disciplina'];
             }
         }
     }
     if ($this->cursos_disciplina) {
         foreach ($this->cursos_disciplina as $curso => $disciplinas) {
             if ($disciplinas) {
                 foreach ($disciplinas as $disciplina) {
                     $this->ref_cod_curso[] = $curso;
                     $this->ref_cod_disciplina[] = $disciplina;
                 }
             }
         }
     }
     return $retorno;
 }
 /**
  * Retorna um array com resultados de uma pesquisa parametrizada
  *
  * O array retornado contém em cada um de seus items um array associativo onde
  * as chaves correspondem aos campos da tabela indicados por
  * $this->_campos_lista.
  *
  * A pesquisa SELECT realizada é afetada por diversos parâmetros disponíveis.
  * Alguns dos parâmetros induzem a subqueries para a avaliação de diferentes
  * funcionalidades do sistema.
  *
  * @see intranet/educar_pesquisa_servidor_lst.php  Listagem de busca de
  *  servidores
  * @see intranet/educar_quadro_horario_horarios_cad.php  Cadastro de horário
  *  de aula para uma turma
  * @see intranet/educar_turma_cad.php  Cadastro de turma
  *
  * @param  int         $int_cod_servidor             Código do servidor
  * @param  int         $int_ref_cod_deficiencia      Código da deficiência do servidor
  * @param  int         $int_ref_idesco               Código da escolaridade do servidor
  * @param  int         $int_carga_horaria            Carga horária do servidor
  * @param  string      $date_data_cadastro_ini       Data de cadastro inicial (busca por intervalo >= ao valor)
  * @param  string      $date_data_cadastro_fim       Data de cadastro final (busca por intervalo <= ao valor)
  * @param  string      $date_data_exclusao_ini       Data da exclusão inicial (busca por intervalo >= ao valor)
  * @param  string      $date_data_exclusao_fim       Data da exclusão final (busca por intervalo <= ao valor)
  * @param  int         $int_ativo                    '1' para buscar apenas por servidores ativos
  * @param  int         $int_ref_cod_instituicao      Código da instituição do servidor
  * @param  string      $str_tipo                     'livre' para buscar apenas por servidores não alocados (subquery)
  * @param  array       $array_horario                Busca por horário de alocação do servidor (subquery)
  * @param  int         $str_not_in_servidor          Código de servidor a excluir
  * @param  string      $str_nome_servidor            Busca do tipo LIKE pelo padrão de nome do servidor (subquery)
  * @param  int|string  $boo_professor                Qualquer valor que avalie para TRUE para buscar por servidores professores (subquery)
  * @param  string      $str_horario                  'S' para buscar se o servidor está alocado em um dos horários (indicados $matutino, $vespertino ou $noturno) (subquery)
  * @param  bool        $bool_ordena_por_nome         TRUE para ordenar os resultados pelo campo nome por ordem alfabética crescente
  * @param  string      $lst_matriculas               Verifica se o servidor não está na lista de matriculas (string com inteiros separados por vírgula: 54, 55, 60).
  *                                                   Apenas verifica quando a buscar por horário de alocação é realizada
  * @param  bool        $matutino                     Busca por professores com horário livre no período matutino
  * @param  bool        $vespertino                   Busca por professores com horário livre no período vespertino
  * @param  bool        $noturno                      Busca por professores com horário livre no período noturno
  * @param  int         $int_ref_cod_escola           Código da escola para verificar se o servidor está alocado nela (usado em várias das subqueries)
  * @param  string      $str_hr_mat                   Duração da aula (formato HH:MM) para o período matutino
  * @param  string      $str_hr_ves                   Duração da aula (formato HH:MM) para o período vespertino
  * @param  string      $str_hr_not                   Duração da aula (formato HH:MM) para o período noturno
  * @param  int         $int_dia_semana               Inteiro para o dia da semana (1 = domingo, 7 = sábado)
  * @param  int         $alocacao_escola_instituicao  Código da instituição ao qual o servidor deve estar cadastrado (subquery)
  * @param  int         $int_identificador            Campo identificado para busca na tabela pmieducar.quadro_horario_horarios_aux (subquery)
  * @param  int         $int_ref_cod_curso            Código do curso que o professor deve estar cadastrado (subquery)
  * @param  int         $int_ref_cod_disciplina       Código da disciplina que o professor deve ser habilitado (subquery).
  *                                                   Somente verifica quando o curso passado por $int_ref_cod_curso não
  *                                                   possui sistema de falta globalizada
  * @param  int         $int_ref_cod_subnivel         Código de subnível que o servidor deve possuir
  * @return array|bool  Array com os resultados da query SELECT ou FALSE caso
  *                     nenhum registro tenha sido encontrado
  */
 function lista($int_cod_servidor = NULL, $int_ref_cod_deficiencia = NULL, $int_ref_idesco = NULL, $int_carga_horaria = NULL, $date_data_cadastro_ini = NULL, $date_data_cadastro_fim = NULL, $date_data_exclusao_ini = NULL, $date_data_exclusao_fim = NULL, $int_ativo = NULL, $int_ref_cod_instituicao = NULL, $str_tipo = NULL, $array_horario = NULL, $str_not_in_servidor = NULL, $str_nome_servidor = NULL, $boo_professor = FALSE, $str_horario = NULL, $bool_ordena_por_nome = FALSE, $lst_matriculas = NULL, $matutino = FALSE, $vespertino = FALSE, $noturno = FALSE, $int_ref_cod_escola = NULL, $str_hr_mat = NULL, $str_hr_ves = NULL, $str_hr_not = NULL, $int_dia_semana = NULL, $alocacao_escola_instituicao = NULL, $int_identificador = NULL, $int_ref_cod_curso = NULL, $int_ref_cod_disciplina = NULL, $int_ref_cod_subnivel = NULL)
 {
     // Extrai as informações de hora inicial e hora final, para definir melhor
     // o lookup de carga horária de servidores alocados, para operações como
     // a alocação de docente em quadro de horário. Isso é necessário para que
     // não seja necessário alocar o docente em dois períodos diferentes apenas
     // porque o horário final de uma aula extrapola o limite de horário do
     // período.
     if (is_array($array_horario) && 3 >= count($array_horario)) {
         $horarioInicial = explode(':', $array_horario[1]);
         $horarioFinal = explode(':', $array_horario[2]);
         $horarioInicial = $horarioInicial[0] * 60 + $horarioInicial[1];
         $horarioFinal = $horarioFinal[0] * 60 + $horarioFinal[1];
         // Caso o horário definido inicie no período "matutino" e se encerre no
         // período "vespertino", irá considerar como "matutino" apenas.
         $matutinoLimite = 12 * 60;
         if ($horarioInicial < $matutinoLimite && $horarioFinal > $matutinoLimite) {
             $vespertino = false;
         }
         // Caso o horário definido inicie no período "vespertino" e se encerre
         // no período "noturno", irá considerar como "vespertino" apenas.
         $vespertinoLimite = 18 * 60;
         if ($horarioInicial < $vespertinoLimite && $horarioFinal > $vespertinoLimite) {
             $noturno = false;
         }
     }
     $whereAnd = ' WHERE ';
     $filtros = '';
     $tabela_compl = '';
     if (is_bool($bool_ordena_por_nome)) {
         $tabela_compl .= ', cadastro.pessoa p';
         $this->_campos_lista2 .= ', p.nome';
         $filtros .= $whereAnd . ' s.cod_servidor = p.idpes ';
         $whereAnd = ' AND ';
         $this->setOrderby('nome');
     } else {
         $this->_campos_lista2 = $this->_todos_campos2;
         $this->setOrderby(' 1 ');
     }
     $sql = "SELECT {$this->_campos_lista2} FROM {$this->_schema}servidor s{$tabela_compl}";
     if (is_numeric($int_cod_servidor)) {
         $filtros .= "{$whereAnd} s.cod_servidor = '{$int_cod_servidor}'";
         $whereAnd = " AND ";
     }
     if (is_numeric($int_ref_cod_deficiencia)) {
         $filtros .= "{$whereAnd} s.ref_cod_deficiencia = '{$int_ref_cod_deficiencia}'";
         $whereAnd = " AND ";
     }
     if (is_numeric($int_ref_idesco)) {
         $filtros .= "{$whereAnd} s.ref_idesco = '{$int_ref_idesco}'";
         $whereAnd = " AND ";
     }
     if (is_numeric($int_carga_horaria)) {
         $filtros .= "{$whereAnd} s.carga_horaria = '{$int_carga_horaria}'";
         $whereAnd = " AND ";
     }
     if (is_string($date_data_cadastro_ini)) {
         $filtros .= "{$whereAnd} s.data_cadastro >= '{$date_data_cadastro_ini}'";
         $whereAnd = " AND ";
     }
     if (is_string($date_data_cadastro_fim)) {
         $filtros .= "{$whereAnd} s.data_cadastro <= '{$date_data_cadastro_fim}'";
         $whereAnd = " AND ";
     }
     if (is_string($date_data_exclusao_ini)) {
         $filtros .= "{$whereAnd} s.data_exclusao >= '{$date_data_exclusao_ini}'";
         $whereAnd = " AND ";
     }
     if (is_string($date_data_exclusao_fim)) {
         $filtros .= "{$whereAnd} s.data_exclusao <= '{$date_data_exclusao_fim}'";
         $whereAnd = " AND ";
     }
     if (is_null($int_ativo) || $int_ativo) {
         $filtros .= "{$whereAnd} s.ativo = '1'";
         $whereAnd = " AND ";
     } else {
         $filtros .= "{$whereAnd} s.ativo = '0'";
         $whereAnd = " AND ";
     }
     if (is_numeric($int_ref_cod_instituicao)) {
         $filtros .= "{$whereAnd} s.ref_cod_instituicao = '{$int_ref_cod_instituicao}'";
         $whereAnd = " AND ";
     }
     // Busca tipo LIKE pelo nome do servidor
     if (is_string($str_nome_servidor)) {
         $filtros .= "{$whereAnd} EXISTS (SELECT 1\n  FROM cadastro.pessoa p\n  WHERE cod_servidor = p.idpes\n  AND to_ascii(p.nome) LIKE to_ascii('%{$str_nome_servidor}%')) ";
         $whereAnd = " AND ";
     }
     // Seleciona apenas servidores que tenham a carga atual maior ou igual ao
     // do servidor atual
     if (is_string($str_tipo) && $str_tipo == 'livre') {
         if (is_numeric($int_ref_cod_instituicao)) {
             $where = " AND s.ref_cod_instituicao      = '{$int_ref_cod_instituicao}' ";
             $where2 = " AND sa.ref_ref_cod_instituicao = '{$int_ref_cod_instituicao}' ";
         }
         $filtros .= "\n  {$whereAnd} NOT EXISTS\n    (SELECT 1\n    FROM pmieducar.servidor_alocacao sa\n    WHERE sa.ref_cod_servidor = s.cod_servidor {$where2})";
         $filtros .= "\n  {$whereAnd} (s.carga_horaria::text || ':00:00') >= COALESCE(\n    (SELECT SUM(carga_horaria::time)::text\n    FROM pmieducar.servidor_alocacao saa\n    WHERE saa.ref_cod_servidor = {$str_not_in_servidor}),'00:00') {$where}";
         $whereAnd = " AND ";
     } else {
         if (is_numeric($alocacao_escola_instituicao) && (is_numeric($int_ref_cod_instituicao) || is_numeric($int_ref_cod_escola))) {
             $filtros .= "\n    {$whereAnd} s.cod_servidor IN\n      (SELECT a.ref_cod_servidor\n        FROM pmieducar.servidor_alocacao a\n        WHERE ";
             if (is_numeric($int_ref_cod_instituicao)) {
                 $filtros .= " a.ref_ref_cod_instituicao = '{$int_ref_cod_instituicao}'";
             }
             if (is_numeric($int_ref_cod_escola)) {
                 if (is_numeric($int_ref_cod_instituicao)) {
                     $filtros .= " " . $whereAnd;
                 }
                 $filtros .= " ref_cod_escola = '{$int_ref_cod_escola}' ";
             }
             $filtros .= ') ';
         }
         if (is_array($array_horario)) {
             $cond = "AND";
             if (is_numeric($int_ref_cod_instituicao)) {
                 $where .= " {$cond} a.ref_ref_cod_instituicao = '{$int_ref_cod_instituicao}' ";
                 $cond = "AND";
             }
             if (is_numeric($int_ref_cod_escola)) {
                 $where .= " {$cond} a.ref_cod_escola = '{$int_ref_cod_escola}' ";
                 $cond = "AND";
             }
             $where .= " {$cond} a.ativo = '1'";
             $cond = "AND";
             $hora_ini = explode(":", $array_horario[1]);
             $hora_fim = explode(":", $array_horario[2]);
             $horas = sprintf("%02d", (int) abs($hora_fim[0]) - abs($hora_ini[0]));
             $minutos = sprintf("%02d", (int) abs($hora_fim[1]) - abs($hora_ini[1]));
             // Remove qualquer AND que esteja no início da cláusula SQL
             $wherePieces = explode(' ', trim($where));
             if ('AND' == $wherePieces[0]) {
                 array_shift($wherePieces);
                 $where = implode(' ', $wherePieces);
             }
             if ($matutino) {
                 if (is_string($str_horario) && $str_horario == "S") {
                     // A somatória retorna nulo
                     $filtros .= "\n    {$whereAnd} s.cod_servidor IN (SELECT a.ref_cod_servidor\n      FROM pmieducar.servidor_alocacao a\n      WHERE {$where}\n      AND a.periodo = 1\n      AND a.carga_horaria >= COALESCE(\n      (SELECT SUM(qhh.hora_final - qhh.hora_inicial)\n        FROM pmieducar.quadro_horario_horarios qhh\n        WHERE qhh.ref_cod_instituicao_servidor = '{$int_ref_cod_instituicao}'\n        AND qhh.ref_cod_escola = '{$int_ref_cod_escola}'\n        AND hora_inicial >= '06:00'\n        AND hora_inicial <= '12:00'\n        AND qhh.ativo = '1'\n        AND qhh.dia_semana <> '{$int_dia_semana}'\n        AND qhh.ref_servidor = a.ref_cod_servidor\n        GROUP BY qhh.ref_servidor) ,'00:00')  + '{$str_hr_mat}' + COALESCE(\n        (SELECT SUM( qhha.hora_final - qhha.hora_inicial )\n          FROM pmieducar.quadro_horario_horarios_aux qhha\n          WHERE qhha.ref_cod_instituicao_servidor = '{$int_ref_cod_instituicao}'\n          AND qhha.ref_cod_escola = {$int_ref_cod_escola}\n          AND hora_inicial >= '06:00'\n          AND hora_inicial <= '12:00'\n          AND qhha.ref_servidor = a.ref_cod_servidor\n          AND identificador = '{$int_identificador}'\n          GROUP BY qhha.ref_servidor),'00:00'))";
                 } else {
                     $filtros .= "\n      {$whereAnd} s.cod_servidor NOT IN (SELECT a.ref_cod_servidor\n        FROM pmieducar.servidor_alocacao a\n        WHERE {$where}\n        AND a.periodo = 1)";
                 }
             }
             if ($vespertino) {
                 if (is_string($str_horario) && $str_horario == "S") {
                     $filtros .= "\n      {$whereAnd} s.cod_servidor IN\n        (SELECT a.ref_cod_servidor\n          FROM pmieducar.servidor_alocacao a\n          WHERE {$where}\n          AND a.periodo = 2\n          AND a.carga_horaria >= COALESCE(\n            (SELECT SUM( qhh.hora_final - qhh.hora_inicial )\n            FROM pmieducar.quadro_horario_horarios qhh\n            WHERE qhh.ref_cod_instituicao_servidor = '{$int_ref_cod_instituicao}'\n            AND qhh.ref_cod_escola = '{$int_ref_cod_escola}'\n            AND qhh.ativo = '1'\n            AND hora_inicial >= '12:00'\n            AND hora_inicial <= '18:00'\n            AND qhh.dia_semana <> '{$int_dia_semana}'\n            AND qhh.ref_servidor = a.ref_cod_servidor\n            GROUP BY qhh.ref_servidor ),'00:00') + '{$str_hr_ves}' +  COALESCE(\n            (SELECT SUM( qhha.hora_final - qhha.hora_inicial )\n              FROM pmieducar.quadro_horario_horarios_aux qhha\n              WHERE qhha.ref_cod_instituicao_servidor = '{$int_ref_cod_instituicao}'\n              AND qhha.ref_cod_escola = '{$int_ref_cod_escola}'\n              AND qhha.ref_servidor = a.ref_cod_servidor\n              AND hora_inicial >= '12:00'\n              AND hora_inicial <= '18:00'\n              AND identificador = '{$int_identificador}'\n              GROUP BY qhha.ref_servidor),'00:00') )";
                 } else {
                     $filtros .= "\n      {$whereAnd} s.cod_servidor NOT IN ( SELECT a.ref_cod_servidor\n        FROM pmieducar.servidor_alocacao a\n        WHERE {$where}\n        AND a.periodo = 2 )";
                 }
             }
             if ($noturno) {
                 if (is_string($str_horario) && $str_horario == "S") {
                     $filtros .= "\n      {$whereAnd} s.cod_servidor IN ( SELECT a.ref_cod_servidor\n        FROM pmieducar.servidor_alocacao a\n        WHERE {$where}\n        AND a.periodo = 3\n        AND a.carga_horaria >= COALESCE(\n        (SELECT SUM(qhh.hora_final - qhh.hora_inicial)\n          FROM pmieducar.quadro_horario_horarios qhh\n          WHERE qhh.ref_cod_instituicao_servidor = '{$int_ref_cod_instituicao}'\n          AND qhh.ref_cod_escola = '{$int_ref_cod_escola}'\n          AND qhh.ativo = '1'\n          AND hora_inicial >= '18:00'\n          AND hora_inicial <= '23:59'\n          AND qhh.dia_semana <> '{$int_dia_semana}'\n          AND qhh.ref_servidor = a.ref_cod_servidor\n          GROUP BY qhh.ref_servidor ),'00:00')  + '{$str_hr_not}' +  COALESCE(\n            (SELECT SUM( qhha.hora_final - qhha.hora_inicial )\n            FROM pmieducar.quadro_horario_horarios_aux qhha\n            WHERE qhha.ref_cod_instituicao_servidor = '{$int_ref_cod_instituicao}'\n            AND qhha.ref_cod_escola = '{$int_ref_cod_escola}'\n            AND qhha.ref_servidor = a.ref_cod_servidor\n            AND hora_inicial >= '18:00'\n            AND hora_inicial <= '23:59'\n            AND identificador = '{$int_identificador}'\n            GROUP BY qhha.ref_servidor),'00:00') )";
                 } else {
                     $filtros .= "\n      {$whereAnd} s.cod_servidor NOT IN (\n      SELECT a.ref_cod_servidor\n        FROM pmieducar.servidor_alocacao a\n        WHERE {$where}\n        AND a.periodo = 3 )";
                 }
             }
             if (is_string($str_horario) && $str_horario == "S") {
             } else {
                 $filtros .= "\n      {$whereAnd} s.carga_horaria >= COALESCE(\n        (SELECT sum(hora_final - hora_inicial) + '" . abs($horas) . ":" . abs($minutos) . "'\n          FROM pmieducar.servidor_alocacao sa\n          WHERE sa.ref_cod_servidor = s.cod_servidor\n          AND sa.ref_ref_cod_instituicao ='{$int_ref_cod_instituicao}'),'00:00') ";
             }
         }
     }
     if (is_array($array_horario) && $str_not_in_servidor || is_string($str_tipo) && $str_not_in_servidor) {
         $filtros .= "{$whereAnd} s.cod_servidor NOT IN ( {$str_not_in_servidor} )";
         $whereAnd = " AND ";
     }
     $obj_curso = new clsPmieducarCurso($int_ref_cod_curso);
     $det_curso = $obj_curso->detalhe();
     // Seleciona apenas servidor cuja uma de suas funções seja a de professor
     // @todo Extract method
     if ($boo_professor) {
         /*
          * Caso os códigos de disciplina e de curso não sejam informado, mas o de
          * servidor para não buscar sim, seleciona as disciplinas deste servidor
          * com o qual o professor candidato terá que lecionar para ser retornado
          * na query.
          */
         if (!$int_ref_cod_disciplina && !$int_ref_cod_curso) {
             $servidorDisciplina = new clsPmieducarServidorDisciplina();
             $disciplinas = $servidorDisciplina->lista(NULL, NULL, $str_not_in_servidor);
             $servidorDisciplinas = array();
             if (is_array($disciplinas)) {
                 foreach ($disciplinas as $disciplina) {
                     $servidorDisciplinas[] = sprintf('(sd.ref_cod_disciplina = %d AND sd.ref_cod_curso = %d)', $disciplina['ref_cod_disciplina'], $disciplina['ref_cod_curso']);
                 }
                 $servidorDisciplinas = sprintf('AND (%s)', implode(' AND ', $servidorDisciplinas));
             } else {
                 $servidorDisciplinas = '';
             }
         } else {
             $servidorDisciplinas = sprintf('AND sd.ref_cod_disciplina = %d AND sd.ref_cod_curso = %d', $int_ref_cod_disciplina, $int_ref_cod_curso);
         }
         $filtros .= "\n    {$whereAnd} EXISTS\n      (SELECT\n         1\n       FROM\n         pmieducar.servidor_funcao sf, pmieducar.funcao f, pmieducar.servidor_disciplina sd\n       WHERE\n        f.cod_funcao = sf.ref_cod_funcao AND\n        f.professor = 1 AND\n        sf.ref_ref_cod_instituicao = s.ref_cod_instituicao AND\n        s.cod_servidor = sf.ref_cod_servidor AND\n        s.cod_servidor = sd.ref_cod_servidor AND\n        s.ref_cod_instituicao = sd.ref_ref_cod_instituicao\n        {$servidorDisciplinas})";
         $whereAnd = " AND ";
     }
     if (is_string($str_horario) && $str_horario == "S") {
         $filtros .= "\n    {$whereAnd} s.cod_servidor NOT IN\n      (SELECT DISTINCT qhh.ref_servidor\n        FROM pmieducar.quadro_horario_horarios qhh\n        WHERE qhh.ref_servidor = s.cod_servidor\n        AND qhh.ref_cod_instituicao_servidor = s.ref_cod_instituicao\n        AND qhh.dia_semana = '{$array_horario[0]}'\n        AND qhh.hora_inicial >= '{$array_horario[1]}'\n        AND qhh.hora_final <= '{$array_horario[2]}'\n        AND qhh.ativo = '1'";
         if (is_string($lst_matriculas)) {
             $filtros .= "AND qhh.ref_servidor NOT IN ({$lst_matriculas})";
         }
         $filtros .= " )";
         $whereAnd = " AND ";
     }
     if (is_numeric($int_ref_cod_subnivel)) {
         $filtros .= "{$whereAnd} s.ref_cod_subnivel = '{$int_ref_cod_subnivel}'";
         $whereAnd = " AND ";
     }
     $countCampos = count(explode(',', $this->_campos_lista));
     $resultado = array();
     $db = new clsBanco();
     $sql = "SELECT {$this->_campos_lista2} FROM {$this->_schema}servidor s{$tabela_compl} {$filtros}" . $this->getOrderby() . $this->getLimite();
     $this->_total = $db->CampoUnico("SELECT COUNT(0) FROM {$this->_schema}servidor s{$tabela_compl} {$filtros}");
     // Executa a query
     $db->Consulta($sql);
     if ($countCampos > 1) {
         while ($db->ProximoRegistro()) {
             $tupla = $db->Tupla();
             $tupla['_total'] = $this->_total;
             $resultado[] = $tupla;
         }
     } else {
         while ($db->ProximoRegistro()) {
             $tupla = $db->Tupla();
             $resultado[] = $tupla[$this->_campos_lista];
         }
     }
     if (count($resultado)) {
         return $resultado;
     }
     return FALSE;
 }
 /**
  * Implementação do método Gerar()
  */
 function Gerar()
 {
     session_start();
     $this->pessoa_logada = $_SESSION['id_pessoa'];
     session_write_close();
     $this->titulo = 'Servidor - Detalhe';
     $this->addBanner('imagens/nvp_top_intranet.jpg', 'imagens/nvp_vert_intranet.jpg', 'Intranet');
     $this->cod_servidor = $_GET['cod_servidor'];
     $this->ref_cod_instituicao = $_GET['ref_cod_instituicao'];
     $tmp_obj = new clsPmieducarServidor($this->cod_servidor, NULL, NULL, NULL, NULL, NULL, NULL, $this->ref_cod_instituicao);
     $registro = $tmp_obj->detalhe();
     if (!$registro) {
         header('Location: educar_servidor_lst.php');
         die;
     }
     // Deficiência
     $obj_ref_cod_deficiencia = new clsCadastroDeficiencia($registro['ref_cod_deficiencia']);
     $det_ref_cod_deficiencia = $obj_ref_cod_deficiencia->detalhe();
     $registro['ref_cod_deficiencia'] = $det_ref_cod_deficiencia['nm_deficiencia'];
     // Escolaridade
     $obj_ref_idesco = new clsCadastroEscolaridade($registro['ref_idesco']);
     $det_ref_idesco = $obj_ref_idesco->detalhe();
     $registro['ref_idesco'] = $det_ref_idesco['descricao'];
     // Função
     $obj_ref_cod_funcao = new clsPmieducarFuncao($registro['ref_cod_funcao'], NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $this->ref_cod_instituicao);
     $det_ref_cod_funcao = $obj_ref_cod_funcao->detalhe();
     $registro['ref_cod_funcao'] = $det_ref_cod_funcao['nm_funcao'];
     // Nome
     $obj_cod_servidor = new clsFuncionario($registro['cod_servidor']);
     $det_cod_servidor = $obj_cod_servidor->detalhe();
     $registro['matricula'] = $det_cod_servidor['matricula'];
     $det_cod_servidor = $det_cod_servidor['idpes']->detalhe();
     $registro['nome'] = $det_cod_servidor['nome'];
     // Instituição
     $obj_ref_cod_instituicao = new clsPmieducarInstituicao($registro['ref_cod_instituicao']);
     $det_ref_cod_instituicao = $obj_ref_cod_instituicao->detalhe();
     $registro['ref_cod_instituicao'] = $det_ref_cod_instituicao['nm_instituicao'];
     // Alocação do servidor
     $obj = new clsPmieducarServidorAlocacao();
     $obj->setOrderby('periodo, carga_horaria');
     $lista = $obj->lista(NULL, $this->ref_cod_instituicao, NULL, NULL, NULL, $this->cod_servidor, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1);
     if ($lista) {
         // Passa todos os valores do registro para atributos do objeto
         foreach ($lista as $campo => $val) {
             $temp = array();
             $temp['carga_horaria'] = $val['carga_horaria'];
             $temp['periodo'] = $val['periodo'];
             $obj_escola = new clsPmieducarEscola($val['ref_cod_escola']);
             $det_escola = $obj_escola->detalhe();
             $det_escola = $det_escola['nome'];
             $temp['ref_cod_escola'] = $det_escola;
             $this->alocacao_array[] = $temp;
         }
     }
     if ($registro['cod_servidor']) {
         $this->addDetalhe(array('Servidor', $registro['cod_servidor']));
     }
     if ($registro['matricula']) {
         $this->addDetalhe(array('Matrícula', $registro['matricula']));
     }
     if ($registro['nome']) {
         $this->addDetalhe(array('Nome', $registro['nome']));
     }
     if ($registro['ref_cod_instituicao']) {
         $this->addDetalhe(array("Instituição", $registro['ref_cod_instituicao']));
     }
     if ($registro['ref_cod_deficiencia']) {
         $this->addDetalhe(array('Deficiência', $registro['ref_cod_deficiencia']));
     }
     if ($registro['ref_idesco']) {
         $this->addDetalhe(array('Escolaridade', $registro['ref_idesco']));
     }
     if ($registro['ref_cod_subnivel']) {
         $obj_nivel = new clsPmieducarSubnivel($registro['ref_cod_subnivel']);
         $det_nivel = $obj_nivel->detalhe();
         $this->addDetalhe(array('Nível', $det_nivel['nm_subnivel']));
     }
     if ($registro['ref_cod_funcao']) {
         $this->addDetalhe(array('Função', $registro['ref_cod_funcao']));
     }
     $obj_funcao = new clsPmieducarServidorFuncao();
     $lst_funcao = $obj_funcao->lista($this->ref_cod_instituicao, $this->cod_servidor);
     // Inep.
     $docente = false;
     if ($lst_funcao) {
         $tabela .= "\n        <table cellspacing='0' cellpadding='0' border='0'>\n          <tr bgcolor='#A1B3BD' align='center'>\n            <td width='150'>Função</td>\n          </tr>";
         $class = 'formlttd';
         $tab_disc = NULL;
         $obj_disciplina_servidor = new clsPmieducarServidorDisciplina();
         $lst_disciplina_servidor = $obj_disciplina_servidor->lista(NULL, $this->ref_cod_instituicao, $this->cod_servidor);
         if ($lst_disciplina_servidor) {
             $tab_disc .= "<table cellspacing='0' cellpadding='0' width='200' border='0' style='border:1px dotted #000000'>";
             $class2 = $class2 == "formlttd" ? "formmdtd" : "formlttd";
             $tab_disc .= "\n          <tr>\n            <td bgcolor='#A1B3BD' align='center'>Componentes Curriculares</td>\n          </tr>";
             $componenteMapper = new ComponenteCurricular_Model_ComponenteDataMapper();
             foreach ($lst_disciplina_servidor as $disciplina) {
                 $componente = $componenteMapper->find($disciplina['ref_cod_disciplina']);
                 $tab_disc .= "\n            <tr class='{$class2}' align='center'>\n              <td align='left'>{$componente->nome}</td>\n            </tr>";
                 $class2 = $class2 == "formlttd" ? "formmdtd" : "formlttd";
             }
             $tab_disc .= "</table>";
         }
         $obj_servidor_curso = new clsPmieducarServidorCursoMinistra();
         $lst_servidor_curso = $obj_servidor_curso->lista(NULL, $this->ref_cod_instituicao, $this->cod_servidor);
         if ($lst_servidor_curso) {
             $tab_curso .= "<table cellspacing='0' cellpadding='0' width='200' border='0' style='border:1px dotted #000000'>";
             $class2 = $class2 == "formlttd" ? "formmdtd" : "formlttd";
             $tab_curso .= "\n          <tr>\n            <td bgcolor='#A1B3BD' align='center'>Cursos Ministrados</td>\n          </tr>";
             foreach ($lst_servidor_curso as $curso) {
                 $obj_curso = new clsPmieducarCurso($curso['ref_cod_curso']);
                 $det_curso = $obj_curso->detalhe();
                 $tab_curso .= "\n            <tr class='{$class2}' align='center'>\n              <td align='left'>{$det_curso['nm_curso']}</td>\n            </tr>";
                 $class2 = $class2 == "formlttd" ? "formmdtd" : "formlttd";
             }
             $tab_curso .= "</table>";
         }
         foreach ($lst_funcao as $funcao) {
             $obj_funcao = new clsPmieducarFuncao($funcao['ref_cod_funcao']);
             $det_funcao = $obj_funcao->detalhe();
             $tabela .= "\n          <tr class='{$class}' align='left'>\n            <td><b>{$det_funcao['nm_funcao']}</b></td>\n          </tr>";
             $docente = (bool) $det_funcao['professor'];
             $class = $class == "formlttd" ? "formmdtd" : "formlttd";
         }
         if ($tab_curso) {
             $tabela .= "\n          <tr class='{$class}' align='center'>\n            <td style='padding:5px'>{$tab_curso}</td>\n          </tr>";
         }
         if ($tab_disc) {
             $tabela .= "\n          <tr class='{$class}' align='center'>\n            <td style='padding:5px'>{$tab_disc}</td>\n          </tr>";
         }
         $tabela .= "</table>";
         $this->addDetalhe(array('Função', "<a href='javascript:trocaDisplay(\"det_f\");' >Mostrar detalhe</a><div id='det_f' name='det_f' style='display:none;'>" . $tabela . "</div>"));
     }
     $tabela = NULL;
     /**
      * @todo  Criar função de transformação de hora decimal. Ver educar_servidor_cad.php em 276
      */
     if ($registro['carga_horaria']) {
         $cargaHoraria = $registro['carga_horaria'];
         $horas = (int) $cargaHoraria;
         $minutos = round(($cargaHoraria - $horas) * 60);
         $cargaHoraria = sprintf('%02d:%02d', $horas, $minutos);
         $this->addDetalhe(array('Carga Horária', $cargaHoraria));
     }
     $dias_da_semana = array('' => 'Selecione', 1 => 'Domingo', 2 => 'Segunda', 3 => 'Terça', 4 => 'Quarta', 5 => 'Quinta', 6 => 'Sexta', 7 => 'Sábado');
     if ($this->alocacao_array) {
         $tabela .= "\n        <table cellspacing='0' cellpadding='0' border='0'>\n          <tr bgcolor='#A1B3BD' align='center'>\n            <td width='150'>Carga Horária</td>\n            <td width='80'>Período</td>\n            <td width='150'>Escola</td>\n          </tr>";
         $class = "formlttd";
         foreach ($this->alocacao_array as $alocacao) {
             switch ($alocacao['periodo']) {
                 case 1:
                     $nm_periodo = "Matutino";
                     break;
                 case 2:
                     $nm_periodo = "Vespertino";
                     break;
                 case 3:
                     $nm_periodo = "Noturno";
                     break;
             }
             $tabela .= "\n          <tr class='{$class}' align='center'>\n            <td>{$alocacao['carga_horaria']}</td>\n            <td>{$nm_periodo}</td>\n            <td>{$alocacao['ref_cod_escola']}</td>\n          </tr>";
             $class = $class == 'formlttd' ? 'formmdtd' : 'formlttd';
         }
         $tabela .= "</table>";
         $this->addDetalhe(array('Horários de trabalho', "<a href='javascript:trocaDisplay(\"det_pree\");' >Mostrar detalhe</a><div id='det_pree' name='det_pree' style='display:none;'>" . $tabela . "</div>"));
     }
     // Horários do professor
     $horarios = $tmp_obj->getHorariosServidor($registro['cod_servidor'], $this->ref_cod_instituicao);
     if ($horarios) {
         $tabela = "\n        <table cellspacing='0' cellpadding='0' border='0'>\n          <tr bgcolor='#A1B3BD' align='center'>\n            <td width='150'>Escola</td>\n            <td width='100'>Curso</td>\n            <td width='70'>Série</td>\n            <td width='70'>Turma</td>\n            <td width='100'>Componente curricular</td>\n            <td width='70'>Dia da semana</td>\n            <td width='70'>Hora inicial</td>\n            <td width='70'>Hora final</td>\n          </tr>";
         foreach ($horarios as $horario) {
             $class = $class == 'formlttd' ? 'formmdtd' : 'formlttd';
             $tabela .= sprintf('
       <tr class="%s" align="center">
         <td>%s</td>
         <td>%s</td>
         <td>%s</td>
         <td>%s</td>
         <td>%s</td>
         <td>%s</td>
         <td>%s</td>
         <td>%s</td>
       </tr>', $class, $horario['nm_escola'], $horario['nm_curso'], $horario['nm_serie'], $horario['nm_turma'], $horario['nome'], $dias_da_semana[$horario['dia_semana']], $horario['hora_inicial'], $horario['hora_final']);
         }
         $tabela .= "</table>";
         $this->addDetalhe(array('Horários de aula', "<a href='javascript:trocaDisplay(\"horarios\");' >Mostrar detalhes</a>" . "<div id='horarios' name='det_pree' style='display:none;'>" . $tabela . "</div>"));
     }
     // Dados do docente no Educacenso/Inep.
     if ($docente) {
         $docenteMapper = new Educacenso_Model_DocenteDataMapper();
         $docenteInep = NULL;
         try {
             $docenteInep = $docenteMapper->find(array('docente' => $registro['cod_servidor']));
         } catch (Exception $e) {
         }
         if (isset($docenteInep)) {
             $this->addDetalhe(array('Código do docente no Educacenso/Inep', $docenteInep->docenteInep));
             if (isset($docenteInep->nomeInep)) {
                 $this->addDetalhe(array('Nome do docente no Educacenso/Inep', $docenteInep->nomeInep));
             }
         }
     }
     $obj_permissoes = new clsPermissoes();
     if ($obj_permissoes->permissao_cadastra(635, $this->pessoa_logada, 7)) {
         $this->url_novo = 'educar_servidor_cad.php';
         $this->url_editar = "educar_servidor_cad.php?cod_servidor={$registro["cod_servidor"]}&ref_cod_instituicao={$this->ref_cod_instituicao}";
         $get_padrao = "ref_cod_servidor={$registro["cod_servidor"]}&ref_cod_instituicao={$this->ref_cod_instituicao}";
         $this->array_botao = array();
         $this->array_botao_url_script = array();
         $this->array_botao[] = 'Avaliação de Desempenho';
         $this->array_botao_url_script[] = "go(\"educar_avaliacao_desempenho_lst.php?{$get_padrao}\");";
         $this->array_botao[] = 'Formação';
         $this->array_botao_url_script[] = "go(\"educar_servidor_formacao_lst.php?{$get_padrao}\");";
         $this->array_botao[] = 'Cursos superiores/Licenciaturas';
         $this->array_botao_url_script[] = sprintf("go(\"../module/Docente/index?servidor=%d&instituicao=%d\");", $registro['cod_servidor'], $this->ref_cod_instituicao);
         $this->array_botao[] = 'Faltas/Atrasos';
         $this->array_botao_url_script[] = "go(\"educar_falta_atraso_lst.php?{$get_padrao}\");";
         $this->array_botao[] = 'Alocar Servidor';
         $this->array_botao_url_script[] = "go(\"educar_servidor_alocacao_cad.php?{$get_padrao}\");";
         $this->array_botao[] = 'Alterar Nível';
         $this->array_botao_url_script[] = "popless();";
         $obj_servidor_alocacao = new clsPmieducarServidorAlocacao();
         $lista_alocacao = $obj_servidor_alocacao->lista(NULL, $this->ref_cod_instituicao, NULL, NULL, NULL, $this->cod_servidor, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1);
         if ($lista) {
             $this->array_botao[] = 'Substituir Horário Servidor';
             $this->array_botao_url_script[] = "go(\"educar_servidor_substituicao_cad.php?{$get_padrao}\");";
         }
         $obj_afastamento = new clsPmieducarServidorAfastamento();
         $afastamento = $obj_afastamento->afastado($this->cod_servidor, $this->ref_cod_instituicao);
         if (is_numeric($afastamento) && $afastamento == 0) {
             $this->array_botao[] = 'Afastar Servidor';
             $this->array_botao_url_script[] = "go(\"educar_servidor_afastamento_cad.php?{$get_padrao}\");";
         } elseif (is_numeric($afastamento)) {
             $this->array_botao[] = 'Retornar Servidor';
             $this->array_botao_url_script[] = "go(\"educar_servidor_afastamento_cad.php?{$get_padrao}&sequencial={$afastamento}\");";
         }
     }
     $this->url_cancelar = 'educar_servidor_lst.php';
     $this->largura = '100%';
     $localizacao = new LocalizacaoSistema();
     $localizacao->entradaCaminhos(array($_SERVER['SERVER_NAME'] . "/intranet" => "In&iacute;cio", "educar_index.php" => "i-Educar - Escola", "" => "Detalhe do servidor"));
     $this->enviaLocalizacao($localizacao->montar());
 }