effective_orders 6.6.2 → 6.7.0
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.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +1 -1
- data/app/controllers/admin/orders_controller.rb +2 -3
- data/app/controllers/effective/carts_controller.rb +3 -3
- data/app/controllers/effective/concerns/purchase.rb +1 -1
- data/app/controllers/effective/orders_controller.rb +1 -1
- data/app/datatables/admin/effective_orders_datatable.rb +3 -0
- data/app/datatables/effective_orders_datatable.rb +2 -0
- data/app/helpers/effective_stripe_helper.rb +1 -1
- data/app/models/concerns/acts_as_purchasable.rb +8 -8
- data/app/models/effective/order.rb +88 -63
- data/app/views/effective/orders/_datatable_actions.html.haml +4 -1
- data/app/views/effective/orders/_order_header.html.haml +4 -0
- data/app/views/effective/orders/show.html.haml +1 -1
- data/config/routes.rb +3 -0
- data/db/migrate/01_create_effective_orders.rb.erb +3 -1
- data/lib/effective_orders/version.rb +1 -1
- data/lib/effective_orders.rb +1 -21
- data/lib/generators/templates/effective_orders_mailer_preview.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b95b58112e836a932ba93507f74ab11a551110d5e656100be363fef929dff4f
|
4
|
+
data.tar.gz: baa58804ceab0264a4f87b9c97c1268c90a765d5d1d3bc86e224b6ec2e558982
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4bd65c532f86d5eeb602a4699ff87922f010137825bcfa960f82584f33fd61bb5d7f2db962fdbc93c7044c076597ee677e84b9285909a24d99864f192d8c360
|
7
|
+
data.tar.gz: fe9c072ee1aad78d10216fa930faafe7ebd569b21488347c674c9dc34fe590f23352e6a3820701df89d4366b869cc26d007c94bc2155d4bf4bf162bbb6db20e0
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -353,7 +353,7 @@ The permissions you actually want to define for a regular user are as follows (u
|
|
353
353
|
can [:manage], Effective::Cart, user_id: user.id
|
354
354
|
|
355
355
|
can [:manage], Effective::Order, user_id: user.id # Orders cannot be deleted
|
356
|
-
cannot [:edit, :update], Effective::Order,
|
356
|
+
cannot [:edit, :update], Effective::Order, status: 'purchased'
|
357
357
|
|
358
358
|
can [:manage], Effective::Subscription, user_id: user.id
|
359
359
|
```
|
@@ -46,8 +46,7 @@ module Admin
|
|
46
46
|
|
47
47
|
if request.get?
|
48
48
|
@order.assign_confirmed_if_valid!
|
49
|
-
render(:checkout)
|
50
|
-
return
|
49
|
+
return render(:checkout)
|
51
50
|
end
|
52
51
|
|
53
52
|
# Otherwise a post
|
@@ -96,7 +95,7 @@ module Admin
|
|
96
95
|
|
97
96
|
@orders.each { |order| order.send_payment_request_to_buyer! }
|
98
97
|
render json: { status: 200, message: "Successfully sent #{@orders.length} payment request emails"}
|
99
|
-
rescue => e
|
98
|
+
rescue Exception => e
|
100
99
|
render json: { status: 500, message: "Bulk send payment request error: #{e.message}" }
|
101
100
|
end
|
102
101
|
end
|
@@ -33,7 +33,7 @@ module Effective
|
|
33
33
|
def add_to_cart
|
34
34
|
@purchasable = (add_to_cart_params[:purchasable_type].constantize.find(add_to_cart_params[:purchasable_id].to_i) rescue nil)
|
35
35
|
|
36
|
-
EffectiveResources.authorize!(self, :
|
36
|
+
EffectiveResources.authorize!(self, :add_to_cart, current_cart)
|
37
37
|
|
38
38
|
begin
|
39
39
|
raise "Please select a valid #{add_to_cart_params[:purchasable_type] || 'item' }." unless @purchasable
|
@@ -42,7 +42,7 @@ module Effective
|
|
42
42
|
flash[:success] = 'Successfully added item to cart.'
|
43
43
|
rescue EffectiveOrders::SoldOutException
|
44
44
|
flash[:warning] = 'This item is sold out.'
|
45
|
-
rescue => e
|
45
|
+
rescue Exception => e
|
46
46
|
flash[:danger] = 'Unable to add item to cart: ' + e.message
|
47
47
|
end
|
48
48
|
|
@@ -52,7 +52,7 @@ module Effective
|
|
52
52
|
def remove_from_cart
|
53
53
|
@cart_item = current_cart.cart_items.find(remove_from_cart_params[:id])
|
54
54
|
|
55
|
-
EffectiveResources.authorize!(self, :
|
55
|
+
EffectiveResources.authorize!(self, :remove_from_cart, current_cart)
|
56
56
|
|
57
57
|
if @cart_item.destroy
|
58
58
|
flash[:success] = 'Successfully removed item from cart.'
|
@@ -25,7 +25,7 @@ module Effective
|
|
25
25
|
def order_deferred(provider:, email: true, deferred_url: nil)
|
26
26
|
@order.defer!(provider: provider, email: email)
|
27
27
|
|
28
|
-
Effective::Cart.where(user:
|
28
|
+
Effective::Cart.where(user: current_user).destroy_all if current_user.present?
|
29
29
|
|
30
30
|
if flash[:success].blank?
|
31
31
|
if email
|
@@ -133,7 +133,7 @@ module Effective
|
|
133
133
|
end
|
134
134
|
|
135
135
|
render json: { status: 200, message: "Successfully sent #{@orders.length} receipt emails"}
|
136
|
-
rescue => e
|
136
|
+
rescue Exception => e
|
137
137
|
render json: { status: 500, message: "Bulk send buyer receipt error: #{e.message}" }
|
138
138
|
end
|
139
139
|
end
|
@@ -20,6 +20,7 @@ module Admin
|
|
20
20
|
scope :purchased
|
21
21
|
|
22
22
|
scope :deferred if EffectiveOrders.deferred_providers.present?
|
23
|
+
scope :voided
|
23
24
|
|
24
25
|
scope :pending_refunds if EffectiveOrders.refund && !EffectiveOrders.buyer_purchases_refund?
|
25
26
|
scope :refunds if EffectiveOrders.refund
|
@@ -40,6 +41,8 @@ module Admin
|
|
40
41
|
'#' + order.to_param
|
41
42
|
end
|
42
43
|
|
44
|
+
col :status
|
45
|
+
|
43
46
|
col :purchased_at do |order|
|
44
47
|
order.purchased_at&.strftime('%F %H:%M') || ('pending refund' if order.pending_refund?) || ("pending #{order.payment_provider}" if order.deferred?) || 'not purchased'
|
45
48
|
end
|
@@ -9,6 +9,8 @@
|
|
9
9
|
# add_column :resources, :price, :integer
|
10
10
|
# add_column :resources, :tax_exempt, :boolean, default: false
|
11
11
|
# add_column :resources, :qb_item_name, :string
|
12
|
+
#
|
13
|
+
# You can also optionally add :purchased_at :datetime, and purchased_by_id and purchased_by_type
|
12
14
|
|
13
15
|
module ActsAsPurchasable
|
14
16
|
extend ActiveSupport::Concern
|
@@ -28,10 +30,10 @@ module ActsAsPurchasable
|
|
28
30
|
has_many :order_items, as: :purchasable, class_name: 'Effective::OrderItem'
|
29
31
|
has_many :orders, -> { order(:id) }, through: :order_items, class_name: 'Effective::Order'
|
30
32
|
|
31
|
-
has_many :purchased_orders, -> { where(
|
33
|
+
has_many :purchased_orders, -> { where(status: :purchased).order(:purchased_at) },
|
32
34
|
through: :order_items, class_name: 'Effective::Order', source: :order
|
33
35
|
|
34
|
-
has_many :deferred_orders, -> { where(
|
36
|
+
has_many :deferred_orders, -> { where(status: :deferred).order(:created_at) },
|
35
37
|
through: :order_items, class_name: 'Effective::Order', source: :order
|
36
38
|
|
37
39
|
# Database max integer value is 2147483647. So let's round that down and use a max/min of $20 million (2000000000)
|
@@ -50,10 +52,8 @@ module ActsAsPurchasable
|
|
50
52
|
scope :purchased, -> { where.not(purchased_order_id: nil) }
|
51
53
|
scope :not_purchased, -> { where(purchased_order_id: nil) }
|
52
54
|
|
53
|
-
|
54
|
-
|
55
|
-
scope :purchased_by, lambda { |user| joins(order_items: :order).where(orders: { user_id: user.try(:id), state: EffectiveOrders::PURCHASED }).distinct }
|
56
|
-
scope :not_purchased_by, lambda { |user| where('id NOT IN (?)', purchased_by(user).pluck(:id).presence || [0]) }
|
55
|
+
scope :purchased_by, lambda { |user| joins(order_items: :order).where(orders: { purchased_by: user, status: :purchased }).distinct }
|
56
|
+
scope :not_purchased_by, lambda { |user| where.not(id: purchased_by(user)) }
|
57
57
|
end
|
58
58
|
|
59
59
|
module ClassMethods
|
@@ -104,11 +104,11 @@ module ActsAsPurchasable
|
|
104
104
|
end
|
105
105
|
|
106
106
|
def purchased_at
|
107
|
-
purchased_order.try(:purchased_at)
|
107
|
+
self[:purchased_at] || purchased_order.try(:purchased_at)
|
108
108
|
end
|
109
109
|
|
110
110
|
def purchased_by?(user)
|
111
|
-
purchased_orders.any? { |order| order.
|
111
|
+
purchased_orders.any? { |order| order.purchased_by_id == user.id }
|
112
112
|
end
|
113
113
|
|
114
114
|
def purchased_download_url # Override me if this is a digital purchase.
|
@@ -1,24 +1,41 @@
|
|
1
|
-
# When an Order is first initialized it is done in the pending
|
2
|
-
# - when it's in the pending
|
1
|
+
# When an Order is first initialized it is done in the pending status
|
2
|
+
# - when it's in the pending status, none of the buyer entered information is required
|
3
3
|
# - when a pending order is rendered:
|
4
4
|
# - if the user has a billing address, go to step 2
|
5
5
|
# - if the user has no billing address, go to step 1
|
6
6
|
#
|
7
|
-
# After Step1, we go to the confirmed
|
8
|
-
# After Step2, we are in the purchased or declined
|
7
|
+
# After Step1, we go to the confirmed status
|
8
|
+
# After Step2, we are in the purchased or declined status
|
9
9
|
|
10
10
|
module Effective
|
11
11
|
class Order < ActiveRecord::Base
|
12
12
|
self.table_name = EffectiveOrders.orders_table_name.to_s
|
13
13
|
|
14
|
+
# Effective Resources
|
15
|
+
acts_as_statused(
|
16
|
+
:pending, # New orders are created in a pending state
|
17
|
+
:confirmed, # Once the order has passed checkout step 1
|
18
|
+
:deferred, # Deferred providers. cheque, etransfer or phone was selected.
|
19
|
+
:purchased, # Purchased by provider
|
20
|
+
:declined, # Declined by provider
|
21
|
+
:voided, # Voided by admin
|
22
|
+
:abandoned # Not set by this gem. Can be set outside it.
|
23
|
+
)
|
24
|
+
|
25
|
+
# Effective Addresses
|
26
|
+
acts_as_addressable(billing: { singular: true }, shipping: { singular: true })
|
27
|
+
|
28
|
+
# Effective Logging
|
29
|
+
log_changes if respond_to?(:log_changes)
|
30
|
+
|
31
|
+
# Effective Obfuscation
|
14
32
|
if EffectiveOrders.obfuscate_order_ids
|
15
33
|
raise('unsupported obfuscation with tenant') if defined?(Tenant)
|
16
34
|
acts_as_obfuscated format: '###-####-###'
|
17
35
|
end
|
18
36
|
|
19
|
-
|
37
|
+
# Effective Reports
|
20
38
|
acts_as_reportable if respond_to?(:acts_as_reportable)
|
21
|
-
log_changes if respond_to?(:log_changes)
|
22
39
|
|
23
40
|
attr_accessor :terms_and_conditions # Yes, I agree to the terms and conditions
|
24
41
|
attr_accessor :confirmed_checkout # Set on the Checkout Step 1
|
@@ -47,7 +64,10 @@ module Effective
|
|
47
64
|
|
48
65
|
# Attributes
|
49
66
|
effective_resource do
|
50
|
-
|
67
|
+
# Acts as Statused
|
68
|
+
status :string
|
69
|
+
status_steps :text
|
70
|
+
|
51
71
|
purchased_at :datetime
|
52
72
|
|
53
73
|
note :text # From buyer to admin
|
@@ -82,16 +102,17 @@ module Effective
|
|
82
102
|
scope :deep, -> { includes(:addresses, :user, :purchased_by, :organization, order_items: :purchasable) }
|
83
103
|
scope :sorted, -> { order(:id) }
|
84
104
|
|
85
|
-
scope :purchased, -> { where(
|
105
|
+
scope :purchased, -> { where(status: :purchased) }
|
86
106
|
scope :purchased_by, lambda { |user| purchased.where(user: user) }
|
87
|
-
scope :not_purchased, -> { where.not(
|
88
|
-
scope :was_not_purchased, -> { where.not(
|
107
|
+
scope :not_purchased, -> { where.not(status: [:purchased, :deferred]) }
|
108
|
+
scope :was_not_purchased, -> { where.not(status: :purchased) }
|
89
109
|
|
90
|
-
scope :pending, -> { where(
|
91
|
-
scope :confirmed, -> { where(
|
92
|
-
scope :deferred, -> { where(
|
93
|
-
scope :declined, -> { where(
|
94
|
-
scope :abandoned, -> { where(
|
110
|
+
scope :pending, -> { where(status: :pending) }
|
111
|
+
scope :confirmed, -> { where(status: :confirmed) }
|
112
|
+
scope :deferred, -> { where(status: :deferred) }
|
113
|
+
scope :declined, -> { where(status: :declined) }
|
114
|
+
scope :abandoned, -> { where(status: :abandoned) }
|
115
|
+
scope :voided, -> { where(status: :voided) }
|
95
116
|
|
96
117
|
scope :refunds, -> { purchased.where('total < ?', 0) }
|
97
118
|
scope :pending_refunds, -> { not_purchased.where('total < ?', 0) }
|
@@ -102,8 +123,7 @@ module Effective
|
|
102
123
|
end
|
103
124
|
|
104
125
|
before_validation do
|
105
|
-
|
106
|
-
self.state = EffectiveOrders::CONFIRMED if pending? && confirmed_checkout
|
126
|
+
assign_attributes(status: :confirmed) if pending? && confirmed_checkout
|
107
127
|
end
|
108
128
|
|
109
129
|
before_validation do
|
@@ -126,7 +146,6 @@ module Effective
|
|
126
146
|
validates :cc, email_cc: true
|
127
147
|
|
128
148
|
validates :order_items, presence: { message: 'No items are present. Please add additional items.' }
|
129
|
-
validates :state, inclusion: { in: EffectiveOrders::STATES.keys }
|
130
149
|
|
131
150
|
validate do
|
132
151
|
if EffectiveOrders.organization_enabled?
|
@@ -179,8 +198,12 @@ module Effective
|
|
179
198
|
end
|
180
199
|
end
|
181
200
|
|
201
|
+
validate(if: -> { was_voided? }) do
|
202
|
+
errors.add(:status, "cannot update a voided order") unless (voided? || pending?)
|
203
|
+
end
|
204
|
+
|
182
205
|
# Sanity check
|
183
|
-
before_save(if: -> {
|
206
|
+
before_save(if: -> { status_was.to_s == 'purchased' }) do
|
184
207
|
raise('cannot unpurchase an order') unless purchased?
|
185
208
|
|
186
209
|
raise('cannot change subtotal of a purchased order') if changes[:subtotal].present?
|
@@ -204,7 +227,7 @@ module Effective
|
|
204
227
|
# Effective::Order.new(items: Product.first, user: User.first, billing_address: Effective::Address.new, shipping_address: Effective::Address.new)
|
205
228
|
|
206
229
|
def initialize(atts = nil, &block)
|
207
|
-
super(
|
230
|
+
super(status: :pending) # Initialize with status pending
|
208
231
|
|
209
232
|
return self unless atts.present?
|
210
233
|
|
@@ -406,24 +429,12 @@ module Effective
|
|
406
429
|
Array(billing_name.to_s.split(' ')[1..-1]).join(' ')
|
407
430
|
end
|
408
431
|
|
409
|
-
def pending?
|
410
|
-
state == EffectiveOrders::PENDING
|
411
|
-
end
|
412
|
-
|
413
|
-
def confirmed?
|
414
|
-
state == EffectiveOrders::CONFIRMED
|
415
|
-
end
|
416
|
-
|
417
|
-
def deferred?
|
418
|
-
state == EffectiveOrders::DEFERRED
|
419
|
-
end
|
420
|
-
|
421
432
|
def in_progress?
|
422
433
|
pending? || confirmed? || deferred?
|
423
434
|
end
|
424
435
|
|
425
436
|
def done?
|
426
|
-
persisted? && (purchased? || declined?)
|
437
|
+
persisted? && (purchased? || declined? || voided? || abandoned?)
|
427
438
|
end
|
428
439
|
|
429
440
|
# A custom order is one that was created by an admin
|
@@ -433,15 +444,11 @@ module Effective
|
|
433
444
|
end
|
434
445
|
|
435
446
|
def purchased?(provider = nil)
|
436
|
-
return false if (
|
447
|
+
return false if (status.to_sym != :purchased)
|
437
448
|
return true if provider.nil? || payment_provider == provider.to_s
|
438
449
|
false
|
439
450
|
end
|
440
451
|
|
441
|
-
def was_purchased?
|
442
|
-
state_was == EffectiveOrders::PURCHASED
|
443
|
-
end
|
444
|
-
|
445
452
|
def purchased_with_credit_card?
|
446
453
|
purchased? && EffectiveOrders.credit_card_payment_providers.include?(payment_provider)
|
447
454
|
end
|
@@ -450,16 +457,8 @@ module Effective
|
|
450
457
|
purchased? && EffectiveOrders.credit_card_payment_providers.exclude?(payment_provider)
|
451
458
|
end
|
452
459
|
|
453
|
-
def declined?
|
454
|
-
state == EffectiveOrders::DECLINED
|
455
|
-
end
|
456
|
-
|
457
|
-
def abandoned?
|
458
|
-
state == EffectiveOrders::ABANDONED
|
459
|
-
end
|
460
|
-
|
461
460
|
def purchasables
|
462
|
-
present_order_items.map { |order_item| order_item.purchasable }
|
461
|
+
present_order_items.map { |order_item| order_item.purchasable }.compact
|
463
462
|
end
|
464
463
|
|
465
464
|
def subtotal
|
@@ -558,7 +557,7 @@ module Effective
|
|
558
557
|
def pending!
|
559
558
|
return false if purchased?
|
560
559
|
|
561
|
-
|
560
|
+
assign_attributes(status: :pending)
|
562
561
|
self.addresses.clear if addresses.any? { |address| address.valid? == false }
|
563
562
|
save!
|
564
563
|
|
@@ -572,18 +571,18 @@ module Effective
|
|
572
571
|
# Used by admin checkout only
|
573
572
|
def confirm!
|
574
573
|
return false if purchased?
|
575
|
-
|
574
|
+
confirmed!
|
576
575
|
end
|
577
576
|
|
578
577
|
# This lets us skip to the confirmed workflow for an admin...
|
579
578
|
def assign_confirmed_if_valid!
|
580
579
|
return unless pending?
|
581
580
|
|
582
|
-
|
581
|
+
assign_attributes(status: :confirmed)
|
583
582
|
return true if valid?
|
584
583
|
|
585
584
|
self.errors.clear
|
586
|
-
|
585
|
+
assign_attributes(status: :pending)
|
587
586
|
false
|
588
587
|
end
|
589
588
|
|
@@ -596,19 +595,21 @@ module Effective
|
|
596
595
|
# Call this as a way to skip over non consequential orders
|
597
596
|
# And mark some purchasables purchased
|
598
597
|
# This is different than the Mark as Paid payment processor
|
599
|
-
def mark_as_purchased!
|
600
|
-
purchase!(skip_buyer_validations: true, email: false, skip_quickbooks: true)
|
598
|
+
def mark_as_purchased!(current_user: nil)
|
599
|
+
purchase!(skip_buyer_validations: true, email: false, skip_quickbooks: true, current_user: current_user)
|
601
600
|
end
|
602
601
|
|
603
602
|
# Effective::Order.new(items: Product.first, user: User.first).purchase!(email: false)
|
604
603
|
def purchase!(payment: nil, provider: nil, card: nil, email: true, skip_buyer_validations: false, skip_quickbooks: false, current_user: nil)
|
605
604
|
return true if purchased?
|
606
605
|
|
606
|
+
raise('unable to purchase voided order') if voided?
|
607
|
+
|
607
608
|
# Assign attributes
|
608
609
|
assign_attributes(
|
609
|
-
state: EffectiveOrders::PURCHASED,
|
610
610
|
skip_buyer_validations: skip_buyer_validations,
|
611
611
|
|
612
|
+
status: :purchased,
|
612
613
|
purchased_at: (purchased_at.presence || Time.zone.now),
|
613
614
|
purchased_by: (purchased_by.presence || current_user),
|
614
615
|
|
@@ -633,7 +634,7 @@ module Effective
|
|
633
634
|
|
634
635
|
run_purchasable_callbacks(:after_purchase)
|
635
636
|
end
|
636
|
-
rescue => e
|
637
|
+
rescue ActiveRecord::RecordInvalid => e
|
637
638
|
Effective::Order.transaction do
|
638
639
|
save!(validate: false)
|
639
640
|
update_purchasables_purchased_order!
|
@@ -668,8 +669,8 @@ module Effective
|
|
668
669
|
def defer!(provider: 'none', email: true)
|
669
670
|
return false if purchased?
|
670
671
|
|
671
|
-
assign_attributes(
|
672
|
-
|
672
|
+
assign_attributes(payment_provider: provider)
|
673
|
+
deferred!
|
673
674
|
|
674
675
|
send_payment_request_to_buyer! if email
|
675
676
|
|
@@ -684,12 +685,15 @@ module Effective
|
|
684
685
|
error = nil
|
685
686
|
|
686
687
|
assign_attributes(
|
687
|
-
|
688
|
+
skip_buyer_validations: true,
|
689
|
+
|
690
|
+
status: :declined,
|
688
691
|
purchased_at: nil,
|
692
|
+
purchased_by: nil,
|
693
|
+
|
689
694
|
payment: payment_to_h(payment),
|
690
695
|
payment_provider: provider,
|
691
|
-
payment_card: (card.presence || 'none')
|
692
|
-
skip_buyer_validations: true
|
696
|
+
payment_card: (card.presence || 'none')
|
693
697
|
)
|
694
698
|
|
695
699
|
Effective::Order.transaction do
|
@@ -697,8 +701,8 @@ module Effective
|
|
697
701
|
run_purchasable_callbacks(:before_decline)
|
698
702
|
save!(validate: validate)
|
699
703
|
run_purchasable_callbacks(:after_decline)
|
700
|
-
rescue => e
|
701
|
-
self.
|
704
|
+
rescue ActiveRecord::RecordInvalid => e
|
705
|
+
self.status = status_was
|
702
706
|
|
703
707
|
error = e.message
|
704
708
|
raise ::ActiveRecord::Rollback
|
@@ -710,6 +714,16 @@ module Effective
|
|
710
714
|
true
|
711
715
|
end
|
712
716
|
|
717
|
+
def void!
|
718
|
+
raise('unable to void a purchased order') if purchased?
|
719
|
+
voided!
|
720
|
+
end
|
721
|
+
|
722
|
+
def unvoid!
|
723
|
+
raise('order must be voided to unvoid') unless voided?
|
724
|
+
pending!
|
725
|
+
end
|
726
|
+
|
713
727
|
# These are all the emails we send all notifications to
|
714
728
|
def emails
|
715
729
|
([purchased_by.try(:email)] + [email] + [user.try(:email)] + Array(organization.try(:billing_emails))).map(&:presence).compact.uniq
|
@@ -882,7 +896,18 @@ module Effective
|
|
882
896
|
end
|
883
897
|
|
884
898
|
def update_purchasables_purchased_order!
|
885
|
-
|
899
|
+
purchasables.each do |purchasable|
|
900
|
+
columns = {
|
901
|
+
purchased_order_id: id,
|
902
|
+
purchased_at: (purchased_at if purchasable.respond_to?(:purchased_at=)),
|
903
|
+
purchased_by_id: (purchased_by_id if purchasable.respond_to?(:purchased_by_id=)),
|
904
|
+
purchased_by_type: (purchased_by_type if purchasable.respond_to?(:purchased_by_type=))
|
905
|
+
}.compact
|
906
|
+
|
907
|
+
purchasable.update_columns(columns)
|
908
|
+
end
|
909
|
+
|
910
|
+
true
|
886
911
|
end
|
887
912
|
|
888
913
|
def run_purchasable_callbacks(name)
|
@@ -1,5 +1,8 @@
|
|
1
1
|
= dropdown(variation: :dropleft) do
|
2
|
-
|
2
|
+
- if EffectiveResources.authorized?(controller, :checkout, order)
|
3
|
+
= dropdown_link_to 'Checkout', effective_orders.order_path(order)
|
4
|
+
- else
|
5
|
+
= dropdown_link_to 'View', effective_orders.order_path(order)
|
3
6
|
|
4
7
|
- if EffectiveResources.authorized?(controller, :send_buyer_receipt, order)
|
5
8
|
= dropdown_link_to 'E-mail Receipt', effective_orders.send_buyer_receipt_order_path(order),
|
data/config/routes.rb
CHANGED
data/lib/effective_orders.rb
CHANGED
@@ -4,22 +4,6 @@ require 'effective_orders/engine'
|
|
4
4
|
require 'effective_orders/version'
|
5
5
|
|
6
6
|
module EffectiveOrders
|
7
|
-
# Order states
|
8
|
-
PENDING = 'pending' # New orders are created in a pending state
|
9
|
-
CONFIRMED = 'confirmed' # Once the order has passed checkout step 1
|
10
|
-
DEFERRED = 'deferred' # Deferred providers. cheque, etransfer or phone was selected.
|
11
|
-
PURCHASED = 'purchased' # Purchased by provider
|
12
|
-
DECLINED = 'declined' # Declined by provider
|
13
|
-
ABANDONED = 'abandoned' # Not set by this gem. Can be set outside it.
|
14
|
-
|
15
|
-
STATES = {
|
16
|
-
PENDING => PENDING,
|
17
|
-
CONFIRMED => CONFIRMED,
|
18
|
-
DEFERRED => DEFERRED,
|
19
|
-
PURCHASED => PURCHASED,
|
20
|
-
DECLINED => DECLINED,
|
21
|
-
ABANDONED => ABANDONED
|
22
|
-
}
|
23
7
|
|
24
8
|
# Subscription statuses (as per stripe)
|
25
9
|
ACTIVE = 'active'
|
@@ -238,7 +222,7 @@ module EffectiveOrders
|
|
238
222
|
|
239
223
|
plans = begin
|
240
224
|
Stripe::Plan.respond_to?(:all) ? Stripe::Plan.all : Stripe::Plan.list
|
241
|
-
rescue => e
|
225
|
+
rescue Exception => e
|
242
226
|
raise e if Rails.env.production?
|
243
227
|
Rails.logger.info "[STRIPE ERROR]: #{e.message}"
|
244
228
|
Rails.logger.info "[STRIPE ERROR]: effective_orders continuing with empty stripe plans. This would fail loudly in Rails.env.production."
|
@@ -310,8 +294,4 @@ module EffectiveOrders
|
|
310
294
|
|
311
295
|
class SoldOutException < Exception; end
|
312
296
|
|
313
|
-
def self.gem_path
|
314
|
-
__dir__.chomp('/lib')
|
315
|
-
end
|
316
|
-
|
317
297
|
end
|
@@ -62,7 +62,7 @@ class EffectiveOrdersMailerPreview < ActionMailer::Preview
|
|
62
62
|
order.user = preview_user
|
63
63
|
preview_order_items.each { |atts| order.order_items.build(atts) }
|
64
64
|
|
65
|
-
order.
|
65
|
+
order.status = :purchased
|
66
66
|
order.payment_card = 'visa'
|
67
67
|
order.purchased_at = Time.zone.now
|
68
68
|
order.payment = { 'f4l4' => '1234'}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_orders
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|