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
- #products ⇒ Object
- #repeat_today? ⇒ Boolean
- #sales_data ⇒ Object
- #searches ⇒ Object
- #shipping_before_discounts ⇒ Object
- #shippings ⇒ Object
- #skus ⇒ Object
- #user ⇒ 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
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 |
#categories ⇒ Object
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 |
#country ⇒ Object
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_adjustments ⇒ Object
120 121 122 |
# File 'app/queries/workarea/order_metrics.rb', line 120 def discount_adjustments all_price_adjustments.select(&:discount?) end |
#discounts ⇒ Object
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
14 15 16 |
# File 'app/queries/workarea/order_metrics.rb', line 14 def first_time_customer? user.orders.zero? end |
#menus ⇒ Object
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 ||= 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?) ::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 |
#products ⇒ Object
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
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_data ⇒ Object
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 |
#searches ⇒ Object
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_discounts ⇒ Object
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 |
#shippings ⇒ Object
111 112 113 |
# File 'app/queries/workarea/order_metrics.rb', line 111 def shippings @shippings ||= Shipping.by_order(order.id) end |
#skus ⇒ Object
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 |
#user ⇒ Object
10 11 12 |
# File 'app/queries/workarea/order_metrics.rb', line 10 def user @user ||= Metrics::User.find_or_initialize_by(id: email) end |