Nota Fiscal Eletrônica (NF-e)

Este forum é destinado a perguntas relacionadas a Oracle, mas que não se enquadram nos forums acima. Aqui serão tratadas também sobre outras tecnologias da oracle, como o Workflow, BPEL, Spatial, OCS, etc.
Responder
marcogatti
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Dom, 28 Out 2007 6:48 pm
Localização: Curitiba - PR
[MCTS] Marco Aurélio Santi Gatti

Boa tarde a todos,

Gostaria de abrir um tópico sobre notas fiscais eletrônicas. Nós aqui do Paraná seremos exigidos que adequemos nossos sistemas (em alguns segmentos) nos próximos meses, e vários outros estados já têm isso implantado e outros ainda implantarão. Alguém tem maiores informações sobre isso, como empresas que conseguiram integrar o sistema deles com o Oracle (módulos para Oracle) que realizem estas tarefas, códigos-fonte, e quaisquer informações pertinentes ao tema...

Agradeço desde já!!!
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Marco, boa tarde.

Posso verificar par você.
Sei que aqui onde trabalho (empresa de desenvolvimento de software), já foi realizado este trabalho de desenvolvimento (inclusive integrando-se com módulos que o cliente em questão necessitava).

Você gostaria de adquirir tal serviço de integração, ou, somente essas informações?
vsf
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 21 Mai 2008 8:27 pm
Localização: Salvador
Contato:
_________________
Atenciosamente,

Victory Fernandes
Engenheiro
Engenharia, Pesquisa e Desenvolvimento
E-mail: hereim@ig.com.br

TKS Software
Tech-Knowledge Solutions
Soluções em Automação e Softwares Dedicados
Site: www.igara.com.br

Consulte o artigo de minha autoria publicado em http://www.activedelphi.com.br/lista_to ... &topico=17 que contem informações sobre geração, assinatura, transmissão e DANFE de Nota Fiscal Eletrônica (NF-e)

Lá você encontra exemplos de geração, assinatura e transmissão que simplificam o processo para apenas a chamada de 1 função!
Avatar do usuário
fabdepaula
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 15 Mai 2008 8:53 pm
Localização: Araraquara -SP

Nossa legal encontrar este topico sobre nota fiscal eletronica. Aqui na empresa que trabalho estamos desenvolvendo um modulo para trabalhar com a nf-e, estava tudo indo muito bem ate nos depararmos com os aquivos XML e XSD. A criação dos arquivos XML não é problema, o problema esta na hora de submeter esse XML cria a validação atraves dos XSD que o governo disponibiliza, estamos tentando encotrar a melhor solução para fazer isso. Primeiramente tentamos a seguinte solução, gravar o XML criamo no banco, ate ai beleza, criamos uma table com campo XMLType e gravei o XML. O problema esta em carregar o XSD no banco, estamos tentando fazer isso usando o pacote DBMS_XMLSchema onde nos colocamos os aquivos XSD em um diretorio do banco e com o comando dbms_xmlschema.registerSchema fazemos o registro desses XSD para o banco, é ai que estamos com problemas, se nos criamos um XSD simples de exemplo conseguimos registrar normal no banco e depois nos conseguimos submeter o XML já salvo no banco a validação do XSD, mas quando tentamos carregar os XSD do governo não conseguimos, os xsd do governo são mais complexos dentro de um XSD é chamado outro XSD, nossa estamos apanhando deles!!!

Se alguém já passou por esse problema usando essa solução ou outra por favor nos ajude e nos diga como estão fazendo para validar os XML usando os XSD do governo


obrigado!!!!

obs: estamos usando forms 6i e banco oracle 10g.
SjraarGubbels
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 16 Set 2008 6:21 pm
Localização: Patos de Minas MG

Nos desenvolvemos usam solucao para nosso proprio ERP, funciando forms (6i + 10g) , report( 6i +10g). Forms 6i não e tão pratico para trabalhar com tecnolgias novas, então usamos os recursos do banco de dadoas 10Gr2 para cima, usando XMLDB para parte dos XML e Java Stored PRocedures par tomar conta dos webservices e assinatura digitaal.
Usamos Jdeveloper par poder criar o Java para webservice e assinatura digital que depois importamos no banco.

Em outras palavras, a parte "dificil" ficou por conta do banco de dados. Assim tambem não precisa instalar um servidor de aplicativo para cuidar dos webservices.

Quem esta interessado na solucao, pode me procurar.

Abr,
Sjraar Gubbels
SjraarGubbels
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 16 Set 2008 6:21 pm
Localização: Patos de Minas MG

já teve bastante procura pela solução. O bom da solução que ele pode encaixar em qual ERP, porque ele roda 100% dentro do banco e não precisa de licenças de outros softwares. A integração pode ser feito com triggers/procedures.

Se alguém tem duvidas:

Sjraar Gubbels
Obers Ltda
Tel 0xx34 38231423
sgubbels@obers.com.br
bertosro
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 88
Registrado em: Sex, 18 Ago 2006 11:13 am
Localização: São Paulo - SP
Bertosro
MSN / TALK - roberto.fernandes@gmail.com

Olá mestres Boa Noite

Gostaria de saber se os senhores já tem desenvolvido algum esqueleto em PL/SQL para geração de XML para requisitar emissão de NF-e para SEFAZ.

Desenvolvi uma rotina para geração mas a mesma fiocu muito devagar, demora 15 segundos para gerar uma Nota Fiscal.

Desde já agradeço a ajuda de todos.

Segue o código desenvolvido.

Selecionar tudo

CREATE OR REPLACE 
PACKAGE pkg_infe_send_new08
IS
   TYPE tp_estruct_xml_nfe IS RECORD (--LNFE_ESTR_ID_NEXT
      LEVEL              INTEGER,
      lnfe_id            infe_leiaute_xml.lnfe_id%TYPE,
      lnfe_id_pai        infe_leiaute_xml.lnfe_id_pai%TYPE,
      lnfe_estr_id       infe_leiaute_xml.lnfe_estr_id%TYPE,
      lnfe_estr_id_next  infe_leiaute_xml.lnfe_estr_id_next%TYPE,      
      lnfe_seq           infe_leiaute_xml.lnfe_seq%TYPE,
      lnfe_status        infe_leiaute_xml.lnfe_status%TYPE,
      lnfe_tag_xml       infe_leiaute_xml.lnfe_tag_xml%TYPE,
      lnfe_tag_desc      infe_leiaute_xml.lnfe_tag_desc%TYPE,
      lnfe_atributo_tag  infe_leiaute_xml.lnfe_atributo_tag%TYPE,
      lnfe_valor_default infe_leiaute_xml.lnfe_valor_default%TYPE,     
      lnfe_coluna        infe_leiaute_xml.lnfe_coluna%TYPE,
      lnfe_tam_max       infe_leiaute_xml.lnfe_tam_max%TYPE,
      lnfe_tam_ele       infe_leiaute_xml.lnfe_tam_ele%TYPE,
      lnfe_tipo          infe_leiaute_xml.lnfe_tipo%TYPE,
      lnfe_dec           infe_leiaute_xml.lnfe_dec%TYPE,
      lnfe_obrg          infe_leiaute_xml.lnfe_obrg%TYPE,
      lnfe_obs           infe_leiaute_xml.lnfe_obs%TYPE,
      lnfe_usr_inc       infe_leiaute_xml.lnfe_usr_inc%TYPE,
      lnfe_usr_dt_inc    infe_leiaute_xml.lnfe_usr_dt_inc%TYPE,
      lnfe_usr_atlz      infe_leiaute_xml.lnfe_usr_atlz%TYPE,
      lnfe_usr_dt_atlz   infe_leiaute_xml.lnfe_usr_dt_atlz%TYPE,
      lnfe_car_direita   infe_leiaute_xml.lnfe_car_direita%TYPE,
      lnfe_car_esquerda  infe_leiaute_xml.lnfe_car_esquerda%TYPE,
      conteudo           VARCHAR2(500),
      ind_fecha_tag      INTEGER,
      ind_conteudo       INTEGER,
      col_select         VARCHAR2(300)
   );

   TYPE tb_xml_struct IS TABLE OF tp_estruct_xml_nfe INDEX BY BINARY_INTEGER;
   
   --/menssagem retorno 
   TYPE ty_controle_rec IS RECORD (
      txt_ret   VARCHAR2 (1000),
      v$errm    VARCHAR2 (10000),
      tip_ret   VARCHAR2 (1),
      raise_    BOOLEAN
   );     

   rec_xml_header   tb_xml_struct;
   rec_xml_detail   tb_xml_struct;  
   rec_tag_header   tb_xml_struct;  
   rec_tag_detail   tb_xml_struct;  
  -- rec_tag_close    tb_xml_struct;     
   v$_rot_glb        VARCHAR2(30) := 'pkg_infe_send';
   v$_prog           VARCHAR2(30) ;

   v$_lnfe_id            infe_leiaute_xml.lnfe_id%TYPE;  
   v$_lnfe_id_pai        infe_leiaute_xml.lnfe_id_pai%TYPE;
   v$_lnfe_tag_xml       infe_leiaute_xml.lnfe_tag_xml%TYPE;
   v$_lnfe_tipo          infe_leiaute_xml.lnfe_tipo%TYPE;
   v$_conteudo           infe_leiaute_xml.lnfe_tipo%TYPE; 
   v$ctrl                INTEGER  :=0;
 
--   vp               estruct_xml_nfe%rowtype;

--/------by rfs 10-mar-2010 ----------------------------------------------------
   PROCEDURE prc_req_danfe (
      p_gera_arq   IN       VARCHAR2 DEFAULT 'N',
      p_retcode    IN      VARCHAR2,
      p_mensagem   IN      VARCHAR2,
      p_nome_arq   IN      VARCHAR2
   );
   
       FUNCTION XML_fnc_format (P_lnfe_tipo         infe_leiaute_xml.lnfe_tipo%TYPE,
                                P_lnfe_dec          infe_leiaute_xml.lnfe_dec%TYPE,
                                P_lnfe_tam_max      infe_leiaute_xml.lnfe_tam_max%TYPE,  
                                P_lnfe_car_direita  infe_leiaute_xml.lnfe_car_direita%TYPE,
                                P_lnfe_car_esquerda infe_leiaute_xml.lnfe_car_esquerda%TYPE,                                                              
                                P_dado VARCHAR2
        )
          RETURN VARCHAR2;   
END pkg_infe_send_new08;
/


CREATE OR REPLACE 
PACKAGE BODY pkg_infe_send_new08
IS  
/*
*-------------------------------------------------------------------------------------------------*
*                                                           *
*-------------------------------------------------------------------------------------------------*
* Cliente  :                                                              *
* Modulo   : Pacote para geracao de XML para requisição de emissão de Nota Fiscal Eletronica      *
* Tipo     : -                                                                                    *
* Transacao: **                                                                                   *
* Programa : pkg_infe_send                                                                        *
* Descricao: Requisitar para Conector emissão de               NFe                                *
*-------------------------------------------------------------------------------------------------*
* Nome       | Data       | Descricao                                               (Historico)   *
*-------------------------------------------------------------------------------------------------*
* RobertoF.S | 12.03.2010 | Codificacao Inicial                                                   *
*            |            |                                                                       *
*-------------------------------------------------------------------------------------------------*
*/
       --/Funcao para montar o corpo do XML 'by RFS'
       FUNCTION XML_fnc_mount(p_xml IN out tb_xml_struct, p_value IN VARCHAR2, p_idx IN INTEGER, 
                              rec_tag_open IN OUT tb_xml_struct, sc OUT ty_controle_rec)
          RETURN VARCHAR2
       IS
          v_ret    VARCHAR2 (32000) := '';
          v_attr   VARCHAR2 (32000) := '';
       
       BEGIN v$_prog := 'XML_fnc_mount';
          --/Verifica se é primeiro registro da estrutura XML
          IF p_xml.PRIOR(p_idx-1) IS NOT NULL THEN
          --    IF rec_tag_open.EXISTS (rec_tag_open.FIRST) THEN
                  IF  TO_NUMBER(NVL(p_xml(p_idx-1).LEVEL,p_xml(p_idx).LEVEL)) > TO_NUMBER(p_xml(p_idx).LEVEL) THEN
                      FOR I IN REVERSE p_xml.FIRST .. p_idx-1 
                      LOOP
                          v$ctrl := v$ctrl+1;
                          dbms_output.put_line(v$ctrl||'  '||to_char(sysdate,'hh24:mi:ss'));
                         -- dbms_output.put_line('p_xml.FIRST .. p_idx-1  '||to_char(p_xml.FIRST)||' .. '||to_char(p_idx-1));
                          --/Se a Tag for de menor Level fecha as Tags Abertas ate o nivel atual
                          IF TO_NUMBER(p_xml(I).LEVEL) >= TO_NUMBER(p_xml(p_idx).LEVEL) AND p_xml(I).lnfe_tipo = 'T' 
                             AND p_xml(I).ind_fecha_tag = 0
                          THEN
                              v_ret := v_ret || '</' || p_xml(I).lnfe_tag_xml || '>'; --|| --CHR (13) || CHR (10);
                              p_xml(I).ind_fecha_tag := 1; 
                          END IF;  
                          --/Sai do loop quando a TAG chegar no mesmo Level
                          IF TO_NUMBER(p_xml(I).LEVEL) = TO_NUMBER(p_xml(p_idx).LEVEL) AND p_xml(I).lnfe_tipo = 'T' 
                          THEN
                             IF rec_tag_open.EXISTS (rec_tag_open.FIRST) THEN
                                 IF TO_NUMBER(p_xml(p_idx).LEVEL) <= TO_NUMBER(rec_tag_open(rec_tag_open.FIRST).LEVEL) THEN
                                    rec_tag_open.DELETE;
                                 ELSE   
                                    rec_tag_open.DELETE(rec_tag_open.LAST);
                                 END IF;  
                             END IF;     
                             EXIT;
                          END IF;   
                      END LOOP;
                  END IF;
           --   END IF;
          END IF;           
          
          --/Se for TAG abre a TAG e inclui atrubuto se houver
          IF p_xml(p_idx).lnfe_tipo = 'T' THEN
              p_xml(p_idx).ind_fecha_tag := 2;
              rec_tag_open(p_idx) := p_xml(p_idx);
          ELSIF p_xml(p_idx).lnfe_tipo = 'TF' THEN
              v_ret := v_ret || '<' || p_xml(p_idx).lnfe_tag_xml || p_xml(p_idx).lnfe_atributo_tag || '/>'; --|| CHR (13) || CHR (10);
              p_xml(p_idx).ind_fecha_tag := 0;              
          --/Se não for Tag e tiver conteudo escreve TAG    
          ELSIF NVL(p_value, p_xml(p_idx).lnfe_valor_default) IS NOT NULL AND
                p_xml(p_idx).lnfe_tipo IN ('N','C','D') THEN
                IF rec_tag_open.COUNT > 0 THEN
                    FOR t IN rec_tag_open.FIRST .. rec_tag_open.LAST
                    LOOP
                       IF rec_tag_open.EXISTS (t) then                 
                           v_ret := v_ret || '<' || rec_tag_open(t).lnfe_tag_xml || rec_tag_open(t).lnfe_atributo_tag || '>'; --|| CHR (13) || CHR (10);                    
                           p_xml(t).ind_fecha_tag := 0; 
                       END IF;                        
                    END LOOP;
                    rec_tag_open.DELETE;    
                END IF;    

                v_ret := v_ret || '<' || p_xml(p_idx).lnfe_tag_xml || p_xml(p_idx).lnfe_atributo_tag || '>' || 
                         NVL(p_value, p_xml(p_idx).lnfe_valor_default) || '</' ||p_xml(p_idx).lnfe_tag_xml|| '>';--||
          END IF;              

          RETURN v_ret;
       v$_prog := 'PRC_GERA_XML_NFE'; 
       EXCEPTION           
       WHEN OTHERS THEN
           sc.txt_ret   := 'Erro ao montar conteudo XML. Entre em contato com o administrador do sistema.';
           sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_    := TRUE;           
       END XML_fnc_mount; 
       --/
       --/

       --/Funcao para fechar Tags abertas do corpo do XML 'by RFS'
       FUNCTION XML_close (p_xml IN out tb_xml_struct,  sc OUT ty_controle_rec)
          RETURN VARCHAR2
       IS
          v_ret    VARCHAR2 (32000) := '';
          v_attr   VARCHAR2 (32000) := '';
       
       BEGIN v$_prog := 'XML_close';
              FOR I IN REVERSE p_xml.FIRST .. p_xml.LAST
              LOOP
                  IF p_xml(I).lnfe_tipo = 'T'  AND p_xml(I).ind_fecha_tag = 0
                  THEN
                      v_ret := v_ret || '</' || p_xml(I).lnfe_tag_xml || '>'; --|| CHR (13) || CHR (10);
                      p_xml(I).ind_fecha_tag := 1; --/Indica fechamento da tag
                  END IF;  
              END LOOP;
    
          RETURN v_ret;
       v$_prog := 'PRC_GERA_XML_NFE';  
       EXCEPTION           
       WHEN OTHERS THEN
           sc.txt_ret   := 'Erro ao fechar conteudo XML. Entre em contato com o administrador do sistema.';
           sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_    := TRUE;          
       END XML_close;     
       --/

       --/Funcao para gerar o cabeçario do XML 'by RFS'
       FUNCTION XML_fnc_gera_tag_h (p_attr_value IN VARCHAR2 DEFAULT NULL, p_attr_tag  IN VARCHAR2 DEFAULT NULL,  sc OUT ty_controle_rec)
          RETURN VARCHAR2
       IS
          v_ret    VARCHAR2 (32000) := '';
          v_attr   VARCHAR2 (32000) := '';
       
       BEGIN v$_prog := 'XML_fnc_gera_tag_h';
          IF p_attr_value IS NOT NULL
          THEN
             v_attr := ' encoding="' || p_attr_value || '"';
          END IF;
    
          v_ret := v_ret || '<?xml version="1.0"' || v_attr || '?>';--|| --CHR (13) || CHR (10);
          
          RETURN v_ret;
       v$_prog := 'PRC_GERA_XML_NFE'; 
       EXCEPTION           
       WHEN OTHERS THEN
           sc.txt_ret   := 'Erro ao formatar cabecalho do XML. Entre em contato com o administrador do sistema.';
           sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_    := TRUE;           
       END XML_fnc_gera_tag_h;
       --/

       --/Funcao para formatar conteudo XML 'by RFS'
       FUNCTION XML_fnc_format (P_lnfe_tipo         infe_leiaute_xml.lnfe_tipo%TYPE,
                                P_lnfe_dec          infe_leiaute_xml.lnfe_dec%TYPE,
                                P_lnfe_tam_max      infe_leiaute_xml.lnfe_tam_max%TYPE,  
                                P_lnfe_car_direita  infe_leiaute_xml.lnfe_car_direita%TYPE,
                                P_lnfe_car_esquerda infe_leiaute_xml.lnfe_car_esquerda%TYPE,                                                              
                                P_dado VARCHAR2
        )
          RETURN VARCHAR2
       IS
          vp_return VARCHAR2(200); 
          vp_mask   VARCHAR2(200);
          
       BEGIN  v$_prog := 'FNC_FORMAT';
           
           vp_return  := P_dado;
           
           --/Formata numero
           IF P_lnfe_tipo = 'N' AND NVL(P_lnfe_dec,0) > 0 THEN
              SELECT DECODE(P_lnfe_dec,1,'''9999999999999990D0''',  
                                                  2,'''9999999999999990D00''',
                                                  3,'''9999999999999990D000''',
                                                  4,'''9999999999999990D0000''')
              INTO vp_mask FROM DUAL;           
               EXECUTE IMMEDIATE 'SELECT  TRIM(TO_CHAR(:1,'||vp_mask||'))  FROM DUAL '
               INTO vp_return
               USING P_dado;
           END IF;
           
           --/Formata Caracter
           IF P_lnfe_tipo = 'C' THEN
               vp_return := TRIM(SUBSTR(vp_return,1,P_lnfe_tam_max));
           END IF;           
           
           --/Adiciona caracter a direita
           IF P_lnfe_car_direita IS NOT NULL THEN
               vp_return := RPAD(vp_return, P_lnfe_tam_max, P_lnfe_car_direita);
           END IF;
           
           --/Adiciona caracter a esquerda
           IF P_lnfe_car_esquerda IS NOT NULL THEN NULL;
               vp_return := LPAD(vp_return, P_lnfe_tam_max, P_lnfe_car_esquerda);           
           END IF;           

           RETURN TRANSLATE(UPPER(TRIM(VP_return)),
                                  'ÃãÀàÁáÂâÇçÉéÊêÈèÍíÎîÓóÔôÕõÒòÚúÛûÜüñÑ"!#$%¨&§]}º´`[{ª~^/°<>',
                                  'AaAaAaAaCcEeEeEeIiIiOoOoOoOoUuUuUunN........))o..((a...o()');                            
       v$_prog := 'PRC_GERA_XML_NFE';
       EXCEPTION           
       WHEN OTHERS THEN 
           NULL;
       END XML_fnc_format; 
       --/
       --/Funcao para montar o corpo do XML 'by RFS'
       FUNCTION XML_fnc_conteudo_tag (p_xml IN out tb_xml_struct, p_idx IN INTEGER,  sc OUT ty_controle_rec)
          RETURN BOOLEAN
       IS          
       BEGIN v$_prog := 'XML_fnc_conteudo_tag';
           IF ((p_xml (p_idx).LNFE_TIPO IN ('C','N','D','K')) OR 
              (p_xml (p_idx).LNFE_TIPO IN ('T') AND  p_xml (p_idx).LNFE_ATRIBUTO_TAG IS NOT NULL))
           THEN
              p_xml (p_idx).ind_conteudo := 1;
              RETURN TRUE;
           ELSE 
              p_xml (p_idx).ind_conteudo := 0;
              RETURN FALSE;  
           END IF; 
       v$_prog := 'PRC_GERA_XML_NFE'; 
       END XML_fnc_conteudo_tag;     

       --/Procedimento para armazenar string XML em tempo de execução 'by RFS'
       PROCEDURE XML_armazena_blob (p_str IN VARCHAR2, p_lob IN OUT BLOB, sc OUT ty_controle_rec)
       IS
          rawchar     RAW (1);
          rawbuffer   RAW (32767);
          itamanho    NUMBER;
          v_blob      BLOB  := p_lob;
       BEGIN v$_prog := 'ARMAZENA_BLOB';
          rawbuffer := UTL_RAW.cast_to_raw (NVL(p_str, ' '));
          itamanho  := UTL_RAW.LENGTH (rawbuffer);
          DBMS_LOB.writeappend (v_blob, itamanho, rawbuffer);
          p_lob := v_blob;
       v$_prog := 'PRC_GERA_XML_NFE'; 
       EXCEPTION           
       WHEN OTHERS THEN
           sc.txt_ret   := 'Erro ao armaxenar conteudo XML em BLOB. Entre em contato com o administrador do sistema.';
           sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_    := TRUE;           
       END XML_armazena_blob;           
       
   --/Procedimento atualizar status de controle de envio NF-e 'by RFS'
   PROCEDURE prc_atlz_st_controle (
      p_id_control IN      a02_in_req_nfe_HEADER.id_controle%TYPE,
      sc           OUT    ty_controle_rec 
   )  --a02_in_req_nfe_HEADER a where a.ID_CONTROLE
   IS --Cursor de retorno do da estrutura do XML por estrutura
   BEGIN
       FOR cur_ctrl IN (select * from vw_infe_atlz_controle)
       LOOP
           UPDATE infe_req_control y
              SET y.chave_acesso_nfe   = cur_ctrl.chave_acesso_nfe,
                  y.codigo_situacao    = cur_ctrl.codigo_situacao,
                  y.descricao_situacao = cur_ctrl.descricao_situacao,
                  y.protocolo          = cur_ctrl.protocolo,
                  y.xml_out            = cur_ctrl.XML_RETORNO,
                  y.st_proc            = cur_ctrl.st_proc
            WHERE y.chave_origem || y.acao = y.chave_origem || y.acao;
       END LOOP;   
       COMMIT;
   END prc_atlz_st_controle;
   --/
   
   --/Procedimento para geracao de XML para emissão de DNAFE (NF-e) 'by RFS'
   PROCEDURE prc_gera_xml_nfe (
      p_id_control IN      a02_in_req_nfe_HEADER.id_controle%TYPE,
      p_rec_xml_header       tb_xml_struct,
      P_col_header           VARCHAR2,
      p_rec_xml_detail       tb_xml_struct,
      P_col_detail           VARCHAR2,      
      p_xml        IN OUT    VARCHAR2,
      sc           OUT    ty_controle_rec 
   )  --a02_in_req_nfe_HEADER a where a.ID_CONTROLE
   IS --Cursor de retorno do da estrutura do XML por estrutura
      CURSOR cur_estruct_xml (P_estruct IN Infe_leiaute_xml.lnfe_estr_id%TYPE)
      IS
            SELECT  LEVEL             ,
                    LNFE_ID           ,
                    LNFE_ID_PAI       ,
                    LNFE_ESTR_ID      ,
                    LNFE_ESTR_ID_NEXT ,
                    LNFE_SEQ          ,
                    LNFE_STATUS       ,
                    LNFE_TAG_XML      ,
                    LNFE_TAG_DESC     ,
                    LNFE_ATRIBUTO_TAG ,
                    LNFE_VALOR_DEFAULT,
                    LNFE_COLUNA       ,
                    LNFE_TAM_MAX      ,
                    LNFE_TAM_ELE      ,
                    LNFE_TIPO         ,
                    LNFE_DEC          ,
                    LNFE_OBRG         ,
                    LNFE_OBS          ,
                    LNFE_USR_INC      ,
                    LNFE_USR_DT_INC   ,
                    LNFE_USR_ATLZ     ,
                    LNFE_USR_DT_ATLZ  ,
                    LNFE_CAR_DIREITA  ,
                    LNFE_CAR_ESQUERDA ,
                    ' ' conteudo      ,
                    0 ind_fecha_tag   ,
                    DECODE(LNFE_TIPO,'C',1,'N',1,'D',1,'K',1,
                       CASE 
                          WHEN LNFE_TIPO = 'T' AND  LNFE_ATRIBUTO_TAG IS NOT NULL THEN
                           1
                          ELSE
                           0 
                       END ) ind_conteudo ,
                    DECODE(  DECODE(LNFE_TIPO,'C',1,'N',1,'D',1,'K',1,
                               CASE 
                                  WHEN LNFE_TIPO = 'T' AND  LNFE_ATRIBUTO_TAG IS NOT NULL THEN
                                   1
                                  ELSE
                                   0 
                               END ), 1, 'pkg_infe_send_new08.xml_fnc_format('''||lnfe_tipo||''','||lnfe_dec||','||lnfe_tam_max||','||
                                                                              NVL2(lnfe_car_direita  ,''||lnfe_car_direita||'','NULL' )||','||
                                                                              NVL2(lnfe_car_esquerda ,''||lnfe_car_esquerda||'','NULL' )||','||                                                                        
                                                                              'a.'||LNFE_COLUNA||') '||  LNFE_COLUNA || 
                               ', ')  col_select                         
              FROM Infe_leiaute_xml a
              WHERE a.LNFE_STATUS   > 0 --/somente ativo
                AND lnfe_estr_id    = P_estruct --/Estrutura ID
                AND EXISTS (SELECT 0 --/Verifica se o campo PAI esta ativo
                              FROM infe_leiaute_xml b
                             WHERE ((b.lnfe_id   = a.lnfe_id_pai) OR (b.lnfe_id_pai = 1))
                               AND lnfe_status > 0)                
           CONNECT BY PRIOR lnfe_id = lnfe_id_pai
             START WITH lnfe_id_pai = 1
             ORDER SIBLINGS BY lnfe_id_pai,  lnfe_seq;    --lnfe_id;   
                 

       v_string     VARCHAR2 (32767);       --/Armazenar String XML
       v_blob       BLOB;                   --/Armazenar String BLOB XML para manipulação
       v_rot        VARCHAR2(40) := 'PRC_GERA_XML_NFE';   
       
       --/Variaveis para cursor dinamico
       vp_$cur_header   INTEGER;
       vp_$cur_detail   INTEGER;
       vp_$col_header   INTEGER := 0;         
       vp_$col_detail   INTEGER := 0;                
       vp_$temp         NUMBER;
       vp_$query        VARCHAR2(32767);
       vp_$return       BOOLEAN := FALSE;   
       vp_$level        INTEGER;       
       
--*****************************************
--   B  E  G  I  N    "N  F  E"
--*****************************************
   BEGIN v$_prog := 'PRC_GERA_XML_NFE';

      --/Monta curdor dinamico do Header
      vp_$query := 'SELECT '||p_col_header||'0 END FROM VW_infe_req_header a where a.ID_CONTROLE = '||NVL(TO_CHAR(p_id_control),'a.ID_CONTROLE');
     PCK_INFE_UTIL.prc_debug_sql_dinamico(NULL,vp_$query, 'CC','INFE'||'.'||v$_rot_glb||'.'||v_rot);
      BEGIN
          vp_$cur_header := DBMS_SQL.open_cursor;
          DBMS_SQL.parse (vp_$cur_header, vp_$query, DBMS_SQL.native);
      EXCEPTION
      WHEN OTHERS THEN
          PCK_INFE_UTIL.prc_debug_sql_dinamico(NULL,vp_$query, 'CC','INFE'||'.'||v$_rot_glb||'.'||v_rot);
          sc.txt_ret   := 'Erro ao carregar cursor dinamico Header. Entre em contato com o administrador do sistema.';
          sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_    := TRUE;           
          GOTO gera_erro;
      END;
      vp_$col_header := 0;   
           
      BEGIN
          --/DBMS_SQL.DEFINE_COLUMN - Cursor Dinamico
          FOR i IN rec_xml_header.FIRST .. rec_xml_header.LAST
          LOOP    
              IF  rec_xml_header (i).ind_conteudo = 1 THEN  --  XML_fnc_conteudo_tag (rec_xml_header, i,sc) THEN
                  vp_$col_header := vp_$col_header+1;      
                  DBMS_SQL.define_column (vp_$cur_header, vp_$col_header, rec_xml_header (i).conteudo, rec_xml_header (i).lnfe_tam_max); 
              END IF;    
          END LOOP;                      
          vp_$temp := DBMS_SQL.EXECUTE (vp_$cur_header); 
      EXCEPTION
      WHEN OTHERS THEN
          PCK_INFE_UTIL.prc_debug_sql_dinamico(NULL,vp_$query, 'CC','INFE'||'.'||v$_rot_glb||'.'||v_rot);
          sc.txt_ret   := 'Erro ao setar colunas cursor dinamico Header. Entre em contato com o administrador do sistema.';
          sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_    := TRUE;           
          GOTO gera_erro;           
      END; 
      
      LOOP
          IF DBMS_SQL.fetch_rows (vp_$cur_header) = 0 THEN
             IF vp_$return = FALSE THEN
                dbms_output.put_line('Header Registro Não Encontrado!');     
             END IF;
                dbms_output.put_line('Header Saindo ...');
             EXIT;
          ELSE
             v_string       := NULL;
             vp_$return     := TRUE;
             vp_$col_header := 0;
             
             --/DBMS_SQL.COLUMN_VALUE - Cursor Dinamico                        
             FOR i IN rec_xml_header.FIRST .. rec_xml_header.LAST
             LOOP    
                 BEGIN
                     IF rec_xml_header (i).ind_conteudo = 1 THEN  --  XML_fnc_conteudo_tag (rec_xml_header, i,sc) THEN
                         vp_$col_header := vp_$col_header+1;  
                         DBMS_SQL.column_value (vp_$cur_header, vp_$col_header, rec_xml_header (i).conteudo);
                       --  rec_xml_header (i).conteudo := fnc_format (rec_xml_header, i,sc);
                         IF sc.raise_ THEN GOTO gera_erro; END IF;                       
                     END IF;  
                 EXCEPTION
                 WHEN OTHERS THEN
                     sc.txt_ret   := 'Erro ao definir colunas cursor dinamico Header. Entre em contato com o administrador do sistema.';
                     sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_  := TRUE;           
                     GOTO gera_erro;           
                 END;  

                 v$_lnfe_id       := rec_xml_header(i).lnfe_id     ;
                 v$_lnfe_id_pai   := rec_xml_header(i).lnfe_id_pai ; 
                 v$_lnfe_tag_xml  := rec_xml_header(i).lnfe_tag_xml;
                 v$_lnfe_tipo     := rec_xml_header(i).lnfe_tipo   ;     
                 
                 BEGIN
                     --/escreve XML HEADER
                     IF rec_xml_header(i).lnfe_estr_id_next >= rec_xml_header(i).lnfe_estr_id THEN 
                         v_string := v_string || XML_fnc_mount (rec_xml_header, rec_xml_header(I).conteudo,i,rec_tag_header,sc); 
                         IF sc.raise_ THEN GOTO gera_erro; END IF;   
                     END IF; 
                 EXCEPTION
                 WHEN OTHERS THEN
                     sc.txt_ret   := 'Erro ao escrever Header XML. Entre em contato com o administrador do sistema.';
                     sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_  := TRUE;           
                     GOTO gera_erro;           
                 END; 

                  --************ D E T A I L ************--
                  --/Verifica se a proxima tag é proxima estrutura de DETAIL
                 IF rec_xml_header(i).lnfe_estr_id_next > rec_xml_header(i).lnfe_estr_id THEN
                      --/Monta curdor dinamico do Detail

                      vp_$query := 'SELECT '||p_col_detail||'0 END FROM VW_infe_req_detail a where a.id_req_header = '||rec_xml_header(I).conteudo|| 'order by a.id ';

                      --/Inicio processo de carga de dados nas variaveis dinamicas
                     BEGIN
                          vp_$cur_detail := DBMS_SQL.open_cursor;
                          DBMS_SQL.parse (vp_$cur_detail, vp_$query, DBMS_SQL.native);
                      EXCEPTION
                      WHEN OTHERS THEN
                          PCK_INFE_UTIL.prc_debug_sql_dinamico(NULL,vp_$query, 'CC','INFE'||'.'||v$_rot_glb||'.'||v_rot);
                          sc.txt_ret   := 'Erro ao carregar cursor dinamico Detail. Entre em contato com o administrador do sistema.';
                          sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_    := TRUE;           
                          GOTO gera_erro;                         
                      END;
                      vp_$col_detail := 0;
                      
                      BEGIN
                          --/DBMS_SQL.DEFINE_COLUMN - Cursor Dinamico
                          FOR j IN rec_xml_detail.FIRST .. rec_xml_detail.LAST
                          LOOP    
                              IF rec_xml_detail (j).ind_conteudo = 1 THEN  --  XML_fnc_conteudo_tag (rec_xml_detail, j,sc) THEN
                                  vp_$col_detail := vp_$col_detail+1;            
                                  DBMS_SQL.define_column (vp_$cur_detail, vp_$col_detail, rec_xml_detail (j).conteudo, rec_xml_detail (j).lnfe_tam_max); 
                              END IF;    
                          END LOOP;                      
                          vp_$temp := DBMS_SQL.EXECUTE (vp_$cur_detail);
                      EXCEPTION
                      WHEN OTHERS THEN
                          PCK_INFE_UTIL.prc_debug_sql_dinamico(NULL,vp_$query, 'CC','INFE'||'.'||v$_rot_glb||'.'||v_rot);
                          sc.txt_ret   := 'Erro ao setar colunas cursor dinamico Detail. Entre em contato com o administrador do sistema.';
                          sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_    := TRUE;           
                          GOTO gera_erro;           
                      END;                           
                    
                      LOOP
                         IF DBMS_SQL.fetch_rows (vp_$cur_detail) = 0 THEN
                            IF vp_$return = FALSE THEN
                               dbms_output.put_line('Detail Registro Não Encontrado!');     
                            END IF;
                               dbms_output.put_line('Detail Saindo ...');
                            EXIT;
                         ELSE
                            vp_$return := TRUE;
                            vp_$col_detail := 0;
                            --/DBMS_SQL.COLUMN_VALUE - Cursor Dinamico                        
                            FOR j IN rec_xml_detail.FIRST .. rec_xml_detail.LAST
                            LOOP 

                                BEGIN
                                    IF rec_xml_detail (j).ind_conteudo = 1 THEN  --   XML_fnc_conteudo_tag (rec_xml_detail, j,sc) THEN
                                        vp_$col_detail := vp_$col_detail+1;  
                                        DBMS_SQL.column_value (vp_$cur_detail, vp_$col_detail, rec_xml_detail (j).conteudo);
                                       -- rec_xml_detail (j).conteudo := fnc_format (rec_xml_detail, j,sc);  
                                        IF sc.raise_ THEN GOTO gera_erro; END IF;                                       
                                    END IF;  
                                EXCEPTION
                                WHEN OTHERS THEN
                                    sc.txt_ret   := 'Erro ao definir colunas cursor dinamico Detail. Entre em contato com o administrador do sistema.';
                                    sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_  := TRUE;           
                                    GOTO gera_erro;           
                                END;                  
                                                    
                                BEGIN                    
                                    --/Identifica a sequencia do item da NF (Atributo de Tag)
                                    IF rec_xml_detail.FIRST = j THEN
                                        vp_$level                     := rec_xml_header(I).LEVEL;
                                        rec_xml_header(I).LEVEL       := rec_xml_DETAIL(j).LEVEL;
                                        v_string := v_string || XML_fnc_mount (rec_xml_header, NULL,I,rec_tag_header,sc);
                                        rec_xml_header(I).LEVEL       :=  vp_$level;                                        
                                        IF sc.raise_ THEN GOTO gera_erro; END IF; 
                                        rec_xml_detail(j).lnfe_atributo_tag :=  ' nItem="'||rec_xml_detail (j).conteudo||'"';
                                    END IF; 
                                EXCEPTION
                                WHEN OTHERS THEN
                                    sc.txt_ret   := 'Erro ao Identifica a sequencia do item da NF Detail. Entre em contato com o administrador do sistema.';
                                    sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_  := TRUE;           
                                    GOTO gera_erro;           
                                END;                                      

                                BEGIN
                                    --/escreve XML DETAIL
                                    v_string := v_string || XML_fnc_mount (rec_xml_detail, rec_xml_detail (j).conteudo, j,rec_tag_detail,sc); 
                                    IF sc.raise_ THEN GOTO gera_erro; END IF; 
                                EXCEPTION
                                WHEN OTHERS THEN
                                    sc.txt_ret   := 'Erro ao escrever Detail XML. Entre em contato com o administrador do sistema.';
                                    sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_  := TRUE;           
                                    GOTO gera_erro;           
                                END;   
                                                                  
                            END LOOP;   
                            
                            BEGIN
                                v_string := v_string || XML_close (rec_xml_detail,sc); 
                                IF sc.raise_ THEN GOTO gera_erro; END IF;                           
                            EXCEPTION
                            WHEN OTHERS THEN
                                sc.txt_ret   := 'Erro ao fechar estrutura XML Detail. Entre em contato com o administrador do sistema.';
                                sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_  := TRUE;           
                                GOTO gera_erro;           
                            END;                                  
                         END IF;
                      END LOOP;

                      DBMS_SQL.close_cursor (vp_$cur_detail);

                  END IF; 
             END LOOP;  
            
             BEGIN
                 v_string := v_string || XML_close (rec_xml_header,sc);
                 IF sc.raise_ THEN GOTO gera_erro; END IF;  
             EXCEPTION
             WHEN OTHERS THEN
                 sc.txt_ret   := 'Erro ao fechar estrutura XML Header. Entre em contato com o administrador do sistema.';
                 sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_  := TRUE;           
                 GOTO gera_erro;           
             END;   
                                                       
          END IF;
          
          BEGIN
              v_string := v_string || XML_close (rec_xml_header,sc); 
              p_xml := v_string;
              IF sc.raise_ THEN GOTO gera_erro; END IF;   
          EXCEPTION
          WHEN OTHERS THEN
              sc.txt_ret   := 'Erro ao fechar estrutura XML. Entre em contato com o administrador do sistema.';
              sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_  := TRUE;           
              GOTO gera_erro;           
          END;       
      END LOOP;
      DBMS_SQL.close_cursor (vp_$cur_header); 
      
      v$_prog := 'PRC_REQ_DANFE'; 
      <<gera_erro>>
      
      p_xml := v_string;
      rec_xml_header.DELETE;
      rec_xml_detail.DELETE;
      rec_tag_header.DELETE;

        
   END prc_gera_xml_nfe;
   
   --/Procedimento para requisitar emissão de DNAFE (NF-e) para o Conector Synchro 'by RFS'
   PROCEDURE prc_req_danfe (
      p_gera_arq   IN      VARCHAR2 DEFAULT 'N',
      p_retcode    IN      VARCHAR2,
      p_mensagem   IN      VARCHAR2,
      p_nome_arq   IN      VARCHAR2
   )
   IS 

      --Cursor de retorno do da estrutura do XML por estrutura
      CURSOR cur_estruct_xml (P_estruct IN Infe_leiaute_xml.lnfe_estr_id%TYPE)
      IS
            SELECT  LEVEL             ,
                    LNFE_ID           ,
                    LNFE_ID_PAI       ,
                    LNFE_ESTR_ID      ,
                    LNFE_ESTR_ID_NEXT ,
                    LNFE_SEQ          ,
                    LNFE_STATUS       ,
                    LNFE_TAG_XML      ,
                    LNFE_TAG_DESC     ,
                    LNFE_ATRIBUTO_TAG ,
                    LNFE_VALOR_DEFAULT,
                    LNFE_COLUNA       ,
                    LNFE_TAM_MAX      ,
                    LNFE_TAM_ELE      ,
                    LNFE_TIPO         ,
                    LNFE_DEC          ,
                    LNFE_OBRG         ,
                    LNFE_OBS          ,
                    LNFE_USR_INC      ,
                    LNFE_USR_DT_INC   ,
                    LNFE_USR_ATLZ     ,
                    LNFE_USR_DT_ATLZ  ,
                    LNFE_CAR_DIREITA  ,
                    LNFE_CAR_ESQUERDA ,
                    ' ' conteudo      ,
                    0 ind_fecha_tag   ,
                    DECODE(LNFE_TIPO,'C',1,'N',1,'D',1,'K',1,
                       CASE 
                          WHEN LNFE_TIPO = 'T' AND  LNFE_ATRIBUTO_TAG IS NOT NULL THEN
                           1
                          ELSE
                           0 
                       END ) ind_conteudo ,
                    DECODE(  DECODE(LNFE_TIPO,'C',1,'N',1,'D',1,'K',1,
                               CASE 
                                  WHEN LNFE_TIPO = 'T' AND  LNFE_ATRIBUTO_TAG IS NOT NULL THEN
                                   1
                                  ELSE
                                   0 
                               END ), 1, 'pkg_infe_send_new08.xml_fnc_format('''||lnfe_tipo||''','||lnfe_dec||','||lnfe_tam_max||','||
                                                                              NVL2(lnfe_car_direita  ,''||lnfe_car_direita||'','NULL' )||','||
                                                                              NVL2(lnfe_car_esquerda ,''||lnfe_car_esquerda||'','NULL' )||','||                                                                        
                                                                              'a.'||LNFE_COLUNA||') '||  LNFE_COLUNA || 
                               ', ')  col_select                         
              FROM Infe_leiaute_xml a
              WHERE a.LNFE_STATUS   > 0 --/somente ativo
                AND lnfe_estr_id    = P_estruct --/Estrutura ID
                AND EXISTS (SELECT 0 --/Verifica se o campo PAI esta ativo
                              FROM infe_leiaute_xml b
                             WHERE ((b.lnfe_id   = a.lnfe_id_pai) OR (b.lnfe_id_pai = 1))
                               AND lnfe_status > 0)                
           CONNECT BY PRIOR lnfe_id = lnfe_id_pai
             START WITH lnfe_id_pai = 1
             ORDER SIBLINGS BY lnfe_id_pai,  lnfe_seq;    --lnfe_id;      

   
   v$xml     VARCHAR2(32767);
   TYPE xml_vt IS TABLE OF VARCHAR (5000)INDEX BY BINARY_INTEGER; 
   v$xml_vt  xml_vt;    
   v$xml_qt  INTEGER;  
   v$max_c   INTEGER := TO_NUMBER(pck_infe_util.fnc_parametro (1, NULL, NULL, 'E'));   
   vp_id_seq INTEGER;
   sc        ty_controle_rec; 
   idx          NUMBER := 1;            --/Indice de controle PL/Table       
   v_col_header VARCHAR2(32767) := ' '; --/Colunas do Header para sql Dinamico
   v_col_detail VARCHAR2(32767) := ' '; --/Colunas do Detail para sql Dinamico
   
   BEGIN v$_prog := 'PRC_REQ_DANFE';
   
       idx := 1;
       BEGIN
           FOR cur_xml IN cur_estruct_xml (1) 
           LOOP --/ popular  PL/SQL
               rec_xml_header (idx) := cur_xml;
               v_col_header := v_col_header||rec_xml_header (idx).col_select; 
               idx := idx + 1; --/ incremento index
           END LOOP;
           --/Carrega etrutura DETAIL do XML
           FOR cur_xml IN cur_estruct_xml (2) 
           LOOP --/ popular  PL/SQL
               rec_xml_detail (idx) := cur_xml;
               v_col_detail := v_col_detail||rec_xml_detail (idx).col_select;                
               idx := idx + 1; --/ incremento index
           END LOOP;
       EXCEPTION
       WHEN OTHERS THEN    
           sc.txt_ret   := 'Erro ao carregar estrutura (Header / Detail) XML. Entre em contato com o administrador do sistema.';
           sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_    := TRUE;           
           --GOTO gera_erro;
       END;   

       --/Altera casa decimal para ponto(.) 
       EXECUTE IMMEDIATE 'alter session set NLS_NUMERIC_CHARACTERS=''.,''';

     --  prc_atlz_st_controle (null,sc);
 
       FOR cur_CTRL IN ( SELECT a.ID                  ,a.PRIORIDADE          ,
                                a.CHAVE_ORIGEM        ,a.PSSW_ID             ,
                                a.STATUS              ,a.ACAO                ,
                                a.SISTEMA_ORIGEM      ,a.TIPO_ENVIO          ,
                                a.IMPRESSORA          ,a.COPIAS              ,
                                a.DH_ENVIO_CONECTOR   ,a.TENTATIVAS_RESPOSTA ,
                                a.DH_RETORNO_CONECTOR ,a.CHAVE_ACESSO_NFE    ,
                                a.PROTOCOLO           ,a.CODIGO_SITUACAO     ,
                                a.DESCRICAO_SITUACAO  ,a.DT_EXPIRA           ,
                                a.DT_INCL             ,a.DT_ATLZ             ,
                                NULL DH_RECEBIMENTO   ,NULL ENVIADO_DFE              
                          FROM infe_req_control a
                         WHERE --A.CODIGO_SITUACAO IS NULL
                         1=1
                            AND EXISTS (
                                  SELECT '*'
                                    FROM a02_in_req_nfe_HEADER b
                                   WHERE b.id_controle = a.id
                                     AND EXISTS (SELECT '*'
                                                   FROM a02_in_req_nfe_detail c
                                                  WHERE b.id = c.id_req_header))
         /*   and a.ID = 31*/           ORDER BY a.ID                                                 
       )
       LOOP
           BEGIN
               v$xml := NULL;
               
               pkg_infe_send_new08.prc_gera_xml_nfe (cur_CTRL.ID, rec_xml_header, v_col_header, rec_xml_detail, v_col_detail, v$xml, sc);
               
               IF sc.raise_ THEN GOTO next_nfe; END IF;  
               
               --/Verifica a quantidade de arquivos XML para gerar
              /* v$xml_qt := CEIL(LENGTH (v$xml) / v$max_c);
               
               --/Divide o arquivo XML
               FOR i IN 0 .. v$xml_qt-1
               LOOP
                   v$xml_vt(i) := SUBSTR(v$xml,(i*v$max_c),v$max_c-1);
               END LOOP; */
           EXCEPTION
           WHEN OTHERS THEN
               sc.txt_ret   := 'Erro na geracao do arquivo XML. Entre em contato com o administrador do sistema.';
               sc.v$errm    := SQLERRM;  sc.tip_ret   := 'E';  sc.raise_  := TRUE;           
               GOTO next_nfe;                        
            END; 
           sc.txt_ret   := 'Sucesso no na requisição de emissão de NF-e (DANFE). Sistema Origem: ('||cur_CTRL.SISTEMA_ORIGEM||') Chave Origem: ('||cur_CTRL.CHAVE_ORIGEM||').';
           sc.v$errm    := null;  sc.tip_ret   := 'S';  sc.raise_  := FALSE;   
                        
           <<next_nfe>>
   
                BEGIN   
                    UPDATE infe_req_control y
                       SET y.st_proc            = 1,
                           y.xml_in             = v$xml
                     WHERE y.chave_origem || y.acao = y.chave_origem || y.acao;   
                
                     COMMIT;    
                END;        
            v$xml_vt.DELETE;  

            COMMIT; 
       END LOOP;    
       
   END prc_req_danfe;   
   
END pkg_infe_send_new08;
/
huntersc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Sex, 12 Mar 2010 3:11 pm
Localização: FLORIANOPOLIS - SC

Boa Tarde Pessoal, show de bola essa rotina.

Pergunto para voces. Estou precisando enviar o XML que já tenho gravado em uma tabela campo xml(BLOB) para um email. Criei uma procedure de envio de email mais não consigo criar um um anexo com uma informacao da tabela.

alguém já fez essa rotina de enviar xml da danfe para email?

Valeu

At.
Jr
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Veja pelo pacote UTL_MAIL,

ou então classe java dentro do banco para envio,
huntersc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Sex, 12 Mar 2010 3:11 pm
Localização: FLORIANOPOLIS - SC

então, estou usando UTL_MAIL

Para fazer o anexo estou criando um arquivo temporario para poder anexar.
Mais ta dando problema na geracao.
o Arquivo vem vazio.

Selecionar tudo

BEGIN
   select chavenfe,xml INTO P_FILE,P_DATA from TABNFE;
  
  t_clob_len := DBMS_LOB.GetLength(p_data);
   v_arquivo := utl_file.fopen('DUMP',chavenfe+'.xml', 'W');
   WHILE t_pos < t_clob_len LOOP
      DBMS_LOB.Read(p_data, t_amount, t_pos, t_buffer);
      UTL_FILE.Put(v_arquivo, t_buffer);
      UTL_FILE.fflush(v_arquivo);
      t_pos := t_pos + t_amount;
	  
   END LOOP;
Não tem uma forma de criar o anexo já direto pelo select CLOB?

Valeu
amilleme
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 13 Mai 2010 8:26 pm
Localização: SP
Amilcar Leme - Equipe Oracle

Estou precisando de material de integração entre solução Mastersaf e Oracle E-business Suite para Nota Fiscal Eletronico, alguém poderia me ajudar? Obrigado.
SjraarGubbels
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 16 Set 2008 6:21 pm
Localização: Patos de Minas MG

Vi que ainda tem muitas empresas com forms 6i rodando, com uma solução da nota fiscal de 3o e não está 100% alinhada, ou tem problemas de performance. Nossa solução pode ajudar, já roda em empresas com grande fluxo ( >2500 diario). Tudo integrado com pl/sql.

Também temos a solução similar para Conhecimento Eletrônica de transporte CT(e) e nota fiscal de serviço!

Podemos ajudar resolver sue problema mais rápido. Entra em contato conosco. Nosso telefone mudou para 0xx34 3818 3800.


Sjraar Gubbels
Obers Ltda
sgubbels@obers.com.br

SjraarGubbels escreveu:já teve bastante procura pela solução. O bom da solução que ele pode encaixar em qual ERP, porque ele roda 100% dentro do banco e não precisa de licenças de outros softwares. A integração pode ser feito com triggers/procedures.

Se alguém tem duvidas:

Sjraar Gubbels
Obers Ltda
Tel 0xx34 38231423
sgubbels@obers.com.br
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes