/*
    **********************************************************************************
    *                                                                                *
    * @package URBEM CNM - Soluções em Gestão Pública                                *
    * @copyright (c) 2013 Confederação Nacional de Municípos                         *
    * @author Confederação Nacional de Municípios                                    *
    *                                                                                *
    * O URBEM CNM é um software livre; você pode redistribuí-lo e/ou modificá-lo sob *
    * os  termos  da Licença Pública Geral GNU conforme  publicada  pela Fundação do *
    * Software Livre (FSF - Free Software Foundation); na versão 2 da Licença.       *
    *                                                                                *
    * Este  programa  é  distribuído  na  expectativa  de  que  seja  útil,   porém, *
    * SEM NENHUMA GARANTIA; nem mesmo a garantia implícita  de  COMERCIABILIDADE  OU *
    * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral do GNU *
    * para mais detalhes.                                                            *
    *                                                                                *
    * Você deve ter recebido uma cópia da Licença Pública Geral do GNU "LICENCA.txt" *
    * com  este  programa; se não, escreva para  a  Free  Software Foundation  Inc., *
    * no endereço 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.       *
    *                                                                                *
    **********************************************************************************
*/
/*
*
* Script de DDL e DML
*
* Versao 2.02.0
*
* Fabio Bertoldi - 20121001
*
*/

CREATE OR REPLACE FUNCTION atualizarBanco(VARCHAR) RETURNS BOOLEAN as $$
DECLARE
    stSqlParametro              ALIAS FOR $1;
    inExercicio                 INTEGER;
    inCodEntidadePrefeitura     INTEGER;    
    stSql                       VARCHAR;
    stInsert                    VARCHAR;
    stBanco                     VARCHAR;
    stEntidade                  VARCHAR;
    stNomeSchema                VARCHAR;
    stNomeTriger                VARCHAR;
    stArray                     VARCHAR[];
    boEsquema                   BOOLEAN:=FALSE;
    boTrigger                   BOOLEAN:=FALSE;
    boGranteEsquema             BOOLEAN:=FALSE;
    boRetorno                   BOOLEAN;
    reRegistro                  RECORD;
    reSchema                    RECORD;
BEGIN
    EXECUTE stSqlParametro;

    inExercicio := selectIntoInteger('SELECT valor FROM administracao.configuracao WHERE parametro = ''ano_exercicio'' ORDER BY exercicio desc LIMIT 1');
    inCodEntidadePrefeitura := selectIntoInteger('SELECT valor::integer as valor
                                                    FROM administracao.configuracao
                                                   WHERE parametro = ''cod_entidade_prefeitura''
                                                     AND exercicio = '|| quote_literal(inExercicio) ||' ');


    IF strpos(trim(upper(stSqlParametro)),upper('CREATE SCHEMA')) > 0 THEN
        boEsquema    := TRUE;
        stNomeSchema := trim(translate(stSqlParametro,'CREATE SCHEMA ;',''));
        stInsert     := 'INSERT INTO administracao.schema_rh (schema_cod,schema_nome) VALUES ((SELECT max(schema_cod) FROM administracao.schema_rh)+1,'|| quote_literal(stNomeSchema) ||')';      
        EXECUTE stInsert;
        
        stSql := 'SELECT TRUE as retorno
                    FROM administracao.entidade_rh
                   WHERE cod_entidade = '|| inCodEntidadePrefeitura ||'
                   LIMIT 1';
        boRetorno := selectIntoBoolean(stSql);
        IF boRetorno IS TRUE THEN
            stInsert := 'INSERT INTO administracao.entidade_rh (exercicio,cod_entidade,schema_cod) 
                         VALUES
                         ('|| quote_literal(inExercicio) ||','|| inCodEntidadePrefeitura ||',(SELECT max(schema_cod) FROM administracao.schema_rh))';
            EXECUTE stInsert;
        END IF;
    END IF;
    IF strpos(trim(upper(stSqlParametro)),upper('CREATE TRIGGER')) > 0 THEN
        boTrigger    := TRUE;
        stArray      := string_to_array( stSqlParametro, ' ');
        stNomeTriger := stArray[3];
    END IF;
    IF strpos(trim(upper(stSqlParametro)),upper('GRANT ALL ON SCHEMA')) > 0 THEN
        boGranteEsquema := TRUE;
        stArray         := string_to_array( stSqlParametro, ' ');
        stNomeSchema    := stArray[5];
    END IF;

    stSql := '  SELECT entidade.cod_entidade
                  FROM orcamento.entidade
                 WHERE exercicio = '|| quote_literal(inExercicio) ||'
                   AND cod_entidade IN (SELECT cod_entidade
                                          FROM administracao.entidade_rh
                                         WHERE exercicio = '|| quote_literal(inExercicio) ||'
                                        GROUP BY cod_entidade)
                   AND cod_entidade != ('|| inCodEntidadePrefeitura ||')';
    FOR reRegistro IN EXECUTE stSql LOOP
        stBanco := stSqlParametro;        
        IF boEsquema THEN
            stBanco := trim(replace(stSqlParametro,';','')) ||'_'|| reRegistro.cod_entidade ||';';

            stInsert := 'INSERT INTO administracao.entidade_rh (exercicio,cod_entidade,schema_cod) 
                         VALUES
                         ('|| quote_literal(inExercicio) ||','|| reRegistro.cod_entidade ||',(SELECT max(schema_cod) FROM administracao.schema_rh))';
            EXECUTE stInsert;
        ELSIF boTrigger THEN
            stBanco := trim(replace(stSqlParametro,stNomeTriger,stNomeTriger ||'_'|| reRegistro.cod_entidade));
            stSql := 'SELECT * FROM administracao.schema_rh';
            FOR reSchema IN EXECUTE stSql LOOP
                stBanco := replace(stBanco,' '|| reSchema.schema_nome ||'.',' '|| reSchema.schema_nome ||'_'|| reRegistro.cod_entidade ||'.');
            END LOOP;
        ELSIF boGranteEsquema THEN
            stBanco := replace(stBanco, stNomeSchema,' '|| stNomeSchema ||'_'|| reRegistro.cod_entidade);
        ELSE 
            stSql := 'SELECT * FROM administracao.schema_rh';
            FOR reSchema IN EXECUTE stSql LOOP
                stBanco := replace(stBanco,' '|| reSchema.schema_nome ||'.',' '|| reSchema.schema_nome ||'_'|| reRegistro.cod_entidade ||'.');
            END LOOP;
        END IF;
        EXECUTE stBanco;
    END LOOP;
    RETURN TRUE;
END;
$$ LANGUAGE 'plpgsql';


--------------------------------------------
-- CRIANDO TABELA concurso.atributo_concurso
--------------------------------------------

SELECT atualizarbanco('
CREATE TABLE concurso.atributo_concurso(
    cod_cadastro    INTEGER     NOT NULL,
    cod_atributo    INTEGER     NOT NULL,
    ativo           BOOLEAN     NOT NULL,
    CONSTRAINT [REDACTED]    PRIMARY KEY (cod_cadastro, cod_atributo)
);
');
SELECT atualizarbanco('GRANT ALL ON concurso.atributo_concurso TO urbem;');


----------------
-- Ticket #20140
----------------

UPDATE administracao.acao           SET ativo = FALSE WHERE cod_acao = 1739;
UPDATE administracao.acao           SET ativo = FALSE WHERE cod_acao = 1737;
UPDATE administracao.funcionalidade SET ativo = FALSE WHERE cod_funcionalidade = 360;


----------------
-- Ticket #16389
----------------

INSERT
  INTO administracao.relatorio
     ( cod_gestao
     , cod_modulo
     , cod_relatorio
     , nom_relatorio
     , arquivo
     )
VALUES
     ( 4
     , 27
     , 29
     , 'Relatório Contra Cheque'
     , 'contraCheque.rptdesign'
     );


----------------
-- Ticket #20507
----------------

UPDATE administracao.acao SET nom_acao = 'Exportação Banco Caixa' WHERE cod_acao = 1969 and cod_funcionalidade = 354;


----------------
-- Ticket #19515
----------------

DROP   TYPE colunasCustomizavelEventos CASCADE;
CREATE TYPE colunasCustomizavelEventos AS (
cod_contrato              INTEGER,
registro                  INTEGER,
nom_cgm                   VARCHAR,
cpf                       VARCHAR,
desc_orgao                VARCHAR,
desc_local                VARCHAR,
desc_funcao               VARCHAR,
desc_cargo                VARCHAR,
desc_especialidade_cargo  VARCHAR,
desc_especialidade_funcao VARCHAR,
desc_padrao               VARCHAR,
valor1                    NUMERIC,
quantidade1               NUMERIC,
quantidade1Parcela        NUMERIC,
valor2                    NUMERIC,
quantidade2               NUMERIC,
quantidade2Parcela        NUMERIC,
valor3                    NUMERIC,
quantidade3               NUMERIC,
quantidade3Parcela        NUMERIC,
valor4                    NUMERIC,
quantidade4               NUMERIC,
quantidade4Parcela        NUMERIC,
valor5                    NUMERIC,
quantidade5               NUMERIC,
quantidade5Parcela        NUMERIC,
valor6                    NUMERIC,
quantidade6               NUMERIC,
quantidade6Parcela        NUMERIC
);


----------------
-- Ticket #19689
----------------

INSERT
  INTO administracao.relatorio
     ( cod_gestao
     , cod_modulo
     , cod_relatorio
     , nom_relatorio
     , arquivo
     )
VALUES
     ( 4
     , 27
     , 30
     , 'Registros de Evento'
     , 'consultarRegistroEvento.rptdesign'
     );


----------------
-- Ticket #15957
----------------

SELECT atualizarbanco('
CREATE TABLE pessoal.contrato_pensionista_caso_causa (
    cod_contrato        INTEGER     NOT NULL,
    dt_rescisao         DATE        NOT NULL,
    timestamp           TIMESTAMP   NOT NULL DEFAULT (''now''::text)::timestamp(3) with time zone,
    cod_caso_causa      INTEGER     NOT NULL,
    inc_folha_salario   BOOLEAN             ,
    inc_folha_decimo    BOOLEAN             ,
    CONSTRAINT [REDACTED]  PRIMARY KEY                             (cod_contrato),
    CONSTRAINT fk_contrato_pensionista_caso_causa_1 FOREIGN KEY                             (cod_caso_causa)
                                                    REFERENCES pessoal.caso_causa           (cod_caso_causa),
    CONSTRAINT fk_contrato_pensionista_caso_causa_2 FOREIGN KEY                             (cod_contrato)
                                                    REFERENCES pessoal.contrato_pensionista (cod_contrato)
);
');
SELECT atualizarbanco('
GRANT ALL ON pessoal.contrato_pensionista_caso_causa TO urbem;
');

SELECT atualizarbanco('
CREATE TABLE pessoal.causa_obito_pensionista(
    cod_contrato        INTEGER         NOT NULL,
    num_certidao_obito  VARCHAR(10)     NOT NULL,
    causa_mortis        VARCHAR(200)    NOT NULL,
    CONSTRAINT [REDACTED]      PRIMARY KEY (cod_contrato),
    CONSTRAINT fk_causa_obito_pensionista_1     FOREIGN KEY (cod_contrato)
                                                REFERENCES pessoal.contrato_pensionista_caso_causa (cod_contrato)
);
');
SELECT atualizarbanco('
GRANT ALL ON pessoal.causa_obito_pensionista TO urbem;
');

SELECT atualizarbanco('
CREATE TABLE pessoal.contrato_pensionista_caso_causa_norma(
    cod_contrato        INTEGER     NOT NULL,
    cod_norma           INTEGER     NOT NULL,
    CONSTRAINT [REDACTED]    PRIMARY KEY                                         (cod_contrato),
    CONSTRAINT fk_contrato_pensionista_caso_causa_norma_1   FOREIGN KEY                                         (cod_contrato)
                                                            REFERENCES pessoal.contrato_pensionista_caso_causa  (cod_contrato),
    CONSTRAINT fk_contrato_pensionista_caso_causa_norma_2   FOREIGN KEY                                         (cod_norma)
                                                            REFERENCES normas.norma                             (cod_norma)
);
');
SELECT atualizarbanco('
GRANT ALL ON pessoal.contrato_pensionista_caso_causa_norma TO urbem;
');


----------------
-- Ticket #20422
----------------

DROP   TYPE colunasEventosCalculados CASCADE;
CREATE TYPE colunasEventosCalculados AS (
    cod_contrato                INTEGER,  
    cod_evento                  INTEGER,  
    codigo                      VARCHAR,
    descricao                   VARCHAR,
    natureza                    CHAR,
    tipo                        CHAR,
    fixado                      CHAR,
    limite_calculo              BOOLEAN,
    apresenta_parcela           BOOLEAN,
    evento_sistema              BOOLEAN,
    sigla                       VARCHAR,
    valor                       NUMERIC,        
    quantidade                  NUMERIC,
    desdobramento               VARCHAR,
    desdobramento_texto         VARCHAR,
    sequencia                   INTEGER,
    desc_sequencia              VARCHAR,
    quantidade_total_parcela    INTEGER
);


----------------
-- Ticket #20563
----------------

DROP Function recuperaContribuicaoPrevidenciaria( VARCHAR
                                                , INTEGER
                                                , INTEGER
                                                , INTEGER
                                                , VARCHAR
                                                , VARCHAR
                                                , VARCHAR
                                                );


----------------
-- Ticket #20437
----------------

SELECT atualizarbanco('ALTER TABLE pessoal.contrato_pensionista_previdencia ADD COLUMN bo_excluido BOOLEAN NOT NULL DEFAULT FALSE;');


----------------
-- Ticket #20274
----------------

SELECT atualizarbanco('
ALTER TABLE pessoal.servidor_cid ADD COLUMN data_laudo DATE;
');


----------------
-- Ticket #16515
----------------

SELECT atualizarbanco('CREATE TABLE pessoal.contrato_servidor_situacao(
    cod_contrato                INTEGER         NOT NULL,
    situacao                    CHAR(1)         NOT NULL,
    timestamp                   TIMESTAMP       NOT NULL DEFAULT (''now''::text)::timestamp(3) with time zone,
    cod_periodo_movimentacao    INTEGER         NOT NULL,
    situacao_literal            VARCHAR(25)     NOT NULL,
    deleted                     BOOLEAN         NOT NULL DEFAULT FALSE,
    CONSTRAINT [REDACTED]   PRIMARY KEY                                    (cod_contrato, timestamp, situacao),
    CONSTRAINT fk_contrato_servidor_situacao_1  FOREIGN KEY                                    (cod_contrato)
                                                REFERENCES pessoal.contrato                    (cod_contrato),
    CONSTRAINT fk_contrato_servidor_situacao_2  FOREIGN KEY                                    (cod_periodo_movimentacao)
                                                REFERENCES folhapagamento.periodo_movimentacao (cod_periodo_movimentacao)
);
');
SELECT atualizarbanco('GRANT ALL ON pessoal.contrato_servidor_situacao TO urbem;');

CREATE OR REPLACE FUNCTION manutencao() RETURNS VOID AS $$
DECLARE
    inCodPrefeitura     VARCHAR;
    stSQLEntidade       VARCHAR;
    reRecordEntidade    RECORD;
    stEntidade          VARCHAR;
    stSQL               VARCHAR;
    reRecord            RECORD;
    stInsert            VARCHAR;
    stPrefeitura        VARCHAR;
    inCodPeriodo        INTEGER;
BEGIN

    PERFORM 1
       FROM administracao.configuracao
      WHERE cod_modulo = 2
        AND exercicio  = '2013'
        AND parametro  = 'cnpj'
        AND valor      = '04641551000195'
          ;
    IF FOUND THEN
        stPrefeitura := 'Manaquiri';
        UPDATE pessoal.contrato_servidor_nomeacao_posse
           SET dt_nomeacao = timestamp::date
             , dt_posse    = timestamp::date
             , dt_admissao = timestamp::date
         WHERE cod_contrato IN (
                                 SELECT cod_contrato
                                   FROM pessoal.contrato_servidor_nomeacao_posse
                                  WHERE dt_admissao = '1111-11-11'
                                     OR dt_admissao = '1010-12-12'
                               )
             ;
    END IF;

    PERFORM 1
       FROM administracao.configuracao
      WHERE cod_modulo = 2
        AND exercicio  = '2013'
        AND parametro  = 'cnpj'
        AND valor      = '94068418000184'
          ;
    IF FOUND THEN
        UPDATE pessoal.contrato_servidor_nomeacao_posse
           SET dt_nomeacao = '2012-02-02'
             , dt_posse    = '2012-02-02'
             , dt_admissao = '2012-02-02'
         WHERE cod_contrato = 1355
             ;
    END IF;

    PERFORM 1
       FROM administracao.configuracao
      WHERE cod_modulo = 2
        AND exercicio  = '2013'
        AND parametro  = 'cnpj'
        AND valor      = '13805528000180'
          ;
    IF FOUND THEN
        stPrefeitura := 'Mata';
        UPDATE pessoal.contrato_servidor_nomeacao_posse
           SET dt_nomeacao = '2003-03-03'
             , dt_posse    = '2003-03-03'
             , dt_admissao = '2003-03-03'
         WHERE cod_contrato = 7383
             ;
        UPDATE pessoal.contrato_servidor_nomeacao_posse
           SET dt_nomeacao = '2007-04-23'
             , dt_posse    = '2007-04-23'
             , dt_admissao = '2007-04-23'
         WHERE cod_contrato = 7860
            OR cod_contrato = 7864
             ;
    END IF;

    SELECT valor
      INTO inCodPrefeitura
      FROM administracao.configuracao
     WHERE cod_modulo = 8
       AND exercicio  = '2013'
       AND parametro  = 'cod_entidade_prefeitura'
         ;

    stSQLEntidade := '
                       SELECT DISTINCT(cod_entidade)::CHAR
                            , ''entidade_'' || cod_entidade AS entidade
                         FROM administracao.entidade_rh
                        WHERE exercicio = ''2013''
                          AND cod_entidade != '|| inCodPrefeitura ||'::INTEGER
                        UNION
                       SELECT ''''::CHAR AS cod_entidade
                            , ''entidade'' AS entidade
                            ;
                     ';
    FOR reRecordEntidade IN EXECUTE stSQLEntidade LOOP
        IF reRecordEntidade.cod_entidade != '' THEN
            stEntidade := '_' || reRecordEntidade.cod_entidade;
        ELSE
            stEntidade := '';
        END IF;
        stSQL := '
                   Select contrato_servidor_nomeacao_posse.cod_contrato
                        , dt_admissao::timestamp AS timestamp
                        , (
                            SELECT cod_periodo_movimentacao
                              FROM folhapagamento.periodo_movimentacao
                             WHERE contrato_servidor_nomeacao_posse.dt_admissao::DATE BETWEEN dt_inicial AND dt_final
                          )         AS cod_periodo_movimentacao
                        , ''A''     AS situacao
                        , ''Ativo'' AS situacao_literal
                     FROM pessoal'|| stEntidade ||'.contrato_servidor_nomeacao_posse
                     JOIN (
                              SELECT cod_contrato
                                   , min(timestamp) AS timestamp
                                FROM pessoal'|| stEntidade ||'.contrato_servidor_nomeacao_posse
                            GROUP BY cod_contrato
                          ) AS min_timestamp
                       ON contrato_servidor_nomeacao_posse.cod_contrato = min_timestamp.cod_contrato
                      AND contrato_servidor_nomeacao_posse.timestamp    = min_timestamp.timestamp
                    UNION
                   SELECT cod_contrato
                        , dt_concessao::timestamp AS timestamp
                        , (
                            SELECT cod_periodo_movimentacao
                              FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                             WHERE aposentadoria.dt_concessao::DATE BETWEEN dt_inicial AND dt_final
                          )              AS cod_periodo_movimentacao
                        , ''P''          AS situacao
                        , ''Aposentado'' AS situacao_literal
                     FROM pessoal'|| stEntidade ||'.aposentadoria 
                    WHERE NOT EXISTS (
                                       SELECT 1
                                         FROM pessoal'|| stEntidade ||'.aposentadoria_excluida
                                        WHERE aposentadoria_excluida.cod_contrato = aposentadoria.cod_contrato
                                     )
                    UNION
                   SELECT cod_contrato
                        , dt_rescisao::timestamp as timestamp
                        , (
                            SELECT cod_periodo_movimentacao
                              FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                             WHERE contrato_servidor_caso_causa.dt_rescisao::DATE BETWEEN dt_inicial AND dt_final
                          )              AS cod_periodo_movimentacao
                        , ''R''          AS situacao
                        , ''Rescindido'' AS situacao_literal
                     FROM pessoal'|| stEntidade ||'.contrato_servidor_caso_causa
                    UNION
                   SELECT cod_contrato
                        , dt_inicio_beneficio::TIMESTAMP AS timestamp
                        , (
                            SELECT cod_periodo_movimentacao
                              FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                             WHERE contrato_pensionista.dt_inicio_beneficio::DATE BETWEEN dt_inicial AND dt_final
                          )               AS cod_periodo_movimentacao
                        , ''E''           AS situacao
                        , ''Pensionista'' AS situacao_literal
                     FROM pessoal'|| stEntidade ||'.contrato_pensionista
                        ;
                 ';
        FOR reRecord IN EXECUTE stSQL LOOP
            IF    stPrefeitura = 'Mata'      AND reRecord.cod_periodo_movimentacao IS NULL THEN
                inCodPeriodo = 506;
            ELSIF stPrefeitura = 'Manaquiri' AND reRecord.cod_periodo_movimentacao IS NULL THEN
                inCodPeriodo = 1;
            ELSE
                inCodPeriodo = reRecord.cod_periodo_movimentacao;
            END IF;
            stInsert := '
                          INSERT
                            INTO pessoal'|| stEntidade ||'.contrato_servidor_situacao
                               ( cod_contrato
                               , situacao
                               , timestamp
                               , cod_periodo_movimentacao
                               , situacao_literal
                               )
                          VALUES
                               ( '|| reRecord.cod_contrato                    ||'
                               , '|| quote_literal(reRecord.situacao)         ||'
                               , '|| quote_literal(reRecord.timestamp)        ||'
                               , '|| inCodPeriodo                             ||'
                               , '|| quote_literal(reRecord.situacao_literal) ||'
                               );
                        ';
            EXECUTE stInsert;
        END LOOP;

    END LOOP;

END;
$$ LANGUAGE 'plpgsql';
SELECT        manutencao();
DROP FUNCTION manutencao();


CREATE OR REPLACE FUNCTION tr_situacao_contrato_aposentadoria() RETURNS TRIGGER AS $$
DECLARE
    stSchema        VARCHAR := '';
    stEntidade      VARCHAR := '';
    inCodPeriodo    INTEGER;
    stSQL           VARCHAR;
BEGIN

    SELECT nspname
      INTO stSchema
      FROM pg_namespace
      JOIN pg_class
        ON pg_class.relnamespace = pg_namespace.oid
     WHERE pg_class.oid = TG_RELID
         ;

    IF substr(stSchema, length(stSchema)-1, 1) = '_' THEN
        stEntidade := substr(stSchema, length(stSchema)-1, 2);
    END IF;

    IF      TG_OP = 'INSERT' THEN
        inCodPeriodo := selectintointeger('
                                              SELECT cod_periodo_movimentacao
                                                FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                            ORDER BY cod_periodo_movimentacao DESc
                                               LIMIT 1
                                                   ;
                                          ');

        stSQL := '
                   INSERT
                     INTO '|| stSchema ||'.contrato_servidor_situacao
                        ( cod_contrato
                        , situacao
                        , cod_periodo_movimentacao
                        , situacao_literal
                        )
                   VALUES
                        ( '|| NEW.cod_contrato ||'
                        , '|| quote_literal('P') ||'
                        , '|| inCodPeriodo ||'
                        , '|| quote_literal('Aposentado') ||'
                        );
                 ';
    END IF;

    EXECUTE stSQL;

    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


CREATE OR REPLACE FUNCTION tr_situacao_contrato_aposentadoria_excluida() RETURNS TRIGGER AS $$
DECLARE
    stSchema        VARCHAR := '';
    stEntidade      VARCHAR := '';
    inCodPeriodo    INTEGER;
    stSQL           VARCHAR;
BEGIN

    SELECT nspname
      INTO stSchema
      FROM pg_namespace
      JOIN pg_class
        ON pg_class.relnamespace = pg_namespace.oid
     WHERE pg_class.oid = TG_RELID
         ;

    IF substr(stSchema, length(stSchema)-1, 1) = '_' THEN
        stEntidade := substr(stSchema, length(stSchema)-1, 2);
    END IF;

    IF      TG_OP = 'INSERT' THEN
        stSQL := '
                   UPDATE '|| stSchema ||'.contrato_servidor_situacao
                      SET deleted = TRUE
                    WHERE cod_contrato = '|| NEW.cod_contrato   ||'
                      AND situacao     = '|| quote_literal('P') ||'
                        ;
                 ';
    END IF;

    EXECUTE stSQL;

    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


CREATE OR REPLACE FUNCTION tr_situacao_contrato_pensionista() RETURNS TRIGGER AS $$
DECLARE
    stSchema        VARCHAR := '';
    stEntidade      VARCHAR := '';
    inCodPeriodo    INTEGER;
    stSQL           VARCHAR;
BEGIN

    SELECT nspname
      INTO stSchema
      FROM pg_namespace
      JOIN pg_class
        ON pg_class.relnamespace = pg_namespace.oid
     WHERE pg_class.oid = TG_RELID
         ;

    IF substr(stSchema, length(stSchema)-1, 1) = '_' THEN
        stEntidade := substr(stSchema, length(stSchema)-1, 2);
    END IF;

    IF      TG_OP = 'INSERT' THEN
        inCodPeriodo := selectintointeger('
                                              SELECT cod_periodo_movimentacao
                                                FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                            ORDER BY cod_periodo_movimentacao DESc
                                               LIMIT 1
                                                   ;
                                          ');

        stSQL := '
                   INSERT
                     INTO '|| stSchema ||'.contrato_servidor_situacao
                        ( cod_contrato
                        , situacao
                        , cod_periodo_movimentacao
                        , situacao_literal
                        )
                   VALUES
                        ( '|| NEW.cod_contrato ||'
                        , '|| quote_literal('E') ||'
                        , '|| inCodPeriodo ||'
                        , '|| quote_literal('Pensionista') ||'
                        );
                 ';
    ELSIF TG_OP = 'DELETE' THEN
        stSQL := '
                   UPDATE '|| stSchema ||'.contrato_servidor_situacao
                      SET deleted = TRUE
                    WHERE cod_contrato = '|| OLD.cod_contrato   ||'
                      AND situacao     = '|| quote_literal('E') ||'
                        ;
                 ';
    END IF;

    EXECUTE stSQL;

    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


CREATE OR REPLACE FUNCTION tr_situacao_contrato_servidor() RETURNS TRIGGER AS $$
DECLARE
    stSchema        VARCHAR := '';
    stEntidade      VARCHAR := '';
    inCodPeriodo    INTEGER;
    stSQL           VARCHAR;
BEGIN

    SELECT nspname
      INTO stSchema
      FROM pg_namespace
      JOIN pg_class
        ON pg_class.relnamespace = pg_namespace.oid
     WHERE pg_class.oid = TG_RELID
         ;

    IF substr(stSchema, length(stSchema)-1, 1) = '_' THEN
        stEntidade := substr(stSchema, length(stSchema)-1, 2);
    END IF;

    IF      TG_OP = 'INSERT' THEN
        inCodPeriodo := selectintointeger('
                                              SELECT cod_periodo_movimentacao
                                                FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                            ORDER BY cod_periodo_movimentacao DESc
                                               LIMIT 1
                                                   ;
                                          ');

        stSQL := '
                   INSERT
                     INTO '|| stSchema ||'.contrato_servidor_situacao
                        ( cod_contrato
                        , situacao
                        , cod_periodo_movimentacao
                        , situacao_literal
                        )
                   VALUES
                        ( '|| NEW.cod_contrato ||'
                        , '|| quote_literal('A') ||'
                        , '|| inCodPeriodo ||'
                        , '|| quote_literal('Ativo') ||'
                        );
                 ';
    ELSIF TG_OP = 'DELETE' THEN
        stSQL := '
                   UPDATE '|| stSchema ||'.contrato_servidor_situacao
                      SET deleted = TRUE
                    WHERE cod_contrato = '|| OLD.cod_contrato   ||'
                        ;
                 ';
    END IF;

    EXECUTE stSQL;

    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


CREATE OR REPLACE FUNCTION tr_situacao_contrato_servidor_caso_causa() RETURNS TRIGGER AS $$
DECLARE
    stSchema        VARCHAR := '';
    stEntidade      VARCHAR := '';
    inCodPeriodo    INTEGER;
    stSQL           VARCHAR;
BEGIN

    SELECT nspname
      INTO stSchema
      FROM pg_namespace
      JOIN pg_class
        ON pg_class.relnamespace = pg_namespace.oid
     WHERE pg_class.oid = TG_RELID
         ;

    IF substr(stSchema, length(stSchema)-1, 1) = '_' THEN
        stEntidade := substr(stSchema, length(stSchema)-1, 2);
    END IF;

    IF      TG_OP = 'INSERT' THEN
        inCodPeriodo := selectintointeger('
                                              SELECT cod_periodo_movimentacao
                                                FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                            ORDER BY cod_periodo_movimentacao DESc
                                               LIMIT 1
                                                   ;
                                          ');

        stSQL := '
                   INSERT
                     INTO '|| stSchema ||'.contrato_servidor_situacao
                        ( cod_contrato
                        , situacao
                        , cod_periodo_movimentacao
                        , situacao_literal
                        )
                   VALUES
                        ( '|| NEW.cod_contrato ||'
                        , '|| quote_literal('R') ||'
                        , '|| inCodPeriodo ||'
                        , '|| quote_literal('Rescindido') ||'
                        );
                 ';
    ELSIF TG_OP = 'DELETE' THEN
        stSQL := '
                   UPDATE '|| stSchema ||'.contrato_servidor_situacao
                      SET deleted = TRUE
                    WHERE cod_contrato = '|| OLD.cod_contrato   ||'
                      AND situacao     = '|| quote_literal('R') ||'
                      AND timestamp    = (
                                           SELECT MAX(timestamp)
                                             FROM '|| stSchema ||'.contrato_servidor_situacao
                                            WHERE cod_contrato = '|| OLD.cod_contrato   ||'
                                              AND situacao     = '|| quote_literal('R') ||'
                                         )
                        ;
                 ';
    END IF;

    EXECUTE stSQL;

    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


SELECT atualizarbanco('CREATE TRIGGER trg_situacao_contrato_pensionista            BEFORE INSERT OR DELETE ON pessoal.contrato_pensionista         FOR EACH ROW EXECUTE PROCEDURE tr_situacao_contrato_pensionista();           ');
SELECT atualizarbanco('CREATE TRIGGER trg_situacao_contrato_servidor               BEFORE INSERT OR DELETE ON pessoal.contrato_servidor            FOR EACH ROW EXECUTE PROCEDURE tr_situacao_contrato_servidor();              ');
SELECT atualizarbanco('CREATE TRIGGER trg_situacao_contrato_aposentadoria          BEFORE INSERT OR DELETE ON pessoal.aposentadoria                FOR EACH ROW EXECUTE PROCEDURE tr_situacao_contrato_aposentadoria();         ');
SELECT atualizarbanco('CREATE TRIGGER trg_situacao_contrato_aposentadoria_excluida BEFORE INSERT OR DELETE ON pessoal.aposentadoria_excluida       FOR EACH ROW EXECUTE PROCEDURE tr_situacao_contrato_aposentadoria_excluida();');
SELECT atualizarbanco('CREATE TRIGGER trg_situacao_contrato_servidor_caso_causa    BEFORE INSERT OR DELETE ON pessoal.contrato_servidor_caso_causa FOR EACH ROW EXECUTE PROCEDURE tr_situacao_contrato_servidor_caso_causa();   ');


----------------
-- Ticket #20273
----------------

SELECT atualizarbanco('
ALTER TABLE pessoal.pensionista_cid ADD COLUMN data_laudo DATE;
');


----------------
-- Ticket #20585
----------------

CREATE TYPE colunasUltimoContratoServidorCargoCbo AS (
    cod_cbo     INTEGER,
    cod_cargo   INTEGER
   );


----------------
-- Ticket #20275
----------------

DROP   TYPE colunasContratoServidor CASCADE;
CREATE TYPE colunasContratoServidor AS (
    cod_contrato                INTEGER,
    cod_norma                   INTEGER,
    cod_forma_pagamento         INTEGER,
    cod_tipo_pagamento          INTEGER,
    cod_tipo_salario            INTEGER,
    cod_tipo_admissao           INTEGER,
    cod_categoria               INTEGER,
    cod_vinculo                 INTEGER,
    cod_cargo                   INTEGER,
    desc_cargo                  VARCHAR,
    cod_regime                  INTEGER,
    desc_regime                 VARCHAR,
    cod_sub_divisao             INTEGER,
    desc_sub_divisao            VARCHAR, 
    nr_cartao_ponto             VARCHAR,
    ativo                       BOOLEAN,
    dt_opcao_fgts               DATE,
    adiantamento                BOOLEAN,
    cod_grade                   INTEGER,
    registro                    INTEGER,
    cod_servidor                INTEGER,
    cod_uf                      INTEGER,
    cod_municipio               INTEGER,
    numcgm                      INTEGER,
    nome_pai                    VARCHAR, 
    nome_mae                    VARCHAR, 
    zona_titulo                 VARCHAR,
    secao_titulo                VARCHAR,
    caminho_foto                VARCHAR,
    nr_titulo_eleitor           VARCHAR,
    cod_estado_civil            INTEGER,
    cod_raca                    INTEGER,
    cod_orgao                   INTEGER,
    desc_orgao                  VARCHAR,
    orgao                       VARCHAR,
    cod_local                   INTEGER,
    desc_local                  VARCHAR,
    cod_regime_funcao           INTEGER,
    desc_regime_funcao          VARCHAR,
    cod_sub_divisao_funcao      INTEGER,
    desc_sub_divisao_funcao     VARCHAR,
    cod_funcao                  INTEGER,
    desc_funcao                 VARCHAR,
    cod_cbo_funcao              INTEGER,
    desc_cbo_funcao             VARCHAR,
    cod_especialidade_funcao    INTEGER,
    desc_especialidade_funcao   VARCHAR,
    cod_especialidade_cargo     INTEGER,
    desc_especialidade_cargo    VARCHAR,
    cod_tipo                    INTEGER,
    desc_tipo_cedencia          VARCHAR,
    cod_conselho                INTEGER,
    sigla_conselho              VARCHAR,
    desc_conselho               VARCHAR,
    cod_agencia_fgts            INTEGER,
    cod_banco_fgts              INTEGER,
    nr_conta_fgts               VARCHAR,
    cod_agencia_salario         INTEGER,
    cod_banco_salario           INTEGER,
    nr_conta_salario            VARCHAR,
    num_banco_salario           VARCHAR,
    nom_banco_salario           VARCHAR,
    num_agencia_salario         VARCHAR,
    nom_agencia_salario         VARCHAR,
    dt_validade_exame           DATE,
    dt_inicio_progressao        DATE,
    cod_nivel_padrao            INTEGER,
    dt_nomeacao                 DATE,
    dt_posse                    DATE,
    dt_admissao                 DATE,
    cod_ocorrencia              INTEGER,
    cod_padrao                  INTEGER,
    valor_padrao                NUMERIC,
    desc_padrao                 VARCHAR,
    cod_previdencia             INTEGER,
    salario                     NUMERIC,
    horas_mensais               NUMERIC,
    horas_semanais              NUMERIC,
    vigencia                    DATE,
    numcgm_sindicato            INTEGER,
    cod_cid                     INTEGER,
    numcgm_conjuge              INTEGER,
    nr_carteira_res             VARCHAR,
    cat_reservista              VARCHAR,
    origem_reservista           VARCHAR,
    nom_cgm                     VARCHAR,
    servidor_pis_pasep          VARCHAR,
    rg                          VARCHAR,
    cpf                         VARCHAR,
    dt_nascimento               DATE,
    valor_atributo              VARCHAR,
    data_laudo                  DATE
);

DROP   TYPE colunasContratoPensionista CASCADE;
CREATE TYPE colunasContratoPensionista AS (
    cod_contrato                INTEGER,
    registro                    INTEGER,
    cod_contrato_cedente        INTEGER,
    cod_dependencia             INTEGER,
    cod_pensionista             INTEGER,
    num_beneficio               VARCHAR,
    percentual_pagamento        NUMERIC,
    dt_inicio_beneficio         DATE,
    dt_encerramento             DATE,
    motivo_encerramento         VARCHAR,
    cod_profissao               INTEGER,
    numcgm                      INTEGER,
    cod_grau                    INTEGER,
    cod_orgao                   INTEGER,
    desc_orgao                  VARCHAR,
    orgao                       VARCHAR,
    cod_local                   INTEGER,
    desc_local                  VARCHAR,
    cod_agencia_salario         INTEGER,
    cod_banco_salario           INTEGER,
    nr_conta_salario            VARCHAR,
    num_banco_salario           VARCHAR,
    nom_banco_salario           VARCHAR,
    num_agencia_salario         VARCHAR,
    nom_agencia_salario         VARCHAR,
    cod_previdencia             INTEGER,
    cod_processo                INTEGER,
    cod_cid                     INTEGER,
    cod_regime_funcao           INTEGER,
    desc_regime_funcao          VARCHAR,
    cod_sub_divisao_funcao      INTEGER,
    desc_sub_divisao_funcao     VARCHAR,
    cod_funcao                  INTEGER,
    desc_funcao                 VARCHAR,
    desc_cbo_funcao             VARCHAR,
    cod_especialidade_funcao    INTEGER,
    desc_especialidade_funcao   VARCHAR,
    nom_cgm                     VARCHAR,
    rg                          VARCHAR,
    cpf                         VARCHAR,
    dt_nascimento               DATE,
    valor_atributo              VARCHAR,
    data_laudo                  DATE
);

CREATE OR REPLACE FUNCTION recuperarContratoServidor(VARCHAR,VARCHAR,INTEGER,VARCHAR,VARCHAR,VARCHAR) RETURNS SETOF colunasContratoServidor AS $$
DECLARE
    stConfiguracao                  ALIAS FOR $1;
    stEntidade                      ALIAS FOR $2;
    inCodPeriodoMovimentacao        ALIAS FOR $3;
    stTipoFiltro                    ALIAS FOR $4;
    stValoresFiltro                 ALIAS FOR $5;
    stExercicio                     ALIAS FOR $6;
    rwContratoServidor              colunasContratoServidor%ROWTYPE;
    stSql                           VARCHAR;
    stSqlAux                        VARCHAR;
    inCodTipoAtributo               INTEGER;
    stTimestampFechamentoPeriodo    VARCHAR;
    stCodigos                       VARCHAR;
    stContagemTempo                 VARCHAR;
    reContratoServidor              RECORD;
    reRegistro                      RECORD;
    crCursor                        REFCURSOR;
    arConfiguracao                  VARCHAR[];    
    arValoresFiltro                 VARCHAR[];    
    inIndex                         INTEGER := 1;    
    inCodOrganograma                INTEGER;
BEGIN
    stTimestampFechamentoPeriodo := ultimoTimestampPeriodoMovimentacao(inCodPeriodoMovimentacao,stEntidade);
    arConfiguracao := string_to_array(stConfiguracao,','); 

    stSql := 'SELECT valor 
                FROM administracao.configuracao 
               WHERE parametro = '|| quote_literal('dtContagemInicial'|| stEntidade) ||' AND exercicio = '|| quote_literal(stExercicio) ||' ';
    stContagemTempo := selectIntoVarchar(stSql);

    stSql := '    SELECT contrato_servidor.*
                       , contrato.registro
                       , servidor.*';
                       
    IF stTipoFiltro = 'atributo_servidor' OR stTipoFiltro = 'atributo_servidor_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');
        
        --Verifica o tipo do atributo 
        --TODO - Pegar o cod_modulo e cod_cadastro vindos do parametro stValoresFiltro. atualmente so é passado o cod_atributo
        stSqlAux := 'SELECT cod_tipo FROM administracao.atributo_dinamico WHERE cod_modulo = 22 AND cod_cadastro = 5 AND cod_atributo = '||arValoresFiltro[2];
        inCodTipoAtributo := selectIntoInteger(stSqlAux);
        IF inCodTipoAtributo = 3 OR inCodTipoAtributo = 4 THEN
            stSql := stSql || ', atributo_valor_padrao.valor_padrao as valor_atributo';
        ELSE
            stSql := stSql || ', atributo_contrato_servidor_valor.valor as valor_atributo';
        END IF;
    ELSE
        stSql := stSql || ', ''''::varchar as valor_atributo';
    END IF;          
    
    stSql := stSql || '
                    FROM pessoal'||stEntidade||'.contrato_servidor 
              INNER JOIN pessoal'||stEntidade||'.contrato
                      ON contrato.cod_contrato = contrato_servidor.cod_contrato
              INNER JOIN pessoal'||stEntidade||'.servidor_contrato_servidor
                      ON servidor_contrato_servidor.cod_contrato = contrato_servidor.cod_contrato
              INNER JOIN pessoal'||stEntidade||'.servidor
                      ON servidor.cod_servidor = servidor_contrato_servidor.cod_servidor';

    IF stTipoFiltro = 'reg_sub_fun_esp' OR stTipoFiltro = 'reg_sub_fun_esp_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                                    ON contrato_servidor_regime_funcao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_regime_funcao.cod_regime IN ('||arValoresFiltro[1]||')
                            INNER JOIN (  SELECT contrato_servidor_regime_funcao.cod_contrato
                                               , max(contrato_servidor_regime_funcao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                                           WHERE contrato_servidor_regime_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_regime_funcao.cod_contrato) as max_contrato_servidor_regime_funcao
                                    ON max_contrato_servidor_regime_funcao.cod_contrato = contrato_servidor_regime_funcao.cod_contrato
                                   AND max_contrato_servidor_regime_funcao.timestamp = contrato_servidor_regime_funcao.timestamp
                            INNER JOIN pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                    ON contrato_servidor_sub_divisao_funcao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_sub_divisao_funcao.cod_sub_divisao IN ('||arValoresFiltro[2]||')
                            INNER JOIN (  SELECT contrato_servidor_sub_divisao_funcao.cod_contrato
                                               , max(contrato_servidor_sub_divisao_funcao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                           WHERE contrato_servidor_sub_divisao_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_sub_divisao_funcao.cod_contrato) as max_contrato_servidor_sub_divisao_funcao
                                    ON max_contrato_servidor_sub_divisao_funcao.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                   AND max_contrato_servidor_sub_divisao_funcao.timestamp = contrato_servidor_sub_divisao_funcao.timestamp
                            INNER JOIN pessoal'||stEntidade||'.contrato_servidor_funcao
                                    ON contrato_servidor_funcao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_funcao.cod_cargo IN ('||arValoresFiltro[3]||')
                            INNER JOIN (  SELECT contrato_servidor_funcao.cod_contrato
                                               , max(contrato_servidor_funcao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_funcao
                                           WHERE contrato_servidor_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_funcao.cod_contrato) as max_contrato_servidor_funcao
                                    ON max_contrato_servidor_funcao.cod_contrato = contrato_servidor_funcao.cod_contrato
                                   AND max_contrato_servidor_funcao.timestamp = contrato_servidor_funcao.timestamp';
        IF trim(arValoresFiltro[4]) != '' THEN
            stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                                        ON contrato_servidor_especialidade_funcao.cod_contrato = contrato.cod_contrato
                                       AND contrato_servidor_especialidade_funcao.cod_especialidade IN ('||arValoresFiltro[4]||')
                                INNER JOIN (  SELECT contrato_servidor_especialidade_funcao.cod_contrato
                                                   , max(contrato_servidor_especialidade_funcao.timestamp) as timestamp
                                                FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                                               WHERE contrato_servidor_especialidade_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                            GROUP BY contrato_servidor_especialidade_funcao.cod_contrato) as max_contrato_servidor_especialidade_funcao
                                        ON max_contrato_servidor_especialidade_funcao.cod_contrato = contrato_servidor_especialidade_funcao.cod_contrato
                                       AND max_contrato_servidor_especialidade_funcao.timestamp = contrato_servidor_especialidade_funcao.timestamp';
        END IF;
    END IF;
    IF stTipoFiltro = 'reg_sub_car_esp' OR stTipoFiltro = 'reg_sub_car_esp_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');
        IF trim(arValoresFiltro[4]) != '' THEN
            stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_especialidade_cargo
                                        ON contrato_servidor_especialidade_cargo.cod_contrato = contrato.cod_contrato
                                       AND contrato_servidor_especialidade_cargo.cod_especialidade IN ('||arValoresFiltro[4]||')';
        END IF;
        stSql := stSql || ' WHERE contrato_servidor.cod_regime IN ('||arValoresFiltro[1]||')
                              AND contrato_servidor.cod_sub_divisao IN ('||arValoresFiltro[2]||')
                              AND contrato_servidor.cod_cargo IN ('||arValoresFiltro[3]||')';
    END IF;
    IF stTipoFiltro = 'contrato'                OR
       stTipoFiltro = 'contrato_todos'          OR
       stTipoFiltro = 'contrato_rescisao'       OR
       stTipoFiltro = 'contrato_aposentado'     OR
       stTipoFiltro = 'cgm_contrato'            OR
       stTipoFiltro = 'cgm_contrato_aposentado' OR
       stTipoFiltro = 'cgm_contrato_rescisao'   OR
       stTipoFiltro = 'cgm_contrato_todos'      THEN
        stSql := stSql || ' WHERE contrato.cod_contrato IN ('||stValoresFiltro||')';
    END IF;
    IF stTipoFiltro = 'lotacao' OR stTipoFiltro = 'lotacao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_orgao
                                    ON contrato_servidor_orgao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_orgao.cod_orgao IN ('||stValoresFiltro||')
                            INNER JOIN (  SELECT contrato_servidor_orgao.cod_contrato
                                               , max(contrato_servidor_orgao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_orgao
                                           WHERE contrato_servidor_orgao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_orgao.cod_contrato) as max_contrato_servidor_orgao
                                    ON max_contrato_servidor_orgao.cod_contrato = contrato_servidor_orgao.cod_contrato
                                   AND max_contrato_servidor_orgao.timestamp = contrato_servidor_orgao.timestamp';
    END IF;
    IF stTipoFiltro = 'local' OR stTipoFiltro = 'local_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_local
                                    ON contrato_servidor_local.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_local.cod_local IN ('||stValoresFiltro||')
                            INNER JOIN (  SELECT contrato_servidor_local.cod_contrato
                                               , max(contrato_servidor_local.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_local
                                           WHERE contrato_servidor_local.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_local.cod_contrato) as max_contrato_servidor_local
                                    ON max_contrato_servidor_local.cod_contrato = contrato_servidor_local.cod_contrato
                                   AND max_contrato_servidor_local.timestamp = contrato_servidor_local.timestamp';
    END IF;
    IF stTipoFiltro = 'sub_divisao' OR stTipoFiltro = 'sub_divisao_grupo' THEN
        stSql := stSql || ' WHERE contrato_servidor.cod_sub_divisao IN ('||stValoresFiltro||')';
    END IF;
    IF stTipoFiltro = 'sub_divisao_funcao' OR stTipoFiltro = 'sub_divisao_funcao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                    ON contrato_servidor_sub_divisao_funcao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_sub_divisao_funcao.cod_sub_divisao IN ('||stValoresFiltro||')
                            INNER JOIN (  SELECT contrato_servidor_sub_divisao_funcao.cod_contrato
                                               , max(contrato_servidor_sub_divisao_funcao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                           WHERE contrato_servidor_sub_divisao_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_sub_divisao_funcao.cod_contrato) as max_contrato_servidor_sub_divisao_funcao
                                    ON max_contrato_servidor_sub_divisao_funcao.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                   AND max_contrato_servidor_sub_divisao_funcao.timestamp = contrato_servidor_sub_divisao_funcao.timestamp';
    END IF;
    
    IF stTipoFiltro = 'atributo_servidor' OR stTipoFiltro = 'atributo_servidor_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.atributo_contrato_servidor_valor
                                    ON atributo_contrato_servidor_valor.cod_contrato = contrato.cod_contrato
                                   AND atributo_contrato_servidor_valor.cod_atributo = '||arValoresFiltro[2];

        IF arValoresFiltro[1] = '1' THEN
            stSql := stSql || '        AND atributo_contrato_servidor_valor.valor IN ('||arValoresFiltro[3]||')';
        ELSE
            stSql := stSql || '        AND atributo_contrato_servidor_valor.valor = '''||arValoresFiltro[3]||'''';
        END IF;
                                   
        IF inCodTipoAtributo = 3 OR inCodTipoAtributo = 4 THEN
            stSql := stSql || '
                            INNER JOIN administracao.atributo_valor_padrao
                                    ON atributo_valor_padrao.cod_modulo = atributo_contrato_servidor_valor.cod_modulo
                                   AND atributo_valor_padrao.cod_cadastro = atributo_contrato_servidor_valor.cod_cadastro
                                   AND atributo_valor_padrao.cod_atributo = atributo_contrato_servidor_valor.cod_atributo
                                   AND atributo_valor_padrao.cod_valor = atributo_contrato_servidor_valor.valor';
        END IF;
        
        stSql := stSql || '
                            INNER JOIN (  SELECT atributo_contrato_servidor_valor.cod_contrato
                                               , atributo_contrato_servidor_valor.cod_atributo
                                               , max(atributo_contrato_servidor_valor.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.atributo_contrato_servidor_valor
                                           WHERE atributo_contrato_servidor_valor.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY atributo_contrato_servidor_valor.cod_contrato
                                               , atributo_contrato_servidor_valor.cod_atributo) as max_atributo_contrato_servidor_valor
                                    ON max_atributo_contrato_servidor_valor.cod_contrato = atributo_contrato_servidor_valor.cod_contrato
                                   AND max_atributo_contrato_servidor_valor.cod_atributo = atributo_contrato_servidor_valor.cod_atributo
                                   AND max_atributo_contrato_servidor_valor.timestamp = atributo_contrato_servidor_valor.timestamp';
    END IF;
    
    IF stTipoFiltro = 'padrao' OR stTipoFiltro = 'padrao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_padrao
                                    ON contrato_servidor_padrao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_padrao.cod_padrao IN ('||stValoresFiltro||')
                            INNER JOIN (  SELECT contrato_servidor_padrao.cod_contrato
                                               , max(contrato_servidor_padrao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_padrao
                                           WHERE contrato_servidor_padrao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_padrao.cod_contrato) as max_contrato_servidor_padrao
                                    ON max_contrato_servidor_padrao.cod_contrato = contrato_servidor_padrao.cod_contrato
                                   AND max_contrato_servidor_padrao.timestamp = contrato_servidor_padrao.timestamp';
    END IF;
    IF stTipoFiltro = 'cargo' OR stTipoFiltro = 'cargo_grupo' THEN
        stSql := stSql || ' WHERE contrato_servidor.cod_cargo IN ('||stValoresFiltro||')';
    END IF;
    IF stTipoFiltro = 'funcao' OR stTipoFiltro = 'funcao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_funcao
                                    ON contrato_servidor_funcao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_funcao.cod_cargo IN ('||stValoresFiltro||')
                            INNER JOIN (  SELECT contrato_servidor_funcao.cod_contrato
                                               , max(contrato_servidor_funcao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_funcao
                                           WHERE contrato_servidor_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_funcao.cod_contrato) as max_contrato_servidor_funcao
                                    ON max_contrato_servidor_funcao.cod_contrato = contrato_servidor_funcao.cod_contrato
                                   AND max_contrato_servidor_funcao.timestamp = contrato_servidor_funcao.timestamp';
    END IF;


    FOR reContratoServidor IN EXECUTE stSql LOOP
        --DADOS DA TABELA pessoal'||stEntidade||'.contrato
        rwContratoServidor.registro            := reContratoServidor.registro;       
                         
        --DADOS DA TABELA pessoal'||stEntidade||'.servidor
        rwContratoServidor.cod_servidor        := reContratoServidor.cod_servidor;     
        rwContratoServidor.cod_uf              := reContratoServidor.cod_uf;           
        rwContratoServidor.cod_municipio       := reContratoServidor.cod_municipio;    
        rwContratoServidor.numcgm              := reContratoServidor.numcgm;           
        rwContratoServidor.nome_pai            := reContratoServidor.nome_pai;         
        rwContratoServidor.nome_mae            := reContratoServidor.nome_mae;         
        rwContratoServidor.zona_titulo         := reContratoServidor.zona_titulo;      
        rwContratoServidor.secao_titulo        := reContratoServidor.secao_titulo;     
        rwContratoServidor.caminho_foto        := reContratoServidor.caminho_foto;     
        rwContratoServidor.nr_titulo_eleitor   := reContratoServidor.nr_titulo_eleitor;
        rwContratoServidor.cod_estado_civil    := reContratoServidor.cod_estado_civil; 
        rwContratoServidor.cod_raca            := reContratoServidor.cod_raca;         


        --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor
        rwContratoServidor.cod_contrato        := reContratoServidor.cod_contrato;       
        rwContratoServidor.cod_norma           := reContratoServidor.cod_norma;          
        rwContratoServidor.cod_tipo_pagamento  := reContratoServidor.cod_tipo_pagamento; 
        rwContratoServidor.cod_tipo_salario    := reContratoServidor.cod_tipo_salario;   
        rwContratoServidor.cod_tipo_admissao   := reContratoServidor.cod_tipo_admissao;  
        rwContratoServidor.cod_categoria       := reContratoServidor.cod_categoria;      
        rwContratoServidor.cod_vinculo         := reContratoServidor.cod_vinculo;        
        rwContratoServidor.cod_cargo           := reContratoServidor.cod_cargo;          
        rwContratoServidor.cod_regime          := reContratoServidor.cod_regime;         
        rwContratoServidor.cod_sub_divisao     := reContratoServidor.cod_sub_divisao;    
        rwContratoServidor.nr_cartao_ponto     := reContratoServidor.nr_cartao_ponto;    
        rwContratoServidor.ativo               := reContratoServidor.ativo;              
        rwContratoServidor.dt_opcao_fgts       := reContratoServidor.dt_opcao_fgts;      
        rwContratoServidor.adiantamento        := reContratoServidor.adiantamento;       
        rwContratoServidor.cod_grade           := reContratoServidor.cod_grade;  
        rwContratoServidor.valor_atributo  := reContratoServidor.valor_atributo;               

        WHILE arConfiguracao[inIndex] IS NOT NULL LOOP
            --DADOS DA TABELA pessoal.contrato_servidor_nomeacao_posse
            IF arConfiguracao[inIndex] = 'anp' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '  SELECT contrato_servidor_nomeacao_posse.dt_nomeacao
                                 , contrato_servidor_nomeacao_posse.dt_posse
                                 , contrato_servidor_nomeacao_posse.dt_admissao
                              FROM pessoal'||stEntidade||'.contrato_servidor_nomeacao_posse
                        INNER JOIN (  SELECT contrato_servidor_nomeacao_posse.cod_contrato
                                           , max(contrato_servidor_nomeacao_posse.timestamp) as timestamp
                                        FROM pessoal'||stEntidade||'.contrato_servidor_nomeacao_posse
                                       WHERE timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                    GROUP BY contrato_servidor_nomeacao_posse.cod_contrato) as max_contrato_servidor_nomeacao_posse
                                ON max_contrato_servidor_nomeacao_posse.cod_contrato = contrato_servidor_nomeacao_posse.cod_contrato
                               AND max_contrato_servidor_nomeacao_posse.timestamp = contrato_servidor_nomeacao_posse.timestamp
                             WHERE contrato_servidor_nomeacao_posse.cod_contrato = '||reContratoServidor.cod_contrato;

                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.dt_nomeacao := reRegistro.dt_nomeacao;
                rwContratoServidor.dt_posse    := reRegistro.dt_posse;
                rwContratoServidor.dt_admissao := reRegistro.dt_admissao;               
            END IF;

            --DADOS DA TABELA pessoal.cargo
            IF arConfiguracao[inIndex] = 'ca' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT cargo.descricao as desc_cargo
                                FROM pessoal'||stEntidade||'.cargo
                               WHERE cargo.cod_cargo = '||reContratoServidor.cod_cargo;
                rwContratoServidor.desc_cargo   := selectIntoVarchar(stSql);
            END IF;

            --DADOS DA TABELA pessoal.regime
            IF arConfiguracao[inIndex] = 'car' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT regime.descricao as desc_regime
                                FROM pessoal'||stEntidade||'.regime
                               WHERE regime.cod_regime = '||reContratoServidor.cod_regime;
                rwContratoServidor.desc_regime   := selectIntoVarchar(stSql);
            END IF;

            --DADOS DA TABELA pessoal.sub_divisao
            IF arConfiguracao[inIndex] = 'cas' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT sub_divisao.descricao as desc_sub_divisao
                                FROM pessoal'||stEntidade||'.sub_divisao
                               WHERE sub_divisao.cod_sub_divisao = '||reContratoServidor.cod_sub_divisao;
                rwContratoServidor.desc_sub_divisao   := selectIntoVarchar(stSql);
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_cedencia
            IF arConfiguracao[inIndex] = 'c' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_cedencia.cod_tipo
                                   , tipo_cedencia.descricao as desc_tipo_cedencia
                                FROM pessoal'||stEntidade||'.contrato_servidor_cedencia
                          INNER JOIN pessoal'||stEntidade||'.tipo_cedencia
                                  ON tipo_cedencia.cod_tipo = contrato_servidor_cedencia.cod_tipo
                               WHERE contrato_servidor_cedencia.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_tipo             := reRegistro.cod_tipo;
                rwContratoServidor.desc_tipo_cedencia   := reRegistro.desc_tipo_cedencia;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_conselho
            IF arConfiguracao[inIndex] = 'co' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_conselho.cod_conselho
                                   , conselho.sigla as sigla_conselho
                                   , conselho.descricao as desc_conselho
                                FROM pessoal'||stEntidade||'.contrato_servidor_conselho
                          INNER JOIN pessoal'||stEntidade||'.conselho
                                  ON conselho.cod_conselho = contrato_servidor_conselho.cod_conselho
                               WHERE contrato_servidor_conselho.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_conselho     := reRegistro.cod_conselho;
                rwContratoServidor.sigla_conselho   := reRegistro.sigla_conselho;
                rwContratoServidor.desc_conselho    := reRegistro.desc_conselho;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_conta_fgts
            IF arConfiguracao[inIndex] = 'cf' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_conta_fgts.cod_agencia as cod_agencia_fgts
                                   , contrato_servidor_conta_fgts.cod_banco as cod_banco_fgts
                                   , contrato_servidor_conta_fgts.nr_conta as nr_conta_fgts
                                FROM pessoal'||stEntidade||'.contrato_servidor_conta_fgts
                               WHERE contrato_servidor_conta_fgts.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_agencia_fgts     := reRegistro.cod_agencia_fgts;
                rwContratoServidor.cod_banco_fgts       := reRegistro.cod_banco_fgts;
                rwContratoServidor.nr_conta_fgts        := reRegistro.nr_conta_fgts;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_conta_salario
            IF arConfiguracao[inIndex] = 'cs' OR arConfiguracao[inIndex] = 'all' THEN
                -- Verifica no histórico se foi pago em crédito em banco ou foi pago em outra forma de pagamento
                -- Caso tenha sido pago em outra forma, retornar vazio os dados da conta salário
                stSql := '    SELECT contrato_servidor_forma_pagamento.*
                                FROM pessoal'||stEntidade||'.contrato_servidor_forma_pagamento
                          INNER JOIN (  SELECT contrato_servidor_forma_pagamento.cod_contrato
                                             , max(timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_forma_pagamento
                                         WHERE timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_forma_pagamento.cod_contrato
                                     ) as max_contrato_servidor_forma_pagamento
                                  ON contrato_servidor_forma_pagamento.cod_contrato = max_contrato_servidor_forma_pagamento.cod_contrato
                              AND contrato_servidor_forma_pagamento.timestamp = max_contrato_servidor_forma_pagamento.timestamp
                            WHERE contrato_servidor_forma_pagamento.cod_contrato = '||reContratoServidor.cod_contrato;

                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_forma_pagamento := reRegistro.cod_forma_pagamento;

                IF rwContratoServidor.cod_forma_pagamento = 3 THEN --Crédito em conta
                    stSql := '    SELECT contrato_servidor_conta_salario_historico.cod_agencia as cod_agencia_salario
                                    , contrato_servidor_conta_salario_historico.cod_banco as cod_banco_salario
                                    , contrato_servidor_conta_salario_historico.nr_conta as nr_conta_salario
                                    , banco.num_banco as num_banco_salario
                                    , banco.nom_banco as nom_banco_salario
                                    , agencia.num_agencia as num_agencia_salario
                                    , agencia.nom_agencia as nom_agencia_salario
                                 FROM pessoal'||stEntidade||'.contrato_servidor_conta_salario_historico
                           INNER JOIN (  SELECT contrato_servidor_conta_salario_historico.cod_contrato
                                              , max(contrato_servidor_conta_salario_historico.timestamp) as timestamp
                                           FROM pessoal'||stEntidade||'.contrato_servidor_conta_salario_historico
                                          WHERE contrato_servidor_conta_salario_historico.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                       GROUP BY contrato_servidor_conta_salario_historico.cod_contrato) as max_contrato_servidor_conta_salario_historico
                                    ON max_contrato_servidor_conta_salario_historico.cod_contrato = contrato_servidor_conta_salario_historico.cod_contrato
                                   AND max_contrato_servidor_conta_salario_historico.timestamp = contrato_servidor_conta_salario_historico.timestamp
                            INNER JOIN monetario.agencia
                                    ON agencia.cod_banco = contrato_servidor_conta_salario_historico.cod_banco
                                   AND agencia.cod_agencia = contrato_servidor_conta_salario_historico.cod_agencia
                            INNER JOIN monetario.banco
                                    ON banco.cod_banco = contrato_servidor_conta_salario_historico.cod_banco
                                 WHERE contrato_servidor_conta_salario_historico.cod_contrato = '||reContratoServidor.cod_contrato;

                    OPEN crCursor FOR EXECUTE stSql;
                        FETCH crCursor INTO reRegistro;
                    CLOSE crCursor;
                    rwContratoServidor.cod_agencia_salario     := reRegistro.cod_agencia_salario;
                    rwContratoServidor.cod_banco_salario       := reRegistro.cod_banco_salario;
                    rwContratoServidor.nr_conta_salario        := reRegistro.nr_conta_salario;
                    rwContratoServidor.num_banco_salario       := reRegistro.num_banco_salario;
                    rwContratoServidor.nom_banco_salario       := reRegistro.nom_banco_salario;
                    rwContratoServidor.num_agencia_salario     := reRegistro.num_agencia_salario;
                    rwContratoServidor.nom_agencia_salario     := reRegistro.nom_agencia_salario;
                ELSE
                    rwContratoServidor.cod_agencia_salario     := NULL;
                    rwContratoServidor.cod_banco_salario       := NULL;
                    rwContratoServidor.nr_conta_salario        := NULL;
                    rwContratoServidor.num_banco_salario       := NULL;
                    rwContratoServidor.nom_banco_salario       := NULL;
                    rwContratoServidor.num_agencia_salario     := NULL;
                    rwContratoServidor.nom_agencia_salario     := NULL;
                END IF;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_exame_medico
            IF arConfiguracao[inIndex] = 'em' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_exame_medico.dt_validade_exame
                                FROM pessoal'||stEntidade||'.contrato_servidor_exame_medico
                          INNER JOIN (  SELECT contrato_servidor_exame_medico.cod_contrato
                                             , max(contrato_servidor_exame_medico.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_exame_medico
                                         WHERE contrato_servidor_exame_medico.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_exame_medico.cod_contrato) as max_contrato_servidor_exame_medico
                                  ON max_contrato_servidor_exame_medico.cod_contrato = contrato_servidor_exame_medico.cod_contrato
                                 AND max_contrato_servidor_exame_medico.timestamp = contrato_servidor_exame_medico.timestamp
                               WHERE contrato_servidor_exame_medico.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.dt_validade_exame  := reRegistro.dt_validade_exame;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_inicio_progressao
            IF arConfiguracao[inIndex] = 'ip' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_inicio_progressao.dt_inicio_progressao
                                FROM pessoal'||stEntidade||'.contrato_servidor_inicio_progressao
                          INNER JOIN (  SELECT contrato_servidor_inicio_progressao.cod_contrato
                                             , max(contrato_servidor_inicio_progressao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_inicio_progressao
                                         WHERE contrato_servidor_inicio_progressao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_inicio_progressao.cod_contrato) as max_contrato_servidor_inicio_progressao
                                  ON max_contrato_servidor_inicio_progressao.cod_contrato = contrato_servidor_inicio_progressao.cod_contrato
                                 AND max_contrato_servidor_inicio_progressao.timestamp = contrato_servidor_inicio_progressao.timestamp
                               WHERE contrato_servidor_inicio_progressao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.dt_inicio_progressao  := reRegistro.dt_inicio_progressao;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_nivel_padrao
            IF arConfiguracao[inIndex] = 'np' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_nivel_padrao.cod_nivel_padrao
                                FROM pessoal'||stEntidade||'.contrato_servidor_nivel_padrao
                          INNER JOIN (  SELECT contrato_servidor_nivel_padrao.cod_contrato
                                             , max(contrato_servidor_nivel_padrao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_nivel_padrao
                                         WHERE contrato_servidor_nivel_padrao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_nivel_padrao.cod_contrato) as max_contrato_servidor_nivel_padrao
                                  ON max_contrato_servidor_nivel_padrao.cod_contrato = contrato_servidor_nivel_padrao.cod_contrato
                                 AND max_contrato_servidor_nivel_padrao.timestamp = contrato_servidor_nivel_padrao.timestamp
                               WHERE contrato_servidor_nivel_padrao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_nivel_padrao  := reRegistro.cod_nivel_padrao;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_ocorrencia
            IF arConfiguracao[inIndex] = 'oc' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_ocorrencia.cod_ocorrencia
                                FROM pessoal'||stEntidade||'.contrato_servidor_ocorrencia
                          INNER JOIN (  SELECT contrato_servidor_ocorrencia.cod_contrato
                                             , max(contrato_servidor_ocorrencia.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_ocorrencia
                                         WHERE contrato_servidor_ocorrencia.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_ocorrencia.cod_contrato) as max_contrato_servidor_ocorrencia
                                  ON max_contrato_servidor_ocorrencia.cod_contrato = contrato_servidor_ocorrencia.cod_contrato
                                 AND max_contrato_servidor_ocorrencia.timestamp = contrato_servidor_ocorrencia.timestamp
                               WHERE contrato_servidor_ocorrencia.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_ocorrencia  := reRegistro.cod_ocorrencia;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_padrao
            IF arConfiguracao[inIndex] = 'p' OR arConfiguracao[inIndex] = 'pp' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_padrao.cod_padrao
                                FROM pessoal'||stEntidade||'.contrato_servidor_padrao
                          INNER JOIN (  SELECT contrato_servidor_padrao.cod_contrato
                                             , max(contrato_servidor_padrao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_padrao
                                         WHERE contrato_servidor_padrao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_padrao.cod_contrato) as max_contrato_servidor_padrao
                                  ON max_contrato_servidor_padrao.cod_contrato = contrato_servidor_padrao.cod_contrato
                                 AND max_contrato_servidor_padrao.timestamp = contrato_servidor_padrao.timestamp
                               WHERE contrato_servidor_padrao.cod_contrato = '||reContratoServidor.cod_contrato;
                
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_padrao  := reRegistro.cod_padrao;
                
                IF arConfiguracao[inIndex] = 'pp' THEN
                    IF rwContratoServidor.cod_padrao IS NOT NULL THEN 
                        stSql := '    SELECT padrao_padrao.valor
                                        , padrao.descricao
                                        FROM folhapagamento'||stEntidade||'.padrao_padrao
                                INNER JOIN (  SELECT padrao_padrao.cod_padrao
                                                    , max(padrao_padrao.timestamp) as timestamp
                                                FROM folhapagamento'||stEntidade||'.padrao_padrao
                                                WHERE padrao_padrao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                            GROUP BY padrao_padrao.cod_padrao) as max_padrao_padrao
                                        ON max_padrao_padrao.cod_padrao = padrao_padrao.cod_padrao
                                        AND max_padrao_padrao.timestamp = padrao_padrao.timestamp
                                INNER JOIN folhapagamento'||stEntidade||'.padrao
                                        ON padrao.cod_padrao = padrao_padrao.cod_padrao
                                    WHERE padrao_padrao.cod_padrao = '||rwContratoServidor.cod_padrao;
                        OPEN crCursor FOR EXECUTE stSql;
                            FETCH crCursor INTO reRegistro;
                        CLOSE crCursor;
                        rwContratoServidor.desc_padrao   := reRegistro.descricao;
                        rwContratoServidor.valor_padrao  := reRegistro.valor;
                    END IF;
                END IF;
            END IF;

            --DADOS DA TABELA pessoal.contrato_servidor_previdencia
            IF arConfiguracao[inIndex] = 'pr' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_previdencia.cod_previdencia
                                FROM pessoal'||stEntidade||'.contrato_servidor_previdencia
                          INNER JOIN (  SELECT contrato_servidor_previdencia.cod_contrato
                                             , max(contrato_servidor_previdencia.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_previdencia
                                         WHERE contrato_servidor_previdencia.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_previdencia.cod_contrato) as max_contrato_servidor_previdencia
                                  ON max_contrato_servidor_previdencia.cod_contrato = contrato_servidor_previdencia.cod_contrato
                                 AND max_contrato_servidor_previdencia.timestamp = contrato_servidor_previdencia.timestamp
                          INNER JOIN folhapagamento'||stEntidade||'.previdencia_previdencia
                                  ON previdencia_previdencia.cod_previdencia = contrato_servidor_previdencia.cod_previdencia
                                 AND previdencia_previdencia.tipo_previdencia = ''o''
                          INNER JOIN (  SELECT previdencia_previdencia.cod_previdencia
                                             , max(previdencia_previdencia.timestamp) as timestamp
                                          FROM folhapagamento'||stEntidade||'.previdencia_previdencia
                                      GROUP BY previdencia_previdencia.cod_previdencia) as max_previdencia_previdencia
                                  ON max_previdencia_previdencia.cod_previdencia = previdencia_previdencia.cod_previdencia
                                 AND max_previdencia_previdencia.timestamp = previdencia_previdencia.timestamp
                               WHERE contrato_servidor_previdencia.bo_excluido = false
                                 AND contrato_servidor_previdencia.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_previdencia  := reRegistro.cod_previdencia;
            END IF;

            --DADOS DA TABELA pessoal.contrato_servidor_salario
            IF arConfiguracao[inIndex] = 's' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_salario.salario
                                   , contrato_servidor_salario.horas_mensais
                                   , contrato_servidor_salario.horas_semanais
                                   , contrato_servidor_salario.vigencia
                                FROM pessoal'||stEntidade||'.contrato_servidor_salario
                          INNER JOIN (  SELECT contrato_servidor_salario.cod_contrato
                                             , max(contrato_servidor_salario.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_salario
                                         WHERE contrato_servidor_salario.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_salario.cod_contrato) as max_contrato_servidor_salario
                                  ON max_contrato_servidor_salario.cod_contrato = contrato_servidor_salario.cod_contrato
                                 AND max_contrato_servidor_salario.timestamp = contrato_servidor_salario.timestamp
                               WHERE contrato_servidor_salario.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.salario          := reRegistro.salario;       
                rwContratoServidor.horas_mensais    := reRegistro.horas_mensais; 
                rwContratoServidor.horas_semanais   := reRegistro.horas_semanais;
                rwContratoServidor.vigencia         := reRegistro.vigencia;      
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_sindicato
            IF arConfiguracao[inIndex] = 'si' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_sindicato.numcgm_sindicato
                                FROM pessoal'||stEntidade||'.contrato_servidor_sindicato
                               WHERE contrato_servidor_sindicato.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.numcgm_sindicato          := reRegistro.numcgm_sindicato;       
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_orgao
            IF arConfiguracao[inIndex] = 'o' OR arConfiguracao[inIndex] = 'oo' OR arConfiguracao[inIndex] = 'all' THEN        
                stSql := '    SELECT contrato_servidor_orgao.cod_orgao
                                   , recuperadescricaoorgao(contrato_servidor_orgao.cod_orgao,'''||stTimestampFechamentoPeriodo||''') as descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_orgao
                          INNER JOIN (  SELECT contrato_servidor_orgao.cod_contrato
                                             , max(contrato_servidor_orgao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_orgao
                                         WHERE contrato_servidor_orgao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_orgao.cod_contrato) as max_contrato_servidor_orgao
                                  ON max_contrato_servidor_orgao.cod_contrato = contrato_servidor_orgao.cod_contrato
                                 AND max_contrato_servidor_orgao.timestamp = contrato_servidor_orgao.timestamp
                               WHERE contrato_servidor_orgao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_orgao  := reRegistro.cod_orgao;
                rwContratoServidor.desc_orgao := reRegistro.descricao;

                --DADOS DA TABELA organograma.fn_consulta_orgao
                IF arConfiguracao[inIndex] = 'oo' OR arConfiguracao[inIndex] = 'all' THEN        
                    inCodOrganograma := selectIntoInteger('SELECT cod_organograma FROM organograma.orgao_nivel WHERE cod_orgao = '||reRegistro.cod_orgao);
                    stSql := 'SELECT organograma.fn_consulta_orgao('||inCodOrganograma||','||reRegistro.cod_orgao||')';
                    rwContratoServidor.orgao := selectIntoVarchar(stSql); 
                END IF;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_local
            IF arConfiguracao[inIndex] = 'l' OR arConfiguracao[inIndex] = 'all' THEN        
                stSql := '    SELECT contrato_servidor_local.cod_local
                                   , local.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_local
                          INNER JOIN (  SELECT contrato_servidor_local.cod_contrato
                                             , max(contrato_servidor_local.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_local
                                         WHERE contrato_servidor_local.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_local.cod_contrato) as max_contrato_servidor_local
                                  ON max_contrato_servidor_local.cod_contrato = contrato_servidor_local.cod_contrato
                                 AND max_contrato_servidor_local.timestamp = contrato_servidor_local.timestamp
                          INNER JOIN organograma.local
                                  ON local.cod_local = contrato_servidor_local.cod_local
                               WHERE contrato_servidor_local.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_local  := reRegistro.cod_local;
                rwContratoServidor.desc_local := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_regime_funcao
            IF arConfiguracao[inIndex] = 'rf' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT contrato_servidor_regime_funcao.cod_regime as cod_regime_funcao
                                   , regime.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                          INNER JOIN (  SELECT contrato_servidor_regime_funcao.cod_contrato
                                             , max(contrato_servidor_regime_funcao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                                         WHERE contrato_servidor_regime_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_regime_funcao.cod_contrato) as max_contrato_servidor_regime_funcao
                                  ON max_contrato_servidor_regime_funcao.cod_contrato = contrato_servidor_regime_funcao.cod_contrato
                                 AND max_contrato_servidor_regime_funcao.timestamp = contrato_servidor_regime_funcao.timestamp
                          INNER JOIN pessoal'||stEntidade||'.regime
                                  ON regime.cod_regime = contrato_servidor_regime_funcao.cod_regime
                               WHERE contrato_servidor_regime_funcao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_regime_funcao  := reRegistro.cod_regime_funcao;
                rwContratoServidor.desc_regime_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
            IF arConfiguracao[inIndex] = 'sf' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT contrato_servidor_sub_divisao_funcao.cod_sub_divisao as cod_sub_divisao_funcao
                                   , sub_divisao.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                          INNER JOIN (  SELECT contrato_servidor_sub_divisao_funcao.cod_contrato
                                             , max(contrato_servidor_sub_divisao_funcao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                         WHERE contrato_servidor_sub_divisao_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_sub_divisao_funcao.cod_contrato) as max_contrato_servidor_sub_divisao_funcao
                                  ON max_contrato_servidor_sub_divisao_funcao.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                 AND max_contrato_servidor_sub_divisao_funcao.timestamp = contrato_servidor_sub_divisao_funcao.timestamp
                          INNER JOIN pessoal'||stEntidade||'.sub_divisao
                                  ON sub_divisao.cod_sub_divisao = contrato_servidor_sub_divisao_funcao.cod_sub_divisao
                               WHERE contrato_servidor_sub_divisao_funcao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_sub_divisao_funcao  := reRegistro.cod_sub_divisao_funcao;
                rwContratoServidor.desc_sub_divisao_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_funcao
            IF arConfiguracao[inIndex] = 'f' OR arConfiguracao[inIndex] = 'all' THEN        
                stSql := '    SELECT contrato_servidor_funcao.cod_cargo as cod_funcao
                                   , cargo.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_funcao
                          INNER JOIN (  SELECT contrato_servidor_funcao.cod_contrato
                                             , max(contrato_servidor_funcao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_funcao
                                         WHERE contrato_servidor_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_funcao.cod_contrato) as max_contrato_servidor_funcao
                                  ON max_contrato_servidor_funcao.cod_contrato = contrato_servidor_funcao.cod_contrato
                                 AND max_contrato_servidor_funcao.timestamp = contrato_servidor_funcao.timestamp
                          INNER JOIN pessoal'||stEntidade||'.cargo
                                  ON cargo.cod_cargo = contrato_servidor_funcao.cod_cargo
                               WHERE contrato_servidor_funcao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_funcao  := reRegistro.cod_funcao;
                rwContratoServidor.desc_funcao := reRegistro.descricao;

                IF rwContratoServidor.cod_funcao IS NOT NULL THEN 
                    stSql := ' SELECT * 
                                 FROM ( SELECT cargo.cod_cargo
                                             , cbo.codigo as cbo_codigo
                                             , cbo.cod_cbo as cod_cbo
                                             , cargo.descricao
                                          FROM pessoal'||stEntidade||'.cargo
                                             , pessoal'||stEntidade||'.cbo_cargo
                                             , (  SELECT cod_cargo
                                                       , max(timestamp) as timestamp
                                                    FROM pessoal'||stEntidade||'.cbo_cargo
                                                GROUP BY cod_cargo) as max_cbo_cargo
                                             , pessoal'||stEntidade||'.cbo
                                         WHERE cargo.cod_cargo = cbo_cargo.cod_cargo
                                           AND cbo_cargo.cod_cargo = max_cbo_cargo.cod_cargo 
                                           AND cbo_cargo.timestamp = max_cbo_cargo.timestamp
                                           AND cbo_cargo.cod_cbo = cbo.cod_cbo
                                         UNION
                                        SELECT cargo.cod_cargo
                                             , cbo.codigo as cbo_codigo
                                             , cbo.cod_cbo as cod_cbo
                                             , cargo.descricao
                                          FROM pessoal'||stEntidade||'.cargo
                                             , pessoal'||stEntidade||'.especialidade
                                             , pessoal'||stEntidade||'.cbo_especialidade
                                             , (  SELECT cod_especialidade
                                             , max(timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.cbo_especialidade
                                      GROUP BY cod_especialidade) as max_cod_especialidade
                                             , pessoal'||stEntidade||'.cbo
                                         WHERE cargo.cod_cargo = especialidade.cod_cargo
                                           AND especialidade.cod_especialidade = cbo_especialidade.cod_especialidade
                                           AND cbo_especialidade.cod_especialidade = max_cod_especialidade.cod_especialidade 
                                           AND cbo_especialidade.timestamp = max_cod_especialidade.timestamp
                                           AND cbo_especialidade.cod_cbo = cbo.cod_cbo) as funcao
                                         WHERE funcao.cod_cargo = '||reRegistro.cod_funcao;
    
                    OPEN crCursor FOR EXECUTE stSql;
                        FETCH crCursor INTO reRegistro;
                    CLOSE crCursor;
                    rwContratoServidor.cod_cbo_funcao               := reRegistro.cod_cbo;
                    rwContratoServidor.desc_cbo_funcao              := reRegistro.descricao;
                END IF;

            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
            IF arConfiguracao[inIndex] = 'ef' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT contrato_servidor_especialidade_funcao.cod_especialidade as cod_especialidade_funcao
                                   , especialidade.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                          INNER JOIN (  SELECT contrato_servidor_especialidade_funcao.cod_contrato
                                             , max(contrato_servidor_especialidade_funcao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                                         WHERE contrato_servidor_especialidade_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_especialidade_funcao.cod_contrato) as max_contrato_servidor_especialidade_funcao
                                  ON max_contrato_servidor_especialidade_funcao.cod_contrato = contrato_servidor_especialidade_funcao.cod_contrato
                                 AND max_contrato_servidor_especialidade_funcao.timestamp = contrato_servidor_especialidade_funcao.timestamp
                          INNER JOIN pessoal'||stEntidade||'.especialidade
                                  ON especialidade.cod_especialidade = contrato_servidor_especialidade_funcao.cod_especialidade
                               WHERE contrato_servidor_especialidade_funcao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_especialidade_funcao  := reRegistro.cod_especialidade_funcao;
                rwContratoServidor.desc_especialidade_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_especialidade_cargo
            IF arConfiguracao[inIndex] = 'ec' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT contrato_servidor_especialidade_cargo.cod_especialidade as cod_especialidade_cargo
                                   , especialidade.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_cargo
                          INNER JOIN pessoal'||stEntidade||'.especialidade
                                  ON especialidade.cod_especialidade = contrato_servidor_especialidade_cargo.cod_especialidade
                               WHERE contrato_servidor_especialidade_cargo.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_especialidade_cargo  := reRegistro.cod_especialidade_cargo;
                rwContratoServidor.desc_especialidade_cargo := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.servidor_cid
            IF arConfiguracao[inIndex] = 'cid' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT  servidor_cid.cod_cid
                                    , servidor_cid.data_laudo
                                FROM pessoal'||stEntidade||'.servidor_cid
                          INNER JOIN (  SELECT servidor_cid.cod_servidor
                                             , max(servidor_cid.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.servidor_cid
                                         WHERE servidor_cid.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY servidor_cid.cod_servidor) as max_servidor_cid
                                  ON max_servidor_cid.cod_servidor = servidor_cid.cod_servidor
                                 AND max_servidor_cid.timestamp = servidor_cid.timestamp
                               WHERE servidor_cid.cod_servidor = '||reContratoServidor.cod_servidor;

                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_cid  := reRegistro.cod_cid;
                rwContratoServidor.data_laudo  := reRegistro.data_laudo;
                
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.servidor_conjuge
            IF arConfiguracao[inIndex] = 'con' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT servidor_conjuge.numcgm as numcgm_conjuge
                                FROM pessoal'||stEntidade||'.servidor_conjuge
                          INNER JOIN (  SELECT servidor_conjuge.cod_servidor
                                             , max(servidor_conjuge.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.servidor_conjuge
                                         WHERE servidor_conjuge.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY servidor_conjuge.cod_servidor) as max_servidor_conjuge
                                  ON max_servidor_conjuge.cod_servidor = servidor_conjuge.cod_servidor
                                 AND max_servidor_conjuge.timestamp = servidor_conjuge.timestamp
                               WHERE servidor_conjuge.bo_excluido = false
                                 AND servidor_conjuge.cod_servidor = '||reContratoServidor.cod_servidor;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.numcgm_conjuge  := reRegistro.numcgm_conjuge;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.servidor_reservista
            IF arConfiguracao[inIndex] = 'res' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT servidor_reservista.nr_carteira_res
                                   , servidor_reservista.cat_reservista
                                   , servidor_reservista.origem_reservista
                                FROM pessoal'||stEntidade||'.servidor_reservista
                               WHERE servidor_reservista.cod_servidor = '||reContratoServidor.cod_servidor;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.nr_carteira_res      := reRegistro.nr_carteira_res;
                rwContratoServidor.cat_reservista       := reRegistro.cat_reservista;
                rwContratoServidor.origem_reservista    := reRegistro.origem_reservista;
            END IF;

            --DADOS DA TABELA cgm
            IF arConfiguracao[inIndex] = 'cgm' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT sw_cgm.nom_cgm
                                   , sw_cgm_pessoa_fisica.servidor_pis_pasep
                                   , sw_cgm_pessoa_fisica.rg
                                   , cpf
                                   , sw_cgm_pessoa_fisica.dt_nascimento
                                FROM sw_cgm
                          INNER JOIN sw_cgm_pessoa_fisica
                                  ON sw_cgm_pessoa_fisica.numcgm = sw_cgm.numcgm
                               WHERE sw_cgm.numcgm = '||reContratoServidor.numcgm;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.nom_cgm              := reRegistro.nom_cgm;            
                rwContratoServidor.servidor_pis_pasep   := reRegistro.servidor_pis_pasep; 
                rwContratoServidor.rg                   := reRegistro.rg;                 
                rwContratoServidor.cpf                  := reRegistro.cpf;                
                rwContratoServidor.dt_nascimento        := reRegistro.dt_nascimento;      
            END IF;
                
            inIndex := inIndex + 1;
        END LOOP;
        inIndex := 1;

        RETURN NEXT rwContratoServidor;
    END LOOP;
END;
$$ LANGUAGE 'plpgsql';


CREATE OR REPLACE FUNCTION recuperarContratoPensionista(VARCHAR,VARCHAR,INTEGER,VARCHAR,VARCHAR,VARCHAR) RETURNS SETOF colunasContratoPensionista AS $$
DECLARE
    stConfiguracao                  ALIAS FOR $1;
    stEntidade                      ALIAS FOR $2;
    inCodPeriodoMovimentacao        ALIAS FOR $3;
    stTipoFiltro                    ALIAS FOR $4;
    stValoresFiltro                 ALIAS FOR $5;
    stExercicio                     ALIAS FOR $6;
    rwContratoPensionista           colunasContratoPensionista%ROWTYPE;
    stSql                           VARCHAR := '';
    stSqlWhere                      VARCHAR := '';
    stSqlAux                        VARCHAR;
    inCodTipoAtributo               INTEGER;
    stTimestampFechamentoPeriodo    VARCHAR;
    stCodigos                       VARCHAR;
    stContagemTempo                 VARCHAR;
    reContratoPensionista              RECORD;
    reRegistro                      RECORD;
    crCursor                        REFCURSOR;
    arConfiguracao                  VARCHAR[];
    arValoresFiltro                 VARCHAR[];
    inIndex                         INTEGER := 1;
    inCodOrganograma                INTEGER;
BEGIN
    stTimestampFechamentoPeriodo := ultimoTimestampPeriodoMovimentacao(inCodPeriodoMovimentacao,stEntidade);
    arConfiguracao := string_to_array(stConfiguracao,',');

    stSql := 'SELECT valor
                FROM administracao.configuracao
               WHERE parametro = '|| quote_literal('dtContagemInicial'||stEntidade) ||' AND exercicio = '|| quote_literal(stExercicio)||' ';
    stContagemTempo := selectIntoVarchar(stSql);

    stSql := '    SELECT contrato_pensionista.*
                       , contrato.registro
                       , pensionista.*';

    IF stTipoFiltro = 'atributo_pensionista' OR stTipoFiltro = 'atributo_pensionista_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');

        --Verifica o tipo do atributo
        --TODO - Pegar o cod_modulo e cod_cadastro vindos do parametro stValoresFiltro. atualmente so é passado o cod_atributo
        stSqlAux := 'SELECT cod_tipo FROM administracao.atributo_dinamico WHERE cod_modulo = 22 AND cod_cadastro = 7 AND cod_atributo = '||arValoresFiltro[2];
        inCodTipoAtributo := selectIntoInteger(stSqlAux);
        IF inCodTipoAtributo = 3 OR inCodTipoAtributo = 4 THEN
            stSql := stSql || ', atributo_valor_padrao.valor_padrao as valor_atributo';
        ELSE
            stSql := stSql || ', atributo_contrato_pensionista.valor as valor_atributo';
        END IF;
    ELSE
        stSql := stSql || ', ''''::varchar as valor_atributo';
    END IF;

    stSql := stSql || '
                    FROM pessoal'||stEntidade||'.contrato_pensionista
              INNER JOIN pessoal'||stEntidade||'.contrato
                      ON contrato.cod_contrato = contrato_pensionista.cod_contrato
              INNER JOIN pessoal'||stEntidade||'.pensionista
                      ON pensionista.cod_pensionista = contrato_pensionista.cod_pensionista
                     AND pensionista.cod_contrato_cedente = contrato_pensionista.cod_contrato_cedente
';

    IF stTipoFiltro = 'reg_sub_fun_esp' OR stTipoFiltro = 'reg_sub_fun_esp_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');

        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                                    ON contrato_servidor_regime_funcao.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                   AND contrato_servidor_regime_funcao.cod_regime IN ('||arValoresFiltro[1]||')
                            INNER JOIN pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                    ON contrato_servidor_sub_divisao_funcao.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                   AND contrato_servidor_sub_divisao_funcao.cod_sub_divisao IN ('||arValoresFiltro[2]||')
                            INNER JOIN pessoal'||stEntidade||'.contrato_servidor_funcao
                                    ON contrato_servidor_funcao.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                   AND contrato_servidor_funcao.cod_cargo IN ('||arValoresFiltro[3]||')';

        stSqlWhere := stSqlWhere || ' AND contrato_servidor_regime_funcao.timestamp = (  SELECT timestamp
                                                                             FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao as contrato_servidor_regime_funcao_interna
                                                                            WHERE contrato_servidor_regime_funcao_interna.cod_contrato = contrato_servidor_regime_funcao.cod_contrato
                                                                              AND contrato_servidor_regime_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                         ORDER BY timestamp desc
                                                                            LIMIT 1 )

                                      AND contrato_servidor_sub_divisao_funcao.timestamp = (  SELECT timestamp
                                                                                                FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao as contrato_servidor_sub_divisao_funcao_interna
                                                                                               WHERE contrato_servidor_sub_divisao_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                                 AND contrato_servidor_sub_divisao_funcao_interna.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                                                                            ORDER BY timestamp desc
                                                                                               LIMIT 1
                                                                                           )
                                      AND contrato_servidor_funcao.timestamp = (  SELECT timestamp
                                                                                    FROM pessoal'||stEntidade||'.contrato_servidor_funcao as contrato_servidor_funcao_interna
                                                                                   WHERE contrato_servidor_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                     AND contrato_servidor_funcao_interna.cod_contrato = contrato_servidor_funcao.cod_contrato
                                                                                ORDER BY timestamp desc
                                                                                   LIMIT 1 )';

        IF trim(arValoresFiltro[4]) != '' THEN
            stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                                        ON contrato_servidor_especialidade_funcao.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                       AND contrato_servidor_especialidade_funcao.cod_especialidade IN ('||arValoresFiltro[4]||')';

            stSqlWhere := stSqlWhere || ' AND contrato_servidor_especialidade_funcao.timestamp = ( SELECT timestamp
                                                                                                     FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao as contrato_servidor_especialidade_funcao_interna
                                                                                                    WHERE contrato_servidor_especialidade_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                                      AND contrato_servidor_especialidade_funcao_interna.cod_contrato = contrato_servidor_especialidade_funcao.cod_contrato
                                                                                                 ORDER BY timestamp desc
                                                                                                    LIMIT 1
                                                                                                  )';

        END IF;
    END IF;

    IF stTipoFiltro = 'contrato'                   OR
       stTipoFiltro = 'contrato_pensionista'       OR
       stTipoFiltro = 'contrato_todos'             OR
       stTipoFiltro = 'cgm_contrato'               OR
       stTipoFiltro = 'cgm_contrato_pensionista'   OR
       stTipoFiltro = 'cgm_contrato_todos'      THEN
        stSql := stSql || ' WHERE contrato.cod_contrato IN ('||stValoresFiltro||')';
    END IF;
    IF stTipoFiltro = 'lotacao' OR stTipoFiltro = 'lotacao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_pensionista_orgao
                                    ON contrato_pensionista_orgao.cod_contrato = contrato.cod_contrato
                                   AND contrato_pensionista_orgao.cod_orgao IN ('||stValoresFiltro||')';

        stSqlWhere := stSqlWhere || ' AND contrato_pensionista_orgao.timestamp = ( SELECT timestamp
                                                                                     FROM pessoal'||stEntidade||'.contrato_pensionista_orgao as contrato_pensionista_orgao_interna
                                                                                    WHERE contrato_pensionista_orgao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                      AND contrato_pensionista_orgao_interna.cod_contrato = contrato_pensionista_orgao.cod_contrato
                                                                                 ORDER BY timestamp desc
                                                                                    LIMIT 1
                                                                                  )';

    END IF;
    IF stTipoFiltro = 'local' OR stTipoFiltro = 'local_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_local
                                    ON contrato_servidor_local.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                   AND contrato_servidor_local.cod_local IN ('||stValoresFiltro||')';

        stSqlWhere := stSqlWhere || ' AND contrato_servidor_local.timestamp = (  SELECT timestamp
                                                                                   FROM pessoal'||stEntidade||'.contrato_servidor_local as contrato_servidor_local_interna
                                                                                  WHERE contrato_servidor_local_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                    AND contrato_servidor_local_interna.cod_contrato = contrato_servidor_local.cod_contrato
                                                                               ORDER BY timestamp desc
                                                                                  LIMIT 1
                                                                                  )';

    END IF;
--     IF stTipoFiltro = 'sub_divisao' OR stTipoFiltro = 'sub_divisao_grupo' THEN
--         stSql := stSql || ' WHERE contrato_servidor.cod_sub_divisao IN ('||stValoresFiltro||')';
--     END IF;
    IF stTipoFiltro = 'sub_divisao_funcao' OR stTipoFiltro = 'sub_divisao_funcao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                    ON contrato_servidor_sub_divisao_funcao.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                   AND contrato_servidor_sub_divisao_funcao.cod_sub_divisao IN ('||stValoresFiltro||')';

        stSqlWhere := stSqlWhere || ' AND contrato_servidor_sub_divisao_funcao.timestamp = ( SELECT timestamp
                                                                                               FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao as contrato_servidor_sub_divisao_funcao_interna
                                                                                              WHERE contrato_servidor_sub_divisao_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                                AND contrato_servidor_sub_divisao_funcao_interna.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                                                                           ORDER BY timestamp desc
                                                                                              LIMIT 1
                                                                                            )';

    END IF;

    IF stTipoFiltro = 'atributo_pensionista' OR stTipoFiltro = 'atributo_pensionista_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.atributo_contrato_pensionista
                                    ON atributo_contrato_pensionista.cod_contrato = contrato.cod_contrato
                                   AND atributo_contrato_pensionista.cod_atributo = '||arValoresFiltro[2];
        
        IF arValoresFiltro[1] = '1' THEN
            stSql := stSql || '        AND atributo_contrato_pensionista.valor IN ('||arValoresFiltro[3]||')';
        ELSE
            stSql := stSql || '        AND atributo_contrato_pensionista.valor = '''||arValoresFiltro[3]||'''';
        END IF;

        IF inCodTipoAtributo = 3 OR inCodTipoAtributo = 4 THEN
            stSql := stSql || '
                            INNER JOIN administracao.atributo_valor_padrao
                                    ON atributo_valor_padrao.cod_modulo = atributo_contrato_pensionista.cod_modulo
                                   AND atributo_valor_padrao.cod_cadastro = atributo_contrato_pensionista.cod_cadastro
                                   AND atributo_valor_padrao.cod_atributo = atributo_contrato_pensionista.cod_atributo
                                   AND atributo_valor_padrao.cod_valor = atributo_contrato_pensionista.valor';
        END IF;

        stSqlWhere := stSqlWhere || ' AND atributo_contrato_pensionista.timestamp = (  SELECT timestamp
                                                                                         FROM pessoal'||stEntidade||'.atributo_contrato_pensionista as atributo_contrato_pensionista_interna
                                                                                        WHERE atributo_contrato_pensionista.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                          AND atributo_contrato_pensionista_interna.cod_contrato = atributo_contrato_pensionista.cod_contrato
                                                                                          AND atributo_contrato_pensionista_interna.cod_atributo = atributo_contrato_pensionista.cod_atributo
                                                                                     ORDER BY timestamp desc
                                                                                        LIMIT 1
                                                                                        )';
    END IF;

    stSql := stSql||regexp_replace(stSqlWhere, '^ AND', ' WHERE');
    stSqlWhere := '';

    FOR reContratoPensionista IN EXECUTE stSql LOOP
        rwContratoPensionista.cod_contrato           := reContratoPensionista.cod_contrato;
        rwContratoPensionista.registro               := reContratoPensionista.registro;
        rwContratoPensionista.cod_contrato_cedente   := reContratoPensionista.cod_contrato_cedente;
        rwContratoPensionista.cod_dependencia        := reContratoPensionista.cod_dependencia;
        rwContratoPensionista.cod_pensionista        := reContratoPensionista.cod_pensionista;
        rwContratoPensionista.num_beneficio          := reContratoPensionista.num_beneficio;
        rwContratoPensionista.percentual_pagamento   := reContratoPensionista.percentual_pagamento;
        rwContratoPensionista.dt_inicio_beneficio    := reContratoPensionista.dt_inicio_beneficio;
        rwContratoPensionista.dt_encerramento        := reContratoPensionista.dt_encerramento;
        rwContratoPensionista.motivo_encerramento    := reContratoPensionista.motivo_encerramento;
        rwContratoPensionista.cod_profissao          := reContratoPensionista.cod_profissao;
        rwContratoPensionista.numcgm                 := reContratoPensionista.numcgm;
        rwContratoPensionista.cod_grau               := reContratoPensionista.cod_grau;

        rwContratoPensionista.valor_atributo         := reContratoPensionista.valor_atributo;

        WHILE arConfiguracao[inIndex] IS NOT NULL LOOP
            --DADOS DA TABELA pessoal.contrato_pensionista_conta_salario
            IF arConfiguracao[inIndex] = 'cs' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_pensionista_conta_salario.cod_agencia as cod_agencia_salario
                                   , contrato_pensionista_conta_salario.cod_banco as cod_banco_salario
                                   , contrato_pensionista_conta_salario.nr_conta as nr_conta_salario
                                   , banco.num_banco as num_banco_salario
                                   , banco.nom_banco as nom_banco_salario
                                   , agencia.num_agencia as num_agencia_salario
                                   , agencia.nom_agencia as nom_agencia_salario
                                FROM pessoal'||stEntidade||'.contrato_pensionista_conta_salario
                          INNER JOIN monetario.agencia
                                  ON agencia.cod_banco = contrato_pensionista_conta_salario.cod_banco
                                 AND agencia.cod_agencia = contrato_pensionista_conta_salario.cod_agencia
                          INNER JOIN monetario.banco
                                  ON banco.cod_banco = contrato_pensionista_conta_salario.cod_banco
                               WHERE contrato_pensionista_conta_salario.cod_contrato = '||reContratoPensionista.cod_contrato||'
                                 AND contrato_pensionista_conta_salario.timestamp = ( SELECT timestamp
                                                                                        FROM pessoal'||stEntidade||'.contrato_pensionista_conta_salario as contrato_pensionista_conta_salario_interna
                                                                                       WHERE contrato_pensionista_conta_salario_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                         AND contrato_pensionista_conta_salario_interna.cod_contrato = contrato_pensionista_conta_salario.cod_contrato
                                                                                    ORDER BY timestamp DESC
                                                                                       LIMIT 1 )';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_agencia_salario     := reRegistro.cod_agencia_salario;
                rwContratoPensionista.cod_banco_salario       := reRegistro.cod_banco_salario;
                rwContratoPensionista.nr_conta_salario        := reRegistro.nr_conta_salario;
                rwContratoPensionista.num_banco_salario       := reRegistro.num_banco_salario;
                rwContratoPensionista.nom_banco_salario       := reRegistro.nom_banco_salario;
                rwContratoPensionista.num_agencia_salario     := reRegistro.num_agencia_salario;
                rwContratoPensionista.nom_agencia_salario     := reRegistro.nom_agencia_salario;
            END IF;

            --DADOS DA TABELA pessoal.contrato_pensionista_previdencia
            IF arConfiguracao[inIndex] = 'pr' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_pensionista_previdencia.cod_previdencia
                                FROM pessoal'||stEntidade||'.contrato_pensionista_previdencia
                               WHERE contrato_pensionista_previdencia.timestamp = (  SELECT timestamp
                                                                                       FROM pessoal'||stEntidade||'.contrato_pensionista_previdencia as contrato_pensionista_previdencia_interna
                                                                                      WHERE contrato_pensionista_previdencia_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                        AND contrato_pensionista_previdencia_interna.cod_contrato = contrato_pensionista_previdencia.cod_contrato
                                                                                   ORDER BY timestamp DESC
                                                                                      LIMIT 1 )
                                 AND contrato_pensionista_previdencia.cod_contrato = '||reContratoPensionista.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_previdencia  := reRegistro.cod_previdencia;
            END IF;

            --DADOS DA TABELA pessoal.contrato_pensionista_processo
            IF arConfiguracao[inIndex] = 'pro' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_pensionista_processo.cod_processo
                                FROM pessoal'||stEntidade||'.contrato_pensionista_processo
                               WHERE contrato_pensionista_processo.cod_contrato = '||reContratoPensionista.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_processo  := reRegistro.cod_processo;
            END IF;

            --DADOS DA TABELA pessoal.contrato_pensionista_orgao
            IF arConfiguracao[inIndex] = 'o' OR arConfiguracao[inIndex] = 'oo' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_pensionista_orgao.cod_orgao
                                   , recuperadescricaoorgao(contrato_pensionista_orgao.cod_orgao,'''||stTimestampFechamentoPeriodo||''') as descricao
                                FROM pessoal'||stEntidade||'.contrato_pensionista_orgao
                               WHERE contrato_pensionista_orgao.cod_contrato = '||reContratoPensionista.cod_contrato||'
                                 AND contrato_pensionista_orgao.timestamp = ( SELECT timestamp
                                                                                FROM pessoal'||stEntidade||'.contrato_pensionista_orgao as contrato_pensionista_orgao_interna
                                                                               WHERE contrato_pensionista_orgao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                 AND contrato_pensionista_orgao_interna.cod_contrato = contrato_pensionista_orgao.cod_contrato
                                                                            ORDER BY timestamp DESC
                                                                               LIMIT 1 )';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_orgao  := reRegistro.cod_orgao;
                rwContratoPensionista.desc_orgao := reRegistro.descricao;

                --DADOS DA TABELA organograma.fn_consulta_orgao
                IF arConfiguracao[inIndex] = 'oo' OR arConfiguracao[inIndex] = 'all' THEN
                    inCodOrganograma := selectIntoInteger('SELECT cod_organograma FROM organograma.orgao_nivel WHERE cod_orgao = '||reRegistro.cod_orgao);
                    stSql := 'SELECT organograma.fn_consulta_orgao('||inCodOrganograma||','||reRegistro.cod_orgao||')';
                    rwContratoPensionista.orgao := selectIntoVarchar(stSql);
                END IF;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_local
            IF arConfiguracao[inIndex] = 'l' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_local.cod_local
                                   , local.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_local
                          INNER JOIN organograma.local
                                  ON local.cod_local = contrato_servidor_local.cod_local
                               WHERE contrato_servidor_local.cod_contrato = '||reContratoPensionista.cod_contrato_cedente||'
                                 AND contrato_servidor_local.timestamp = ( SELECT timestamp
                                                                             FROM pessoal'||stEntidade||'.contrato_servidor_local as contrato_servidor_local_interna
                                                                            WHERE contrato_servidor_local_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                              AND contrato_servidor_local_interna.cod_contrato = contrato_servidor_local.cod_contrato
                                                                         ORDER BY timestamp DESC
                                                                            LIMIT 1 ) ';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_local  := reRegistro.cod_local;
                rwContratoPensionista.desc_local := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal.pensionista_cid
            IF arConfiguracao[inIndex] = 'cid' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT pensionista_cid.cod_cid
                                   , pensionista_cid.data_laudo
                                FROM pessoal'||stEntidade||'.pensionista_cid
                               WHERE pensionista_cid.cod_pensionista = '||reContratoPensionista.cod_pensionista;
                
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                
                rwContratoPensionista.cod_cid  := reRegistro.cod_cid;
                rwContratoPensionista.data_laudo  := reRegistro.data_laudo;
            END IF;

            --DADOS DA TABELA cgm
            IF arConfiguracao[inIndex] = 'cgm' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT sw_cgm.nom_cgm
                                   , sw_cgm_pessoa_fisica.servidor_pis_pasep
                                   , sw_cgm_pessoa_fisica.rg
                                   , cpf
                                   , sw_cgm_pessoa_fisica.dt_nascimento
                                FROM sw_cgm
                          INNER JOIN sw_cgm_pessoa_fisica
                                  ON sw_cgm_pessoa_fisica.numcgm = sw_cgm.numcgm
                               WHERE sw_cgm.numcgm = '||reContratoPensionista.numcgm;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.nom_cgm              := reRegistro.nom_cgm;
                rwContratoPensionista.rg                   := reRegistro.rg;
                rwContratoPensionista.cpf                  := reRegistro.cpf;
                rwContratoPensionista.dt_nascimento        := reRegistro.dt_nascimento;
            END IF;

            --################################################################
            --Daqui pra baixo pega informações do servidor
            --através do cod_contrato_cedente

            --DADOS DA TABELA pessoal.contrato_servidor_regime_funcao
            IF arConfiguracao[inIndex] = 'rf' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_regime_funcao.cod_regime as cod_regime_funcao
                                   , regime.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                          INNER JOIN pessoal'||stEntidade||'.regime
                                  ON regime.cod_regime = contrato_servidor_regime_funcao.cod_regime
                               WHERE contrato_servidor_regime_funcao.cod_contrato = '||reContratoPensionista.cod_contrato_cedente||'
                                 AND contrato_servidor_regime_funcao.timestamp = ( SELECT timestamp
                                                                                   FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao as contrato_servidor_regime_funcao_interna
                                                                                  WHERE contrato_servidor_regime_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                    AND contrato_servidor_regime_funcao_interna.cod_contrato = contrato_servidor_regime_funcao.cod_contrato
                                                                               ORDER BY timestamp DESC
                                                                                  LIMIT 1 )';
                                                                                  
                raise notice '%', stSql;
                
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_regime_funcao  := reRegistro.cod_regime_funcao;
                rwContratoPensionista.desc_regime_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal.contrato_servidor_sub_divisao_funcao
            IF arConfiguracao[inIndex] = 'sf' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_sub_divisao_funcao.cod_sub_divisao as cod_sub_divisao_funcao
                                   , sub_divisao.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                          INNER JOIN pessoal'||stEntidade||'.sub_divisao
                                  ON sub_divisao.cod_sub_divisao = contrato_servidor_sub_divisao_funcao.cod_sub_divisao
                               WHERE contrato_servidor_sub_divisao_funcao.cod_contrato = '||reContratoPensionista.cod_contrato_cedente||'
                                 AND contrato_servidor_sub_divisao_funcao.timestamp = ( SELECT timestamp
                                                                                          FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao as contrato_servidor_sub_divisao_funcao_interna
                                                                                         WHERE contrato_servidor_sub_divisao_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                           AND contrato_servidor_sub_divisao_funcao_interna.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                                                                      ORDER BY timestamp DESC
                                                                                         LIMIT 1 ) ';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_sub_divisao_funcao  := reRegistro.cod_sub_divisao_funcao;
                rwContratoPensionista.desc_sub_divisao_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal.contrato_servidor_funcao
            IF arConfiguracao[inIndex] = 'f' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_funcao.cod_cargo as cod_funcao
                                   , cargo.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_funcao
                          INNER JOIN pessoal'||stEntidade||'.cargo
                                  ON cargo.cod_cargo = contrato_servidor_funcao.cod_cargo
                               WHERE contrato_servidor_funcao.cod_contrato = '||reContratoPensionista.cod_contrato_cedente||'
                                 AND contrato_servidor_funcao.timestamp = ( SELECT timestamp
                                                                              FROM pessoal'||stEntidade||'.contrato_servidor_funcao as contrato_servidor_funcao_interna
                                                                             WHERE contrato_servidor_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                               AND contrato_servidor_funcao_interna.cod_contrato = contrato_servidor_funcao.cod_contrato
                                                                          ORDER BY timestamp DESC
                                                                             LIMIT 1 )';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_funcao  := reRegistro.cod_funcao;
                rwContratoPensionista.desc_funcao := reRegistro.descricao;


                stSql := ' SELECT * FROM
                         (   SELECT cargo.cod_cargo
                                 , cbo.codigo as cbo_codigo
                                 , cargo.descricao
                              FROM pessoal'||stEntidade||'.cargo
                                 , pessoal'||stEntidade||'.cbo_cargo
                                 , pessoal'||stEntidade||'.cbo
                             WHERE cargo.cod_cargo = cbo_cargo.cod_cargo
                               AND cbo_cargo.timestamp = ( SELECT timestamp
                                                             FROM pessoal'||stEntidade||'.cbo_cargo as cbo_cargo_interna
                                                            WHERE cbo_cargo_interna.cod_cargo = cbo_cargo.cod_cargo
                                                         ORDER BY timestamp desc
                                                            LIMIT 1 )
                               AND cbo_cargo.cod_cbo = cbo.cod_cbo
                            UNION
                            SELECT cargo.cod_cargo
                                 , cbo.codigo as cbo_codigo
                                 , cargo.descricao
                              FROM pessoal'||stEntidade||'.cargo
                                 , pessoal'||stEntidade||'.especialidade
                                 , pessoal'||stEntidade||'.cbo_especialidade
                                 , pessoal'||stEntidade||'.cbo
                             WHERE cargo.cod_cargo = especialidade.cod_cargo
                               AND especialidade.cod_especialidade = cbo_especialidade.cod_especialidade
                               AND cbo_especialidade.timestamp = (  SELECT timestamp
                                                                      FROM pessoal'||stEntidade||'.cbo_especialidade as cbo_especialidade_interna
                                                                     WHERE cbo_especialidade_interna.cod_especialidade = cbo_especialidade.cod_especialidade
                                                                  ORDER BY timestamp desc
                                                                      LIMIT 1 )
                               AND cbo_especialidade.cod_cbo = cbo.cod_cbo) as funcao
                    WHERE funcao.cod_cargo = '||reRegistro.cod_funcao;


                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.desc_cbo_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal.contrato_servidor_especialidade_funcao
            IF arConfiguracao[inIndex] = 'ef' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_especialidade_funcao.cod_especialidade as cod_especialidade_funcao
                                   , especialidade.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                          INNER JOIN pessoal'||stEntidade||'.especialidade
                                  ON especialidade.cod_especialidade = contrato_servidor_especialidade_funcao.cod_especialidade
                               WHERE contrato_servidor_especialidade_funcao.cod_contrato = '||reContratoPensionista.cod_contrato_cedente||'
                                 AND contrato_servidor_especialidade_funcao.timestamp = ( SELECT timestamp
                                                                                          FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao as contrato_servidor_especialidade_funcao_interna
                                                                                         WHERE contrato_servidor_especialidade_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                           AND contrato_servidor_especialidade_funcao_interna.cod_contrato = contrato_servidor_especialidade_funcao.cod_contrato
                                                                                           ORDER BY timestamp desc
                                                                                           LIMIT 1
                                                                                       )';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_especialidade_funcao  := reRegistro.cod_especialidade_funcao;
                rwContratoPensionista.desc_especialidade_funcao := reRegistro.descricao;
            END IF;


            inIndex := inIndex + 1;
        END LOOP;
        inIndex := 1;

        RETURN NEXT rwContratoPensionista;
    END LOOP;
END;
$$ LANGUAGE 'plpgsql';


----------------
-- Ticket #19512
----------------

CREATE OR REPLACE FUNCTION manutencao() RETURNS VOID AS $$
DECLARE

BEGIN
    PERFORM 1
       FROM pg_type
      WHERE typname = 'novoRelatorioFichaFinanceira';
    IF FOUND THEN
        DROP TYPE novoRelatorioFichaFinanceira CASCADE;
    END IF;

    CREATE TYPE novoRelatorioFichaFinanceira AS (
        cod_periodo_movimentacao    INTEGER,
        cod_configuracao            INTEGER,
        cod_complementar            INTEGER,
        descricao_periodo           VARCHAR,
        descricao_configuracao      VARCHAR,
        codigo_evento               VARCHAR,
        descricao_evento            VARCHAR,
        natureza_evento             VARCHAR,
        desdobramento               VARCHAR,
        quantidade                  NUMERIC,
        proventos                   NUMERIC,
        descontos                   NUMERIC,
        valor                       NUMERIC,
        ordem_por_natureza          INTEGER
    );

END;
$$ LANGUAGE 'plpgsql';
SELECT        manutencao();
DROP FUNCTION manutencao();


---------------------------------------------------------
-- CORRECAO DE PK EM folhapagamento.atributo_padrao_valor
---------------------------------------------------------

ALTER TABLE folhapagamento.atributo_padrao_valor DROP CONSTRAINT [REDACTED]
ALTER TABLE folhapagamento.atributo_padrao_valor ADD  CONSTRAINT [REDACTED]PRIMARY KEY (cod_modulo, cod_cadastro, cod_atributo, cod_padrao, timestamp_padrao);

