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

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como funciona NFE, CTE, MDFE, etc.

Mensagem por JoséQuintas »

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 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
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Como funciona NFE, CTE, MDFE, etc.

Mensagem por janio »

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como funciona NFE, CTE, MDFE, etc.

Mensagem por JoséQuintas »

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

Como funciona NFE, CTE, MDFE, etc.

Mensagem por JoséQuintas »

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:

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

<lote>
   <infNFe></infNfe>
</lote>
Mesma coisa. tag do lote, que dentro tem a NFe, uma ou mais NFes.

Código: Selecionar todos

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

Código: Selecionar todos

cTxt := conteudo + "|"
Pra gerar um XML de nota, a regra geral é esta:

Código: Selecionar todos

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.

Código: Selecionar todos

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:

Código: Selecionar todos

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

Código: Selecionar todos

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

Como funciona NFE, CTE, MDFE, etc.

Mensagem por JoséQuintas »

Só pra completar:

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

Ao invés de:

Código: Selecionar todos

<nome></nome>
usar:

Código: Selecionar todos

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

Como funciona NFE, CTE, MDFE, etc.

Mensagem por JoséQuintas »

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.

Código: Selecionar todos

<NFe>
   <infNFe>Aqui vai o detalhamento da nota</infNfe>
</NFe>
A assinatura acrescenta o bloco de assinatura:
É o XML assinado, mas sem autorização

Código: Selecionar todos

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

Código: Selecionar todos

<envNFe>
   aqui vai mais informação do lote
   <NFe>XML Assinado</NFe>
</envNfe>
E no SOAP, acrescenta o envelope:

Código: Selecionar todos

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

Código: Selecionar todos

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

Como funciona NFE, CTE, MDFE, etc.

Mensagem por JoséQuintas »

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

Como funciona NFE, CTE, MDFE, etc.

Mensagem por JoséQuintas »

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