Nfse
Gem para realizar diversas ações relacionadas a nota fiscal de serviço eletrônica (NFS-e)
Install / Use
/learn @carloslopes/NfseREADME
NFS-e
Gem para realizar diversas ações relacionadas a nota fiscal de serviço eletrônica.
Features prontas
Campinas/SP
- Geração do xml de envio de lote
- Geração do xml de consulta de lote
- Geração do xml de cancelamento de nota
Rio de Janeiro/RJ
Atenção: O layout do Rio de Janeiro ainda está sendo desenvolvido e não foi homologado. Não use em produção!
- Geração do xml de envio de lote
TODO
- Assinar os XML gerados
- Geração do xml de consulta de notas
- Geração do xml de consulta sequencial RPS
- Refatorar testes do initialize da RPS (usar um describe apenas)
- Instanciar os default values dos atributos apenas para os que não receberam nada pelo initialize
Atualmente a gem só gera NFS-e seguindo os padrões da prefeitura de Campinas/SP e do Rio de Janeiro/RJ
Links de referências
Campinas
Manual de uso do WebService
Exemplos de XML e XSD
Rio de Janeiro
Manual de uso do WebService
Manual de Integração ABRASF
Manual Conceitual da ABRASF
Schemas XML
Exemplos de XML
Instalação
Adicione essa linha ao arquivo Gemfile:
gem 'nfse'
e depois execute:
$ bundle
Ou instale diretamente:
$ gem install nfse
Modo de Uso
- Todas as classes podem receber um Hash contendo o valor de seus atributos ao serem inicializadas (como mostra o exemplo do Cancelamento de nota abaixo)
- Todas as classes principais de cada método do WebService podem receber tanto um Hash como um JSON de atributos (como mostra o exemplo da Consulta de lote abaixo)
Campinas/SP
Envio de lote
require 'nfse'
# Lote
lote = Nfse::Envio::Lote.new
lote.id = '1ABCDZ'
lote.cod_cidade = '6291'
lote.cnpj = '02646676000182'
lote.razao_social = 'Empresa Resp. Modelo'
# RPS
rps = Nfse::Envio::Rps.new
rps.numero = '109'
rps.data_emissao = Time.new(2009, 10, 1)
rps.situacao = 'N'
rps.serie_rps_substituido = '123'
rps.num_rps_substituido = '0'
rps.num_nfse_substituida = '1'
rps.data_nfse_substituida = '1900-01-01'
rps.cod_atividade = '412040000'
rps.aliquota_atividade = '5.0'
rps.tipo_recolhimento = 'R'
rps.cod_municipio_prestacao = '0006291'
rps.municipio_prestacao = 'CAMPINAS'
rps.operacao = 'A'
rps.tributacao = 'T'
rps.valor_pis = 0.0
rps.valor_cofins = 1.1
rps.valor_inss = 2.2
rps.valor_ir = 3.3
rps.valor_csll = 4.4
rps.aliquota_pis = 5.5
rps.aliquota_cofins = 6.6
rps.aliquota_inss = 7.7
rps.aliquota_ir = 8.8
rps.aliquota_csll = 9.9
rps.descricao = 'TESTE'
rps.motivo_cancelamento = 'motivo exemplo'
rps.cnpj_intermediario = '123456789'
# Prestador
prestador = rps.prestador
prestador.inscricao_municipal = '0370835'
prestador.razao_social = 'EMPRESA MODELO'
prestador.ddd = '035'
prestador.telefone = '40405050'
# Tomador
tomador = rps.tomador
tomador.inscricao_municipal = '0000000'
tomador.cnpj = '27394162000108'
tomador.razao_social = 'EMPRESA DE TESTE'
tomador.tipo_logradouro = 'RUA'
tomador.logradouro = 'logradouro exemplo'
tomador.num_endereco = '9'
tomador.tipo_bairro = 'BAIRRO'
tomador.bairro = 'bairro exemplo'
tomador.cod_cidade = '00062910'
tomador.cidade = 'SAO PAULO'
tomador.cep = '05010040'
tomador.email = 'foo@example.com'
tomador.ddd = '011'
tomador.telefone = '923156467'
# Deducoes
deducao = Nfse::Envio::Deducao.new
deducao.por = 'Valor'
deducao.tipo = 'Despesas com Materiais'
deducao.cnpj_ref = '001002003'
deducao.num_nf_ref = '100200301'
deducao.valor_total_ref = 100.00
deducao.percentual = 20.0
deducao.valor = 25.0
rps.deducoes << deducao
# Itens
rps.itens << Nfse::Envio::Item.new({
discriminacao: 'Item exemplo',
quantidade: '1',
valor_unitario: '100.00',
tributavel: 'S'
})
lote.rps << rps
xml = lote.render
puts xml
Consulta de lote
require 'nfse'
consulta_lote = Nfse::ConsultaLote.new('{
"cod_cidade": "6291",
"cnpj": "27394162000108",
"versao": "2",
"num_lote": "7105"
}')
xml = consulta_lote.render
puts xml
Cancelamento de nota
require 'nfse'
cancelamento = Nfse::Cancelamento.new({
id: '1ABCDZ',
cod_cidade: '6291',
cnpj: '04659416000177',
transacao: 'false',
versao: '2',
notas: [
{
numero: '5',
inscricao_municipal: '000000108',
cod_verificacao: '98d0e61d9396b60e5a847a361cb9264e4b6d0c9f',
motivo_cancelamento: 'Teste de cancelamento'
}
]
})
xml = cancelamento.render
puts xml
Rio de Janeiro/RJ
Envio de lote
require 'nfse'
Nfse::Base.prefeitura = :rio_de_janeiro
lote = Nfse::Envio::Lote.new
lote.numero = '3'
lote.cnpj = '02646676000182'
lote.inscricao_municipal = '001002003'
rps = Nfse::Envio::Rps.new
rps.numero = '109'
rps.serie = "A"
rps.tipo = "1"
rps.data_emissao = Time.new(2009, 10, 1)
rps.optante_simples_nacional = '2'
rps.incentivador_cultural = '1'
rps.status_rps = '1'
rps.cod_atividade = '1405'
rps.aliquota_atividade = '0.05'
rps.tipo_recolhimento = '140520'
rps.cod_municipio_prestacao = '3304557'
rps.operacao = '1'
rps.valor_pis = 0.0
rps.valor_cofins = 1.11
rps.valor_inss = 2.22
rps.valor_ir = 3.33
rps.valor_csll = 4.44
rps.valor_iss = 5.0
rps.descricao = 'Exemplo de Discriminacao de RPS'
prestador = rps.prestador
prestador.cnpj = '01073249816200'
prestador.inscricao_municipal = '0370835'
tomador = rps.tomador
tomador.inscricao_municipal = '0000000'
tomador.cnpj = '27394162000108'
tomador.razao_social = 'Nome do Tomador'
tomador.logradouro = 'Av. Rio Branco'
tomador.num_endereco = '123'
tomador.complemento_endereco = 'Andar 1'
tomador.bairro = 'Centro'
tomador.cod_cidade = '3304557'
tomador.uf = 'RJ'
tomador.cep = '05010040'
tomador.email = 'foo@example.com'
rps.itens << Nfse::Envio::Item.new({
discriminacao: 'Item exemplo',
quantidade: '1',
valor_unitario: '100.00',
tributavel: 'S'
})
lote.rps << rps
xml = lote.render
puts xml
Autores
Como Contribuir?
- Fazer um fork do projeto
- Instalar as dependências: bundle install (Se não tiver o bundler instalado, faça antes: gem install bundler)
- Criar um feature branch (
git checkout -b my-new-feature) - Fazer os devidos ajustes com os respectivos testes
- Comitar as mudanças, se possível tente fazer commits atômicos (
git commit -am 'Added some feature') - Atualizar o repositório no Github (
git push origin my-new-feature) - Fazer pull request
Related Skills
node-connect
344.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
96.8kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
344.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
344.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
