class SPED2SQL::Conversor

Attributes

fonte[R]
memoria[R]
options[R]
saida[R]
template[R]

Public Class Methods

new(fonte, template, options = {}) click to toggle source
Calls superclass method
# File lib/sped2sql/conversor.rb, line 7
def initialize(fonte, template, options = {})
  @fonte      = fonte
  @template   = template.is_a?(Symbol) ? Mapa.arquivo_template(template) : template
  @saida      = []
  @memoria    = Hash.new { |k, v| k[v] = [] }
  @options    = options

  valida_arquivo(@fonte)
  valida_arquivo(@template)

  tasks = if options[:tasks].is_a?(Array)
            options[:tasks]
          elsif options[:tasks] == :vazio
            []
          else
            [Pipeline::NormalizaSQL, Pipeline::AddHash]
          end

  super(tasks)
end

Public Instance Methods

converter!() click to toggle source
# File lib/sped2sql/conversor.rb, line 28
def converter!
  mapa  = Mapa.carrega!(@template)
  dados = IO.read(fonte, encoding: 'ISO-8859-1').gsub("'", '"')

  CSV.parse(dados, col_sep: '|', quote_char: "'") do |row|
    # pula linha se o registro nao existe no mapa
    next unless mapa.has_key?(row[1])

    # O primeiro e o ultimo item de uma linha no SPED sempre eh nulo
    linha = row.clone[1..-2]

    # Executa o pipe
    pipe = execute({ original: linha,
                     final:    linha,
                     mapa:     mapa,
                     memoria:  @memoria,
                     saida:    @saida,
                     options:  @options })

    @saida << pipe[:final]
    @memoria[linha.first] << pipe[:final]

    # Para um arquivo completo do SPED, 9999 eh o ultimo registro.
    # termina a leitura do arquivo no registro 9999 evitando ler
    # linhas em branco ou assinatura digital
    break if linha[0].to_i == 9999
  end
end
to_sql() click to toggle source
# File lib/sped2sql/conversor.rb, line 57
def to_sql
  SQL::Parser.to_sql(@saida, @options[:db] || {})
end

Private Instance Methods

valida_arquivo(file) click to toggle source
# File lib/sped2sql/conversor.rb, line 63
def valida_arquivo(file)
  fail(ArgumentError, "Arquivo inexistente: #{file}") unless File.exist?(file)
end