Página 1 de 2

Começando com HBNFE

Enviado: 30 Dez 2014 21:53
por Claudio Souza
Olá Pessoal,

Uso o xhabrour 1.1.0 puro sem libs de terceiro, e queria colocar a HBNFE no meu programa, já baixei a HBNFE, mas não consigo entender seu funcionamento, eu gero TXT para o Emissor Gratuito e Gero também já o XML, mas não vejo como chamar dentro da HBNFE a validação do meu XML pronto, tem como ??? posso repassar a conversão do txt para xml, independente de qualquer coisa. Muito obrigado pela atenção e desculpe o abusa

Claudio

Começando com HBNFE

Enviado: 03 Jan 2015 21:35
por Itamar M. Lins Jr.
Ola!
É isso que falei p/ o José Quintas, precisamos do feijão com arroz, exemplos.
Infelizmente, para entender o funcionamento é preciso olhar nos fontes.
O José Quintas explica excessivamente, na minha opinião, e não mostra a coisa funcionando.

Saudações,
Itamar M. Lins Jr.

Começando com HBNFE

Enviado: 08 Jan 2015 17:02
por athayde
Não deve estar atualizado, mas tinha um teste.prg, era fácil de ver como funcionava
como o status (parte retirada do teste.prg
oStatus := hbNFeStatus()
oStatus:ohbNFe := oNfe // Objeto hbNFe
oStatus:tpAmb := '1' // Normal
oStatus:cUF := cUF // UF
aRetorno := oStatus:execute()
oStatus := Nil

IF aRetorno['OK'] == .F.
? aRetorno['MsgErro']
ELSE
? aRetorno['tpAmb']
? aRetorno['verAplic']
? aRetorno['cStat']
? aRetorno['xMotivo']
? aRetorno['cUF']
? aRetorno['dhRecbto']
? aRetorno['tMed']
ENDIF

[]s
Fernando

Começando com HBNFE

Enviado: 11 Jan 2015 12:37
por sygecom
Olá Claudio,
Depois das alterações do José não testei mais a HBNFE que está no SVN, mas respondendo sua pergunta SIM, você pode usar a HBNFE para gerar xml, validar,assinar, transmitir e etc...
A classe hbNFeCreatortem o metodo geraXML(), faz a geração do XML,ASSINA E VALIDA se usar a propriedade ::lValida:=.T.

Começando com HBNFE

Enviado: 18 Jan 2015 12:47
por JoséQuintas
Simplificando:

Vai validar XML somente enquanto está ajustando sua rotina de geração.
Então valide direto no site do RS online, é só copiar/colar.


Quanto à hbnfe, realmente apesar das explicações parece que não entenderam.
Então vamos simplificar:

Esqueça a hbnfe, use só minha classe e nada mais.

Ela está no ZIP do projeto hbnfe.

Infelizmente, continua acontecendo aqui de escrever o texto'no fórum, e na hora de salvar se perde tudo, dizendo que preciso fazer login de novo.
Mas resumindo é isso acima.

Começando com HBNFE

Enviado: 18 Jan 2015 12:56
por JoséQuintas
Consulta: Como funciona a SEFAZ:

Envia o pedido de consulta
Verifica o retorno.

Como isso é feito na hbnfe original:
Primeiro precisa aprender a configurar a hbnfe.
Salva um arquivo com determinado nome, em determinada pasta que foi configurada de envio.
Depois fica vigiando a pasta configurada de retorno, até aparecer o arquivo de retorno e analisa o arquivo.
Algo como:

Código: Selecionar todos

hb_MemoWrit( "d:\envio\arquivo.xml", cXml )
DO WHILE .NOT. File( "d:\retorno\arquivoretorno.xml" )
     Inkey(2)
ENDDO
cRetorno := MemoRead( "d:\retorno\arquivoretorno.xml" )
Como isso é feito na classe que fiz:

Código: Selecionar todos

cRetorno := ConsultaNfe( cChave, cCertificado )
Por isso deixei de atualizar a hbnfe original, porque usar do jeito original só compilca.
E a classe já está pronta é só usar.

A parte modificada ficou no ZIP dentro do projeto, incluindo a classe.

O que comentei no outro post é justamente sobre isso.
Pra continuar alterações, a hbnfe original vai deixar de existir.
E uma coisa na página do projeto é sobre ela ser compatível com ACBR-NFE.
Essa mudança altera até mesmo a definição do projeto.
Por isso aguardei retorno antes de continuar.

Mas como os fontes são extraídos do meu aplicativo, continuo atualizando meu aplicativo.
Algumas rotinas até já funcionam com NFE 3.10.

Começando com HBNFE

Enviado: 19 Jan 2015 15:10
por oxent_jabah
José Quintas,

Você ainda pretende disponibilizar as atualizações, se sim, quando ?

Começando com HBNFE

Enviado: 19 Jan 2015 16:23
por Jairo Maia
Olá Pessoal,

Para descontrair: Parece que em se tratando de HBNF-e este assunto é uma Babel.
:))
JoséQuintas escreveu:Ela está no ZIP do projeto hbnfe.
Para baixar o projeto veja este post: hbNFe como baixar

Começando com HBNFE

Enviado: 19 Jan 2015 18:09
por Itamar M. Lins Jr.
Como eu disse, é muita explicação sem necessidade.
Eu uso o ACBRNFeMonitor.
Crio a NFE assim.

Código: Selecionar todos

...
cArq := CriaArqImpressao('entnfe.txt')
?? 'NFe.CriarEnviarNFe("[Identificacao]'
? 'NaturezaOperacao='+cNatureza
? 'Modelo=55'
? 'Serie=1'
? 'Codigo='     + ltrim(str(sa->numero,9))
? 'Numero='     + ltrim(str(sa->numero,9))
? 'Serie=1'
? 'Emissao='    + hb_dtoc(sa->emissao, 'DD/MM/YYYY')
? 'Saida='      + hb_dtoc(sa->emissao, 'DD/MM/YYYY')
? 'Tipo='       + cTipoES //0-Entrada 1-saida
? 'Finalidade=' + cFinalidade //NF-e normal = 1, NF-e complementar = 2, NF-e de ajuste = 3
? 'FormaPag='   + str(cFormPgto-1,1) //1' //0-avista 1-a prazo 2-outros
...
E por ai vai... cadê um exemplo igual a esse ?

Isso já cria e envia a NFe p/ SEFAZ o ACBRNFeMonitor pega o texto de nome "entnfe.txt" valida e envia, depois um outro comando imprime.
Ficar explicando como validar como criar XML etc... isso é para quem vai mexer no código do HBNFE, não vejo necessidade de ficar explicando isso no forum, escreve um "how to" manual p/ desenvolvedores e outro p/ os simples usuários mortais.

Veja que estamos criando um texto não um XML o ACBRNFeMonitor pega esse texto e cria o XML,PDF etc... o que precisar.
O José Quintas entrou no projeto, adicionou umas coisas, foi modificando e explicando cada coisa que estava fazendo... chegou a conclusão que não precisaria mais do código do hbnfe que a classe dele fazia tudo, desistiu zipou tudo agora complicou mais ainda, qual usar o arquivo ZIP dele ou a HBNFE ?

Saudações,
Itamar M. Lins Jr.

Começando com HBNFE

Enviado: 29 Jan 2015 23:46
por Claudio Souza
Obrigado, Fernando, Jose Quintasn Sygecom,

eu tenho pronto pro ACBR e pro Emissor Gratuito, mas não desisto facil, queria colocar essa HBNFE para funcionar no meu programa, depois faço um passo a passo para os posteriores, consegui gerar a LIB gerei com nome NFE.LIB, consegui selecionar o Certificado CAPICON, mas quando tento fazer validação ele dá esse erro abaixo, vou postar uma rotina que converte secamente um TXT compativel com emissor gratuito para XML, mas ná hora de validar dá o erro abaixo, abaixo do erro está o teste.ini uso o xharbour 1.2.1 windows8.1 64, xharbour puro sem lib gráfica por enquanto, como faço para postar a conversão do txt para xml ? em um post aqui mesmo ou criando um tópico ?

TOLEAUTOX:NEW : 96 in Module: W32OLE.PRG
XHB_CREATEOBJECT : 27 in Module: W32OLE.PRG
HBNFEVALIDA:EXECUTE : 75 in Module: hbNFeValida.prg
GERA_TXT_XML : 5,511 in Module: IVENT.PRG
GERANFE : 5,087 in Module: IVENT.PRG
MENU1 : 465 in Module: IVENT.PRG
PRINCIPAL : 352 in Module: IVENT.PRG
MAIN : 324 in Module: IVENT.PRG


############################## Video Screen Dump ##############################

+--------------------------------------------------------------------------------+
| Placa e Estado Veiculo [ ] [ ] |
| <E>ntrada ou <S>aida |
| 0 - Simples | 1 - Normal | [0] |
| I.E. do Substituto Tributario [ ] |
| Natureza da Operacao [VENDA FORA DO ESTADO ] |
| CFOP (codigo fiscal de Operacoes [6102 ] |
| Data da Nota Fiscal [29/01/2015] Data Saida [29/01/2015] |
| Aliquota Icms [ 0.00] Aliquota Ipi [ 0.00] |
| Aliquota Pis [ 0.00] |
| Aliquota Cofins [ 0.00] |
| Quanto porcento [ 0.00 %] |
|ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿|
|³ Quantidade volumes [ 2] ³|
|ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ|
|Error TOleAutoX/65535 : TOLEAUTOX:NEW Arguments: ( [ 1] = Type: C Val: MSXML2.D|
|OMDocument.5.0 [ 2] = Type: U [ 3] = Type: O Val: { TOLEAUTOX Object }) |
| |
|Error at ...: TOLEAUTOX:NEW(96) in Module: W32OLE.PRG |
|Called from : XHB_CREATEOBJECT(27) in Module: W32OLE.PRG |
|Called from : HBNFEVALIDA:EXECUTE(75) in Module: hbNFeValida.prg |
|Called from : GERA_TXT_XML(5511) in Module: IVENT.PRG |
|Called from : GERANFE(5087) in Module: IVENT.PRG |
|Called from : MENU1(465) in Module: IVENT.PRG |
|Called from : PRINCIPAL(352) in Module: IVENT.PRG |
|Called from : MAIN(324) in Module: IVENT.PRG |
+--------------------------------------------------------------------------------+

Começando com HBNFE

Enviado: 29 Jan 2015 23:51
por Claudio Souza
COLOCANDO teste.ini

[Principais]
cPastaSchemas=Schemas
cSerialCert=637FD80438F88D11
cUFWS=29
tpAmb=1
versaoDados=2.00
cUF=29
cMun=291080
tpImp=1
versaoSistema=2.00

cCertPFX=certificado_maxi.pfx
cCertFilePub=pubkey_maxi.pem
cCertFileKey=privkey_maxi.pem
cCertPass=


[Envio]
cXMLFileAssinado=\cred\NFE\NF_00001.XML
idLote=2
tpEmis=1

[Retorno]
nRecibo=351000053163933

[Consulta]
cChaveNFe=35110713514106000155550010000000341000000344

[Cadastro]

[Assinatura]
cXMLFileSemAssinatura=\cred\NFE\NF_00001_ASS.XML

[Cancelamento]
cChaveNfeCanc=\cred\NFE\NF_00001.XML
xJustificativa=teste 123456 bla bla

[Danfe]
cXMLFileDanfe=\cred\NFE\NF_00001.XML

[CCe]

[IniToXML]

[Email]

Começando com HBNFE

Enviado: 12 Out 2016 15:32
por filizola
Boa tarde, não existe um "como usar" do projeto hbnfe ?

assim como o acbr ?

Começando com HBNFE

Enviado: 12 Out 2016 20:40
por JoséQuintas
A coisa ficou tão simples, que o pessoal ainda não acostumou.
Agora está um pouco mais simples que no ano passado.

É XML. Não adianta vir com TXT que não aceita, é XML, manual do governo.

olhando na classe

Código: Selecionar todos

   METHOD NFeLoteEnvia( cXml, cLote, cUF, cCertificado, cAmbiente, cIndSinc )
Qual o manual para isso?

Em cXml colocar o XML
em cLote colocar o número do lote
em cUF colocar a UF
em cCertificado colocar o certificado
em cAmbiente colocar o ambiente
cIndSinc deixa pra lá, não é toda UF que aceita, mais fácil tratar tudo igual e não usar

Como usar: ué é colocar isso ai.

E o que mais?

Novamente olhando a classe:

Código: Selecionar todos

   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 */
Então como fica:
Considerando tudo certo logo de primeira

Código: Selecionar todos

   AssinaXml( @cXml, "nomecertificado" )
   oSefaz := SefazClass():New()
   oSefaz:NfeLoteEnvia( cXml, "1", "SP", "nomecertificado", "1" )
   hb_MemoWrit( "xmlautorizado.xml", oSefaz:cXmlAutorizado )
Se precisar acompanhar, quiser ver arquivos intermediários, ou tirar mais proveito:

Código: Selecionar todos

IF oSefaz:cStatus != "100"
   ? "Nota não foi autorizada, verifique XMLs intermediários"
   hb_MemoWrit( "XmlDados.xml", oSefaz:cXmlDados )
   hb_MemoWrit( "xmlRecibo.xml", oSefaz:cXmlRecibo )
   hb_MemoWrit(  "xmlprotocolo.xml", oSefaz:cXmlProtocolo )
ENDIF
No ano passado, isso não era tão automático, mas era parecido.

Por falar nisso, já que está tudo automático, está na hora de assinar automático também.

Para as demais operações é exatamente a mesma coisa.
É olhar o nome e os parâmetros, e usar.

O que confundiu muito foi: NÃO EXISTE ARQUIVO, NÃO PRECISA DE ARQUIVO, Cada um grava o que quiser/precisar.

O que é transmitido: é um texto que vai em formato XML - TEXTO, não arquivo

O que é recebido: é um texto que volta em formato XML - TEXTO, não arquivo

O que precisa configurar: Se não tem arquivo, não tem diretório, é tudo passado por parâmetro... vai configurar o que?

O que precisa instalar pra usar a classe:
O mesmo que o ACBR usa: CAPICOM, MSXML5 e Certificado

CAPICOM é da Microsoft, só baixar da Microsoft
MSXML5 é da Microsoft, mas... justo essa versão que é a única que trata assinatura, não vém no Windows.
Certificado - além de ser usado pra assinar, também é usado na comunicação. Não adianta tentar sem certificado que não dá.

Porque fora da hbnfe.
A primeira coisa na hbnfe é configurar muita coisa
Apagar hbnfe e substituir, apagaria coisas úteis a serem aproveitadas
Deixar junto, muitos fontes não utilizados que complicariam entender tudo
Se apagar complica, deixar junto complica, só restou a opção de fazer separado.

A classe segue o governo.
O governo quer um XML, você vai gerar o XML do jeito que o governo quer, do jeito que o governo colocou no manual.
Fez pra trabalhar com a classe, fez pra trabalhar com o governo, e fez pra trabalhar com qualquer componente pra nota fiscal eletrônica.
Qualquer coisa diferente disso, é ficar preso a algum componente, com o risco de ficar na mão.

A classe é apenas um serviço de correio, entrega na Fazenda e pega a resposta.

TXT era coisa do emissor do governo, que não existe mais, apenas um formato pra não ter que aprender XML.
Já são OITO ANOS de xml. Ele veio pra ficar, se não aprendeu, está na hora de aprender, é mais fácil do que parece.

Começando com HBNFE

Enviado: 12 Out 2016 20:59
por JoséQuintas
Manual pra tudo, parece não ter sentido.

Código: Selecionar todos

   METHOD CTeLoteEnvia( cXml, cLote, cUF, cCertificado, cAmbiente )
   METHOD CTeConsultaRecibo( cRecibo, cUF, cCertificado, cAmbiente )
   METHOD CTeGeraAutorizado( cXmlAssinado, cXmlProtocolo )
   METHOD CTeStatusServico( cUF, cCertificado, cAmbiente )
   METHOD CTeConsultaProtocolo( cChave, cCertificado, cAmbiente )
   METHOD CTeEventoCarta( cChave, nSequencia, aAlteracoes, cCertificado, cAmbiente )

   METHOD MDFeLoteEnvia( cXml, cLote, cUF, cCertificado, cAmbiente )
   METHOD MDFeConsultaRecibo( cRecibo, cUF, cCertificado, cAmbiente )
   METHOD MDFeGeraAutorizado( cXmlAssinado, cXmlProtocolo )
   METHOD MDFeStatusServico( cUF, cCertificado, cAmbiente )
   METHOD MDFeConsultaProtocolo( cChave, cCertificado, cAmbiente )
   METHOD MDFeDistribuicaoDFe( cCnpj, cUltNSU, cNSU, cUF, cCertificado, cAmbiente )

   METHOD NFeInutiliza( cAno, cCnpj, cMod, cSerie, cNumIni, cNumFim, cJustificativa, cUF, cCertificado, cAmbiente )
   METHOD NFeLoteEnvia( cXml, cLote, cUF, cCertificado, cAmbiente, cIndSinc )
   METHOD NFeConsultaRecibo( cRecibo, cUF, cCertificado, cAmbiente )
   METHOD NFeGeraAutorizado( cXmlAssinado, cXmlProtocolo )
   METHOD NFeStatusServico( cUF, cCertificado, cAmbiente )
   METHOD NFeConsultaProtocolo( cChave, cCertificado, cAmbiente )
   METHOD NFeEventoEnvia( cChave, cXml, cCertificado, cAmbiente )
   METHOD NFeGeraEventoAutorizado( cXmlAssinado, cXmlProtocolo )
   METHOD NFeEventoCarta( cChave, nSequencia, cTexto, cCertificado, cAmbiente )
   METHOD NFeEventoCancela( cChave, nSequencia, nProt, xJust, cCertificado, cAmbiente )
   METHOD NFeEventoNaoRealizada( cChave, nSequencia, xJust, cCertificado, cAmbiente )
   METHOD NFeConsultaCadastro( cCnpj, cUF, cCertificado, cAmbiente )
   METHOD NFeConsultaDest( cCnpj, cUltNsu, cIndNFe, cIndEmi, cUf, cCertificado, cAmbiente )
   METHOD NFeDistribuicaoDFe( cCnpj, cUltNSU, cNSU, cUF, cCertificado, cAmbiente )

Código: Selecionar todos

   METHOD NFeInutiliza( cAno, cCnpj, cMod, cSerie, cNumIni, cNumFim, cJustificativa, cUF, cCertificado, cAmbiente )
O que é tudo isso?
Vamos ver o que diz o manual da Fazenda, pra inutilização.
manualsefaz.png
Porque destaquei a coluna tamanho, e o local que indica 15-255

Isso significa que a justificativa precisa ter de 15 a 255 caracteres, não pode ser menos nem mais que isso.
Não é a classe que impede isso, é a Fazenda.
Não precisa manual da classe pra isso, a classe apenas envia, precisa olhar o manual da Fazenda.

Começando com HBNFE

Enviado: 12 Out 2016 21:17
por JoséQuintas
Aproveitando.... Repare que até parece a estrutura de um DBF, junto com a forma de preencher.

Tipo: ( N ) Numérico, ( C ) Caractere
Ocorrência: 1-1, significa que tem que existir pelo menos 1 desse, é obrigatório. 0-1 significa que é opcional, não precisa ter.
Tamanho: 1-2V2, significa de 1 a 2 inteiros, a virgula, e 2 decimais

Modelo: N, 1-1, 2, modelo do documento ( 55 ou 65) -> é obrigatório, precisa ter 2 dígitos, vai ser preenchido com 55 ou 65. Como na classe esta cMod, começando com "C", significa que vai receber como caractere.

Se facilitar, depois altero pra receber como numérico igual ao manual.
Se for o caso de deixar compatível, pra não atrapalhar quem já usa a classe e deixar igual ao manual, tá fácil alterar na classe:

Código: Selecionar todos

// se deixar caractere
cMod := iif( ValType( cMod ) == "N", StrZero( cMod, 2 ), cMod )
// se alterar pra numérico
nMod := iif( ValType( nMod ) == "C", Val( nMod ), nMod )
Isso é dentro da classe. Caso eu altere isso, não vai fazer diferença pra quem já estiver usando, porque vai aceitar como numérico ou caractere.

Nota: isso mostra como seria pra montar o XML. No caso desse método específico, basta informar os parâmetros, então é usada apenas uma parte do que está descrito no manual, mas pelo nome utilizado, está fácil de relacionar os campos da classe com os campos do manual.