exportarArquivoIpers.plsql 32.1 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
/*
    **********************************************************************************
    *                                                                                *
    * @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.       *
    *                                                                                *
    **********************************************************************************
*/
/**
    * PLpgsql Arquivo IPE/RS
    * Data de Criação: 01/07/2008
    
    
    * @author Analista: Dagiane Vieira  
    * @author Desenvolvedor: Rafael Garbin
    
    * @ignore
   
    $Id: $
   
    * Casos de uso: uc-04.08.28

*/

DROP TYPE colunasArquivoIpers CASCADE;

CREATE TYPE colunasArquivoIpers AS (
    registro                    INTEGER,
    nom_cgm                     VARCHAR,
    cpf                         VARCHAR,
    rg                          VARCHAR,
    sexo                        VARCHAR,    
    orgao                       VARCHAR,
    matricula_ipe               VARCHAR,
    dt_ingresso                 VARCHAR,
    dt_situacao                 DATE,
    dt_nascimento               DATE,
    cod_estado_civil            INTEGER,
    logradouro                  VARCHAR,
    cep                         VARCHAR,                                                                   
    situacao                    INTEGER,    
    valor                       VARCHAR                                                                   
);

CREATE OR REPLACE FUNCTION exportarArquivoIpers(INTEGER,VARCHAR,VARCHAR,VARCHAR,VARCHAR,VARCHAR,INTEGER,INTEGER,VARCHAR,INTEGER, BOOLEAN) RETURNS SETOF colunasArquivoIpers AS $$
DECLARE
    inCodPeriodoMovimentacao    ALIAS FOR $1;
    stEntidade                  ALIAS FOR $2;
    stExercicio                 ALIAS FOR $3;
    stTipoFiltro                ALIAS FOR $4;
    stValoresFiltro             ALIAS FOR $5;
    stSituacaoCadastro          ALIAS FOR $6;
    inCodTipoEmissao            ALIAS FOR $7;
    inFolha                     ALIAS FOR $8;
    stDesdobramento             ALIAS FOR $9;
    inCodComplementar           ALIAS FOR $10;
    boAgruparFolhas             ALIAS FOR $11;

    stSql                       VARCHAR := '';
    stSqlAux                    VARCHAR := '';
    stFiltroServidor            VARCHAR := '';
    stFiltroPadraoServidor      VARCHAR := '';
    stFiltroPensionista         VARCHAR := '';
    stFiltroRescindidos         VARCHAR := '';
    stServidor                  VARCHAR := '';
    stPensionista               VARCHAR := '';
    stNomeTabela                VARCHAR := '';
    stSituacaoContratoServidor  VARCHAR := '';
    inSituacao                  INTEGER := NULL;
    dtSituacao                  DATE;
    nuValorEventoIPECalculado   NUMERIC(14,2);

    rwIPE                       colunasArquivoIpers%ROWTYPE;
    reRegistro                  RECORD;
    reConfiguracao              RECORD;    
    rePeriodoMovimentacao       RECORD;    
    crCursor                    REFCURSOR;   

BEGIN
    -- Buscando os dados da configuração do IPE
    stSql := ' SELECT configuracao_ipe.*
                    , configuracao_ipe_pensionista.cod_atributo_data as cod_atributo_data_pen
                    , configuracao_ipe_pensionista.cod_modulo_data   as cod_modulo_data_pen
                    , configuracao_ipe_pensionista.cod_cadastro_data as cod_cadastro_data_pen
                    , configuracao_ipe_pensionista.cod_atributo_mat  as cod_atributo_mat_pen
                    , configuracao_ipe_pensionista.cod_modulo_mat    as cod_modulo_mat_pen
                    , configuracao_ipe_pensionista.cod_cadastro_mat  as cod_cadastro_mat_pen         
                 FROM folhapagamento'|| stEntidade ||'.configuracao_ipe
            LEFT JOIN folhapagamento'|| stEntidade ||'.configuracao_ipe_pensionista
                   ON configuracao_ipe.cod_configuracao = configuracao_ipe_pensionista.cod_configuracao
                  AND configuracao_ipe.vigencia = configuracao_ipe_pensionista.vigencia
                    , ( SELECT max(cod_configuracao) as cod_configuracao
                             , vigencia
                         FROM folhapagamento'|| stEntidade ||'.configuracao_ipe
                      GROUP BY vigencia) as max_configuracao_ipe
                WHERE configuracao_ipe.cod_configuracao = max_configuracao_ipe.cod_configuracao
                  AND configuracao_ipe.vigencia = max_configuracao_ipe.vigencia
                  AND configuracao_ipe.vigencia <= ( SELECT dt_final
                                                       FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                                      WHERE cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||') 
             ORDER BY configuracao_ipe.vigencia desc
                LIMIT 1';    

    -- Recuperando dados da configuração do IPE
    OPEN crCursor FOR EXECUTE stSql;
        FETCH crCursor INTO reConfiguracao;
    CLOSE crCursor;

    /**** Monta Filtro de situação ****/
    IF trim(stSituacaoCadastro) = 'ativos' THEN
        stSituacaoContratoServidor := 'A';
    END IF;

    IF trim(stSituacaoCadastro) = 'aposentados' THEN
        stSituacaoContratoServidor := 'P';
    END IF;

    -- Monta Filtros dos rescindidos!
    IF trim(stSituacaoCadastro) = 'rescindidos' OR trim(stSituacaoCadastro) = 'todos' THEN
        stNomeTabela := 'temp_rescindidos';
        IF trim(stSituacaoCadastro) = 'rescindidos' THEN
            stNomeTabela := 'temp_table';
            stSituacaoContratoServidor := 'R';    
        END IF;

        stFiltroServidor := ' AND EXISTS ( SELECT 1
                                             FROM pessoal'|| stEntidade ||'.contrato_servidor_caso_causa
                                            WHERE contrato_servidor_caso_causa.cod_contrato = '|| stNomeTabela ||'.cod_contrato
                                              AND dt_rescisao BETWEEN 
                                                   ( SELECT dt_inicial
                                                       FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                                      WHERE cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||'
                                                   )
                                                   AND 
                                                   ( SELECT dt_final
                                                       FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                                      WHERE cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||')
                                          ) ';
        stFiltroRescindidos := stFiltroServidor;
        IF trim(stSituacaoCadastro) = 'todos' THEN
            stFiltroServidor := '';
        END IF;
    END IF;

    -- Monta Filtros do pensionista!
    IF trim(stSituacaoCadastro) = 'pensionistas' OR trim(stSituacaoCadastro) = 'todos' THEN
        stNomeTabela := 'temp_pensionistas';
        IF trim(stSituacaoCadastro) = 'pensionistas' THEN
            stNomeTabela := 'temp_table';
            stSituacaoContratoServidor := 'E';    
        END IF;

        stFiltroPensionista := ' AND EXISTS ( SELECT 1
                                                FROM pessoal'|| stEntidade ||'.contrato_pensionista
                                               WHERE contrato_pensionista.cod_contrato = '|| stNomeTabela ||'.cod_contrato
                                                 AND (contrato_pensionista.dt_encerramento is null OR to_char(dt_encerramento,'||quote_literal('yyyy-mm-dd')||')::date BETWEEN 
                                                       ( SELECT dt_inicial
                                                           FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                                          WHERE cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||'
                                                       )
                                                       AND 
                                                       ( SELECT dt_final
                                                           FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                                          WHERE cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||'
                                                       )
                                                     )
                                              )';    
    END IF;


    /* Inicia consulta principal */
    IF stSituacaoCadastro = 'ativos' OR
       stSituacaoCadastro = 'aposentados' OR
       stSituacaoCadastro = 'rescindidos' OR
       stSituacaoCadastro = 'todos' THEN    
        -- Monta consulta para os servidores
        stServidor := '
                  SELECT contrato.registro
                       , contrato.cod_contrato
                       , contrato.nom_cgm
                       , contrato.cpf
                       , contrato.rg
                       , contrato.dt_nascimento
                       , replace(atributo_matricula_ipe.valor, '' '', '''') as matricula_ipe
                       , to_date(atributo_data_ipe.valor,''dd/mm/yyyy'') as data_ipe
                       , recuperarSituacaoDoContrato(contrato.cod_contrato, '|| inCodPeriodoMovimentacao ||', '|| quote_literal(stEntidade) ||') as situacao_contrato
                       , lpad(trim(sw_cgm.cep),8,''0'') as cep
                       , sw_cgm_pessoa_fisica.sexo
                       , (sw_cgm.logradouro || '' '' || sw_cgm.numero) as logradouro
                       , servidor.cod_estado_civil
                    FROM recuperarContratoServidor(''cgm''
                                                  , '|| quote_literal(stEntidade) ||'
                                                  , '|| inCodPeriodoMovimentacao ||'
                                                  , '|| quote_literal(stTipoFiltro) ||'
                                                  , '|| quote_literal(stValoresFiltro) ||'
                                                  , '|| quote_literal(stExercicio) ||') as contrato
              INNER JOIN ( SELECT atributo_contrato_servidor_valor.*                                                        
                             FROM pessoal'|| stEntidade ||'.atributo_contrato_servidor_valor                        
                                , (SELECT cod_contrato  
                                        , cod_atributo
                                        , cod_cadastro
                                        , cod_modulo
                                        , max(timestamp) as timestamp                                                       
                                    FROM pessoal'|| stEntidade ||'.atributo_contrato_servidor_valor                
                                GROUP BY cod_contrato, cod_atributo, cod_cadastro, cod_modulo) as max_atributo_contrato_servidor_valor                           
                          WHERE atributo_contrato_servidor_valor.cod_contrato = max_atributo_contrato_servidor_valor.cod_contrato
						    AND atributo_contrato_servidor_valor.cod_atributo = max_atributo_contrato_servidor_valor.cod_atributo
                            AND atributo_contrato_servidor_valor.cod_cadastro = max_atributo_contrato_servidor_valor.cod_cadastro
                            AND atributo_contrato_servidor_valor.cod_modulo = max_atributo_contrato_servidor_valor.cod_modulo
                            AND atributo_contrato_servidor_valor.timestamp = max_atributo_contrato_servidor_valor.timestamp
                            AND trim(atributo_contrato_servidor_valor.valor) != '''') as atributo_matricula_ipe
                     ON contrato.cod_contrato = atributo_matricula_ipe.cod_contrato                                       
                    AND atributo_matricula_ipe.cod_atributo = '|| reConfiguracao.cod_atributo_mat ||'
                    AND atributo_matricula_ipe.cod_cadastro = '|| reConfiguracao.cod_cadastro_mat ||'                      
                    AND atributo_matricula_ipe.cod_modulo   = '|| reConfiguracao.cod_modulo_mat ||'                        
             INNER JOIN ( SELECT atributo_contrato_servidor_valor.*                                                        
                            FROM pessoal'|| stEntidade ||'.atributo_contrato_servidor_valor                        
                                , (SELECT cod_contrato 
								        , cod_atributo
                                        , cod_cadastro
                                        , cod_modulo			
                                        , max(timestamp) as timestamp                                                       
                                    FROM pessoal'|| stEntidade ||'.atributo_contrato_servidor_valor                
                                GROUP BY cod_contrato, cod_atributo, cod_cadastro, cod_modulo) as max_atributo_contrato_servidor_valor                           
                          WHERE atributo_contrato_servidor_valor.cod_contrato = max_atributo_contrato_servidor_valor.cod_contrato
						    AND atributo_contrato_servidor_valor.cod_atributo = max_atributo_contrato_servidor_valor.cod_atributo
                            AND atributo_contrato_servidor_valor.cod_cadastro = max_atributo_contrato_servidor_valor.cod_cadastro
                            AND atributo_contrato_servidor_valor.cod_modulo = max_atributo_contrato_servidor_valor.cod_modulo
                            AND atributo_contrato_servidor_valor.timestamp = max_atributo_contrato_servidor_valor.timestamp
                            AND trim(atributo_contrato_servidor_valor.valor) != '''') as atributo_data_ipe
                     ON contrato.cod_contrato = atributo_data_ipe.cod_contrato                                            
                    AND atributo_data_ipe.cod_atributo = '|| reConfiguracao.cod_atributo_data ||'                          
                    AND atributo_data_ipe.cod_cadastro = '|| reConfiguracao.cod_cadastro_data ||'                          
                    AND atributo_data_ipe.cod_modulo   = '|| reConfiguracao.cod_modulo_data ||'
             INNER JOIN sw_cgm
                     ON contrato.numcgm = sw_cgm.numcgm
             INNER JOIN sw_cgm_pessoa_fisica
                     ON sw_cgm_pessoa_fisica.numcgm = sw_cgm.numcgm
             INNER JOIN pessoal'|| stEntidade ||'.servidor
                     ON servidor.cod_servidor = contrato.cod_servidor
            '; -- Fim da consulta do servidor
    END IF;      
    

    IF (trim(stSituacaoCadastro) = 'pensionistas' OR trim(stSituacaoCadastro) = 'todos') AND 
       reConfiguracao.cod_atributo_mat_pen IS NOT NULL THEN
        -- Monta consulta para os pensionistas
        stPensionista := '
                  SELECT contrato_pensionista.registro
                       , contrato_pensionista.cod_contrato
                       , contrato_pensionista.nom_cgm
                       , contrato_pensionista.cpf
                       , contrato_pensionista.rg
                       , contrato_pensionista.dt_nascimento
                       , replace(atributo_matricula_ipe.valor, '' '', '''') as matricula_ipe
                       , to_date(atributo_data_ipe.valor,''dd/mm/yyyy'') as data_ipe
                       , recuperarSituacaoDoContrato(contrato_pensionista.cod_contrato, '|| inCodPeriodoMovimentacao ||', '|| quote_literal(stEntidade) ||') as situacao_contrato
                       , lpad(trim(sw_cgm.cep),8,''0'') as cep
                       , sw_cgm_pessoa_fisica.sexo
                       , (sw_cgm.logradouro || '' '' || sw_cgm.numero) as logradouro
                       , 0 as cod_estado_civil
                    FROM recuperarContratoPensionista(''cgm''
                                                , '|| quote_literal(stEntidade) ||'
                                                , '|| inCodPeriodoMovimentacao ||'
                                                , '|| quote_literal(stTipoFiltro) ||'
                                                , '|| quote_literal(stValoresFiltro) ||'
                                                , '|| quote_literal(stExercicio) ||') as contrato_pensionista
              INNER JOIN ( SELECT atributo_contrato_pensionista.*                                                        
                             FROM pessoal'|| stEntidade ||'.atributo_contrato_pensionista                        
                                , ( SELECT cod_contrato
                                         , cod_atributo
                                         , cod_cadastro
                                         , cod_modulo			
                                         , max(timestamp) as timestamp                                                       
                                      FROM pessoal'|| stEntidade ||'.atributo_contrato_pensionista                
                                  GROUP BY cod_contrato,cod_atributo, cod_cadastro, cod_modulo ) as max_atributo_contrato_pensionista                           
                            WHERE atributo_contrato_pensionista.cod_contrato = max_atributo_contrato_pensionista.cod_contrato
							  AND atributo_contrato_pensionista.cod_atributo = max_atributo_contrato_pensionista.cod_atributo
                              AND atributo_contrato_pensionista.cod_cadastro = max_atributo_contrato_pensionista.cod_cadastro
                              AND atributo_contrato_pensionista.cod_modulo = max_atributo_contrato_pensionista.cod_modulo
                              AND atributo_contrato_pensionista.timestamp = max_atributo_contrato_pensionista.timestamp
                              AND trim(atributo_contrato_pensionista.valor) != '''') as atributo_matricula_ipe
                      ON contrato_pensionista.cod_contrato = atributo_matricula_ipe.cod_contrato                                       
                     AND atributo_matricula_ipe.cod_atributo = '|| reConfiguracao.cod_atributo_mat_pen ||'
                     AND atributo_matricula_ipe.cod_cadastro = '|| reConfiguracao.cod_cadastro_mat_pen ||'
                     AND atributo_matricula_ipe.cod_modulo   = '|| reConfiguracao.cod_modulo_mat_pen ||'
              INNER JOIN ( SELECT atributo_contrato_pensionista.*
                             FROM pessoal'|| stEntidade ||'.atributo_contrato_pensionista
                                , ( SELECT cod_contrato
								         , cod_atributo
                                         , cod_cadastro
                                         , cod_modulo
                                         , max(timestamp) as timestamp
                                      FROM pessoal'|| stEntidade ||'.atributo_contrato_pensionista                
                                  GROUP BY cod_contrato, cod_atributo, cod_cadastro, cod_modulo) as max_atributo_contrato_pensionista                           
                            WHERE atributo_contrato_pensionista.cod_contrato = max_atributo_contrato_pensionista.cod_contrato
                              AND atributo_contrato_pensionista.cod_atributo = max_atributo_contrato_pensionista.cod_atributo
                              AND atributo_contrato_pensionista.cod_cadastro = max_atributo_contrato_pensionista.cod_cadastro
                              AND atributo_contrato_pensionista.cod_modulo = max_atributo_contrato_pensionista.cod_modulo
							  AND atributo_contrato_pensionista.timestamp = max_atributo_contrato_pensionista.timestamp
                              AND trim(atributo_contrato_pensionista.valor) != '''') as atributo_data_ipe
                      ON contrato_pensionista.cod_contrato = atributo_data_ipe.cod_contrato                                            
                     AND atributo_data_ipe.cod_atributo = '|| reConfiguracao.cod_atributo_data_pen ||'                          
                     AND atributo_data_ipe.cod_cadastro = '|| reConfiguracao.cod_cadastro_data_pen ||'                          
                     AND atributo_data_ipe.cod_modulo   = '|| reConfiguracao.cod_modulo_data_pen ||'
              INNER JOIN sw_cgm
                      ON contrato_pensionista.numcgm = sw_cgm.numcgm
              INNER JOIN sw_cgm_pessoa_fisica
                      ON sw_cgm_pessoa_fisica.numcgm = sw_cgm.numcgm
        ';

    END IF; -- Fim da consulta do pensionista

    -- Caso tipo de emissão FOR Inclusão ou Acerto de Inclusão
    -- Data de inicio do IPERS deve estar contida na competencia
    IF inCodTipoEmissao IN (3,4) THEN 
        -- Busca periodo inicial e final da competencia
        stSqlAux := ' SELECT *
                        FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                       WHERE cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao;

        OPEN crCursor FOR EXECUTE stSqlAux;
            FETCH crCursor INTO rePeriodoMovimentacao;
        CLOSE crCursor;             
        
        stFiltroServidor := stFiltroServidor || ' AND data_ipe BETWEEN '|| quote_literal(rePeriodoMovimentacao.dt_inicial) ||' AND '|| quote_literal(rePeriodoMovimentacao.dt_final) ||' AND abs(matricula_ipe::numeric) = 0';
    ELSE
        stFiltroServidor := stFiltroServidor || ' AND abs(matricula_ipe::numeric) > 0';
    END IF;
    
    stFiltroPensionista := stFiltroPensionista || stFiltroServidor;
    stFiltroRescindidos := stFiltroRescindidos || stFiltroServidor;
    stFiltroPadraoServidor := stFiltroPadraoServidor || stFiltroServidor;
    
    IF trim(stSituacaoContratoServidor) != '' AND  trim(stSituacaoCadastro) != 'todos' THEN
        IF trim(stServidor) != '' THEN
            stSql := 'SELECT *
                        FROM ( '|| stServidor|| ') as temp_table
                       WHERE recuperarSituacaoDoContrato(cod_contrato, '|| inCodPeriodoMovimentacao ||', '|| quote_literal(stEntidade) ||') = '|| quote_literal(stSituacaoContratoServidor) ||'
                        '|| stFiltroServidor;
        ELSE
            stSql := 'SELECT *
                        FROM ( '|| stPensionista|| ') as temp_table
                       WHERE recuperarSituacaoDoContrato(cod_contrato, '|| inCodPeriodoMovimentacao ||', '|| quote_literal(stEntidade) ||') = '|| quote_literal(stSituacaoContratoServidor) ||'
                        '|| stFiltroPensionista;
        END IF;
    ELSE
        stSql := '
                  SELECT *
                    FROM ( '|| stServidor|| ') as temp_ativos
                   WHERE recuperarSituacaoDoContrato(temp_ativos.cod_contrato, '|| inCodPeriodoMovimentacao ||', '|| quote_literal(stEntidade) ||') = ''A''      
                         '|| stFiltroPadraoServidor ||'
               UNION ALL 
                  SELECT *
                    FROM ( '|| stServidor|| ') as temp_aposentados
                   WHERE recuperarSituacaoDoContrato(temp_aposentados.cod_contrato, '|| inCodPeriodoMovimentacao ||', '|| quote_literal(stEntidade) ||') = ''P''      
                         '|| stFiltroPadraoServidor ||'
               UNION ALL 
                  SELECT *
                    FROM ( '|| stServidor|| ') as temp_rescindidos
                   WHERE recuperarSituacaoDoContrato(temp_rescindidos.cod_contrato, '|| inCodPeriodoMovimentacao ||', '|| quote_literal(stEntidade) ||') = ''R''
                        '|| stFiltroPadraoServidor ||'
                        '|| stFiltroRescindidos ||'   
                ';
                
        IF reConfiguracao.cod_atributo_mat_pen IS NOT NULL THEN
            stSql := stSql ||'
                   UNION ALL 
                      SELECT *
                        FROM ( '|| stPensionista|| ') as temp_pensionistas
                       WHERE recuperarSituacaoDoContrato(temp_pensionistas.cod_contrato, '|| inCodPeriodoMovimentacao ||', '|| quote_literal(stEntidade) ||') = ''E''
                            '|| stFiltroPensionista ||'            
                    ';
        END IF;
    END IF;    
    /*** PERCORRENDO A CONSULTA PRINCIPAL ***/
    FOR reRegistro IN EXECUTE stSql LOOP
        dtSituacao := NULL;

        /* Busca situação do contrato */
        IF reRegistro.situacao_contrato = 'A' THEN
            inSituacao := 10;
        END IF;
    
        IF reRegistro.situacao_contrato = 'P' THEN
            inSituacao := 11;
        END IF;
    
        IF stSituacaoCadastro = 'E' THEN
            inSituacao := 39;
        END IF;

        IF reRegistro.situacao_contrato = 'R' THEN
            -- Busca a data do falecimento
            stSql := ' SELECT 31 as situacao
                            , dt_rescisao
                         FROM pessoal'|| stEntidade ||'.contrato_servidor_caso_causa
                            , pessoal'|| stEntidade ||'.caso_causa
                            , pessoal'|| stEntidade ||'.causa_rescisao
                        WHERE cod_contrato = '|| reRegistro.cod_contrato ||'
                          AND contrato_servidor_caso_causa.cod_caso_causa = caso_causa.cod_caso_causa
                          AND caso_causa.cod_causa_rescisao = causa_rescisao.cod_causa_rescisao
                          AND causa_rescisao.num_causa = 60';

                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO inSituacao,dtSituacao;
                CLOSE crCursor;   

            IF inSituacao IS NULL THEN 
                -- Busca a data da rescisão
                stSql := ' SELECT 30 as situacao
                                , dt_rescisao
                            FROM pessoal'|| stEntidade ||'.contrato_servidor_caso_causa
                                , pessoal'|| stEntidade ||'.caso_causa
                                , pessoal'|| stEntidade ||'.causa_rescisao
                            WHERE cod_contrato = '|| reRegistro.cod_contrato ||'
                              AND contrato_servidor_caso_causa.cod_caso_causa = caso_causa.cod_caso_causa
                              AND caso_causa.cod_causa_rescisao = causa_rescisao.cod_causa_rescisao
                              AND causa_rescisao.num_causa != 60';
    
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO inSituacao,dtSituacao;
                CLOSE crCursor;         

            END IF;              
        END IF;

        -- Caso não tenha sido falecido ou rescindido, retorna data do ipe
        IF dtSituacao IS NULL THEN 
            dtSituacao := reRegistro.data_ipe;
        END IF;

        /*** INICIO: Busca o valor de desconto do evento IPE do contrato ***/
        IF boAgruparFolhas IS TRUE THEN
            stSql := '
                      SELECT sum(tabela_teste.valor) as valor
                      FROM (
                            --COMPLEMENTAR
                            SELECT sum(valor) as valor
                              FROM recuperarEventosCalculados(0,'|| inCodPeriodoMovimentacao ||','|| reRegistro.cod_contrato ||',0,'|| quote_literal(stEntidade) ||', ''evento.cod_evento'')
                            WHERE cod_evento = '|| reConfiguracao.cod_evento_base ||'
                            --SALARIO
                            UNION ALL
                            SELECT sum(valor) as valor
                              FROM recuperarEventosCalculados(1,'|| inCodPeriodoMovimentacao ||','|| reRegistro.cod_contrato ||','|| inCodComplementar ||','|| quote_literal(stEntidade) ||', ''evento.cod_evento'')
                            WHERE cod_evento = '|| reConfiguracao.cod_evento_base ||'
                            --FERIAS
                            UNION ALL
                            SELECT sum(valor) as valor
                              FROM recuperarEventosCalculados(2,'|| inCodPeriodoMovimentacao ||','|| reRegistro.cod_contrato ||','|| inCodComplementar ||','|| quote_literal(stEntidade) ||', ''evento.cod_evento'')
                            WHERE cod_evento = '|| reConfiguracao.cod_evento_base ||'                      
                            --DECIMO
                            UNION ALL
                            SELECT sum(valor) as valor
                              FROM recuperarEventosCalculados(3,'|| inCodPeriodoMovimentacao ||','|| reRegistro.cod_contrato ||','|| inCodComplementar ||','|| quote_literal(stEntidade) ||', ''evento.cod_evento'')
                            WHERE cod_evento = '|| reConfiguracao.cod_evento_base ||'                                            
                            --DECIMO
                            UNION ALL
                            SELECT sum(valor) as valor
                              FROM recuperarEventosCalculados(4,'|| inCodPeriodoMovimentacao ||','|| reRegistro.cod_contrato ||','|| inCodComplementar ||','|| quote_literal(stEntidade) ||', ''evento.cod_evento'')
                            WHERE cod_evento = '|| reConfiguracao.cod_evento_base ||'
                          ) as tabela_teste';                            
                      
        ELSE
            stSql := 'SELECT sum(valor) as valor
                        FROM recuperarEventosCalculados('|| inFolha ||','|| inCodPeriodoMovimentacao ||','|| reRegistro.cod_contrato ||','|| inCodComplementar ||','|| quote_literal(stEntidade) ||', ''evento.cod_evento'')
                      WHERE cod_evento = '|| reConfiguracao.cod_evento_base;

            IF trim(stDesdobramento) != '' AND stDesdobramento IS NOT NULL THEN
                stSql := stSql || ' AND desdobramento = '|| quote_literal(stDesdobramento) ||' ';
            END IF;
        END IF;

        nuValorEventoIPECalculado := selectIntoNumeric(stSql);
                
        /*** FIM: Busca o valor de desconto do evento IPE do contrato ***/

        /*** Monta retorno dos dados ***/
        -- Caso o tipo de emissão FOR por inclusão ou acerto de inclusão 
        -- gerar no arquivo também, servidores sem que não tem cálculo de IPERS
        
        IF nuValorEventoIPECalculado > 0 OR 
            inCodTipoEmissao IN (3,4) THEN 

            rwIPE.orgao               := reConfiguracao.codigo_orgao;
            rwIPE.registro            := reRegistro.registro;                    
            rwIPE.nom_cgm             := reRegistro.nom_cgm;      
            rwIPE.cep                 := reRegistro.cep;               
            rwIPE.cpf                 := reRegistro.cpf;                         
            rwIPE.rg                  := reRegistro.rg;   
            rwIPE.dt_nascimento       := reRegistro.dt_nascimento;
            rwIPE.logradouro          := reRegistro.logradouro;       
            rwIPE.cod_estado_civil    := reRegistro.cod_estado_civil;                             
            rwIPE.sexo                := reRegistro.sexo;               
            rwIPE.matricula_ipe       := lpad(reRegistro.matricula_ipe,13,'0');            
            rwIPE.dt_ingresso         := recuperarDataInicioContagemTempoContrato(stEntidade,reRegistro.cod_contrato,stExercicio);
            rwIPE.situacao            := inSituacao;
            rwIPE.dt_situacao         := dtSituacao;
            rwIPE.valor               := nuValorEventoIPECalculado;

            RETURN NEXT rwIPE;                        
        END IF;
    END LOOP;
END;       
$$ LANGUAGE 'plpgsql';