Página 1 de 1

Versão 3.10

Enviado: 17 Mar 2015 12:15
por ciacpd
Desde o inicio do Mês fazendo adaptações na hbnfe baixei a ultima versão e compreendi o que o amigo José Quintas queria dizer quando falou que ninguém deveria estar usando esta classe.
O primeiro teste Status do Servidor, a versão antiga tudo ok na que está no site
cSOAPAction := 'http://www.portalfiscal.inf.br/nfe/wsdl ... onsultaNF2' o correto seria
cSOAPAction := 'http://www.portalfiscal.inf.br/nfe/wsdl ... ServicoNF2'

Na primeira versão 2 dias de testes e tudo OK
Agora se faz necessário maior cuidado.

Daniel Segura

Versão 3.10

Enviado: 17 Mar 2015 19:08
por JoséQuintas
Não entendi o que seria a antiga, e a do site.
Ou se é a hbnfe ou a classe SpedSefazClass.

Versão 3.10

Enviado: 17 Mar 2015 19:24
por ciacpd
José a Antiga é a primeira verão disponibilizada, e a do site é a versão atual da hbnfe via svn.

Versão 3.10

Enviado: 27 Mar 2015 12:41
por JoséQuintas
Mas se está ajudando a antiga, chegou a olhar a classe? Não é mais fácil?

Sobre ninguém usando é só verificar aqui, que não houve nenhuma pergunta sobre ela.
Se ninguém pergunta, é porque ninguém usa e nem vai usar.

Semana passada eu fiz uma cirurgia, e como o corte foi perto da barriga, não dava pra ficar posicionado na frente do computador.

Agora melhorei, mas estou aproveitando a troca pra NFE 3.10 pra instalar MySql nos clientes.

Versão 3.10

Enviado: 27 Mar 2015 22:51
por Itamar M. Lins Jr.
Melhoras ai. SAÚDE!
Eu tenho interesse em usar esta classe. Eu não tenho tempo livre para testar, com um passo a passo se tem, ajudaria.

Alias é tanta coisa boa que estão criando e estou aprendendo e falta tempo p/ reescrever os código velhos.

Agora mudei algumas coisas p/ usar os DBF´s temporários tudo na memoria RAM "mem:" ficou muito bom.

Saudações,
Itamar M. Lins Jr.

Versão 3.10

Enviado: 28 Mar 2015 12:48
por JoséQuintas
Como disse sempre, no final equivale a "matar" a hbnfe, porque modifica tudo.
Perdem-se algumas mordomias existentes na hbnfe, mas ganha-se facilidade e controle total.

Não é LIB, não é DLL, é apenas linqueditar com os fontes.

Infelizmente perdemos duas vantagens que existiam antes:
- A 2.0 está pronta pra uso, mas já deixou de ser interessante porque só funciona por mais 2 dias
- A 3.10 já vira obrigatória em dois dias, o que torna arriscado a considerar como única opção pra 01/04

Então só resta testar.

Versão 3.10

Enviado: 29 Mar 2015 21:47
por ciacpd
José,
Tenha uma boa recuperação.

Aproveitei a classe exatamente como está no site, fiz os testes e onde não passava alterei mas não usei ainda a sua classe por falta de tempo.

Abaixo o que o usuário final vai usar para consultar uma nf-e.

Código: Selecionar todos

function nfe_consulta_hbnfe(f_cFileXmlName)
         private oNfe, oDanfe, aRetorno , oFuncoes

         oNfe                := hbNfe()
         Seta_Schemas_Nfe(oNfe) ; Seta_Pastas_Nfe(oNfe) ; Seta_Email_Nfe(oNfe)

         mensagem("Consultando NF-e: "+f_cFileXmlName)
         
         oConsulta           := hbNFeConsulta()
         oConsulta:ohbNFe    := oNfe // Objeto hbNFe
         oConsulta:cNFeFile  := f_cFileXmlName // Chave ou pode ser um arquivo xml com o parametro cNFeFile
         aRetorno            := oConsulta:execute()
         
         cChNFe              := oConsulta:cChaveNFe
         
         oConsulta           := Nil
         
         mensagem("")

         IF aRetorno['OK'] == .F.
            msginfo( aRetorno['MsgErro'] , "Falha na consulta da NFe.")
            return .f.
         ELSE
            msginfo( "Retorno: "         + HB_OEMTOANSI( aRetorno['xMotivo'] ) + CRLF +;
                     "Chave da Nota: "   + cChNFe                              + CRLF +;
                     "Nota recebida em:" + aRetorno['dhRecbto']                + CRLF +;
                     "Nº do Protocolo:"  + aRetorno['nProt']                   + CRLF +;
                     "Digito da Nota:"   + aRetorno['digVal'], "Resultado da Consulta.")
         ENDIF
        
return .t.
// -------------------------------------------------------------------------- //

Versão 3.10

Enviado: 30 Mar 2015 07:40
por JoséQuintas
Serve como exemplo pra mostrar mudança:

Código: Selecionar todos

         Scroll( 8, 0, MaxRow(), MaxCol(), 0 )
         @ 8, 1 GET cChave PICTURE "@R 99-99/99-99.999.999/9999-99.99.999.999999999.9.99999999.9"
         READ
         IF LastKey() == K_ESC
            EXIT
         ENDIF
         oSefaz := SefazClass():New()
         oSefaz:NfeConsulta( cChave )
         ? oSefaz:cXmlSoap
         ? oSefaz:cXmlRetorno
Não precisou mais pastas temporárias, nem arquivo temporário, é comunicação direta com a Fazenda.
Essa a é parte que mencionei que ganha-se controle total.

A parte que falei que perde-se mordomias, é até relativo.
Uma vez com o XML de retorno, verifica a informação direto no XML.

Considero vantagem o fato de estar mexendo diretamente com arquivos do projeto.
Não vai estar aprendendo detalhes de uma classe, e sim do projeto.

Uma opção pra analisar o retorno, usando função que está na classe, seria esta:

Código: Selecionar todos

IF XmlNode( oSefaz:cXmlRetorno, "status" ) != "101"
   ? "Nota não foi autorizada"
ENDIF
oSefaz:cXmlSoap é o XML que foi enviado pra Fazenda, serve pra verificar bugs, controle total
oSefaz:cRetorno é exatamente o XML retornado pela Sefaz, controle total

No projeto original da Sefaz não existe arquivo temporário, não existe arquivo "não temporário", o único arquivo é o XML final de distribuição.
Pra brincar com o cérebro, e é sério: pra validar o XML também não precisa de um arquivo XML.

Código: Selecionar todos

cXml := "<xml></xml>"
Isso acima é um XML. Não precisa existir "arquivo.xml".
Se for validar, valida-se o texto. (eu mesmo não uso validação, já que gerando pelo aplicativo, considera-se correto).

Acho que o pessoal ficou tão acostumado em usar arquivos temporários, XMLs em disco, configurar pastas e outras coisas mais, que a simplicidade desta classe confundiu.

Não é assim, é apenas pra efeito didático.
Imagine a comunicação com a Fazenda como algo assim:

Código: Selecionar todos

cUrl := "http://www.fazenda.sp.gov.br/" + "emissaonfe/" + "entregaxml/" + cXml
cResposta := RepostaEndereco( cUrl )
O que altera entre cada coisa são os parâmetros e o xml.
Alterar de uma versão pra outra, é questão de atualizar esses parâmetros.

Por isso sempre insisti na classe, e por isso disse que não tem nada a ver com o projeto original.
Passaremos a conversar sobre quais os parâmetros corretos, e não sobre mudar fontes da classe.
O que cada método da classe faz é apenas colocar os parâmetros corretos no endereço.
Então é controle total, sem as complicações da hbnfe.
E se faltar alguma mordomia/facilidade, é só criar função, como fiz usando XmlNode().