Ruby é uma linguagem de programação que foi amplamente popularizada pelo seu framework mais popular, o Rails.

Inclusive os nossos sistemas Focus Lojas e Focus NFe foram desenvolvidos em Rails.

A API do Focus NFe pode ser integrada com qualquer linguagem de programação para emitir NFSe para centenas de cidades de forma muito ágil.

É claro que não poderíamos deixar de confeccionar um exemplo de integração com nossa API utilizando Ruby, veja abaixo.

# encoding: utf-8
require 'net/http'
require 'yaml'
# Você deve definir isso globalmente para sua aplicação
host = 'homologacao.acrasnfe.acras.com.br'
token = "SEU_TOKEN_DE_ACESSO"
nfse = {
'data_emissao' => '2013-05-31T12:00:00',
'incentivador_cultural' => false,
'natureza_operacao' => '1',
'optante_simples_nacional' => false,
'regime_especial_tributacao' => '1',
'status' => '1',
'prestador' => {
'cnpj' => 'SEU_CNPJ',
'inscricao_municipal' => '1234',
'codigo_municipio' => '4106902',
},
'servico' => {
'aliquota' => 0.05,
'base_calculo' => 200.0,
'discriminacao' => 'SUPORTE TECNICO, MANUTENCAO E OUTROS SERVICOS EM TECNOLOGIA DA INFORMACAO',
'iss_retido' => false,
'item_lista_servico' => '1.07',
'valor_iss' => 10.0,
'valor_liquido' => 200.0,
'valor_servicos' => 200.0,
'valor_deducoes' => 0,
'valor_pis' => 0,
'valor_cofins' => 0,
'valor_inss' => 0,
'valor_ir' => 0,
'valor_csll' => 0,
'valor_iss_retido' => 0,
'outras_retencoes' => 0,
'desconto_incondicionado' => 0,
'desconto_condicionado' => 0,
'codigo_tributario_municipio' => '6209100',
'codigo_municipio' => '4106902',
},
'tomador' => {
'cpf' => '03055054911',
'razao_social' => 'Egon Hilgenstieler',
'endereco' => {
'bairro' => 'Centro',
'cep' => '80000000',
'codigo_municipio' => '4106902',
'logradouro' => 'Rua Emiliano Perneta',
'numero' => '845',
'uf' => 'PR'
}
}
}
puts "==> Teste de envio"
# A referência é uma string que identifica univocamente uma NFSe e
# será usada para consultas posteriores
ref = '123'
res = Net::HTTP.start(host, 80) do |http|
http.post("/nfse?token=#{token}&ref=#{ref}", nfse.to_yaml)
end
puts res.code, res.body
# O processo de envio de NFSe é assíncrono, e pode ser necessário
# aguardar até que a nota seja processada
sleep 10
puts "==> Teste de consulta"
res = Net::HTTP.start(host, 80) do |http|
http.get("/nfse/#{ref}?token=#{token}")
end
puts res.code, res.body
puts "==> Teste de cancelamento"
res = Net::HTTP.start(host, 80) do |http|
http.delete("/nfse/#{ref}?token=#{token}")
end
puts res.code, res.body
# após o cancelamento, devemos fazer uma nova consulta para verificar
# se houve sucesso
sleep 10
res = Net::HTTP.start(host, 80) do |http|
http.get("/nfse/#{ref}?token=#{token}")
end
puts res.code, res.body