Class: Effective::Datatables::Orders

Inherits:
Effective::Datatable
  • Object
show all
Defined in:
app/models/effective/datatables/orders.rb

Instance Method Summary collapse

Instance Method Details

#collectionObject



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'app/models/effective/datatables/orders.rb', line 42

def collection
  collection = Effective::Order.unscoped
    .joins(:user, :order_items)
    .group('users.email, orders.id')
    .select('orders.*, users.email AS email')
    .select("#{query_total} AS total")
    .select("#{query_items_list} AS items")
    .select("#{query_payment_method} AS payment_method")

  if EffectiveOrders.require_billing_address && defined?(EffectiveAddresses)
    addresses_tbl = EffectiveAddresses.addresses_table_name

    collection = collection
      .joins("LEFT JOIN (SELECT addressable_id, string_agg(#{addresses_tbl}.full_name, '!!SEP!!') AS buyer_name FROM #{addresses_tbl} WHERE #{addresses_tbl}.category = 'billing' AND #{addresses_tbl}.addressable_type = 'Effective::Order' GROUP BY #{addresses_tbl}.addressable_id) #{addresses_tbl} ON orders.id = #{addresses_tbl}.addressable_id")
      .group("#{addresses_tbl}.buyer_name")
      .select("#{addresses_tbl}.buyer_name AS buyer_name")
  end

  attributes[:user_id].present? ? collection.where(user_id: attributes[:user_id]) : collection
end

#query_items_listObject



75
76
77
# File 'app/models/effective/datatables/orders.rb', line 75

def query_items_list
  "string_agg(order_items.title, '!!SEP!!')"
end

#query_payment_methodObject



79
80
81
# File 'app/models/effective/datatables/orders.rb', line 79

def query_payment_method
  "COALESCE(SUBSTRING(payment FROM 'card: (\\w{1,2})\\n'), SUBSTRING(payment FROM 'action: (\\w+)_postback\\n'))"
end

#query_subtotalObject



63
64
65
# File 'app/models/effective/datatables/orders.rb', line 63

def query_subtotal
  'SUM(order_items.price * order_items.quantity)'
end

#query_taxObject



67
68
69
# File 'app/models/effective/datatables/orders.rb', line 67

def query_tax
  'SUM(CASE order_items.tax_exempt WHEN true THEN 0 ELSE ((order_items.price * order_items.quantity) * order_items.tax_rate) END)'
end

#query_totalObject



71
72
73
# File 'app/models/effective/datatables/orders.rb', line 71

def query_total
  'SUM((order_items.price * order_items.quantity) + (CASE order_items.tax_exempt WHEN true THEN 0 ELSE ((order_items.price * order_items.quantity) * order_items.tax_rate) END))'
end

#search_column(collection, table_column, search_term) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'app/models/effective/datatables/orders.rb', line 83

def search_column(collection, table_column, search_term)
  case table_column[:name]
  when 'subtotal'
    then collection.having("#{query_subtotal} = ?", (search_term.gsub(/[^0-9.]/, '').to_f * 100.0).to_i)
  when 'tax'
    then collection.having("#{query_tax} = ?", (search_term.gsub(/[^0-9.]/, '').to_f * 100.0).to_i)
  when 'total'
    then collection.having("#{query_total} = ?", (search_term.gsub(/[^0-9.]/, '').to_f * 100.0).to_i)
  when 'purchase_state'
    then search_term == 'abandoned' ? collection.where(purchase_state: nil) : super
  when 'items'
    then collection.having("#{query_items_list} ILIKE ?", "%#{search_term}%")
  when 'payment_method'
    then collection.having("#{query_payment_method} LIKE ?", "#{search_term}%")
  else
    super
  end
end