SPED2SQL

Code Climate Build Status Test Coverage

** SPED2SQL is a RubyGem to convert SPED tax data files into SQL. SPED2SQL reads the SPED file and matches it against a template in order to convert the data into its corresponding SQL format. You can also make it extensible by creating as many custom parsers as you want and attach it to the reading process **

SPED2SQL é uma RubyGem que converte arquivos SPED para arquivos SQL prontos para serem inseridos no banco de dados (caso precise criar as tabelas do SPED, de uma olhada nesse outro repositório: SPED Schema).

Atualmente apenas o template para a EFD ICMS IPI está disponibilizado, porém você pode implementar e customizar o seu próprio template (e se possível enviar de volta como contribuição).

Instalação

gem install sped2sql

Uso

Convertendo um arquivo EFD ICMS IPI para SQL

require 'sped2sql'

conversor = SPED2SQL::Conversor.new(caminho_arquivo_sped, :efd_icms_ipi)
conversor.converter!

# Salva o SQL em um arquivo texto
IO.write('caminho_destino_sql.sql', conversor.to_sql)

Verifique os SPECS para outros exemplos e o retorno SQL

Convertendo um arquivo SPED utilizando um template próprio

require 'sped2sql'

conversor = SPED2SQL::Conversor.new(caminho_arquivo_sped, caminho_template_txt)
conversor.converter!

# Salva o SQL em um arquivo texto
IO.write('caminho_destino_sql.sql', conversor.to_sql)

Veja um exemplo de template

Parsers

Por padrão duas operações (tasks) são executas durante a leitura de cada linha do SPED. São elas:

  • NormalizaSQL: Converte cada campo para o respectivo tipo de dado informado no template
  • AddHash: Adiciona um identificador único para cada registro

Para não utiliza-las, basta apenas instanciar o conversor explicitando as tasks vazias:

conversor = SPED2SQL::Conversor.new(arquivo_sped, arquivo_mapa, {tasks: :vazio})

Parsers customizados

É possível utilizar seus próprios parsers para serem executados como tasks a cada leitura de linha. Basta apenas que ele responda ao metodo call recebendo como argumento um hash contendo:

  • :original => linha original que está sendo lida no momento
  • :final => linha com as modificações feitas por outros parsers até o momento
  • :mapa => template mapeando o tipo de dado para cada registro do sped
  • :memoria => último registro lido de cada tabela
  • :saida => acumulador das leituras feitas até momento
  • :options => Opções enviadas na instaciação do conversor

E retorne o mesmo hash como a key final modificada com suas alterações (apenas modificações nessa key serão levadas em conta).

Neste exemplo, um simples parser que adiciona a hora atual na última coluna da linha lida:

module MyParser
  def self.call(env)
    env[:final].push(Time.now)
    env
  end
end

Para utilizar apenas este parser na leitura do seu arquivo:

conversor = SPED2SQL::Conversor.new(arquivo_sped, arquivo_mapa, {tasks: [MyParser]})

Para utilizar os parsers default e acrescentar o seu ao final:

conversor = SPED2SQL::Conversor.new(arquivo_sped, arquivo_mapa)
conversor << MyParser

Contribuindo

Contribuições são bem vindas. Você pode contribuir de diversas maneiras:

  • Procurando e reportando erros (faça isso aqui)
  • Corrigindo erros e enviando as correções (Fork o projeto e envie um Pull Request)
  • Criando novos templates
  • Criando parsers úteis de propósito geral