Class: Workarea::OrderMetrics
- Inherits:
-
Object
- Object
- Workarea::OrderMetrics
- Defined in:
- app/queries/workarea/order_metrics.rb
Instance Attribute Summary collapse
-
#order ⇒ Object
readonly
Returns the value of attribute order.
Instance Method Summary collapse
- #all_price_adjustments ⇒ Object
- #categories ⇒ Object
- #country ⇒ Object
- #discount_adjustments ⇒ Object
- #discounts ⇒ Object
- #first_time_customer? ⇒ Boolean
-
#initialize(order) ⇒ OrderMetrics
constructor
A new instance of OrderMetrics.
- #menus ⇒ Object
- #occured_at ⇒ Object
- #payment ⇒ Object
- #products ⇒ Object
- #repeat_today? ⇒ Boolean
- #sales_data ⇒ Object
- #searches ⇒ Object
- #segments ⇒ Object
- #shipping_before_discounts ⇒ Object
- #shippings ⇒ Object
- #skus ⇒ Object
- #tenders ⇒ Object
- #user ⇒ Object
- #user_data ⇒ Object
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
#order ⇒ Object (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_adjustments ⇒ Object
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 |
#categories ⇒ Object
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 |
#country ⇒ Object
123 124 125 |
# File 'app/queries/workarea/order_metrics.rb', line 123 def country payment.address&.country&.alpha2 end |
#discount_adjustments ⇒ Object
136 137 138 |
# File 'app/queries/workarea/order_metrics.rb', line 136 def discount_adjustments all_price_adjustments.select(&:discount?) end |
#discounts ⇒ Object
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
18 19 20 |
# File 'app/queries/workarea/order_metrics.rb', line 18 def first_time_customer? user.orders.zero? end |
#menus ⇒ Object
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 ||= 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 || memo[] ||= Hash.new(0) memo[][:orders] = 1 memo[][:units_sold] += data[:units_sold] memo[][:discounted_units_sold] += data[:discounted_units_sold] memo[][:merchandise] += data[:merchandise] memo[][:discounts] += data[:discounts] memo[][:tax] += data[:tax] memo[][:revenue] += data[:revenue] end memo end end |
#occured_at ⇒ Object
10 11 12 |
# File 'app/queries/workarea/order_metrics.rb', line 10 def occured_at order.placed_at end |
#payment ⇒ Object
119 120 121 |
# File 'app/queries/workarea/order_metrics.rb', line 119 def payment @payment ||= Payment.find_or_initialize_by(id: order.id) end |
#products ⇒ Object
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
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_data ⇒ Object
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 |
#searches ⇒ Object
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 |
#segments ⇒ Object
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_discounts ⇒ Object
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 |
#shippings ⇒ Object
127 128 129 |
# File 'app/queries/workarea/order_metrics.rb', line 127 def shippings @shippings ||= Shipping.by_order(order.id) end |
#skus ⇒ Object
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 |
#tenders ⇒ Object
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 |
#user ⇒ Object
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_data ⇒ Object
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 |