Class: OrderPdf

Inherits:
RenderPDF show all
Defined in:
lib/order_pdf.rb

Direct Known Subclasses

OrderByArticles, OrderByGroups, OrderFax, OrderMatrix

Constant Summary

Constants inherited from RenderPDF

RenderPDF::BOTTOM_MARGIN, RenderPDF::DEFAULT_FONT, RenderPDF::FOOTER_FONT_SIZE, RenderPDF::FOOTER_SPACE, RenderPDF::HEADER_FONT_SIZE, RenderPDF::HEADER_SPACE, RenderPDF::TOP_MARGIN

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from RenderPDF

#down_or_page, #font_path, #font_size, #fontsize, #number_to_currency, #pdf_add_page_breaks?, #save_tmp, #title, #to_pdf

Methods included from ApplicationHelper

#base_errors, #bootstrap_flash_patched, #close_button, #expand, #foodcoop_css_path, #foodcoop_css_tag, #format_currency, #format_date, #format_datetime, #format_datetime_timespec, #format_roles, #format_time, #heading_helper, #icon, #items_per_page, #link_to_gmaps, #link_to_top, #pagination_links_remote, #remote_link_to, #show_title?, #show_user, #show_user_link, #sort_link_helper, #tab_is_active?, #title, #truncate, #weekday

Methods included from PathHelper

#finance_group_transactions_path

Constructor Details

#initialize(order, options = {}) ⇒ OrderPdf

Returns a new instance of OrderPdf.


5
6
7
8
9
# File 'lib/order_pdf.rb', line 5

def initialize(order, options = {})
  @order = order
  @orders = order
  super(options)
end

Instance Attribute Details

#orderObject (readonly)

Returns the value of attribute order


3
4
5
# File 'lib/order_pdf.rb', line 3

def order
  @order
end

Instance Method Details

#each_group_order_article_for_order_article(order_article, &block) ⇒ Object (protected)


123
124
125
# File 'lib/order_pdf.rb', line 123

def each_group_order_article_for_order_article(order_article, &block)
  order_article.group_order_articles.each(&block)
end

#each_group_order_article_for_ordergroup(ordergroup, &block) ⇒ Object (protected)


127
128
129
130
131
132
133
# File 'lib/order_pdf.rb', line 127

def each_group_order_article_for_ordergroup(ordergroup, &block)
  group_order_articles(ordergroup)
    .includes(order_article: {article: [:supplier]})
    .order('suppliers.name, articles.name')
    .preload(order_article: [:article_price, :order])
    .each(&block)
end

#each_order_article(&block) ⇒ Object (protected)


87
88
89
# File 'lib/order_pdf.rb', line 87

def each_order_article(&block)
  order_articles.each(&block)
end

#each_ordergroup(&block) ⇒ Object (protected)


91
92
93
# File 'lib/order_pdf.rb', line 91

def each_ordergroup(&block)
  ordergroups.each(&block)
end

#each_ordergroup_batch(batch_size) ⇒ Object (protected)


95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/order_pdf.rb', line 95

def each_ordergroup_batch(batch_size)
  offset = 0

  while true
    go_records = ordergroups(offset, batch_size)

    break unless go_records.any?

    group_ids = go_records.map(&:third)

    # get quantity for each article and ordergroup
    goa_records = group_order_articles(group_ids)
      .group('group_order_articles.order_article_id, group_orders.ordergroup_id')
      .pluck('group_order_articles.order_article_id', 'group_orders.ordergroup_id', 'SUM(COALESCE(group_order_articles.result, group_order_articles.quantity))')

    # transform the flat list of results in a hash (with the article as key), which contains an array for all ordergroups
    results = goa_records.group_by(&:first).transform_values do |value|
      grouped_value = value.group_by(&:second)
      group_ids.map do |group_id|
        number_with_precision grouped_value[group_id].try(:first).try(:third), strip_insignificant_zeros: true
      end
    end

    yield go_records, results
    offset += batch_size
  end
end

#group_order_article_quantity_with_tolerance(goa) ⇒ Object (protected)


49
50
51
# File 'lib/order_pdf.rb', line 49

def group_order_article_quantity_with_tolerance(goa)
  goa.tolerance > 0 ? "#{goa.quantity} + #{goa.tolerance}" : "#{goa.quantity}"
end

#group_order_article_result(goa) ⇒ Object (protected)


53
54
55
# File 'lib/order_pdf.rb', line 53

def group_order_article_result(goa)
  number_with_precision goa.result, strip_insignificant_zeros: true
end

#group_order_articles(ordergroup) ⇒ Object (protected)


57
58
59
60
61
# File 'lib/order_pdf.rb', line 57

def group_order_articles(ordergroup)
  GroupOrderArticle.
    includes(:group_order).
    where(group_orders: {order_id: @orders, ordergroup_id: ordergroup})
end

#nice_table(name, data, dimrows = []) ⇒ Object


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/order_pdf.rb', line 11

def nice_table(name, data, dimrows = [])
  down_or_page 25
  text name, size: 10, style: :bold
  table data, width: bounds.width, cell_style: {size: 8, overflow: :shrink_to_fit} do |table|
    # borders
    table.cells.borders = [:bottom]
    table.cells.padding_top = 2
    table.cells.padding_bottom = 4
    table.cells.border_color = 'dddddd'
    table.rows(0).border_color = '666666'

    # dim rows which were ordered but not received
    dimrows.each do |ri|
      table.row(ri).text_color = '999999'
      table.row(ri).columns(0..-1).font_style = nil
    end

    yield table if block_given?
  end
end

#order_article_price(order_article) ⇒ Number (protected)

Return price for order_article.

This is a separate method so that plugins can override it.

Parameters:

Returns:

  • (Number)

    Price to show

See Also:


41
42
43
# File 'lib/order_pdf.rb', line 41

def order_article_price(order_article)
  order_article.price.fc_price
end

#order_article_price_per_unit(order_article) ⇒ Object (protected)


45
46
47
# File 'lib/order_pdf.rb', line 45

def order_article_price_per_unit(order_article)
  "#{number_to_currency(order_article_price(order_article))} / #{order_article.article.unit}"
end

#order_articlesObject (protected)


63
64
65
66
67
68
69
70
71
# File 'lib/order_pdf.rb', line 63

def order_articles
  OrderArticle.
    ordered.
    includes(article: :supplier).
    includes(group_order_articles: {group_order: :ordergroup}).
    where(order: @orders).
    order('suppliers.name, articles.name, groups.name').
    preload(:article_price)
end

#ordergroups(offset = nil, limit = nil) ⇒ Object (protected)


73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/order_pdf.rb', line 73

def ordergroups(offset = nil, limit = nil)
  result = GroupOrder.
    ordered.
    where(order: @orders).
    group('groups.id').
    offset(offset).
    limit(limit).
    pluck('groups.name', 'SUM(group_orders.price)', 'ordergroup_id')

  result.map do |item|
    [item.first || stock_ordergroup_name] + item[1..-1]
  end
end

#stock_ordergroup_nameObject (protected)


135
136
137
138
139
140
141
142
143
# File 'lib/order_pdf.rb', line 135

def stock_ordergroup_name
  users = GroupOrder.stock.
    eager_load(:updated_by).
    where(order: @orders).
    map(&:updated_by).
    map{ |u| u.try(&:name) || '?' }

  I18n.t('model.group_order.stock_ordergroup_name', user: users.uniq.sort.join(', '))
end