** 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).
gem install sped2sql
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
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
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})
É 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
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