gerarRestosPagar.plsql 11.2 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.       *
    *                                                                                *
    **********************************************************************************
*/
/*
 * funcao para gerar os restos a pagar
 * Data de Criação   : 22/12/2008 Nacional de Municípios

 * @author Analista      Tonismar Régis Bernardo
 * @author Desenvolvedor Henrique Boaventura
 
 * @package URBEM

 *  $Id: gerarRestosPagar.plsql 59820 2014-09-12 18:17:20Z luciana $
*/

CREATE OR REPLACE FUNCTION contabilidade.fn_gerar_restos_pagar(VARCHAR) RETURNS VARCHAR AS $$
DECLARE
    stExercicio             ALIAS FOR $1;

    stSql                   VARCHAR   := '';
    stCodEntidade           VARCHAR   := '';
    entidadeAtual           VARCHAR   := '';
    entidadeAnterior        VARCHAR   := '';
    inCodLote               INTEGER   := NULL;
    sequencia               VARCHAR   := '';
    flSomatorio             NUMERIC   := 0;
    reRegistro              RECORD;
    stSqlAux                VARCHAR   := '';

BEGIN

    -------------------------------------
    -- Retorna as entidades do sistema --
    -------------------------------------
    SELECT ARRAY_TO_STRING(ARRAY(SELECT CAST(entidade.cod_entidade AS VARCHAR) 
                                   FROM orcamento.entidade
                                  WHERE entidade.exercicio = stExercicio
                                    AND EXISTS ( SELECT 1
                                                   FROM contabilidade.conta_lancamento_rp
                                                  WHERE entidade.exercicio    = conta_lancamento_rp.exercicio
                                                    AND entidade.cod_entidade = conta_lancamento_rp.cod_entidade
                                               )
                           ),',')
      INTO stCodEntidade;

    -----------------------------------------------------------------------------
    -- Cria uma tabela temporaria com os valores nao processados e processados --
    -----------------------------------------------------------------------------
    CREATE TEMPORARY TABLE tmp_valores_insuficiencia AS
        SELECT retorno.*
             , buscaCodigoEstrutural(retorno.exercicio,retorno.cod_plano_debito) AS cod_estrutural
          FROM stn.fn_rel_rgf6_emp_liq_exercicio_recurso_empenho( stCodEntidade::varchar,
                                                                   stExercicio, 
                                                                   '01/01/' || stExercicio, 
                                                                   '31/12/' || stExercicio, 
                                                                   '31/12/' || stExercicio 
                                                                 ) as retorno
             ( cod_empenho integer,
               cod_recurso integer,
               nom_recurso varchar,
               cod_entidade integer, 
               exercicio varchar, 
               cod_plano_debito varchar,
               liquidados_nao_pagos numeric, 
               empenhados_nao_liquidados numeric
             )
             
        WHERE cod_estrutural LIKE '6.2.2.1.3.03%' OR cod_estrutural LIKE '6.2.2.1.3.01%';
        
        IF (stExercicio > '2013') THEN -- identifica se ja foi liquidado
            stSql := 'SELECT * FROM tmp_valores_insuficiencia
                               JOIN empenho.empenho
                                 ON empenho.exercicio = tmp_valores_insuficiencia.exercicio
                                AND empenho.cod_entidade = tmp_valores_insuficiencia.cod_entidade
                                AND empenho.cod_empenho = tmp_valores_insuficiencia.cod_empenho
                               JOIN empenho.pre_empenho
                                 ON pre_empenho.exercicio = empenho.exercicio
                                AND pre_empenho.cod_pre_empenho = empenho.cod_pre_empenho
                               JOIN empenho.pre_empenho_despesa
                                 ON pre_empenho_despesa.exercicio = pre_empenho.exercicio
                                AND pre_empenho_despesa.cod_pre_empenho = pre_empenho.cod_pre_empenho
                               JOIN orcamento.conta_despesa
                                 ON conta_despesa.exercicio = pre_empenho_despesa.exercicio
                                AND conta_despesa.cod_conta = pre_empenho_despesa.cod_conta
                               JOIN contabilidade.plano_conta
                                 ON plano_conta.cod_conta = conta_despesa.cod_conta
                                AND plano_conta.exercicio = conta_despesa.exercicio
                               JOIN contabilidade.plano_analitica
                                 ON plano_analitica.exercicio = plano_conta.exercicio
                                AND plano_analitica.cod_conta = plano_conta.cod_conta
                    ';
                    
            FOR reRegistro IN EXECUTE stSql
            LOOP
                UPDATE empenho.empenho SET restos_pagar = 'NP Liquidado' WHERE exercicio = reRegistro.exercicio AND cod_entidade = reRegistro.cod_entidade AND cod_empenho = reRegistro.cod_empenho AND reRegistro.cod_estrutural LIKE '6.2.2.1.3.01%';
            END LOOP;
        END IF;
        
        stSql := 'SELECT * FROM tmp_valores_insuficiencia';
        
        FOR reRegistro IN EXECUTE stSql
        LOOP
            UPDATE empenho.empenho SET restos_pagar = 'Processado' WHERE exercicio = reRegistro.exercicio AND cod_entidade = reRegistro.cod_entidade AND cod_empenho = reRegistro.cod_empenho AND reRegistro.cod_estrutural LIKE '6.2.2.1.3.03%';
            UPDATE empenho.empenho SET restos_pagar = 'NP a Liquidar' WHERE exercicio = reRegistro.exercicio AND cod_entidade = reRegistro.cod_entidade AND cod_empenho = reRegistro.cod_empenho AND reRegistro.cod_estrutural LIKE '6.2.2.1.3.01%';
        END LOOP;

    -------------------------------------------------------
    -- Faz lancamento dos restos a pagar nao processados --
    -------------------------------------------------------
    stSql := '
        SELECT tmp_valores_insuficiencia.exercicio
             , tmp_valores_insuficiencia.cod_entidade
             , buscaCodigoEstrutural(tmp_valores_insuficiencia.exercicio, contabilidade.fn_busca_conta_lancamento_rp(tmp_valores_insuficiencia.exercicio,tmp_valores_insuficiencia.cod_entidade,1)::VARCHAR) AS cod_estrutural_credito
             , buscaCodigoEstrutural(tmp_valores_insuficiencia.exercicio, contabilidade.fn_busca_conta_lancamento_rp(tmp_valores_insuficiencia.exercicio,tmp_valores_insuficiencia.cod_entidade,2)::VARCHAR) AS cod_estrutural_debito
             , tmp_valores_insuficiencia.empenhados_nao_liquidados AS valor_rp
             , CAST(''Valor ref. Inscrição de RP Não Processados.'' AS VARCHAR) AS complemento
          FROM (SELECT cod_recurso, nom_recurso, cod_entidade, exercicio, cod_plano_debito, SUM(liquidados_nao_pagos) AS liquidados_nao_pagos, SUM(empenhados_nao_liquidados) AS empenhados_nao_liquidados, cod_estrutural
                  FROM tmp_valores_insuficiencia
                GROUP BY cod_recurso, nom_recurso, cod_entidade, exercicio, cod_plano_debito, cod_estrutural) AS tmp_valores_insuficiencia

         UNION ALL
            
        SELECT entidade.exercicio
             , entidade.cod_entidade
             , buscaCodigoEstrutural(entidade.exercicio, contabilidade.fn_busca_conta_lancamento_rp(entidade.exercicio,entidade.cod_entidade,3)::VARCHAR) AS cod_estrutural_credito
             , buscaCodigoEstrutural(entidade.exercicio, contabilidade.fn_busca_conta_lancamento_rp(entidade.exercicio,entidade.cod_entidade,4)::VARCHAR) AS cod_estrutural_debito
             , contabilidade.fn_saldo_conta_analitica_entidade(entidade.exercicio,contabilidade.fn_busca_conta_lancamento_rp(entidade.exercicio,entidade.cod_entidade,3),entidade.cod_entidade) AS valor_rp
             , CAST(''Valor ref. Inscrição de RP Processados.'' AS VARCHAR) AS complemento
          FROM orcamento.entidade
         WHERE entidade.exercicio = ''' || stExercicio || '''
           AND entidade.cod_entidade IN ('|| stCodEntidade ||')
           
      ORDER BY cod_entidade
             , exercicio

    ';
    
    FOR reRegistro IN EXECUTE stSql
    LOOP
        entidadeAtual := reRegistro.cod_entidade;
        IF(entidadeAtual != entidadeAnterior)
        THEN
            inCodLote := contabilidade.fn_insere_lote( reRegistro.exercicio    -- stExercicio
                                                     , reRegistro.cod_entidade         -- inCodEntidade
                                                     , 'M'                                      -- stTipo
                                                     , 'ENCERRAMENTO DO EXERCÍCIO'              -- stNomeLote
                                                     , '31/12/' || stExercicio                  -- stDataLote
                                                     );
        END IF;
        
        stSqlAux := 'SELECT *
                        FROM contabilidade.lote
                        WHERE cod_entidade = ' || reRegistro.cod_entidade || '
                          AND exercicio = '''|| reRegistro.exercicio || '''
                          AND dt_lote = ''|| reRegistro.exercicio || ''-12-31''
                          AND tipo = ''M''
                          AND nom_lote = ''ENCERRAMENTO DO EXERCÍCIO''';
        
        IF(reRegistro.valor_rp <> 0)
        THEN
            sequencia := FazerLancamento(reRegistro.cod_estrutural_debito,reRegistro.cod_estrutural_credito,800,reRegistro.exercicio,abs(reRegistro.valor_rp),reRegistro.complemento,inCodLote,CAST('M' AS VARCHAR),reRegistro.cod_entidade);
        END IF;

    END LOOP;

    RETURN stCodEntidade;
   
    DROP TABLE tmp_valores_insuficiencia;

END;
$$ language 'plpgsql';