Programação -

Entendendo a Sefaz – NFe, CTe, NFSe e Outros

Eu entendo que o título deste artigo vai parecer muito arrogante, pois é impossível entender a Sefaz, mas assim o título fica menor e é melhor para o SEO. O que vamos explorar aqui não é exatamente código, mas revisar conceitos e problemas mais comuns que programadores têm ao implementar um módulo fiscal em seu sistema. Este artigo é destinado para quem vai começar a implementação e facilitar o entendimento de para aqueles que simplesmente vão fazer manutenções em sistemas já existentes.

Comecei a trabalhar com essa parte fiscal há mais ou menos 1,5 ano. Para quem já trabalhou com NFe, CTe e, mais recentemente, NFSe, deve saber que a Sefaz parece que faz de tudo para você cometer erros. O suporte é quase nulo e eles poderiam realmente fazer uma forma de facilitar a comunicação e dar melhores retornos. Mas a verdade é que parece que o governo usa multa como fonte de renda, então para quê facilitar que o empresário pague ao próprio governo, né?

Supostamente, a NFe / CTe foi criada para reduzir o esforço e facilitar a emissão de documentos fiscais. Não há duvidas de que o controle do governo para o pagamento desses impostos aumentou e a dificuldade para sonegar impostos é maior. Entretanto, a dificuldade para emissão da nota também aumentou. Atualmente as empresas são obrigadas a emitir NF e do antigo CTRC (na maioria dos estados) de forma eletrônica. Futuramente a Nota Fiscal de Serviço também será eletrônica.

Obs. NFe = Nota Fiscal Eletrônica, NFSe = Nota Fiscal de Serviço Eletrônica, CTe = Conhecimento de Transporte Eletrônico. O leiaute 3.0 da NFe, referente ao Cupom Fiscal Eletrônico ainda não está em fases de testes e não explorarei neste artigo por não possuir ainda conhecimento necessário para descrever, no entanto, o 3.0 deverá seguir a mesma lógica.

Contador usando computador e falando ao telefone, com camisa azul.

Os Manuais da Sefaz

Muitos podem dizer que todas as respostas estão nos manuais e basta lê-los (hahahaha!). Mas muitos programadores só precisam dar suporte a um sistema já implementado ou simplesmente não entendeu determinados processos descritos nos manuais.

Primeiramente, devo lembrar que todos os manuais estão disponíveis através dos respectivos sites das fazendas:

Já para as notas fiscais de serviço (NFSe) há um problema a parte. Apesar de existir um padrão para NFSe, cabe a cada município a responsabilidade de disponibilizar os servidores e padrões para os webservices das mesmas, dificultando e MUITO a vida do programador. Consulte o site da Sefaz de seu município para obter o link com o manual.

Não somente os manuais são importantes como também as notas técnicas. As notas técnicas são mudanças que acontecem com certa frequência sobre os servidores da Sefaz e atualizações nas regras de validação e legislação. Infelizmente não tem como você receber atualizações em seu email. Então você deve estar sempre de olho nessas páginas e prestar atenção em fóruns relativos a Sefaz que concordem com a linguagem que você está trabalhando.

Sem dúvida a parte mais importante do manual e o que deve ser seguido na maioria dos erros (os erros mais comuns são os de preenchimento), são as Tabelas de Leiaute.  Ela não é complicada, mas pode causar algumas confusões em profissionais menos experientes. Abaixo, listarei a importância e descrição de cada campo da tabela leiaute:

exemplo-tabela-leioute-nfe

  • # : Código de referência único para cada linha da tabela de leiaute;
  • Campo : Descreve o nome da tag XML para aquele valor;
  • Ele : Indica o tipo do campo(A – atributo, E – Elemento, CE – Elemento que deriva de uma Escolha, G – Grupo, CG – Elemento de Grupo que deriva de uma Escolha, ID – ID da XML 1.0, RC – Restrição de Chave);
  • Pai : Referência da tag pai daquela linha, baseado no código único;
  • Tipo: Descreve o tipo básico do valor que deve ser passado para aquele campo (N = Número, C = Caractere, D = Data, xml = XML).
  • Ocor. (Ocorrência) : Mostra o número mínimo e máximo de vezes que a tag deve aparecer na XML. Exemplo: 0-1 quer dizer que ela não é obrigatória, mas só pode aparecer uma vez, 1-1 quer dizer que é obrigatória e aparecer somente uma vez, 1-3 quer dizer que ela é obrigatória, mas só precisa aparecer uma vez e pode aparecer até 3 vezes. Ou seja, o primeiro número corresponde a ocorrência mínima e o segundo número a ocorrência máxima;
  • Tam. (Tamanho) : Quantidade de caracteres que deve ter a tag. Pode ser referenciado através de número mínimo e máximo, como na ocorrência (ex: 1-4, entre um e quatro caracteres) ou através de apenas um número, especificando que deve ter aquela quantidade exata de caracteres.
  • Dec. (Decimais) : Em caso de número, descreve a quantidade de casas decimais obrigatórias daquele número;
  • Descrição / Obsevações : Explica alguma regra específica que deve ser aplicada àquele valor da XML

Vale lembrar que nenhuma tag pode ficar vazia. Se a tag não for obrigatória, ela simplesmente não deve ser impressa na XML.

Fique muito atento que as vezes, no banco, pode aparecer caracteres especiais (como tabulação) e deixar uma tag vazia, mesmo quando você fizer um < if (campo.valor == “” || campo.valor == null): break;>, para impedir que a tag não seja impressa.

Os Webservices

A Sefaz trabalha com Webservices XML. Há webservices específicos para homologação, produção e contingência (casos em que webservices principais estejam fora do ar). A maioria dos estados possuem os próprios webservices, outros usam os de outros estados.

Você pode verificar os links nos sites da Sefaz Nacional do NFe e do CTe. Os links para os serviços das NFEs são disponibilizados por seus municípios.

Quando você vai enviar uma XML de nota ou conhecimento para a Sefaz, você não envia somente a XML da nota, como também para verificar o status do serviço, consulta, cancelamento, etc. Essas XMLs possuem as informações necessárias para o servidor da Sefaz saber qual função o sistema deverá executar e os parâmetros necessários para uma resposta correta.

Validação da XML e Schemas

Schemas são arquivos XML que servem como base para validação de um outro XML. Os schemas descrevem as regras de validação baseadas, principalmente, em expressões regulares. Você deve passar pelo schema para validar a XML antes de ir enviar para a Sefaz. No entanto, quando a XML passar pelo webservice, ela passará pelo mesmo schema e dará uma resposta, porém essa resposta as vezes não vem completa e é necessário validar “no olho”.

Para facilitar, você pode colar a XML da sua nota pelo validador da Sefaz Virtual do Rio Grande do Sul. Irá funcionar para qualquer estado.

Obs. As vezes o validados do RS fica dando problema e não consegue validar. Basta recarregar a página que o problema tende a desaparecer.

Você pode baixar os schemas diretamente no site da Sefaz. Para NFSe, você vai ter que consultar, novamente, a Sefaz do município.

Comunicação

Por padrão, a comunicação ao Sefaz é feita através do protocolo SOAP 2. Ao montar a comunicação você deverá passar a URL do webservice, o caminho do certificado digital, a senha do certificado, a url de status e as XMLs necessárias para executar a tarefa que deseja. Erros durante a comunicação são comuns, principalmente quando há algum problema com o certificado digital ou quando o webservice da Sefaz encontra-se fora do ar.

Sempre verifique se o webservice o qual esteja tentando comunicação está no ar através dos sites da SEFAZ nacional no menu “Verificar Disponibilidade”.

Obs. Lembre-se de sempre colocar ?WSDL no final das URLs dos webservices (sim, a Sefaz usa servidores Windows).

Certificado Digital

O certificado digital é um documento criptografado que possui a assinatura da empresa. O certificado serve para autenticar a XML enviada como sendo realmente pertencente a empresa emissora da nota. Toda XML deve ser assinada através do certificado digital.

O certificado usado na Nota Fiscal Eletrônica e no Conhecimento de Transporte Eletrônico é o do tipo A1 e pode ser adquirido através de autoridades certificadoras autorizadas pela Sefaz, como por exemplo o Serasa. Os certificados são comprados pelas empresas emissoras de nota e podem ser utilizados para várias filiais da mesma empresa.

Vale salientar que os certificados são emitidos no padrão PKCS#12 (.pfx) e quem usa servidores Linux/Unix/Mac devem converter os certificados para PEM (.pem). Para isso há conversores online ou você pode fazer diretamente pelo Terminal através do openssl.

Obs. Sempre abra os arquivos PEM em um editor de texto e verifique os Bag Attributes e todas as Keys estão preenchidas, pois as vezes elas não estão com esses valores e isso causa erros sem resposta.

Homologação, Produção e Contingência

Após o possuir o certificado, o contador da empresa emissora do NFe/CTe deve, junto a Sefaz de seu estado, autorizar a empresa para ambiente de homologação (ou seja, ambiente de testes), a autorização sai em torno de 24 horas depois do pedido feito pelo contador. Cada filial deverá ter autorizada e homologada individualmente, porém o certificado, como dito antes, pode ser o mesmo.

No ambiente de homologação, o sistema deve estar configurado com os webservices de homologação do estado da empresa (homologação NFe, homologação CTe). A XML deve estar preenchida com os dados de homologação. Verifique a parte de homologação no manual para entender como devem ser esses dados.

Após a autorização de homologação, você deve fazer a emissão e autorização de no mínimo 10 notas/conhecimentos, 5 cancelamentos e 5 inutilizações (falaremos disso abaixo). Somente após fazer isso, você pode pedir para o contador autorizar a empresa a emitir nota em ambiente de produção. Faça quantos testes forem necessários até sentir-se seguro. Erros em Notas podem causar problemas muito sérios para as empresas, principalmente quanto a sonegação de impostos.

Lembre-se de, quando passar a nota para o ambiente de produção, mudar os webservices para o ambiente de produção. O tempo para autorizar a empresa para o ambiente de produção é de mais 24 horas.

Obs. Se a empresa estiver com dívidas muito altas de impostos ou algum problema de cadastro e atualização de dados na Sefaz, você pode ter problemas durante a emissão da nota/conhecimento. Nesse caso, consulte o contador ou administrador da empresa para que ele tome as devidas providências. Como é um erro sem retorno, no caso de suspeitar desse problema, consulte o e-CAC.

No caso dos webservices estarem fora do ar ou a empresa não disponibilizar de internet naquele momento, é necessário emitir a Nota Fiscal em contingência. Há ao todo 3 formas de continência. Os servidores de contingência estão disponíveis no site da Sefaz Nacional. Exceto no caso do emitente estar sem internet, o próprio servidor de continência envia os dados da NFe/CTe para a Sefaz Nacional. Isso pode demorar cerca de 2 horas depois que o servidor do estado voltar ao normal.

Emissão da Nota/Conhecimento Eletrônico

Para poder emitir uma Nota ou Conhecimento, você precisará gerar uma chave única para esta. A chave é gerada a partir da seguinte lógica:

O dígito verificador é um número que é gerado por um algoritmo específico a partir do número restante. Basicamente, multiplica-se o número da base pelos decimais equivalentes de 2 a 9, soma o resultado e pega o resto da divisão do resultado pro 11, por fim, pega o 11 e subtrai o resto. Se o resultado for 10, deve-se pássaro 0. É fácil encontrar o algoritmo para a linguagem que você trabalha no Google. Abaixo o código em PHP.

function calculadDigitoVerificador($chave43) {

   $multiplicadores = array(2,3,4,5,6,7,8,9);

   $i = 42;

   while ($i >= 0) {

       for ($m=0; $m<count($multiplicadores) && $i>=0; $m++) {

           $soma_ponderada+= $chave43[$i] * $multiplicadores[$m];
           $i--;

       }

   }

   $resto = $soma_ponderada % 11;

   if ($resto == '0' || $resto == '1') {

       return 0;

   } else {

       return (11 - $resto);

  }

}

tabela-chave-acesso-dv

Com a chave de 44 caracteres pronta e a XML preenchida corretamente, você já pode emitir a Nota Fiscal / Conhecimento Transporte. Você receberá como resposta a XML validada e o retorno  da Sefaz avisando se a nota foi autorizada, denegada (quando há algum problema com o emitente)  ou rejeitada e precisa ser corrigida.

Lembre-se que esses documentos fiscais devem seguir uma seqüência numérica que deve ser usada dentro de cada série.

Obs. Os CTe’s não são emitidos por agências, mas sim por filiais, por isso fique atento a sequência numérica.

Consulta

Você pode consultar a nota / conhecimento através do site da Sefaz Nacional ou diretamente na Sefaz de seu estado. Para isso, basta você entrar com o número da chave.

Há um webservice específico para consulta para permitir que o seu sistema mostre para o usuário a situação daquele documento.

Vale lembrar que se você for consultar na Sefaz Nacional pode ser que a nota não apareça em até cerca de duas horas após a emissão. A consulta feita na Sefaz estadual tende a ser na hora.

Carta de Correção

A carta de correção é um documento fiscal que faz adendos a uma nota fiscal/cte emitida. Esse documento anexa informações ao documento dentro da Sefaz. Para o sistema, será emitido um novo XML de resposta contendo as informações da correção.

Alguns estados não permitem a emissão da correção. No caso, o usuário deverá cancelar o documento e emitir outro.

Cancelamento

Se uma compra for cancelada ou houver um erro que não pode ser resolvido através da carta de correção, você pode fazer o cancelamento da Nota/Conhecimento através do webservice de EVENTO, passando a função de cancelamento.

Geralmente, você tem até 24 horas para cancelar uma Nota Fiscal Eletrônica a partir da hora de emissão da mesma. Porém, alguns estados só permitem o cancelamento em até 3 horas. Para o CTe há uma semana de prazo de cancelamento.

Em caso de necessitar cancelar a nota ou cte após o prazo terminado, avise ao contador da empresa emissora. Este deverá enviar um documento a Sefaz do estado para resolver o problema e uma pequena taxa deverá ser cobrada.

Inutilização

Se por algum motivo você precisar pular o número de uma nota, seja por esquecimento, erro no sistema, etc., você deverá inutilizar aquele número.

A Nota/CTe segue um número contínuo dentro de cada série. Por isso, utilize o webservice de inutilização para pular algum número da sequência. Alguns estados não possuem servidor de inutilização (consulte o site da Sefaz Nacional), nesse caso, consulte o contador da empresa emitente e ele deverá enviar um documento para a Sefaz, em papel, para inutilizar esses números.

DANFE/DACTE

O Danfe / Dacte são os documentos impressos NÃO FISCAIS contendo a informação das Notas/Conhecimento. Descrevo o não fiscal porque o que tem realmente valor fiscal são as XMLs que devem ser salvas por 5 anos. No entanto o Danfe é necessário para o emissor da nfe passar os dados da nota impressos para o cliente. Já o Dacte é OBRIGATÓRIO que o motorista/piloto/ferroviário ande junto com os Danfes dos produtos que estão sendo transportados.

Nos manuais da Sefaz há descrições de que como deve ser o leiaute do Danfe/Dacte. Estes nada mais são do que uma apresentação impressa e legível dos dados da XML. Você pode usar o DOM Document sem problema para ler a XML e gerar o seu arquivo PDF.

Bibliotecas Prontas

Como as comunidades de programadores são enormes, há bibliotecas para as principais linguagens que possibilitam a rápida implementação de NFe, NFs e CTe no seu sistema. Porém mesmo com essas bibliotecas, diversas modificações são necessárias, principalmente quando sai uma nova nota técnica.

Se você conhecer outras bibliotecas, por favor deixe nos comentários para que eu possa atualizar o post.

Erros Freqüentes

Abaixo uma lista com algumas soluções dos erros mais freqüentes duvidosos, ou seja, que a resposta da Sefaz não deixa clara. Se você encontrar um erro que conseguiu solucionar, por favor deixe nos comentários para que possamos atualizar o post:

  • Validação de XML – São os erros mais comuns. Geralmente possuem uma resposta com o nome da tag e a descrição que leva a expressão regular pelo esquema. A grande maioria das vezes são causadas por caracteres especiais ou problemas de validação no sistema para o preenchimento de dados ou por tags vazias. Solução: converta todas as suas strings para UTF8 e faça um “trim” para retirar espaçamentos em branco. Uma boa dica é retirar qualquer acento, til, caracteres especiais para evitar erros. Verifique também se o valor do campo da XML condiz com o descrito na tabela de laioute;
  • Servidor da Sefaz Não Responde – Esse erro acontece normalmente quando o servidor da Sefaz está instável ou fora do ar. Verifique no Site da Sefaz Nacional a disponibilidade do servidor. Pode acontecer caso você tenha preenchido errado a URL do Webservice;
  • Emissor não autorizado para emitir em ambiente de (…) – Acontece caso a empresa não esteja autorizada no ambiente que está tentando emitir ou quando você erra a URL do webservice de seu estado.
  • Sem resposta – Os erros sem resposta costumam acontecer quando há um problema antes da comunicação. É mais comum acontecer quando há algum erro no certificado ou quando a URL do Webservice está preenchida errado. Verifique o certificado e o webservice de acordo com o descrito acima neste artigo. Instale o certificado na sua máquina e verifique pela URL do webservice se ela está acessível;
  • Erros de comunicação / Não consegue acessar – Erro comum quando a senha do certificado está errada ou há um problema no certificado, como o descrito acima neste artigo. Verifique também se a XML está com o ambiente correto. Esse erro também pode acontecer quando a empresa está com algum problema junto a Sefaz;
  • Hora de cancelamento anterior a hora de emissão – Esse erro é muito comum em servidores com os horários mal configurados. Por padrão, um servidor deve ter a sua hora configurada pelo GMT – 3 horas (ou 4 horas, dependendo da região do Brasil) mais o horário de verão (se  houver na região). Você pode até forçar isso via código, entretanto, alguns servidores mal configurados, ao invés de especificar a região (América do Sul/Brasil) podem estar com o horário do GMT errado contando já com menos 3 horas. Para resolver o problema (quando não tens acesso ao servidor), force, via código, a configurar o GMT correto e marcar como America do Sul Brasil. Em último caso, use o horário a partir da internet.

Vale lembrar que em breve todos os estados terão que usar também o NFCe, a Nota Fiscal de Consumidor Final Eletrônica. Essa nota substitui os cupons fiscais e apenas deverá ser impresso a descrição, o link e o QRCode para acesso do contribuinte. Os estados estão adotando o NFCe aos poucos no ano de 2016.

Dúvidas?
Entre em um de nossos grupos ou deixe um comentário:

Grupo no Facebook Grupo no Telegram
Entre para o Grupo Design e Programação no Telegram