Boa noite pessoal
Procedure consumindo de um web service da Ahgora relogio de ponto, por sinal muito bom
CREATE OR REPLACE
PROCEDURE xxx_pt_baixa_apontamentos_prc (p_data_ini in varchar2
,p_data_fim in varchar2
,p_nserie in varchar2
,p_grupo in varchar2) is
-- +===========================================================================+
-- | |
-- | Tecnologia da Informação. |
-- +==========================================================================+
-- | FILENAME |
-- | xxx_pt_baixa_apontamentos_prc |
-- | |
-- | JOB |
-- | Aparti 00:15 de 4 em 4 horas |
-- | |
-- | PURPOSE |
-- | Conexão web service Ahgora |
-- | |
-- | DESCRIPTION |
-- | Baixa dos pontos do relogio ahgora usando web service |
-- | |
-- | |
-- | |
-- | CREATED BY Jefferson Quintiliano / 26/11/2014 |
-- | |
-- | UPDATED BY |
-- | - 10/12/2014 Jefferson Quintiliano - Mostra a importação no |
-- | email de verificação |
-- | |
-- +==========================================================================+
type t_request is record
(
method varchar2(256),
namespace varchar2(256),
body varchar2(32767),
envelope_tag varchar2(30)
);
type t_response is record
(
doc xmltype,
envelope_tag varchar2(30)
);
lv_nsr varchar2(32767);
l_http_request utl_http.req;
l_http_response utl_http.resp;
l_request t_request;
l_response t_response;
l_envelope clob;
l_result clob;
lv_cabecalho varchar2(4000) := '
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
p {color:#333333;font-size:x-small;text-align:left;font-family:Arial;margin-bottom: .1em;}
.obs {font-color:#000000;font-size:xx-small;font-family:Calibri;text-align:center;}
.cell {color:#333333;font-size:xx-small;text-align:center;font-family:Arial}
.header {color:#ffffff;font-size:x-small;text-align:center;font-weight:bold;font-family:Arial}
.lin1 {background-color:#daffcd}
.lin2 {background-color:#ffffff}
td {text-align:center;border-bottom: black 1px solid;border-top:
black 1px solid;border-left: black 1px solid;border-right: black 1px
solid;}
.col {border-bottom: none;border-top: black 1px solid;border-left: none;border-right: none}
.col2 {border-bottom: none;border-top: none;border-left: none;border-right: none}
font {font-family:Arial;font-size:x-small}
table {border-collapse:collapse;width:100%}
</style>
</head>
<body>
<left><img src="http://www..com.br/topo_email.jpg"></left>';
lv_corpo varchar2(32000) := null;
p_url varchar2(200) :=
'http://www.ahgora.com.br/ws/service.php';
--'http://www.oracle-base.com/webservices/server.php';
p_namespace varchar2(200) := 'xmlns="http://www.ahgora.com.br/ws"';
p_method varchar2(200) := 'obterBatidas';
p_action varchar2(200) := 'http://www.ahgora.com.br/ws/service.php/obterBatidas';
p_envelope_tag varchar2(10) := 'soap';
p_name varchar2(10) := 'empresa';
i pls_integer;
l_len pls_integer;
lv_rel_apontados varchar2(32767);
ln_cont number := 0;
ld_last_date date;
lb_marcacao_lida boolean := false;
ln_cont_response number := 0;
ln_nsr number := null;
lv_data_ini varchar2(20) := null;
lv_data_fim varchar2(20) := null;
hora NUMBER;
dias NUMBER;
Cont_Reg NUMBER := 0;
BEGIN
-- HORARIO
SELECT to_number(to_char(sysdate,'hh24')) hora
INTO HORA
FROM dual;
-- Rodar em X dias
IF ((hora = 4) or (hora = 5)) then
dias := 15;
else dias := 1;
END IF;
l_request.method := p_method;
l_request.namespace := p_namespace;
l_request.envelope_tag := p_envelope_tag;
if (p_data_ini is null and p_data_fim is null) then
lv_data_fim := to_char(sysdate, 'DD/MM/YYYY');
lv_data_ini := to_char(sysdate-dias, 'DD/MM/YYYY');
end if;
for r_grupo in (select xprg.group_id
,xprg.nome
,xprg.responsavel
,xprg.e_mail
,xprg.responsavel_2
,xprg.e_mail_resp_2
,xprg.serial
from xxx_pt_relogios_grp xprg
where (xprg.nome = p_grupo
or p_grupo is null)) loop
dbms_output.put_line('Relogio: '||r_grupo.nome);
-- add_parameter
for r_leitura in (select xpr.id_relogio
,xpr.name
,lpad(xpr.serial_number, 17, '0') serial_number
,xpr.last_update_date
,xpr.last_line
from xxx_pt_relogios xpr
where xpr.baixar_apontamentos_flag = 'Y'
and xpr.active_flag = 'Y'
and xpr.group_id = r_grupo.group_id
order by last_update_date) loop
dbms_output.put_line('name: '||r_leitura.name);
l_request.body := l_request.body||'<empresa xsi:type="xsd:string">'||r_grupo.serial||'</empresa>';
l_request.body := l_request.body||'<nrep_filtro
xsi:type="xsd:string">'||r_leitura.serial_number||'</nrep_filtro>';
if (p_data_ini is not null and p_data_fim is not null) then
lv_data_ini := nvl(p_data_ini, nvl(trunc(r_leitura.last_update_date),to_char(sysdate-20,'DD/MM/YYYY')));
end if;
l_request.body := l_request.body||'<datai xsi:type="xsd:string">'||lv_data_ini||'</datai>';
if p_data_fim is null then
lv_data_fim := to_char(trunc(sysdate),'DD/MM/YYYY');
else
lv_data_fim := p_data_fim;
end if;
l_request.body := l_request.body||'<dataf xsi:type="xsd:string">'||lv_data_fim||'</dataf>';
-- generate envelope
l_envelope := '<'||l_request.envelope_tag||':Envelope
xmlns:'||l_request.envelope_tag||'="http://schemas.xmlsoap.org/soap/envelope/"
' ||
'xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema">' ||
'<'||l_request.envelope_tag||':Body>' ||
'<'||l_request.method||' '||l_request.namespace||'
'||l_request.envelope_tag||':encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">'
||
l_request.body ||
'</'||l_request.method||'>' ||
'</'||l_request.envelope_tag||':Body>' ||
'</'||l_request.envelope_tag||':Envelope>';
-- invoke
l_http_request := utl_http.begin_request(p_url, 'POST','HTTP/1.1');
utl_http.set_header(l_http_request, 'Content-Type', 'text/xml');
utl_http.set_header(l_http_request, 'Content-Length', LENGTH(l_envelope));
utl_http.set_header(l_http_request, 'SOAPAction', p_action);
utl_http.write_text(l_http_request, l_envelope);
--> generate xml response
l_http_response := utl_http.get_response(l_http_request);
--arquivo := utl_file.fopen('/work/ftp.users','teste_xml.xml','W');
begin
loop
utl_http.read_text (l_http_response,l_envelope,length(l_envelope));
l_result := l_result || l_envelope;
ln_cont_response := ln_cont_response + 1;
--utl_file.put_line(arquivo, l_result);
end loop;
exception
when utl_http.end_of_body then
dbms_output.put_line('UTL_HTTP');
utl_http.end_response (l_http_response);
null;
end;
-- gerando apontamentos na tabela
for rcursor in (with tabela as (select l_result t_xml from dual)
select nsr
,nrep
,pis
,data
,hora
from tabela,
xmltable(XMLNamespaces ('http://schemas.xmlsoap.org/soap/envelope/'
AS "SOAP-ENV",
'http://www.ahgora.com.br/ws' AS "ns1"),
'/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:obterBatidasResponse/Batidas/ns1:Dados/Dados'
PASSING XMLTYPE(t_xml)
columns
NSR varchar2(9) PATH 'NSR'
,NREP varchar2(17) PATH 'NREP'
,PIS varchar2(12) PATH 'PIS'
,Data varchar2(8) PATH 'Data'
,Hora varchar2(4) PATH 'Hora'
)
where nsr > nvl(r_leitura.last_line,0)
order by nsr
) loop
begin
Cont_Reg := Cont_Reg + 1;
insert into xxx_pt_marcacao_ponto(
id_dados --01
,dados --02
)
values (
xxx_pt_marcacao_ponto_seq.nextval --01
,rcursor.nsr||'3'||rcursor.data||rcursor.hora||rcursor.pis --02
);
exception
when others then
raise_application_error(-20000, 'Erro ao inserir na tabela xxx_pt_marcacao_ponto: '||sqlerrm);
APPS.CS_UNA_MAIL_FILES@dbprod('portalna@empresa.com.br'
,'jefferson@empresa.com.br'
,'ERRO - Execução de carga automatica'
,''||rcursor.nsr||'3'||rcursor.data||rcursor.hora||rcursor.pis||''
,NULL
,NULL
);
rollback;
end;
commit;
ln_cont := ln_cont + 1;
ld_last_date := to_date(rcursor.data||rcursor.hora, 'DD/MM/YYYY HH24:MI');
ln_nsr := to_number(rcursor.nsr);
end loop;
l_request.body := null;
l_result := EMPTY_CLOB();
l_envelope := EMPTY_CLOB();
-- se tiver marcações, faz o update na tabela de relógios
if ln_cont != 0 then
begin
dbms_output.put_line('UPDATE');
update xxx_pt_relogios
set last_update_date = ld_last_date
,last_line = ln_nsr
where id_relogio = r_leitura.id_relogio;
exception
when others then
raise_application_error(-20001, 'Erro ao atualizar a tabela XXX_PT_RELOGIOS: '||sqlerrm);
end;
commit;
ln_cont := 0;
elsif ln_cont = 0 and /*lb_marcacao_lida = false*/ ln_cont_response = 1 then
if lv_corpo is null then
lv_corpo :=
'<tr><td>'||r_leitura.name||'</td><td>'||r_leitura.serial_number||'</td><td>'||to_char(r_leitura.last_update_date,'DD/MM/YYYY
HH24:MI')||'</td></tr>'; --r_leitura.name||' -
'||r_leitura.serial_number;
else
lv_corpo
:=
lv_corpo||'<tr><td>'||r_leitura.name||'</td><td>'||r_leitura.serial_number||'</td><td>'||to_char(r_leitura.last_update_date,'DD/MM/YYYY
HH24:MI')||'</td></tr>';
end if;
end if;
ln_cont_response := 0;
end loop;
if hora = 20 THEN
if lv_corpo is not null then
apps.cs_una_mail_files@dbprod(
'portalna@empresa.com.br' --remetente
,'jefferson@empresa.com.br;'||r_grupo.e_mail||';'||r_grupo.e_mail_resp_2--destinatário
,'Relógios Ahgora sem marcações - '|| to_char(sysdate,'dd/mm/yyyy
hh24:mi')||' -
'||r_grupo.nome--r_grupo.e_mail||';'||r_grupo.e_mail_resp_2 --assunto
,lv_cabecalho
||'<p>Olá '|| initcap(r_grupo.responsavel) ||'/'||initcap(r_grupo.responsavel_2)||',</p>
<p>O(s) relógio(s) abaixo não tiveram apontamentos:</p>
<table>
<tr bgcolor="#333333"><p class="header">
<td width="20%"><p class="header">Nome</td>
<td width="12%"><p class="header">Número de Série</td>
<td width="10%"><p class="header">Data da última leitura</td>
</tr>'
-- para o período de '||lv_data_ini||' a '||lv_data_fim||':</p>' --corpo
||lv_corpo||'</table>'
||'<p class="obs">Por gentileza, não responda este
e-mail<br>Gerado automaticamente <a
href="http://portalnaempresa.com.br">Portal
NA</a></center>'
,null
,null
);
lv_corpo := null;
end if;
end if;
end loop;
if(dias = 1) THEN
insert into logs_job(data,nome, atr1 )
VALUES(sysdate,'xxx_pt_marcacao_ponto', Cont_Reg);
ELSIF (dias = 15) THEN
insert into logs_job(data,nome, atr1 )
VALUES(sysdate,'xxx_pt_marcacao_ponto_15_Dias', Cont_Reg);
END IF;
end;
/
Nenhum comentário:
Postar um comentário