effective_orders 6.6.2 → 6.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|