effective_orders 4.4.1 → 4.4.2

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -33,8 +33,6 @@ module EffectiveOrdersHelper
33
33
  end
34
34
 
35
35
  def order_checkout_label(processor = nil)
36
- return 'Checkout' if (EffectiveOrders.single_payment_processor? && ![:pretend, :mark_as_paid, :free, :refund].include?(processor))
37
-
38
36
  case processor
39
37
  when :cheque
40
38
  'Pay by Cheque'
@@ -46,12 +44,14 @@ module EffectiveOrdersHelper
46
44
  'Checkout with Credit Card'
47
45
  when :paypal
48
46
  'Checkout with PayPal'
47
+ when :phone
48
+ 'Pay by Phone'
49
49
  when :pretend
50
50
  'Purchase Order (skip payment processor)'
51
51
  when :refund
52
52
  'Accept Refund'
53
53
  when :stripe
54
- 'Checkout with Credit Card'
54
+ 'Pay Now'
55
55
  else
56
56
  'Checkout'
57
57
  end
@@ -72,14 +72,14 @@ module EffectiveOrdersHelper
72
72
  render(partial: 'effective/orders/order', locals: { order: order })
73
73
  end
74
74
 
75
- def render_checkout(order, namespace: nil, purchased_url: nil, declined_url: nil)
75
+ def render_checkout(order, namespace: nil, purchased_url: nil, declined_url: nil, deferred_url: nil)
76
76
  raise 'unable to checkout an order without a user' unless order && order.user
77
77
 
78
- locals = { order: order, purchased_url: purchased_url, declined_url: declined_url, namespace: namespace }
78
+ locals = { order: order, purchased_url: purchased_url, declined_url: declined_url, deferred_url: deferred_url, namespace: namespace }
79
79
 
80
80
  if order.purchased?
81
81
  render(partial: 'effective/orders/order', locals: locals)
82
- elsif order.confirmed? && order.errors.blank?
82
+ elsif (order.confirmed? || order.deferred?) && order.errors.blank?
83
83
  render(partial: 'effective/orders/checkout_step2', locals: locals)
84
84
  else
85
85
  render(partial: 'effective/orders/checkout_step1', locals: locals)
@@ -31,6 +31,4 @@ module EffectiveSubscriptionsHelper
31
31
  render('effective/customers/form', subscripter: subscripter)
32
32
  end
33
33
 
34
-
35
-
36
34
  end
@@ -28,6 +28,7 @@ module Effective
28
28
  end
29
29
 
30
30
  # This is sent when an admin creates a new order or /admin/orders/new
31
+ # Or when Pay by Cheque or Pay by Phone (deferred payments)
31
32
  # Or uses the order action Send Payment Request
32
33
  def payment_request_to_buyer(order_param)
33
34
  return true unless EffectiveOrders.mailer[:send_payment_request_to_buyer]
@@ -112,6 +112,10 @@ module Effective
112
112
  validates :payment_card, presence: true
113
113
  end
114
114
 
115
+ with_options if: -> { deferred? } do
116
+ validates :payment_provider, presence: true, inclusion: { in: EffectiveOrders.deferred_providers }
117
+ end
118
+
115
119
  scope :deep, -> { includes(:user, order_items: :purchasable) }
116
120
  scope :sorted, -> { order(:id) }
117
121
 
@@ -121,7 +125,9 @@ module Effective
121
125
 
122
126
  scope :pending, -> { where(state: EffectiveOrders::PENDING) }
123
127
  scope :confirmed, -> { where(state: EffectiveOrders::CONFIRMED) }
128
+ scope :deferred, -> { where(state: EffectiveOrders::DEFERRED) }
124
129
  scope :declined, -> { where(state: EffectiveOrders::DECLINED) }
130
+ scope :refunds, -> { purchased.where('total < ?', 0) }
125
131
 
126
132
  # Effective::Order.new()
127
133
  # Effective::Order.new(Product.first)
@@ -224,6 +230,10 @@ module Effective
224
230
  state == EffectiveOrders::CONFIRMED
225
231
  end
226
232
 
233
+ def deferred?
234
+ state == EffectiveOrders::DEFERRED
235
+ end
236
+
227
237
  def purchased?(provider = nil)
228
238
  return false if (state != EffectiveOrders::PURCHASED)
229
239
  return true if provider.nil? || payment_provider == provider.to_s
@@ -291,9 +301,9 @@ module Effective
291
301
  true
292
302
  end
293
303
 
304
+ # Used by admin checkout only
294
305
  def confirm!
295
- self.state = EffectiveOrders::CONFIRMED
296
- save!
306
+ update!(state: EffectiveOrders::CONFIRMED)
297
307
  end
298
308
 
299
309
  # This lets us skip to the confirmed workflow for an admin...
@@ -346,6 +356,21 @@ module Effective
346
356
  true
347
357
  end
348
358
 
359
+ def defer!(provider: 'none', email: true)
360
+ return false if purchased?
361
+
362
+ assign_attributes(
363
+ state: EffectiveOrders::DEFERRED,
364
+ payment_provider: provider
365
+ )
366
+
367
+ save!
368
+
369
+ send_payment_request_to_buyer! if email
370
+
371
+ true
372
+ end
373
+
349
374
  def decline!(payment: 'none', provider: 'none', card: 'none', validate: true)
350
375
  return false if declined?
351
376
 
@@ -0,0 +1,18 @@
1
+ = dropdown(variation: :dropleft) do
2
+ = dropdown_link_to 'View', effective_orders.admin_order_path(order)
3
+
4
+ - if order.purchased? == false
5
+ = dropdown_link_to 'Edit', effective_orders.edit_admin_order_path(order)
6
+
7
+ - if order.purchased?
8
+ = dropdown_link_to 'Email receipt to buyer', effective_orders.send_buyer_receipt_order_path(order),
9
+ data: { confirm: "Send receipt to #{order.user.email}?" }
10
+
11
+ - if order.pending? || order.confirmed? || order.deferred?
12
+ = dropdown_link_to 'Email request for payment to buyer', effective_orders.send_payment_request_admin_order_path(order),
13
+ data: { method: :post, confirm: "Send request for payment to #{order.user.email}?" }
14
+
15
+ = dropdown_link_to 'Admin: Checkout', effective_orders.checkout_admin_order_path(order)
16
+
17
+ = dropdown_link_to "Delete #{order}", effective_orders.admin_order_path(order),
18
+ data: { method: :delete, confirm: "Really delete #{order}?" }
@@ -5,7 +5,7 @@
5
5
  = link_to 'Change Addresses', effective_orders.edit_order_path(order), rel: :nofollow, class: 'btn btn-secondary'
6
6
 
7
7
  .effective-order-purchase-actions
8
- - provider_locals = { order: order, purchased_url: purchased_url, declined_url: declined_url }
8
+ - provider_locals = { order: order, purchased_url: purchased_url, declined_url: declined_url, deferred_url: deferred_url }
9
9
 
10
10
  - if EffectiveOrders.free? && order.free?
11
11
  = render partial: '/effective/orders/free/form', locals: provider_locals
@@ -14,9 +14,6 @@
14
14
  = render partial: '/effective/orders/refund/form', locals: provider_locals
15
15
 
16
16
  - else
17
- - if EffectiveOrders.pretend? && EffectiveOrders.pretend_message.present?
18
- %p.text-right= EffectiveOrders.pretend_message
19
-
20
17
  - if EffectiveOrders.pretend?
21
18
  = render partial: '/effective/orders/pretend/form', locals: provider_locals
22
19
 
@@ -29,8 +26,9 @@
29
26
  - if EffectiveOrders.stripe?
30
27
  = render partial: '/effective/orders/stripe/form', locals: provider_locals
31
28
 
32
- - if EffectiveOrders.cheque? && order.user == current_user
33
- = render partial: '/effective/orders/cheque/form', locals: provider_locals
29
+ - if EffectiveOrders.deferred? && order.user == current_user
30
+ %p.my-4.text-center - or -
31
+ = render partial: '/effective/orders/deferred/form', locals: provider_locals
34
32
 
35
33
  - if EffectiveOrders.authorized?(controller, :admin, :effective_orders) && order.user != current_user
36
34
  - if EffectiveOrders.mark_as_paid?
@@ -0,0 +1,2 @@
1
+ = dropdown(variation: :dropleft) do
2
+ = dropdown_link_to (order.purchased? ? 'View' : 'Checkout'), effective_orders.order_path(order)
@@ -25,7 +25,7 @@
25
25
  = effective_address_fields(form, :shipping_address)
26
26
 
27
27
  - if EffectiveOrders.collect_note
28
- = render 'effective/orders/order_note_fields', form: form
28
+ = render 'effective/orders/fields_note', form: form
29
29
 
30
30
  - if EffectiveOrders.terms_and_conditions
31
- = render 'effective/orders/order_terms_and_conditions_fields', form: form
31
+ = render 'effective/orders/fields_terms', form: form
@@ -4,7 +4,8 @@
4
4
 
5
5
  = render partial: 'effective/orders/order_header', locals: { order: order }
6
6
  = render partial: 'effective/orders/order_shipping', locals: { order: order }
7
+ = render partial: 'effective/orders/order_deferred', locals: { order: order }
7
8
  = render partial: 'effective/orders/order_notes', locals: { order: order }
8
9
  = render partial: 'effective/orders/order_items', locals: { order: order }
9
- = render partial: 'effective/orders/order_payment_details', locals: { order: order }
10
+ = render partial: 'effective/orders/order_payment', locals: { order: order }
10
11
  = render partial: 'effective/orders/order_footer', locals: { order: order }
@@ -8,7 +8,7 @@
8
8
  data: { confirm: "Send receipt to #{order.user.email}?" }
9
9
 
10
10
  - if order.persisted? && EffectiveOrders.authorized?(controller, :admin, :effective_orders)
11
- - if order.pending? || order.confirmed?
11
+ - if order.pending? || order.confirmed? || order.deferred?
12
12
  = link_to 'Email request for payment to buyer', effective_orders.send_payment_request_admin_order_path(order),
13
13
  class: 'btn btn-secondary',
14
14
  data: { method: :post, confirm: "Send request for payment to #{order.user.email}?" }
@@ -0,0 +1,9 @@
1
+ - if order.deferred?
2
+ .effective-order-deferred
3
+ %table.table
4
+ %thead
5
+ %tr
6
+ %th Payment
7
+ %tbody
8
+ %tr
9
+ %td Waiting for payment by #{order.payment_provider}
@@ -14,7 +14,10 @@
14
14
  .col-sm-6
15
15
  - if order.purchased?
16
16
  %p Receipt: ##{order.to_param}
17
- %p Purchased at: #{order.purchased_at.strftime("%F %H:%M")}
18
17
  - elsif order.persisted?
19
18
  %p Order: ##{order.to_param}
19
+
20
+ - if order.purchased?
21
+ %p Purchased at: #{order.purchased_at.strftime("%F %H:%M")}
22
+ - else
20
23
  %p Date: #{Time.zone.now.strftime("%F %H:%M")}
@@ -1,5 +1,5 @@
1
- - include_download_column = order.purchased? && order.order_items.any? { |order_item| order_item.purchased_download_url.present? }
2
1
  - include_quantity_column = order.order_items.any? { |order_item| order_item.quantity > 1 }
2
+ - include_download_column = order.purchased? && order.order_items.any? { |order_item| order_item.purchased_download_url.present? }
3
3
 
4
4
  .effective-order-items
5
5
  %table.table
@@ -7,8 +7,10 @@
7
7
  %tr
8
8
  - if include_quantity_column
9
9
  %th.quantity Qty
10
+
10
11
  - if include_download_column
11
12
  %th.download Download
13
+
12
14
  %th.item= order.order_items.length > 1 ? 'Items' : 'Item'
13
15
  %th.price Price
14
16
 
@@ -17,15 +19,15 @@
17
19
  %tr
18
20
  - if include_quantity_column
19
21
  %td.quantity= item.quantity
22
+
20
23
  - if include_download_column
21
24
  %td.download
22
25
  - if item.purchased_download_url.present?
23
26
  = link_to 'download', item.purchased_download_url
24
27
  - else
25
28
  = '-'
26
- %td.item
27
- = item.name.html_safe
28
29
 
30
+ %td.item= item.name.html_safe
29
31
  %td.price= price_to_currency(item.subtotal)
30
32
 
31
33
  %tfoot
@@ -33,22 +35,29 @@
33
35
  %tr
34
36
  - if include_quantity_column
35
37
  %th.quantity
38
+
36
39
  - if include_download_column
37
40
  %th.download
41
+
38
42
  %th.subtotal Subtotal
39
43
  %td.price.subtotal-price= price_to_currency(order.subtotal)
44
+
40
45
  - if order.tax.to_i != 0
41
46
  %tr
42
47
  - if include_quantity_column
43
48
  %th.quantity
49
+
44
50
  - if include_download_column
45
51
  %th.download
52
+
46
53
  %th.tax Tax (#{tax_rate_to_percentage(order.tax_rate)})
47
54
  %td.price.tax-price= price_to_currency(order.tax)
55
+
48
56
  - if order.tax_rate.present?
49
57
  %tr
50
58
  - if include_quantity_column
51
59
  %th.quantity
60
+
52
61
  - if include_download_column
53
62
  %th.download
54
63
 
@@ -5,11 +5,13 @@
5
5
  %tr
6
6
  - if order.note.present?
7
7
  %th Note
8
+
8
9
  - if order.note_to_buyer.present?
9
10
  %th Receipt note
10
11
  %tbody
11
12
  %tr
12
13
  - if order.note.present?
13
14
  %td= order.note
15
+
14
16
  - if order.note_to_buyer.present?
15
17
  %td= order.note_to_buyer
@@ -0,0 +1,24 @@
1
+ - if order.purchased?
2
+ .effective-order-payment-details
3
+ %table.table
4
+ %thead
5
+ %tr
6
+ %th Payment
7
+ %th
8
+ %tbody
9
+ %tr
10
+ %td Provider
11
+ %td= order.payment_provider
12
+
13
+ - if order.payment_card.present?
14
+ %tr
15
+ %td Card
16
+ %td
17
+ = payment_card_label(order.payment_card)
18
+ - if order.payment.kind_of?(Hash)
19
+ = order.payment[:active_card] || order.payment['f4l4']
20
+
21
+ %tr
22
+ %td Purchased at
23
+ %td= order.purchased_at&.strftime('%F %H:%M')
24
+
@@ -1,5 +1,4 @@
1
- = effective_form_with(scope: :cheque, url: effective_orders.pay_by_cheque_order_path(order), method: :post) do |f|
2
- = hidden_field_tag(:purchased_url, purchased_url)
3
- = hidden_field_tag(:declined_url, declined_url)
1
+ = effective_form_with(scope: :cheque, url: effective_orders.cheque_order_path(order), method: :post) do |f|
2
+ = f.hidden_field :deferred_url, value: deferred_url
4
3
 
5
- = f.submit order_checkout_label(:cheque), border: false
4
+ = f.submit order_checkout_label(:cheque), center: true, border: false, 'data-confirm': EffectiveOrders.cheque[:confirm]
@@ -1,7 +1,5 @@
1
1
  %h1.effective-heading= @page_title
2
2
 
3
- %p= flash[:danger]
4
-
5
3
  %p.effective-orders-page-content
6
4
  = link_to 'Home', root_path
7
5
 
@@ -0,0 +1,13 @@
1
+ %h1.effective-heading= @page_title
2
+
3
+ %p.effective-orders-page-content
4
+ = link_to 'Home', root_path
5
+
6
+ %p.effective-orders-page-content
7
+ You have indicated that this order will be paid by #{@order.payment_provider}.
8
+ Your order will not be considered purchased until we receive your payment.
9
+ Please contact us at your earliest convenience.
10
+
11
+ = render @order
12
+
13
+ = link_to 'Continue', root_path, class: 'btn btn-primary'
@@ -0,0 +1,16 @@
1
+ .card
2
+ .card-body
3
+ %h2 Checkout Offline
4
+
5
+ %p
6
+ = succeed('.') do
7
+ Please indicate that you would like to pay by
8
+ = EffectiveOrders.deferred_providers.to_sentence(last_word_connector: ', or', two_words_connector: ' or ')
9
+
10
+ %p Your order will not be considered purchased until we receive your payment.
11
+
12
+ - provider_locals = { order: order, deferred_url: deferred_url, declined_url: declined_url }
13
+
14
+ .d-flex.justify-content-around
15
+ - EffectiveOrders.deferred_providers.each do |provider|
16
+ = render partial: "/effective/orders/#{provider}/form", locals: provider_locals
@@ -1,12 +1,3 @@
1
1
  %h1.effective-heading= @page_title
2
2
 
3
- - if @pending_orders.present?
4
- %h2 Pending Orders
5
- = render_orders(@pending_orders)
6
-
7
- - if @orders.present?
8
- %h2 Purchased Orders
9
- = render_orders(@orders)
10
-
11
- - unless (@pending_orders.present? || @orders.present?)
12
- %p You have no purchased orders.
3
+ = render_datatable(@datatable)
@@ -1,10 +1,8 @@
1
1
  .card
2
2
  .card-body
3
- %h2 Admin: Offline Payment
3
+ %h2 Admin: Mark as Paid
4
4
 
5
5
  = effective_form_with(model: order, url: effective_orders.mark_as_paid_order_path(order), method: :post) do |f|
6
- = hidden_field_tag(:purchased_url, purchased_url)
7
- = hidden_field_tag(:declined_url, declined_url)
8
6
  = f.select :payment_provider, EffectiveOrders.payment_providers, required: true
9
7
 
10
8
  = f.text_field :payment_card,
@@ -0,0 +1,4 @@
1
+ = effective_form_with(scope: :phone, url: effective_orders.phone_order_path(order), method: :post) do |f|
2
+ = f.hidden_field :deferred_url, value: deferred_url
3
+
4
+ = f.submit order_checkout_label(:phone), center: true, border: false, 'data-confirm': EffectiveOrders.phone[:confirm]
@@ -2,4 +2,7 @@
2
2
  = f.hidden_field :purchased_url, value: purchased_url
3
3
  = f.hidden_field :declined_url, value: declined_url
4
4
 
5
+ - if EffectiveOrders.pretend_message.present?
6
+ %p.text-right= EffectiveOrders.pretend_message
7
+
5
8
  = f.submit order_checkout_label(:pretend), border: false
@@ -4,7 +4,7 @@
4
4
 
5
5
  .card
6
6
  .card-body
7
- %h3= order_checkout_label(:stripe)
7
+ %h2 Checkout
8
8
  %p
9
9
  %em This checkout is powered by stripe.
10
10
 
@@ -28,4 +28,4 @@
28
28
  = render('effective/orders/stripe/element')
29
29
 
30
30
  .mt-4
31
- = f.submit 'Pay Now', center: true, border: false
31
+ = f.submit order_checkout_label(:stripe), center: true, border: false