effective_orders 4.4.1 → 4.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -3
  3. data/app/controllers/admin/customers_controller.rb +1 -1
  4. data/app/controllers/admin/order_items_controller.rb +1 -1
  5. data/app/controllers/admin/orders_controller.rb +1 -1
  6. data/app/controllers/effective/concerns/purchase.rb +30 -7
  7. data/app/controllers/effective/orders_controller.rb +9 -18
  8. data/app/controllers/effective/providers/cheque.rb +7 -24
  9. data/app/controllers/effective/providers/mark_as_paid.rb +2 -2
  10. data/app/controllers/effective/providers/phone.rb +22 -0
  11. data/app/datatables/{effective_customers_datatable.rb → admin/effective_customers_datatable.rb} +1 -1
  12. data/app/datatables/admin/effective_orders_datatable.rb +100 -0
  13. data/app/datatables/effective_orders_datatable.rb +24 -44
  14. data/app/helpers/effective_orders_helper.rb +6 -6
  15. data/app/helpers/effective_subscriptions_helper.rb +0 -2
  16. data/app/mailers/effective/orders_mailer.rb +1 -0
  17. data/app/models/effective/order.rb +27 -2
  18. data/app/views/admin/orders/_datatable_actions.html.haml +18 -0
  19. data/app/views/effective/orders/_checkout_step2.html.haml +4 -6
  20. data/app/views/effective/orders/_datatable_actions.html.haml +2 -0
  21. data/app/views/effective/orders/_fields.html.haml +2 -2
  22. data/app/views/effective/orders/{_order_note_fields.html.haml → _fields_note.html.haml} +0 -0
  23. data/app/views/effective/orders/{_order_terms_and_conditions_fields.html.haml → _fields_terms.html.haml} +0 -0
  24. data/app/views/effective/orders/_order.html.haml +2 -1
  25. data/app/views/effective/orders/_order_actions.html.haml +1 -1
  26. data/app/views/effective/orders/_order_deferred.html.haml +9 -0
  27. data/app/views/effective/orders/_order_header.html.haml +4 -1
  28. data/app/views/effective/orders/_order_items.html.haml +12 -3
  29. data/app/views/effective/orders/_order_notes.html.haml +2 -0
  30. data/app/views/effective/orders/_order_payment.html.haml +24 -0
  31. data/app/views/effective/orders/cheque/_form.html.haml +3 -4
  32. data/app/views/effective/orders/declined.html.haml +0 -2
  33. data/app/views/effective/orders/deferred.html.haml +13 -0
  34. data/app/views/effective/orders/deferred/_form.html.haml +16 -0
  35. data/app/views/effective/orders/index.html.haml +1 -10
  36. data/app/views/effective/orders/mark_as_paid/_form.html.haml +1 -3
  37. data/app/views/effective/orders/phone/_form.html.haml +4 -0
  38. data/app/views/effective/orders/pretend/_form.html.haml +3 -0
  39. data/app/views/effective/orders/stripe/_form.html.haml +2 -2
  40. data/config/effective_orders.rb +13 -3
  41. data/config/routes.rb +3 -1
  42. data/lib/effective_orders.rb +21 -6
  43. data/lib/effective_orders/version.rb +1 -1
  44. metadata +13 -8
  45. data/app/datatables/effective_order_items_datatable.rb +0 -99
  46. data/app/views/admin/orders/_actions.html.haml +0 -22
  47. data/app/views/effective/orders/_order_payment_details.html.haml +0 -18
  48. data/app/views/effective/orders/cheque/pay_by_cheque.html.haml +0 -7
@@ -163,11 +163,12 @@ EffectiveOrders.setup do |config|
163
163
  #######################################
164
164
 
165
165
  # Cheque
166
+ # This is an deferred payment
166
167
  config.cheque = false
167
168
 
168
169
  # config.cheque = {
169
- # confirm: 'Your order will not be considered purchased until we receive your cheque. Proceed with pay by cheque?',
170
- # success_message: 'Thank you! You have indicated that this order will be purchased by cheque. Please send us a cheque and a copy of this invoice at your earliest convenience. We will mark this order purchased upon receiving payment.'
170
+ # confirm: 'Proceed with pay by cheque?',
171
+ # success: 'Thank you! You have indicated that this order will be purchased by cheque. Please send us a cheque and a copy of this invoice at your earliest convenience.'
171
172
  # }
172
173
 
173
174
  # Moneris
@@ -216,11 +217,20 @@ EffectiveOrders.setup do |config|
216
217
  # }
217
218
  # end
218
219
 
220
+ # Phone
221
+ # This is an deferred payment
222
+ config.phone = false
223
+
224
+ # config.phone = {
225
+ # confirm: 'Proceed with pay by phone?',
226
+ # success: 'Thank you! You have indicated that this order will be purchased by phone. Please give us a call at your earliest convenience.'
227
+ # }
228
+
219
229
 
220
230
  # Refunds
221
231
  # This does not issue a refund with the payment processor at all.
222
232
  # Instead, we mark the order as purchased, create a refund object to track it, and
223
- # send an email to notify_email with instructions to issue a refund
233
+ # send an email to mailer[:admin_email] with instructions to issue a refund
224
234
  config.refund = false
225
235
 
226
236
  # config.refund = {
data/config/routes.rb CHANGED
@@ -3,12 +3,14 @@ EffectiveOrders::Engine.routes.draw do
3
3
  resources :orders, except: [:destroy] do
4
4
  member do
5
5
  get :purchased
6
+ get :deferred
6
7
  get :declined
7
8
  get :send_buyer_receipt
8
9
 
9
10
  post :free if EffectiveOrders.free?
10
11
  post :mark_as_paid if EffectiveOrders.mark_as_paid?
11
- post :pay_by_cheque if EffectiveOrders.cheque?
12
+ post :cheque if EffectiveOrders.cheque?
13
+ post :phone if EffectiveOrders.phone?
12
14
  post :pretend if EffectiveOrders.pretend?
13
15
  post :refund if EffectiveOrders.refund?
14
16
  post :stripe if EffectiveOrders.stripe?
@@ -3,12 +3,13 @@ require 'effective_orders/engine'
3
3
  require 'effective_orders/version'
4
4
 
5
5
  module EffectiveOrders
6
- PENDING = 'pending'.freeze
7
- CONFIRMED = 'confirmed'.freeze
8
- PURCHASED = 'purchased'.freeze
9
- DECLINED = 'declined'.freeze
6
+ PENDING = 'pending'.freeze # New orders are created in a pending state
7
+ CONFIRMED = 'confirmed'.freeze # Once the order has passed checkout step 1
8
+ DEFERRED = 'deferred'.freeze # Deferred providers. Cheque or Phone was selected.
9
+ PURCHASED = 'purchased'.freeze # Purchased by provider
10
+ DECLINED = 'declined'.freeze # Declined by provider
10
11
 
11
- STATES = { PENDING => PENDING, CONFIRMED => CONFIRMED, PURCHASED => PURCHASED, DECLINED => DECLINED }
12
+ STATES = { PENDING => PENDING, CONFIRMED => CONFIRMED, DEFERRED => DEFERRED, PURCHASED => PURCHASED, DECLINED => DECLINED }
12
13
 
13
14
  # Subscription statuses (as per stripe)
14
15
  ACTIVE = 'active'.freeze
@@ -58,6 +59,7 @@ module EffectiveOrders
58
59
  mattr_accessor :cheque
59
60
  mattr_accessor :moneris
60
61
  mattr_accessor :paypal
62
+ mattr_accessor :phone
61
63
  mattr_accessor :refund
62
64
  mattr_accessor :stripe
63
65
  mattr_accessor :subscriptions # Stripe subscriptions
@@ -101,6 +103,10 @@ module EffectiveOrders
101
103
  free_enabled == true
102
104
  end
103
105
 
106
+ def self.deferred?
107
+ deferred_providers.present?
108
+ end
109
+
104
110
  def self.mark_as_paid?
105
111
  mark_as_paid_enabled == true
106
112
  end
@@ -113,6 +119,10 @@ module EffectiveOrders
113
119
  paypal.kind_of?(Hash)
114
120
  end
115
121
 
122
+ def self.phone?
123
+ phone.kind_of?(Hash)
124
+ end
125
+
116
126
  def self.pretend?
117
127
  pretend_enabled == true
118
128
  end
@@ -140,11 +150,12 @@ module EffectiveOrders
140
150
  # The Effective::Order.payment_provider value must be in this collection
141
151
  def self.payment_providers
142
152
  [
143
- ('cheque' if cheque? || mark_as_paid?),
153
+ ('cheque' if cheque?),
144
154
  ('credit card' if mark_as_paid?),
145
155
  ('free' if free?),
146
156
  ('moneris' if moneris?),
147
157
  ('paypal' if paypal?),
158
+ ('phone' if phone?),
148
159
  ('pretend' if pretend?),
149
160
  ('refund' if refund?),
150
161
  ('stripe' if stripe?),
@@ -153,6 +164,10 @@ module EffectiveOrders
153
164
  ].compact
154
165
  end
155
166
 
167
+ def self.deferred_providers
168
+ [('cheque' if cheque?), ('phone' if phone?)].compact
169
+ end
170
+
156
171
  def self.can_skip_checkout_step1?
157
172
  return false if require_billing_address
158
173
  return false if require_shipping_address
@@ -1,3 +1,3 @@
1
1
  module EffectiveOrders
2
- VERSION = '4.4.1'.freeze
2
+ VERSION = '4.4.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_orders
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.1
4
+ version: 4.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
@@ -138,13 +138,14 @@ files:
138
138
  - app/controllers/effective/providers/mark_as_paid.rb
139
139
  - app/controllers/effective/providers/moneris.rb
140
140
  - app/controllers/effective/providers/paypal.rb
141
+ - app/controllers/effective/providers/phone.rb
141
142
  - app/controllers/effective/providers/pretend.rb
142
143
  - app/controllers/effective/providers/refund.rb
143
144
  - app/controllers/effective/providers/stripe.rb
144
145
  - app/controllers/effective/subscripter_controller.rb
145
146
  - app/controllers/effective/webhooks_controller.rb
146
- - app/datatables/effective_customers_datatable.rb
147
- - app/datatables/effective_order_items_datatable.rb
147
+ - app/datatables/admin/effective_customers_datatable.rb
148
+ - app/datatables/admin/effective_orders_datatable.rb
148
149
  - app/datatables/effective_orders_datatable.rb
149
150
  - app/helpers/effective_carts_helper.rb
150
151
  - app/helpers/effective_orders_helper.rb
@@ -170,7 +171,7 @@ files:
170
171
  - app/views/admin/customers/index.html.haml
171
172
  - app/views/admin/customers/show.html.haml
172
173
  - app/views/admin/order_items/index.html.haml
173
- - app/views/admin/orders/_actions.html.haml
174
+ - app/views/admin/orders/_datatable_actions.html.haml
174
175
  - app/views/admin/orders/_form.html.haml
175
176
  - app/views/admin/orders/_form_note_internal.html.haml
176
177
  - app/views/admin/orders/_order_actions.html.haml
@@ -190,21 +191,24 @@ files:
190
191
  - app/views/effective/orders/_checkout_actions.html.haml
191
192
  - app/views/effective/orders/_checkout_step1.html.haml
192
193
  - app/views/effective/orders/_checkout_step2.html.haml
194
+ - app/views/effective/orders/_datatable_actions.html.haml
193
195
  - app/views/effective/orders/_fields.html.haml
196
+ - app/views/effective/orders/_fields_note.html.haml
197
+ - app/views/effective/orders/_fields_terms.html.haml
194
198
  - app/views/effective/orders/_order.html.haml
195
199
  - app/views/effective/orders/_order_actions.html.haml
200
+ - app/views/effective/orders/_order_deferred.html.haml
196
201
  - app/views/effective/orders/_order_footer.html.haml
197
202
  - app/views/effective/orders/_order_header.html.haml
198
203
  - app/views/effective/orders/_order_items.html.haml
199
- - app/views/effective/orders/_order_note_fields.html.haml
200
204
  - app/views/effective/orders/_order_notes.html.haml
201
- - app/views/effective/orders/_order_payment_details.html.haml
205
+ - app/views/effective/orders/_order_payment.html.haml
202
206
  - app/views/effective/orders/_order_shipping.html.haml
203
- - app/views/effective/orders/_order_terms_and_conditions_fields.html.haml
204
207
  - app/views/effective/orders/_orders_table.html.haml
205
208
  - app/views/effective/orders/cheque/_form.html.haml
206
- - app/views/effective/orders/cheque/pay_by_cheque.html.haml
207
209
  - app/views/effective/orders/declined.html.haml
210
+ - app/views/effective/orders/deferred.html.haml
211
+ - app/views/effective/orders/deferred/_form.html.haml
208
212
  - app/views/effective/orders/edit.html.haml
209
213
  - app/views/effective/orders/free/_form.html.haml
210
214
  - app/views/effective/orders/index.html.haml
@@ -212,6 +216,7 @@ files:
212
216
  - app/views/effective/orders/moneris/_form.html.haml
213
217
  - app/views/effective/orders/new.html.haml
214
218
  - app/views/effective/orders/paypal/_form.html.haml
219
+ - app/views/effective/orders/phone/_form.html.haml
215
220
  - app/views/effective/orders/pretend/_form.html.haml
216
221
  - app/views/effective/orders/purchased.html.haml
217
222
  - app/views/effective/orders/refund/_form.html.haml
@@ -1,99 +0,0 @@
1
- class EffectiveOrderItemsDatatable < Effective::Datatable
2
- datatable do
3
- order :purchased_at, :desc
4
-
5
- col(:purchased_at, sql_column: 'orders.purchased_at') do |order_item|
6
- Time.at(order_item[:purchased_at]).in_time_zone if order_item[:purchased_at].present?
7
- end
8
-
9
- col :id, visible: false
10
-
11
- col :order
12
-
13
- # if effectiveorders.obfuscate_order_ids
14
- # col(:order, type: :obfuscated_id) do |order_item|
15
- # obfuscated_id = effective::order.obfuscate(order_item[:order_id])
16
- # link_to(obfuscated_id, (datatables_admin_path? ? effective_orders.admin_order_path(obfuscated_id) : effective_orders.order_path(obfuscated_id)))
17
- # end
18
- # else
19
- # col(:order) do |order_item|
20
- # link_to(order_item.to_param, (datatables_admin_path? ? effective_orders.admin_order_path(order_item.to_param) : effective_orders.order_path(order_item.to_param)))
21
- # end
22
- # end
23
-
24
- unless attributes[:user_id]
25
- col :email, sql_column: 'users.email', label: 'Buyer Email' do |order_item|
26
- link_to order_item[:email], (edit_admin_user_path(order_item[:user_id]) rescue admin_user_path(order_item[:user_id]) rescue '#')
27
- end
28
- end
29
-
30
- # if EffectiveOrders.billing_address && attributes[:user_id].blank?
31
- # col :buyer_name, sort: false, label: 'Buyer Name' do |order_item|
32
- # (order_item[:buyer_name] || '').split('!!SEP!!').find(&:present?)
33
- # end
34
- # end
35
-
36
- col :state, sql_column: 'orders.state', search: { collection: [%w(abandoned abandoned), [EffectiveOrders::PURCHASED, EffectiveOrders::PURCHASED], [EffectiveOrders::DECLINED, EffectiveOrders::DECLINED]], selected: EffectiveOrders::PURCHASED } do |order_item|
37
- order_item[:state] || 'abandoned'
38
- end
39
-
40
- col :name do |order_item|
41
- order_item.quantity == 1 ? order_item.name : "#{order_item.name} (#{order_item.quantity} purchased)"
42
- end
43
-
44
- # col :subtotal, as: :price
45
- # col :tax, as: :price
46
- # col :total, as: :price
47
-
48
- col :created_at, visible: false
49
- col :updated_at, visible: false
50
- end
51
-
52
- collection do
53
- collection = Effective::OrderItem.unscoped
54
- .joins(order: :user)
55
- .select('order_items.*, orders.*, users.email AS email')
56
- .select("#{query_subtotal} AS subtotal, #{query_tax} AS tax, #{query_total} AS total")
57
- .group('order_items.id, orders.id, users.email')
58
-
59
- if EffectiveOrders.billing_address && defined?(EffectiveAddresses)
60
- addresses_tbl = EffectiveAddresses.addresses_table_name
61
-
62
- collection = collection
63
- .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")
64
- .group("#{addresses_tbl}.buyer_name")
65
- .select("#{addresses_tbl}.buyer_name AS buyer_name")
66
- end
67
-
68
- attributes[:user_id].present? ? collection.where("#{EffectiveOrders.orders_table_name.to_s}.user_id = ?", attributes[:user_id]) : collection
69
- end
70
-
71
- def query_subtotal
72
- 'SUM(price * quantity)'
73
- end
74
-
75
- def query_total
76
- 'SUM((price * quantity) + (CASE tax_exempt WHEN true THEN 0 ELSE ((price * quantity) * tax_rate) END))'
77
- end
78
-
79
- def query_tax
80
- '(CASE tax_exempt WHEN true THEN 0 ELSE ((price * quantity) * tax_rate) END)'
81
- end
82
-
83
- # def search_column(collection, table_column, search_term)
84
- # if table_column[:name] == 'order'
85
- # collection.where("#{EffectiveOrders.order_items_table_name.to_s}.order_id = ?", Effective::Order.deobfuscate(search_term))
86
- # elsif table_column[:name] == 'state' && search_term == 'abandoned'
87
- # collection.where("#{EffectiveOrders.orders_table_name.to_s}.state IS NULL")
88
- # elsif table_column[:name] == 'subtotal'
89
- # collection.having("#{query_subtotal} = ?", (search_term.gsub(/[^0-9.]/, '').to_f * 100.0).to_i)
90
- # elsif table_column[:name] == 'tax'
91
- # collection.having("#{query_tax} = ?", (search_term.gsub(/[^0-9.]/, '').to_f * 100.0).to_i)
92
- # elsif table_column[:name] == 'total'
93
- # collection.having("#{query_total} = ?", (search_term.gsub(/[^0-9.]/, '').to_f * 100.0).to_i)
94
- # else
95
- # super
96
- # end
97
- # end
98
-
99
- end
@@ -1,22 +0,0 @@
1
- = dropdown(variation: :dropleft) do
2
- - if datatable.admin_namespace?
3
- = dropdown_link_to 'View', effective_orders.admin_order_path(order)
4
-
5
- - if order.purchased? == false
6
- = dropdown_link_to 'Edit', effective_orders.edit_admin_order_path(order)
7
-
8
- - if order.purchased?
9
- = dropdown_link_to 'Email receipt to buyer', effective_orders.send_buyer_receipt_order_path(order),
10
- data: { confirm: "Send receipt to #{order.user.email}?" }
11
-
12
- - if order.pending? || order.confirmed?
13
- = dropdown_link_to 'Email request for payment to buyer', effective_orders.send_payment_request_admin_order_path(order),
14
- data: { method: :post, confirm: "Send request for payment to #{order.user.email}?" }
15
-
16
- = dropdown_link_to 'Admin: Checkout', effective_orders.checkout_admin_order_path(order)
17
-
18
- = dropdown_link_to "Delete #{order}", effective_orders.admin_order_path(order),
19
- data: { method: :delete, confirm: "Really delete #{order}?" }
20
-
21
- - else
22
- = dropdown_link_to 'View', effective_orders.order_path(order)
@@ -1,18 +0,0 @@
1
- - if order.purchased? && EffectiveOrders.authorized?(controller, :show, :payment_details)
2
- .effective-order-payment-details
3
- %h2 Payment Details
4
- %table.table
5
- %tbody
6
- %tr
7
- %td Provider
8
- %td= order.payment_provider
9
- %tr
10
- %td Card
11
- %td
12
- = payment_card_label(order.payment_card)
13
- = (order.payment['f4l4'] rescue nil)
14
-
15
- %tr
16
- %td Purchased at
17
- %td= order.purchased_at.strftime('%F %H:%M')
18
-
@@ -1,7 +0,0 @@
1
- %h1.effective-heading= @page_title
2
-
3
- - if EffectiveOrders.cheque[:success_message].present?
4
- %p.effective-orders-page-content
5
- = EffectiveOrders.cheque[:success_message]
6
-
7
- = render @order