caged.plsql
21.3 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
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
/*
**********************************************************************************
* *
* @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. *
* *
**********************************************************************************
*/
DROP TYPE colunasCaged CASCADE;
CREATE TYPE colunasCaged AS (
sequencia INTEGER,
servidor_pis_pasep VARCHAR,
sexo INTEGER,
dt_nascimento VARCHAR(8),
cod_escolaridade INTEGER,
filler VARCHAR,
salario INTEGER,
horas_semanais INTEGER,
dt_admissao VARCHAR(8),
tipo_movimento INTEGER,
dia_rescisao VARCHAR(2),
nom_cgm VARCHAR(200),
numero VARCHAR,
serie VARCHAR,
cod_rais INTEGER,
portador_deficiencia INTEGER,
cbo VARCHAR,
aprendiz INTEGER,
sigla_uf VARCHAR(2),
num_deficiencia INTEGER
);
CREATE OR REPLACE FUNCTION caged(VARCHAR,INTEGER,VARCHAR,VARCHAR,VARCHAR,INTEGER,INTEGER) RETURNS SETOF colunasCaged AS $$
DECLARE
stEntidade ALIAS FOR $1;
inSequenciaParam ALIAS FOR $2;
stCompetencia ALIAS FOR $3;
stTipoFiltro ALIAS FOR $4;
stCodigos ALIAS FOR $5;
inCodAtributo ALIAS FOR $6;
boArray ALIAS FOR $7;
stSql VARCHAR;
reRegistro RECORD;
nuRemuneracao NUMERIC;
nuRemuneracaoAnterior NUMERIC;
inSequencia INTEGER:=inSequenciaParam;
inContador INTEGER;
rwCaged colunasCaged%ROWTYPE;
BEGIN
stSql := '
SELECT translate(sw_cgm_pessoa_fisica.servidor_pis_pasep::varchar,''.-'','''') as servidor_pis_pasep
, CASE WHEN sw_cgm_pessoa_fisica.sexo = ''f'' THEN 2
ELSE 1 END AS sexo
, to_char(sw_cgm_pessoa_fisica.dt_nascimento,''ddmmyyyy'') as dt_nascimento
, sw_cgm_pessoa_fisica.cod_escolaridade
, translate(contrato_servidor_salario.salario::varchar,''.'','''') as salario
, contrato_servidor_salario.horas_semanais::integer as horas_semanais
, contrato_servidor_nomeacao_posse.dt_admissao
, (SELECT num_caged FROM pessoal'||stEntidade||'.caged WHERE cod_caged = tipo_admissao_caged.cod_caged) as num_caged_admissao
, contrato_servidor_caso_causa.cod_caso_causa
, contrato_servidor_caso_causa.num_caged as num_caged_desligamento
, contrato_servidor_caso_causa.dt_rescisao
, upper(sw_cgm.nom_cgm) as nom_cgm
, ctps.numero
, translate(ctps.serie,''-'','''') as serie
, (SELECT cod_rais FROM cse.raca WHERE cod_raca = servidor.cod_raca) as cod_rais
, servidor_cid.cod_cid
, (SELECT codigo FROM pessoal'||stEntidade||'.cbo WHERE cod_cbo = cbo_cargo.cod_cbo) as cbo
, upper(ctps.sigla_uf) as sigla_uf
, (SELECT num_deficiencia FROM pessoal'||stEntidade||'.tipo_deficiencia WHERE cod_tipo_deficiencia = servidor_cid.cod_tipo_deficiencia) as num_deficiencia
, contrato_servidor.cod_contrato
, contrato_servidor.cod_sub_divisao
FROM pessoal'||stEntidade||'.servidor
LEFT JOIN (SELECT servidor_cid.*
, cid.cod_tipo_deficiencia
FROM pessoal'||stEntidade||'.servidor_cid
, ( SELECT cod_servidor
, max(timestamp) as timestamp
FROM pessoal'||stEntidade||'.servidor_cid
GROUP BY cod_servidor) as max_servidor_cid
, pessoal'||stEntidade||'.cid
WHERE servidor_cid.cod_servidor = max_servidor_cid.cod_servidor
AND servidor_cid.timestamp = max_servidor_cid.timestamp
AND servidor_cid.cod_cid = cid.cod_cid) as servidor_cid
ON servidor.cod_servidor = servidor_cid.cod_servidor
LEFT JOIN (SELECT servidor_ctps.*
, ctps.numero
, ctps.serie
, (SELECT sigla_uf FROM sw_uf WHERE cod_uf = ctps.uf_expedicao) as sigla_uf
FROM pessoal'||stEntidade||'.servidor_ctps
, pessoal'||stEntidade||'.ctps
, ( SELECT cod_ctps
, max(dt_emissao) as dt_emissao
FROM pessoal'||stEntidade||'.ctps
GROUP BY cod_ctps) as max_ctps
WHERE servidor_ctps.cod_ctps = ctps.cod_ctps
AND ctps.cod_ctps = max_ctps.cod_ctps
AND ctps.dt_emissao = max_ctps.dt_emissao) AS ctps
ON servidor.cod_servidor = ctps.cod_servidor
, pessoal'||stEntidade||'.servidor_contrato_servidor
, pessoal'||stEntidade||'.contrato_servidor';
IF stTipoFiltro = 'atributo_servidor' THEN
stSql := stSql || ' LEFT JOIN (SELECT atributo_contrato_servidor_valor.*
FROM pessoal'||stEntidade||'.atributo_contrato_servidor_valor
, ( SELECT cod_contrato
, max(timestamp) as timestamp
FROM pessoal'||stEntidade||'.atributo_contrato_servidor_valor
GROUP BY cod_contrato) as max_atributo_contrato_servidor_valor
WHERE atributo_contrato_servidor_valor.cod_contrato = max_atributo_contrato_servidor_valor.cod_contrato
AND atributo_contrato_servidor_valor.timestamp = max_atributo_contrato_servidor_valor.timestamp) as atributo_contrato_servidor_valor
ON atributo_contrato_servidor_valor.cod_contrato = contrato_servidor.cod_contrato';
END IF;
stSql := stSql || '
LEFT JOIN pessoal'||stEntidade||'.tipo_admissao_caged
ON contrato_servidor.cod_tipo_admissao = tipo_admissao_caged.cod_tipo_admissao
LEFT JOIN (SELECT cbo_cargo.*
FROM pessoal'||stEntidade||'.cbo_cargo
, ( SELECT cod_cargo
, max(timestamp) as timestamp
FROM pessoal'||stEntidade||'.cbo_cargo
GROUP BY cod_cargo) as max_cbo_cargo
WHERE cbo_cargo.cod_cargo = max_cbo_cargo.cod_cargo
AND cbo_cargo.timestamp = max_cbo_cargo.timestamp) AS cbo_cargo
ON contrato_servidor.cod_cargo = cbo_cargo.cod_cargo
LEFT JOIN (SELECT contrato_servidor_local.*
FROM pessoal'||stEntidade||'.contrato_servidor_local
, ( SELECT cod_contrato
, max(timestamp) as timestamp
FROM pessoal'||stEntidade||'.contrato_servidor_local
GROUP BY cod_contrato) as max_contrato_servidor_local
WHERE contrato_servidor_local.cod_contrato = max_contrato_servidor_local.cod_contrato
AND contrato_servidor_local.timestamp = max_contrato_servidor_local.timestamp) as contrato_servidor_local
ON contrato_servidor.cod_contrato = contrato_servidor_local.cod_contrato
LEFT JOIN (SELECT contrato_servidor_caso_causa.cod_contrato
, contrato_servidor_caso_causa.cod_caso_causa
, contrato_servidor_caso_causa.dt_rescisao
, (SELECT num_caged FROM pessoal'||stEntidade||'.caged WHERE cod_caged = causa_rescisao_caged.cod_caged) as num_caged
FROM pessoal'||stEntidade||'.contrato_servidor_caso_causa
, pessoal'||stEntidade||'.caso_causa
, pessoal'||stEntidade||'.causa_rescisao
LEFT JOIN pessoal'||stEntidade||'.causa_rescisao_caged
ON causa_rescisao.cod_causa_rescisao = causa_rescisao_caged.cod_causa_rescisao
WHERE contrato_servidor_caso_causa.cod_caso_causa = caso_causa.cod_caso_causa
AND caso_causa.cod_causa_rescisao = causa_rescisao.cod_causa_rescisao) as contrato_servidor_caso_causa
ON contrato_servidor.cod_contrato = contrato_servidor_caso_causa.cod_contrato
, pessoal'||stEntidade||'.contrato_servidor_nomeacao_posse
, ( SELECT cod_contrato
, max(timestamp) as timestamp
FROM pessoal'||stEntidade||'.contrato_servidor_nomeacao_posse
GROUP BY cod_contrato) as max_contrato_servidor_nomeacao_posse
, pessoal'||stEntidade||'.contrato_servidor_salario
, ( SELECT cod_contrato
, max(timestamp) as timestamp
FROM pessoal'||stEntidade||'.contrato_servidor_salario
GROUP BY cod_contrato) as max_contrato_servidor_salario
, pessoal'||stEntidade||'.contrato_servidor_orgao
, ( SELECT cod_contrato
, max(timestamp) as timestamp
FROM pessoal'||stEntidade||'.contrato_servidor_orgao
GROUP BY cod_contrato) as max_contrato_servidor_orgao
, sw_cgm
, sw_cgm_pessoa_fisica
WHERE servidor.cod_servidor = servidor_contrato_servidor.cod_servidor
AND servidor.numcgm = sw_cgm.numcgm
AND sw_cgm.numcgm = sw_cgm_pessoa_fisica.numcgm
AND servidor_contrato_servidor.cod_contrato = contrato_servidor.cod_contrato
AND servidor_contrato_servidor.cod_contrato = contrato_servidor_nomeacao_posse.cod_contrato
AND contrato_servidor_nomeacao_posse.cod_contrato = max_contrato_servidor_nomeacao_posse.cod_contrato
AND contrato_servidor_nomeacao_posse.timestamp = max_contrato_servidor_nomeacao_posse.timestamp
AND servidor_contrato_servidor.cod_contrato = contrato_servidor_salario.cod_contrato
AND contrato_servidor_salario.cod_contrato = max_contrato_servidor_salario.cod_contrato
AND contrato_servidor_salario.timestamp = max_contrato_servidor_salario.timestamp
AND servidor_contrato_servidor.cod_contrato = contrato_servidor_orgao.cod_contrato
AND contrato_servidor_orgao.cod_contrato = max_contrato_servidor_orgao.cod_contrato
AND contrato_servidor_orgao.timestamp = max_contrato_servidor_orgao.timestamp
AND contrato_servidor.cod_regime = 1
AND (to_char(contrato_servidor_caso_causa.dt_rescisao,''yyyy-mm'') = '''||stCompetencia||'''
OR to_char(contrato_servidor_nomeacao_posse.dt_admissao,''yyyy-mm'') = '''||stCompetencia||''')';
IF stTipoFiltro = 'contrato_todos' OR stTipoFiltro = 'cgm_contrato_todos' THEN
stSql := stSql || ' AND contrato_servidor.cod_contrato IN ('||stCodigos||')';
END IF;
IF stTipoFiltro = 'lotacao' THEN
stSql := stSql || ' AND contrato_servidor_orgao.cod_orgao IN ('||stCodigos||')';
END IF;
IF stTipoFiltro = 'local' THEN
stSql := stSql || ' AND contrato_servidor_local.cod_local IN ('||stCodigos||')';
END IF;
IF stTipoFiltro = 'atributo_servidor' THEN
stSql := stSql || ' AND atributo_contrato_servidor_valor.cod_atributo = '||inCodAtributo;
IF boArray = 1 THEN
stSql := stSql || ' AND atributo_contrato_servidor_valor.valor IN ('||stCodigos||')';
ELSE
stSql := stSql || ' AND atributo_contrato_servidor_valor.valor = '''||stCodigos||'''';
END IF;
END IF;
stSql := stSql || ' ORDER by nom_cgm';
FOR reRegistro IN EXECUTE stSql LOOP
stSql := 'SELECT translate(sum(evento_calculado.valor)::text,''.'','''') as valor
FROM folhapagamento'||stEntidade||'.evento_calculado
, folhapagamento'||stEntidade||'.registro_evento_periodo
, folhapagamento'||stEntidade||'.evento
WHERE evento_calculado.cod_registro = registro_evento_periodo.cod_registro
AND evento_calculado.cod_evento = evento.cod_evento
AND registro_evento_periodo.cod_contrato = '||reRegistro.cod_contrato||'
AND registro_evento_periodo.cod_periodo_movimentacao = (SELECT cod_periodo_movimentacao
FROM folhapagamento'||stEntidade||'.periodo_movimentacao
WHERE to_char(dt_final,''yyyy-mm'') = '''||stCompetencia||''')
AND EXISTS (SELECT 1
FROM ima'||stEntidade||'.caged_evento
WHERE caged_evento.cod_evento = evento_calculado.cod_evento)';
nuRemuneracao := selectIntoNumeric(stSql);
IF to_char(reRegistro.dt_admissao,'yyyy-mm') = stCompetencia THEN
stSql := 'SELECT COUNT(1)
FROM ima'||stEntidade||'.caged_sub_divisao
WHERE cod_sub_divisao = '||reRegistro.cod_sub_divisao;
inContador := selectIntoInteger(stSql);
IF reRegistro.num_caged_admissao IS NOT NULL OR inContador >= 1 THEN
rwCaged.sequencia := inSequencia;
rwCaged.servidor_pis_pasep := reRegistro.servidor_pis_pasep;
rwCaged.sexo := reRegistro.sexo;
rwCaged.dt_nascimento := reRegistro.dt_nascimento;
rwCaged.cod_escolaridade := reRegistro.cod_escolaridade;
rwCaged.salario := nuRemuneracao;
rwCaged.horas_semanais := reRegistro.horas_semanais;
rwCaged.dt_admissao := to_char(reRegistro.dt_admissao,'ddmmyyyy');
rwCaged.tipo_movimento := reRegistro.num_caged_admissao;
rwCaged.dia_rescisao := '';
rwCaged.nom_cgm := reRegistro.nom_cgm;
rwCaged.numero := reRegistro.numero;
rwCaged.serie := reRegistro.serie;
rwCaged.cod_rais := reRegistro.cod_rais;
IF reRegistro.cod_cid > 0 THEN
rwCaged.portador_deficiencia := 1;
ELSE
rwCaged.portador_deficiencia := 2;
END IF;
rwCaged.cbo := reRegistro.cbo;
rwCaged.aprendiz := 2;
rwCaged.sigla_uf := reRegistro.sigla_uf;
rwCaged.num_deficiencia := reRegistro.num_deficiencia;
inSequencia := inSequencia + 1;
RETURN NEXT rwCaged;
END IF;
END IF;
IF reRegistro.num_caged_desligamento IS NOT NULL THEN
stSql := 'SELECT translate(sum(evento_calculado.valor)::text,''.'','''') as valor
FROM folhapagamento'||stEntidade||'.evento_calculado
, folhapagamento'||stEntidade||'.registro_evento_periodo
, folhapagamento'||stEntidade||'.evento
WHERE evento_calculado.cod_registro = registro_evento_periodo.cod_registro
AND evento_calculado.cod_evento = evento.cod_evento
AND registro_evento_periodo.cod_contrato = '||reRegistro.cod_contrato||'
AND registro_evento_periodo.cod_periodo_movimentacao = (SELECT cod_periodo_movimentacao
FROM folhapagamento'||stEntidade||'.periodo_movimentacao
WHERE to_char(dt_final,''yyyy-mm'') = '''||to_char(to_date(stCompetencia,'yyyy-mm')::date-1,'yyyy-mm')||''')
AND EXISTS (SELECT 1
FROM ima'||stEntidade||'.caged_evento
WHERE caged_evento.cod_evento = evento_calculado.cod_evento)';
nuRemuneracaoAnterior := selectIntoNumeric(stSql);
IF nuRemuneracaoAnterior is NULL THEN
stSql := 'SELECT translate(sum(evento_rescisao_calculado.valor)::text,''.'','''') as valor
FROM folhapagamento'||stEntidade||'.evento_rescisao_calculado
, folhapagamento'||stEntidade||'.registro_evento_rescisao
, folhapagamento'||stEntidade||'.evento
WHERE evento_rescisao_calculado.cod_registro = registro_evento_rescisao.cod_registro
AND evento_rescisao_calculado.cod_evento = registro_evento_rescisao.cod_evento
AND evento_rescisao_calculado.desdobramento = registro_evento_rescisao.desdobramento
AND evento_rescisao_calculado.timestamp_registro = registro_evento_rescisao.timestamp
AND evento_rescisao_calculado.desdobramento = ''S''
AND evento_rescisao_calculado.cod_evento = evento.cod_evento
AND registro_evento_rescisao.cod_contrato = '||reRegistro.cod_contrato||'
AND registro_evento_rescisao.cod_periodo_movimentacao = (SELECT cod_periodo_movimentacao
FROM folhapagamento'||stEntidade||'.periodo_movimentacao
WHERE to_char(dt_final,''yyyy-mm'') = '''||stCompetencia||''')
AND EXISTS (SELECT 1
FROM ima'||stEntidade||'.caged_evento
WHERE caged_evento.cod_evento = evento_rescisao_calculado.cod_evento)';
nuRemuneracaoAnterior := selectIntoNumeric(stSql);
END IF;
IF nuRemuneracaoAnterior is NULL THEN
nuRemuneracaoAnterior := nuRemuneracao;
END IF;
rwCaged.sequencia := inSequencia;
rwCaged.servidor_pis_pasep := reRegistro.servidor_pis_pasep;
rwCaged.sexo := reRegistro.sexo;
rwCaged.dt_nascimento := reRegistro.dt_nascimento;
rwCaged.cod_escolaridade := reRegistro.cod_escolaridade;
rwCaged.salario := nuRemuneracaoAnterior;
rwCaged.horas_semanais := reRegistro.horas_semanais;
rwCaged.dt_admissao := to_char(reRegistro.dt_admissao,'ddmmyyyy');
rwCaged.tipo_movimento := reRegistro.num_caged_desligamento;
rwCaged.dia_rescisao := to_char(reRegistro.dt_rescisao,'dd');
rwCaged.nom_cgm := reRegistro.nom_cgm;
rwCaged.numero := reRegistro.numero;
rwCaged.serie := reRegistro.serie;
rwCaged.cod_rais := reRegistro.cod_rais;
IF reRegistro.cod_cid > 0 THEN
rwCaged.portador_deficiencia := 1;
ELSE
rwCaged.portador_deficiencia := 2;
END IF;
rwCaged.cbo := reRegistro.cbo;
rwCaged.aprendiz := 2;
rwCaged.sigla_uf := reRegistro.sigla_uf;
rwCaged.num_deficiencia := reRegistro.num_deficiencia;
inSequencia := inSequencia + 1;
RETURN NEXT rwCaged;
END IF;
END LOOP;
END
$$ LANGUAGE 'plpgsql';
-- SELECT * FROM caged(''
-- ,3
-- ,'2008-01'
-- ,'contrato_todos'
-- ,'1344'
-- ,0
-- ,0);