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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 86a4f7535e5766ae1bff99cbabd94b9b134c381c255a8f745ef6e63f5685f7cb
4
- data.tar.gz: e55dd3dd359e7e46bd5bedb251eece208e36cabefef22caaa8c57e3eb84ee9c1
3
+ metadata.gz: 7b95b58112e836a932ba93507f74ab11a551110d5e656100be363fef929dff4f
4
+ data.tar.gz: baa58804ceab0264a4f87b9c97c1268c90a765d5d1d3bc86e224b6ec2e558982
5
5
  SHA512:
6
- metadata.gz: 968a79995bdd6ea7bb51d170145dc375fa6db28095238fad9f18c3e18b6126b4179e692715ae02f68fa707f9c94506418039250691dbf771e690ebe6413784d1
7
- data.tar.gz: 0a346ecf19463553ebf8ee7ced123067ac750809036de53ba09775fb72a8d870572bfb49d2d8a16d91a9e41c10ed3aff5bdf4d31f97861ee477cc66399688061
6
+ metadata.gz: a4bd65c532f86d5eeb602a4699ff87922f010137825bcfa960f82584f33fd61bb5d7f2db962fdbc93c7044c076597ee677e84b9285909a24d99864f192d8c360
7
+ data.tar.gz: fe9c072ee1aad78d10216fa930faafe7ebd569b21488347c674c9dc34fe590f23352e6a3820701df89d4366b869cc26d007c94bc2155d4bf4bf162bbb6db20e0
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2021 Code and Effect Inc.
1
+ Copyright 2023 Code and Effect Inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
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, state: 'purchased'
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, :update, current_cart)
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, :update, current_cart)
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: @order.user).destroy_all if @order.user.present?
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
@@ -24,6 +24,8 @@ class EffectiveOrdersDatatable < Effective::Datatable
24
24
 
25
25
  col :parent, visible: false, search: :string
26
26
 
27
+ col :status
28
+
27
29
  unless attributes[:not_purchased]
28
30
  col :purchased_at do |order|
29
31
  order.purchased_at&.strftime('%F %H:%M') || 'not purchased'
@@ -50,7 +50,7 @@ module EffectiveStripeHelper
50
50
 
51
51
  begin
52
52
  stripe_payment_intent_payload(order, customer)
53
- rescue => e
53
+ rescue Exception => e
54
54
  raise unless Rails.env.development?
55
55
  stripe_payment_intent_payload(order, Effective::Customer.new(user: order.user))
56
56
  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(state: EffectiveOrders::PURCHASED).order(:purchased_at) },
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(state: EffectiveOrders::DEFERRED).order(:created_at) },
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
- # scope :purchased, -> { joins(order_items: :order).where(orders: {state: EffectiveOrders::PURCHASED}).distinct }
54
- # scope :not_purchased, -> { where('id NOT IN (?)', purchased.pluck(:id).presence || [0]) }
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.user_id == user.id }
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 state
2
- # - when it's in the pending state, none of the buyer entered information is required
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 state
8
- # After Step2, we are in the purchased or declined state
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
- acts_as_addressable(billing: { singular: true }, shipping: { singular: true })
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
- state :string
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(state: EffectiveOrders::PURCHASED) }
105
+ scope :purchased, -> { where(status: :purchased) }
86
106
  scope :purchased_by, lambda { |user| purchased.where(user: user) }
87
- scope :not_purchased, -> { where.not(state: [EffectiveOrders::PURCHASED, EffectiveOrders::DEFERRED]) }
88
- scope :was_not_purchased, -> { where.not(state: EffectiveOrders::PURCHASED) }
107
+ scope :not_purchased, -> { where.not(status: [:purchased, :deferred]) }
108
+ scope :was_not_purchased, -> { where.not(status: :purchased) }
89
109
 
90
- scope :pending, -> { where(state: EffectiveOrders::PENDING) }
91
- scope :confirmed, -> { where(state: EffectiveOrders::CONFIRMED) }
92
- scope :deferred, -> { where(state: EffectiveOrders::DEFERRED) }
93
- scope :declined, -> { where(state: EffectiveOrders::DECLINED) }
94
- scope :abandoned, -> { where(state: EffectiveOrders::ABANDONED) }
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
- self.state ||= EffectiveOrders::PENDING
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: -> { was_purchased? }) do
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(state: EffectiveOrders::PENDING) # Initialize with state: PENDING
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 (state != EffectiveOrders::PURCHASED)
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
- self.state = EffectiveOrders::PENDING
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
- update!(state: EffectiveOrders::CONFIRMED)
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
- self.state = EffectiveOrders::CONFIRMED
581
+ assign_attributes(status: :confirmed)
583
582
  return true if valid?
584
583
 
585
584
  self.errors.clear
586
- self.state = EffectiveOrders::PENDING
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(state: EffectiveOrders::DEFERRED, payment_provider: provider)
672
- save!
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
- state: EffectiveOrders::DECLINED,
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.state = state_was
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
- order_items.each { |oi| oi.purchasable&.update_column(:purchased_order_id, self.id) }
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
- = dropdown_link_to (order.purchased? ? 'View' : 'Checkout'), effective_orders.order_path(order)
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),
@@ -5,3 +5,7 @@
5
5
  %h2 #{order.label} from Example Inc.
6
6
 
7
7
  %p.text-muted= order.to_s
8
+
9
+ - if order.voided?
10
+ %p
11
+ %strong VOID
@@ -1,7 +1,7 @@
1
1
  = render 'layout' do
2
2
  %h1.effective-heading= @page_title
3
3
 
4
- - if !@order.purchased? && EffectiveResources.authorized?(self, :update, @order)
4
+ - if EffectiveResources.authorized?(self, :checkout, @order)
5
5
  = render_checkout(@order)
6
6
  - else
7
7
  = render(@order)
data/config/routes.rb CHANGED
@@ -51,6 +51,9 @@ EffectiveOrders::Engine.routes.draw do
51
51
  post :send_payment_request
52
52
  post :send_buyer_receipt
53
53
 
54
+ post :void
55
+ post :unvoid
56
+
54
57
  # GET should be last here
55
58
  post :checkout
56
59
  patch :checkout
@@ -10,7 +10,9 @@ class CreateEffectiveOrders < ActiveRecord::Migration[4.2]
10
10
  t.integer :parent_id
11
11
  t.string :parent_type
12
12
 
13
- t.string :state
13
+ t.string :status
14
+ t.text :status_steps
15
+
14
16
  t.datetime :purchased_at
15
17
 
16
18
  t.integer :purchased_by_id
@@ -1,3 +1,3 @@
1
1
  module EffectiveOrders
2
- VERSION = '6.6.2'.freeze
2
+ VERSION = '6.7.0'.freeze
3
3
  end
@@ -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.state = 'purchased'
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.6.2
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-02 00:00:00.000000000 Z
11
+ date: 2023-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails