processarValorBaseDeducaoDecimo.plsql
20.7 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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
/*
**********************************************************************************
* *
* @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';