dirfPlanoSaude.plsql
8.16 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
/*
**********************************************************************************
* *
* @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. *
* *
**********************************************************************************
*/
CREATE OR REPLACE FUNCTION dirfPlanoSaude(VARCHAR,VARCHAR,VARCHAR,VARCHAR,INTEGER,VARCHAR) RETURNS SETOF colunasDirfPlanoSaude AS $$
DECLARE
stEntidade ALIAS FOR $1;
stTipoFiltro ALIAS FOR $2;
stValoresFiltro ALIAS FOR $3;
stExercicio ALIAS FOR $4;
inCodEvento ALIAS FOR $5;
stExercicioAnterior ALIAS FOR $6;
stSelect VARCHAR;
rwPlanoSaude colunasDirfPlanoSaude%ROWTYPE;
vlPlanoSaudeServidor NUMERIC := 0;
vlPlanoSaude0 NUMERIC := 0;
vlPlanoSaude1 NUMERIC := 0;
vlPlanoSaude2 NUMERIC := 0;
vlPlanoSaude3 NUMERIC := 0;
reResultados RECORD;
reServidores RECORD;
rePeriodos RECORD;
BEGIN
-- select recuperar todos os servidores
stSelect := '
SELECT
cadastro.cod_contrato
,cadastro.registro
,cadastro.nom_cgm
,cadastro.numcgm
,cadastro.cpf
FROM (
SELECT
cod_contrato
,registro
,nom_cgm
,numcgm
,cpf
FROM
recuperarContratoServidor(''cgm'','|| quote_literal(stEntidade) ||',0,'|| quote_literal(stTipoFiltro) ||','|| quote_literal(stValoresFiltro) ||','|| quote_literal(stExercicio) ||')
UNION
SELECT
cod_contrato
,registro
,nom_cgm
,numcgm
,cpf
FROM
recuperarContratoPensionista(''cgm'','|| quote_literal(stEntidade) ||',0,'|| quote_literal(stTipoFiltro) ||','|| quote_literal(stValoresFiltro) ||','|| quote_literal(stExercicio) ||')
) as CADASTRO
WHERE NOT EXISTS ( SELECT 1
FROM pessoal'|| stEntidade ||'.contrato_servidor_caso_causa
WHERE contrato_servidor_caso_causa.cod_contrato = cadastro.cod_contrato
AND to_char(dt_rescisao,''yyyy'') < ''|| inExercicio ||'')
AND NOT EXISTS ( SELECT 1
FROM pessoal'|| stEntidade ||'.aposentadoria
WHERE aposentadoria.cod_contrato = cadastro.cod_contrato
AND NOT EXISTS ( SELECT 1
FROM pessoal'|| stEntidade ||'.aposentadoria_excluida
WHERE aposentadoria_excluida.cod_contrato = aposentadoria.cod_contrato
AND aposentadoria_excluida.timestamp = aposentadoria.timestamp
)
AND NOT EXISTS ( SELECT 1
FROM pessoal'|| stEntidade ||'.aposentadoria_encerramento
WHERE aposentadoria_encerramento.cod_contrato = aposentadoria.cod_contrato
AND aposentadoria_encerramento.timestamp = aposentadoria.timestamp
)
)
AND NOT EXISTS ( SELECT 1
FROM pessoal'|| stEntidade ||'.contrato_pensionista
WHERE contrato_pensionista.cod_contrato = cadastro.cod_contrato
AND contrato_pensionista.dt_encerramento IS NOT NULL
)
ORDER BY cadastro.cod_contrato';
-- para cada servidor calcula o evento em questão em todas as folhas (0 a 4)
FOR reServidores IN EXECUTE stSelect
LOOP
-- recupera todos os períodos de movimentação no exercício
stSelect := 'SELECT *
FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
WHERE to_char(dt_final,''yyyy'') = '|| quote_literal(stExercicio) ||' ';
IF stExercicioAnterior IS NOT NULL THEN
stSelect := stSelect || ' AND to_char(dt_final,''mm'') <> 12
UNION
SELECT *
FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
WHERE to_char(dt_final,''yyyy'') = '|| quote_literal(stExercicioAnterior) ||'
AND to_char(dt_final,''mm'') = 12';
END IF;
stSelect := stSelect || 'ORDER BY dt_final';
FOR rePeriodos IN EXECUTE stSelect
LOOP
vlPlanoSaude0 := vlPlanoSaude0 + (SELECT * from recupera_evento_calculado_dirf(0, rePeriodos.cod_periodo_movimentacao, reServidores.cod_contrato, inCodEvento, stEntidade));
vlPlanoSaude1 := vlPlanoSaude1 + (SELECT * from recupera_evento_calculado_dirf(1, rePeriodos.cod_periodo_movimentacao, reServidores.cod_contrato, inCodEvento, stEntidade));
vlPlanoSaude2 := vlPlanoSaude2 + (SELECT * from recupera_evento_calculado_dirf(2, rePeriodos.cod_periodo_movimentacao, reServidores.cod_contrato, inCodEvento, stEntidade));
vlPlanoSaude3 := vlPlanoSaude3 + (SELECT * from recupera_evento_calculado_dirf(3, rePeriodos.cod_periodo_movimentacao, reServidores.cod_contrato, inCodEvento, stEntidade));
END LOOP;
vlPlanoSaudeServidor := vlPlanoSaude0 + vlPlanoSaude1 + vlPlanoSaude2 + vlPlanoSaude3;
rwPlanoSaude.registro := reServidores.registro;
rwPlanoSaude.cod_contrato := reServidores.cod_contrato;
rwPlanoSaude.nom_cgm := reServidores.nom_cgm;
rwPlanoSaude.numcgm := reServidores.numcgm;
rwPlanoSaude.cpf := reServidores.cpf;
rwPlanoSaude.valor := vlPlanoSaudeServidor;
vlPlanoSaude0 := 0;
vlPlanoSaude1 := 0;
vlPlanoSaude2 := 0;
vlPlanoSaude3 := 0;
vlPlanoSaudeServidor := 0;
RETURN NEXT rwPlanoSaude;
END LOOP;
END;
$$ LANGUAGE 'plpgsql';