foodcoop-adam/foodsoft

View on GitHub
lib/render_csv.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'csv'

class RenderCSV
  include ActionView::Helpers::NumberHelper

  def initialize(object, options={})
    @object = object
    @options = options
    # defaults to please Microsoft Excel ...
    @options[:col_sep] ||= FoodsoftConfig[:csv_col_sep] || ';'
    @options[:row_sep] ||= FoodsoftConfig[:csv_row_sep] if FoodsoftConfig[:csv_row_sep]
    @options[:encoding] ||= FoodsoftConfig[:csv_encoding] || 'ISO-8859-15'
  end

  def to_csv
    options = @options.select {|k| %w(col_sep row_sep encoding).include? k.to_s}
    CSV.generate options do |csv|
      if h = header
        csv << h
      end
      data {|d| csv << d}
    end
  end

  def header
    nil
  end

  def data
    yield []
  end

  # Helper method to test pdf via rails console: OrderCsv.new(order).save_tmp
  def save_tmp
    encoding = @options[:encoding] || 'UTF-8'
    File.open("#{Rails.root}/tmp/#{self.class.to_s.underscore}.csv", 'w') {|f| f.write(to_csv.force_encoding(encoding)) }
  end

  # XXX disable unit to avoid encoding problems, both in unit and whitespace. Also allows computations in spreadsheet.
  def number_to_currency(number, options={})
    super(number, options.merge({unit: nil}))
  end
end