gerarRestosPagar.plsql
11.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
**********************************************************************************
* *
* @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';