Sha256: 9728db2ff20ef2a087dbb2af13b3b8e4285be8af1c70ad2e51c02d78b12c1343

Contents?: true

Size: 1.8 KB

Versions: 1

Compression:

Stored size: 1.8 KB

Contents

module Sped2DB
  class Registro
    attr_reader :nome, :pai, :campos, :valores

    def initialize(linha, metadados)
      @linha = linha
      @metadados = metadados
      @valores = dividir_linha_em_valores linha
      @nome = @valores.shift.upcase

      validar_registro

      @pai = @metadados[@nome]['pai']
      @campos = @metadados[@nome]['campos']

      validar_campos

      corrigir_caracteres_especiais
      corrigir_datas

      @hash = to_h
    end

    def to_h
      valores = @valores.map { |v| v.empty? ? nil : v }
      @campos.map(&:to_sym).zip(valores).to_h
    end

    def [](key)
      @hash[key.to_sym]
    end

    private

    def dividir_linha_em_valores(linha)
      linha.chomp.sub(/^\|/, '').sub(/\|$/, '').gsub('\\', '\\\\\\\\').split('|', -1)
    end

    def corrigir_caracteres_especiais
      @valores.map! do |c|
        c.strip!
        c.sub!(/,/, '.') if eh_decimal? c
        c.gsub!(/'/, "''")
        c
      end
    end

    def eh_decimal?(str)
      str =~ /^-?\d+,\d+$/
    end

    def corrigir_datas
      @campos.each_with_index do |campo, i|
        if campo.start_with?('dt_', 'dat_')
          @valores[i] = formatar_data @valores[i]
        end
      end

      @valores[0] = '0' if @nome == 'C495' && @valores[0] == ''
    end

    def formatar_data(d)
      d != '' ? Date.strptime(d, '%d%m%Y').strftime('%Y-%m-%d') : ''
    end

    def validar_registro
      msg = "Registro #{@nome} nao suportado"
      raise SpedError.new msg, @linha unless @metadados.key? @nome
    end

    def validar_campos
      msg = "Linha contem #{@valores.size + 1} campo(s), "
      msg << "mas #{@campos.size + 1} eram esperado(s)"
      raise SpedError.new msg, @linha if @valores.size != @campos.size
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sped2db-1.2.0 lib/sped2db/registro.rb