foodcoops/foodsoft

View on GitHub
app/documents/order_fax.rb

Summary

Maintainability
A
3 hrs
Test Coverage
class OrderFax < OrderPdf
  BATCH_SIZE = 250

  def filename
    I18n.t('documents.order_fax.filename', name: order.name, date: order.ends.to_date) + '.pdf'
  end

  def title
    false
  end

  def body
    contact = FoodsoftConfig[:contact].symbolize_keys

    # From paragraph
    bounding_box [margin_box.right - 200, margin_box.top], width: 200 do
      text FoodsoftConfig[:name], size: fontsize(9), align: :right
      move_down 5
      text contact[:street], size: fontsize(9), align: :right
      move_down 5
      text "#{contact[:zip_code]} #{contact[:city]}", size: fontsize(9), align: :right
      move_down 5
      if order.supplier.try(:customer_number).present?
        text "#{Supplier.human_attribute_name :customer_number}: #{order.supplier[:customer_number]}",
             size: fontsize(9), align: :right
        move_down 5
      end
      if contact[:phone].present?
        text "#{Supplier.human_attribute_name :phone}: #{contact[:phone]}", size: fontsize(9), align: :right
        move_down 5
      end
      if contact[:email].present?
        text "#{Supplier.human_attribute_name :email}: #{contact[:email]}", size: fontsize(9),
                                                                            align: :right
      end
    end

    # Recipient
    bounding_box [margin_box.left, margin_box.top - 60], width: 200 do
      text order.name
      move_down 5
      text order.supplier.try(:address).to_s
      if order.supplier.try(:fax).present?
        move_down 5
        text "#{Supplier.human_attribute_name :fax}: #{order.supplier[:fax]}"
      end
    end

    move_down 5
    text Date.today.strftime(I18n.t('date.formats.default')), align: :right

    move_down 10
    text "#{Delivery.human_attribute_name :date}:"
    move_down 10
    if order.supplier.try(:contact_person).present?
      text "#{Supplier.human_attribute_name :contact_person}: #{order.supplier[:contact_person]}"
      move_down 10
    end

    # Articles
    total = 0
    data = [I18n.t('documents.order_fax.rows')]
    each_order_article do |oa|
      subtotal = oa.units_to_order * oa.price.unit_quantity * oa.price.price
      total += subtotal
      data << [oa.article.order_number,
               oa.units_to_order,
               oa.article.name,
               oa.price.unit_quantity,
               oa.article.unit,
               number_to_currency(oa.price.price),
               number_to_currency(subtotal)]
    end
    data << [I18n.t('documents.order_fax.total'), nil, nil, nil, nil, nil, number_to_currency(total)]
    table data, cell_style: { size: fontsize(8), overflow: :shrink_to_fit } do |table|
      table.header = true
      table.cells.border_width = 1
      table.cells.border_color = '666666'

      table.row(0).border_bottom_width = 2
      table.columns(1).align = :right
      table.columns(3..6).align = :right
      table.row(data.length - 1).columns(0..5).borders = %i[top bottom]
      table.row(data.length - 1).columns(0).borders = %i[top bottom left]
      table.row(data.length - 1).border_top_width = 2
    end
    # font_size: fontsize(8),
    # vertical_padding: 3,
    # border_style: :grid,
    # headers: ["BestellNr.", "Menge","Name", "Gebinde", "Einheit","Preis/Einheit"],
    # align: {0 => :left}
  end

  private

  def order_articles
    order.order_articles.ordered
         .joins(:article)
         .order('articles.order_number').order('articles.name')
         .preload(:article, :article_price)
  end

  def each_order_article(&block)
    order_articles.find_each_with_order(batch_size: BATCH_SIZE, &block)
  end
end