Clipper On Line • Ver Tópico - Uso da classesefaz

Uso da classesefaz

Projeto hbNFe (Nota Fiscal Eletronica/Danfe) para [x]Harbour

Moderador: Moderadores

 

Uso da classesefaz

Mensagempor JoséQuintas » 29 Set 2016 19:48

Pode dividir um pouco menos.

cXml+= '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">' + hb_OsNewLine() 
cXml+= '<infNFe versao="3.10" Id="NFe' + cId + '" >'      + hb_OsNewLine()

BlocoIde( @cXml )

cXml += '</infNFe>'
cXml += '</NFe>'
hb_MemoWrit( "arquivo.xml", cXml )  // Harbour
MemoWrit( "arquivo.xml", cXml, .T. ) // xHarbour, se não me engano
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor JoséQuintas » 29 Set 2016 19:56

Complemento:
Como dá pra ver no último post, o bloco de início e término na mesma rotina.
Até ficou visível que abriu dois blocos nfe, infnfe, e tinha esquecido de fechar um deles.

Assim, cada rotina fica responsável por tudo que pertence ao bloco dela.
Melhor pra conferir/alterar.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor JoséQuintas » 29 Set 2016 20:09

A minha rotina é antiga, começou em 2008.
E gera TXT e XML ao mesmo tempo.
Estou precisando revisar tudo, mas vai o módulo inicial, que talvez sirva como referência.

FUNCTION NfDbfToXml( cTxt, cXml, mTpEmis, mDataContingencia, mHoraContingencia, mMsgContingencia, cTpAmb )

   LOCAL   nSelect, mTexto, nCont, nNumItem, mObsContingencia
   LOCAL   mECombustivel := .F.
   LOCAL   nTotDifValf := 0, nTotRemVal := 0, nTotDesVal := 0
   MEMVAR  mChaveDigital, mObsONU3082, mObsONU1202, mObsCst60, mObsCst1070
   PRIVATE mChaveDigital, mObsONU3082, mObsONU1202, mObsCst060, mObsCst1070

   nSelect       := Select()
   cTxt          := ""
   cXml          := ""
   hb_Default( @cTpAmb, "1" )

   cTxt += "NOTA FISCAL" + NFE_SEPARADOR + "1" + NFE_SEPARADOR + " " + hb_eol()

   // cXml += [<?xml version="1.0"?>] // com isto recusa XML
   cXml += [<NFe xmlns="http://www.portalfiscal.inf.br/nfe">]

   mChaveDigital := ;
      "35" + ; // UF Ibge
   SubStr( DToS( jpnota->nfDatEmi ), 3, 4 ) + ; // AnoMes
   SoNumeros( jpempre->emCnpj ) + ;             // Cnpj
   "55" + ;                                     // Modelo de Docto Fiscal
   "001" + ;                                    // Serie Docto Fiscal
   jpnota->nfNotFis + ;                         // NF 9 digitos
   mTpEmis + ;                                  // Tipo de Emissao Normal/Contingencia (começou na NFE 2.00)
   Right( StrZero( Val( jpnota->nfCadDes ), 6 ), 2 ) + StrZero( Val( jpnota->nfCadDes ), 6 ) // Chave Aleatoria // reduzido 1 posicao
   mChaveDigital := mChaveDigital + CalculaDigito( mChaveDigital, "11" )

   Encontra( jpnota->nfPedido, "jppedi", "pedido" )

   // ---------- BLOCO A - NOTAFISCAL

   cTxt += "A" + NFE_SEPARADOR
   cTxt += NFE_VERSAONFE + NFE_SEPARADOR         // 1 a 4 digitos versao do layout
   cTxt += "NFe" + mChaveDigital + NFE_SEPARADOR // na exportacao vai ser seguido da chave digital, na importacao tanto faz se tem chave digital
   cTxt += " "
   cTxt += hb_eol()

   cXml += [<infNFe Id="NFe] + mChaveDigital + [" versao="] + NFE_VERSAONFE + [">]

   NfeBlocoId( @cTxt, @cXml, mTpEmis, mDataContingencia, mHoraContingencia, mMsgContingencia, cTpAmb )
   NfeBlocoEmitente( @cTxt, @cXml, @cTpAmb )
   NfeBlocoNotaAvulsa( @cTxt, @cXml )
   NfeBlocoDestinatario( @cTxt, @cXml, @cTpAmb )
   NfeBlocoEntrega( @cTxt, @cXml )

   nNumItem    := 1
   mObsONU3082 := .F.
   mObsONU1202 := .F.
   mObsCst60   := .F.
   mObsCst1070 := .F.

   SELECT jpitped
   SEEK jppedi->pdPedido
   DO WHILE jppedi->pdPedido == jpitped->ipPedido .AND. ! Eof()

      Encontra( jpitped->ipItem, "jpitem", "item" )
      mECombustivel := mECombustivel .OR. ( "COMBUSTIV" $ AUXPRODEPClass():Descricao( jpitem->ieProDep ) )
      IF mECombustivel
         IF jpitem->ieItem $ "000011,000019,000029,000034" // OLEO 1A e OCP
            mObsONU3082 := .T.
         ELSE
            mObsONU1202 := .T.
         ENDIF
      ENDIF
      IF SubStr( jpitped->ipIcmCst, 2, 2 ) $ "60"
         mObsCst60 := .T.
      ENDIF
      IF SubStr( jpitped->ipIcmCst, 2, 2 ) $ "10,70"
         mObsCst1070 := .T.
      ENDIF
      NfeBlocoProduto( @cTxt, @cXml, nNumItem, @nTotDifValf, @nTotRemVal, @nTotDesVal )
      nNumItem := nNumItem + 1
      SKIP
   ENDDO

   NfeBlocoTotais( @cTxt, @cXml, @nTotDifValf, @nTotRemVal, @nTotDesVal )
   NfeBlocoTransporte( @cTxt, @cXml )
   NfeBlocoCobranca( @cTxt, @cXml )
   IF mTpEmis == "2"
      mObsContingencia := Trim( mMsgContingencia ) + " em " + DToC( mDataContingencia ) + " " + mHoraContingencia
   ELSE
      mObsContingencia := ""
   ENDIF
   NfeBlocoInfAdicionais( @cTxt, @cXml, mObsContingencia, nTotDifValf, nTotRemVal, nTotDesVal )

   // ---------- (NOTAFISCAL-Z04) Uso Livre
   // ---------- (NOTAFISCAL-Z10) Processo Referenciado
   // ---------- (NOTAFISCAL-ZA) Exportacao - apenas na exportacao
   // ---------- (NOTAFISCAL-ZB) Compras - informacoes adicionais de compra

   cXml += [</infNFe>]
   cXml += [</NFe>]

   mTexto := cTxt
   FOR nCont = 1 TO Len( mTexto )
      IF Asc( SubStr( mTexto, nCont, 1 ) ) > 127
         SayScroll( "letra invalida" )
         SayScroll( SubStr( mTexto, nCont, 1 ) + "na posicao " + NumberXml( nCont ) )
         SayScroll( SubStr( mTexto, Max( 0, nCont - 40 ), 80 ) )
      ENDIF
   NEXT
   SELECT ( nSelect )

   RETURN NIL


Nota:
Quando começou, eu não tinha minha configuração de impostos e de observações/leis.
Qualquer dia confirmo se está tudo configurado direito nos clientes, e retiro essas exceções.... rs
Uia... dá pra alterar o FOR/NEXT final pra FOR/EACH.... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor malcarli » 30 Set 2016 11:49

Mestre, fiz agora mais uma parte colocando o emitente , destinatário e transportadora. Analisando a sua classe ze_spedxmlClass.prg, vi que é possível juntar o emitente e destinatário, praticamente em um classe única, mas sou leigo em classes. Quem sabe algum amigo melhore este fragmento.

/*****************************************************************************
* SISTEMA  : ROTINA EVENTUAL                                                *
* PROGRAMA : TESTE_GERAR_XML.PRG                                      *
* OBJETIVO : Gerar Xml de Nfe                                               *
* AUTOR    : Marcelo Antonio Lázzaro Carli                                  *
* DATA     : 29.09.2016                                                     *
* ULT. ALT.: 30.09.2016                                                     *
*****************************************************************************/
#include "minigui.ch"

#define DOW_DOMINGO   1  /// este define está em ze_xmlfun.prg - postei somente para funcionar

Procedure Main()
   REQUEST HB_LANG_PT
   HB_LangSelect([PT])
   REQUEST HB_CODEPAGE_PT850 &&& PARA INDEXAR CAMPOS ACENTUADOS
   HB_SETCODEPAGE([PT850])   &&& PARA INDEXAR CAMPOS ACENTUADOS

   Set wrap on
   Set talk off
   Set date briti             &&& data no formato dd/mm/aaaa
   Set dele on                &&& ignora registros marcados por deleção
   Set score off
   Set exact on
   Set ToolTip on
   Setcancel(.F.)             &&& evitar cancelar sistema c/ ALT + C
   Set cent on                &&& ano com 4 dígitos
   Set epoch to 2000          &&& ano a partir de 2000
   Set excl off               &&& abre arquivos em modo compartilhado
   Set navigation extended    &&& enter no lugar do tab
   Set language to portuguese &&& mensagens em português
   Set multiple off warning   &&& abrir 1 cópia somente
   Set browsesync on          &&& para o comando browse funcionar ok
   Set tooltipstyle balloon   &&& para mensagem dos campos em forma de balão
   Set menustyle extended     &&& padrão é standard, extended estilo office 2007
   Set programmaticchange off &&& introduzida na build 1.9.94

   define window fTeste_Xml at 0, 0 width 500 height 300 ICON [demo.ico] NOTIFYICON [demo.ico] MAIN title [Gerar Xml de Nfe] NOSIZE NOMAXIMIZE

      DEFINE STATUSBAR FONT "Arial" SIZE 9
        STATUSITEM [Sistemas] ICON [demo.ico] DEFAULT ACTION MsgInfo([Cliquei no ícone])
        KEYBOARD
        CLOCK
        DATE
      END STATUSBAR

      define button btn_GerarXml
         row 50
         col 90
         width 120
         caption [&Gerar Xml]
         action {|| fGeraXml([000000001], [99.999.999/0001-91])}
         DEFAULT .t.
      end button

      on key escape action {|| Thiswindow.Release}
   end window

   fTeste_Xml.center()
   fTeste_Xml.activate()
Return (Nil)

Static Procedure fGeraXml(cNf, cCnpj)
   Local cXml:= [], cId:= GetChaveAcesso(cNf, cCnpj, [35], [1])
 
   *** Cria o xml
   fCria_Xml(@cXml, cId)

   *** Identificação - Tag Ide
   fCriaIde(@cXml, [35], [000000001], [Venda mercadoria adquirida ou recebida de terceiros], [0], [1], dtoc(date()), time(), dtoc(date()), time(), [0], [1], [2], [0], [1], [3550308], [1], [])

   *** Emitente
   fCriaEmitente(@cXml, [99.999.999/0001-91], [2], [NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL], [Loja Teste], [Rua do Sossego], [12345], [Centro], [3550308], [Marília], [SP], [17.533-280], [1058], [Brasil], [(14)3333-3333], [123.123.123.123], [], [], [1])

   *** Destinatário
   fCriaDestinatario(@cXml, [99.999.999/0001-91], [2], [NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL], [Rua sem Nome], [999999], [Centro], [3550308], [Marília], [SP], [17.507-200], [1058], [Brasil], [(14)9999-99999], [1], [123.456.789.012], [teste@teste.com.br])

   *** Transportadora
   fCriaTransportadora(@cXml, [1], [ABC-9999], [Transportadora Dora], [12.123.123/0001-99], [SP], 123456, [Caixa], [], 1.20, 1.50)

   *** Fechamento do Cfe   
   fCriaFechamento(@cXml)
Return (Nil)

Static Procedure fCria_Xml(cXml, cId)
   cXml+= '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">' //+ hb_OsNewLine()
   cXml+= '<infNFe versao="3.10" Id="NFe' + cId + '" >'      //+ hb_OsNewLine()
Return (Nil)

Static Procedure fCriaFechamento(cXml)
   Local nHandle

   If Empty(cXml)
      Return (Nil)
   Endif

   cXml+= "</NFe>"
   If (nHandle:= FCREATE([teste.xml], 0)) == -1
       MsgInfo([Não foi possível criar o arquivo rascunho XML], [Erro])
       Return (Nil)
   Endif
   FWRITE(nHandle, cXml)
   FCLOSE(nHandle)
Return (Nil)

Static Procedure fCriaIde(cXml, cUf, cNf, cCfop, cIndPag, cSerie, cDataE, cTimeE, cDataS, cTimeS, cTipoNf, cDv, cAmbiente, cIndPres, cIdest, cMunIbged, cFinalidade, cNfrefencia)
   If Empty(cXml)
      Return (Nil)
   Endif

   cXml+= "<ide>"                                                     // Início da TAG (ide)
          cXml+= XmlTag( "cUF"   , cUf)                               // UF do Emitente no caso SP = 35
          cXml+= XmlTag( "cNF"   ,  cNf  )                            // Controle da Nota ou número do pedido
          cXml+= XmlTag( "natOp" , cCfop)                             // Natureza da Operação
          cXml+= XmlTag( "indPag", cIndPag )                          // Índice de Pagamento
          cXml+= XmlTag( "mod"   , "55" )                             // Modelo NFE=55 (FIXA)
          cXml+= XmlTag( "serie" , cSerie )                           // Série
          cXml+= XmlTag( "nNF"   , cNf )                              // Número da Nota Fiscal
          cXml+= XmlTag( "dhEmi" ,  DateTimeXml(cDataE, cTimeE))      // Data Emissão Formato yyyy-mm-dd

          If !Empty(cDataS)
             cXml+= XmlTag( "dhSaiEnt" , DateTimeXml(cDataS, cTimeS)) // Data da Saida da mercadoria
          Endif

          cXml+= XmlTag( "tpNF", cTipoNf)                       // Tipo de Emissão da NF
          cXml+= XmlTag( "idDest", cIdest)                      // Identificador de Local de destino da operação (1-Interna;2-Interestadual; 3-Exterior)
          cXml+= XmlTag( "cMunFG", cMunIbged )                  // IBGE do destinatário
          cXml+= XmlTag( "tpImp", "1")                          // Tipo de Impressão (Paisagem/Retrato) (FIXO)
          cXml+= XmlTag( "tpEmis", "1")                         // Tipo de Emissão  (FIXO)
          cXml+= XmlTag( "cDV", Right(cDv, 1))                  // Dígito da Chave de Acesso
          cXml+= XmlTag( "tpAmb" , cAmbiente)                   // Ambiente de Emissão (Hom./Producao)
          cXml+= XmlTag( "finNFe" , cFinalidade )               // NF Complementar

          If cAmbiente == [2]                                   // Alteração para Homologação vigente a partir de 01/05/2011
             cXml+= XmlTag( "indFinal" , "1")                   // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
          Else
             cXml+= XmlTag( "indFinal" , "0")                   // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
          Endif

          cXml+= XmlTag( "indPres" , cIndPres)                  // Indicador de Presença
*                 cXml+= "<indPres>" + Iif(oPresencial,"1",;
*                   Iif(GetProperty([f_Generico], [Cb_Finalidade], [Value]) == 2 .or.  GetProperty([f_Generico], [Cb_Finalidade], [Value]) == 3, [0], [2])) + "</indPres>"    // Indicador de presença do comprador no estabelecimento comercial no momento da
*                                                                                    // operação. (0-Não se aplica (ex.: Nota Fiscal complementar ou de ajuste;1-Operação
*                                                                                    // presencial;2-Não presencial, internet;3-Não presencial, tele-atendimento;4-NFC-e entrega
*                                                                                    // em domicílio;9-Não presencial, outros.
          cXml+= XmlTag( "procEmi" , "3")                       // Fixo
          cXml+= XmlTag( "verProc" , "3.10.86")                 // Versão do XML

          If !Empty(cNfrefencia)
             cXml+= "<NFref>"
                    cXml+= XmlTag( "refNFe" , CharRem("/;-:,\.(){}[] ", cNfrefencia))
             cXml+= "</NFref>"
          Endif
   cXml += "</ide>"                                                                  // Final da TAG (ide)
Return (Nil)

Static Procedure fCriaEmitente(cXml, cCnpj, cAmbiente, cNomeEmit, cFantasiaEmit, cEnderecoEmit, cNumeroEmit, cBairroEmit, cCidadeIbgeEmit, cCidadeEmit, cUfEmit, cCepEmit, cPaisBacenEmit, cPaisEmit, cFoneEmit, cIEEmit, cIMEmit, cCnaeEmit, cRegimeTribEmit)
   If Empty(cXml)
      Return (Nil)
   Endif

   cXml+= "<emit>"                                                                       // Início da TAG (emit)
          cXml+= XmlTag( "CNPJ" , CharRem("/;-:,\.(){}[] ", cCnpj))                      // CNPJ do Emitente

          If cAmbiente == [2]                                                            // Alteração para Homologação vigente a partir de 01/05/2011
             cXml+= XmlTag( "xNome" , "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL")
          Else
             cXml+= XmlTag( "xNome" , AllTrim(fRetiraAcento(cNomeEmit)))                 // Razão Social emitente
          Endif

          cXml+= XmlTag( "xFant" ,  CharRem("/;-:,\.(){}[] ", cFantasiaEmit))            // Nome Fantasia Emitente

          cXml+= "<enderEmit>"
                 cXml+= XmlTag( "xLgr"    , AllTrim(fRetiraAcento(cEnderecoEmit)))       // Endereço Emitente
                 cXml+= XmlTag( "nro"     , cNumeroEmit)                                 // Número do Endereco do Emitente
                 cXml+= XmlTag( "xBairro" , AllTrim(fRetiraAcento(cBairroEmit)))         // Bairro do Emitente
                 cXml+= XmlTag( "cMun"    , cCidadeIbgeEmit)                             // Código IBGE do emitente
                 cXml+= XmlTag( "xMun"    , AllTrim(fRetiraAcento(cCidadeEmit)))         // Cidade do Emitente
            cXml+= XmlTag( "UF"      , cUfEmit)                                     // UF do Emitente
            cXml+= XmlTag( "CEP"     , CharRem("/;-:,\.(){}[] ", cCepEmit))         // CEP do Emitente
            cXml+= XmlTag( "cPais"   , cPaisBacenEmit)                              // Código do País emitente
            cXml+= XmlTag( "xPais"   , cPaisEmit)                                   // País Emitente da NF
            cXml+= XmlTag( "fone"    , CharRem("/;-:,\.(){}[] ", cFoneEmit))        // Telefone do Emitente
          cXml+= "</enderEmit>"
         
          cXml+= XmlTag( "IE" , CharRem("/;-:,\.(){}[] ", cIEEmit))                      // Inscrição Estadual do Emitente

          If !Empty(cIMEmit)                                                             // Não obrigatório
             cXml+= XmlTag( "IM" , cIMEmit)                                              // Inscrição Municipal do Emitente
          Endif

          If !Empty(cCnaeEmit)                                                           // Não obrigatório
             cXml+= XmlTag( "CNAE" , cCnaeEmit)                                          // CNAE do Emitente
          Endif

          cXml+= XmlTag( "CRT" , cRegimeTribEmit)                                        // Códigos de Detalhamento do Regime e da Situação TABELA A – Código de Regime Tributário – CRT
                                                                                         // 1 – Simples Nacional
                                                                                         // 2 – Simples Nacional – excesso de sublimite da receita bruta
                                                                                         // 3 – Regime Normal NOTAS EXPLICATIVAS
   cXml+= "</emit>"                                                                      // Final da TAG Emitente
Return (Nil)

Static Procedure fCriaDestinatario(cXml, cCnpjCpfDest, cAmbiente, cNomeDest, cEnderecoDest, cNumeroDest, cBairroDest, cCidadeIbgeDest, cCidadeDest, cUfDest, cCepDest, cPaisBacenDest, cPaisDest, cFoneDest, cTipoIe, cIEDest, cEmail)
   If Empty(cXml)
      Return (Nil)
   Endif

   cXml+= "<dest>"
          If cUfDest == [EX]
             cXml+= "<idEstrangeiro></idEstrangeiro>"
          Else
             If cAmbiente == [1]
                If Len(CharRem("/;-:,\.(){}[] ", cCnpjCpfDest)) == 11 // Pessoa Física - Cpf
                   cXml+= XmlTag( "CPF"  , CharRem("/;-:,\.(){}[] ", cCnpjCpfDest))
           Else                                                  // Pessoa Jurídica - Cnpj
                   cXml+= XmlTag( "CNPJ" , CharRem("/;-:,\.(){}[] ", cCnpjCpfDest))
                Endif
             Endif
          Endif   

          If cAmbiente == [2]                                         // Alteração para Homologação vigente a partir de 01/05/2011
             cXml+= XmlTag( "CNPJ"  , [99999999000191])
             cXml+= XmlTag( "xNome" , [NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL])
          Else
             cXml+= XmlTag( "xNome" , AllTrim(fRetiraAcento(cNomeDest)))
          Endif

          cXml+= "<enderDest>"   
                 cXml+= XmlTag( "xLgr"    , AllTrim(fRetiraAcento(cEnderecoDest)))
                 cXml+= XmlTag( "nro"     , cNumeroDest)
                 cXml+= XmlTag( "xBairro" , AllTrim(fRetiraAcento(cBairroDest)))

                 If cUfDest == [EX]       // Importação/Exportação
                    cXml+= XmlTag( "cMun"  , [9999999])
                    cXml+= XmlTag( "xMun"  , [EXTERIOR])
                    cXml+= XmlTag( "UF"    , [EX])
                    cXml+= XmlTag( "cPais" , cPaisBacenDest)
                    cXml+= XmlTag( "xPais" , cPaisDest)
                 Else                         // Comércio Interno
                    cXml+= XmlTag( "cMun"  , cCidadeIbgeDest)
                    cXml+= XmlTag( "xMun"  , AllTrim(fRetiraAcento(cCidadeDest)))
                    cXml+= XmlTag( "UF"    , cUfDest)
                    cXml+= XmlTag( "CEP"   , CharRem("/;-:,\.(){}[] ", cCepDest))
                    cXml+= XmlTag( "cPais" , cPaisBacenDest)
                    cXml+= XmlTag( "xPais" , cPaisDest)

               If !Empty(CharRem("/;-:,\.(){}[] ", cFoneDest))
                cXml+= XmlTag( "fone" , AllTrim(CharRem("/;-:,\.(){}[] ", cFoneDest)))
                    Endif
                 Endif
          cXml+= "</enderDest>"

          If cAmbiente == [2]    // Ambiente de Homologação
        cXml+= XmlTag( "indIEDest" , [9])
     Else                // Ambiente de Produção
           cXml+= XmlTag( "indIEDest" , cTipoIe)            //   1 = Contribuinte ICMS (informar a IE do destinatário);
                                                              //   2 = Contribuinte isento de Inscrição no cadastro de Contribuintes do ICMS;
                                                              //   9 = Não Contribuinte, que pode ou não possuir Inscrição Estadual no Cadastro de Contribuintes do ICMS;
             If cUfDest == [EX]   // Importação/Exportação
                cXml+= "</IE>"
             Else
                cXml+= XmlTag( "IE" , CharRem("/;-:,\.(){}[] ", cIEDest))
             Endif
          Endif

          If !Empty(cEmail)
             cXml+= XmlTag( "email" , AllTrim(cEmail))
          Endif   
   cXml+= "</dest>"
Return (Nil)

Static Procedure fCriaTransportadora(cXml, cModFrete, cPlaca, cNomeTrans, cCnpjCpfTrans, cUfTrans, nQteTrans, cEspecie, cCfop, nPesoLiq, nPesoBru)
   If Empty(cXml)
      Return (Nil)
   Endif

   cXml+= "<transp>"
          cXml+= XmlTag( "modFrete" , cModFrete)

          If !Empty(CharRem("/;-:,\.(){}[] ", cPlaca))
         cXml+= "<transporta>"
                   If !Empty(cNomeTrans)
                        If Len(CharRem("/;-:,\.(){}[] ", cCnpjCpfTrans)) == 11 // Pessoa Física - Cpf
                           cXml+= XmlTag( "CPF"  , CharRem("/;-:,\.(){}[] ", cCnpjCpfTrans))
                     Else                                                   // Pessoa Juridica - Cnpj
                           cXml+= XmlTag( "CNPJ" , CharRem("/;-:,\.(){}[] ", cCnpjCpfTrans))
                        Endif
                        cXml+= XmlTag( "xNome" , AllTrim(fRetiraAcento(cNomeTrans)))
                Else   
              cXml+= XmlTag( "xNome" , [o Proprio])
                     Endif   
              cXml+= "</transporta>"

              cXml+= "<veicTransp>"
                     cXml+= XmlTag( "placa" , CharRem("/;-:,\.(){}[] ", cPlaca))
                     cXml+= XmlTag( "UF"    , cUfTrans)
              cXml+= "</veicTransp>"
          Endif   

          cXml+= "<vol>"           // Informações de Volumes
                 If !Empty(nQteTrans)
               cXml+= XmlTag( "qVol" , NumberXml(nQteTrans, 0))
                 Endif
                 
                 If !Empty(cEspecie)
          cXml+= XmlTag( "esp" , AllTrim(cEspecie))
                 Endif

                 // Remessa Para Industrialização
                 If CharRem("/;-:,\.(){}[] ", cCfop) $ [6901|5901|5915|6915] 
                    cXml+= "marca></marca>"
                 Else   
                    If !Empty(nQteTrans)
                       cXml+= XmlTag( "marca" , [PROPRIA])
                    Endif
                 Endif

                 If !Empty(nQteTrans)
                    cXml+= XmlTag( "nVol" , [S/N])
                 Endif

                 If !Empty(nPesoLiq)
                    cXml+= XmlTag( "pesoL" , NumberXml(nPesoLiq, 3))
                 Endif

                 If !Empty(nPesoBru)
                    cXml+= XmlTag( "pesoB" , NumberXml(nPesoBru, 3))
                 Endif
          cXml+= "</vol>"
   cXml+= "</transp>"
Return (Nil)

Static Function GetChaveAcesso(cNF, cCnpj, cUfEmit, cSerie)  // Manual cUf + AAMM + CNPJ + Mod + Serie + NrNota + cNF + cDV  - Marcelo de Paula 22/06/2016
   Local cKey:= cUfEmit                  /// no caso sp = 35
         cKey+= SubStr(Dtoc(date()), 9, 2) + SubStr(Dtoc(date()), 4, 2)
         cKey+= CharRem("/;-:,\.(){}[] ", cCnpj)
         cKey+= [55] + Padl(cSerie, 3, [0])
         cKey+= Padl(cNF, 9, [0])
         cKey+= [1]
         cKey+= Padl(cNF, 8, [0])
Return (cKey + fDv_nfe(cKey))

Static Function fDv_nfe(cVarchave) // Função para Calculo de Digito - Marcelo de Paula 22/06/2016
   Local nCont1:= Len(cVarchave) + 1, nCont2:= x_Cont:= 1, nSoma:= 0, cDigito:= [0]

   For x_Cont:= 1 to Len(cVarchave)
       nCont1-= 1
       nCont2+= 1

       If nCont2 == 10
          nCont2:= 2
       Endif
       nSoma+= Val(SubStr(cVarchave, nCont1, 1)) * nCont2
   Next
   If Mod(nSoma, 11) <= 1
      cDigito:= [0]
   Else
      cDigito:= AllTrim(Str(11 - Mod(nSoma, 11), 10))
   Endif
Return(cDigito)

********************* Retira Acentos e Letras de uma String ********************
Static Function fRetiraAcento(cStr)
   cStr:= strtran(cStr, [á], [a])  ; cStr:= strtran(cStr, [à], [a])  ; cStr:= strtran(cStr, [â], [a])
   cStr:= strtran(cStr, [ã], [a])  ; cStr:= strtran(cStr, [Á], [A])  ; cStr:= strtran(cStr, [À], [A])
   cStr:= strtran(cStr, [Â], [A])  ; cStr:= strtran(cStr, [Ã], [A])  ; cStr:= strtran(cStr, [É], [E])
   cStr:= strtran(cStr, [Ê], [E])  ; cStr:= strtran(cStr, [é], [e])  ; cStr:= strtran(cStr, [è], [e])
   cStr:= strtran(cStr, [È], [e])  ; cStr:= strtran(cStr, [ê], [e])  ; cStr:= strtran(cStr, [í], [i])
   cStr:= strtran(cStr, [ì], [i])  ; cStr:= strtran(cStr, [Í], [I])  ; cStr:= strtran(cStr, [Ì], [I])
   cStr:= strtran(cStr, [õ], [o])  ; cStr:= strtran(cStr, [ô], [o])  ; cStr:= strtran(cStr, [ó], [o])
   cStr:= strtran(cStr, [ò], [o])  ; cStr:= strtran(cStr, [ö], [o])  ; cStr:= strtran(cStr, [Ö], [O])
   cStr:= strtran(cStr, [Ò], [O])  ; cStr:= strtran(cStr, [Ó], [O])  ; cStr:= strtran(cStr, [Ô], [O])
   cStr:= strtran(cStr, [Õ], [O])  ; cStr:= strtran(cStr, [ü], [u])  ; cStr:= strtran(cStr, [ú], [u])
   cStr:= strtran(cStr, [ù], [u])  ; cStr:= strtran(cStr, [Ú], [U])  ; cStr:= strtran(cStr, [Ù], [U])
   cStr:= strtran(cStr, [Ü], [U])  ; cStr:= strtran(cStr, [ç], [c])  ; cStr:= strtran(cStr, [Ç], [C])
   cStr:= strtran(cStr, [ÿ], [y])  ; cStr:= strtran(cStr, [ñ], [n])  ; cStr:= strtran(cStr, [Ñ], [N])
   cStr:= strtran(cStr, [º], [o.]) ; cStr:= strtran(cStr, [°], [o.]) ; cStr:= strtran(cStr, [ª], [a.])
Return (cStr)
********************* Fim da Função Retira Acentos e Letras de uma String *******

FUNCTION XmlTag( cTag, cConteudo )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   LOCAL cTexto := ""

   hb_Default( @cConteudo, "" )
   cConteudo := AllTrim( cConteudo )
   IF Len( Trim( cConteudo ) ) = 0
      cTexto := [<]+ cTag + [/>]
   ELSE
      cConteudo := AllTrim( cConteudo )
      IF Len( cConteudo ) == 0
         cConteudo := " "
      ENDIF
      cTexto := cTexto + [<] + cTag + [>] + cConteudo + [</] + cTag + [>]
   ENDIF

   RETURN cTexto

FUNCTION DateTimeXml( dDate, cTime, cUF, lUTC )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   LOCAL cText, lHorarioVerao

   hb_Default( @dDate, Date() )
   hb_Default( @cTime, Time() )
   hb_Default( @cUF, "SP" )
   hb_Default( @lUTC, .T. )

   lHorarioVerao := ( dDate >= HorarioVeraoInicio( Year( dDate ) ) .AND. dDate <= HorarioVeraoTermino( Year( dDate - 1 ) ) )
   cText := Transform( Dtos( dDate ), "@R 9999-99-99" ) + "T" + cTime

   DO CASE
   CASE ! lUTC ; cText += "" // no UTC
   CASE cUF $ "AC"                                             ; cText += "-05:00"
   CASE cUF $ "MT,MS" .AND. lHorarioVerao                      ; cText += "-05:00"
   CASE cUF $ "DF,ES,GO,MG,PR,RJ,RS,SC,SP" .AND. lHorarioVerao ; cText += "-04:00"
   CASE cUF $ "AM,MT,MS,RO,RR"                                 ; cText += "-04:00"
   OTHERWISE                                                   ; cText += "-03:00"
   ENDCASE

   RETURN cText

FUNCTION HorarioVeraoInicio( iAno )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   LOCAL dPrimeiroDeOutubro, dPrimeiroDomingoDeOutubro, dTerceiroDomingoDeOutubro

   dPrimeiroDeOutubro := Stod( StrZero( iAno, 4 ) + "1001" )
   dPrimeiroDomingoDeOutubro := dPrimeiroDeOutubro + iif( Dow( dPrimeiroDeOutubro ) == DOW_DOMINGO, 0, ( 7 - Dow( dPrimeiroDeOutubro ) + 1 ) )
   dTerceiroDomingoDeOutubro := dPrimeiroDomingoDeOutubro + 14

   RETURN dTerceiroDomingoDeOutubro

FUNCTION DomingoDePascoa( iAno )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   LOCAL iA, iB, iC, iD, iE, iF, iG, iH, iI, iK, iL, iM, iMes, iDia

   iA := iAno % 19
   iB := Int( iAno / 100 )
   iC := iAno % 100
   iD := Int( iB / 4 )
   iE := iB % 4
   iF := Int( ( iB + 8 ) / 25 )
   iG := Int( ( iB - iF + 1 ) / 3 )
   iH := ( 19 * iA + iB - iD - iG + 15 ) % 30
   iI := Int( iC / 4 )
   iK := iC % 4
   iL := ( 32 + 2 * iE + 2 * iI - iH - iK ) % 7
   iM := Int( ( iA + 11 * iH + 22 * iL) / 451 )
   iMes := Int( ( iH + iL - 7 * iM + 114 ) / 31 )
   iDia := ( ( iH + iL - 7 * iM + 114 ) % 31 ) + 1

   RETURN Stod( StrZero( iAno, 4 ) + StrZero( iMes, 2 ) + StrZero( iDia, 2 ) )

FUNCTION TercaDeCarnaval( iAno )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   RETURN DomingoDePascoa( iAno ) - 47

FUNCTION HorarioVeraoTermino( iAno )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   LOCAL dPrimeiroDeFevereiro, dPrimeiroDomingoDeFevereiro, dTerceiroDomingoDeFevereiro

   dPrimeiroDeFevereiro := Stod( StrZero( iAno + 1, 4 ) + "0201" )
   dPrimeiroDomingoDeFevereiro := dPrimeiroDeFevereiro + iif( Dow( dPrimeiroDeFevereiro ) == DOW_DOMINGO, 0, ( 7 - Dow( dPrimeiroDeFevereiro ) + 1 ) )
   dTerceiroDomingoDeFevereiro := dPrimeiroDomingoDeFevereiro + 14
   IF dTerceiroDomingoDeFevereiro == TercaDeCarnaval( iAno + 1 ) - 2 /* nao pode ser domingo de carnaval */
      dTerceiroDomingoDeFevereiro += 7
   ENDIF

   RETURN dTerceiroDomingoDeFevereiro

FUNCTION NumberXml( nValue, nDecimals ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   hb_Default( @nDecimals, 0 )

   RETURN Ltrim( Str( nValue, 16, nDecimals ) )

malcarli
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 181
Data de registro: 20 Ago 2015 18:14
Cidade/Estado: marilia/sp
Curtiu: 81 vezes
Mens.Curtidas: 4 vezes

Uso da classesefaz

Mensagempor JoséQuintas » 30 Set 2016 14:42

Uma coisa me chamou a atenção:

If cAmbiente == [2]                                   // Alteração para Homologação vigente a partir de 01/05/2011
  cXml+= XmlTag( "indFinal" , "1")                   // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
Else
   cXml+= XmlTag( "indFinal" , "0")                   // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
Endif


Acho que não depende mais se é homologação ou produção

Só comentário:
No caso de CNPJ, uso SoNumeros( cCnpj ), acho que fica mais claro o que acontece, do que CharRem( Cnpj, "%&%&$#" ), e evita errar nessa lista de simbolos.
No caso do texto, mesma coisa, uso StringXml( cTexto ). Mesmo que lá dentro da função StringXml() você use o CharRem(), ou RetiraAcento().
Isso é questão pessoal, pra evitar erro de digitação no fonte de trabalho. E se descobrir depois que faltaram caracteres na lista, basta alteração a funcão, e não cada linha de fonte que usava CharRem().
Se achar interessante só pra esse fonte, só criar dentro dele como STATIC FUNCTION.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Uso da classesefaz

Mensagempor malcarli » 30 Set 2016 14:52

vou alterar com as suas sugestões. Não achei a função stringxml em nenhuma das tuas classes/funções. Poderia disponibilizar para alterar ? obg
malcarli
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 181
Data de registro: 20 Ago 2015 18:14
Cidade/Estado: marilia/sp
Curtiu: 81 vezes
Mens.Curtidas: 4 vezes

Uso da classesefaz

Mensagempor malcarli » 03 Out 2016 10:42

Mais duas partes: cobrança e informações adicionais e demais alterações sugeridas pelo José. Não achei a função stringxml em nenhuma das tuas classes/funções. Poderia disponibilizar para alterar ? obg

/*****************************************************************************
* SISTEMA  : ROTINA EVENTUAL                                                *
* PROGRAMA : TESTE_GERAR_XML.PRG                                      *
* OBJETIVO : Gerar Xml de Nfe                                               *
* AUTOR    : Marcelo Antonio Lázzaro Carli                                  *
* DATA     : 29.09.2016                                                     *
* ULT. ALT.: 03.10.2016                                                     *
*****************************************************************************/
#include "minigui.ch"

#define DOW_DOMINGO   1  /// este define está em ze_xmlfun.prg - postei somente para funcionar

Procedure Main()
   REQUEST HB_LANG_PT
   HB_LangSelect([PT])
   REQUEST HB_CODEPAGE_PT850 &&& PARA INDEXAR CAMPOS ACENTUADOS
   HB_SETCODEPAGE([PT850])   &&& PARA INDEXAR CAMPOS ACENTUADOS

   Set wrap on
   Set talk off
   Set date briti             &&& data no formato dd/mm/aaaa
   Set dele on                &&& ignora registros marcados por deleção
   Set score off
   Set exact on
   Set ToolTip on
   Setcancel(.F.)             &&& evitar cancelar sistema c/ ALT + C
   Set cent on                &&& ano com 4 dígitos
   Set epoch to 2000          &&& ano a partir de 2000
   Set excl off               &&& abre arquivos em modo compartilhado
   Set navigation extended    &&& enter no lugar do tab
   Set language to portuguese &&& mensagens em português
   Set multiple off warning   &&& abrir 1 cópia somente
   Set browsesync on          &&& para o comando browse funcionar ok
   Set tooltipstyle balloon   &&& para mensagem dos campos em forma de balão
   Set menustyle extended     &&& padrão é standard, extended estilo office 2007
   Set programmaticchange off &&& introduzida na build 1.9.94

   define window fTeste_Xml at 0, 0 width 500 height 300 ICON [demo.ico] NOTIFYICON [demo.ico] MAIN title [Gerar Xml de Nfe] NOSIZE NOMAXIMIZE

      DEFINE STATUSBAR FONT "Arial" SIZE 9
        STATUSITEM [Sistemas] ICON [demo.ico] DEFAULT ACTION MsgInfo([Cliquei no ícone])
        KEYBOARD
        CLOCK
        DATE
      END STATUSBAR

      define button btn_GerarXml
         row 50
         col 90
         width 120
         caption [&Gerar Xml]
         action {|| fGeraXml([000000001], [99.999.999/0001-91])}
         DEFAULT .t.
      end button

      on key escape action {|| Thiswindow.Release}
   end window

   fTeste_Xml.center()
   fTeste_Xml.activate()
Return (Nil)

Static Procedure fGeraXml(cNf, cCnpj)
   Local cXml:= [], cId:= GetChaveAcesso(cNf, cCnpj, [35], [1])
 
   *** Cria o xml
   fCria_Xml(@cXml, cId)

   *** Identificação - Tag Ide
   fCriaIde(@cXml, [35], [000000001], [Venda mercadoria adquirida ou recebida de terceiros], [0], [1], dtoc(date()), time(), dtoc(date()), time(), [0], [1], [2], [0], [1], [3550308], [1], [])

   *** Emitente
   fCriaEmitente(@cXml, [99.999.999/0001-91], [2], [NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL], [Loja Teste], [Rua do Sossego], [12345], [Centro], [3550308], [Marília], [SP], [17.533-280], [1058], [Brasil], [(14)3333-3333], [123.123.123.123], [], [], [1])

   *** Destinatário
   fCriaDestinatario(@cXml, [99.999.999/0001-91], [2], [NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL], [Rua sem Nome], [999999], [Centro], [3550308], [Marília], [SP], [17.507-200], [1058], [Brasil], [(14)9999-99999], [1], [123.456.789.012], [teste@teste.com.br])

   *** Transportadora
   fCriaTransportadora(@cXml, [1], [ABC-9999], [Transportadora Dora], [12.123.123/0001-99], [SP], 123456, [Caixa], [], 1.20, 1.50)

   *** Cobrança
   fCriaCobranca(@cXml, { {12345, date() + 30, 10.00}, {12346, date() + 60, 20.00}, {12347, date() + 90, 30.00} })

   *** Informações Adicionais
   fCriaInformacoes(@cXml, .F., 1, 1, 1, 1, [], [], [Teste observações;], {})

   *** Fechamento do Cfe   
   fCriaFechamento(@cXml)
Return (Nil)

Static Procedure fCria_Xml(cXml, cId)
   cXml+= '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">' //+ hb_OsNewLine()
   cXml+= '<infNFe versao="3.10" Id="NFe' + cId + '" >'      //+ hb_OsNewLine()
Return (Nil)

Static Procedure fCriaFechamento(cXml)
   Local nHandle

   If Empty(cXml)
      Return (Nil)
   Endif

   cXml+= "</infNFe>"
   cXml+= "</NFe>"
   If (nHandle:= FCREATE([teste.xml], 0)) == -1
       MsgInfo([Não foi possível criar o arquivo rascunho XML], [Erro])
       Return (Nil)
   Endif
   FWRITE(nHandle, cXml)
   FCLOSE(nHandle)
Return (Nil)

Static Procedure fCriaIde(cXml, cUf, cNf, cCfop, cIndPag, cSerie, cDataE, cTimeE, cDataS, cTimeS, cTipoNf, cDv, cAmbiente, cIndPres, cIdest, cMunIbged, cFinalidade, cNfrefencia)
   If Empty(cXml)
      Return (Nil)
   Endif

   cXml+= "<ide>"                                                     // Início da TAG (ide)
          cXml+= XmlTag( "cUF"   , cUf)                               // UF do Emitente no caso SP = 35
          cXml+= XmlTag( "cNF"   ,  cNf  )                            // Controle da Nota ou número do pedido
          cXml+= XmlTag( "natOp" , cCfop)                             // Natureza da Operação
          cXml+= XmlTag( "indPag", cIndPag )                          // Índice de Pagamento
          cXml+= XmlTag( "mod"   , "55" )                             // Modelo NFE=55 (FIXA)
          cXml+= XmlTag( "serie" , cSerie )                           // Série
          cXml+= XmlTag( "nNF"   , cNf )                              // Número da Nota Fiscal
          cXml+= XmlTag( "dhEmi" ,  DateTimeXml(cDataE, cTimeE))      // Data Emissão Formato yyyy-mm-dd

          If !Empty(cDataS)
             cXml+= XmlTag( "dhSaiEnt" , DateTimeXml(cDataS, cTimeS)) // Data da Saida da mercadoria
          Endif

          cXml+= XmlTag( "tpNF", cTipoNf)                       // Tipo de Emissão da NF
          cXml+= XmlTag( "idDest", cIdest)                      // Identificador de Local de destino da operação (1-Interna;2-Interestadual; 3-Exterior)
          cXml+= XmlTag( "cMunFG", cMunIbged )                  // IBGE do destinatário
          cXml+= XmlTag( "tpImp", "1")                          // Tipo de Impressão (Paisagem/Retrato) (FIXO)
          cXml+= XmlTag( "tpEmis", "1")                         // Tipo de Emissão  (FIXO)
          cXml+= XmlTag( "cDV", Right(cDv, 1))                  // Dígito da Chave de Acesso
          cXml+= XmlTag( "tpAmb" , cAmbiente)                   // Ambiente de Emissão (Hom./Producao)
          cXml+= XmlTag( "finNFe" , cFinalidade )               // NF Complementar

          If cAmbiente == [2]                                   // Alteração para Homologação vigente a partir de 01/05/2011
             cXml+= XmlTag( "indFinal" , "1")                   // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
          Else
             cXml+= XmlTag( "indFinal" , "0")                   // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
          Endif

          cXml+= XmlTag( "indPres" , cIndPres)                  // Indicador de Presença
*                 cXml+= "<indPres>" + Iif(oPresencial,"1",;
*                   Iif(GetProperty([f_Generico], [Cb_Finalidade], [Value]) == 2 .or.  GetProperty([f_Generico], [Cb_Finalidade], [Value]) == 3, [0], [2])) + "</indPres>"    // Indicador de presença do comprador no estabelecimento comercial no momento da
*                                                                                    // operação. (0-Não se aplica (ex.: Nota Fiscal complementar ou de ajuste;1-Operação
*                                                                                    // presencial;2-Não presencial, internet;3-Não presencial, tele-atendimento;4-NFC-e entrega
*                                                                                    // em domicílio;9-Não presencial, outros.
          cXml+= XmlTag( "procEmi" , "3")                       // Fixo
          cXml+= XmlTag( "verProc" , "3.10.86")                 // Versão do XML

          If !Empty(cNfrefencia)
             cXml+= "<NFref>"
                    cXml+= XmlTag( "refNFe" , CharRem("/;-:,\.(){}[] ", cNfrefencia))
             cXml+= "</NFref>"
          Endif
   cXml += "</ide>"                                                                  // Final da TAG (ide)
Return (Nil)

Static Procedure fCriaEmitente(cXml, cCnpj, cAmbiente, cNomeEmit, cFantasiaEmit, cEnderecoEmit, cNumeroEmit, cBairroEmit, cCidadeIbgeEmit, cCidadeEmit, cUfEmit, cCepEmit, cPaisBacenEmit, cPaisEmit, cFoneEmit, cIEEmit, cIMEmit, cCnaeEmit, cRegimeTribEmit)
   If Empty(cXml)
      Return (Nil)
   Endif

   cXml+= "<emit>"                                                                       // Início da TAG (emit)
          cXml+= XmlTag( "CNPJ" , SoNumeros(cCnpj))                      // CNPJ do Emitente

          If cAmbiente == [2]                                                            // Alteração para Homologação vigente a partir de 01/05/2011
             cXml+= XmlTag( "xNome" , "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL")
          Else
             cXml+= XmlTag( "xNome" , AllTrim(fRetiraAcento(cNomeEmit)))                 // Razão Social emitente
          Endif

          cXml+= XmlTag( "xFant" ,  CharRem("/;-:,\.(){}[] ", cFantasiaEmit))            // Nome Fantasia Emitente

          cXml+= "<enderEmit>"
                 cXml+= XmlTag( "xLgr"    , AllTrim(fRetiraAcento(cEnderecoEmit)))       // Endereço Emitente
                 cXml+= XmlTag( "nro"     , cNumeroEmit)                                 // Número do Endereco do Emitente
                 cXml+= XmlTag( "xBairro" , AllTrim(fRetiraAcento(cBairroEmit)))         // Bairro do Emitente
                 cXml+= XmlTag( "cMun"    , cCidadeIbgeEmit)                             // Código IBGE do emitente
                 cXml+= XmlTag( "xMun"    , AllTrim(fRetiraAcento(cCidadeEmit)))         // Cidade do Emitente
            cXml+= XmlTag( "UF"      , cUfEmit)                                     // UF do Emitente
            cXml+= XmlTag( "CEP"     , SoNumeros(cCepEmit))         // CEP do Emitente
            cXml+= XmlTag( "cPais"   , cPaisBacenEmit)                              // Código do País emitente
            cXml+= XmlTag( "xPais"   , cPaisEmit)                                   // País Emitente da NF
            cXml+= XmlTag( "fone"    , SoNumeros(cFoneEmit))        // Telefone do Emitente
          cXml+= "</enderEmit>"
         
          cXml+= XmlTag( "IE" , SoNumeros(cIEEmit))                      // Inscrição Estadual do Emitente

          If !Empty(cIMEmit)                                                             // Não obrigatório
             cXml+= XmlTag( "IM" , cIMEmit)                                              // Inscrição Municipal do Emitente
          Endif

          If !Empty(cCnaeEmit)                                                           // Não obrigatório
             cXml+= XmlTag( "CNAE" , cCnaeEmit)                                          // CNAE do Emitente
          Endif

          cXml+= XmlTag( "CRT" , cRegimeTribEmit)                                        // Códigos de Detalhamento do Regime e da Situação TABELA A – Código de Regime Tributário – CRT
                                                                                         // 1 – Simples Nacional
                                                                                         // 2 – Simples Nacional – excesso de sublimite da receita bruta
                                                                                         // 3 – Regime Normal NOTAS EXPLICATIVAS
   cXml+= "</emit>"                                                                      // Final da TAG Emitente
Return (Nil)

Static Procedure fCriaDestinatario(cXml, cCnpjCpfDest, cAmbiente, cNomeDest, cEnderecoDest, cNumeroDest, cBairroDest, cCidadeIbgeDest, cCidadeDest, cUfDest, cCepDest, cPaisBacenDest, cPaisDest, cFoneDest, cTipoIe, cIEDest, cEmail)
   If Empty(cXml)
      Return (Nil)
   Endif

   cXml+= "<dest>"
          If cUfDest == [EX]
             cXml+= "<idEstrangeiro></idEstrangeiro>"
          Else
             If cAmbiente == [1]
                If Len(SoNumeros(cCnpjCpfDest)) == 11 // Pessoa Física - Cpf
                   cXml+= XmlTag( "CPF"  , SoNumeros(cCnpjCpfDest))
           Else                                                  // Pessoa Jurídica - Cnpj
                   cXml+= XmlTag( "CNPJ" , SoNumeros(cCnpjCpfDest))
                Endif
             Endif
          Endif   

          If cAmbiente == [2]                                         // Alteração para Homologação vigente a partir de 01/05/2011
             cXml+= XmlTag( "CNPJ"  , [99999999000191])
             cXml+= XmlTag( "xNome" , [NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL])
          Else
             cXml+= XmlTag( "xNome" , AllTrim(fRetiraAcento(cNomeDest)))
          Endif

          cXml+= "<enderDest>"   
                 cXml+= XmlTag( "xLgr"    , AllTrim(fRetiraAcento(cEnderecoDest)))
                 cXml+= XmlTag( "nro"     , cNumeroDest)
                 cXml+= XmlTag( "xBairro" , AllTrim(fRetiraAcento(cBairroDest)))

                 If cUfDest == [EX]       // Importação/Exportação
                    cXml+= XmlTag( "cMun"  , [9999999])
                    cXml+= XmlTag( "xMun"  , [EXTERIOR])
                    cXml+= XmlTag( "UF"    , [EX])
                    cXml+= XmlTag( "cPais" , cPaisBacenDest)
                    cXml+= XmlTag( "xPais" , cPaisDest)
                 Else                         // Comércio Interno
                    cXml+= XmlTag( "cMun"  , cCidadeIbgeDest)
                    cXml+= XmlTag( "xMun"  , AllTrim(fRetiraAcento(cCidadeDest)))
                    cXml+= XmlTag( "UF"    , cUfDest)
                    cXml+= XmlTag( "CEP"   , SoNumeros(cCepDest))
                    cXml+= XmlTag( "cPais" , cPaisBacenDest)
                    cXml+= XmlTag( "xPais" , cPaisDest)

               If !Empty(SoNumeros(cFoneDest))
                cXml+= XmlTag( "fone" , AllTrim(SoNumeros(cFoneDest)))
                    Endif
                 Endif
          cXml+= "</enderDest>"

          If cAmbiente == [2]    // Ambiente de Homologação
        cXml+= XmlTag( "indIEDest" , [9])
     Else                // Ambiente de Produção
           cXml+= XmlTag( "indIEDest" , cTipoIe)            //   1 = Contribuinte ICMS (informar a IE do destinatário);
                                                              //   2 = Contribuinte isento de Inscrição no cadastro de Contribuintes do ICMS;
                                                              //   9 = Não Contribuinte, que pode ou não possuir Inscrição Estadual no Cadastro de Contribuintes do ICMS;
             If cUfDest == [EX]   // Importação/Exportação
                cXml+= "</IE>"
             Else
                cXml+= XmlTag( "IE" , SoNumeros(cIEDest))
             Endif
          Endif

          If !Empty(cEmail)
             cXml+= XmlTag( "email" , AllTrim(cEmail))
          Endif   
   cXml+= "</dest>"
Return (Nil)

Static Procedure fCriaTransportadora(cXml, cModFrete, cPlaca, cNomeTrans, cCnpjCpfTrans, cUfTrans, nQteTrans, cEspecie, cCfop, nPesoLiq, nPesoBru)
   If Empty(cXml)
      Return (Nil)
   Endif

   cXml+= "<transp>"
          cXml+= XmlTag( "modFrete" , cModFrete)

          If !Empty(CharRem("/;-:,\.(){}[] ", cPlaca))
         cXml+= "<transporta>"
                   If !Empty(cNomeTrans)
                        If Len(SoNumeros(cCnpjCpfTrans)) == 11 // Pessoa Física - Cpf
                           cXml+= XmlTag( "CPF"  , SoNumeros(cCnpjCpfTrans))
                     Else                                                   // Pessoa Juridica - Cnpj
                           cXml+= XmlTag( "CNPJ" , SoNumeros(cCnpjCpfTrans))
                        Endif
                        cXml+= XmlTag( "xNome" , AllTrim(fRetiraAcento(cNomeTrans)))
                Else   
              cXml+= XmlTag( "xNome" , [o Proprio])
                     Endif   
              cXml+= "</transporta>"

              cXml+= "<veicTransp>"
                     cXml+= XmlTag( "placa" , CharRem("/;-:,\.(){}[] ", cPlaca))
                     cXml+= XmlTag( "UF"    , cUfTrans)
              cXml+= "</veicTransp>"
          Endif   

          cXml+= "<vol>"           // Informações de Volumes
                 If !Empty(nQteTrans)
               cXml+= XmlTag( "qVol" , NumberXml(nQteTrans, 0))
                 Endif
                 
                 If !Empty(cEspecie)
          cXml+= XmlTag( "esp" , AllTrim(cEspecie))
                 Endif

                 // Remessa Para Industrialização
                 If SoNumeros(cCfop) $ [6901|5901|5915|6915] 
                    cXml+= "marca></marca>"
                 Else   
                    If !Empty(nQteTrans)
                       cXml+= XmlTag( "marca" , [PROPRIA])
                    Endif
                 Endif

                 If !Empty(nQteTrans)
                    cXml+= XmlTag( "nVol" , [S/N])
                 Endif

                 If !Empty(nPesoLiq)
                    cXml+= XmlTag( "pesoL" , NumberXml(nPesoLiq, 3))
                 Endif

                 If !Empty(nPesoBru)
                    cXml+= XmlTag( "pesoB" , NumberXml(nPesoBru, 3))
                 Endif
          cXml+= "</vol>"
   cXml+= "</transp>"
Return (Nil)

Static Procedure fCriaCobranca(cXml, aDupli)
   Local i

   If Empty(cXml)
      Return (Nil)
   Endif

   If Len(aDupli) > 0
      cXml+= "<cobr>"
             For i:= 1 to Len(aDupli)
                 cXml+= "<dup>"
                        cXml+= XmlTag( "nDup"  , NumberXml(aDupli[i, 1], 0))
                        cXml+= XmlTag( "dVenc" , DateXml(aDupli[i, 2]))
                        cXml+= XmlTag( "vDup"  , NumberXml(aDupli[i, 3], 2))
                 cXml+= "</dup>"
             Next i
      cXml+= "</cobr>"
   Endif   
Return (Nil)

Static Procedure fCriaInformacoes(cXml, lComplementar, nVIcmsSufDest, nVIcmsSufRemet, nVPis, nvCofins, cUfDest, cCodDest, cObs, aDadosExporta)
   If Empty(cXml)
      Return (Nil)
   Endif

   hb_Default( @lComplementar, .F. )
   hb_Default( @cObs, [])
   hb_Default( @aDadosExporta, {})

   cXml += "<infAdic>"
           If lComplementar // Informações DIFAL
              If nVIcmsSufDest > 0
                 cObs+= "DIFAL para UF destino R$ " + NumberXml(nVIcmsSufDest, 2) + hb_OsNewLine()
              EndIf

              If nVIcmsSufRemet > 0
                 cObs+= "DIFAL para UF Origem R$ " + NumberXml(nVIcmsSufRemet, 2) + hb_OsNewLine()
              EndIf   

              If nVPis > 0     // Destaque valor do PIS/COFINS
                 cObs+= "Valor de PIS para movimento R$ " + NumberXml(nVPis, 2) + hb_OsNewLine()
                 cObs+= "Valor de COFINS para movimento R$ " + NumberXml(nvCofins, 2) + hb_OsNewLine()
              EndIf
              If cUfDest # "EX" .and. !Empty(cCodDest)
          cObs+= "Cód:" + cCodDest + hb_OsNewLine()
              EndIf
           EndIf
           cObs := StrTran(cObs, hb_OsNewLine(), ";")
           cXml += XmlTag( "infAdFisco" , AllTrim(fRetiraAcento(cObs)))
   cXml += "</infAdic>"

   If Len(aDadosExporta) > 0                  // Exportação
      cXml += "<exporta>"
              cXml += XmlTag( "UFSaidaPais>" , aDadosExporta[1])
              cXml += XmlTag( "xLocExporta>" , aDadosExporta[2])
      cXml += "</exporta>"
   EndIf   
Return (Nil)

Static Function GetChaveAcesso(cNF, cCnpj, cUfEmit, cSerie)  // Manual cUf + AAMM + CNPJ + Mod + Serie + NrNota + cNF + cDV  - Marcelo de Paula 22/06/2016
   Local cKey:= cUfEmit                  /// no caso sp = 35
         cKey+= SubStr(Dtoc(date()), 9, 2) + SubStr(Dtoc(date()), 4, 2)
         cKey+= SoNumeros(cCnpj)
         cKey+= [55] + Padl(cSerie, 3, [0])
         cKey+= Padl(cNF, 9, [0])
         cKey+= [1]
         cKey+= Padl(cNF, 8, [0])
Return (cKey + fDv_nfe(cKey))

Static Function fDv_nfe(cVarchave) // Função para Calculo de Digito - Marcelo de Paula 22/06/2016
   Local nCont1:= Len(cVarchave) + 1, nCont2:= x_Cont:= 1, nSoma:= 0, cDigito:= [0]

   For x_Cont:= 1 to Len(cVarchave)
       nCont1-= 1
       nCont2+= 1

       If nCont2 == 10
          nCont2:= 2
       Endif
       nSoma+= Val(SubStr(cVarchave, nCont1, 1)) * nCont2
   Next
   If Mod(nSoma, 11) <= 1
      cDigito:= [0]
   Else
      cDigito:= AllTrim(Str(11 - Mod(nSoma, 11), 10))
   Endif
Return(cDigito)

********************* Retira Acentos e Letras de uma String ********************
Static Function fRetiraAcento(cStr)
   cStr:= StrTran(cStr, [á], [a])  ; cStr:= StrTran(cStr, [à], [a])  ; cStr:= StrTran(cStr, [â], [a])
   cStr:= StrTran(cStr, [ã], [a])  ; cStr:= StrTran(cStr, [Á], [A])  ; cStr:= StrTran(cStr, [À], [A])
   cStr:= StrTran(cStr, [Â], [A])  ; cStr:= StrTran(cStr, [Ã], [A])  ; cStr:= StrTran(cStr, [É], [E])
   cStr:= StrTran(cStr, [Ê], [E])  ; cStr:= StrTran(cStr, [é], [e])  ; cStr:= StrTran(cStr, [è], [e])
   cStr:= StrTran(cStr, [È], [e])  ; cStr:= StrTran(cStr, [ê], [e])  ; cStr:= StrTran(cStr, [í], [i])
   cStr:= StrTran(cStr, [ì], [i])  ; cStr:= StrTran(cStr, [Í], [I])  ; cStr:= StrTran(cStr, [Ì], [I])
   cStr:= StrTran(cStr, [õ], [o])  ; cStr:= StrTran(cStr, [ô], [o])  ; cStr:= StrTran(cStr, [ó], [o])
   cStr:= StrTran(cStr, [ò], [o])  ; cStr:= StrTran(cStr, [ö], [o])  ; cStr:= StrTran(cStr, [Ö], [O])
   cStr:= StrTran(cStr, [Ò], [O])  ; cStr:= StrTran(cStr, [Ó], [O])  ; cStr:= StrTran(cStr, [Ô], [O])
   cStr:= StrTran(cStr, [Õ], [O])  ; cStr:= StrTran(cStr, [ü], [u])  ; cStr:= StrTran(cStr, [ú], [u])
   cStr:= StrTran(cStr, [ù], [u])  ; cStr:= StrTran(cStr, [Ú], [U])  ; cStr:= StrTran(cStr, [Ù], [U])
   cStr:= StrTran(cStr, [Ü], [U])  ; cStr:= StrTran(cStr, [ç], [c])  ; cStr:= StrTran(cStr, [Ç], [C])
   cStr:= StrTran(cStr, [ÿ], [y])  ; cStr:= StrTran(cStr, [ñ], [n])  ; cStr:= StrTran(cStr, [Ñ], [N])
   cStr:= StrTran(cStr, [º], [o.]) ; cStr:= StrTran(cStr, [°], [o.]) ; cStr:= StrTran(cStr, [ª], [a.])
Return (cStr)
********************* Fim da Função Retira Acentos e Letras de uma String *******

FUNCTION XmlTag( cTag, cConteudo )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   LOCAL cTexto := ""

   hb_Default( @cConteudo, "" )
   cConteudo := AllTrim( cConteudo )
   IF Len( Trim( cConteudo ) ) = 0
      cTexto := [<]+ cTag + [/>]
   ELSE
      cConteudo := AllTrim( cConteudo )
      IF Len( cConteudo ) == 0
         cConteudo := " "
      ENDIF
      cTexto := cTexto + [<] + cTag + [>] + cConteudo + [</] + cTag + [>]
   ENDIF

   RETURN cTexto

FUNCTION DateTimeXml( dDate, cTime, cUF, lUTC )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   LOCAL cText, lHorarioVerao

   hb_Default( @dDate, Date() )
   hb_Default( @cTime, Time() )
   hb_Default( @cUF, "SP" )
   hb_Default( @lUTC, .T. )

   lHorarioVerao := ( dDate >= HorarioVeraoInicio( Year( dDate ) ) .AND. dDate <= HorarioVeraoTermino( Year( dDate - 1 ) ) )
   cText := Transform( Dtos( dDate ), "@R 9999-99-99" ) + "T" + cTime

   DO CASE
   CASE ! lUTC ; cText += "" // no UTC
   CASE cUF $ "AC"                                             ; cText += "-05:00"
   CASE cUF $ "MT,MS" .AND. lHorarioVerao                      ; cText += "-05:00"
   CASE cUF $ "DF,ES,GO,MG,PR,RJ,RS,SC,SP" .AND. lHorarioVerao ; cText += "-04:00"
   CASE cUF $ "AM,MT,MS,RO,RR"                                 ; cText += "-04:00"
   OTHERWISE                                                   ; cText += "-03:00"
   ENDCASE

   RETURN cText

FUNCTION HorarioVeraoInicio( iAno )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   LOCAL dPrimeiroDeOutubro, dPrimeiroDomingoDeOutubro, dTerceiroDomingoDeOutubro

   dPrimeiroDeOutubro := Stod( StrZero( iAno, 4 ) + "1001" )
   dPrimeiroDomingoDeOutubro := dPrimeiroDeOutubro + iif( Dow( dPrimeiroDeOutubro ) == DOW_DOMINGO, 0, ( 7 - Dow( dPrimeiroDeOutubro ) + 1 ) )
   dTerceiroDomingoDeOutubro := dPrimeiroDomingoDeOutubro + 14

   RETURN dTerceiroDomingoDeOutubro

FUNCTION DomingoDePascoa( iAno )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   LOCAL iA, iB, iC, iD, iE, iF, iG, iH, iI, iK, iL, iM, iMes, iDia

   iA := iAno % 19
   iB := Int( iAno / 100 )
   iC := iAno % 100
   iD := Int( iB / 4 )
   iE := iB % 4
   iF := Int( ( iB + 8 ) / 25 )
   iG := Int( ( iB - iF + 1 ) / 3 )
   iH := ( 19 * iA + iB - iD - iG + 15 ) % 30
   iI := Int( iC / 4 )
   iK := iC % 4
   iL := ( 32 + 2 * iE + 2 * iI - iH - iK ) % 7
   iM := Int( ( iA + 11 * iH + 22 * iL) / 451 )
   iMes := Int( ( iH + iL - 7 * iM + 114 ) / 31 )
   iDia := ( ( iH + iL - 7 * iM + 114 ) % 31 ) + 1

   RETURN Stod( StrZero( iAno, 4 ) + StrZero( iMes, 2 ) + StrZero( iDia, 2 ) )

FUNCTION TercaDeCarnaval( iAno )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   RETURN DomingoDePascoa( iAno ) - 47

FUNCTION HorarioVeraoTermino( iAno )  /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   LOCAL dPrimeiroDeFevereiro, dPrimeiroDomingoDeFevereiro, dTerceiroDomingoDeFevereiro

   dPrimeiroDeFevereiro := Stod( StrZero( iAno + 1, 4 ) + "0201" )
   dPrimeiroDomingoDeFevereiro := dPrimeiroDeFevereiro + iif( Dow( dPrimeiroDeFevereiro ) == DOW_DOMINGO, 0, ( 7 - Dow( dPrimeiroDeFevereiro ) + 1 ) )
   dTerceiroDomingoDeFevereiro := dPrimeiroDomingoDeFevereiro + 14
   IF dTerceiroDomingoDeFevereiro == TercaDeCarnaval( iAno + 1 ) - 2 /* nao pode ser domingo de carnaval */
      dTerceiroDomingoDeFevereiro += 7
   ENDIF

   RETURN dTerceiroDomingoDeFevereiro

FUNCTION NumberXml( nValue, nDecimals ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   hb_Default( @nDecimals, 0 )

   RETURN Ltrim( Str( nValue, 16, nDecimals ) )

FUNCTION DateXml( dDate ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar

   RETURN Transform( Dtos( dDate ), "@R 9999-99-99" )

FUNCTION SoNumeros( cTxt )/// esta função está em ze_xmlfun.prg - postei somente para funcionar

   LOCAL cSoNumeros := "", cChar

   FOR EACH cChar IN cTxt
      IF cChar $ "0123456789"
         cSoNumeros += cChar
      ENDIF
   NEXT

   RETURN cSoNumeros
malcarli
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 181
Data de registro: 20 Ago 2015 18:14
Cidade/Estado: marilia/sp
Curtiu: 81 vezes
Mens.Curtidas: 4 vezes

Uso da classesefaz

Mensagempor depaula.jau » 03 Out 2016 13:52

1 If cAmbiente == [2] // Alteração para Homologação vigente a partir de 01/05/2011
2 cXml+= XmlTag( "indFinal" , "1") // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
3 Else
4 cXml+= XmlTag( "indFinal" , "0") // Indica operação com consumidor final (0 - Não ; 1 - Consumidor Final)
5 Endif


Marcelo, essa parte ficou meio estranho, a comparação não pode ser a nível de Ambiente ... O Conteudo "1' ou "0" Deve ser definido pelos dados do contribuinte e sua diversas etapas, mas basicamente se for informado o CPF ou a ausência de IE na NF-e.
Avatar de usuário

depaula.jau
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 98
Data de registro: 15 Mai 2007 17:07
Cidade/Estado: JAU
Curtiu: 9 vezes
Mens.Curtidas: 14 vezes

Uso da classesefaz

Mensagempor malcarli » 03 Out 2016 13:57

Caro Marcelo, qual a sugestão para este trecho?
malcarli
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 181
Data de registro: 20 Ago 2015 18:14
Cidade/Estado: marilia/sp
Curtiu: 81 vezes
Mens.Curtidas: 4 vezes

Uso da classesefaz

Mensagempor depaula.jau » 03 Out 2016 14:28

Na sua Interface , você vai precisar identificar qual a situação dessa emissão... Se presencial ou se é apenas Consumidor, como tem na sistema do SEFAZ.

O Minha interface é assim conforme imagem anexo:

Você pode tentar automatizar ou fazer de outra forma... Mas precisa que o usuário identifique isso pra vc de alguma forma.
Anexos
Sem título.png
Avatar de usuário

depaula.jau
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 98
Data de registro: 15 Mai 2007 17:07
Cidade/Estado: JAU
Curtiu: 9 vezes
Mens.Curtidas: 14 vezes

Uso da classesefaz

Mensagempor depaula.jau » 03 Out 2016 14:31

O Resultado daquela TAG indFinal '0' ou '1' vai depender dessa checagem, e não pelo ambiente.
Avatar de usuário

depaula.jau
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 98
Data de registro: 15 Mai 2007 17:07
Cidade/Estado: JAU
Curtiu: 9 vezes
Mens.Curtidas: 14 vezes

Uso da classesefaz

Mensagempor MSDN » 16 Nov 2016 16:49

Estou usando o seguinte código :

function enviar_nfe()

         local cStatusAssinatura, cComando, oSefaz
         local cNfeXml := hb_MemoRead('c:\nfe\modelo_nfe.xml')
         local nome_certificado

         nome_certificado := CapicomEscolheCertificado()
         
         IF AssinaXml( @cNfeXml, nome_certificado ) != "OK"
            MsgExclamation( "Problema na assinatura " )
            RETURN .F.
         ENDIF
   
         oSefaz := SefazClass():New()
         oSefaz:cAmbiente := '2'
         oSefaz:cCertificado := nome_certificado
         oSefaz:cUF := 'PR'
         oSefaz:NfeLoteEnvia( cNfeXml, "1" )

         IF oSefaz:cStatus == '100'
            hb_MemoWrit( "autorizado.xml", oSefaz:cXmlAutorizado )
         ELSE
            MsgExclamation( "Erro " + oSefaz:cXmlProtocolo )
         ENDIF

         return(nil)
*-------------------------------------------------------------------------------
static function cria_xml()

   /*
      Descrição das informações que fazem parte do ID
      
      NFe            = obrigatório
      41             = código da uf (2)
      1606           = ano (2) e mês (2) da emissão da nota
      22903681000130 = cnpj do emitente (14)
      55             = modelo documento fiscal (2) NF-e
      001            = série documento fiscal (3)
      000000244      = número documento fiscal (9)
      1              = forma emissão NF-e (1) 1=normal
      97425062       = código numérico - randômico (8)
      ?              = dígito verificador (1)
   */      
   local cXmlDados := ''

   cXmlDados += [<NFe xmlns='http://www.portalfiscal.inf.br/nfe'>]   
   cXmlDados +=   [<infNFe Id='NFe41161100000000000000550000000000001352801336' versao='3.10'>]
   cXmlDados +=      [<ide>]   
   cXmlDados +=          XmlTag('cUF', '41')
   cXmlDados +=          XmlTag('cNF', '35280133')
   cXmlDados +=          XmlTag('natOp', 'venda')
   cXmlDados +=          XmlTag('indPag', '0')
   cXmlDados +=          XmlTag('mod', '55')
   cXmlDados +=          XmlTag('serie', '0')
   cXmlDados +=          XmlTag('nNF', '35280133')
   cXmlDados +=          XmlTag('dhEmi', '2016-11-10T00:00:00-03:00')
   cXmlDados +=          XmlTag('dhSaiEnt', '2016-11-10T10:37:00-03:00')   
   cXmlDados +=          XmlTag('tpNF', '1')
   cXmlDados +=          XmlTag('idDest', '1')
   cXmlDados +=          XmlTag('cMunFG', '4106902')
   cXmlDados +=          XmlTag('tpImp', '1')
   cXmlDados +=          XmlTag('tpEmis', '1')
   cXmlDados +=          XmlTag('cDV', '6')
   cXmlDados +=          XmlTag('tpAmb', '2')
   cXmlDados +=          XmlTag('finNFe', '1')
   cXmlDados +=          XmlTag('indFinal', '0')
   cXmlDados +=          XmlTag('indPres', '9')
   cXmlDados +=          XmlTag('procEmi', '0')
   cXmlDados +=          XmlTag('verProc', '0')
   cXmlDados +=      [</ide>]   
   cXmlDados +=      [<emit>]
   cXmlDados +=         XmlTag('CNPJ', '00000000000000')
   cXmlDados +=         XmlTag('xNome', 'EMPRESA TESTE LTDA')
   cXmlDados +=         [<enderEmit>]
   cXmlDados +=            XmlTag('xLgr', 'RUA XV NOVEMBRO')
   cXmlDados +=            XmlTag('nro', '100')
   cXmlDados +=            XmlTag('xBairro', 'CENTRO')
   cXmlDados +=            XmlTag('cMun', '0000000')
   cXmlDados +=            XmlTag('xMun', '__')
   cXmlDados +=            XmlTag('UF', 'PR')
   cXmlDados +=            XmlTag('CEP', '00000000')
   cXmlDados +=            XmlTag('cPais', '1058')
   cXmlDados +=            XmlTag('xPais', 'BRASIL')
   cXmlDados +=         [</enderEmit>]
   cXmlDados +=         XmlTag('IE', 'ISENTO')
//   cXmlDados +=         XmlTag('CNAE', '0000000')
   cXmlDados +=         XmlTag('CRT', '1')   
   cXmlDados +=      [</emit>]   
   cXmlDados +=      [<dest>]
   cXmlDados +=         XmlTag('CNPJ', '95357117000133')
   cXmlDados +=         XmlTag('xNome', 'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL')
   cXmlDados +=         [<enderDest>]
   cXmlDados +=            XmlTag('xLgr', 'R Amintas de Barros')
   cXmlDados +=            XmlTag('nro', '627')
   cXmlDados +=            XmlTag('xBairro', 'Centro')
   cXmlDados +=            XmlTag('cMun', '4106902')
   cXmlDados +=            XmlTag('xMun', 'Curitiba')
   cXmlDados +=            XmlTag('UF', 'PR')
   cXmlDados +=            XmlTag('CEP', '80060205')
   cXmlDados +=            XmlTag('cPais', '1058')
   cXmlDados +=            XmlTag('xPais', 'BRASIL')
   cXmlDados +=            XmlTag('fone', '4130273038')
   cXmlDados +=         [</enderDest>]
   cXmlDados +=         XmlTag('indIEDest', '1')
   cXmlDados +=         XmlTag('IE', '9062860763')   
   cXmlDados +=         XmlTag('email', 'financeiro@postar.org')   
   cXmlDados +=      [</dest>]   
   cXmlDados +=      [<det nItem="1">]
   cXmlDados +=         [<prod>]
   cXmlDados +=            XmlTag('cProd', '187011')
   cXmlDados +=            XmlTag('cEAN', '')
   cXmlDados +=            XmlTag('xProd', 'PAPEL A4 CHAMEX MULTI 75G C/500FLS')
   cXmlDados +=            XmlTag('NCM', '48025610')
   cXmlDados +=            XmlTag('CFOP', '6101')
   cXmlDados +=            XmlTag('uCom', 'un')
   cXmlDados +=            XmlTag('qCom', '50.0000')
   cXmlDados +=            XmlTag('vUnCom', '21.00000')
   cXmlDados +=            XmlTag('vProd', '1050.00')
   cXmlDados +=            XmlTag('cEANTrib', '')
   cXmlDados +=            XmlTag('uTrib', 'un')
   cXmlDados +=            XmlTag('qTrib', '50.0000')
   cXmlDados +=            XmlTag('vUnTrib', '21.00000')
   cXmlDados +=            XmlTag('indTot', '1')
   cXmlDados +=         [</prod>]
   cXmlDados +=         [<imposto>]
   cXmlDados +=            XmlTag('vTotTrib', '0.00')
   cXmlDados +=            [<ICMS>]
   cXmlDados +=               [<ICMSSN101>]
   cXmlDados +=                  XmlTag('orig', '0')
   cXmlDados +=                  XmlTag('CSOSN', '101')
   cXmlDados +=                  XmlTag('pCredSN', '0.0000')
   cXmlDados +=                  XmlTag('vCredICMSSN', '0.00')   
   cXmlDados +=               [</ICMSSN101>]
   cXmlDados +=            [</ICMS>]
   cXmlDados +=            [<PIS>]
   cXmlDados +=               [<PISNT>]
   cXmlDados +=                  XmlTag('CST', '07')
   cXmlDados +=               [</PISNT>]
   cXmlDados +=            [</PIS>]
   cXmlDados +=            [<COFINS>]
   cXmlDados +=               [<COFINSNT>]
   cXmlDados +=                  XmlTag('CST', '07')
   cXmlDados +=               [</COFINSNT>]
   cXmlDados +=            [</COFINS>]
   cXmlDados +=         [</imposto>]
   cXmlDados +=      [</det>]
   cXmlDados +=      [<total>]
   cXmlDados +=         [<ICMSTot>]
   cXmlDados +=            XmlTag('vBC', '0.00')
   cXmlDados +=            XmlTag('vICMS', '0.00')
   cXmlDados +=            XmlTag('vICMSDeson', '0.00')
   cXmlDados +=            XmlTag('vBCST', '0.00')   
   cXmlDados +=            XmlTag('vST', '0.00')   
   cXmlDados +=            XmlTag('vProd', '1050.00')   
   cXmlDados +=            XmlTag('vFrete', '0.00')   
   cXmlDados +=            XmlTag('vSeg', '0.00')   
   cXmlDados +=            XmlTag('vDesc', '0.00')   
   cXmlDados +=            XmlTag('vII', '0.00')   
   cXmlDados +=            XmlTag('vIPI', '0.00')   
   cXmlDados +=            XmlTag('vPIS', '0.00')   
   cXmlDados +=            XmlTag('vCOFINS', '0.00')   
   cXmlDados +=            XmlTag('vOutro', '0.00')   
   cXmlDados +=            XmlTag('vNF', '1050.00')   
   cXmlDados +=            XmlTag('vTotTrib', '0.00')                                    
   cXmlDados +=         [</ICMSTot>]
   cXmlDados +=      [</total>]   
   cXmlDados +=      [<transp>]
   cXmlDados +=         XmlTag('modFrete', '9')
   cXmlDados +=      [</transp>]
   cXmlDados +=      [<infAdic>]
   cXmlDados +=         XmlTag('infCpl', 'Criado a partir do Orcamento: 0001I - "DOCUMENTO EMITIDO POR ME OU EPP OPTANTE PELO SIMPLES NACIONAL";|II - "NAO GERA DIREITO A CREDITO FISCAL DE ICMS, DE ISS E DE IPI".')
   cXmlDados +=      [</infAdic>]
   cXmlDados +=      [</infNFe>]
   cXmlDados +=   [</NFe>]

   HB_MemoWrit('modelo_nfe.xml', cXmlDados)
   
   return(nil)


mas não consigo enviar o XML para a SEFAZ, alguém que já implementou usando a classe, o problema está no XML ou na função ?

Obrigado
MSDN
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 741
Data de registro: 28 Nov 2003 14:55
Cidade/Estado: CWB
Curtiu: 178 vezes
Mens.Curtidas: 123 vezes

Uso da classesefaz

Mensagempor malcarli » 16 Nov 2016 17:11

Boa tarde, não sei qual versão está usando da classe, mas aconselho usar a última do git.

uso para sp sem problemas, foi alterada a classe e o mestre José refez toda a classe tirando algumas funções

tente seu código assim (não é necessário assinar antes, pois foi juntada as funções com envio:

Caso não envie, verifique o seu xml, pois em sp em ambiente de homologação tem que ser cnpj + descrição dessa forma

Emitente
descrição = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"

destinatário
cnpj = 99999999000191
descrição = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"

outra coisa altere a data/ hora de emissão e saída para a data atual

function enviar_nfe()

   local  oSefaz
   local cNfeXml := hb_MemoRead('c:\nfe\modelo_nfe.xml')
   local nome_certificado

   nome_certificado := CapicomEscolheCertificado()
   
   oSefaz := SefazClass():New()
   oSefaz:cAmbiente := '2'
   oSefaz:cCertificado := nome_certificado
   oSefaz:cUF := 'PR'
   oSefaz:NfeLoteEnvia( cNfeXml, "1" )

   IF oSefaz:cStatus == '100'
    hb_MemoWrit( "autorizado.xml", oSefaz:cXmlAutorizado )
   ELSE
    MsgExclamation( "Erro " + oSefaz:cXmlProtocolo )
   ENDIF

   return(nil)
*-------------------------------------------------------------------------------
static function cria_xml()

/*
  Descrição das informações que fazem parte do ID
 
  NFe      = obrigatório
  41      = código da uf (2)
  1606     = ano (2) e mês (2) da emissão da nota
  22903681000130 = cnpj do emitente (14)
  55      = modelo documento fiscal (2) NF-e
  001      = série documento fiscal (3)
  000000244   = número documento fiscal (9)
  1       = forma emissão NF-e (1) 1=normal
  97425062   = código numérico - randômico (8)
  ?       = dígito verificador (1)
*/ 
local cXmlDados := ''

cXmlDados += [<NFe xmlns='http://www.portalfiscal.inf.br/nfe'>]
cXmlDados += [<infNFe Id='NFe41161100000000000000550000000000001352801336' versao='3.10'>]
cXmlDados +=  [<ide>]
cXmlDados +=    XmlTag('cUF', '41')
cXmlDados +=    XmlTag('cNF', '35280133')
cXmlDados +=    XmlTag('natOp', 'venda')
cXmlDados +=    XmlTag('indPag', '0')
cXmlDados +=    XmlTag('mod', '55')
cXmlDados +=    XmlTag('serie', '0')
cXmlDados +=    XmlTag('nNF', '35280133')
cXmlDados +=    XmlTag('dhEmi', '2016-11-10T00:00:00-03:00')
cXmlDados +=    XmlTag('dhSaiEnt', '2016-11-10T10:37:00-03:00')
cXmlDados +=    XmlTag('tpNF', '1')
cXmlDados +=    XmlTag('idDest', '1')
cXmlDados +=    XmlTag('cMunFG', '4106902')
cXmlDados +=    XmlTag('tpImp', '1')
cXmlDados +=    XmlTag('tpEmis', '1')
cXmlDados +=    XmlTag('cDV', '6')
cXmlDados +=    XmlTag('tpAmb', '2')
cXmlDados +=    XmlTag('finNFe', '1')
cXmlDados +=    XmlTag('indFinal', '0')
cXmlDados +=    XmlTag('indPres', '9')
cXmlDados +=    XmlTag('procEmi', '0')
cXmlDados +=    XmlTag('verProc', '0')
cXmlDados +=  [</ide>]
cXmlDados +=  [<emit>]
cXmlDados +=   XmlTag('CNPJ', '00000000000000')
cXmlDados +=   XmlTag('xNome', 'EMPRESA TESTE LTDA')
cXmlDados +=   [<enderEmit>]
cXmlDados +=    XmlTag('xLgr', 'RUA XV NOVEMBRO')
cXmlDados +=    XmlTag('nro', '100')
cXmlDados +=    XmlTag('xBairro', 'CENTRO')
cXmlDados +=    XmlTag('cMun', '0000000')
cXmlDados +=    XmlTag('xMun', '__')
cXmlDados +=    XmlTag('UF', 'PR')
cXmlDados +=    XmlTag('CEP', '00000000')
cXmlDados +=    XmlTag('cPais', '1058')
cXmlDados +=    XmlTag('xPais', 'BRASIL')
cXmlDados +=   [</enderEmit>]
cXmlDados +=   XmlTag('IE', 'ISENTO')
// cXmlDados +=   XmlTag('CNAE', '0000000')
cXmlDados +=   XmlTag('CRT', '1')
cXmlDados +=  [</emit>]
cXmlDados +=  [<dest>]
cXmlDados +=   XmlTag('CNPJ', '95357117000133')
cXmlDados +=   XmlTag('xNome', 'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL')
cXmlDados +=   [<enderDest>]
cXmlDados +=    XmlTag('xLgr', 'R Amintas de Barros')
cXmlDados +=    XmlTag('nro', '627')
cXmlDados +=    XmlTag('xBairro', 'Centro')
cXmlDados +=    XmlTag('cMun', '4106902')
cXmlDados +=    XmlTag('xMun', 'Curitiba')
cXmlDados +=    XmlTag('UF', 'PR')
cXmlDados +=    XmlTag('CEP', '80060205')
cXmlDados +=    XmlTag('cPais', '1058')
cXmlDados +=    XmlTag('xPais', 'BRASIL')
cXmlDados +=    XmlTag('fone', '4130273038')
cXmlDados +=   [</enderDest>]
cXmlDados +=   XmlTag('indIEDest', '1')
cXmlDados +=   XmlTag('IE', '9062860763')
cXmlDados +=   XmlTag('email', 'financeiro@postar.org')
cXmlDados +=  [</dest>]
cXmlDados +=  [<det nItem="1">]
cXmlDados +=   [<prod>]
cXmlDados +=    XmlTag('cProd', '187011')
cXmlDados +=    XmlTag('cEAN', '')
cXmlDados +=    XmlTag('xProd', 'PAPEL A4 CHAMEX MULTI 75G C/500FLS')
cXmlDados +=    XmlTag('NCM', '48025610')
cXmlDados +=    XmlTag('CFOP', '6101')
cXmlDados +=    XmlTag('uCom', 'un')
cXmlDados +=    XmlTag('qCom', '50.0000')
cXmlDados +=    XmlTag('vUnCom', '21.00000')
cXmlDados +=    XmlTag('vProd', '1050.00')
cXmlDados +=    XmlTag('cEANTrib', '')
cXmlDados +=    XmlTag('uTrib', 'un')
cXmlDados +=    XmlTag('qTrib', '50.0000')
cXmlDados +=    XmlTag('vUnTrib', '21.00000')
cXmlDados +=    XmlTag('indTot', '1')
cXmlDados +=   [</prod>]
cXmlDados +=   [<imposto>]
cXmlDados +=    XmlTag('vTotTrib', '0.00')
cXmlDados +=    [<ICMS>]
cXmlDados +=     [<ICMSSN101>]
cXmlDados +=      XmlTag('orig', '0')
cXmlDados +=      XmlTag('CSOSN', '101')
cXmlDados +=      XmlTag('pCredSN', '0.0000')
cXmlDados +=      XmlTag('vCredICMSSN', '0.00')
cXmlDados +=     [</ICMSSN101>]
cXmlDados +=    [</ICMS>]
cXmlDados +=    [<PIS>]
cXmlDados +=     [<PISNT>]
cXmlDados +=      XmlTag('CST', '07')
cXmlDados +=     [</PISNT>]
cXmlDados +=    [</PIS>]
cXmlDados +=    [<COFINS>]
cXmlDados +=     [<COFINSNT>]
cXmlDados +=      XmlTag('CST', '07')
cXmlDados +=     [</COFINSNT>]
cXmlDados +=    [</COFINS>]
cXmlDados +=   [</imposto>]
cXmlDados +=  [</det>]
cXmlDados +=  [<total>]
cXmlDados +=   [<ICMSTot>]
cXmlDados +=    XmlTag('vBC', '0.00')
cXmlDados +=    XmlTag('vICMS', '0.00')
cXmlDados +=    XmlTag('vICMSDeson', '0.00')
cXmlDados +=    XmlTag('vBCST', '0.00')
cXmlDados +=    XmlTag('vST', '0.00')
cXmlDados +=    XmlTag('vProd', '1050.00')
cXmlDados +=    XmlTag('vFrete', '0.00')
cXmlDados +=    XmlTag('vSeg', '0.00')
cXmlDados +=    XmlTag('vDesc', '0.00')
cXmlDados +=    XmlTag('vII', '0.00')
cXmlDados +=    XmlTag('vIPI', '0.00')
cXmlDados +=    XmlTag('vPIS', '0.00')
cXmlDados +=    XmlTag('vCOFINS', '0.00')
cXmlDados +=    XmlTag('vOutro', '0.00')
cXmlDados +=    XmlTag('vNF', '1050.00')
cXmlDados +=    XmlTag('vTotTrib', '0.00')           
cXmlDados +=   [</ICMSTot>]
cXmlDados +=  [</total>]
cXmlDados +=  [<transp>]
cXmlDados +=   XmlTag('modFrete', '9')
cXmlDados +=  [</transp>]
cXmlDados +=  [<infAdic>]
cXmlDados +=   XmlTag('infCpl', 'Criado a partir do Orcamento: 0001I - "DOCUMENTO EMITIDO POR ME OU EPP OPTANTE PELO SIMPLES NACIONAL";|II - "NAO GERA DIREITO A CREDITO FISCAL DE ICMS, DE ISS E DE IPI".')
cXmlDados +=  [</infAdic>]
cXmlDados +=  [</infNFe>]
cXmlDados += [</NFe>]

HB_MemoWrit('modelo_nfe.xml', cXmlDados)

return(nil)

malcarli
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 181
Data de registro: 20 Ago 2015 18:14
Cidade/Estado: marilia/sp
Curtiu: 81 vezes
Mens.Curtidas: 4 vezes

Uso da classesefaz

Mensagempor MSDN » 16 Nov 2016 17:25

Obrigado pelas dicas, vou fazer as alterações e testar, na sequência posto aqui o resultado.

Abraços
MSDN
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 741
Data de registro: 28 Nov 2003 14:55
Cidade/Estado: CWB
Curtiu: 178 vezes
Mens.Curtidas: 123 vezes

Uso da classesefaz

Mensagempor malcarli » 22 Dez 2016 13:10

Boa tarde, estou ajudando um colega a usar a classe, mas utilizando xharbour e mingui, Está dando erro nas classes, principalmente em BEGIN SEQUENCE. Tem alguma include ou lib que deva ser acrescentado para tornar possível a compilação no ambiente acima?

Complementando, segundo as informações do colega em xharbour a sintaxe do begin sequence é essa abaixo:
BEGIN SEQUENCE
<statements_Normal>

[ BREAK [<expression>] ]

[ RECOVER [USING <errorVar>]
   <statements_Error>
]
END[SEQUENCE]



ou seja no XHARBOUR nao aceita "WITH"
obg
malcarli
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 181
Data de registro: 20 Ago 2015 18:14
Cidade/Estado: marilia/sp
Curtiu: 81 vezes
Mens.Curtidas: 4 vezes

Anterior Próximo



Retornar para Projeto hbNFe

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro