Class: GroupOrder

Inherits:
ApplicationRecord show all
Includes:
FindEachWithOrder
Defined in:
app/models/group_order.rb

Overview

A GroupOrder represents an Order placed by an Ordergroup.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#group_order_articles_attributesObject

Returns the value of attribute group_order_articles_attributes


5
6
7
# File 'app/models/group_order.rb', line 5

def group_order_articles_attributes
  @group_order_articles_attributes
end

Instance Method Details

#load_dataObject

Generate some data for the javascript methods in ordering view


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/models/group_order.rb', line 25

def load_data
  data = {}
  data[:account_balance] = ordergroup.nil? ? BigDecimal.new('+Infinity') : ordergroup.
  data[:available_funds] = ordergroup.nil? ? BigDecimal.new('+Infinity') : ordergroup.get_available_funds(self)

  # load prices and other stuff....
  data[:order_articles] = {}
  order.articles_grouped_by_category.each do |, order_articles|
    order_articles.each do |order_article|

      # Get the result of last time ordering, if possible
      goa = group_order_articles.detect { |goa| goa.order_article_id == order_article.id }

      # Build hash with relevant data
      data[:order_articles][order_article.id] = {
          :price => order_article.article.fc_price,
          :unit => order_article.article.unit_quantity,
          :quantity => (goa ? goa.quantity : 0),
          :others_quantity => order_article.quantity - (goa ? goa.quantity : 0),
          :used_quantity => (goa ? goa.result(:quantity) : 0),
          :tolerance => (goa ? goa.tolerance : 0),
          :others_tolerance => order_article.tolerance - (goa ? goa.tolerance : 0),
          :used_tolerance => (goa ? goa.result(:tolerance) : 0),
          :total_price => (goa ? goa.total_price : 0),
          :missing_units => order_article.missing_units,
          :quantity_available => (order.stockit? ? order_article.article.quantity_available : 0)
      }
    end
  end

  data
end

#ordergroup_nameObject


93
94
95
# File 'app/models/group_order.rb', line 93

def ordergroup_name
  ordergroup ? ordergroup.name : I18n.t('model.group_order.stock_ordergroup_name', :user => updated_by.try(:name) || '?')
end

#save_group_order_articlesObject


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'app/models/group_order.rb', line 58

def save_group_order_articles
  for order_article in order.order_articles
    # Find the group_order_article, create a new one if necessary...
    group_order_article = group_order_articles.where(order_article_id: order_article.id).first_or_create

    # Get ordered quantities and update group_order_articles/_quantities...
    if group_order_articles_attributes
      quantities = group_order_articles_attributes.fetch(order_article.id.to_s, {:quantity => 0, :tolerance => 0})
      group_order_article.update_quantities(quantities[:quantity].to_i, quantities[:tolerance].to_i)
    end

    # Also update results for the order_article
    logger.debug "[save_group_order_articles] update order_article.results!"
    order_article.update_results!
  end

  # set attributes to nil to avoid and infinite loop of
end

#save_ordering!Object

Save GroupOrder and updates group_order_articles/quantities accordingly


85
86
87
88
89
90
91
# File 'app/models/group_order.rb', line 85

def save_ordering!
  transaction do
    save!
    save_group_order_articles
    update_price!
  end
end

#totalObject


97
98
99
100
# File 'app/models/group_order.rb', line 97

def total
  return price + transport if transport
  price
end

#update_price!Object

Updates the “price” attribute.


78
79
80
81
# File 'app/models/group_order.rb', line 78

def update_price!
  total = group_order_articles.includes(:order_article => [:article, :article_price]).to_a.sum(&:total_price)
  update_attribute(:price, total)
end