calculaEventoDecimoPorContrato.plsql 11.8 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 Analista: Vandré Miguel Ramos
--    * @author Desenvolvedor: Diego Lemos de Souza
--
--    * @package URBEM
--    * @subpackage
--
--    $Revision: 27631 $
--    $Name$
--    $Author: souzadl $
--    $Date: 2008-01-21 09:16:22 -0200 (Seg, 21 Jan 2008) $
--
--    * Casos de uso: uc-04.05.11
--*/

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

DECLARE
    stSql                           VARCHAR := '';
    reRegistro                      RECORD;
    stRetorno                       VARCHAR := '';
    stCodigoEvento                  VARCHAR := '';
    stFormula                       VARCHAR := '';
    stNatureza                      VARCHAR := '';
    stDesdobramento                 VARCHAR := '';
    dtVigencia                      VARCHAR := '';   
    stDadosRegistro                 VARCHAR := '';    
    arDadosRegistro                 VARCHAR[];
    stTimestamp                     TIMESTAMP;
    inCodContrato                   INTEGER;
    inCodRegistro                   INTEGER;
    inCodRegime                     INTEGER;
    inCodSubDivisao                 INTEGER;
    inCodFuncao                     INTEGER;
    inCodEspecialidade              INTEGER;
    inCodEvento                     INTEGER;
    inCodPeriodoMovimentacao        INTEGER;
    inCodConfiguracao               INTEGER;
    inCodTipo                       INTEGER;
    inCodRegistroDescontoIRRF       INTEGER;
    inCodPrevidencia                INTEGER;
    nuREQuantidade                  NUMERIC;
    nuREValor                       NUMERIC;
    nuREParcela                     NUMERIC;
    boRetorno                       BOOLEAN;
    stEntidade                      VARCHAR;
BEGIN
    inCodContrato              := recuperarBufferInteiro('inCodContrato');
    inCodPeriodoMovimentacao   := recuperarBufferInteiro('inCodPeriodoMovimentacao');
    stDesdobramento            := recuperarBufferTexto('stDesdobramento');
    stEntidade := recuperarBufferTexto('stEntidade');
    
    stSql := 'DELETE FROM folhapagamento'||stEntidade||'.registro_evento_decimo_ordenado';
    execute stSql;
    
    stSql := 'INSERT INTO folhapagamento'||stEntidade||'.registro_evento_decimo_ordenado (
              SELECT  evento.cod_evento
                    , evento.codigo
                    , registro_evento_decimo.cod_registro       
                    , registro_evento_decimo.cod_contrato
                    , COALESCE(registro_evento_decimo.valor,0.00) as valor
                    , COALESCE(registro_evento_decimo.quantidade,0.00) as quantidade
                    , registro_evento_decimo.desdobramento
                    , (SELECT COALESCE(parcela,0.00) as parcela
                        FROM folhapagamento'||stEntidade||'.registro_evento_decimo_parcela
                        WHERE ultimo_registro_evento_decimo.cod_registro = registro_evento_decimo_parcela.cod_registro
                        AND ultimo_registro_evento_decimo.cod_evento   = registro_evento_decimo_parcela.cod_evento
                        AND ultimo_registro_evento_decimo.timestamp    = registro_evento_decimo_parcela.timestamp
                        AND ultimo_registro_evento_decimo.desdobramento= registro_evento_decimo_parcela.desdobramento) AS parcela                              
                    , registro_evento_decimo.cod_periodo_movimentacao
                    , registro_evento_decimo.timestamp                      
                    , evento.natureza 
                    , sequencia_calculo.sequencia
                FROM folhapagamento'||stEntidade||'.ultimo_registro_evento_decimo
                   , folhapagamento'||stEntidade||'.registro_evento_decimo   
                   , folhapagamento'||stEntidade||'.evento 
                   , folhapagamento'||stEntidade||'.sequencia_calculo_evento
                   , folhapagamento'||stEntidade||'.sequencia_calculo
               WHERE ultimo_registro_evento_decimo.cod_registro = registro_evento_decimo.cod_registro
                 AND ultimo_registro_evento_decimo.cod_evento = registro_evento_decimo.cod_evento
                 AND ultimo_registro_evento_decimo.timestamp = registro_evento_decimo.timestamp
                 AND ultimo_registro_evento_decimo.desdobramento = registro_evento_decimo.desdobramento
                 AND ultimo_registro_evento_decimo.cod_evento = evento.cod_evento
                 AND evento.cod_evento = sequencia_calculo_evento.cod_evento
                 AND sequencia_calculo_evento.cod_sequencia = sequencia_calculo.cod_sequencia
                 AND registro_evento_decimo.cod_contrato = '||inCodContrato||'
                 AND registro_evento_decimo.cod_periodo_movimentacao = '||inCodPeriodoMovimentacao||'
                 AND registro_evento_decimo.desdobramento = '''||stDesdobramento||'''
            ORDER BY sequencia_calculo.sequencia)';
    EXECUTE stSql;

    inCodRegime                := recuperarBufferInteiro('inCodRegime');
    inCodSubDivisao            := recuperarBufferInteiro('inCodSubDivisao');
    inCodFuncao                := recuperarBufferInteiro('inCodFuncao');
    inCodEspecialidade         := recuperarBufferInteiro('inCodEspecialidade');
    inCodPeriodoMovimentacao   := recuperarBufferInteiro('inCodPeriodoMovimentacao');
    inCodConfiguracao          := recuperarBufferInteiro('inCodConfiguracao');
    stSql                      := '  SELECT * FROM folhapagamento'||stEntidade||'.registro_evento_decimo_ordenado ORDER BY sequencia';
    FOR reRegistro IN EXECUTE stSql
    LOOP       
        inCodEvento         := criarBufferInteiro('inCodEvento',reRegistro.cod_evento);   
        stTimestamp         := criarBufferTimestamp('stTimestamp',reRegistro.timestamp); 
        inCodRegistro       := criarBufferInteiro('inCodRegistro',reRegistro.cod_registro);
        stCodigoEvento      := criarBufferTexto('stCodigoEvento',reRegistro.codigo);
        nuREQuantidade      := criarBufferNumerico('nuREQuantidade',reRegistro.quantidade);
        IF reRegistro.parcela is not null THEN
            nuREParcela         := criarBufferNumerico('nuREParcela',reRegistro.parcela);
        ELSE
            nuREParcela         := criarBufferNumerico('nuREParcela',0.00);
        END IF; 
        nuREValor           := criarBufferNumerico('nuREValor',reRegistro.valor);
        stNatureza          := criarBufferTexto('stNatureza',reRegistro.natureza);
        --Validação para não executa a função executaGCNumerico em caso de eventos inseridos automaticamente
        --que não possuem cod_regime, cod_cargo na tabela configuracao_evento_caso_cargo ...
        stFormula = pegaFormulaEvento(reRegistro.cod_evento,inCodConfiguracao,inCodSubDivisao,inCodFuncao,inCodEspecialidade);    
        IF stFormula IS NOT NULL THEN
            stRetorno       := executaGCNumerico( stFormula );
        END IF;
    END LOOP;

    --TODOS OS AJUSTES SÓ DEVERÃO SER FEITOS ENTRE CONTRATOS
    --NÃO DEVERÃO SER FEITOS AJUSTES ENTRE FOLHAS
        
    --Chamada para a função de ajuste de previdencia entre contratos do mesmo CGM
    boRetorno := processarAjustePrevidenciaDecimo();

    --Chamada da função que corrige os valores das bases de dedução
    --4 | Evento de Base de Dedução sem Pensão Alimentícia
    --5 | Evento de Base de Dedução com Pensão Alimentícia
    --são processadas as base em virtude dos ajustes da previdencia
    boRetorno := processarValorBaseDeducaoDecimo();

    --Chamada da função que remove o evento de imposto de renda
    --Caso exista dependentes com pensão remove os evento de IRRF com pensão
    dtVigencia := recuperarBufferTexto('dtVigenciaIrrf');
    IF dtVigencia != 'NULL' THEN
        IF pega1QtdDependentesPensaoAlimenticia() > 0 THEN
            inCodTipo := 3;
            --Chamada da função que realiza o ajuste do IRRF entre folhas
            --TRUE:  Ajuste de IRRF COM PENSAO
            boRetorno := processarAjusteIRRFDecimo(TRUE);
            -- Deleta o Evento  calculado onde do valor do desconto = 0.00
            boRetorno := deletarEventoIRRFDecimoZerado(dtVigencia,'6',inCodContrato,inCodPeriodoMovimentacao);
        ELSE 
            inCodTipo := 6;
            --Chamada da função que realiza o ajuste do IRRF entre folhas
            --TRUE:  Ajuste de IRRF COM PENSAO
            boRetorno := processarAjusteIRRFDecimo(FALSE);
            -- Deleta o Evento  calculado onde do valor do desconto = 0.00
            boRetorno := deletarEventoIRRFDecimoZerado(dtVigencia,'3',inCodContrato,inCodPeriodoMovimentacao);
        END IF;
        stDadosRegistro             := buscaDadosRegistroEventoDecimoDeDescontoIRRF(dtVigencia,inCodTipo,inCodContrato,inCodPeriodoMovimentacao);              
        arDadosRegistro             := string_to_array(stDadosRegistro,'#');
        inCodRegistroDescontoIRRF   := arDadosRegistro[2];
        IF inCodRegistroDescontoIRRF IS NOT NULL THEN
            stSql := 'DELETE FROM folhapagamento'||stEntidade||'.evento_decimo_calculado WHERE cod_registro           ='|| inCodRegistroDescontoIRRF;
            EXECUTE stSql;
            stSql := 'DELETE FROM folhapagamento'||stEntidade||'.log_erro_calculo_decimo WHERE cod_registro           ='|| inCodRegistroDescontoIRRF;
            EXECUTE stSql;
            stSql := 'DELETE FROM folhapagamento'||stEntidade||'.registro_evento_decimo_parcela WHERE cod_registro    ='|| inCodRegistroDescontoIRRF;
            EXECUTE stSql;
            stSql := 'DELETE FROM folhapagamento'||stEntidade||'.ultimo_registro_evento_decimo  WHERE cod_registro    ='|| inCodRegistroDescontoIRRF;
            EXECUTE stSql;
        END IF;
    END IF;

    --Deletar o Evento de sistema calculados onde o valor FOR 0
    boRetorno := deletarEventosDeSistemaDecimoZerado(inCodContrato,inCodPeriodoMovimentacao);
    RETURN TRUE; 
EXCEPTION    
    WHEN others THEN 
        stSql := 'INSERT INTO folhapagamento'||stEntidade||'.log_erro_calculo_decimo (cod_evento,cod_registro,timestamp,desdobramento,erro) VALUES ('||inCodEvento||','||inCodRegistro||','''||stTimestamp||''','''||stDesdobramento||''',''Erro ao calcular o evento.'')';       
        EXECUTE stSql;
        RETURN FALSE;
END;
$$ LANGUAGE 'plpgsql';