exportarPonto.plsql
14.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
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
/*
**********************************************************************************
* *
* @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. *
* *
**********************************************************************************
*/
/* exportarPonto
*
* Data de Criação : 23/10/2008
* @author Analista Dagiane Vieira
* @author Desenvolvedor Diego Lemos de Souza
* @package URBEM
* @subpackage
$Id:$
*/
CREATE OR REPLACE FUNCTION exportarPonto(INTEGER,VARCHAR,VARCHAR,VARCHAR,VARCHAR,VARCHAR,INTEGER) RETURNS SETOF colunasExportarPonto AS $$
DECLARE
inCodFormato ALIAS FOR $1;
stPeriodoInicial ALIAS FOR $2;
stPeriodoFinal ALIAS FOR $3;
stEntidade ALIAS FOR $4;
stTipoFiltro ALIAS FOR $5;
stCodigosFiltro ALIAS FOR $6;
inExercicio ALIAS FOR $7;
rwExportarPonto colunasExportarPonto%ROWTYPE;
inCodEvento INTEGER;
stSql VARCHAR;
stExtras VARCHAR;
stHora VARCHAR;
stHoraExtraSemana VARCHAR:='00:00';
stHoraExtraMensal VARCHAR:='00:00';
stQuantidade VARCHAR;
stQuantidadeFormatado VARCHAR;
stQuantidadeDias VARCHAR;
stHoraTemp VARCHAR;
stCodDiasSemana VARCHAR:='';
stCodDiasMensal VARCHAR:='';
arCodigosFiltro VARCHAR[];
reContrato RECORD;
reFormato RECORD;
reEspelhoPonto RECORD;
reExtras RECORD;
reFaixas RECORD;
reEspelhoPontoResumo RECORD;
arQuantidade INTEGER[];
BEGIN
--Limpa a tabela que armazena os dados para a geração do relatório
stSql := 'DELETE FROM ponto'||stEntidade||'.exportacao_ponto';
execute stSql;
stSql := 'SELECT cadastro.cod_contrato
, cadastro.registro
, cadastro.cod_grade
, configuracao_relogio_ponto'||stEntidade||'.cod_configuracao
FROM ( SELECT *
FROM recuperarContratoServidor(''s,o,l,rf,sf,f,ef'','''||stEntidade||''',''0'','''||stTipoFiltro||''','''||stCodigosFiltro||''','''||inExercicio||''')
) as cadastro';
stSql := stSql || '
JOIN ponto'||stEntidade||'.configuracao_lotacao
ON cadastro.cod_orgao = configuracao_lotacao.cod_orgao
JOIN ponto'||stEntidade||'.configuracao_relogio_ponto
ON configuracao_lotacao.cod_configuracao = configuracao_relogio_ponto'||stEntidade||'.cod_configuracao
AND configuracao_lotacao.timestamp = configuracao_relogio_ponto'||stEntidade||'.ultimo_timestamp
WHERE NOT EXISTS (SELECT 1
FROM ponto'||stEntidade||'.configuracao_relogio_ponto_exclusao
WHERE configuracao_relogio_ponto_exclusao.cod_configuracao = configuracao_relogio_ponto'||stEntidade||'.cod_configuracao)
AND recuperarSituacaoDoContrato(cadastro.cod_contrato,0,'''||stEntidade||''') NOT IN (''R'', ''P'')';
stSql := stSql || ' ORDER BY cadastro.registro';
FOR reContrato IN EXECUTE stSql LOOP
SELECT sum(hs_trab::TIME) as hs_trab
, SUM(ad_not::TIME) as ad_not
, SUM(extras::TIME) as extras
, SUM(atrasos::TIME) as atrasos
, SUM(faltas::TIME) AS faltas
, SUM(pega0DiasPorCargaHoraria(faltas::time,carga_horaria::time)) as faltas_dias
, SUM(pega0DiasPorCargaHoraria(hs_trab::time,carga_horaria::time)) as hs_trab_dias
, SUM(pega0DiasPorCargaHoraria(ad_not::time,carga_horaria::time)) as ad_not_dias
INTO reEspelhoPonto
FROM recuperaRelatorioEspelhoPonto(reContrato.cod_contrato,reContrato.cod_configuracao,reContrato.cod_grade,stPeriodoInicial,stPeriodoFinal,stEntidade);
SELECT *
INTO reEspelhoPontoResumo
FROM recuperaRelatorioEspelhoPontoResumo(reContrato.cod_contrato,reContrato.cod_configuracao,to_date(stPeriodoInicial,'dd/mm/yyyy'),to_date(stPeriodoFinal,'dd/mm/yyyy'),stEntidade);
--Informação do Relógio Ponto
--1 | Horas Trabalhadas
--2 | Adicional Noturno
--3 | Atrasos
--4 | Faltas
--5 | Abonos DSR
--6 | Descontos DSR
--7 | Horas Extras
stSql := 'SELECT dados_exportacao.*
, evento.codigo
, formato_exportacao.formato_minutos
, COALESCE(formato_informacao.formato,''H'') as formato
FROM ponto'||stEntidade||'.dados_exportacao
LEFT JOIN ponto'||stEntidade||'.formato_informacao
ON formato_informacao.cod_formato = dados_exportacao.cod_formato
AND formato_informacao.cod_dado = dados_exportacao.cod_dado
JOIN ponto'||stEntidade||'.formato_exportacao
ON formato_exportacao.cod_formato = dados_exportacao.cod_formato
JOIN folhapagamento'||stEntidade||'.evento
ON evento.cod_evento = dados_exportacao.cod_evento
WHERE dados_exportacao.cod_formato = '||inCodFormato;
FOR reFormato IN EXECUTE stSql LOOP
stHora := null;
--Horas Trabalhadas
IF reFormato.cod_tipo = 1 AND reEspelhoponto.hs_trab IS NOT NULL THEN
stHora := reEspelhoponto.hs_trab;
stQuantidadeDias := reEspelhoponto.hs_trab_dias;
END IF;
--Adicional Noturno
IF reFormato.cod_tipo = 2 AND reEspelhoponto.ad_not IS NOT NULL THEN
stHora := reEspelhoponto.ad_not;
stQuantidadeDias := reEspelhoponto.ad_not_dias;
END IF;
--Atrasos
IF reFormato.cod_tipo = 3 AND reEspelhoponto.atrasos IS NOT NULL THEN
stHora := reEspelhoponto.atrasos;
END IF;
--Faltas
IF reFormato.cod_tipo = 4 AND reEspelhoponto.faltas IS NOT NULL THEN
stHora := reEspelhoponto.faltas;
stQuantidadeDias := reEspelhoponto.faltas_dias;
END IF;
--Abonos DSR
IF reFormato.cod_tipo = 5 AND reEspelhoPontoResumo.abono_dsr IS NOT NULL THEN
stHora := reEspelhoPontoResumo.abono_dsr;
END IF;
--Descontos DSR
IF reFormato.cod_tipo = 6 AND reEspelhoPontoResumo.desc_dsr IS NOT NULL THEN
stHora := reEspelhoPontoResumo.desc_dsr;
END IF;
--Horas Extras
IF reFormato.cod_tipo = 7 AND reEspelhoponto.extras IS NOT NULL THEN
stHora := '00:00';
-- stSql := 'SELECT *
-- , dias_turno.cod_dia
-- FROM recuperaRelatorioEspelhoPonto('||reContrato.cod_contrato||','||reContrato.cod_configuracao||','||reContrato.cod_grade||','''||stPeriodoInicial||''','''||stPeriodoFinal||''','''||stEntidade||''')
-- JOIN pessoal'||stEntidade||'.dias_turno
-- ON replace(dias_turno.nom_dia,''-feira'','''') = dia';
stSql := 'SELECT relatorio_espelho_ponto.*
, dias_turno.cod_dia
FROM ponto'||stEntidade||'.relatorio_espelho_ponto
JOIN pessoal'||stEntidade||'.dias_turno
ON replace(dias_turno.nom_dia,''-feira'','''') = relatorio_espelho_ponto.dia';
FOR reExtras IN EXECUTE stSql LOOP
--PROCESSAMENTO DIÁRIO
stHoraTemp := pega0ExtrasPorCalculo(reFormato.cod_evento,reExtras.cod_dia::varchar,'D',reExtras.extras,stEntidade);
stHora := selectIntoVarchar('SELECT INTERVAL '''||stHora||''' + INTERVAL '''||stHoraTemp||''' ');
--PROCESSAMENTO SEMANAL
IF reExtras.extras IS NOT NULL THEN
--Dias onde foram encontradas horas extras para a semana
stCodDiasSemana := stCodDiasSemana||reExtras.cod_dia||',';
--Horas extras da semana
stHoraExtraSemana := selectIntoVarchar('SELECT INTERVAL '''||stHoraExtraSemana||''' + INTERVAL '''||reExtras.extras||''' ');
END IF;
IF reExtras.cod_dia = 7 OR reExtras.data = to_char(last_day(to_date(reExtras.data,'dd/mm/yyyy')),'dd/mm/yyyy') THEN
stCodDiasSemana := substr(stCodDiasSemana,1,char_length(stCodDiasSemana)-1);
stHoraTemp := pega0ExtrasPorCalculo(reFormato.cod_evento,stCodDiasSemana::varchar,'S',stHoraExtraSemana,stEntidade);
stHora := selectIntoVarchar('SELECT INTERVAL '''||stHora||''' + INTERVAL '''||stHoraTemp||''' ');
stCodDiasSemana := '';
stHoraExtraSemana := '00:00';
END IF;
--PROCESSAMENTO MENSAL
IF reExtras.extras IS NOT NULL THEN
--Dias onde foram encontradas horas extras para o mês
stCodDiasMensal := stCodDiasMensal||reExtras.cod_dia||',';
--Horas extras do mês
stHoraExtraMensal := selectIntoVarchar('SELECT INTERVAL '''||stHoraExtraMensal||''' + INTERVAL '''||reExtras.extras||''' ');
END IF;
IF reExtras.data = to_char(last_day(to_date(reExtras.data,'dd/mm/yyyy')),'dd/mm/yyyy') THEN
stCodDiasMensal := substr(stCodDiasMensal,1,char_length(stCodDiasMensal)-1);
stHoraTemp := pega0ExtrasPorCalculo(reFormato.cod_evento,stCodDiasMensal,'M',stHoraExtraMensal,stEntidade);
stHora := selectIntoVarchar('SELECT INTERVAL '''||stHora||''' + INTERVAL '''||stHoraTemp||''' ');
stCodDiasMensal := '';
stHoraExtraMensal := '00:00';
END IF;
END LOOP;
END IF;
IF stHora is not null THEN
--VERIFICAÇÃO DO FORMATO QUE DEVERÁ SER DEMONSTRADO OS VALORES DAS HORAS
--DEPENDE DA CARGA HORÁRIO QUE O SERVIDOR DEVE FAZER EM CADA DIA
--D: 10hs e 50 min = 10:50/Carga horaria
--H: Segue para a próxima verificação
IF reFormato.formato = 'D' THEN
stQuantidade := stQuantidadeDias;
stQuantidadeFormatado := stQuantidadeDias;
ELSE
--VERIFICAÇÃO DO FORMATO QUE DEVERÁ SER DEMONSTRADO OS VALORES DAS HORAS
--D: 10hs e 50 min = 10,83 horas => 1083
--H: 10hs e 50 min = 10:50 horas => 1050
arQuantidade := string_to_array(stHora,':');
IF reFormato.formato_minutos = 'D' THEN
stQuantidade := (arQuantidade[1]+round((arQuantidade[2]/60.0),2))::VARCHAR;
stQuantidadeFormatado := replace(stQuantidade,'.',',');
stQuantidade := replace(stQuantidade,'.','');
ELSE
stQuantidade := arQuantidade[1]||arQuantidade[2];
stQuantidadeFormatado := arQuantidade[1]||','||arQuantidade[2];
END IF;
END IF;
IF stQuantidade::INTEGER > 0 THEN
--Salva os dados gerados para a geração do relatório
--com isso não é preciso executar a pl novamente para obter os dados
stSql := 'INSERT INTO ponto'||stEntidade||'.exportacao_ponto
(cod_contrato,cod_evento,cod_tipo,lancamento,formato)
VALUES
('||reContrato.cod_contrato||'
,'||reFormato.cod_evento||'
,'||reFormato.cod_tipo||'
,'''||stQuantidadeFormatado||'''
,'''||reFormato.formato||''')';
EXECUTE stSql;
rwExportarponto.registro := reContrato.registro;
rwExportarponto.codigo_evento := reFormato.codigo;
rwExportarponto.valor := 0;
rwExportarponto.quantidade := stQuantidade;
rwExportarponto.quantidade_parcelas := 0;
RETURN NEXT rwExportarPonto;
END IF;
END IF;
END LOOP;
END LOOP;
END;
$$ LANGUAGE 'plpgsql';