processarEventosAutomaticosDecimo.plsql 20.3 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.       *
    *                                                                                *
    **********************************************************************************
*/
-- /**
--     * Função PLSQL
--     * Data de Criação: 12/09/2006
--
--
--     * @author Diego Lemos de Souza
--
--     * Casos de uso: uc-04.05.11
--
--     $Id: processarEventosAutomaticosDecimo.plsql 59820 2014-09-12 18:17:20Z luciana $
-- */

CREATE OR REPLACE FUNCTION processarEventosAutomaticosDecimo() RETURNS BOOLEAN as $$
DECLARE
    inCodContrato                       INTEGER;
    inCodPeriodoMovimentacao            INTEGER;
    inContadorDependentes               INTEGER;
    inDiasServidor                      INTEGER;
    inQtdDependentesPensaoAlimenticia   INTEGER;
    inCodEvento                         INTEGER;
    inCodServidor                       INTEGER;
    boRetorno                           BOOLEAN;
    dtVigencia                          VARCHAR :='';
    stSql                               VARCHAR :='';
    stDataFinalCompetencia              VARCHAR :='';
    stAnoAdiantamento                   VARCHAR :='';
    stDesdobramento                     CHAR;
    stDesdobramentoConcessao            CHAR;
    reRegistro                          RECORD;
    stEntidade VARCHAR := recuperarBufferTexto('stEntidade');
BEGIN
    inCodContrato              := recuperarBufferInteiro('inCodContrato');
    inCodPeriodoMovimentacao   := recuperarBufferInteiro('inCodPeriodoMovimentacao');
    stDesdobramento            := recuperarBufferTexto('stDesdobramento');
    stDataFinalCompetencia     := substr(recuperarBufferTexto('stDataFinalCompetencia'),1,10);
    stSql := 'SELECT ultimo_registro_evento_decimo.*
                 FROM folhapagamento'|| stEntidade ||'.registro_evento_decimo
                    , folhapagamento'|| stEntidade ||'.ultimo_registro_evento_decimo
                    , folhapagamento'|| stEntidade ||'.evento
                WHERE registro_evento_decimo.cod_registro = ultimo_registro_evento_decimo.cod_registro
                  AND registro_evento_decimo.cod_evento   = ultimo_registro_evento_decimo.cod_evento
                  AND registro_evento_decimo.timestamp    = ultimo_registro_evento_decimo.timestamp
                  AND registro_evento_decimo.desdobramento= ultimo_registro_evento_decimo.desdobramento
                  AND registro_evento_decimo.cod_evento = evento.cod_evento
                  AND evento.evento_sistema = true
                  AND registro_evento_decimo.cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||'
                  AND registro_evento_decimo.cod_contrato = '|| inCodContrato ||'
                  AND registro_evento_decimo.desdobramento = '|| quote_literal(stDesdobramento) ||' ';
    FOR reRegistro IN  EXECUTE stSql
    LOOP
        stSql := 'DELETE FROM folhapagamento'|| stEntidade ||'.evento_decimo_calculado_dependente
                   WHERE cod_registro = '|| reRegistro.cod_registro ||'
                     AND cod_evento = '|| reRegistro.cod_evento ||'
                     AND desdobramento = '|| quote_literal(reRegistro.desdobramento) ||'
                     AND timestamp_registro = '|| quote_literal(reRegistro.timestamp) ||' ';
        EXECUTE stSql;
        stSql := 'DELETE FROM folhapagamento'|| stEntidade ||'.evento_decimo_calculado
                   WHERE cod_registro = '|| reRegistro.cod_registro ||'
                     AND cod_evento = '|| reRegistro.cod_evento ||'
                     AND desdobramento = '|| quote_literal(reRegistro.desdobramento) ||'
                     AND timestamp_registro = '|| quote_literal(reRegistro.timestamp) ||' ';
        EXECUTE stSql;
        stSql := 'DELETE FROM folhapagamento'|| stEntidade ||'.log_erro_calculo_decimo
                   WHERE cod_registro = '|| reRegistro.cod_registro ||'
                     AND cod_evento = '|| reRegistro.cod_evento ||'
                     AND desdobramento = '|| quote_literal(reRegistro.desdobramento) ||'
                     AND timestamp = '|| quote_literal(reRegistro.timestamp) ||' ';
        EXECUTE stSql;
        stSql := 'DELETE FROM folhapagamento'|| stEntidade ||'.registro_evento_decimo_parcela
                   WHERE cod_registro = '|| reRegistro.cod_registro ||'
                     AND cod_evento = '|| reRegistro.cod_evento ||'
                     AND desdobramento = '|| quote_literal(reRegistro.desdobramento) ||'
                     AND timestamp = '|| quote_literal(reRegistro.timestamp) ||' ';
        EXECUTE stSql;
        stSql := 'DELETE FROM folhapagamento'|| stEntidade ||'.ultimo_registro_evento_decimo
                   WHERE cod_registro = '|| reRegistro.cod_registro ||'
                     AND cod_evento = '|| reRegistro.cod_evento ||'
                     AND desdobramento = '|| quote_literal(reRegistro.desdobramento) ||'
                     AND timestamp = '|| quote_literal(reRegistro.timestamp) ||' ';
        EXECUTE stSql;
    END LOOP;

    IF stDesdobramento != 'A' THEN
        dtVigencia := selectIntoVarchar(' SELECT vigencia
                                  FROM folhapagamento'|| stEntidade ||'.tabela_irrf
                                     , (SELECT cod_tabela
                                             , max(timestamp) as timestamp
                                          FROM folhapagamento'|| stEntidade ||'.tabela_irrf
                                         WHERE vigencia <= '|| quote_literal(stDataFinalCompetencia) ||'
                                         GROUP BY cod_tabela) as max_tabela_irrf
                                 WHERE tabela_irrf.cod_tabela = max_tabela_irrf.cod_tabela
                                   AND tabela_irrf.timestamp  = max_tabela_irrf.timestamp');
        dtVigencia := criarBufferTexto('dtVigenciaIrrf',dtVigencia);

        --Sql que verifica se o servidor possui dependentes
        inContadorDependentes := selectIntoInteger(' SELECT count(servidor.cod_servidor) as contador
                                             FROM pessoal'|| stEntidade ||'.servidor
                                                , pessoal'|| stEntidade ||'.servidor_contrato_servidor
                                                , pessoal'|| stEntidade ||'.servidor_dependente
                                            WHERE servidor_contrato_servidor.cod_contrato = (SELECT recuperaContratoServidorPensionista('|| inCodContrato ||'))
                                              AND servidor_contrato_servidor.cod_servidor = servidor.cod_servidor
                                              AND servidor.cod_servidor                   = servidor_dependente.cod_servidor');
        --Se possuir dependentes faz a inclusão de registro de evento
        IF inContadorDependentes > 0 THEN
            boRetorno := inserirEventosAutomaticosDecimo(1);
        END IF;

        --Sql que verifica se o servidor se enquadra como inativo ou pensionista acima de 65 anos
        IF retornaDataAniversarioCom(65,inCodContrato) <= to_date(stDataFinalCompetencia,'yyyy/mm/dd') THEN
            boRetorno := inserirEventosAutomaticosDecimo(2);
        END IF;

        --Inclusão dos registro de eventos referentes aos tipos 3,4,5,6 e 7
        boRetorno := inserirEventosAutomaticosDecimo(3);
        boRetorno := inserirEventosAutomaticosDecimo(4);
        boRetorno := inserirEventosAutomaticosDecimo(5);
        boRetorno := inserirEventosAutomaticosDecimo(6);
        boRetorno := inserirEventosAutomaticosDecimo(7);
    ELSE
        dtVigencia := criarBufferTexto('dtVigenciaIrrf','NULL');
    END IF;

    ----Código para inclusão de registro de eventos FGTS
    dtVigencia := selectIntoVarchar(' SELECT MAX(vigencia)
                              FROM folhapagamento'|| stEntidade ||'.fgts
                             WHERE vigencia <= '|| quote_literal(stDataFinalCompetencia) ||' ');
    stSql := 'SELECT cod_evento
                    , cod_tipo
                    , fgts_categoria.aliquota_deposito
                    , fgts_categoria.aliquota_contribuicao
                 FROM pessoal'|| stEntidade ||'.contrato_servidor
                    , folhapagamento'|| stEntidade ||'.fgts_categoria
                    , folhapagamento'|| stEntidade ||'.fgts
                    , (  SELECT max(timestamp) as timestamp
                              , cod_fgts
                           FROM folhapagamento'|| stEntidade ||'.fgts
                          WHERE fgts.vigencia <= '|| quote_literal(dtVigencia) ||'
                       GROUP BY cod_fgts) as max_fgts
                    , folhapagamento'|| stEntidade ||'.fgts_evento
                WHERE contrato_servidor.cod_categoria = fgts_categoria.cod_categoria
                  AND fgts_categoria.cod_fgts = fgts.cod_fgts
                  AND fgts_categoria.timestamp= fgts.timestamp
                  AND fgts.cod_fgts = fgts_evento.cod_fgts
                  AND fgts.timestamp= fgts_evento.timestamp
                  AND fgts.cod_fgts = max_fgts.cod_fgts
                  AND fgts.timestamp= max_fgts.timestamp
                  AND contrato_servidor.cod_contrato = '|| inCodContrato;
    FOR reRegistro IN  EXECUTE stSql
    LOOP

        IF (reRegistro.aliquota_deposito     > 0 AND reRegistro.cod_tipo = 1) or
           (reRegistro.aliquota_contribuicao > 0 AND reRegistro.cod_tipo = 2) or
           (reRegistro.cod_tipo = 3                                         ) THEN
            boRetorno := insertRegistroEventoAutomaticoDecimo(inCodContrato,inCodPeriodoMovimentacao,reRegistro.cod_evento,stDesdobramento);
        END IF;
    END LOOP;


    --Código para inclusão de registro de eventos Previdência
    IF stDesdobramento != 'A' THEN
        stSql := '    SELECT MAX(vigencia)
                    FROM folhapagamento'|| stEntidade ||'.previdencia_previdencia
              INNER JOIN (
                        SELECT contrato_servidor_previdencia.cod_contrato
                             , contrato_servidor_previdencia.cod_previdencia
                          FROM pessoal'|| stEntidade ||'.contrato_servidor_previdencia
                         WHERE contrato_servidor_previdencia.timestamp = ( SELECT timestamp
                                                                             FROM pessoal'|| stEntidade ||'.contrato_servidor_previdencia as contrato_servidor_previdencia_interna
                                                                            WHERE contrato_servidor_previdencia_interna.cod_contrato = contrato_servidor_previdencia.cod_contrato
                                                                              AND contrato_servidor_previdencia_interna.cod_previdencia = contrato_servidor_previdencia.cod_previdencia
                                                                              AND contrato_servidor_previdencia.bo_excluido = false
                                                                         ORDER BY timestamp desc
                                                                            LIMIT 1
                                                                         )

                        UNION
                        SELECT contrato_pensionista_previdencia.cod_contrato
                             , 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.cod_contrato = contrato_pensionista_previdencia.cod_contrato
                                                                            ORDER BY timestamp desc
                                                                               LIMIT 1
                                                                             )
                        ) as previdencia_contrato on folhapagamento'|| stEntidade ||'.previdencia_previdencia.cod_previdencia = previdencia_contrato.cod_previdencia
              WHERE previdencia_contrato.cod_contrato = '|| inCodContrato ||'
                AND vigencia <= '|| quote_literal(stDataFinalCompetencia) ||' ';
        dtVigencia := selectIntoVarchar(stSql);
        --VERIFICAÇÃO DE EXISTENCIA DE PREVIDENCIAS CADASTRADAS NO CONTRATO DO SERVIDOR
        IF dtVigencia IS NOT NULL THEN
            dtVigencia := criarBufferTexto('dtVigenciaPrevidencia',dtVigencia);

            stSql := 'SELECT cod_evento
                        , cod_tipo
                     FROM folhapagamento'|| stEntidade ||'.previdencia_previdencia
                        , (  SELECT max(timestamp) as timestamp
                                  , cod_previdencia
                               FROM folhapagamento'|| stEntidade ||'.previdencia_previdencia
                              WHERE previdencia_previdencia.vigencia = '|| quote_literal(dtVigencia) ||'
                           GROUP BY cod_previdencia) as max_previdencia_previdencia
                        , folhapagamento'|| stEntidade ||'.previdencia_evento
                        , (SELECT contrato_servidor_previdencia.cod_contrato
                                , contrato_servidor_previdencia.cod_previdencia
                             FROM pessoal'|| stEntidade ||'.contrato_servidor_previdencia
                                , (  SELECT max(timestamp) as timestamp
                                         , cod_contrato
                                      FROM pessoal'|| stEntidade ||'.contrato_servidor_previdencia
                                  GROUP BY cod_contrato) as max_contrato_servidor_previdencia
                            WHERE contrato_servidor_previdencia.cod_contrato = max_contrato_servidor_previdencia.cod_contrato
                              AND contrato_servidor_previdencia.timestamp    = max_contrato_servidor_previdencia.timestamp
                              AND contrato_servidor_previdencia.bo_excluido = false
                            UNION
                           SELECT contrato_pensionista_previdencia.cod_contrato
                                , contrato_pensionista_previdencia.cod_previdencia
                             FROM pessoal'|| stEntidade ||'.contrato_pensionista_previdencia
                                , (  SELECT max(timestamp) as timestamp
                                         , cod_contrato
                                      FROM pessoal'|| stEntidade ||'.contrato_pensionista_previdencia
                                  GROUP BY cod_contrato) as max_contrato_pensionista_previdencia
                            WHERE contrato_pensionista_previdencia.cod_contrato = max_contrato_pensionista_previdencia.cod_contrato
                              AND contrato_pensionista_previdencia.timestamp    = max_contrato_pensionista_previdencia.timestamp) as servidor_pensionista_previdencia
                    WHERE servidor_pensionista_previdencia.cod_previdencia = previdencia_previdencia.cod_previdencia
                      AND previdencia_previdencia.cod_previdencia    = max_previdencia_previdencia.cod_previdencia
                      AND previdencia_previdencia.timestamp          = max_previdencia_previdencia.timestamp
                      AND previdencia_previdencia.cod_previdencia = previdencia_evento.cod_previdencia
                      AND previdencia_previdencia.timestamp       = previdencia_evento.timestamp
                      AND previdencia_evento.cod_tipo != 3
                      AND servidor_pensionista_previdencia.cod_contrato = '|| inCodContrato ||' ';
            FOR reRegistro IN  EXECUTE stSql
            LOOP
                boRetorno := insertRegistroEventoAutomaticoDecimo(inCodContrato,inCodPeriodoMovimentacao,reRegistro.cod_evento,stDesdobramento);
            END LOOP;
        ELSE
            dtVigencia := criarBufferTexto('dtVigenciaPrevidencia','NULL');
        END IF;
    ELSE
        dtVigencia := criarBufferTexto('dtVigenciaPrevidencia','NULL');
    END IF;

    --   INÍCIO PENSÃO     --
    --Código para inclusão de registro de eventos Pensão
    inQtdDependentesPensaoAlimenticia = pega0QtdDependentesPensaoAlimenticia( inCodContrato, stDataFinalCompetencia );
    inQtdDependentesPensaoAlimenticia = criarBufferInteiro('inQtdDependentesPensaoAlimenticia',inQtdDependentesPensaoAlimenticia);
    IF inQtdDependentesPensaoAlimenticia > 0 THEN
        --Verifica se existe alguma pensao judicial com incidência em décimo terceiro salário
        --cod_incidencia igual a 1
        inCodServidor := recuperarBufferInteiro('inCodServidor');
        stSql := 'SELECT count(pensao.cod_pensao) as contador
                    FROM pessoal'|| stEntidade ||'.pensao
                       , (  SELECT cod_pensao
                                 , max(timestamp) as timestamp
                              FROM pessoal'|| stEntidade ||'.pensao
                          GROUP BY cod_pensao) as max_pensao
                       , pessoal'|| stEntidade ||'.pensao_incidencia
                   WHERE pensao.cod_pensao NOT IN (SELECT cod_pensao
                                                     FROM pessoal'|| stEntidade ||'.pensao_excluida)
                     AND pensao.cod_pensao = max_pensao.cod_pensao
                     AND pensao.timestamp  = max_pensao.timestamp
                     AND pensao.cod_pensao = pensao_incidencia.cod_pensao
                     AND pensao.timestamp = pensao_incidencia.timestamp
                     AND pensao.cod_servidor = '|| inCodServidor ||'
                     AND cod_incidencia = 1';
        IF selectIntoInteger(stSql) > 0 THEN
            inCodEvento := pega2CodEventoDescontoPensaoAlimenticia();
            boRetorno := insertRegistroEventoAutomaticoDecimo(inCodContrato,inCodPeriodoMovimentacao,inCodEvento,stDesdobramento);
        END IF;
    END IF;
    --   FIM PENSÃO        --

    -- VERIFICAÇÃO PARA EFETUAR OU NÃO O REGISTRO DE EVENTO DE DESCONTO DE ADIANTAMENTO DE DÉCIMO
	-- COMENTADO O IF: INSERE O EVENTO DE DESC DE ADIANT PARA TODOS, BASTA SER DESDOBRAMENTO "D".AVALIAÇÃO DIRETO PELO GERADOR
    stSql := 'SELECT desdobramento
                FROM folhapagamento'|| stEntidade ||'.concessao_decimo
               WHERE cod_contrato = '|| inCodContrato ||'
                 AND cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao;
    stDesdobramentoConcessao := selectIntoVarchar(stSql);
    IF (stDesdobramentoConcessao = 'D') THEN
        --stAnoAdiantamento := SUBSTR(pega0DataFinalCompetenciaDoPeriodoMovimento(inCodPeriodoMovimentacao),1,4);
        --boRetorno := verificaAdiantamento(stAnoAdiantamento);
        --IF boRetorno is TRUE THEN
            boRetorno := inserirEventoAutomaticoDescontoAdiantamento(1,stDesdobramentoConcessao);
        --END IF;
    END IF;

    RETURN boRetorno;
END;
$$ LANGUAGE 'plpgsql';