Project

enotas_nfe

0.01
A long-lived project that still receives updates
E-Notas nfe gateway wrapper
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 2.2
~> 12.3
~> 3.0

Runtime

~> 1.0
~> 1.0, >= 1.0.5
 Project Readme

eNotas Gateway - Ruby

GEM não OFICIAL Ruby da API do eNotas Gateway, plataforma de emissâo automática de nota fiscal eletrônica de serviço (NFS-e), Produto (NF-e) e Consumidor (NFC-e).

Esse projeto foi um fork de -> https://github.com/12min/enotas-client

A documentação completa dos endpoints pode ser encontrada aqui: API NFS-e eNotas Gateway, e aqui API NF-e eNotas Gateway.

Mais detalhes: enotasgw.com.br

Exemplo em PHP para nfse pode ser encontrado aqui. - na biblioteca oficial.

Exemplo em PHP para nfe e nfce pode ser encontrado aqui. - na biblioteca oficial.

Exemplos diversos para emissão de nfe encontrado aqui. - na biblioteca oficial.

Instalação

Adicione o código abaixo ao Gemfile da sua aplicação:

gem 'enotas_nfe'

E execute:

$ bundle

Ou instale manualmente:

$ gem install enotas_nfe

Cadastro de empresa (emissor)

  • Instancie o cliente passando a sua API key:
client = EnotasNfe::Client.new('sua-api-key-do-e-notas', 'nfse')
  • Carregue uma instância de Empresa com os dados:
empresa = EnotasNfe::Model::Empresa.new
empresa.id = 1 # Usado para quando se deseja atualizar o cadastro
empresa.cnpj = '000000000000000'
empresa.nomeFantasia = 'Nome Fantasia'
empresa.razaoSocial = 'Razão Social'
empresa.inscricaoMunicipal = '00000000'
empresa.inscricaoEstadual = '00000000'
empresa.telefoneComercial = '00000000'
empresa.email = 'email@mail.com'
empresa.enviarEmailCliente = false
empresa.regimeEspecialTributacao = '01'
empresa.aedf = '00000'
empresa.descricaoServico = '00'
empresa.codigoServicoMunicipal = '00'
empresa.cnae = '000000'
empresa.aliquotaIss = '0.00'
empresa.optanteSimplesNacional = true
empresa.incentivadorCultural = false
empresa.itemListaServicoLC116 = '0.00'
empresa.endereco = {
  logradouro: 'Logradouro',
  complemento: 'Complemento',
  numero: '1000',
  bairro: 'Centro',
  cidade: 'Cidade',
  codigoIbgeCidade: 666999,
  uf: SC,
  cep: 00000000
}
empresa.configuracoesNFSeProducao = {
  serieNFe = 'NFe',
  sequencialNFe = 1,
  sequencialLoteNFe = 1,

  # Esses dados variam de acordo com a prefeitura, verifique a necessidade no endpoint de cidades suportadas
  usuarioAcessoProvedor = 'user',
  senhaAcessoProvedor = 'pass',
  tokenAcessoProvedor = 'super-token'
}
empresa.configuracoesNFSeHomologacao = {
  serieNFe = 'NFe',
  sequencialNFe = 1,
  sequencialLoteNFe = 1,

  # Esses dados variam de acordo com a prefeitura, verifique a necessidade no endpoint de cidades suportadas
  usuarioAcessoProvedor = 'user',
  senhaAcessoProvedor = 'pass',
  tokenAcessoProvedor = 'super-token'
}

Como saber quais dados são obrigatórios em um prefeitura, ou se a prefeitura é suportada pelo Enotas?

response = client.get_caracteristicas_prefeitura('codigo-ibge-cidade')

Caso a prefeitura não seja suportada, o response vai ter uma mensagem de erro, informando. Quando é suportada, retorna dados relevantes sobre a prefeitura, que devem ser usados para auxiliar a formação do objeto empresa:

prefeitura = EnotasNfe::Model::CaracteristicaPrefeitura.new(response)

# 0: Nenhuma
# 1: Certificado
# 2: Usuário e Senha
# 3: Token
prefeitura.tipoAutenticacao

# 0: Não utiliza
# 1: Opcional
# 2: Obrigatória
prefeitura.assinaturaDigital

prefeitura.usaCNAE
prefeitura.usaItemListaServico
prefeitura.campoLoginProvedor
prefeitura.suportaCancelamento
prefeitura.usaAEDF
prefeitura.usaRegimeEspecialTributacao
prefeitura.usaCodigoServicoMunicipal
prefeitura.usaDescricaoServico
prefeitura.usaCNAE
prefeitura.usaItemListaServico
prefeitura.helpTipoAutenticacao
prefeitura.helpInscricaoMunicipal
prefeitura.helpRegimeEspecialTributacao
prefeitura.helpCodigoServicoMunicipal
prefeitura.helpDescricaoServico
prefeitura.helpCNAE
prefeitura.helpItemListaServico
prefeitura.suportaEmissaoNFeSemCliente
prefeitura.suportaEmissaoNFeClienteSemCpf
prefeitura.suportaEmissaoNFeClienteSemEndereco
prefeitura.suportaCancelamentoNFeSemCliente
prefeitura.suportaCancelamentoNFeClienteSemCpf

# Retorna uma lista com os regimes de tributação suportados pela prefeitura
prefeitura.regimesEspecialTributacao
  • Salve:
client.create_update_empresa(empresa)

No caso de sucesso dessa operação, será retornado o campo empresaId, que deve ser informado, quando deseja ser atualizado um cadastro, ou nos endpoints de Upload.

Upload do certificado

certificate = {
  arquivo: 'arquivo-de-upload',
  senha: 'pass'
}

client.set_certificado_digital('empresaId', certificate)

Upload da logo

logo = {
  arquivo: 'arquivo-de-upload'
}

client.set_logo('empresaId', logo)

Uso básico para NFSE

  • Instancie o cliente passando sua API key:
client = EnotasNfe::Client.new('sua-api-key-do-e-notas', 'nfse')

Agora já podemos emitir uma nota!

  • Emitindo uma nova nota de SERVIÇO:
nfe = EnotasNfe::Model::Nfe.new
nfe.tipo = 'NFS-e'
nfe.idExterno = '1'
nfe.ambienteEmissao = 'Homologacao'

nfe.cliente = {
  nome: 'Luis Fernando Pimenta',
  email: 'email@luispimenta.me',
  cpfCnpj: '33199707807'
}

nfe.cliente.endereco = {
  uf: 'PR',
  cidade: 'Curitiba',
  logradouro: 'Rua 01',
  numero: '112',
  bairro: 'Centro',
  cep: '80000000'
}

nfe.enviarPorEmail = true

nfe.servico = {
  descricao: 'Reparo em computador',
  aliquotaIss: 5,
  issRetidoFonte: true,
  descricaoServicoMunicipio: "Reparo em computador",
  ufPrestacaoServico: "PR",
  municipioPrestacaoServico: "Curitiba",
  valorCofins: 0,
  valorCsll: 0,
  valorInss: 0,
  valorIr: 0,
  valorPis: 0
}

nfe.valorTotal = 1.00

#enviando a nota
client.nfse_create('id-da-empresa-no-enotas', nfe)
client.nfse_delete('id-da-empresa-no-enotas', id-da-nota)

Uso básico para NFE

  • Instancie o cliente passando sua API key:
client = EnotasNfe::Client.new('sua-api-key-do-e-notas', 'nfe')

Agora já podemos emitir uma nota!

  • Emitindo uma nova de VENDA de produto - NFe:
nfe = EnotasNfe::Model::Nfe.new
nfe.id = '1'
nfe.ambienteEmissao = "Homologacao" # "Producao" ou "Homologacao"
nfe.naturezaOperacao = 'Venda'
nfe.finalidade = 'Normal'
nfe.consumidorFinal = true
nfe.indicadorPresencaConsumidor = true

nfe.cliente = {
  tipoPessoa: 'F',
  indicadorContribuinteICMS: "NaoContribuinte",
  nome: 'Luis Fernando Pimenta',
  email: 'email@luispimenta.me',
  cpfCnpj: '33199707807',
  telefone: '19981328642',
  inscricaoMunicipal: '',
  inscricaoEstadual: '',
}

nfe.cliente.endereco = {
  uf: 'PR',
  cidade: 'Curitiba',
  logradouro: 'Rua 01',
  numero: '112',
  bairro: 'Centro',
  cep: '80000000'
}

#se tiver frete
nfe.transporte = EnotasNfe::Model::Transporte.new
nfe.transporte.frete = {
  modalidade: "PorContaDoEmitente",
  valor: 20.00
}

nfe.enviarPorEmail = true

produto = EnotasNfe::Model::Produto.new
produto.cfop = "5101"
produto.codigo = '1'
produto.descricao = 'pneu'
produto.ncm = '38151210'
produto.unidadeMedida = 'UN'
produto.valorUnitario = 1.00
produto.impostos = EnotasNfe::Model::Impostos.new
produto.impostos.icms = EnotasNfe::Model::Icms.new
produto.impostos.icms.situacaoTributaria = '102'
produto.impostos.icms.origem = 0
produto.impostos.pis = EnotasNfe::Model::Pis.new
produto.impostos.pis.situacaoTributaria = '07'
produto.impostos.cofins = EnotasNfe::Model::Cofins.new
produto.impostos.cofins.situacaoTributaria = '07'

nfe.itens << produto

nfe.informacoesAdicionais = "I - Documento emitido por ME ou EPP optante pelo Simples Nacional.\r\n II - Não gera direito a crédito fiscal de ICMS, de ISS e de IPI." #opcional

#enviando a nota
client.nfe_create('id-da-empresa-no-enotas', nfe)

#cancelando uma nota
client.nfe_delete('id-da-empresa-no-enotas', id-da-nota)

Uso básico para devolução de uma NFE

  • Instancie o cliente passando sua API key:
client = EnotasNfe::Client.new('sua-api-key-do-e-notas', 'nfe')

Agora já podemos emitir uma nota!

  • Emitindo uma nova de Devolução de produto - NFe:
nfe = EnotasNfe::Model::Nfe.new
nfe.id = '1'
nfe.ambienteEmissao = "Homologacao" # "Producao" ou "Homologacao"
nfe.naturezaOperacao = "Devolução"
nfe.tipoOperacao =  "Entrada"
nfe.nfeReferenciada = [{
    "chaveAcesso": "000121111999005183450010000028881000025656"
}]
nfe.finalidade = "DevolucaoMercadoria"
nfe.consumidorFinal = true
nfe.indicadorPresencaConsumidor = true

nfe.cliente = {
  tipoPessoa: 'F',
  indicadorContribuinteICMS: "NaoContribuinte",
  nome: 'Luis Fernando Pimenta',
  email: 'email@luispimenta.me',
  cpfCnpj: '33199707807',
  telefone: '19981328642',
  inscricaoMunicipal: '',
  inscricaoEstadual: '',
}

nfe.cliente.endereco = {
  uf: 'PR',
  cidade: 'Curitiba',
  logradouro: 'Rua 01',
  numero: '112',
  bairro: 'Centro',
  cep: '80000000'
}

#se tiver frete
nfe.transporte = EnotasNfe::Model::Transporte.new
nfe.transporte.frete = {
  modalidade: "PorContaDoEmitente",
  valor: 20.00
}

nfe.enviarPorEmail = true

produto = EnotasNfe::Model::Produto.new
produto.cfop = "5101"
produto.codigo = '1'
produto.descricao = 'pneu'
produto.ncm = '38151210'
produto.unidadeMedida = 'UN'
produto.valorUnitario = 1.00
produto.impostos = EnotasNfe::Model::Impostos.new
produto.impostos.icms = EnotasNfe::Model::Icms.new
produto.impostos.icms.situacaoTributaria = '102'
produto.impostos.icms.origem = 0
produto.impostos.pis = EnotasNfe::Model::Pis.new
produto.impostos.pis.situacaoTributaria = '07'
produto.impostos.cofins = EnotasNfe::Model::Cofins.new
produto.impostos.cofins.situacaoTributaria = '07'

nfe.itens << produto

nfe.informacoesAdicionais = "I - Documento emitido por ME ou EPP optante pelo Simples Nacional.\r\n II - Não gera direito a crédito fiscal de ICMS, de ISS e de IPI." #opcional

#enviando a nota
client.nfe_create('id-da-empresa-no-enotas', nfe)

Uso básico para NFCE

  • Para emitir uma NFCE você precisa definir o ID E O CSC em produção, que também servirá para homologação
client = EnotasNfe::Client.new('sua-api-key-do-e-notas', 'nfe')
empresa = EnotasNfe::Model::Empresa.new(client.get_empresa('id-da-empresa-no-enotas'))
empresa.emissaoNFeConsumidor.ambienteProducao = EnotasNfe::Model::AmbienteProducao.new
empresa.emissaoNFeConsumidor.ambienteProducao.serieNFe = "2"
empresa.emissaoNFeConsumidor.ambienteProducao.sequencialNFe = "7"
empresa.emissaoNFeConsumidor.ambienteProducao.csc = EnotasNfe::Model::Csc.new
empresa.emissaoNFeConsumidor.ambienteProducao.csc.id = '000001'
empresa.emissaoNFeConsumidor.ambienteProducao.csc.codigo = '800FA97D5C3F4219A89DCE3FCE813A6F'
client.create_update_empresa(empresa)
  • Instancie o cliente passando sua API key:
client = EnotasNfe::Client.new('sua-api-key-do-e-notas', 'nfe')

Agora já podemos emitir uma nota!

  • Emitindo uma nova de VENDA de produto - NFCe:
nfe = EnotasNfe::Model::Nfe.new

nfe.id = '1000'
nfe.ambienteEmissao = 'Homologacao'

nfe.pedido = {
  "presencaConsumidor": "OperacaoPresencial"
}

nfe.pedido.pagamento = {
  "tipo": "PagamentoAVista"
}

nfe.pedido.pagamento.formas = [
  {
    "tipo": "Dinheiro",
    "valor": 10.00
  }
]

nfe.enviarPorEmail = true

produto = EnotasNfe::Model::Produto.new
produto.cfop = "5101"
produto.codigo = "1"
produto.descricao = "pneu"
produto.ncm = "38151210"
produto.unidadeMedida = "UN"
produto.valorUnitario = 10.00

produto.impostos = EnotasNfe::Model::Impostos.new
produto.impostos.icms = EnotasNfe::Model::Icms.new
produto.impostos.icms.situacaoTributaria = "102"
produto.impostos.icms.origem = 0

nfe.itens << produto

#criar uma nfce
client.nfce_create('id-da-empresa-no-enotas', nfe)
#cancelando uma nota
client.nfce_delete('id-da-empresa-no-enotas', id-da-nota)

Uso básico para NOTA CONJUGADA

  • Instancie o cliente passando sua API key:
client = EnotasNfe::Client.new('sua-api-key-do-e-notas', 'nfe')

Agora já podemos emitir uma nota!

  • Emitindo uma nova conjugada
nfe = EnotasNfe::Model::Nfe.new
nfe.id = "1"
# "Producao" ou "Homologacao"
nfe.ambienteEmissao = "Homologacao"
nfe.naturezaOperacao = "Venda"
nfe.finalidade = "Normal"
nfe.consumidorFinal = true
nfe.indicadorPresencaConsumidor = true
nfe.cliente = {
  tipoPessoa: "F",
  indicadorContribuinteICMS: "NaoContribuinte",
  nome: "Luis Fernando Pimenta",
  email: "email@luispimenta.me",
  cpfCnpj: "33199707807",
  telefone: "19981328642",
  inscricaoMunicipal: "",
  inscricaoEstadual: "",
}
nfe.cliente.endereco = {
  uf: "PR",
  cidade: "Curitiba",
  logradouro: "Rua 01",
  numero: "112",
  bairro: "Centro",
  cep: "80000000"
}
nfe.enviarPorEmail = true
produto = EnotasNfe::Model::Produto.new
produto.cfop = "5101"
produto.codigo = "1"
produto.descricao = "pneu"
produto.ncm = "38151210"
produto.unidadeMedida = "UN"
produto.valorUnitario = 1.00
produto.impostos = EnotasNfe::Model::Impostos.new
produto.impostos.icms = EnotasNfe::Model::Icms.new
produto.impostos.icms.situacaoTributaria = "102"
produto.impostos.icms.origem = 0
produto.impostos.pis = EnotasNfe::Model::Pis.new
produto.impostos.pis.situacaoTributaria = "07"
produto.impostos.cofins = EnotasNfe::Model::Cofins.new
produto.impostos.cofins.situacaoTributaria = "07"
nfe.itens << produto

produto = EnotasNfe::Model::Produto.new
#OBS: Deve ser utilizado o CFOP 6933 quando for serviço realizado fora do estado.
produto.cfop = "5933"
produto.codigo = "S001"
produto.descricao = "Serviço de Troca de Disco de Freio (dianteiro ou traseiro)"
produto.ncm = "00"
produto.unidadeMedida = "UN"
produto.valorUnitario = 1.00
produto.impostos = EnotasNfe::Model::Impostos.new
produto.impostos.pis = EnotasNfe::Model::Pis.new
produto.impostos.pis.situacaoTributaria = "07"
produto.impostos.cofins = EnotasNfe::Model::Cofins.new
produto.impostos.cofins.situacaoTributaria = "07"
nfe.itens << produto

nfe.valorTotal = 2.00

#criar uma nfce
client.nfe_create('id-da-empresa-no-enotas', nfe)
#cancelando uma nota
client.nfe_delete('id-da-empresa-no-enotas', id-da-nota)

Testando a gem localmente

gem build enotas_nfe.gemspec
gem install enotas-nfe-0.0.1.gem
abra o irb
require 'enotas_nfe'
e siga os passos acima

Contribuindo

Para contruibuir de uma forma adequada, siga os passos abaixo:

  • Faça um fork do projeto;
  • Após clonar seu fork, crie um novo branch com a feature que deseja implementar;
  • Envie seu branch para seu repositório remoto;
  • Solicite um PR a partir desse novo branch enviado.

Issues e comentários são sempre bem-vindos no repoistório oficial: https://github.com/eNotasGW/.

ROADMAP

Quer contribuir e não sabe por onde começar? Veja nosso ROADMAP:

  • Escrever testes;

License

Esta gem está disponível através da licença MIT.