Class: Workarea::OrderMetrics

Inherits:
Object
  • Object
show all
Defined in:
app/queries/workarea/order_metrics.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(order) ⇒ OrderMetrics

Returns a new instance of OrderMetrics.



6
7
8
# File 'app/queries/workarea/order_metrics.rb', line 6

def initialize(order)
  @order = order
end

Instance Attribute Details

#orderObject (readonly)

Returns the value of attribute order.



3
4
5
# File 'app/queries/workarea/order_metrics.rb', line 3

def order
  @order
end

Instance Method Details

#all_price_adjustmentsObject



115
116
117
118
# File 'app/queries/workarea/order_metrics.rb', line 115

def all_price_adjustments
  @all_price_adjustments ||= order.price_adjustments +
    shippings.map(&:price_adjustments).flatten
end

#categoriesObject



55
56
57
58
59
# File 'app/queries/workarea/order_metrics.rb', line 55

def categories
  @categories ||= items_by_via
    .select { |gid| gid.model_class.name == 'Workarea::Catalog::Category' }
    .transform_keys(&:model_id)
end

#countryObject



107
108
109
# File 'app/queries/workarea/order_metrics.rb', line 107

def country
  Payment.find(order.id).address.country.alpha2 rescue nil
end

#discount_adjustmentsObject



120
121
122
# File 'app/queries/workarea/order_metrics.rb', line 120

def discount_adjustments
  all_price_adjustments.select(&:discount?)
end

#discountsObject



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'app/queries/workarea/order_metrics.rb', line 124

def discounts
  @discounts ||= begin
    price_adjustments_by_discount = discount_adjustments.group_by do |adjustment|
      adjustment.data['discount_id']
    end

    price_adjustments_by_discount.transform_values do |price_adjustments|
      {
        orders: 1,
        merchandise: sales_data[:merchandise],
        discounts: price_adjustments.map(&:amount).sum,
        revenue: sales_data[:revenue]
      }
    end
  end
end

#first_time_customer?Boolean

Returns:

  • (Boolean)


14
15
16
# File 'app/queries/workarea/order_metrics.rb', line 14

def first_time_customer?
  user.orders.zero?
end


86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'app/queries/workarea/order_metrics.rb', line 86

def menus
  @menus ||= categories.reduce({}) do |memo, (category_id, data)|
    category = category_models.detect { |c| c.id.to_s == category_id.to_s }
    taxon_ids = [category&.taxon&.id, category&.taxon&.parent_ids].flatten.reject(&:blank?)

    Navigation::Menu.any_in(taxon_id: taxon_ids).pluck(:id).map(&:to_s).each do |menu_id|
      memo[menu_id] ||= Hash.new(0)
      memo[menu_id][:orders] = 1

      memo[menu_id][:units_sold] += data[:units_sold]
      memo[menu_id][:discounted_units_sold] += data[:discounted_units_sold]
      memo[menu_id][:merchandise] += data[:merchandise]
      memo[menu_id][:discounts] += data[:discounts]
      memo[menu_id][:tax] += data[:tax]
      memo[menu_id][:revenue] += data[:revenue]
    end

    memo
  end
end

#productsObject



49
50
51
52
53
# File 'app/queries/workarea/order_metrics.rb', line 49

def products
  @products ||= order.items.group_by(&:product_id).transform_values do |items|
    calculate_based_on_items(items)
  end
end

#repeat_today?Boolean

Returns:

  • (Boolean)


18
19
20
# File 'app/queries/workarea/order_metrics.rb', line 18

def repeat_today?
  user.last_order_at.present? && user.last_order_at.today?
end

#sales_dataObject



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'app/queries/workarea/order_metrics.rb', line 22

def sales_data
  @sales_data ||= begin
    based_on_items = calculate_based_on_items(items)

    {
      orders: 1,
      returning_orders: first_time_customer? ? 0 : 1,
      customers: repeat_today? ? 0 : 1,
      units_sold: quantity,
      discounted_units_sold: based_on_items[:discounted_units_sold],
      merchandise: based_on_items[:merchandise],
      discounts: discount_adjustments.sum,
      shipping: shipping_before_discounts,
      tax: tax_total,
      revenue: total_price
    }
  end
end

#searchesObject



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'app/queries/workarea/order_metrics.rb', line 61

def searches
  @searches ||= items_by_via
    .select { |gid| gid.model_class.name == 'Workarea::Navigation::SearchResults' }
    .reduce({}) do |memo, (gid, data)|
      query_id = gid.find.query_string.id

      memo[query_id] ||= Hash.new(0)
      memo[query_id][:orders] = 1

      memo[query_id][:units_sold] += data[:units_sold]
      memo[query_id][:discounted_units_sold] += data[:discounted_units_sold]
      memo[query_id][:merchandise] += data[:merchandise]
      memo[query_id][:discounts] += data[:discounts]
      memo[query_id][:tax] += data[:tax]
      memo[query_id][:revenue] += data[:revenue]
      memo
    end
end

#shipping_before_discountsObject



41
42
43
44
45
46
47
# File 'app/queries/workarea/order_metrics.rb', line 41

def shipping_before_discounts
  all_price_adjustments
    .select { |pa| pa.price == 'shipping' }
    .reject(&:discount?)
    .map(&:amount)
    .sum
end

#shippingsObject



111
112
113
# File 'app/queries/workarea/order_metrics.rb', line 111

def shippings
  @shippings ||= Shipping.by_order(order.id)
end

#skusObject



80
81
82
83
84
# File 'app/queries/workarea/order_metrics.rb', line 80

def skus
  @skus ||= order.items.group_by(&:sku).transform_values do |items|
    calculate_based_on_items(items)
  end
end

#userObject



10
11
12
# File 'app/queries/workarea/order_metrics.rb', line 10

def user
  @user ||= Metrics::User.find_or_initialize_by(id: email)
end