Sha256: bf35c3d24469c576bb626ea65b99a7fd83f57d32c88f78c3f0a7bd1220904833

Contents?: true

Size: 1.19 KB

Versions: 1

Compression:

Stored size: 1.19 KB

Contents

require 'csv'

class StreetTypeUpdater
  def self.update!
    new.update!
  end

  def initialize(repository = StreetType)
    self.repository = repository
  end

  def update!
    transaction do
      parser.foreach(file, options) do |row|
        attributes = row.to_hash.symbolize_keys!

        code = attributes[:code]
        name = attributes[:name]

        record = repository.find_by(code: code)

        if record.present? && name_differs?(record.name, name)
          record.update_column(:name, name.capitalize)
        else
          repository.new(code: code, name: name.capitalize).tap do |street_type|
            street_type.save(validate: false)
          end
        end
      end
    end
  end

  protected

  attr_accessor :repository

  def transaction(&block)
    repository.transaction(&block)
  end

  def parser
    CSV
  end

  def options
    { col_sep: ',', headers: true, encoding: 'utf-8' }
  end

  def file
    "#{Unico::Engine.config.root}/lib/import/files/updated_street_types.csv"
  end

  def name_differs?(name_founded, name)
    unaccent(name_founded) != unaccent(name)
  end

  def unaccent(value)
    value.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, '').downcase.to_s
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
unico-training-7.8.0 lib/street_type_updater.rb