dirfPlanoSaude.plsql 8.16 KB
/*
    **********************************************************************************
    *                                                                                *
    * @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.       *
    *                                                                                *
    **********************************************************************************
*/

CREATE OR REPLACE FUNCTION dirfPlanoSaude(VARCHAR,VARCHAR,VARCHAR,VARCHAR,INTEGER,VARCHAR) RETURNS SETOF colunasDirfPlanoSaude AS $$
DECLARE
    stEntidade                  ALIAS FOR $1;
    stTipoFiltro                ALIAS FOR $2;
    stValoresFiltro             ALIAS FOR $3;
    stExercicio                 ALIAS FOR $4;
    inCodEvento                 ALIAS FOR $5;
    stExercicioAnterior         ALIAS FOR $6;
    stSelect                    VARCHAR;
    rwPlanoSaude                colunasDirfPlanoSaude%ROWTYPE;
    vlPlanoSaudeServidor        NUMERIC := 0;
    vlPlanoSaude0               NUMERIC := 0;
    vlPlanoSaude1               NUMERIC := 0;
    vlPlanoSaude2               NUMERIC := 0;
    vlPlanoSaude3               NUMERIC := 0;
    reResultados                RECORD;
    reServidores                RECORD;
    rePeriodos                  RECORD;
BEGIN
    -- select recuperar todos os servidores
    stSelect := '
        SELECT
             cadastro.cod_contrato
            ,cadastro.registro
            ,cadastro.nom_cgm
            ,cadastro.numcgm
            ,cadastro.cpf
        FROM (
            SELECT
                 cod_contrato
                ,registro
                ,nom_cgm
                ,numcgm
                ,cpf
            FROM
                recuperarContratoServidor(''cgm'','|| quote_literal(stEntidade) ||',0,'|| quote_literal(stTipoFiltro) ||','|| quote_literal(stValoresFiltro) ||','|| quote_literal(stExercicio) ||')

            UNION

            SELECT
                 cod_contrato
                ,registro
                ,nom_cgm
                ,numcgm
                ,cpf
            FROM
                recuperarContratoPensionista(''cgm'','|| quote_literal(stEntidade) ||',0,'|| quote_literal(stTipoFiltro) ||','|| quote_literal(stValoresFiltro) ||','|| quote_literal(stExercicio) ||')
            ) as CADASTRO

        WHERE NOT EXISTS ( SELECT 1
                             FROM pessoal'|| stEntidade ||'.contrato_servidor_caso_causa
                            WHERE contrato_servidor_caso_causa.cod_contrato = cadastro.cod_contrato
                              AND to_char(dt_rescisao,''yyyy'') < ''|| inExercicio ||'')
                              AND NOT EXISTS ( SELECT 1
                                                 FROM pessoal'|| stEntidade ||'.aposentadoria
                                                WHERE aposentadoria.cod_contrato = cadastro.cod_contrato
                                                  AND NOT EXISTS ( SELECT 1
                                                                     FROM pessoal'|| stEntidade ||'.aposentadoria_excluida
                                                                    WHERE aposentadoria_excluida.cod_contrato = aposentadoria.cod_contrato
                                                                      AND aposentadoria_excluida.timestamp = aposentadoria.timestamp
                                                                 )
                                                  AND NOT EXISTS ( SELECT 1
                                                                     FROM pessoal'|| stEntidade ||'.aposentadoria_encerramento
                                                                    WHERE aposentadoria_encerramento.cod_contrato = aposentadoria.cod_contrato
                                                                      AND aposentadoria_encerramento.timestamp = aposentadoria.timestamp
                                                                 )
                                             )
                             AND NOT EXISTS ( SELECT 1
                                                FROM pessoal'|| stEntidade ||'.contrato_pensionista
                                               WHERE contrato_pensionista.cod_contrato = cadastro.cod_contrato
                                                 AND contrato_pensionista.dt_encerramento IS NOT NULL
                                            )

        ORDER BY cadastro.cod_contrato';

    -- para cada servidor calcula o evento em questão em todas as folhas (0 a 4)
    FOR reServidores IN EXECUTE stSelect
    LOOP
        -- recupera todos os períodos de movimentação no exercício
        stSelect := 'SELECT *
                       FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                      WHERE to_char(dt_final,''yyyy'') = '|| quote_literal(stExercicio) ||' ';

                   IF stExercicioAnterior IS NOT NULL THEN
                       stSelect := stSelect || '   AND to_char(dt_final,''mm'') <> 12
                                     UNION
                                    SELECT *
                                      FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                     WHERE to_char(dt_final,''yyyy'') = '|| quote_literal(stExercicioAnterior) ||'
                                       AND to_char(dt_final,''mm'') = 12';
                   END IF;

                   stSelect := stSelect || 'ORDER BY dt_final';

        FOR rePeriodos IN EXECUTE stSelect
        LOOP
            vlPlanoSaude0 := vlPlanoSaude0 + (SELECT * from recupera_evento_calculado_dirf(0, rePeriodos.cod_periodo_movimentacao, reServidores.cod_contrato, inCodEvento, stEntidade));
            vlPlanoSaude1 := vlPlanoSaude1 + (SELECT * from recupera_evento_calculado_dirf(1, rePeriodos.cod_periodo_movimentacao, reServidores.cod_contrato, inCodEvento, stEntidade));
            vlPlanoSaude2 := vlPlanoSaude2 + (SELECT * from recupera_evento_calculado_dirf(2, rePeriodos.cod_periodo_movimentacao, reServidores.cod_contrato, inCodEvento, stEntidade));
            vlPlanoSaude3 := vlPlanoSaude3 + (SELECT * from recupera_evento_calculado_dirf(3, rePeriodos.cod_periodo_movimentacao, reServidores.cod_contrato, inCodEvento, stEntidade));
        END LOOP;

        vlPlanoSaudeServidor := vlPlanoSaude0 + vlPlanoSaude1 + vlPlanoSaude2 +  vlPlanoSaude3;


        rwPlanoSaude.registro     := reServidores.registro;
        rwPlanoSaude.cod_contrato := reServidores.cod_contrato;
        rwPlanoSaude.nom_cgm      := reServidores.nom_cgm;
        rwPlanoSaude.numcgm       := reServidores.numcgm;
        rwPlanoSaude.cpf          := reServidores.cpf;
        rwPlanoSaude.valor        := vlPlanoSaudeServidor;

        vlPlanoSaude0 := 0;
        vlPlanoSaude1 := 0;
        vlPlanoSaude2 := 0;
        vlPlanoSaude3 := 0;
        vlPlanoSaudeServidor := 0;

        RETURN NEXT rwPlanoSaude;

    END LOOP;
END;
$$ LANGUAGE 'plpgsql';