Clipper On Line • Ver Tópico - Como funciona NFE, CTE, MDFE, etc.

Como funciona NFE, CTE, MDFE, etc.

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Como funciona NFE, CTE, MDFE, etc.

Mensagempor JoséQuintas » 19 Jun 2016 17:13

Como funciona isso de NFE, CTE, MDFE, etc.

Tem lá o endereço da Fazenda pra fazer alguma coisa.
Você envia a mensagem para esse endereço e recebe resposta.
Basicamente é isso que os componentes pra NFE, CTE, MDFE fazem.
Isso costuma ser chamado webservice, soap, etc.

E o XML, o que tem a ver com isso?
A mensagem é formatada como um XML.
Geramente é um XML dentro de outro XML, que pode estar dentro de outro XML, etc. etc. etc.
Não confundir XML com arquivo de extensão XML.
Não vai transmitir nem receber arquivos, vai transmitir uma mensagem e receber outra de volta.

Mas... e os arquivos que os componentes pra NFE costumam usar?
Isso é a forma que encontraram de fazer transferência entre os programas.
Como não dá pra um programa atualizar a variável do outro, isso é feito por arquivos.

E aquela classe SpedSefazClass, o que ela faz?
Ela transmite mensagem e recebe o retorno, exatamente o que o SPED precisa.
Como ela já é em Harbour, o Harbour pode usar direto as variáveis, sem precisar de arquivo nenhum.

E pra usar TXT?
TXT não faz parte do projeto da Fazenda.
Também foi uma forma criada pra transferir informações entre programas diferentes.
Da mesma forma que o XML, trata-se de um arquivo gravado com texto.
Tem que ser formatado, assim como o XML também é formatado, mas cada um usa um formato diferente.

Os arquivos XMLs são apenas pra troca de informações entre programas diferentes.
Até mesmo o envio do XML por email, trata-se de enviar num formato padrão, para que qualquer aplicativo conheça o mesmo formato e consiga ler informações do arquivo.

Basicamente é isso.

O resto, é tudo pra faciltar.
- uma classe pra receber os valores e gerar o XML. tipo nfe:emitente:nome
- uma rotina pra converter txt pra xml
- uma rotina pra ler arquivos xml/txt gerados pelo seu aplicativo
- uma rotina pra salvar retorno em formato xml/txt para o seu aplicativo ler
- formatos diferentes do padrão, por exemplo INI ou outro
etc.

Nota:
Nem sempre o que foi criado pra facilitar vai facilitar.
Algumas vezes, é criado até um formato mais complicado do que o padrão, que só complica.
Formatos "não-padrão" podem deixar seu trabalho como sendo exclusivo daquele produto, não vai poder ser aproveitado pra nenhum outro.
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: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Como funciona NFE, CTE, MDFE, etc.

Mensagempor janio » 19 Jun 2016 18:02

Quintas,

Entao qndo mandamos uma NFe a Sefaz não estamos mandando o arquivo xml em si (como se fosse um anexo de um email), mas sim uma 'variavel' que contem todo o conteúdo do xml?

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

Como funciona NFE, CTE, MDFE, etc.

Mensagempor JoséQuintas » 19 Jun 2016 20:30

Bingo!!!
Estamos apenas enviando um texto.
É como se fosse um email, mas tudo dentro do texto do email, sem nenhum anexo.

Tudo aquilo de ler/gravar arquivo é apenas pra transferir de um programa pro outro.

É como se o ACBR (ou outro) fizesse um Memoread() no seu arquivo, pra poder colar dentro do email... .rs

Vai ver por isso a classe SpedSefazClass confundiu tanto, porque só faz o que precisa ser feito.
É pegar o texto, enviar, receber resposta.
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: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Como funciona NFE, CTE, MDFE, etc.

Mensagempor JoséQuintas » 19 Jun 2016 21:27

Pensei num jeito prático de explicar o XML:

Basicamente o XML tem um título e um conteúdo.
O título é identificado entre os símbolos < >.
Por exemplo, endereço, poderia ser escrito:
<endereco>RUA DO BRASIL</endereco>

O início é o nome sozinho, e o final é com uma barra. O que tiver dentro é o conteúdo daquele "título", também conhecido por nó, node, tag, etc.

Mas não para por aí... o conteúdo de uma tag pode ser outra tag, uma sub-tag.
Podemos dividir o endereço em RUA, NUMERO, BAIRRO.

<endereco>
   <rua>RUA DO BRASIL</rua>
   <numero>110</numero>
   <bairro>algum bairro</bairro>
</endereco>


Continua tudo igual, a tag <rua> termina em </rua>, a <numero> termina em </numero>, a bairro termina em </bairro>
E a que tem tudo dentro, <endereco></endereco>

Na NFe mesma coisa... uma tag dentro da outra.

Algo a mais, é que algumas tags podem ter propriedades adicionais, não sei porque inventaram desse jeito, mas inventaram desse jeito.
<NFe versao="1.00"></NFe>


Continua a mesma coisa, começa em <NFe> e termina em </NFe>
Mas agora a tag NFe tem o atributo de versao.

E por aí vai....

<infNFe>
   <NFe></NFe>
   <Signature></Signature>
</infNFe>


Tag informação da nota, que é composta por duas subtags: NFe que é a nota, e Signature que é a assinatura.

<lote>
   <infNFe></infNfe>
</lote>


Mesma coisa. tag do lote, que dentro tem a NFe, uma ou mais NFes.

<soapenvelope>
   <lote></lote>
</soapenvelope>


Mesma coisa, tag do envelope, que dentro tem o lote.
O envelope é que é transmitido pra Fazenda, mas ele tem tudo dentro.

E a resposta.... mesma coisa: tag que contém informaçào ou sub-tags, que contém informação ou sub-tags, etc. etc. etc.

Para gerar um TXT de nota, a regra geral é esta:

cTxt := conteudo + "|"


Pra gerar um XML de nota, a regra geral é esta:

cXml := "<campo>" + conteudo + "</campo>"


Como o início e final são iguais e só altera a /, mais fácil criar uma função pra isso, pra quando o XML for grande.

cXml := XmlTag( "campo", conteudo )

FUNCTION XmlTag( cNome, cConteudo )
   RETURN "<" + cNome + ">" + cConteudo + "</" + cNome + ">"


E por aí vai.
A coisa é simples, só precisa prestar atenção nos detalhes: as tags tem uma sequência certa, e tem tag dentro de tag.
Tem que abrir e fechar cada tag na sequência certa.

Se no TXT faltar uma coluna? como saber? complicado.

Se no XML faltar um campo? como saber? só procurar o nome dele, ou o nome de algum campo próximo pra ver se ele está lá na sequência certa aonde deveria estar.

Importante ressaltar:

A gente mostra o XML formatado, igual um fonte Harbour:
<NFE>
   <cliente>
   </cliente>
</NFE>


Isso é só pra visualmente a gente enxergar. Na prática o XML é um "linguição", tudo numa única linha.

Se pedir pra visualizar o fonte das páginas aqui do fórum, vai ver algo parecido com isto:
(colocar só o finalzinho, pra não ficar muito grande).

   <div>
      <a id="bottom" name="bottom" accesskey="z"></a>
   </div>
</body>
</html>


Olha o formato XML aí... em qualquer página de internet.

Até mesmo pra postar aqui no fórum, a gente acaba usando tags, pra negrito, código fonte, destacar texto, etc.
A única diferença é usar colchetes.
Pois é... o XML faz parte de nosso dia a dia faz tempo...
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: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Como funciona NFE, CTE, MDFE, etc.

Mensagempor JoséQuintas » 21 Jun 2016 19:12

Só pra completar:

Quando o conteúdo é vazio, pode ser adotado outro formato.

Ao invés de:

<nome></nome>


usar:

<nome/>


Uma regra adotada pra NFE é de fazer isso, economiza no tamanho do XML.
Às vezes a tag é obrigatória, mas nem sempre é obrigatório ter informação dentro.
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: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Como funciona NFE, CTE, MDFE, etc.

Mensagempor JoséQuintas » 23 Jun 2016 19:33

O processo é este. Só pra entender o que acontece, não são os nomes exatos:

Gerado no aplicativo.
É o XML da nota sem assinatura.

<NFe>
   <infNFe>Aqui vai o detalhamento da nota</infNfe>
</NFe>


A assinatura acrescenta o bloco de assinatura:
É o XML assinado, mas sem autorização

<NFe>
   <infNFe>Aqui vai o detalhamento da nota</infNFe>
   <Signature>aqui vai a assinatura</Signature>
</NFe>


isso vai dentro de um lote, é só pra poder enviar, é o XML do lote:

<envNFe>
   aqui vai mais informação do lote
   <NFe>XML Assinado</NFe>
</envNfe>


E no SOAP, acrescenta o envelope:

<envelopeSoap>
   aqui vai mais informação do envelope
   <envNFe>XML do lote</envNFe>
</envelopeSoap>


Depois de pronto que recebe o protocolo, que também vai estar num envelope, estilo acima.
Aqui é a nota autorizada:

<procNFe>
   informações do processo
   <infNFe>XML Assinado</infNFe>
   <protocolo>aqui vai o protocolo</protocolo>
</procNFe>


No processo de ida, vai colocando um XML dentro do outro.
No processo de volta, do protocolo, é tirar de dentro o que interessa.
No final, junta a nota que enviou, com o protocolo que recebeu.

Nota:
Que juntos, não comprovam nada, a não ser que o destinatário entre no site da Fazenda, consulte a chave, confira se está autorizada, e confira se o XML contém o que o site da Fazenda diz que tem.
E depois de uns dias, vai ter que consultar de novo, pra ver se a nota não foi cancelada.
Resumindo: o principal documento do projeto NFE sozinho não vale nada.

Isso vale pra todo projeto NFe. Alguns tem lote e outros não.
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: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Como funciona NFE, CTE, MDFE, etc.

Mensagempor JoséQuintas » 23 Jun 2016 19:50

Agora vamos à assinatura.
Como já viram no post anterior, é um bloco que é adicionado ao XML.

Como é feita a assinatura:
É calculado um hash para o XML, algo como um dígito de controle, mas com vários caracteres: JDHKFHDKFHDKHFKDHDHFKJDF
A assinatura é feita encima desse resultado.
Ok. Se alterar alguma letra dentro do XML, esse "dígito de controle" não bate, e muito menos a assinatura.

A parte interessante que descobri agora, é que a assinatura contém TODOS os dados do certificado.
Através da assinatura dá pra saber quem foi que assinou.
E com base nos dados do certificado, chegamos ao dono, afinal a "fábrica" do certificado vai ter o cadastro completo da empresa.

Nota:
Se quiserem confirmar isto.
Entrem no site de validação do RS e colem o XML assinado.
Vão poder até baixar um certificado pra assinatura (.CER), que vale apenas pra checagem.
Ele é criado a partir da assinatura do XML.

Putz... é até uma insegurança.
Se o dono da empresa é quem faz, vai estar divulgando o email particular do dono.
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: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Como funciona NFE, CTE, MDFE, etc.

Mensagempor JoséQuintas » 30 Jun 2016 17:16

Só pra ilustrar o que comentei.
Você cola o XML assinado pra verificar, no validador RS.
Clica naquele "visualizar".
E abre o arquivo .CER que ele te dá pra download.
Olha o certificado lá completo.
Esse certificado baixado só serve pra validar alguma coisa, e mais nada. Não tem a chave particular.

certificado.png


No final, o servidor da Fazenda só valida o XML contra a informação do certificado que já está no XML.
Ela só precisa comparar se o nome desse certificado é o mesmo nome cadastrado para o dono da nota.
Nem precisa ter cópia do certificado do contribuinte lá.

É incrível como tudo se torna simples, e cada vez parece ter menos segurança.... rs
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: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

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