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



131
132
133
134
# File 'app/queries/workarea/order_metrics.rb', line 131

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

#categoriesObject



67
68
69
70
71
# File 'app/queries/workarea/order_metrics.rb', line 67

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

#countryObject



123
124
125
# File 'app/queries/workarea/order_metrics.rb', line 123

def country
  payment.address&.country&.alpha2
end

#discount_adjustmentsObject



136
137
138
# File 'app/queries/workarea/order_metrics.rb', line 136

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

#discountsObject



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'app/queries/workarea/order_metrics.rb', line 140

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)


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

def first_time_customer?
  user.orders.zero?
end


98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'app/queries/workarea/order_metrics.rb', line 98

def menus
  @menus ||= categories.reduce({}) do |memo, (category_id, data)|
    category = category_models[category_id]
    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

#occured_atObject



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

def occured_at
  order.placed_at
end

#paymentObject



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

def payment
  @payment ||= Payment.find_or_initialize_by(id: order.id)
end

#productsObject



61
62
63
64
65
# File 'app/queries/workarea/order_metrics.rb', line 61

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)


22
23
24
# File 'app/queries/workarea/order_metrics.rb', line 22

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

#sales_dataObject



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'app/queries/workarea/order_metrics.rb', line 26

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



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'app/queries/workarea/order_metrics.rb', line 73

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

#segmentsObject



164
165
166
167
168
# File 'app/queries/workarea/order_metrics.rb', line 164

def segments
  @segments ||= order.segment_ids.each_with_object({}) do |segment_id, data|
    data[segment_id] = sales_data
  end
end

#shipping_before_discountsObject



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

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

#shippingsObject



127
128
129
# File 'app/queries/workarea/order_metrics.rb', line 127

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

#skusObject



92
93
94
95
96
# File 'app/queries/workarea/order_metrics.rb', line 92

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

#tendersObject



157
158
159
160
161
162
# File 'app/queries/workarea/order_metrics.rb', line 157

def tenders
  @tenders ||= payment.tenders.each_with_object({}) do |tender, data|
    data[tender.slug] ||= { orders: 1, revenue: 0 }
    data[tender.slug][:revenue] += tender.amount
  end
end

#userObject



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

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

#user_dataObject



45
46
47
48
49
50
51
# File 'app/queries/workarea/order_metrics.rb', line 45

def user_data
  {
    email: email,
    revenue: total_price,
    discounts: sales_data[:discounts],
  }
end