solidus_core 1.0.0.pre → 1.0.0.pre2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/app/mailers/spree/carton_mailer.rb +1 -1
  3. data/app/mailers/spree/reimbursement_mailer.rb +3 -2
  4. data/app/mailers/spree/test_mailer.rb +1 -1
  5. data/app/models/concerns/spree/user_methods.rb +49 -0
  6. data/app/models/spree/ability.rb +2 -0
  7. data/app/models/spree/adjustment.rb +1 -0
  8. data/app/models/spree/adjustment_reason.rb +12 -0
  9. data/app/models/spree/app_configuration.rb +1 -1
  10. data/app/models/spree/carton.rb +1 -1
  11. data/app/models/spree/inventory_unit.rb +10 -6
  12. data/app/models/spree/legacy_user.rb +4 -12
  13. data/app/models/spree/order.rb +15 -15
  14. data/app/models/spree/order/checkout.rb +20 -15
  15. data/app/models/spree/order/payments.rb +1 -5
  16. data/app/models/spree/order_cancellations.rb +1 -1
  17. data/app/models/spree/order_capturing.rb +1 -1
  18. data/app/models/spree/order_mutex.rb +1 -1
  19. data/app/models/spree/order_shipping.rb +1 -1
  20. data/app/models/spree/payment/processing.rb +39 -13
  21. data/app/models/spree/payment_method.rb +2 -2
  22. data/app/models/spree/permission_sets/base.rb +17 -0
  23. data/app/models/spree/permission_sets/configuration_display.rb +24 -0
  24. data/app/models/spree/permission_sets/configuration_management.rb +24 -0
  25. data/app/models/spree/permission_sets/dashboard_display.rb +9 -0
  26. data/app/models/spree/permission_sets/order_display.rb +15 -0
  27. data/app/models/spree/permission_sets/order_management.rb +15 -0
  28. data/app/models/spree/permission_sets/product_display.rb +18 -0
  29. data/app/models/spree/permission_sets/product_management.rb +19 -0
  30. data/app/models/spree/permission_sets/promotion_display.rb +12 -0
  31. data/app/models/spree/permission_sets/promotion_management.rb +12 -0
  32. data/app/models/spree/permission_sets/report_display.rb +9 -0
  33. data/app/models/spree/permission_sets/stock_display.rb +10 -0
  34. data/app/models/spree/permission_sets/stock_management.rb +11 -0
  35. data/app/models/spree/permission_sets/user_display.rb +11 -0
  36. data/app/models/spree/permission_sets/user_management.rb +11 -0
  37. data/app/models/spree/promotion/rules/item_total.rb +12 -33
  38. data/app/models/spree/promotion/rules/user.rb +2 -2
  39. data/app/models/spree/promotion_rule.rb +2 -2
  40. data/app/models/spree/reimbursement.rb +0 -12
  41. data/app/models/spree/return_authorization.rb +2 -2
  42. data/app/models/spree/return_item.rb +1 -0
  43. data/app/models/spree/return_reason.rb +18 -0
  44. data/app/models/spree/role_user.rb +1 -1
  45. data/app/models/spree/shipment.rb +9 -26
  46. data/app/models/spree/store_credit.rb +31 -7
  47. data/app/models/spree/store_credit_event.rb +13 -11
  48. data/app/models/spree/store_credit_update_reason.rb +2 -0
  49. data/app/models/spree/user_class_handle.rb +21 -0
  50. data/app/models/spree/user_stock_location.rb +1 -1
  51. data/config/initializers/spree_user.rb +10 -0
  52. data/config/locales/en.yml +58 -16
  53. data/db/default/spree/return_reasons.rb +9 -0
  54. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +11 -9
  55. data/db/migrate/20150618212517_create_spree_store_credit_update_reasons.rb +8 -0
  56. data/db/migrate/20150619160613_create_adjustment_reason.rb +18 -0
  57. data/db/migrate/20150622144655_add_update_reason_to_store_credit_events.rb +5 -0
  58. data/db/migrate/20150623194316_add_return_authorization_reason_id_to_return_items.rb +7 -0
  59. data/db/migrate/20150623214058_seed_store_credit_update_reasons.rb +9 -0
  60. data/db/migrate/20150626200816_remove_shipping_method_id_from_spree_orders.rb +9 -0
  61. data/db/seeds.rb +9 -0
  62. data/lib/spree/core.rb +1 -4
  63. data/lib/spree/core/controller_helpers/auth.rb +15 -20
  64. data/lib/spree/core/engine.rb +1 -0
  65. data/lib/spree/core/importer/order.rb +8 -5
  66. data/lib/spree/core/role_configuration.rb +70 -0
  67. data/lib/spree/permitted_attributes.rb +1 -1
  68. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +6 -0
  69. data/lib/spree/testing_support/factories/order_factory.rb +14 -1
  70. data/lib/spree/testing_support/factories/promotion_factory.rb +2 -4
  71. data/lib/spree/testing_support/factories/return_authorization_factory.rb +3 -3
  72. data/lib/spree/testing_support/factories/return_item_factory.rb +1 -0
  73. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +10 -0
  74. data/lib/spree/testing_support/factories/store_credit_update_reason_factory.rb +5 -0
  75. data/lib/spree/testing_support/factories/store_factory.rb +1 -1
  76. data/lib/spree/testing_support/order_walkthrough.rb +2 -7
  77. metadata +36 -10
  78. data/app/assets/images/logo/solidus.png +0 -0
  79. data/app/models/spree/item_adjustments.rb.orig +0 -93
  80. data/app/models/spree/return_authorization_reason.rb +0 -7
  81. data/app/models/spree/static_model_preferences.rb +0 -32
  82. data/config/initializers/user_class_extensions.rb +0 -42
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 86475edf83fee14fa0acebdd78e8c0be24bd4fed
4
- data.tar.gz: 83831baebdc4ce6175ebd24c62893d385e8a5595
3
+ metadata.gz: 37901081f12d468225a333297e72fc9b18aa4a8e
4
+ data.tar.gz: 7ffcaa00028db2e02b2f8ba38a81365cb5f3b47c
5
5
  SHA512:
6
- metadata.gz: 86fabc1513aec6501ff3582464eaf71a2f9c68307dc3f041ea83b0940e6270754c05ac62788a586f8e3f64da5f32769e5cd5dfae900218193a49807bfd8b69e6
7
- data.tar.gz: abc4b32dfc2cb617018e5568833094875462770183be4b9d24af7b905f845846c18eeb16214342717e384c2175bf9062545cd4208e0de669af35c465319fff63
6
+ metadata.gz: 90851a4dcb9df999a887eeb75c380a2ef27b1da6d063e34dd9a8daf2b40a1121e45e9983bb547f812f767e19f1f49bb562264fb42e57f70879eb6885b6178a47
7
+ data.tar.gz: b444a9f7a55c7c698d912b2dab2d6bb64c76729f4df514ba821a5d2bf922e99e514c4f2fa8e2a58977da6b9645a0b7eb8a9cf7be77f5b25685e47c4c5ff8262e
@@ -6,7 +6,7 @@ module Spree
6
6
  @carton = Spree::Carton.find(carton_id)
7
7
  subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
8
8
  subject += "#{Spree::Store.current.name} #{Spree.t('shipment_mailer.shipped_email.subject')} ##{@carton.order_numbers.join(', ')}"
9
- mail(to: @carton.order_emails, from: from_address, subject: subject)
9
+ mail(to: @carton.order_emails, from: from_address(Spree::Store.current), subject: subject)
10
10
  end
11
11
  end
12
12
  end
@@ -2,9 +2,10 @@ module Spree
2
2
  class ReimbursementMailer < BaseMailer
3
3
  def reimbursement_email(reimbursement, resend = false)
4
4
  @reimbursement = reimbursement.respond_to?(:id) ? reimbursement : Spree::Reimbursement.find(reimbursement)
5
+ store = @reimbursement.order.store
5
6
  subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
6
- subject += "#{Spree::Store.current.name} #{Spree.t('reimbursement_mailer.reimbursement_email.subject')} ##{@reimbursement.order.number}"
7
- mail(to: @reimbursement.order.email, from: from_address, subject: subject)
7
+ subject += "#{store.name} #{Spree.t('reimbursement_mailer.reimbursement_email.subject')} ##{@reimbursement.order.number}"
8
+ mail(to: @reimbursement.order.email, from: from_address(store), subject: subject)
8
9
  end
9
10
  end
10
11
  end
@@ -2,7 +2,7 @@ module Spree
2
2
  class TestMailer < BaseMailer
3
3
  def test_email(email)
4
4
  subject = "#{Spree::Store.current.name} #{Spree.t('test_mailer.test_email.subject')}"
5
- mail(to: email, from: from_address, subject: subject)
5
+ mail(to: email, from: from_address(Spree::Store.current), subject: subject)
6
6
  end
7
7
  end
8
8
  end
@@ -0,0 +1,49 @@
1
+ module Spree
2
+ module UserMethods
3
+ extend ActiveSupport::Concern
4
+
5
+ include Spree::UserApiAuthentication
6
+ include Spree::UserReporting
7
+ include Spree::UserAddress
8
+ include Spree::UserPaymentSource
9
+
10
+ included do
11
+ extend Spree::DisplayMoney
12
+
13
+ has_many :role_users, foreign_key: "user_id", class_name: "Spree::RoleUser"
14
+ has_many :spree_roles, through: :role_users, source: :role
15
+
16
+ has_many :user_stock_locations, foreign_key: "user_id", class_name: "Spree::UserStockLocation"
17
+ has_many :stock_locations, through: :user_stock_locations
18
+
19
+ has_many :spree_orders, foreign_key: "user_id", class_name: "Spree::Order"
20
+ has_many :orders, foreign_key: "user_id", class_name: "Spree::Order"
21
+
22
+ has_many :store_credits, -> { includes(:credit_type) }, foreign_key: "user_id", class_name: "Spree::StoreCredit"
23
+ has_many :store_credit_events, through: :store_credits
24
+ money_methods :total_available_store_credit
25
+
26
+ belongs_to :ship_address, class_name: 'Spree::Address'
27
+ belongs_to :bill_address, class_name: 'Spree::Address'
28
+ end
29
+
30
+ # has_spree_role? simply needs to return true or false whether a user has a role or not.
31
+ def has_spree_role?(role_in_question)
32
+ spree_roles.any? { |role| role.name == role_in_question.to_s }
33
+ end
34
+
35
+ # @return [Spree::Order] the most-recently-created incomplete order
36
+ # since the customer's last complete order.
37
+ def last_incomplete_spree_order(store: nil, only_frontend_viewable: true)
38
+ self_orders = self.orders
39
+ self_orders = self_orders.where(frontend_viewable: true) if only_frontend_viewable
40
+ self_orders = self_orders.where(store: store) if store
41
+ last_order = self_orders.order(:created_at).last
42
+ last_order unless last_order.try!(:completed?)
43
+ end
44
+
45
+ def total_available_store_credit
46
+ store_credits.reload.to_a.sum{ |credit| credit.amount_remaining }
47
+ end
48
+ end
49
+ end
@@ -69,6 +69,8 @@ module Spree
69
69
  ability = clazz.send(:new, user)
70
70
  @rules = rules + ability.send(:rules)
71
71
  end
72
+
73
+ Spree::RoleConfiguration.instance.activate_permissions! self, user
72
74
  end
73
75
  end
74
76
  end
@@ -27,6 +27,7 @@ module Spree
27
27
  belongs_to :source, polymorphic: true
28
28
  belongs_to :order, class_name: "Spree::Order"
29
29
  belongs_to :promotion_code, :class_name => 'Spree::PromotionCode'
30
+ belongs_to :adjustment_reason, class_name: 'Spree::AdjustmentReason', inverse_of: :adjustments
30
31
 
31
32
  validates :adjustable, presence: true
32
33
  validates :order, presence: true
@@ -0,0 +1,12 @@
1
+ module Spree
2
+ class AdjustmentReason < ActiveRecord::Base
3
+ has_many :adjustments, inverse_of: :adjustment_reason
4
+
5
+ validates :name, presence: true
6
+ validates :name, uniqueness: {case_sensitive: false}
7
+ validates :code, presence: true
8
+ validates :code, uniqueness: {case_sensitive: false}
9
+
10
+ scope :active, -> { where(active: true) }
11
+ end
12
+ end
@@ -138,7 +138,7 @@ module Spree
138
138
 
139
139
  # @!attribute [rw] order_mutex_max_age
140
140
  # @return [Integer] Max age of {OrderMutex} in seconds (default: 2 minutes)
141
- preference :order_mutex_max_age, :integer, default: 2.minutes
141
+ preference :order_mutex_max_age, :integer, default: 120
142
142
 
143
143
  # @!attribute [rw] orders_per_page
144
144
  # @return [Integer] Orders to show per-page in the admin (default: +15+)
@@ -3,7 +3,7 @@ class Spree::Carton < ActiveRecord::Base
3
3
  belongs_to :stock_location, class_name: 'Spree::StockLocation', inverse_of: :cartons
4
4
  belongs_to :shipping_method, class_name: 'Spree::ShippingMethod', inverse_of: :cartons
5
5
 
6
- has_many :inventory_units, inverse_of: :carton
6
+ has_many :inventory_units, class_name: "Spree::InventoryUnit", inverse_of: :carton, dependent: :nullify
7
7
  has_many :orders, -> { uniq }, through: :inventory_units
8
8
  has_many :shipments, -> { uniq }, through: :inventory_units
9
9
 
@@ -17,7 +17,7 @@ module Spree
17
17
 
18
18
  validates_presence_of :order, :shipment, :line_item, :variant
19
19
 
20
- before_destroy :ensure_no_return_items
20
+ before_destroy :ensure_can_destroy
21
21
 
22
22
  scope :backordered, -> { where state: 'backordered' }
23
23
  scope :on_hand, -> { where state: 'on_hand' }
@@ -143,11 +143,15 @@ module Spree
143
143
  return_items.not_cancelled.first
144
144
  end
145
145
 
146
- # If an inventory unit is associated with return items and really needs
147
- # to be deleted then explicitly delete the associated return items first.
148
- def ensure_no_return_items
149
- if return_items.exists?
150
- raise "Inventory units associated with return items should not be deleted."
146
+ def ensure_can_destroy
147
+ if !backordered? && !on_hand?
148
+ errors.add(:state, :cannot_destroy, state: self.state)
149
+ return false
150
+ end
151
+
152
+ unless shipment.pending?
153
+ errors.add(:base, :cannot_destroy_shipment_state, state: shipment.state)
154
+ return false
151
155
  end
152
156
  end
153
157
  end
@@ -4,8 +4,7 @@ module Spree
4
4
  # @note This class is intended to be modified by extensions (ex.
5
5
  # spree_auth_devise)
6
6
  class LegacyUser < Spree::Base
7
- include UserAddress
8
- include UserPaymentSource
7
+ include UserMethods
9
8
 
10
9
  self.table_name = 'spree_users'
11
10
 
@@ -14,14 +13,8 @@ module Spree
14
13
  ActiveModel::Name.new(self, nil, "User")
15
14
  end
16
15
 
17
- has_many :orders, foreign_key: :user_id
18
-
19
16
  before_destroy :check_completed_orders
20
17
 
21
- def has_spree_role?(role)
22
- true
23
- end
24
-
25
18
  def self.model_name
26
19
  ActiveModel::Name.new Spree::LegacyUser, Spree, 'user'
27
20
  end
@@ -30,9 +23,8 @@ module Spree
30
23
  attr_accessor :password_confirmation
31
24
 
32
25
  private
33
-
34
- def check_completed_orders
35
- raise Spree::Core::DestroyWithOrdersError if orders.complete.present?
36
- end
26
+ def check_completed_orders
27
+ raise Spree::Core::DestroyWithOrdersError if orders.complete.present?
28
+ end
37
29
  end
38
30
  end
@@ -13,6 +13,7 @@ module Spree
13
13
  include Spree::Order::Payments
14
14
 
15
15
  class InsufficientStock < StandardError; end
16
+ class CannotRebuildShipments < StandardError; end
16
17
 
17
18
  extend Spree::DisplayMoney
18
19
  money_methods :outstanding_balance, :item_total, :adjustment_total,
@@ -30,17 +31,10 @@ module Spree
30
31
  attr_reader :coupon_code
31
32
  attr_accessor :temporary_address, :temporary_credit_card
32
33
 
33
- if Spree.user_class
34
- belongs_to :user, class_name: Spree.user_class.to_s
35
- belongs_to :created_by, class_name: Spree.user_class.to_s
36
- belongs_to :approver, class_name: Spree.user_class.to_s
37
- belongs_to :canceler, class_name: Spree.user_class.to_s
38
- else
39
- belongs_to :user
40
- belongs_to :created_by
41
- belongs_to :approver
42
- belongs_to :canceler
43
- end
34
+ belongs_to :user, class_name: Spree::UserClassHandle.new
35
+ belongs_to :created_by, class_name: Spree::UserClassHandle.new
36
+ belongs_to :approver, class_name: Spree::UserClassHandle.new
37
+ belongs_to :canceler, class_name: Spree::UserClassHandle.new
44
38
 
45
39
  belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address'
46
40
  alias_attribute :billing_address, :bill_address
@@ -524,9 +518,15 @@ module Spree
524
518
  end
525
519
 
526
520
  def create_proposed_shipments
527
- adjustments.shipping.delete_all
528
- shipments.destroy_all
529
- self.shipments = Spree::Stock::Coordinator.new(self).shipments
521
+ if completed?
522
+ raise CannotRebuildShipments.new(Spree.t(:cannot_rebuild_shipments_order_completed))
523
+ elsif shipments.any? { |s| !s.pending? }
524
+ raise CannotRebuildShipments.new(Spree.t(:cannot_rebuild_shipments_shipments_not_pending))
525
+ else
526
+ adjustments.shipping.destroy_all
527
+ shipments.destroy_all
528
+ self.shipments = Spree::Stock::Coordinator.new(self).shipments
529
+ end
530
530
  end
531
531
 
532
532
  def apply_free_shipping_promotions
@@ -542,7 +542,7 @@ module Spree
542
542
  # to delivery again so that proper updated shipments are created.
543
543
  # e.g. customer goes back from payment step and changes order items
544
544
  def ensure_updated_shipments
545
- unless completed?
545
+ if !completed? && shipments.all?(&:pending?)
546
546
  self.shipments.destroy_all
547
547
  self.update_column(:shipment_total, 0)
548
548
  restart_checkout_flow
@@ -72,16 +72,7 @@ module Spree
72
72
  transition to: :payment, from: :confirm
73
73
  end
74
74
 
75
- before_transition to: :complete do |order|
76
- if order.payment_required? && order.payments.valid.empty?
77
- order.errors.add(:base, Spree.t(:no_payment_found))
78
- false
79
- elsif order.payment_required?
80
- order.process_payments!.tap do |success|
81
- order.handle_failed_payments unless success
82
- end
83
- end
84
- end
75
+ before_transition to: :complete, do: :process_payments_before_complete
85
76
  after_transition to: :complete, do: :persist_user_credit_card
86
77
  before_transition to: :payment, do: :set_shipments_cost
87
78
  before_transition to: :payment, do: :create_tax_charge!
@@ -307,16 +298,30 @@ module Spree
307
298
  if self.payments.from_credit_card.count == 0 && self.user && self.user.default_credit_card.try(:valid?)
308
299
  cc = self.user.default_credit_card
309
300
  self.payments.create!(payment_method_id: cc.payment_method_id, source: cc)
301
+ self.bill_address ||= self.user.bill_address.try!(:dup) if self.user.bill_address.try!(:valid?)
310
302
  end
311
303
  end
312
304
 
313
- def handle_failed_payments
314
- errors = self.errors[:base]
315
- self.payment_failed!
316
- errors.each { |error| self.errors.add(:base, error) }
305
+ private
306
+
307
+ def process_payments_before_complete
308
+ return if !payment_required?
309
+
310
+ if payments.valid.empty?
311
+ errors.add(:base, Spree.t(:no_payment_found))
312
+ return false
313
+ end
314
+
315
+ if process_payments!
316
+ true
317
+ else
318
+ saved_errors = errors[:base]
319
+ payment_failed!
320
+ saved_errors.each { |error| errors.add(:base, error) }
321
+ false
322
+ end
317
323
  end
318
324
 
319
- private
320
325
  # For payment step, filter order parameters to produce the expected nested
321
326
  # attributes for a single payment and its source, discarding attributes
322
327
  # for payment methods other than the one selected
@@ -9,7 +9,7 @@ module Spree
9
9
  #
10
10
  # Returns:
11
11
  #
12
- # - true if all pending_payments processed successfully
12
+ # - true if all pending payments processed successfully
13
13
  #
14
14
  # - true if a payment failed, ie. raised a GatewayError
15
15
  # which gets rescued and converted to TRUE when
@@ -31,10 +31,6 @@ module Spree
31
31
  process_payments_with(:purchase!)
32
32
  end
33
33
 
34
- def pending_payments
35
- payments.select { |payment| payment.pending? }
36
- end
37
-
38
34
  def unprocessed_payments
39
35
  payments.select { |payment| payment.checkout? }
40
36
  end
@@ -29,7 +29,7 @@ class Spree::OrderCancellations
29
29
  end
30
30
 
31
31
  update_shipped_shipments(inventory_units)
32
- Spree::OrderMailer.inventory_cancellation_email(@order, inventory_units).deliver if Spree::OrderCancellations.send_cancellation_mailer
32
+ Spree::OrderMailer.inventory_cancellation_email(@order, inventory_units.to_a).deliver_later if Spree::OrderCancellations.send_cancellation_mailer
33
33
  end
34
34
 
35
35
  @order.update!
@@ -41,7 +41,7 @@ class Spree::OrderCapturing
41
41
  private
42
42
 
43
43
  def sorted_payments(order)
44
- payments = order.pending_payments
44
+ payments = order.payments.pending
45
45
  payments = payments.sort_by { |p| [@sorted_payment_method_classes.index(p.payment_method.class), p.id] }
46
46
  end
47
47
  end
@@ -5,7 +5,7 @@ module Spree
5
5
 
6
6
  belongs_to :order, class_name: "Spree::Order"
7
7
 
8
- scope :expired, -> { where("#{quoted_table_name}.created_at <= ?", Spree::Config[:order_mutex_max_age].ago) }
8
+ scope :expired, -> { where(arel_table[:created_at].lteq(Spree::Config[:order_mutex_max_age].seconds.ago)) }
9
9
 
10
10
  class << self
11
11
  # Obtain a lock on an order, execute the supplied block and then release the lock.
@@ -64,7 +64,7 @@ class Spree::OrderShipping
64
64
  # TODO: Remove tracking numbers from shipments.
65
65
  shipment.update_attributes!(tracking: tracking_number)
66
66
 
67
- if shipment.inventory_units.all? {|iu| iu.shipped? || iu.canceled? }
67
+ if shipment.inventory_units(true).all? {|iu| iu.shipped? || iu.canceled? }
68
68
  # TODO: make OrderShipping#ship_shipment call Shipment#ship! rather than
69
69
  # having Shipment#ship! call OrderShipping#ship_shipment. We only really
70
70
  # need this `update_columns` for the specs, until we make that change.
@@ -1,11 +1,36 @@
1
1
  module Spree
2
2
  class Payment < Spree::Base
3
3
  module Processing
4
+ # "process!" means:
5
+ # - Do nothing when:
6
+ # - There is no payment method
7
+ # - The payment method does not require a source
8
+ # - The payment is in the "processing" state
9
+ # - 'auto_capture?' is false and the payment is already authorized.
10
+ # - Raise an exception when:
11
+ # - The source is missing or invalid
12
+ # - The payment is in a state that cannot transition to 'processing'
13
+ # (failed/void/invalid states). Note: 'completed' can transition to
14
+ # 'processing' and thus calling #process! on a completed Payment
15
+ # will attempt to re-authorize/re-purchase the payment.
16
+ # - Otherwise:
17
+ # - If 'auto_capture?' is true:
18
+ # - Call #purchase on the payment gateway. (i.e. authorize+capture)
19
+ # even if the payment is already completed.
20
+ # - Else:
21
+ # - Call #authorize on the payment gateway even if the payment is
22
+ # already completed.
4
23
  def process!
5
- if payment_method && payment_method.auto_capture?
24
+ return if payment_method.nil?
25
+
26
+ if payment_method.auto_capture?
6
27
  purchase!
7
28
  else
8
- authorize!
29
+ if pending?
30
+ # do nothing. already authorized.
31
+ else
32
+ authorize!
33
+ end
9
34
  end
10
35
  end
11
36
 
@@ -106,19 +131,20 @@ module Spree
106
131
  raise ArgumentError.new("handle_payment_preconditions must be called with a block")
107
132
  end
108
133
 
109
- if payment_method && payment_method.source_required?
110
- if source
111
- if !processing?
112
- if payment_method.supports?(source) || token_based?
113
- yield
114
- else
115
- invalidate!
116
- raise Core::GatewayError.new(Spree.t(:payment_method_not_supported))
117
- end
134
+ return if payment_method.nil?
135
+ return if !payment_method.source_required?
136
+
137
+ if source
138
+ if !processing?
139
+ if payment_method.supports?(source) || token_based?
140
+ yield
141
+ else
142
+ invalidate!
143
+ raise Core::GatewayError.new(Spree.t(:payment_method_not_supported))
118
144
  end
119
- else
120
- raise Core::GatewayError.new(Spree.t(:payment_processing_failed))
121
145
  end
146
+ else
147
+ raise Core::GatewayError.new(Spree.t(:payment_processing_failed))
122
148
  end
123
149
  end
124
150