solidus_core 1.0.0.pre → 1.0.0.pre2

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.

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