Páginas

sábado, 10 de outubro de 2015

Procedure consumindo dados de um webservice - Ahgora - Relógio de ponto

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