Clipper On Line • Ver Tópico - Começando com HBNFE

Começando com HBNFE

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

Moderador: Moderadores

 

Começando com HBNFE

Mensagempor JoséQuintas » 12 Out 2016 21:41

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

   ::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?

   ::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?

      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, 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Começando com HBNFE

Mensagempor JoséQuintas » 12 Out 2016 22:13

De novo, pra reforçar:

cXml := "<nfe>dddd</nfe>"


Isso acima é formato XML. Não precisa existir no disco pra ser formato XML.

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.

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, 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Começando com HBNFE

Mensagempor JoséQuintas » 13 Out 2016 22:22

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, 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Começando com HBNFE

Mensagempor MSDN » 14 Out 2016 15:37

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 !!!
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

Começando com HBNFE

Mensagempor JoséQuintas » 14 Out 2016 18:54

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:

   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".

http://www.pctoledo.com.br/forum/viewtopic.php?f=4&t=14500&p=84707&hilit=speak#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, 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Começando com HBNFE

Mensagempor filizola » 14 Out 2016 19:50

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 de usuário

filizola
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 412
Data de registro: 19 Ago 2003 20:10
Cidade/Estado: Belo Horizonte/MG
Curtiu: 5 vezes
Mens.Curtidas: 6 vezes

Começando com HBNFE

Mensagempor JoséQuintas » 14 Out 2016 20:44

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:

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, 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Anterior



Retornar para Projeto hbNFe

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 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