Novidades/Como usar

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Novidades/Como usar

Mensagem por JoséQuintas »

No momento o uso está assim, considerando que sempre desse certo:

Autorizar NFE:

Código: Selecionar todos

oSefaz := SefazClass():New()
oSefaz:NfeLoteEnvia( cXml, "1", "SP", "nomecertificado", "1" )
hb_MemoWrit( "NFE-Autorizado.xml", oSefaz:cXmlAutorizado )
Autorizar CTE:

Código: Selecionar todos

oSefaz := SefazClass():New()
oSefaz:CteLoteEnvia( cXml, "1", "SP", "nomecertificado", "1" )
hb_MemoWrit( "CTE-Autorizado.xml", oSefaz:cXmlAutorizado )
Autorizar MDFE:

Código: Selecionar todos

oSefaz := SefazClass():New()
oSefaz:MDFeLoteEnvia( cXml, "1", "SP", "nomecertificado", "1" )
hb_MemoWrit( "MDFE-Autorizado.xml", oSefaz:cXmlAutorizado )
Carta de Correção NFE:

Código: Selecionar todos

oSefaz := SefazClass():New()
pSefaz:NfeEventoCce( "chave", cXml, "nomecertificado", "1" )
hb_MemoWrit( "NFE-Carta-Autorizado.xml", oSefz:cXmlAutorizado )
Cancelamento:

Código: Selecionar todos

oSefaz := SefazClass():New()
oSefaz:NfeEventoCancela( "chave", cXml, "nomecertificado", "1" )
hb_MemoWrit( "NFE-Cancelamento-Autorizado.xml", oSefaz:cXmlAutorizado )
E se precisar dos "arquivos temporários", ou configurar antes de começar, ou configuração detalhada, ou algo mais, só olhar o que tem disponível.

Código: Selecionar todos

CREATE CLASS SefazClass

   /* configuração */
   VAR    cProjeto       INIT WS_PROJETO_NFE          /* Modificada conforme método */
   VAR    cAmbiente      INIT WS_AMBIENTE_PRODUCAO
   VAR    cVersao        INIT "3.10"                  /* Modificada conforme método */
   VAR    cScan          INIT "N"                     /* Indicar se for SCAN/SVAN, ainda não testado */
   VAR    cUF            INIT "SP"                    /* Modificada conforme método */
   VAR    cCertificado   INIT ""                      /* Nome do certificado */
   VAR    cIndSinc       INIT INDSINC_RETORNA_RECIBO  /* Poucas UFs opção de protocolo */
   VAR    nTempoEspera   INIT 7                       /* intervalo entre envia lote e consulta recibo */
   VAR    cUFTimeZone    INIT "SP"                    /* Para DateTimeXml() Obrigatório definir UF default */
   /* XMLs de cada etapa */
   VAR    cXmlDados      INIT ""                      /* usado pra criar/complementar XML do documento */
   VAR    cXmlRetorno    INIT "Erro Desconhecido"     /* Retorno do webservice e/ou rotina */
   VAR    cXmlRecibo     INIT ""                      /* XML recibo (obtido no envio do lote) */
   VAR    cXmlProtocolo  INIT ""                      /* XML protocolo (obtido no consulta recibo e/ou envio de outros docs) */
   VAR    cXmlAutorizado INIT ""                      /* XML autorizado, caso tudo ocorra sem problemas */
   VAR    cStatus        INIT ""                      /* Status obtido da resposta final da Fazenda */
   VAR    cRecibo        INIT ""                      /* Número do recibo */
   VAR    cMotivo        INIT ""                      /* Motivo constante no Recibo */
   /* uso interno */
   VAR    cVersaoXml     INIT ""                      /* Apenas versão usada no XML */
   VAR    cServico       INIT ""                      /* Operação existente no webservice */
   VAR    cSoapAction    INIT ""                      /* Ação solicitada ao webservice */
   VAR    cWebService    INIT ""                      /* Endereço de webservice */
   VAR    cXmlSoap       INIT ""                      /* XML completo enviado pra Sefaz, incluindo informações do envelope */
Exemplo:

Código: Selecionar todos

oSefaz := SefazClass():New()
oSefaz:cCertificado := "nomecertificado"
oSefaz:cAmbiente := "1"
oSefaz:cUF := "SP"
oSefaz:NfeLoteEnvia( cXml )
IF oSefaz:cStatus $ "100,102"
   hb_MemoWrit( "XmlAutorizado.xml", oSefaz:cXmlAutorizado )
   MsgExclamation( iif( oSefaz:cStatus == "100", ""Nota autorizada", "Nota Denegada"  )
ELSE
   hb_MemoWrit( "XmlDados.xml", oSefaz:cXmlDados )
   hb_MemoWrit( "XmlRetorno.xml", oSefaz:cXmlRetorno )
   hb_MemoWrit( "XmlProtocolo.xml", oSefaz:cXmlProtocolo )
   hb_MwmoWrit( cServico", oSefaz:cServico )
   hb_MemoWrit( "WebService", oSefaz:cWebService )
   hb_MemoWrit( "SoapAction", oSefaz:cSoapAction )
   hb_MemoWrit( "XmlSoap", oSefaz:cXmlSoap )
   IF .NOT. Empty( oSefaz:cMotivo )
      MsgExclamation( "Problema " + oSefaz:cMotivo )
   ELSE
      MsgExclamation( "Erro " + oSefaz:cXmlRetorno )
   ENDIF
ENDIF
Não existe arquivo, cada um grava o que quiser, aonde quiser, com o nome que quiser, do jeito que quiser.
Para o aplicativo Harbour, para a classe, para a assinatura, e para a Fazenda, tudo é string.
Arquivo temporário serve apenas pra transferir entre aplicativos, ou para nós resolvermos algum problema tendo os detalhes do que aconteceu.

Se quiser alterar alguma coisa ou adicionar alguma coisa na classe: um exemplo com Herança, alterando o NfeLoteEnvia() pra gravar arquivos

Código: Selecionar todos

PROCEDURE Main
   
   oSefaz := MySefazClass():New()
   oSefaz:NfeLoteEnvia( "NumeroNota", cXml, "1", "SP", "nomecertificado", "1"  )

   RETURN

CREATE MySefazClass INHERIT SefazClass

   METHOD NfeLoteEnvia( cNumeroNota, ... )

   END CLASS

METHOD NfeLoteEnvia( cNumeroNota, ... ) CLASS Sefazclass
   ::SUPER:NfeLoteEnvia( ... ) // aqui chama o método original
   IF ::cStatus $ "100,102" 
      hb_MemoWrit( "NFE-" + cNumeroNota + "-Autorizado.xml", ::cXmlAutorizado ) 
   ELSE 
       hb_MemoWrit( "NFE-" + cNumeroNota + "-Dados.xml", ::cXmlDados ) 
       hb_MemoWrit( "NFE-" + cNumeroNota + "-Retorno.xml", ::cXmlRetorno ) 
       hb_MemoWrit( "NFE-" + cNumeroNota + "-Protocolo.xml", ::cXmlProtocolo ) 
       hb_MwmoWrit( "NFE-" + cNumeroNota + "-Servico", ::cServico ) 
       hb_MemoWrit( "NFE-" + cNumeroNota + "-WebService", ::cWebService ) 
       hb_MemoWrit( "NFE-" + cNumeroNota + "-SoapAction", ::cSoapAction ) 
       hb_MemoWrit( "NFE-" + cNumeroNota + "-Soap", ::cXmlSoap ) 
   ENDIF
   RETURN ::cXmlRetorno
Nota: editado depois pra corrigir exemplo de herança.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Novidades/Como usar

Mensagem por JoséQuintas »

Aconteceu uma coisa curiosa:

Colocando <?xml version="1.00"?> no MDFE autorizado, tanto o explorer quanto o emissor gratuito rejeitam o XML.
Bastou retirar isso, e tudo bem.

Fiquei confuso porque o mesmo não acontece com NFE.
Não sei se retiro isso de CTE e NFE autorizados.

Se alguém mais puder confirmar.
É a primeira coisa do XML.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
runner
Usuário Nível 2
Usuário Nível 2
Mensagens: 69
Registrado em: 03 Ago 2007 05:17
Localização: GUARULHOS-SP

Novidades/Como usar

Mensagem por runner »

Olá, José Quintas.

Confirmei nos meus xmls do CTe e realmente não tem está tag no inicio. O melhor é seguir o padrão.
Harbour 3.2 + Minigui Extended 16 + xDev
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Novidades/Como usar

Mensagem por JoséQuintas »

Qualquer coisa dá pra criar uma rotina em Harbour pra colocar/tirar isso, não é a parte mais difícil.

Por exemplo, o explorer mostra automaticamente isso se não existir.
Mas se existir, ele rejeita mostrar o XML.... rs

Parece que depende do XML.

É confirmar aonde rejeita ou não.
Qualquer coisa, basta uma rotina em Harbour pra acrescentar/tirar isso depois, pra fazer alteração em massa..
Isso não interfere na assinatura digital, em termos de assinatura digital, dá pra tirar/colocar que não tem problema.
A assinatura é referente ao bloco de informações do XML, e isso fica na parte de fora.

É mais pra já deixar resolvido, pra evitar algum inconveniente depois.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder