Blog

Gerando uma NF-e/NFC-e com a API da SEFAZ

O processo resumido de geração de uma nota fiscal usando nossa API é descrito abaixo. Dúvidas e referências devem ser consultadas no material oficial disponibilizado pela SEFAZ,  em especial o manual oficial da SEFAZ, Notas técnicas e os XSDs disponibilizados no site: http://www.nfe.fazenda.gov.br/portal/principal.aspx .

Parte 1 – Gerando o XML

  1. Crie um conector:
    1. Caso o certifcado não tenha explicito o CNPJ e Nome do emissor utilize a função: SEFAZ – Definir dados do emissor(…).

      Dados básicos

  2. Crie uma nova nota fiscal para o lote através da função “SEFAZ NF-e – Criar Nota Fiscal“, passando os seguintes parâmetros:
    1. Conector;
    2. Data de Emissão (Data)
    3. Modelo (Letras) – “55” para NF-e ou “65” para NFC-e;
    4. Série (Letras) – Série do documento;
    5. Nº da NF-e (Letras) – Número sequencial da nota, controlado pelo emissor;
    6. Tipo de Emissão (Inteiro);
    7. Código numérico que compõe a Chave de Acesso (Letras) cNF – Identificador único da nota no banco de dados do cliente;
    8. Versão (Letras) do XML da NF-e, EX: “4.00”, “3.10”.
  3. Utilize a função “SEFAZ NF-e – Adicionar Elemento ao XML” para adicionar os dados do XML do documento. A função recebe como parâmetro os seguintes itens:
    • O retorno da função “SEFAZ NF-e – Criar Nota Fiscal“;
    • No segundo parâmetro ela recebe o caminho da tag a ser adicionada;
    • No terceiro o valor a ser adicionado;
    • E por último, como OPCIONAL a máscara de formatação, caso não deseja que a função formate o valor adicione a constante “TString” nesse parâmetro.
  4. Adicionar os dados do emitente (“infNFe/ide/”) usando a função “SEFAZ NF-e – Adicionar Elemento ao XML“;
  5. Algumas UFs exigem a relação de pessoas (físicas ou jurídicas) autorizadas a acessar a nota, para tal usar as tags abaixo para preencher esse item:
    • infNFe/autXML/CNPJ[x]

    • infNFe/autXML/CPF[x]

    Se não informada você receberá uma mensagem de erro: Rejeição 486: Não informado o Grupo de Autorização para UF que exige a identificação do Escritório de Contabilidade na Nota Fiscal

  6. Se for uma nota de devolução informe a NF-e referenciada usando as tags:
    "infNFe/ide/NFref/refNFe[x]";
  7. Adicione os dados do destinatário (“infNFe/dest/”);

    Produtos/Serviços

  8. Utilizando a mesma função “SEFAZ NF-e – Adicionar Elemento ao XML“, adicione os CNPJs ou CPFs autorizador a baixar o XML usando a tags de “infNFe/autXML/CNPJ[x]” ou “infNFe/autXML/CPF[x]”, passando o número no lugar do x (1, 2, 3, …). Importante, esta tag é obrigatória em algumas UFs:
  9. Adicionar itens (produtos ou serviços) usando a mesma função de definit tag passando o indice do item, ‘infNFe/det[“@nItem=1”];’.
  10. Definindo o ICMS:
    1. Observe o ICMS40 (e outros na mesma situação), o nome da tag não muda para as variações 40, 41, 50 e 51, a tag continua se chamando “ICMS40” e o detalhamento é feito no “CST”.
    2. Dica: A tag “infNFe/det[X]/imposto/ICMSUFDest/pICMSInter” recebe constantes pré-definidas. “4.00”, “7.00” e “12.00”, e não está definida como número e sim como letras (‘string’) nos XSDs da SEFAZ. Assim, o valor já deve vir formatado com 2 decimais, pois não será feita nenhuma formatação automática neste valor.

    Totais

  11. Dados de cobrança:
    • infNFe/cobr/dup[1]/nDup
    • infNFe/cobr/dup[1]/dVenc
  12. Adicione os detalhes de pagamento. Para adicionar mais de uma tag indique o indice usando colchetes como no exemplo a seguir:
    • Versão 4.00:
      • infNFe/pag/detPag[1]/tPag
      • infNFe/pag/detPag[1]/vPag
      • infNFe/pag/detPag[2]/tPag
      • infNFe/pag/detPag[2]/vPag
      •  
    • Versão 3.10:
      • infNFe/pag[1]/tPag
      • infNFe/pag[1]/vPag
      • infNFe/pag[2]/tPag

Montando o lote e assinando

  1. Após informar todos os dados utilize a função “SEFAZ NF-e – Montar Lote” para gerar o XML:
    1. Conector (Variante) – Veja como criar um conector aqui;
    2. Versão: Versão do lote “4.00”, “3.10”;
    3. ID do lote: Identificador único, incremental do lote;
    4. Sincrono – Importante, nem todas as UFs disponibilizam esse serviço, caso não o tenha, informe falso, outras exigem que seja verdadeiro (true), quando houver apenas uma nota no lote;
    5. Nota fiscal (Variante) – Uma única, ou uma lista de NFs para serem emitidas.
  2. Ao final assine o XML, chamando a função “SEFAZ – Assinar XML“. e passando os seguintes parâmetros:
    1. Conector (Variante);
    2. XML Original – (Letras) Texto do XML gerado;
    3. Nome da tag: Informar a constante Letras: “infNFe”.
  3. Obter o retorno da função com o XML assinado e gravar em arquivo ou no banco usando as funções  nativas do Maker:
    1. DICA: Para gravar no banco utilize um campo de texto longo (TEXT, CLOB) com o mesmo charset do XML (UTF-8) ou BLOB (Bytea, VARBINARY, Image, …);

Parte 2 – Transmitindo o XML

  1. Após montar todo o XML  de um lote com a Nota Fiscal desejada precisamos envia-la para SEFAZ, para isso se utiliza a função “SEFAZ NF-e – Obter Autorização da SEFAZ“;
  2. Por fim, grave a resposta em XML da SEFAZ. Ela será usada na consulta da NF-e;
  3. Obter o XML retornado no envio da NF-e verificar o seu conteúdo;
  4. Usar a função “SEFAZ – Processar XML de Retorno” para verificar se retornou um “nRec” para consulta posterior, ou um erro a ser tratado;
    • Esta função trabalha de forma análoga à de montagem de XML, assim, as tags são reduzidas a uma forma de estrututra de pastas, de acordo com a estrtutura do XML, assim, para pegr o nRec por exemplo se passa o caminho completo: “retEnviNFe/infRec/nRec”;
    • DICA: Utilize o depurador de fluxos do Maker para ver exatamente os dados retornados por essa função.

Parte 3 – Consultando a situação do lote

  1. Após obter o retorno da autorizadora você terá o número do recibo de entrega (nRec) dentro do XML retornado;
  2. Para extrair o nRec do XML você pode utilizar a função “SEFAZ – Processar XML de Retorno” com o XML retornado no envio do lote;
  3. Utilize o nRec para gerar o XML de consulta da autoriação, passando-o como o segundo parâmetro da função “SEFAZ – NF-e – Consulta Autorização Montar XML(transporte, nRec)”, o primeiro parâmetro será um conector criado com os mesmos dados do envio;
  4. Depois de montado, use a função “SEFAZ NF-e – Consultar Autorização” para enviar a consulta da situação do lote para o servidor da SEFAZ, passando o Conector e o XML de consulta;
  5. A resposta irá indicar a situação da NF-e, use a função “SEFAZ – Processar XML de Retorno” para transformar o XML em um mapa;
  6. Leia o item “retConsReciNFe/cStat” para saber a situação do lote:
    1. 105 – Em processamento, aguarde e tente novamente;
    2. 104 – Processado, continue ou caso contrário houve um erro.
  7. Após o fim do processamento (cStat = 104), leia o item “retConsReciNFe/protNFe/infProt/cStat” para saber a situação do protocolo:
    1. Caso a situação seja “100” o lote foi aprovado, caso contrário houve um erro;
  8. Em caso de erro, leia o item “retConsReciNFe/protNFe/infProt/xMotivo” para obter uma descrição do erro.
  9. Em caso de lote aprovado (infProt/cStat = 100) salve o XML completo, pois ele contém os dados da autorização que serão utilizado na montagem do XML de distribuição.

Parte 4 – XML de distribuição

  1. Para montar o XML de distribuição será utilizada a função “SEFAZ – Montar XML de distribuição“, os parâmetros de entrada são:
    1. O XML do lote enviado;
    2. O XML retornado na consulta da situação do lote;
    3. A chave da NF-e desejada, quando o lote contém mais de uma NF-e se deixar em branco irá pegar a primeira;
    4. A função irá retornar o XML de distribuição que pode ser usado para enviar ao cliente e/ou gerar a DANFE.

Parte 5 – Gerar DANFE

  1. Para gerar a DANFE em PDF utilize a função “SEFAZ NF-e – Gerar DANFE”, passando como parâmetros:
    1. Caminho completo do arquivo XML de distribuição ou conteúdo do XML de distribuição (Letras);
    2. Caminho da logomarca a ser impressa (Letras), pode ser deixado em branco;
    3. cIdToken (Letras) – Usado na NFC-e apenas (Opcional);
    4. csc (Letras) – Usado na NFC-e apenas (Opcional).
  2. DICA: Você pode obter o caminho relativo do PDF gerado através da seguinte sequencia:
    1. Remova o caminho absoluto do arquivo obtendo somente o nome;
    2. Adicione antes do nome do arquivo “tmp/”;
    3. A URL final deve ficar “tmp/nomeArquivo.pdf”;
    4. Use a função de abrir URL numa moldura, ou download para enviar para o cliente.

Leave a comment