Electronic Invoice (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.
Post Reply
marcogatti
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Posts: 7
Joined: Sun, 28 Oct 2007 6:48 pm
Location: Curitiba - PR
[MCTS] Marco Aurélio Santi Gatti

Good afternoon to all,

I would like to open a topic on electronic fiscal notes. We here from Paraná we will be required to meet our systems (in some segments) in the coming months, and several other states already have this implanted and others will still deploy. Someone has more information on this, as companies that have been able to integrate their system with Oracle (Oracle modules) that perform these tasks, source codes, and any relevant information to the theme ...
Thanks in advance!!!
Trevisolli
Moderador
Moderador
Posts: 2016
Joined: Wed, 12 Jan 2005 3:25 pm
Location: Araraquara - SP
Abraço,

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

Marco, good afternoon.

I can check for you.
I know here where I work (software development company), this development work (including integrating with modules that the client in question needed).

Would you like to acquire such integration service, or, only this information?
vsf
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Posts: 2
Joined: Wed, 21 May 2008 8:27 pm
Location: Salvador
Contact:
_________________
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

Refer to the article by my own published in http://www.activedelphi.com.br/lista_to ... &topico=17 EU contains information on generation, signature, transmission and DANFE electronic invoice (NF-e)

there you find generation examples, Signature and transmission that simplify the process for just the call of 1 function!
User avatar
fabdepaula
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Posts: 4
Joined: Thu, 15 May 2008 8:53 pm
Location: Araraquara -SP

Our legal find this topic about electronic invoice. Here in the company we work we are developing a module to work with NF-E, everything was going very well until we come across the inviving XML and XSD. Creating the XML files is no problem, the problem is at the time of submitting this XML creates validation through the XSD that the government offers, we are trying to find the best solution to do this. First we try the following solution, record the XML we create on the bench, until ai beleza, we created a table with XmlType field and recorded the XML. The problem is in loading the xsd in the bank, we are trying to do this using the dbms_xmlschema package where we put the xsd purchases in a bank directory and with the command dbms_xmlschema.registererschema we register these xsd to the bank, that's where we are with problems, if we create a simple sample XSD we managed to register normal on the bank and then we managed to submit the XML already saved in the bank the validation of XSD, but when we try to load the XSD from the government we can not, the government xsd are more complex From an XSD it is called another XSD, ours we are picking up from them !!!

If someone has passed this problem using this solution or another please help us and tell us how they are doing to validate the XML using the XSD of the Government


Thanks !!!!

Note: We are using Forms 6i and Banco Oracle 10G.
SjraarGubbels
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Posts: 4
Joined: Tue, 16 Sep 2008 6:21 pm
Location: Patos de Minas MG

We have developed solution for our own ERP, Fusing Forms (6i + 10g), Report (6i + 10g). Forms 6i is not as practicing to work with new technolegias, so we use the resources of the 10GR2 Taas Bank up, using XMLDB for part of the XML and Java stored procedures to take account of the webservices and digital signature.
We use JDeveloper to create the Java for WebService and digital signature that we import at the bank later.

In other words, the "hard" part was due to the database. So do not need to install an application server to take care of webservices.

Who is interested in the solution, can look for me.

ABR,
Sjraar Gubbels
SjraarGubbels
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Posts: 4
Joined: Tue, 16 Sep 2008 6:21 pm
Location: Patos de Minas MG

It was enough for the solution. The good of the solution that it can fit into which ERP, because it runs 100% inside the bank and does not need licenses from other software. Integration can be done with triggers / procedures.

If anyone has doubts:

Sjraar Gubbels
OBERS LTDA
Tel 0xx34 38231423
Sgubels @ obers .com.br
bertosro
Rank: Analista Júnior
Rank: Analista Júnior
Posts: 88
Joined: Fri, 18 Aug 2006 11:13 am
Location: São Paulo - SP
Bertosro
MSN / TALK - roberto.fernandes@gmail.com

Hello Masters Good evening

I would like to know if you have already developed some skeleton in PL / SQL for XML generation to order NF-E issuance to Sefaz.

I developed a routine for generation but the same Fiocu very slowly, it takes 15 seconds to generate an invoice.

Thanks for the help of all.

follows the code developed.

Select all

 
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
Posts: 15
Joined: Fri, 12 Mar 2010 3:11 pm
Location: FLORIANOPOLIS - SC

Good afternoon guys, ball show that routine.

I ask you. I need to send the XML that I have already recorded in an XML (BLOB) field table for an email. I created a more email sending procedure I can not create an attachment with a table information.

Someone already made this routine to send DANFE XML to email?

Valeu

AT.
Jr
diegolenhardt
Moderador
Moderador
Posts: 1177
Joined: Thu, 15 Oct 2009 10:28 am
Location: Recife

See the UTL_Mail package,

or Java class inside the bank for shipping,
huntersc
Rank: Programador Júnior
Rank: Programador Júnior
Posts: 15
Joined: Fri, 12 Mar 2010 3:11 pm
Location: FLORIANOPOLIS - SC

So, I'm using UTL_Mail

to make the attachment I'm creating a temporary file to be able to attach.
But giving problem in geracao.
The file comes empty.

Select all

 
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; 
Do not have a way to create the attachment already directly by SELECT COB?

Thanks
amilleme
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Posts: 1
Joined: Thu, 13 May 2010 8:26 pm
Location: SP
Amilcar Leme - Equipe Oracle

I need integration material between Mastersaf and Oracle E-Business Suite solution for electronic invoice, could anyone help me? Thanks.
SjraarGubbels
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Posts: 4
Joined: Tue, 16 Sep 2008 6:21 pm
Location: Patos de Minas MG

I saw that still has many companies with 6i Forms running, with a solution of the invoice of 3o and is not 100% aligned, or has performance problems. Our solution can help, already runs in companies with great stream (> 2500 diario). All integrated with PL / SQL.

We also have the similar solution for CT (E) electronic knowledge and service invoice knowledge!

We can help solve your problem faster. Contact us. Our phone has changed to 0xx34 3818 3800.


SJRAAR GBBELS
OBERS LTDA
sgubels@obers.com.br

SjraArgubbels wrote: has already had enough demand for the solution. The good of the solution that it can fit into which ERP, because it runs 100% inside the bank and does not need licenses from other software. Integration can be done with triggers / procedures.
If anyone has doubts:

Sjraar Gubbels
OBERS LTDA
Tel 0xx34 38231423
SguBels @ obers .com.br
Post Reply
  • Information
  • Who is online

    Users browsing this forum: No registered users and 13 guests