processarValorBaseDeducaoDecimo.plsql 20.7 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: 14/11/2006
--
--
--    * @author Analista: Vandré Miguel Ramos
--    * @author Desenvolvedor: Diego Lemos de Souza
--
--    * @package URBEM
--    * @subpackage
--
--    $Revision: 23795 $
--    $Name$
--    $Author: souzadl $
--    $Date: 2007-07-06 11:04:56 -0300 (Sex, 06 Jul 2007) $
--
--    * Casos de uso: uc-04.05.11
--*/


CREATE OR REPLACE FUNCTION processarValorBaseDeducaoDecimo() RETURNS BOOLEAN as $$

DECLARE
    inCodPeriodoMovimentacao    INTEGER;
    inCodContrato               INTEGER;
    inCodPrevidencia            INTEGER;
    inCodEvento                 INTEGER;
    inCodEventoCPensao          INTEGER;
    inCodEventoSPensao          INTEGER;
    inCodEvento65Anos           INTEGER;    
    inCodRegistro               INTEGER;
    inContTabela                INTEGER;
    inNumContratos              INTEGER;
    inNumCgm                    INTEGER;
    inCountTemp                 INTEGER;
    stTimestampRegistro         VARCHAR := '';
    stSql                       VARCHAR := '';
    stSqlSemPensao              VARCHAR := '';
    stSqlComPensao              VARCHAR := '';
    dtVigencia                  VARCHAR := '';
    stDesdobramentoRegistro     VARCHAR := '';
    stDesdobramento             VARCHAR := '';
    crCursor                    REFCURSOR;
    nuValorTemp                 NUMERIC := 0.00;
    nuValor                     NUMERIC := 0.00;
    nuValorPensao               NUMERIC := 0.00;
    nuValorDeducaoDependente    NUMERIC := 0.00;
    boRetorno                   BOOLEAN := TRUE;
    stEntidade VARCHAR := recuperarBufferTexto('stEntidade');
BEGIN
    inCodPrevidencia         := recuperarBufferInteiro('inCodPrevidenciaOficial');    
    IF inCodPrevidencia IS NOT NULL AND inCodPrevidencia != 0 THEN
        inCodContrato            := recuperarBufferInteiro('inCodContrato');
        inCodPeriodoMovimentacao := recuperarBufferInteiro('inCodPeriodoMovimentacao');    
        inCodPrevidencia         := recuperarBufferInteiro('inCodPrevidenciaOficial');
        dtVigencia               := recuperarBufferTexto('dtVigenciaPrevidencia');
        stDesdobramento          := recuperarBufferTexto('stDesdobramento');
        inNumCgm := recuperarBufferInteiro('inNumCgm');
        IF dtVigencia != 'NULL' THEN
            nuValorTemp := selectIntoNumeric('SELECT SUM(evento_decimo_calculado.valor) AS valor
                                       FROM folhapagamento'|| stEntidade ||'.previdencia_evento
                                          , (  SELECT cod_previdencia
                                                    , max(timestamp) as timestamp
                                                 FROM folhapagamento'|| stEntidade ||'.previdencia_previdencia
                                                WHERE vigencia = '|| quote_literal(dtVigencia) ||'
                                             GROUP BY cod_previdencia) as max_previdencia_previdencia
                                          , folhapagamento'|| stEntidade ||'.evento
                                          , folhapagamento'|| stEntidade ||'.registro_evento_decimo
                                          , folhapagamento'|| stEntidade ||'.ultimo_registro_evento_decimo
                                          , folhapagamento'|| stEntidade ||'.evento_decimo_calculado
                                      WHERE previdencia_evento.cod_tipo = 1
                                        AND previdencia_evento.cod_previdencia = '|| inCodPrevidencia ||'
                                        AND registro_evento_decimo.cod_contrato = '|| inCodContrato ||'
                                        AND registro_evento_decimo.cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||'
                                        AND previdencia_evento.cod_previdencia = max_previdencia_previdencia.cod_previdencia
                                        AND previdencia_evento.timestamp = max_previdencia_previdencia.timestamp
                                        AND previdencia_evento.cod_evento = evento.cod_evento
                                        AND evento.cod_evento = ultimo_registro_evento_decimo.cod_evento
                                        AND ultimo_registro_evento_decimo.cod_registro = registro_evento_decimo.cod_registro
                                        AND ultimo_registro_evento_decimo.cod_evento   = evento_decimo_calculado.cod_evento
                                        AND ultimo_registro_evento_decimo.cod_registro = evento_decimo_calculado.cod_registro
                                        AND ultimo_registro_evento_decimo.timestamp    = evento_decimo_calculado.timestamp_registro
                                        AND ultimo_registro_evento_decimo.desdobramento= evento_decimo_calculado.desdobramento
                                        AND ultimo_registro_evento_decimo.desdobramento = '|| quote_literal(stDesdobramento) ||' ');
        END IF;
        IF nuValorTemp IS NOT NULL THEN
            nuValor := nuValor + nuValorTemp;
        END IF;
        
        --Busca código do Evento de Desconto IRRF para Salário/Férias/13o.Salário
        inCodEventoSPensao := selectIntoInteger('SELECT tabela_irrf_evento.cod_evento
                                                   FROM folhapagamento'|| stEntidade ||'.tabela_irrf_evento
                                                  WHERE tabela_irrf_evento.cod_tipo = 3
                                               ORDER BY timestamp desc LIMIT 1');
                                               
        --Busca código do Evento de Desconto IRRF Salário/Férias/13o.Salário c/Dedução de Pensão Alimentícia
        inCodEventoCPensao := selectIntoInteger('SELECT tabela_irrf_evento.cod_evento
                                                   FROM folhapagamento'|| stEntidade ||'.tabela_irrf_evento
                                                  WHERE tabela_irrf_evento.cod_tipo = 6
                                               ORDER BY timestamp desc LIMIT 1');             
        

        --Verificação da necessidade de incluir a dedução de dependente na soma da base de dedução
        --Foi criada a tabela deducao_dependente onde é armazenada a informação que diz se já
        --foi utilizada a dedução em alguma matrícula em alguma folha. Caso exista um registro
        --que corresponda ao cgm e periodo de movimentação em calculo quer disser que já
        --foi utilizada a dedução de dependente e por tanto não deve ser inserida novamente na soma de base.
        nuValor := nuValor + processarValorDeducaoDependente();
        
        --Evento Informativo de isenção (inativos/pensionistas) acima de 65 anos
        --Busca que identifica se o servidor é um servidor com mais de 65 anos
        --Busca código do Evento Informativo de isenção (inativos/pensionistas) acima de 65 anos
        inCodEvento65Anos := selectIntoInteger('SELECT tabela_irrf_evento.cod_evento
                                                   FROM folhapagamento'|| stEntidade ||'.tabela_irrf_evento
                                                  WHERE tabela_irrf_evento.cod_tipo = 2
                                               ORDER BY timestamp desc LIMIT 1');   
                                                       
        IF inCodEvento65Anos is not null THEN                                                               
        --CONSULTA QUE VERIFICA SE EXISTE ALGUM CONTRATO COM REGISTRO DE EVENTOS PARA DEPENDENTES ACIMA DE 65 ANOS PARA O SERVIDOR
            stSql := 'SELECT count(registro_evento_decimo.cod_contrato) as contador
                        FROM folhapagamento'|| stEntidade ||'.registro_evento_decimo
                           , folhapagamento'|| stEntidade ||'.evento_decimo_calculado
                           , pessoal'|| stEntidade ||'.servidor_contrato_servidor
                           , pessoal'|| stEntidade ||'.servidor
                       WHERE registro_evento_decimo.cod_registro = evento_decimo_calculado.cod_registro
                         AND registro_evento_decimo.cod_evento = evento_decimo_calculado.cod_evento
                         AND registro_evento_decimo.desdobramento = evento_decimo_calculado.desdobramento
                         AND registro_evento_decimo.timestamp = evento_decimo_calculado.timestamp_registro
                         AND registro_evento_decimo.cod_contrato = servidor_contrato_servidor.cod_contrato
                         AND servidor_contrato_servidor.cod_servidor = servidor.cod_servidor
                         AND registro_evento_decimo.cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||'
                         AND registro_evento_decimo.cod_evento = '|| inCodEvento65Anos ||'                                          
                         AND servidor.numcgm = '|| inNumCgm ||'
                    GROUP BY registro_evento_decimo.cod_contrato';
            inCountTemp := selectIntoInteger(stSql);
            IF inCountTemp is not null THEN
                inNumContratos := inNumContratos + inCountTemp;
            END IF;        


            IF inNumContratos = 1 THEN
                stSql := 'SELECT evento_decimo_calculado.valor
                            FROM folhapagamento'|| stEntidade ||'.registro_evento_decimo
                                , folhapagamento'|| stEntidade ||'.evento_decimo_calculado
                            WHERE registro_evento_decimo.cod_contrato = '|| inCodContrato ||'
                                AND registro_evento_decimo.cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||'
                                AND registro_evento_decimo.cod_evento = '|| inCodEvento65Anos ||'
                                AND registro_evento_decimo.cod_evento = evento_decimo_calculado.cod_evento
                                AND registro_evento_decimo.cod_registro = evento_decimo_calculado.cod_registro
                                AND registro_evento_decimo.timestamp = evento_decimo_calculado.timestamp_registro
                                AND registro_evento_decimo.desdobramento = evento_decimo_calculado.desdobramento';
                nuValorTemp := selectIntoNumeric(stSql);
                IF nuValorTemp is not null THEN
                    nuValor := nuValor + nuValorTemp;
                END IF;
            END IF;
        END IF;

        nuValorPensao := selectIntoNumeric('SELECT SUM(evento_decimo_calculado.valor) AS valor
                                    FROM folhapagamento'|| stEntidade ||'.pensao_evento
                                       , (  SELECT cod_configuracao_pensao
                                                 , max(timestamp) as timestamp
                                              FROM folhapagamento'|| stEntidade ||'.pensao_funcao_padrao
                                          GROUP BY cod_configuracao_pensao) as max_pensao_funcao_padrao
                                       , folhapagamento'|| stEntidade ||'.evento
                                       , folhapagamento'|| stEntidade ||'.registro_evento_decimo
                                       , folhapagamento'|| stEntidade ||'.ultimo_registro_evento_decimo
                                       , folhapagamento'|| stEntidade ||'.evento_decimo_calculado
                                   WHERE pensao_evento.cod_tipo = 1
                                     AND registro_evento_decimo.cod_contrato = '|| inCodContrato ||'
                                     AND registro_evento_decimo.cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||'
                                     AND pensao_evento.cod_configuracao_pensao = max_pensao_funcao_padrao.cod_configuracao_pensao
                                     AND pensao_evento.timestamp       = max_pensao_funcao_padrao.timestamp
                                     AND pensao_evento.cod_evento = evento.cod_evento
                                     AND evento.cod_evento = ultimo_registro_evento_decimo.cod_evento
                                     AND ultimo_registro_evento_decimo.cod_registro = registro_evento_decimo.cod_registro
                                     AND ultimo_registro_evento_decimo.cod_evento = evento_decimo_calculado.cod_evento
                                     AND ultimo_registro_evento_decimo.cod_registro = evento_decimo_calculado.cod_registro
                                     AND ultimo_registro_evento_decimo.timestamp = evento_decimo_calculado.timestamp_registro
                                     AND ultimo_registro_evento_decimo.desdobramento = evento_decimo_calculado.desdobramento
                                     AND (ultimo_registro_evento_decimo.desdobramento = ''F''
                                      OR  ultimo_registro_evento_decimo.desdobramento = ''A'')');
        IF nuValorPensao IS NULL THEN
            nuValorPensao := 0.00;
        END IF;

        --Base Dedução IRRF s/Pensão
        stSqlSemPensao := 'SELECT evento_decimo_calculado.cod_evento
                                 , evento_decimo_calculado.cod_registro
                                 , evento_decimo_calculado.timestamp_registro
                                 , evento_decimo_calculado.desdobramento
                              FROM folhapagamento'|| stEntidade ||'.tabela_irrf_evento
                                 , (  SELECT cod_tabela
                                           , max(timestamp) as timestamp
                                        FROM folhapagamento'|| stEntidade ||'.tabela_irrf_evento
                                    GROUP BY cod_tabela) as max_tabela_irrf_evento
                                 , folhapagamento'|| stEntidade ||'.evento
                                 , folhapagamento'|| stEntidade ||'.registro_evento_decimo
                                 , folhapagamento'|| stEntidade ||'.ultimo_registro_evento_decimo
                                 , folhapagamento'|| stEntidade ||'.evento_decimo_calculado
                             WHERE tabela_irrf_evento.cod_tipo = 4
                               AND registro_evento_decimo.cod_contrato = '|| inCodContrato ||'
                               AND registro_evento_decimo.cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||'
                               AND tabela_irrf_evento.cod_tabela = max_tabela_irrf_evento.cod_tabela
                               AND tabela_irrf_evento.timestamp  = max_tabela_irrf_evento.timestamp
                               AND tabela_irrf_evento.cod_evento = evento.cod_evento
                               AND evento.cod_evento = ultimo_registro_evento_decimo.cod_evento
                               AND ultimo_registro_evento_decimo.cod_registro = registro_evento_decimo.cod_registro
                               AND ultimo_registro_evento_decimo.cod_evento   = evento_decimo_calculado.cod_evento
                               AND ultimo_registro_evento_decimo.cod_registro = evento_decimo_calculado.cod_registro
                               AND ultimo_registro_evento_decimo.timestamp    = evento_decimo_calculado.timestamp_registro
                               AND ultimo_registro_evento_decimo.desdobramento= evento_decimo_calculado.desdobramento
                               AND ultimo_registro_evento_decimo.desdobramento= '|| quote_literal(stDesdobramento) ||' ';
        --Base Dedução IRRF c/Pensão
        stSqlComPensao := 'SELECT evento_decimo_calculado.cod_evento
                                 , evento_decimo_calculado.cod_registro
                                 , evento_decimo_calculado.timestamp_registro
                                 , evento_decimo_calculado.desdobramento
                              FROM folhapagamento'|| stEntidade ||'.tabela_irrf_evento
                                 , (  SELECT cod_tabela
                                           , max(timestamp) as timestamp
                                        FROM folhapagamento'|| stEntidade ||'.tabela_irrf_evento
                                    GROUP BY cod_tabela) as max_tabela_irrf_evento
                                 , folhapagamento'|| stEntidade ||'.evento
                                 , folhapagamento'|| stEntidade ||'.registro_evento_decimo
                                 , folhapagamento'|| stEntidade ||'.ultimo_registro_evento_decimo
                                 , folhapagamento'|| stEntidade ||'.evento_decimo_calculado
                             WHERE tabela_irrf_evento.cod_tipo = 5
                               AND registro_evento_decimo.cod_contrato = '|| inCodContrato ||'
                               AND registro_evento_decimo.cod_periodo_movimentacao = '|| inCodPeriodoMovimentacao ||'
                               AND tabela_irrf_evento.cod_tabela = max_tabela_irrf_evento.cod_tabela
                               AND tabela_irrf_evento.timestamp  = max_tabela_irrf_evento.timestamp
                               AND tabela_irrf_evento.cod_evento = evento.cod_evento
                               AND evento.cod_evento = ultimo_registro_evento_decimo.cod_evento
                               AND ultimo_registro_evento_decimo.cod_registro = registro_evento_decimo.cod_registro
                               AND ultimo_registro_evento_decimo.cod_evento   = evento_decimo_calculado.cod_evento
                               AND ultimo_registro_evento_decimo.cod_registro = evento_decimo_calculado.cod_registro
                               AND ultimo_registro_evento_decimo.timestamp    = evento_decimo_calculado.timestamp_registro
                               AND ultimo_registro_evento_decimo.desdobramento= evento_decimo_calculado.desdobramento
                               AND ultimo_registro_evento_decimo.desdobramento= '|| quote_literal(stDesdobramento) ||' ';
        --Atualiza Base Dedução IRRF s/Pensão
        OPEN crCursor FOR EXECUTE stSqlSemPensao;
            FETCH crCursor INTO inCodEvento,inCodRegistro,stTimestampRegistro,stDesdobramentoRegistro;
        CLOSE crCursor;
        stSql := 'UPDATE folhapagamento'|| stEntidade ||'.evento_decimo_calculado SET valor = '|| nuValor ||'
         WHERE cod_evento         = '|| inCodEvento ||'
           AND cod_registro       = '|| inCodRegistro ||'
           AND timestamp_registro = '|| quote_literal(stTimestampRegistro) ||'
           AND desdobramento      = '|| quote_literal(stDesdobramentoRegistro) ||' ';
        IF stSql IS NOT NULL THEN            
            EXECUTE stSql;
        END IF;
        --Atualiza Base Dedução IRRF c/Pensão
        OPEN crCursor FOR EXECUTE stSqlComPensao;
            FETCH crCursor INTO inCodEvento,inCodRegistro,stTimestampRegistro,stDesdobramentoRegistro;
        CLOSE crCursor;
        stSql := 'UPDATE folhapagamento'|| stEntidade ||'.evento_decimo_calculado SET valor = '|| (nuValor+nuValorPensao) ||'
         WHERE cod_evento         = '|| inCodEvento ||'
           AND cod_registro       = '|| inCodRegistro ||'
           AND timestamp_registro = '|| quote_literal(stTimestampRegistro) ||'
           AND desdobramento      = '|| quote_literal(stDesdobramentoRegistro) ||' ';
        IF stSql IS NOT NULL THEN
            EXECUTE stSql;
        END IF;
    END IF;
    RETURN boRetorno; 
END;
$$ LANGUAGE 'plpgsql';