NF-e — XML — eXtensible Markup Language
Introdução
Em meados da década de 1990, o World Wide Web Consortium (W3C) começou a trabalhar em uma linguagem de marcação que combinasse a flexibilidade da SGML com a simplicidade da HTML. O princípio do projeto era criar uma linguagem que pudesse ser lida por software, e integrar-se com as demais linguagens. Sua filosofia seria incorporada por vários princípios importantes:
- Separação entre conteúdo e formatação;
- Simplicidade e legibilidade, tanto para humanos quanto para computadores;
- Possibilidade de criação de TAGs ilimitadas;
- Criação de arquivos para validação da estrutura do arquivo XML (Os chamados DTDs — Document Type Definition);
- Interligação de bancos de dados distintos;
- Concentração na estrutura da informação, não na sua aparência;
O XML é um formato para a criação de documentos com dados organizados de forma hierárquica. Como exemplos desses tipos de documentos podemos citar: documentos de texto formatados, imagens vetoriais e bancos de dados.
O que é mesmo o XML?
É uma recomendação da W3C para gerar linguagens de marcação para necessidades especiais.
É um subtipo do SGML (acrônimo de Standard Generalized Markup Language, ou Linguagem Padronizada de Marcação Genérica) capaz de descrever diversos tipos de dados. Seu propósito principal é a facilidade de compartilhamento de informações através da Internet.
A principal característica do XML é a de criar uma única infra-estrutura para a criação de outras linguagens tais como:
- XHTML
É uma reformulação da linguagem de marcação HTML, baseada em XML. Combina as TAGs de marcação HTML com regras da XML. Este processo de padronização tem em vista a exibição de páginas Web em diversos dispositivos (televisão, palm, celular, etc). Sua intenção é melhorar a acessibilidade.
- RDF
É uma linguagem para representar informação na Internet.
- SDMX
É uma iniciativa internacional com o objetivo de desenvolver e empregar processos eficientes para troca e compartilhamento de dados e meta-informação estatística entre organizações internacionais e os seus países membros.
- MathML
É uma aplicação do XML para representar símbolos e formulas matemáticas.
- XBRL
É um padrão emergente baseado no XML para definir a informação financeira. Esse padrão é dirigido por um consórcio internacional sem fins lucrativos (XBRL International Incorporated) de mais de 300 organizações, entre entidades reguladoras, agências governamentais e empresas de software.
- SVG
É a abreviatura de Scalable Vectorial Graphics que pode ser traduzido do inglês como gráficos vetoriais escaláveis. Trata-se de uma linguagem XML para descrever de forma vetorial desenhos e gráficos bidimensionais, quer de forma estática, quer dinâmica ou animada. Umas das principais características dos gráficos vetoriais, é que não perdem qualidade ao serem ampliados. A grande diferença entre o SVG e outros formatos vetoriais, é o fato de ser um formato aberto, não sendo propriedade de nenhuma empresa.
O XML não faz nada. Isso mesmo, não faz nada. Pode ser difícil de compreender no início, mas é simples: o XML foi criado para estruturar, armazenar e obter informações de transporte dos dados.
Assim como o HTML, o XML é um texto simples organizado em TAGs.
Vamos a um exemplo de XML:
Curriculum Vitae
<?xml version="1.0" encoding="UTF-8"?>
<curriculo>
<InformacaoPessoal>
<DataNascimento>10-10-1980</DataNascimento>
<Nomecompleto>Albert Eije Barreto Mouta</Nomecompleto>
<Contatos>
<Residencia>
<Rua>R. Maria Tomasia</Rua>
<Numero>458</Numero>
<Cidade>Sao Paulo</Cidade>
<Pais>Brasil</Pais>
</Residencia>
<Telefone>8888-5555</Telefone>
<Email>alberteije@gmail.com</Email>
</Contatos>
<Nacionalidade>Brasileira</Nacionalidade>
<Sexo>M</Sexo>
</InformacaoPessoal>
<objetivo>Atuar na area de TI</objetivo>
<Experiencia>
<Cargo>Analista de Sistemas</Cargo>
<Empregador>T2Ti.COM</Empregador>
</Experiencia>
<Formacao>Superior Completo</Formacao>
</curriculo>
A linguagem HTML
Na Internet atualmente quase todas as páginas se resumem em HTML (HyperText Markup Language). O termo HyperText é definido por textos que têm links para outros textos. Já o termo markup language define anotações para a estrutura de um texto. O design de documentos HTML tem duas características importantes:
- Documentos HTML são feitos para fornecer a visualização da informação destinada à apresentação de páginas da Internet.
- A linguagem HTML contém um conjunto de TAGs com um número fixo para definir a visualização do documento, e cada TAG tem a sua semântica já definida.
O usuário pode também definir a aparência da página dentro das TAGs HTML. Mas como o código fica muito confuso, foram criadas as folhas de estilho, definidas em arquivos CSS para lidar apenas com a aparência da pagina (tipo de letra, cores, etc). Dessa forma, deve-se usar a HTML apenas para definir a visualização dos dados na página.
Muito tem sido feito para melhorar e evoluir a linguagem HTML.
Comparações entre HTML e XML
Vamos fazer uma analogia com o HTML:
HTML significa HyperText Markup Language, que traduzido quer dizer Linguagem de Marcação de Hipertexto.
XML significa eXtensible Markup Language, que traduzido quer dizer Linguagem de Marcação Extensível, ou seja, é uma extensão do HTML.
Na verdade o HTML e o XML são “parentes”. Eles derivam da mesma linguagem, o SGML. Ambos identificam elementos em uma página e ambos utilizam sintaxes similares. Se você conhece HTML, será muito fácil compreender o XML. A grande diferença entre HTML e XML é que o HTML descreve a estrutura e as ações em uma página enquanto o XML não descreve estrutura nem ações, mas sim o que cada trecho de dados é ou representa. Ou seja, o XML descreve o conteúdo do documento.
Como o HTML, o XML também faz uso de TAGs e atributos:
- TAGs — palavras encapsuladas pelos sinais “<” e “>”;
- Atributos — característica de determinada TAG (definidos da seguinte forma: name=”value”).
Enquanto o HTML especifica cada sentido para as TAGs e atributos, o XML usa as TAGs somente para delimitar trechos de dados, e deixa a interpretação do dado a ser realizada completamente para a aplicação que o está lendo. Resumindo, enquanto em um documento HTML uma TAG <p> indica um parágrafo, no XML essa TAG pode indicar um preço, um parâmetro, uma pessoa, ou qualquer outra coisa que tenha sido definida pelo criador do documento para essa TAG <p>.
Os arquivos XML são arquivos texto e facilitam que os programadores ou desenvolvedores “debuguem” mais facilmente as aplicações, de forma que um simples editor de textos pode ser usado para corrigir um erro em um arquivo XML. Mas as regras de formatação para documentos XML são muito mais rígidas do que para documentos HTML. Uma TAG esquecida ou um atributo sem aspas torna o documento inutilizável, enquanto que no HTML isso é tolerado. As especificações oficiais do XML determinam que as aplicações não podem tentar adivinhar o que está errado em um arquivo (no HTML isso acontece), mas sim devem parar de interpretá-lo e reportar o erro.
Características da linguagem XML
Representação dos dados de forma estruturada
O XML fornece uma representação estruturada dos dados que é amplamente implementável e fácil de ser desenvolvida.
O XML fornece um padrão que pode codificar o conteúdo, as semânticas e as esquematizações para uma grande variedade de aplicações desde simples até as mais complexas, dentre elas:
- Um simples documento;
- Um registro estruturado tal como uma ordem de compra de produtos;
- Um objeto com métodos e dados como objetos Java ou controles ActiveX;
- Um registro de dados. Um exemplo seria o resultado de uma consulta a bancos de dados;
- Apresentação gráfica, como interface de aplicações de usuário;
- Entidades e tipos de esquema padrões;
- Todos os links entre informações e pessoas na Web.
Uma característica importante é que, uma vez tendo sido recebido o dado pelo cliente, tal dado pode ser manipulado, editado e visualizado sem a necessidade de novas requisições ao servidor. Com a redução de requisições economiza-se processamento nos servidores e banda na rede, pois menos dados serão trafegados.
O XML é considerado de grande importância na Internet e em grandes intranets porque permite que sistemas de diferentes plataformas conversem entre si, trocando informações dentro de um mesmo padrão.
Separação entre apresentação e dados
O HTML especifica como o documento deve ser apresentado na tela por um navegador. Já o XML define o conteúdo do documento. Por exemplo, em HTML são utilizadas TAGs para definir um tabela, suas linhas e colunas. No XML você utiliza as TAGs para descrever os dados, como exemplo TAGs de assunto, título, autor, conteúdo, referências, datas, etc.
Assim como o HTML tem as folhas de estilo (o CSS) o XML também conta com esse recurso, que é conhecido como XSL (Extensible Style Language) para a apresentação de dados em um navegador. O XML separa os dados da apresentação e processo, o que permite visualizar e processar o dado como quiser, utilizando diferentes folhas de estilo e aplicações.
Observe que na Camada Desktop, a entrada de dados se dá através de uma interface HTML (um browser). Mas poderia ser através de outros clientes, tais como uma aplicação Swing feita em Java ou uma aplicação feita em Dot Net, por exemplo. O usuário poderia entrar com qualquer tipo de dado: compras, ordens de pagamento, resultados de busca, pedidos, catálogos, etc.
Na Camada Middle-Tier, um aplicativo rodando num servidor converte os dados em XML e a partir de então os dados poderão ser armazenados no banco de dados ou lidos por outras aplicações num computador de grande porte (mainframe).
Definição conceitual do XML
Estrutura do documento
Um documento XML é uma árvore rotulada onde um nó externo consiste de:
- Dados de caracteres (uma seqüência de texto);
- Instruções de processamento (anotações para os processadores), tipicamente no cabeçalho do documento;
- Um comentário (nunca acompanhando com semântica);
- Uma declaração de entidade (simples macros);
- Nós DTDs (Document Type Definition).
Um nó interno é um elemento, o qual é rotulado com:
- Um nome ou;
- Um conjunto de atributos, cada qual consistindo de um nome e um valor.
Normalmente, comentários, declarações de entidades e informações DTD não são explicitamente representados na árvore.
Explicação das TAGs
Nós já vimos numa figura anterior o que são o elemento raiz, os demais elementos, os atributos e seus valores e o elemento vazio.
Os documentos XML são sensíveis a letras maiúsculas e minúsculas. Um documento XML é bem formatado quando segue algumas regras básicas. Tais regras são mais simples do que para documentos HTML e permitem que os dados sejam lidos e expostos sem nenhuma descrição externa ou conhecimento do sentido dos dados XML.
Para que um documento XML esteja bem formatado deve seguir os seguintes princípios:
- Abrir e fechar corretamente todas as TAGs;
- As TAGs de elemento devem ser apropriadamente posicionadas;
- Os elementos não podem se sobrepor.
Veja abaixo uma sopre-posição de elementos:
<nome>Albert Eije
<sobrenome> Barreto Mouta </nome>
</sobrenome>
Observe que a TAG nome foi fechada antes da TAG sobrenome. Isso vai causar um erro no arquivo XML.
No entanto, um documento XML apenas “bem formatado” tem pouca utilidade, pois:
- Não há especificação sobre quais TAGs podem ser usadas e para que servem;
- Não há verificação caso se digite uma TAG no local errado, com atributos errados ou mesmo com erro de digitação.
Para que um XML seja válido deve existir um modelo, uma gramática da estrutura do documento, que deve ser obedecida.
Documentos com DTDs
No XML as regras que definem um documento são ditadas por DTDs (Document Type Definition), as quais ajudam a validar os dados quando a aplicação que os recebe não possui internamente uma descrição do dado que está recebendo. Um analisador de documentos pode checar os dados que chegam analisando as regras contidas no DTD para ter certeza de que o dado foi estruturado corretamente. Os dados enviados sem DTD são conhecidos como dados bem formatados. Nesse caso, o documento pode ser usado para implicitamente se auto-descrever, como o currículo vitae que vimos anteriormente.
Com os dados do XML bem formatados e válidos, o documento XML se torna auto-descritivo, pois as TAGs dão idéia de conteúdo e estão misturadas com os dados. Como o documento é aberto e flexível, ele pode ser usado em qualquer lugar onde a troca ou transferência de informação é necessária: informações sobre páginas HTML, objetos ou regras de negócios, transações eletrônicas comerciais, etc.
Os seguintes itens podem ser validados:
- TAGs
- Que TAGs são permitidas;
- Que TAGs filhas são requeridas ou opcionais;
- Se a ordem ou a quantidade de elementos é importante;
- Que tipos de conteúdo são permitidos.
2. Atributos
- Que atributos são requeridos ou opcionais;
- Quais são os tipos de dados dos atributos;
- Se existem valores “padrão” para os atributos;
Para associar um DTD a um arquivo XML deve-se utilizar uma TAG específica indicando o arquivo DTD. Observe no exemplo abaixo:
<?xml version=“1.0” ?><!DOCTYPE Pessoa
PUBLIC "-//T2Ti//DTD Produtos//BR"
"http://www.t2ti.com/dtd/Pessoa.dtd"><pessoa>
<nome>Albert Eije</nome>
<email>alberteije@gmail.com</email>
<telefone>
<ddd>61</ddd>
<numero>9999-8888</numero>
</telefone>
</pessoa>
Observe que um arquivo DTD é seguido pela extensão dtd. Existem ainda os “schemas”. É uma outra forma de definir a gramática para um arquivo XML, com algumas vantagens em relação aos DTDs. Mas não vamos nos aprofundar nesses assuntos, pois não é o objetivo deste livro. Basta saber que o projeto NF-e utiliza schemas para validar os arquivos XML.
Padrões da estrutura do XML
O XML é baseado em padrões de tecnologia comprovadamente otimizados para a Web.
Os padrões que compõem o XML são definidos pelo W3C (World Wide Web Consortium) e são os seguintes:
- Extensible Markup Language (XML) — é uma Recomendação, que é vista como o último estágio de aprovação do W3C. Isso significa que o padrão é estável e pode ser aplicado a Web e utilizado pelos desenvolvedores de ferramentas;
- XML Namespaces — é também uma Recomendação, a qual descreve a sintaxe de namespace, ou espaço de nomes, e que serve para criar prefixos para os nomes de TAGs, evitando confusões que possam surgir com nomes iguais para TAGs que definem dados diferentes;
- Document Object Model (DOM) Level 1 — é uma Recomendação que provê formas de acesso aos dados estruturados utilizando scripts, permitindo aos desenvolvedores interagir e computar tais dados consistentemente;
- Extensible Stylesheet Language (XSL) — O XSL apresenta duas seções: a linguagem de transformação e a formatação de objetos. A linguagem de transformação pode ser usada para transformar documentos XML em algo agradável para ser visto, assim como transformar para documentos HTML, e pode ser usada independentemente da segunda seção (formatação de objetos).
- XML Linking Language (XLL) e XML Pointer Language (XPointer) — O XLL é uma linguagem de construção de links que é similar aos links HTML, sendo que é mais poderosa, porque os links podem ser multidirecionais, e podem existir a nível de objetos, e não somente a nível de página.
Uma noção sobre DOM
DOM é uma API (Applications Programming Interface) independente de plataforma e linguagem que é utilizada para manipular as árvores do documento XML (e HTML também).
DOMs são ideais para linguagem script, como exemplo JavaScript.
Essa API é definida em vários níveis:
- Nível 0: Funções existentes conhecidas das linguagens script dos browsers;
- Nível 1: Funcionalidade para navegação em documentos e manipulações;
- Nível 2: Adiciona modelos de style sheets (folhas de estilo), filtros, modelos de eventos, e suporte a namespaces;
- Nível 3: Possibilita as opções de carregar e salvar, DTDs, schemas, visualização de documentos e status de formatação (W3C trabalhando no nível 2).
Principais benefícios da linguagem XML
O XML tem por objetivo trazer flexibilidade e poder às aplicações Web. Dentre os benefícios para desenvolvedores e usuários temos:
- Buscas mais eficientes;
- Desenvolvimento de aplicações Web mais flexíveis. Isso inclui integração de dados de fontes completamente diferentes, de múltiplas aplicações; computação e manipulação local dos dados; múltiplas formas de visualização e atualização granulares do conteúdo;
- Distribuição dos dados via rede de forma mais comprimida e escalável;
- Padrões abertos.
Buscas mais eficientes
Os dados em XML podem ser unicamente “etiquetados”, o que permite que, por exemplo, uma busca por livros seja feita em função do nome do autor. Sem o XML é necessário para a aplicação de procura saber como é esquematizado e construído cada banco de dados que armazena os dados de interesse, o que é impossível. O XML permite definir livros por autor, título, assunto, etc. Isso facilita enormemente a busca.
Desenvolvimento de aplicações flexíveis para a Web
O desenvolvimento de aplicações Web em três camadas é altamente factível com o XML. Os dados XML podem ser distribuídos para as aplicações, objetos ou servidores intermediários para processamento. Esses mesmos dados também podem ser distribuídos para a camada cliente para serem visualizados em um navegador ou qualquer outro cliente que possa ler os arquivos XML.
Integração de dados de fontes diferentes
Atualmente existem dados espalhados em diversos bancos de dados diferentes. O XML permite que tais dados possam ser facilmente combinados. Essa combinação seria feita via software em um servidor intermediário, estando os bancos de dados na extremidade da rede.
Os dados poderiam ser distribuídos para outros servidores ou clientes para que fizessem o processamento, a agregação e a distribuição.
Computação e manipulação locais
Os dados XML recebidos por um cliente são analisados e podem ser editados e manipulados de acordo com o interesse do usuário. Ao contrário de somente visualizar os dados, os usuários podem manipulá-los de várias formas. Os recursos disponíveis do Document Object Model (DOM) permitem que os dados sejam manipulados via scripts ou outra linguagem de programação.
A separação da interface visual dos dados propriamente ditos permite a criação de aplicações mais poderosas, simples e flexíveis.
Múltiplas formas de visualizar os dados
Os dados recebidos por um usuário podem ser visualizados de diferentes formas uma vez que o XML define somente os dados e não o visual. A interpretação visual poderia ser dada de várias maneiras diferentes, de acordo com as aplicações. Os recursos de CSS e XSL permitem essas formas particulares de visualização.
Atualizações granulares dos documentos
Os dados podem ser atualizados de forma granular, evitando que uma pequena modificação no conjunto de dados implique na busca do documento inteiro novamente. Dessa forma, somente os elementos modificados seriam enviados pelo servidor para o cliente.
O XML também permite que novos dados sejam adicionados aos já existentes, sem a necessidade de reconstrução da página.
Fácil distribuição na Web
Assim como o HTML, o XML, por ser um formato baseado em texto aberto, pode ser distribuído via HTTP sem necessidade de modificações nas redes existentes.
Compressão
A compressão de documentos XML é fácil devido à natureza repetitiva das TAGs usadas para definir a estrutura dos dados. A necessidade de compressão é dependente da aplicação e da quantidade de dados a serem movidos entre clientes e servidores. Os padrões de compressão do HTTP 1.1 podem ser usados para o XML.
XML no Projeto NF-e
Padrão de Codificação
A especificação do documento XML adotada é a recomendação W3C para XML 1.0, disponível em www.w3.org/TR/REC-xml e a codificação dos caracteres será em UTF-8, assim todos os documentos XML serão iniciados com a seguinte declaração:
<?xml version="1.0" encoding="UTF-8"?>
OBS: Lembrando que cada arquivo XML somente poderá ter uma única declaração <?xml version=”1.0" encoding=”UTF-8"?>. Nas situações em que um documento XML pode conter outros documentos XML, como ocorre com o documento XML de lote de envio de NF-e, deve-se tomar o cuidado para que exista uma única declaração no início do lote.
Declaração namespace
A declaração de namespace da NF-e deverá ser realizada no elemento raiz de cada documento XML como segue:
<NFe xmlns=”http://www.portalfiscal.inf.br/nfe” >
Não é permitida a utilização de prefixos de namespace. Essa restrição visa otimizar o tamanho do arquivo XML.
Assim, ao invés da declaração:
<NFe:NFe xmlns:NFe=”http://www.portalfiscal.inf.br/nfe” >
Deverá ser adotada a declaração:
<NFe xmlns =”http://www.portalfiscal.inf.br/nfe” >
Observe que na declaração adotada não existe o prefixo “NFe:”.
A declaração do namespace da assinatura digital deverá ser realizada na própria TAG <Signature>, conforme exemplo abaixo.
Cada documento XML deverá ter o seu namespace individual em seu elemento raiz. No caso específico do lote de envio da NF-e, cada NF-e deverá ter declarado o seu namespace individual.
Segue abaixo o exemplo:
<?xml version="1.0" encoding="UTF-8"?>
<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">
<idLote>200602220000001</idLote>
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe31060243816719000108550000000010001234567890" versao="1.01">
...
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
...
</NFe><NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe31060243816719000108550000000010011234567900" versao="1.01">
...
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
...
</NFe>
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe31060243816719000108550000000010021234567916" versao="1.01">
...
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
...
</NFe>
</enviNFe>
Otimização na montagem do arquivo
Para que o arquivo gerado não fique muito grande ao ser enviado para a SEFAZ, alguns aspectos devem ser analisados no momento da geração do arquivo XML:
Não deverão ser incluídas TAGs de campos com conteúdo zero (para campos tipo numérico) ou vazio (para campos tipo caractere). A não ser que esses campos sejam identificados como obrigatórios no modelo;
A regra constante do parágrafo anterior deverá estender-se para os campos onde não há indicação de obrigatoriedade e que, no entanto, seu preenchimento torna-se obrigatório por estar condicionado à legislação específica ou ao negócio do contribuinte. Neste caso, deverá constar a TAG com o valor correspondente e, para os demais campos, deverão ser eliminadas as TAGs.
Para reduzir o tamanho final do arquivo XML da NF-e alguns cuidados de programação deverão ser assumidos:
- Não incluir “zeros não significativos” para campos numéricos;
- Não incluir “espaços” no início ou no final de campos numéricos e alfanuméricos;
- Não incluir comentários no arquivo XML;
- Não incluir anotação e documentação no arquivo XML (TAG annotation e TAG documentation);
- Não incluir caracteres de formatação no arquivo XML (“line-feed”, “carriage return”, “tab”, caractere de “espaço” entre as TAGs).
Validação de Schema
Para garantir minimamente a integridade das informações prestadas e a correta formação dos arquivos XML, o contribuinte deverá submeter o arquivo da NF-e e as demais mensagens XML para validação pelo Schema do XML (XSD — XML Schema Definition), disponibilizado pela Secretaria de Fazenda Estadual antes de seu envio.
Tratamento de caracteres especiais no texto de XML
Todos os textos de um documento XML passam por uma análise do “parser” (analisador) específico da linguagem. Alguns caracteres afetam o funcionamento deste “parser”, não podendo aparecer no texto de uma forma não controlada.
Os caracteres que afetam o “parser” são:
- > (sinal de maior);
- < (sinal de menor);
- & (e-comercial);
- “ (aspas);
- ‘ (sinal de apóstrofo).
Alguns destes caracteres podem aparecer especialmente no campo de Razão Social, Endereço e Informação Adicional. Para resolver esses casos, é recomendável o uso de uma seqüência de “escape” em substituição ao caractere que causa o problema.
Ex. a denominação: DIAS & DIAS LTDA deve ser informada como: DIAS & DIAS LTDA no XML para não afetar o funcionamento do “parser”.
A tabela abaixo mostra como o programador deve substituir o código do caractere pelo seu Entity Name:
Compreendendo o layout do padrão XML da NF-e
Compreender o layout da NF-e é imprescindível para o desenvolvimento da solução. Observe na imagem abaixo o diagrama simplificado dos grupos de informações da NF-e. Vamos nos referir a essa imagem como “árvore geral”.
Observe como as informações estão organizadas como numa árvore. Veja na imagem abaixo o layout de dois elementos do grupo de informações visto acima.
Primeiro vamos compreender o que quer dizer cada uma das colunas deste layout:
a) coluna #: identificador da linha da tabela;
b) coluna ID: identificação do campo;
c) coluna Campo: identificador do nome do campo, como a nomenclatura dos nomes dos campos foi padronizada, um nome de campo é utilizado para identificar campos diferentes, como por exemplo, a IE, que pode ser do emitente ou do destinatário. A diferenciação dos campos é realizada considerando as TAGs de grupo;
d) coluna Ele: o elemento é um campo básico de informação do documento XML. Observe a imagem abaixo:
A — indica que o campo é um atributo do Elemento anterior;
E — indica que o campo é um Elemento;
CE — indica que o campo é um Elemento que deriva de uma Escolha (Choice). A opção Choice é utilizada para Elementos de informação mutuamente exclusivos, como é o caso do CPF/CNPJ dos dados cadastrais, para o qual deve ser informado o CNPJ ou o CPF. Observe a imagem abaixo retirada do Manual de Integração do Contribuinte, referente à TAG emit:
G — indica que o campo é um Elemento de Grupo, ou seja, este elemento vai agrupar outras informações dentro dele. No XML que vimos onde a TAG raiz era “pessoa”, a TAG “telefone” é um Elemento de Grupo.
CG — indica que o campo é um Elemento de Grupo que deriva de uma Escolha (Choice);
ID — indica que o campo é um ID da XML 1.0;
RC — indica que o campo é uma key constraint (Restrição de Chave) para garantir a unicidade e presença do valor;
e) coluna Pai: indica qual é o elemento pai;
f) coluna Tipo:
N — campo numérico;
C — campo alfanumérico;
D — campo data;
g) coluna Ocorrência: x-y, onde x indica a ocorrência mínima e y a ocorrência máxima. Poderíamos chamar essa coluna de Cardinalidade.
h) coluna Tamanho: x-y, onde x indica o tamanho mínimo e y o tamanho máximo; a existência de um único valor indica que o campo tem tamanho fixo, devendo-se informar a quantidade de caracteres exigidos, preenchendo-se os zeros não significativos; tamanhos separados por vírgula indicam que o campo deve ter um dos tamanhos fixos da lista. O tamanho máximo dos campos Tipo “C”, quando não especificado, é 60 posições;
i) coluna Dec: indica a quantidade máxima de casas decimais do campo;
Regras de preenchimento dos campos da Nota Fiscal Eletrônica
- Campos que representam códigos (CNPJ, CPF, CEP, CST, NCM, EAN, etc.) devem ser informados com o tamanho fixo previsto, sem formatação e com o preenchimento dos zeros não significativos;
- Campos numéricos que representam valores e quantidades são de tamanho variável, respeitando o tamanho máximo previsto para o campo e a quantidade de casas decimais. O preenchimento de zeros não significativos causa erro de validação do Schema XML.
- Os campos numéricos devem ser informados sem o separador de milhar, com uso do ponto decimal para indicar a parte fracionária se existente respeitando-se a quantidade de dígitos prevista no leiaute;
- O uso de caracteres acentuados e símbolos especiais para o preenchimento dos campos alfanuméricos devem ser evitados. Os espaços informados no início e no final do campo alfanumérico também devem ser evitados;
- As datas devem ser informadas no formato “AAAA-MM-DD”;
- A forma e a obrigatoriedade de preenchimento dos campos da Nota Fiscal Eletrônica estão previstas na legislação aplicável para a operação que se pretende realizar;
- Inexistindo conteúdo (valor zero ou vazio) para um campo não obrigatório, a TAG deste campo não deverá ser informada no arquivo da NF-e;
- Tratando-se de operações com o exterior, uma vez que o campo CNPJ é obrigatório não informar o conteúdo deste campo;
- No caso das pessoas desobrigadas de inscrição no CNPJ/MF, deverá ser informado o CPF da pessoa, exceto nas operações com o exterior;
Exemplo de uma NF-e — Arquivo XML
<?xml version="1.0" encoding="utf-8"?>
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe35080599999090910270550010000000045180051273" versao="1.10">
<ide>
<cUF>35</cUF>
<cNF>518075127</cNF>
<natOp>Venda a vista</natOp>
<indPag>0</indPag>
<mod>55</mod>
<serie>1</serie>
<nNF>1</nNF>
<dEmi>2008-09-07</dEmi>
<dSaiEnt>2008-09-07</dSaiEnt>
<tpNF>0</tpNF>
<cMunFG>3550308</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>3</cDV>
<tpAmb>2</tpAmb>
<finNFe>1</finNFe>
<procEmi>0</procEmi>
<verProc>NF-eletronica.com</verProc>
</ide>
<emit>
<CNPJ>99988090910444</CNPJ>
<xNome>NF-e Teste</xNome>
<xFant>NF-e</xFant>
<enderEmit>
<xLgr>Rua Teste</xLgr>
<nro>100</nro>
<xCpl>Fundos</xCpl>
<xBairro>Bairro Teste</xBairro>
<cMun>3502200</cMun>
<xMun>Teste</xMun>
<UF>SP</UF>
<CEP>99988855</CEP>
<cPais>1058</cPais>
<xPais>Brasil</xPais>
<fone>4567894562</fone>
</enderEmit>
<IE>123135454622</IE>
</emit>
<dest>
<CNPJ>00000000000191</CNPJ>
<xNome>DISTRIBUIDORA TESTE</xNome>
<enderDest>
<xLgr>AV DO TESTE</xLgr>
<nro>4568</nro>
<xCpl>20 ANDAR</xCpl>
<xBairro>PARQUE TESTE</xBairro>
<cMun>5030801</cMun>
<xMun>Sao Paulo</xMun>
<UF>SP</UF>
<CEP>45612312</CEP>
<cPais>1058</cPais>
<xPais>BRASIL</xPais>
<fone>1235456462</fone>
</enderDest>
<IE></IE>
</dest>
<retirada>
<CNPJ>00000000000182</CNPJ>
<xLgr>AV PAULISTA</xLgr>
<nro>12345</nro>
<xCpl>TERREO</xCpl>
<xBairro>OUTRO BAIRRO DE TESTE</xBairro>
<cMun>5464546</cMun>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</retirada>
<entrega>
<CNPJ>00000000000194</CNPJ>
<xLgr>AV JOAO LIMA</xLgr>
<nro>1555</nro>
<xCpl>17 ANDAR</xCpl>
<xBairro>O TERCEIRO BAIRRO DE TESTE</xBairro>
<cMun>3550308</cMun>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</entrega>
<det nItem="1">
<prod>
<cProd>00001</cProd>
<cEAN />
<xProd>AGUA MINERAL COM GAS</xProd>
<CFOP>5101</CFOP>
<uCom>dz</uCom>
<qCom>1000000.0000</qCom>
<vUnCom>1</vUnCom>
<vProd>10000000.00</vProd>
<cEANTrib />
<uTrib>und</uTrib>
<qTrib>12000000.0000</qTrib>
<vUnTrib>1</vUnTrib>
</prod>
<imposto>
<ICMS>
<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>0</modBC>
<vBC>10000000.00</vBC>
<pICMS>18.00</pICMS>
<vICMS>1800000.00</vICMS>
</ICMS00>
</ICMS>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pPIS>0.65</pPIS>
<vPIS>65000</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pCOFINS>2.00</pCOFINS>
<vCOFINS>200000.00</vCOFINS>
</COFINSAliq>
</COFINS>
</imposto>
</det>
<det nItem="2">
<prod>
<cProd>00002</cProd>
<cEAN />
<xProd>AGUA MINERAL</xProd>
<CFOP>5101</CFOP>
<uCom>pack</uCom>
<qCom>5000000.0000</qCom>
<vUnCom>2</vUnCom>
<vProd>10000000.00</vProd>
<cEANTrib />
<uTrib>und</uTrib>
<qTrib>3000000.0000</qTrib>
<vUnTrib>0.3333</vUnTrib>
</prod>
<imposto>
<ICMS>
<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>0</modBC>
<vBC>10000000.00</vBC>
<pICMS>18.00</pICMS>
<vICMS>1800000.00</vICMS>
</ICMS00>
</ICMS>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pPIS>0.65</pPIS>
<vPIS>65000</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pCOFINS>2.00</pCOFINS>
<vCOFINS>200000.00</vCOFINS>
</COFINSAliq>
</COFINS>
</imposto>
</det>
<total>
<ICMSTot>
<vBC>20000000.00</vBC>
<vICMS>18.00</vICMS>
<vBCST>0</vBCST>
<vST>0</vST>
<vProd>20000000.00</vProd>
<vFrete>0</vFrete>
<vSeg>0</vSeg>
<vDesc>0</vDesc>
<vII>0</vII>
<vIPI>0</vIPI>
<vPIS>130000.00</vPIS>
<vCOFINS>400000.00</vCOFINS>
<vOutro>0</vOutro>
<vNF>20000000.00</vNF>
</ICMSTot>
</total>
<transp>
<modFrete>0</modFrete>
<transporta>
<CNPJ>00000000000191</CNPJ>
<xNome>Livraria SP SA</xNome>
<IE>787987979898</IE>
<xEnder>Rua Mangabaeiar, 120 - Distrito Teste</xEnder>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</transporta>
<veicTransp>
<placa>JGZ5555</placa>
<UF>SP</UF>
<RNTC>123456789</RNTC>
</veicTransp>
<reboque>
<placa>JGZ5555</placa>
<UF>SP</UF>
<RNTC>123456789</RNTC>
</reboque>
<vol>
<qVol>10000</qVol>
<esp>CAIXA</esp>
<marca>CHAMPITO</marca>
<nVol>500</nVol>
<pesoL>1000000000.000</pesoL>
<pesoB>1200000000.000</pesoB>
<lacres>
<nLacre>XYZ15464565</nLacre>
</lacres>
</vol>
</transp>
<infAdic>
<infAdFisco>NF Teste NF-eletronica.com</infAdFisco>
</infAdic>
</infNFe>
</NFe>
Se você ler o arquivo acima analisando a imagem da árvore geral, poderá observar o seguinte:
A TAG NFe tem o seguinte namespace: xmlns=”http://www.portalfiscal.inf.br/nfe". Tenha em mente que “xmlns” significa exatamente: XML Name Space.
Entrando no segundo nível da árvore temos a TAG infNFe, que representa os dados da Nota Fiscal Eletrônica. Essa TAG tem vários atributos, como você pode observar na imagem que mostra o layout dos dois primeiros elementos. O layout completo pode ser consultado no Manual de Integração do Contribuinte, disponível no Portal da Nota Fiscal Eletrônica. Foram informados os atributos Id e versão, conforme abaixo:
<infNFe Id="NFe35080599999090910270550010000000045180051273" versao="1.10">
Logo após entramos no terceiro nível, através das seguintes TAGs: ide, emit, dest, retirada, entrega, det, total, transp e infAdic.
A TAG det pode ter de 1 a 990 ocorrências. No nosso exemplo, temos duas ocorrências dessa TAG. É nela que serão informados todos os dados sobre a mercadoria constante na nota fiscal. Através dela entramos no quarto nível, com as TAGs prod e imposto. Através da TAG imposto chegamos no quinto nível da árvore geral com as TAGs ICMS, PIS e COFINS.
O exemplo observado é bem simples, mas cumpre o objetivo de mostrar como fica o arquivo XML de uma Nota Fiscal Eletrônica. Vale ressaltar que esse arquivo não está assinado digitalmente. Observe que não existe uma TAG Signature, que aparece no segundo nível da árvore geral. Veja detalhes sobre a assinatura digital no capítulo destinado a este tema.
Elemento Produto — Campos uTrib e qTrib
Observando o layout da NF-e, ao chegar no Elemento produto você verá que existem dois campos para a unidade e dois campos para a quantidade. Veja a imagem abaixo, que representa uma parte dos campos do Elemento Produto:
Como podemos ver na figura temos os campos de Unidade e Quantidade Comercial (uCom e qCom) e os campos de Unidade e Quantidade Tributável (uTrib e qTrib). Estes últimos foram criados para atender a necessidade do Fisco de identificar as situações de mercadorias em que a unidade de tributação é diferente da unidade de comercialização.
A unidade de tributação corresponde à unidade de comercialização do varejo da mercadoria.
Vamos analisar um dos produtos do nosso XML:
<det nItem="1">
<prod>
<cProd>00001</cProd>
<cEAN />
<xProd>AGUA MINERAL COM GAS</xProd>
<CFOP>5101</CFOP>
<uCom>dz</uCom>
<qCom>1000000.0000</qCom>
<vUnCom>1</vUnCom>
<vProd>10000000.00</vProd>
<cEANTrib />
<uTrib>und</uTrib>
<qTrib>12000000.0000</qTrib>
<vUnTrib>1</vUnTrib>
</prod>
<imposto>
<ICMS>
<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>0</modBC>
<vBC>10000000.00</vBC>
<pICMS>18.00</pICMS>
<vICMS>1800000.00</vICMS>
</ICMS00>
</ICMS>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pPIS>0.65</pPIS>
<vPIS>65000</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pCOFINS>2.00</pCOFINS>
<vCOFINS>200000.00</vCOFINS>
</COFINSAliq>
</COFINS>
</imposto>
</det>
Temos no exemplo acima o produto “AGUA MINERAL COM GAS”. Na Unidade Comercial (uCom) temos a seguinte informação: “dz”, o que indica que o produto é vendido em pacotes de 12 unidades (neste caso “dz” quer dizer dúzia). Na Quantidade Comercial (qCom) foi informado o valor 1000000.0000, ou seja, foram vendidas 1 milhão de caixas desse produto, cada caixa com 12 unidades.
Na Unidade Tributável (uTrib) temos a seguinte informação: “und”, indicando que aqui serão informados os dados de cada unidade. Na Quantidade Tributável (qTrib) foi informado o valor 12000000.0000, ou seja, doze milhões de unidades.
A conta é bem simples: como foram vendidas 1 milhão de caixas e cada caixa tem 12 unidades, no final foram vendidas 12 milhões de unidades.
Preenchimento das informações do ICMS
Alguns campos relacionados com tributos podem aparecer mais de uma vez no layout em função da estrutura de grupos de Choice baseados no CST — Código de Situação Tributária do tributo.
O preenchimento dos campos de tributos relacionados com o “ICMS Normal e ST” depende do conteúdo informado no CST — Código da Situação Tributária (campo N12), que pode assumir um dos seguintes valores:
00 — Tributada integralmente;
10 — Tributada e com cobrança do ICMS por substituição tributária;
20 — Com redução de base de cálculo;
30 — Isenta ou não tributada e com cobrança do ICMS por substituição tributária;
40 — Isenta;
41 — Não tributada;
50 — Suspensão;
51 — Diferimento;
60 — ICMS cobrado anteriormente por substituição tributária;
70 — Com redução de base de cálculo e cobrança do ICMS por substituição tributária;
90 — Outros.
Assim, conforme o CST aplicável para a situação, o grupo de tributo “ICMS Normal e ST” deverá ter os campos assinalados com ‘S’ ou ‘?’ da seguinte tabela:
Vamos analisar cada caso.
CST 00 — Tributada integralmente
CST 10 — Tributada e com cobrança do ICMS por substituição tributária
CST 20 — Com redução de base de cálculo
CST 30 — Isenta ou não tributada e com cobrança do ICMS por substituição tributária
CST 40 — Isenta | 41 — Não Tributada | 50 — Suspensão
CST 51 — Diferimento
A exigência do preenchimento das informações do ICMS diferido fica a critério de cada UF.
CST 60 — ICMS cobrado anteriormente por substituição tributária
CST 70 — Com redução de base de cálculo e cobrança do ICMS por substituição tributária
CST 90 — Outros
Referências Bibliográficas
NF-eletrônica nacional
http://nf-eletronica.com/blog/
Portal da Nota Fiscal Eletrônica
http://www.nfe.fazenda.gov.br/portal
SEFAZ Acre
http://www.sefaz.ac.gov.br
SEFAZ Alagoas
http://www.sefaz.al.gov.br
SEFAZ Amapá
http://www.sefaz.ap.gov.br
SEFAZ Amazonas
http://www.sefaz.am.gov.br
SEFAZ Bahia
http://www.sefaz.ba.gov.br
SEFAZ Ceará
http://www.ceara.gov.br
SEFAZ Distrito Federal
http://www.fazenda.df.gov.br
SEFAZ Espírito Santo
http://www.sefaz.es.gov.br
SEFAZ Goiás
http://nfe.sefaz.go.gov.br
SEFAZ Maranhão
http://www.sefaz.ma.gov.br
SEFAZ Mato Grosso
http://www.sefaz.mt.gov.br
SEFAZ Mato Grosso do Sul
SEFAZ Minas Gerais
http://portalnfe.fazenda.mg.gov.br
SEFAZ Pará
http://www.sefa.pa.gov.br
SEFAZ Paraíba
http://www.receita.pb.gov.br
SEFAZ Paraná
http://www.fazenda.pr.gov.br
SEFAZ Pernambuco
http://www.sefaz.pe.gov.br
SEFAZ Piauí
http://www.sefaz.pi.gov.br
SEFAZ Rio de Janeiro
http://www.fazenda.rj.gov.br
SEFAZ Rio Grande do Norte
http://www.set.rn.gov.br
SEFAZ Rio Grande do Sul
http://www.sefaz.rs.gov.br
SEFAZ Rondônia
http://www.portal.sefin.ro.gov.br/site/
SEFAZ Roraima
http://www.sefaz.rr.gov.br
SEFAZ Santa Catarina
http://nfe.sef.sc.gov.br
SEFAZ São Paulo
http://www.fazenda.sp.gov.br/nfe
SEFAZ Sergipe
http://nfe.sefaz.se.gov.br
SEFAZ Tocantins
http://www.sefaz.to.gov.br
SPED — Sistema Público de Escrituração Digital
http://www1.receita.fazenda.gov.br
The XML C parser and toolkit of Gnome — libxml
http://xmlsoft.org/index.html
The World Wide Web Consortium (W3C)
http://www.w3.org/
Wikipedia, a enciclopédia livre
http://en.wikipedia.org/ | http://pt.wikipedia.org/
XML Security Library
http://www.aleksey.com/xmlsec/index.html
T2Ti ERP — Aprenda a Desenvolver um ERP
O T2Ti ERP 2.0 é feito em C#, Delphi, Java (RIA e Web) e Lazarus. São cinco projetos diferentes. Que tal aprender a desenvolver esse ERP totalmente grátis? Parece bom?
Acompanhe o canal da T2Ti no Youtube. A T2Ti está postando todos os vídeos do T2Ti ERP 2.0 no Youtube. São quase 300 módulos!
Os vídeos estão organizados em Playlists. Então se inscreva no canal e ative o sininho para receber atualizações sobre as postagens.