Começando com HBNFE

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

Começando com HBNFE

Mensagem por JoséQuintas »

Ainda aproveitando esse exemplo, pra efeito de curiosidade.
O que a classe faz com essa informação?

Código: Selecionar todos

   ::cXmlDados   +=    [<infInut Id="ID] + ::UFCodigo( ::cUF ) + Right( cAno, 2 ) + cCnpj + cMod + StrZero( Val( cSerie ), 3 )
   ::cXmlDados   +=    StrZero( Val( cNumIni ), 9 ) + StrZero( Val( cNumFim ), 9 ) + [">]
   ::cXmlDados   +=       XmlTag( "tpAmb", ::cAmbiente )
   ::cXmlDados   +=       XmlTag( "xServ", "INUTILIZAR" )
   ::cXmlDados   +=       XmlTag( "cUF", ::UFCodigo( ::cUF ) )
   ::cXmlDados   +=       XmlTag( "ano", cAno )
   ::cXmlDados   +=       XmlTag( "CNPJ", SoNumeros( cCnpj ) )
   ::cXmlDados   +=       XmlTag( "mod", cMod )
   ::cXmlDados   +=       XmlTag( "serie", cSerie )
   ::cXmlDados   +=       XmlTag( "nNFIni", cNumIni )
   ::cXmlDados   +=       XmlTag( "nNFFin", cNumFim )
   ::cXmlDados   +=       XmlTag( "xJust", cJustificativa )
   ::cXmlDados   +=    [</infInut>]
   ::cXmlDados   += [</inutNFe>]
   AssinaXml( @::cXmlDados, ::cCertificado )
   ::XmlSoapPost( ::cUF, ::cCertificado, WS_PROJETO_NFE )
É o fonte parcial, mas ok.
Ela apenas monta o XML de acordo com o manual da Fazenda.
Assina, e chama a rotina de comunicação

E depois?

Código: Selecionar todos

   ::cXmlSoap    := ""
   ::cXmlSoap    += [<?xml version="1.0"?>] 
   ::cXmlSoap    += [<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ]
   ::cXmlSoap    +=    [xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">]
   ::cXmlSoap    +=    [<soap12:Body>]
      ::cXmlSoap +=       [<] + cProjeto + [DadosMsg xmlns="] + ::cServico + [">]
   ::cXmlSoap    += ::cXmlDados
   ::cXmlSoap    +=    [</] + cProjeto + [DadosMsg>]
   ::cXmlSoap    +=    [</soap12:Body>]
   ::cXmlSoap    += [</soap12:Envelope>]
Ela coloca aquele XML dentro de outro XML.
Isso é chamado de envelope, segue as regras de SOAP, e do webservice do governo pra fazer a comunicacão.
Tem uns detalhes chatos, e não podem conter erro.

E depois?

Código: Selecionar todos

      oServer := win_OleCreateObject( "MSXML2.ServerXMLHTTP" )
      oServer:Open( "POST", ::cWebService, .F. )
      oServer:SetRequestHeader( "SOAPAction", cSoapAction )
      oServer:SetRequestHeader( "Content-Type", "application/soap+xml; charset=utf-8" )
      oServer:Send( ::cXmlSoap )
      oServer:WaitForResponse( 500 )
      cRetorno := oServer:ResponseBody
Ela manda o XML pra Fazenda e pega a resposta.
Usa o endereço de acordo com a UF, e a SOAP Action de acordo com a UF (deveria ser padrão, mas é "quase" padrão)

Resumindo:
Ela faz o que tem no manual da Sefaz, no manual do webservice da Sefaz, no manual de comunicação SOAP.
Só sobra pra quem usar fazer o XML de acordo com o manual.
Caso precise de manual...... Sefaz
Se eu não estiver disponível pra ajudar em algum problema.... é só olhar o manual da Sefaz
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

Começando com HBNFE

Mensagem por JoséQuintas »

De novo, pra reforçar:

Código: Selecionar todos

cXml := "<nfe>dddd</nfe>"
Isso acima é formato XML. Não precisa existir no disco pra ser formato XML.

Código: Selecionar todos

cXml := "<defora>" + cXml + "</defora>"
Isso acima é "colocar um xml dentro de outro".
É assim pra colocar dentro do envelope e enviar pra Fazenda.
É assim pra colocar a nota dentro de um lote e enviar pra Fazenda.
É assim pra gerar a nota autorizada.

Código: Selecionar todos

Assina( @cXml, "certificado" )
Isso acima é pegar o XML e assinar. Vai uma string por referência e ela mesma já retorna assinada.

É tudo simples. O que complica são os muitos detalhes envolvidos.
Por exemplo são 26 UFs, homologação e produção, normal e contingência, uns 10 endereços para cada operação, isso pode gerar uns 1.040 endereços de internet diferentes.
Isso significa que poderão existir 1.040 linhas de fonte, só para escolher um simples endereço de internet.
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

Começando com HBNFE

Mensagem por JoséQuintas »

Esta parte é pra quando vai ser criada uma coisa nova, que não existe na classe, ou pra conferir o que já existe.

Por exemplo, inutilização de CTE.

Abro lá o portal do CTE, serviços, relação de webservices
webservice00.png
Vou em São Paulo, que é onde estou, e porque facilita ver por ele.
webservice01.png
Note que é exatamente o endereço pra onde vai ser enviado o pedido de inutilização.
Abro esse endereço no Internet Explorer, Edge, tanto faz.
Já fica na tela qual vai ser a SOAPACTION
Em todo caso, é abrir o "service description".
webservice02.png
Só pesquisar "soapaction".
Ali o que vai ser usado na variável cServico (www.portalfiscal.inf.br....), sendo que a última palavra é o que vai em cSoapAction.
Isso é igual diretório do DOS, quando já esta posicionado no diretório/pasta, podemos colocar só o nome da subpasta.
Não lembro se testei deixar cServico em branco, e colocar completo em SoapAction, ou vice versa.
webservice03.png
A titulo de curiosidade, falamos disso um pouco antes:
Isso é a explicação do ENVELOPE, o XML do pedido de inutilização vai dentro dele.
Ou, em outras palavras, o XML que é transmitido na comunicação obece esse esquema, o XML de inutilização é apenas um dos blocos dentro dele.

Mais um diferencial pra curiosidade, mas neste caso estou usando NFE como exemplo.
Tem UF que não tem servidor pra uso, e pega carona com outro lugar.
E as UFs podem trabalhar com versões diferentes de webservice, o que pode alterar o conteúdo daquele ENVELOPE.
Como já disse por aqui: é padrão... mas não é padrão. Dependendo da UF, tem um detalhezinho diferente, que conforme vamos usando, vamos percebendo.
webservice04.png
Ok pra usar a classe não precisa saber de tudo isso, a classe costuma fazer tudo sozinha.
Mas se o governo inventar alguma coisa diferente, isso tudo ajuda a resolver qualquer problema.
Ou se a UF cismar de fazer diferente.... Nesse caso, pode ser necessário consultar o portal da UF, e não o portal nacional.
Vai ser a mesma coisa, mas no portal NFE da UF., e não no portal NFE nacional, por exemplo.

É tudo simples... é tudo padrão.... mas não muito padrão. É por isso que o fonte da classe fica grande, porque vai fazendo a escolha dos detalhes conforme serviço, conforme UF, conforme versão, etc.
E é tanto detalhe, que é difícil não deixar escapar algum errado.... rs... só quando alguém for usar aquela UF e aquele serviço é que o erro vai aparecer.
Mas seria só seguir este roteiro pra corrigir, SE FOR O CASO, e não depender de ninguém.
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/
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

Começando com HBNFE

Mensagem por MSDN »

Quintas, é de dar inveja (positiva) a clareza com que você explana os problemas e as soluções usando a programação. Não vejo isso em outros fóruns de Java, .Net, Delphi, etc. Você podia muito bem guardar tudo isso para si, para sua empresa e seus clientes, e ponto final, mas foi muito generoso em compartilhar com todos, e como se isso não bastasse, ainda teve a paciência de explicar vírgula por vírgula...olha, o dia que você desencarnar, vai pro céu e não faz nem curva !!!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Começando com HBNFE

Mensagem por JoséQuintas »

Sim, foi trabalhoso fazer do zero, e aprender tudo isso.
E vai continuar sendo trabalhoso pra manter.

Se eu tiver um problema, quem vai poder me ajudar? (Chapolin Colorado... rs)
Lógico, quem souber.
Ensinando pra todo mundo, todo mundo vai poder me ajudar.
E vai sobrar tempo pra aprender coisas novas, ensinar coisas novas, etc. etc.
No final todo mundo sai ganhando, a coisa é simples assim.

O Márcio (Runner) colaborou muito nestes últimos dias.
Se ele continuar no ritmo...

Pra não dizer que só falta a classe falar, podemos acrescentar isto:

Código: Selecionar todos

   oTalk := win_OleCreateObject( "SAPI.SPVoice" )
   oTalk:Speak( cText )
Com isso, até falar ela fala, pelo menos no Windows 10.

Até estranhei a data, 2013, olha o Jairo ajudando nisso do Windows falar, nem deve lembrar mais.
Por coincidência, por diferença de alguns dias, quase 3 anos "redondos".

https://pctoledo.org/forum/viewto ... eak#p84707

Naquela época, eu apanhando pra colocar acentuação no Harbour, e recebendo ajuda como sempre.
É uma boa amostra de que também aprendo no fórum, igual a todo mundo.
Ensinar acaba sendo só retribuição, do que passou e do que vém pela frente.
E ainda vém muita coisa por ai....
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
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Começando com HBNFE

Mensagem por filizola »

Obrigado pela explicação José Quintas.

Na verdade não soube explanar, quando disse "como usar" seria somente como sugere o acbr

valida(...)
assina(...)
envia(...)
consulta(...)
emite(...)
enviaemail(...)

mas vi que programa testes, têm os parâmetros necessários.
"Um passo a frente, e já não estará mais no mesmo lugar..."
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Começando com HBNFE

Mensagem por JoséQuintas »

Só não esquece que pra classe não existe arquivo.

Quando lá diz XML, é apenas o conteúdo.

Caso queira usar arquivo, é só fazer isto:

Código: Selecionar todos

cXml := MemoRead(  "seuarquivo.xml" )
oSefaz:NfeLoteEnvia( cXml ... )
É que de tanto sempre usar arquivos, definir padrão pra nomes, etc. etc., achou-se que não dava pra viver sem existir arquivo.
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