Emitindo NFe via ASP.NET

Ricardo Acras

Tutorial completo de integração do Focus NFe com a linguagem ASP.NET. Nosso cliente Felipe Freitas integrou o seu sistema com o nosso em poucas horas. Veja como ele fez isso!

Conteúdo

Tutorial completo de integração do Focus NFe com a linguagem ASP.NET.

Nosso cliente Felipe Freitas além de integrar o seu sistema com o nosso em poucas horas, ainda reservou um tempinho para escrever um tutorial completo de como integrar um sistema escrito em ASP.NET com o Focus NFe. Muito obrigado Felipe pela sua contribuição! Segue o texto do Felipe:

Para emitirmos uma NFe usando ASP.NET MVC com C#, precisaremos de uma biblioteca para fazer a serialização, um objeto em YAML, que é um dos formatos que a API do Focus NFe aceita. (Site da biblioteca: http://www.aaubry.net/page/YamlDotNet)

Vamos abrir o Visual Studio e criar um projeto. Para este exemplo irei utilizar a versão 2013 Ultimate.

1 – Vá para a guia File > New Project
Na lista de Templates escolha Visual C# > Web e escolha o template ASP.NET Web Application e dê um nome de sua preferência ao projeto, no nosso caso usaremos FocusNFeApi. Clique em OK e escolha a opção MVC e clique em OK novamente.

3 – O Primeiro passo será instalar a biblioteca, que está disponível como um pacote NuGet. Abra o Package Manager Console e digite:
Install-Package YamlDotNet

2 – Abra a View Index.cshtml do Controller Home e deixe-a dessa maneira:

@{
  ViewBag.Title = "Home Page";
}

@ViewBag.Retorno

@using (Html.BeginForm("EmitirNFe", "Home")){
  @:REF: @Html.TextBox("referencia") ;
}

@using (Html.BeginForm("ConsultarStatusNFe", "Home")){
  @:REF: @Html.TextBox("referencia") 
}

Caminho DANFE: @ViewBag.caminhoDanfe
Caminho XML: @ViewBag.caminhoXML
Chave NFe: @ViewBag.chaveNFe
Mensagem SEFAZ: @ViewBag.mensagemSefaz
Numero NFe: @ViewBag.numeroNFe
Status: @ViewBag.status
Código Status: @ViewBag.codigoStatus

3 – Abra o HomeController.cs e defina as seguintes variáveis globalmente dentro do Controller:

  static string focusToken = "token_recebido_do_suporte";
  static string ambienteFocus = "homologacao"; //homologacao ou producao
  static string autorizarNFe = "http://" + ambienteFocus + ".acrasnfe.acras.com.br/nfe2/autorizar?token=" + focusToken + "&ref=";
  static string consultarStatusNFe = "http://" + ambienteFocus + ".acrasnfe.acras.com.br/nfe2/consultar?token=" + focusToken + "&ref=";

4 – Crie a primeira Action com atributo HttpPost que vai receber uma string com a referência da NFe que estamos emitindo. Nesse caso para exemplificação criamos apenas um TextBox onde digitaremos manualmente essa referência.

Passaremos as informações contidas na nota fiscal todas manualmente, nessa altura você já deverá ter essas informações no seu banco de dados para que possa recuperá-las e inserir cada dado em sua posição, inclusive o número de referência que deverá ficar salvo para podermos consultar o resultado de retorno da NFe na API futuramente.
Para nosso exemplo deixe sua Action desta Maneira (lembre-se de considerar tratamentos de erro, pois não implementamos em nosso exemplo):

[HttpPost]
public ActionResult EmitirNFe(int referencia){
  var dadosNFe = new{
    //Dados NFe
    natureza_operacao = "Venda",
    forma_pagamento = "0",
    data_emissao = DateTime.Now.ToString("yyyy-MM-dd"),
    tipo_documento = "1",
    finalidade_emissao = "1",
    //Dados emitente
    cnpj_emitente = "SEU_CNPJ",
    nome_emitente = "RAZÃO SOCIAL DO EMITENTE",
    logradouro_emitente = "RUA COELHO LISBOA",
    numero_emitente = "501",
    bairro_emitente = "TATUAPÉ",
    municipio_emitente = "SÃO PAULO",
    uf_emitente = "SP",
    cep_emitente = "03323040",
    telefone_emitente = "11999999999",
    inscricao_estadual_emitente = "SUA_INSCRICAO_ESTADUAL",
    regime_tributario_emitente = "1",
    //Dados destinatário
    cpf_destinatario = "",
    cnpj_destinatario = "CNPJ _DESTINATARIO",
    inscricao_estadual_destinatario = "INSCRICAO_ESTADUAL_DESTINATARIO",
    nome_destinatario = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
    logradouro_destinatario = "AV PAULISTA",
    numero_destinatario = "1000",
    bairro_destinatario = "1159",
    municipio_destinatario = "SÃO PAULO",
    codigo_municipio_destinatario = "3550308",
    uf_destinatario = "SP",
    cep_destinatario = "01310100",
    pais_destinatario = "BRASIL",
    telefone_destinatario = "11988888888",
    email_destinatario = "email@email.com.br", //O sistema FocusNFe enviará a nota fiscal para o e-       mail passado aqui
    //Totais
    icms_base_calculo = "0.00",
    icms_valor_total = "0.00",
    icms_base_calculo_st = "0.00",
    icms_valor_total_st = "0.00",
    valor_produtos = "100.10",
    valor_frete = "0.00",
    valor_seguro = "0.00",
    valor_desconto = "0.00",
    valor_total_ii = "0.00",
    valor_ipi = "0.00",
    valor_pis = "0.00",
    valor_cofins = "0.00",
    valor_outras_despesas = "0.00",
    valor_total = "100.10",
    modalidade_frete = "1",
    informacoes_adicionais_contribuinte = "DOCUMENTO EMITIDO POR ME OU EPP OPTANTE PELO SIMPLES    NACIONAL",
    items = new List<object>{}
  };

  dadosNFe.items.Add(new{
    //Informações do produto
    numero_item = "1",
    codigo_produto = "19999/A",
    descricao = "Placa de homenagem 14x10cm",
    codigo_ncm = "73269090",
    cfop = "5102",
    unidade_comercial = "PÇ",
    quantidade_comercial = "1",
    valor_unitario_comercial = "100.10",
    unidade_tributavel = "PÇ",
    quantidade_tributavel = "1",
    valor_unitario_tributavel = "100.10",
    valor_bruto = "100.10",
    inclui_no_total = "1",
    //Impostos
    icms_origem = "0",
    icms_situacao_tributaria = "101",
    icms_aliquota = "1.25",
    icms_valor = Math.Round((1.25 / 100) * 100.10, 2).ToString("0.00", CultureInfo.InvariantCulture),
    pis_situacao_tributaria = "07",
    cofins_situacao_tributaria = "07"
  });

  StringWriter sw = new StringWriter();
  //A classe Serializer é Da biblioteca YamlDotNet, ela escreve o YAML na
  //StringWriter passada no método Serialize.
  var serializer = new Serializer();
  serializer.Serialize(sw, dadosNFe);

  //A API precisa receber as informações com codificação UTF8.
  //Convertemos a string para byte[] para podermos enviar com o método
  //UploadData da classe WebClient;
  byte[] bytes = System.Text.Encoding.UTF8.GetBytes(sw.ToString());

  using (WebClient webClient = new WebClient()){
    //Envia as informações para a URL de autorização da API
    webClient.UploadData(autorizarNFe + referencia, "POST", bytes);
  }

  ViewBag.Retorno = "Nota Fiscal enviada com sucesso.";

  return View("Index");
}

5 – Neste ponto a implementação de envio já está funcionando, rode sua aplicação, preencha uma referência qualquer para sua NF-e e clique no botão Emitir Nota Fiscal Eletrônica. Após o envio das informações o sistema Focus NFe estará processando a autorização. Para sabermos o resultado devemos utilizar a URL de consulta da API, que já definimos com a variável “consultarStatusNFe” no item 3 deste exemplo.

Vamos então criar outra Action também com o atributo HttpPost que vai receber a string com a referência que utilizamos quando emitimos a NFe. Da mesma forma que a emissão, para exemplificação criamos apenas um TextBox na View onde digitaremos manualmente a mesma referência da nota que já emitimos.

[HttpPost]
public ActionResult ConsultarStatusNFe(int referencia)
{
  //Acessa a URL de consulta de status da API
  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(consultarStatusNFe + referencia);
  //Carrega o retorno num objeto HttpWebResponse
  HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  StringReader resultado;
  using (StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8))
  {
    //Lê o retorno e carrega na StringReader
    resultado = new StringReader(sr.ReadToEnd());
  }

  //Carregar o Stream no objeto do tipo YamlStream do componente YamlDotNet
  YamlStream yaml = new YamlStream();
  yaml.Load(resultado);

  //Examina o stream
  var mapping = (YamlMappingNode)yaml.Documents[0].RootNode;
  //Nesse ponto já conseguimos acessar o YAML de retorno
  ViewBag.caminhoDanfe = mapping.Children[new YamlScalarNode("caminho_danfe")].ToString();
  ViewBag.caminhoXML = mapping.Children[new YamlScalarNode("caminho_xml_nota_fiscal")].ToString();
  ViewBag.chaveNFe = mapping.Children[new YamlScalarNode("chave_nfe")].ToString();
  ViewBag.mensagemSefaz = mapping.Children[new YamlScalarNode("mensagem_sefaz")].ToString();
  ViewBag.numeroNFe = mapping.Children[new YamlScalarNode("numero")].ToString();
  ViewBag.status = mapping.Children[new YamlScalarNode("status")].ToString();
  ViewBag.codigoStatus = mapping.Children[new YamlScalarNode("status_sefaz")].ToString();

  return View("Index");
}

6 – Pronto, nossa aplicação está finalizada, faltando apenas implementar a emissão de carta de correção, cancelamento e inutilização de faixa de numeração, mas apenas com essas informações basta seguir a mesma linha para fazer o restante, atentando-se apenas que as URLs da API onde não precisamos enviar arquivos mas somente valores, como por exemplo a solicitação de carta de correção ou cancelamento, devemos enviar a solicitação da seguinte maneira:

  System.Collections.Specialized.NameValueCollection valores = new System.Collections.Specialized.NameValueCollection();
  valores.Add("correcao” , "Texto da correção");
  using (WebClient webClient = new WebClient()){
    webClient.UploadValues("http://producao.acrasnfe.acras.com.br/nfe2/emitir_cce?token=TOKEN&ref=REFERENCIA", valores);
  }

Quer integrar seu sistema para emissão de NF-e? Clique aqui, acesse nossa documentação e saiba tudo o que você para fazer a integração do seu sistema com a noss API.

Picture of Ricardo Acras

Ricardo Acras

20+ anos de experiência como desenvolvedor. Fundador e atual CEO do Focus NFe.

Inscreva-se em nossa newsletter​

Receba nossos conteúdos exclusivos em primeira mão.

Explore outros conteúdos:

O que é GNRE? Saiba quem precisa emitir e como gerar!
Nota Fiscal
Douglas Pinheiro

GNR-e: o que é, quem precisa emitir e como gerar

Durante operações de transporte interestaduais, determinados documentos são necessários, e a GNRE é um deles.
Assim como outros documentos, a exemplo do Conhecimento de Transporte Eletrônico (CTe), a Guia Nacional de Recolhimento de Tributos Estaduais (GNRE) deve estar presente junto à mercadoria durante o processo de carga, pois a ausência dela pode gerar complicações para a empresa transportadora.
Quer saber mais? Confira o artigo de hoje! Nele, falamos o que é a GNRE, qual a sua importância, como gerá-la e outras informações relevantes.

Leia mais »
calculadora sob uma mesa com papéis com anotações.
Nota Fiscal
Welker Zigante

O que é DIFAL do ICMS? Entenda como funciona e quem paga!

O termo Diferencial de Alíquota (DIFAL) se refere ao recolhimento do ICMS (Imposto sobre Circulação de Mercadorias e Serviços) e busca promover equidade tributária entre os estados brasileiros.

Empreendedores como proprietários de e-commerces que realizam compras fora do estado e vendem para consumidores finais, precisam considerar as variações nas alíquotas do ICMS entre os estados.

Logo, dada a complexidade dessa legislação, compreender o que é e como funciona o DIFAL pode ser desafiador, especialmente devido às diferentes alíquotas e leis em cada um dos 26 estados e no Distrito Federal relacionadas ao ICMS e aos produtos e serviços tributados.

Acompanhe o nosso post de hoje e compreenda melhor esse processo.

Leia mais »