foodcoop-adam/foodsoft

View on GitHub
app/documents/order_matrix.rb

Summary

Maintainability
B
4 hrs
Test Coverage
# encoding: utf-8
class OrderMatrix < OrderPdf

  MAX_ARTICLES_PER_PAGE = 16 # How many order_articles shoud written on a page
  
  def filename
    I18n.t('documents.order_matrix.filename', :name => @order.name, :date => @order.ends.to_date) + '.pdf'
  end

  def title
    I18n.t('documents.order_matrix.title', :name => @order.name,
      :date => @order.ends.strftime(I18n.t('date.formats.default')))
  end

  def body
    order_articles = @order.order_articles.ordered

    text I18n.t('documents.order_matrix.heading'), style: :bold
    move_down 5
    text I18n.t('documents.order_matrix.total', :count => order_articles.size), size: fontsize(8)
    move_down 10

    order_articles_data = [I18n.t('documents.order_matrix.rows')]

    order_articles.each do |a|
      order_articles_data << [a.article.name,
                              a.article.unit,
                              a.price.unit_quantity,
                              number_with_precision(a.price.fc_price, precision: 2),
                              a.units]
    end

    table order_articles_data, cell_style: {size: fontsize(8), overflow: :shrink_to_fit} do |table|
      table.cells.border_width = 1
      table.cells.border_color = '666666'
    end

    page_number = 0
    total_num_order_articles = order_articles.size

    while page_number * MAX_ARTICLES_PER_PAGE < total_num_order_articles do  # Start page generating

      page_number += 1
      start_new_page(layout: :landscape)

      # Collect order_articles for this page
      current_order_articles = order_articles.select do |a|
        order_articles.index(a) >= (page_number-1) * MAX_ARTICLES_PER_PAGE and
            order_articles.index(a) < page_number * MAX_ARTICLES_PER_PAGE
      end

      # Make order_articles header
      header = [""]
      for header_article in current_order_articles
        name = header_article.article.name.gsub(/[-\/]/, " ").gsub(".", ". ")
        name = name.split.collect { |w| w.truncate(8) }.join(" ")
        header << name.truncate(30)
      end

      # Collect group results
      groups_data = [header]

      @order.group_orders.includes(:ordergroup).all.each do |group_order|

        group_result = [group_order.ordergroup.name.truncate(20)]

        for order_article in current_order_articles
          # get the Ordergroup result for this order_article
          goa = order_article.group_order_articles.first conditions: { group_order_id: group_order.id }
          group_result << ((goa.nil? || goa.result == 0) ? "" : goa.result.to_i)
        end
        groups_data << group_result
      end

      # Make table
      column_widths = [85]
      (MAX_ARTICLES_PER_PAGE + 1).times { |i| column_widths << 41 unless i == 0 }
      table groups_data, column_widths: column_widths, cell_style: {size: fontsize(8), overflow: :shrink_to_fit} do |table|
        table.cells.border_width = 1
        table.cells.border_color = '666666'
        table.row_colors = ['ffffff','ececec']
      end

    end
  end

end