solidus_core 2.9.5 → 2.10.2

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.
Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +4 -4
  3. data/app/helpers/spree/products_helper.rb +2 -1
  4. data/app/jobs/spree/promotion_code_batch_job.rb +2 -2
  5. data/app/models/concerns/spree/user_address_book.rb +2 -2
  6. data/app/models/concerns/spree/user_methods.rb +2 -2
  7. data/app/models/spree/address.rb +13 -17
  8. data/app/models/spree/adjustment.rb +20 -9
  9. data/app/models/spree/asset.rb +1 -1
  10. data/app/models/spree/base.rb +0 -2
  11. data/app/models/spree/calculator.rb +1 -1
  12. data/app/models/spree/calculator/price_sack.rb +1 -1
  13. data/app/models/spree/calculator/shipping/flexi_rate.rb +2 -2
  14. data/app/models/spree/calculator/tiered_flat_rate.rb +5 -5
  15. data/app/models/spree/calculator/tiered_percent.rb +6 -6
  16. data/app/models/spree/carton.rb +3 -3
  17. data/app/models/spree/classification.rb +2 -2
  18. data/app/models/spree/credit_card.rb +4 -4
  19. data/app/models/spree/customer_return.rb +1 -1
  20. data/app/models/spree/image/paperclip_attachment.rb +1 -1
  21. data/app/models/spree/inventory_unit.rb +5 -23
  22. data/app/models/spree/line_item.rb +4 -4
  23. data/app/models/spree/line_item_action.rb +2 -2
  24. data/app/models/spree/log_entry.rb +1 -1
  25. data/app/models/spree/option_value.rb +1 -1
  26. data/app/models/spree/option_values_variant.rb +2 -2
  27. data/app/models/spree/order.rb +11 -27
  28. data/app/models/spree/order/checkout.rb +1 -1
  29. data/app/models/spree/order/payments.rb +2 -2
  30. data/app/models/spree/order_cancellations.rb +1 -1
  31. data/app/models/spree/order_capturing.rb +2 -2
  32. data/app/models/spree/order_contents.rb +2 -2
  33. data/app/models/spree/order_mutex.rb +1 -1
  34. data/app/models/spree/order_promotion.rb +3 -3
  35. data/app/models/spree/order_shipping.rb +1 -1
  36. data/app/models/spree/order_taxation.rb +3 -3
  37. data/app/models/spree/payment.rb +8 -45
  38. data/app/models/spree/payment/processing.rb +3 -3
  39. data/app/models/spree/payment_capture_event.rb +1 -1
  40. data/app/models/spree/payment_method.rb +5 -2
  41. data/app/models/spree/payment_method/bogus_credit_card.rb +1 -1
  42. data/app/models/spree/payment_source.rb +1 -1
  43. data/app/models/spree/price.rb +2 -2
  44. data/app/models/spree/product.rb +5 -5
  45. data/app/models/spree/product/scopes.rb +218 -210
  46. data/app/models/spree/product_option_type.rb +2 -2
  47. data/app/models/spree/product_promotion_rule.rb +2 -2
  48. data/app/models/spree/product_property.rb +2 -2
  49. data/app/models/spree/promotion.rb +28 -13
  50. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +1 -1
  51. data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
  52. data/app/models/spree/promotion/rules/option_value.rb +2 -2
  53. data/app/models/spree/promotion/rules/product.rb +3 -3
  54. data/app/models/spree/promotion_action.rb +2 -2
  55. data/app/models/spree/promotion_chooser.rb +2 -2
  56. data/app/models/spree/promotion_code.rb +11 -10
  57. data/app/models/spree/promotion_code/batch_builder.rb +3 -3
  58. data/app/models/spree/promotion_code_batch.rb +1 -1
  59. data/app/models/spree/promotion_rule.rb +2 -2
  60. data/app/models/spree/promotion_rule_role.rb +2 -2
  61. data/app/models/spree/promotion_rule_store.rb +2 -2
  62. data/app/models/spree/promotion_rule_taxon.rb +2 -2
  63. data/app/models/spree/promotion_rule_user.rb +2 -2
  64. data/app/models/spree/refund.rb +5 -5
  65. data/app/models/spree/reimbursement.rb +5 -13
  66. data/app/models/spree/reimbursement/credit.rb +2 -2
  67. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -1
  68. data/app/models/spree/reimbursement_tax_calculator.rb +1 -1
  69. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -2
  70. data/app/models/spree/return_authorization.rb +4 -10
  71. data/app/models/spree/return_item.rb +13 -52
  72. data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
  73. data/app/models/spree/role_user.rb +2 -2
  74. data/app/models/spree/shipment.rb +7 -41
  75. data/app/models/spree/shipping_calculator.rb +0 -4
  76. data/app/models/spree/shipping_manifest.rb +3 -3
  77. data/app/models/spree/shipping_method.rb +2 -2
  78. data/app/models/spree/shipping_method_category.rb +2 -2
  79. data/app/models/spree/shipping_method_stock_location.rb +2 -2
  80. data/app/models/spree/shipping_method_zone.rb +2 -2
  81. data/app/models/spree/shipping_rate.rb +2 -2
  82. data/app/models/spree/shipping_rate_tax.rb +2 -2
  83. data/app/models/spree/state.rb +2 -2
  84. data/app/models/spree/state_change.rb +2 -2
  85. data/app/models/spree/stock/differentiator.rb +1 -1
  86. data/app/models/spree/stock/package.rb +1 -1
  87. data/app/models/spree/stock_item.rb +3 -3
  88. data/app/models/spree/stock_location.rb +2 -2
  89. data/app/models/spree/stock_movement.rb +2 -2
  90. data/app/models/spree/stock_quantities.rb +13 -12
  91. data/app/models/spree/store_credit.rb +8 -8
  92. data/app/models/spree/store_credit_event.rb +3 -3
  93. data/app/models/spree/store_payment_method.rb +2 -2
  94. data/app/models/spree/store_shipping_method.rb +2 -2
  95. data/app/models/spree/tax_calculator/default.rb +0 -4
  96. data/app/models/spree/tax_calculator/shipping_rate.rb +0 -3
  97. data/app/models/spree/tax_rate.rb +5 -1
  98. data/app/models/spree/tax_rate_tax_category.rb +2 -2
  99. data/app/models/spree/taxon/paperclip_attachment.rb +13 -0
  100. data/app/models/spree/unit_cancel.rb +5 -2
  101. data/app/models/spree/user_address.rb +2 -2
  102. data/app/models/spree/user_last_url_storer.rb +46 -0
  103. data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +36 -0
  104. data/app/models/spree/user_stock_location.rb +2 -2
  105. data/app/models/spree/variant.rb +10 -10
  106. data/app/models/spree/variant/scopes.rb +37 -29
  107. data/app/models/spree/variant_property_rule.rb +1 -1
  108. data/app/models/spree/variant_property_rule_condition.rb +2 -2
  109. data/app/models/spree/variant_property_rule_value.rb +2 -2
  110. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
  111. data/app/models/spree/wallet_payment_source.rb +2 -2
  112. data/app/models/spree/zone.rb +1 -1
  113. data/app/models/spree/zone_member.rb +2 -2
  114. data/config/initializers/inflections.rb +5 -0
  115. data/config/initializers/money.rb +2 -0
  116. data/config/locales/en.yml +34 -3
  117. data/lib/generators/spree/dummy/dummy_generator.rb +2 -0
  118. data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +8 -0
  119. data/lib/spree/app_configuration.rb +18 -3
  120. data/lib/spree/core.rb +12 -0
  121. data/lib/spree/core/controller_helpers/auth.rb +1 -13
  122. data/lib/spree/core/controller_helpers/strong_parameters.rb +21 -7
  123. data/lib/spree/core/engine.rb +2 -2
  124. data/lib/spree/core/importer/order.rb +29 -28
  125. data/lib/spree/core/importer/product.rb +2 -2
  126. data/lib/spree/core/product_filters.rb +15 -15
  127. data/lib/spree/core/role_configuration.rb +2 -2
  128. data/lib/spree/core/search/variant.rb +1 -1
  129. data/lib/spree/core/state_machines.rb +78 -0
  130. data/lib/spree/core/state_machines/inventory_unit.rb +42 -0
  131. data/lib/spree/core/state_machines/payment.rb +61 -0
  132. data/lib/spree/core/state_machines/reimbursement.rb +33 -0
  133. data/lib/spree/core/state_machines/return_authorization.rb +32 -0
  134. data/lib/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
  135. data/lib/spree/core/state_machines/return_item/reception_status.rb +42 -0
  136. data/lib/spree/core/state_machines/shipment.rb +58 -0
  137. data/lib/spree/core/stock_configuration.rb +1 -0
  138. data/lib/spree/core/validators/email.rb +1 -8
  139. data/lib/spree/core/version.rb +1 -1
  140. data/lib/spree/money.rb +2 -2
  141. data/lib/spree/permission_sets/default_customer.rb +1 -1
  142. data/lib/spree/permission_sets/user_management.rb +3 -0
  143. data/lib/spree/permitted_attributes.rb +78 -9
  144. data/lib/spree/preferences/static_model_preferences.rb +2 -2
  145. data/lib/spree/testing_support/dummy_app.rb +4 -1
  146. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +6 -2
  147. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +8 -1
  148. data/lib/spree/testing_support/factories/promotion_factory.rb +7 -0
  149. data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
  150. data/lib/spree/testing_support/factories/user_factory.rb +4 -1
  151. data/solidus_core.gemspec +6 -6
  152. data/spec/lib/search/base_spec.rb +5 -1
  153. data/spec/lib/search/variant_spec.rb +1 -1
  154. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +8 -1
  155. data/spec/lib/spree/core/stock_configuration_spec.rb +36 -0
  156. data/spec/lib/spree/core/validators/email_spec.rb +18 -18
  157. data/spec/lib/spree/event_spec.rb +15 -3
  158. data/spec/lib/spree/permitted_attributes_spec.rb +41 -0
  159. data/spec/models/spree/ability_spec.rb +1 -1
  160. data/spec/models/spree/address_spec.rb +23 -0
  161. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +1 -1
  162. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +1 -1
  163. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +1 -1
  164. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +2 -2
  165. data/spec/models/spree/calculator/shipping/per_item_spec.rb +1 -1
  166. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +24 -15
  167. data/spec/models/spree/carton_spec.rb +10 -2
  168. data/spec/models/spree/classification_spec.rb +21 -9
  169. data/spec/models/spree/concerns/user_address_book_spec.rb +4 -4
  170. data/spec/models/spree/concerns/user_methods_spec.rb +5 -4
  171. data/spec/models/spree/credit_card_spec.rb +2 -2
  172. data/spec/models/spree/customer_return_spec.rb +1 -1
  173. data/spec/models/spree/order/checkout_spec.rb +1 -1
  174. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +5 -5
  175. data/spec/models/spree/order/payment_spec.rb +1 -1
  176. data/spec/models/spree/order_contents_spec.rb +1 -1
  177. data/spec/models/spree/order_inventory_spec.rb +3 -3
  178. data/spec/models/spree/order_merger_spec.rb +3 -3
  179. data/spec/models/spree/order_shipping_spec.rb +1 -1
  180. data/spec/models/spree/order_spec.rb +14 -21
  181. data/spec/models/spree/order_updater_spec.rb +4 -3
  182. data/spec/models/spree/payment_create_spec.rb +6 -16
  183. data/spec/models/spree/payment_spec.rb +12 -12
  184. data/spec/models/spree/permission_sets/user_management_spec.rb +2 -0
  185. data/spec/models/spree/preference_spec.rb +4 -4
  186. data/spec/models/spree/preferences/preferable_spec.rb +3 -3
  187. data/spec/models/spree/preferences/statically_configurable_spec.rb +2 -2
  188. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +2 -2
  189. data/spec/models/spree/promotion/rules/nth_order_spec.rb +2 -2
  190. data/spec/models/spree/promotion/rules/taxon_spec.rb +1 -0
  191. data/spec/models/spree/promotion_rule_spec.rb +6 -6
  192. data/spec/models/spree/promotion_spec.rb +71 -54
  193. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +3 -3
  194. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +1 -1
  195. data/spec/models/spree/return_item_spec.rb +11 -11
  196. data/spec/models/spree/returns_calculator_spec.rb +2 -2
  197. data/spec/models/spree/shipment_spec.rb +6 -6
  198. data/spec/models/spree/shipping_calculator_spec.rb +1 -13
  199. data/spec/models/spree/shipping_method_spec.rb +32 -0
  200. data/spec/models/spree/stock/availability_validator_spec.rb +2 -2
  201. data/spec/models/spree/stock/differentiator_spec.rb +2 -2
  202. data/spec/models/spree/stock/estimator_spec.rb +3 -3
  203. data/spec/models/spree/stock/inventory_units_finalizer_spec.rb +4 -4
  204. data/spec/models/spree/stock/package_spec.rb +28 -28
  205. data/spec/models/spree/stock/quantifier_spec.rb +2 -2
  206. data/spec/models/spree/stock/simple_coordinator_spec.rb +11 -11
  207. data/spec/models/spree/stock/splitter/base_spec.rb +4 -4
  208. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +7 -7
  209. data/spec/models/spree/stock_quantities_spec.rb +1 -1
  210. data/spec/models/spree/store_credit_spec.rb +8 -8
  211. data/spec/models/spree/tax_category_spec.rb +1 -1
  212. data/spec/models/spree/tax_rate_spec.rb +1 -0
  213. data/spec/models/spree/taxon_spec.rb +2 -2
  214. data/spec/models/spree/taxons/paperclip_attachment_spec.rb +29 -0
  215. data/spec/models/spree/unit_cancel_spec.rb +5 -0
  216. data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +31 -0
  217. data/spec/models/spree/user_last_url_storer_spec.rb +60 -0
  218. data/spec/models/spree/user_spec.rb +3 -3
  219. metadata +46 -39
  220. data/spec/migrate/20190106184413_remove_code_from_spree_promotions_spec.rb +0 -148
  221. data/spec/models/spree/order/updating_spec.rb +0 -18
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Spree
4
4
  class LineItemAction < Spree::Base
5
- belongs_to :line_item
6
- belongs_to :action, class_name: "Spree::PromotionAction"
5
+ belongs_to :line_item, optional: true
6
+ belongs_to :action, class_name: "Spree::PromotionAction", optional: true
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Spree
4
4
  class LogEntry < Spree::Base
5
- belongs_to :source, polymorphic: true
5
+ belongs_to :source, polymorphic: true, optional: true
6
6
 
7
7
  def parsed_details
8
8
  @details ||= YAML.load(details)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Spree
4
4
  class OptionValue < Spree::Base
5
- belongs_to :option_type, class_name: 'Spree::OptionType', inverse_of: :option_values
5
+ belongs_to :option_type, class_name: 'Spree::OptionType', inverse_of: :option_values, optional: true
6
6
  acts_as_list scope: :option_type
7
7
 
8
8
  has_many :option_values_variants, dependent: :destroy
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Spree
4
4
  class OptionValuesVariant < Spree::Base
5
- belongs_to :variant
6
- belongs_to :option_value
5
+ belongs_to :variant, optional: true
6
+ belongs_to :option_value, optional: true
7
7
  end
8
8
  end
@@ -55,15 +55,15 @@ module Spree
55
55
  deprecate :temporary_credit_card= => :temporary_payment_source=, deprecator: Spree::Deprecation
56
56
 
57
57
  # Customer info
58
- belongs_to :user, class_name: Spree::UserClassHandle.new
59
- belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address'
58
+ belongs_to :user, class_name: Spree::UserClassHandle.new, optional: true
59
+ belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address', optional: true
60
60
  alias_attribute :billing_address, :bill_address
61
61
 
62
- belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address'
62
+ belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address', optional: true
63
63
  alias_attribute :shipping_address, :ship_address
64
64
  alias_attribute :ship_total, :shipment_total
65
65
 
66
- belongs_to :store, class_name: 'Spree::Store'
66
+ belongs_to :store, class_name: 'Spree::Store', optional: true
67
67
 
68
68
  # Items
69
69
  has_many :line_items, -> { order(:created_at, :id) }, dependent: :destroy, inverse_of: :order
@@ -93,6 +93,7 @@ module Spree
93
93
 
94
94
  # Payments
95
95
  has_many :payments, dependent: :destroy, inverse_of: :order
96
+ has_many :valid_store_credit_payments, -> { store_credits.valid }, inverse_of: :order, class_name: 'Spree::Payment', foreign_key: :order_id
96
97
 
97
98
  # Returns
98
99
  has_many :return_authorizations, dependent: :destroy, inverse_of: :order
@@ -101,9 +102,9 @@ module Spree
101
102
 
102
103
  # Logging
103
104
  has_many :state_changes, as: :stateful
104
- belongs_to :created_by, class_name: Spree::UserClassHandle.new
105
- belongs_to :approver, class_name: Spree::UserClassHandle.new
106
- belongs_to :canceler, class_name: Spree::UserClassHandle.new
105
+ belongs_to :created_by, class_name: Spree::UserClassHandle.new, optional: true
106
+ belongs_to :approver, class_name: Spree::UserClassHandle.new, optional: true
107
+ belongs_to :canceler, class_name: Spree::UserClassHandle.new, optional: true
107
108
 
108
109
  accepts_nested_attributes_for :line_items
109
110
  accepts_nested_attributes_for :bill_address
@@ -435,13 +436,6 @@ module Spree
435
436
  touch :completed_at
436
437
 
437
438
  Spree::Event.fire 'order_finalized', order: self
438
-
439
- if method(:deliver_order_confirmation_email).owner != self.class
440
- Spree::Deprecation.warn \
441
- "deliver_order_confirmation_email has been deprecated and moved to " \
442
- "Spree::MailerSubscriber#order_finalized, please move there any customizations.",
443
- caller(1)
444
- end
445
439
  end
446
440
 
447
441
  def fulfill!
@@ -450,16 +444,6 @@ module Spree
450
444
  save!
451
445
  end
452
446
 
453
- def deliver_order_confirmation_email
454
- Spree::Deprecation.warn \
455
- "deliver_order_confirmation_email has been deprecated and moved to " \
456
- "Spree::MailerSubscriber#order_finalized.",
457
- caller(1)
458
-
459
- Spree::Config.order_mailer_class.confirm_email(order).deliver_later
460
- order.update_column(:confirmation_delivered, true)
461
- end
462
-
463
447
  # Helper methods for checkout steps
464
448
  def paid?
465
449
  %w(paid credit_owed).include?(payment_state)
@@ -548,7 +532,7 @@ module Spree
548
532
  def create_proposed_shipments
549
533
  if completed?
550
534
  raise CannotRebuildShipments.new(I18n.t('spree.cannot_rebuild_shipments_order_completed'))
551
- elsif shipments.any? { |s| !s.pending? }
535
+ elsif shipments.any? { |shipment| !shipment.pending? }
552
536
  raise CannotRebuildShipments.new(I18n.t('spree.cannot_rebuild_shipments_shipments_not_pending'))
553
537
  else
554
538
  shipments.destroy_all
@@ -676,7 +660,7 @@ module Spree
676
660
  if remaining_total.zero?
677
661
  other_payments.each(&:invalidate!)
678
662
  elsif other_payments.size == 1
679
- other_payments.first.update_attributes!(amount: remaining_total)
663
+ other_payments.first.update!(amount: remaining_total)
680
664
  end
681
665
 
682
666
  payments.reset
@@ -703,7 +687,7 @@ module Spree
703
687
 
704
688
  def total_applicable_store_credit
705
689
  if can_complete? || complete?
706
- payments.store_credits.valid.sum(:amount)
690
+ valid_store_credit_payments.to_a.sum(&:amount)
707
691
  else
708
692
  [total, (user.try(:available_store_credit_total, currency: currency) || 0.0)].min
709
693
  end
@@ -41,7 +41,7 @@ module Spree
41
41
  # On first definition, state_machines will not be defined
42
42
  state_machines.clear if respond_to?(:state_machines)
43
43
  state_machine :state, initial: :cart, use_transactions: false do
44
- klass.next_event_transitions.each { |t| transition(t.merge(on: :next)) }
44
+ klass.next_event_transitions.each { |state| transition(state.merge(on: :next)) }
45
45
 
46
46
  # Persist the state on the order
47
47
  after_transition do |order, transition|
@@ -46,9 +46,9 @@ module Spree
46
46
 
47
47
  payment.public_send(method)
48
48
  end
49
- rescue Core::GatewayError => e
49
+ rescue Core::GatewayError => error
50
50
  result = !!Spree::Config[:allow_checkout_on_gateway_error]
51
- errors.add(:base, e.message) && (return result)
51
+ errors.add(:base, error.message) && (return result)
52
52
  end
53
53
  end
54
54
  end
@@ -139,7 +139,7 @@ class Spree::OrderCancellations
139
139
 
140
140
  shipments.each do |shipment|
141
141
  if shipment.inventory_units.all? { |iu| iu.shipped? || iu.canceled? }
142
- shipment.update_attributes!(state: 'shipped', shipped_at: Time.current)
142
+ shipment.update!(state: 'shipped', shipped_at: Time.current)
143
143
  end
144
144
  end
145
145
  end
@@ -41,8 +41,8 @@ class Spree::OrderCapturing
41
41
  private
42
42
 
43
43
  def sorted_payments(order)
44
- order.payments.pending.sort_by do |p|
45
- [@sorted_payment_method_classes.index(p.payment_method.class), p.id]
44
+ order.payments.pending.sort_by do |payment|
45
+ [@sorted_payment_method_classes.index(payment.payment_method.class), payment.id]
46
46
  end
47
47
  end
48
48
  end
@@ -35,7 +35,7 @@ module Spree
35
35
  end
36
36
 
37
37
  def update_cart(params)
38
- if order.update_attributes(params)
38
+ if order.update(params)
39
39
  unless order.completed?
40
40
  order.line_items = order.line_items.select { |li| li.quantity > 0 }
41
41
  # Update totals, then check if the order is eligible for any cart promotions.
@@ -61,7 +61,7 @@ module Spree
61
61
  raise ArgumentError, 'user or name must be specified'
62
62
  end
63
63
 
64
- order.update_attributes!(
64
+ order.update!(
65
65
  approver: user,
66
66
  approver_name: name,
67
67
  approved_at: Time.current
@@ -4,7 +4,7 @@ module Spree
4
4
  class OrderMutex < Spree::Base
5
5
  class LockFailed < StandardError; end
6
6
 
7
- belongs_to :order, class_name: "Spree::Order"
7
+ belongs_to :order, class_name: "Spree::Order", optional: true
8
8
 
9
9
  scope :expired, -> { where(arel_table[:created_at].lteq(Spree::Config[:order_mutex_max_age].seconds.ago)) }
10
10
 
@@ -8,9 +8,9 @@ module Spree
8
8
  class OrderPromotion < Spree::Base
9
9
  self.table_name = 'spree_orders_promotions'
10
10
 
11
- belongs_to :order, class_name: 'Spree::Order'
12
- belongs_to :promotion, class_name: 'Spree::Promotion'
13
- belongs_to :promotion_code, class_name: 'Spree::PromotionCode'
11
+ belongs_to :order, class_name: 'Spree::Order', optional: true
12
+ belongs_to :promotion, class_name: 'Spree::Promotion', optional: true
13
+ belongs_to :promotion_code, class_name: 'Spree::PromotionCode', optional: true
14
14
 
15
15
  validates :order, presence: true
16
16
  validates :promotion, presence: true
@@ -64,7 +64,7 @@ class Spree::OrderShipping
64
64
  inventory_units.map(&:shipment).uniq.each do |shipment|
65
65
  # Temporarily propagate the tracking number to the shipment as well
66
66
  # TODO: Remove tracking numbers from shipments.
67
- shipment.update_attributes!(tracking: tracking_number)
67
+ shipment.update!(tracking: tracking_number)
68
68
 
69
69
  next unless shipment.inventory_units.reload.all? { |iu| iu.shipped? || iu.canceled? }
70
70
  # TODO: make OrderShipping#ship_shipment call Shipment#ship! rather than
@@ -25,12 +25,12 @@ module Spree
25
25
  # @return [void]
26
26
  def apply(taxes)
27
27
  @order.line_items.each do |item|
28
- taxed_items = taxes.line_item_taxes.select { |i| i.item_id == item.id }
28
+ taxed_items = taxes.line_item_taxes.select { |element| element.item_id == item.id }
29
29
  update_adjustments(item, taxed_items)
30
30
  end
31
31
 
32
32
  @order.shipments.each do |item|
33
- taxed_items = taxes.shipment_taxes.select { |i| i.item_id == item.id }
33
+ taxed_items = taxes.shipment_taxes.select { |element| element.item_id == item.id }
34
34
  update_adjustments(item, taxed_items)
35
35
  end
36
36
  end
@@ -74,7 +74,7 @@ module Spree
74
74
  label: tax_item.label,
75
75
  included: tax_item.included_in_price
76
76
  )
77
- tax_adjustment.update_attributes!(amount: tax_item.amount)
77
+ tax_adjustment.update!(amount: tax_item.amount)
78
78
  tax_adjustment
79
79
  end
80
80
  end
@@ -15,9 +15,9 @@ module Spree
15
15
  NON_RISKY_AVS_CODES = ['B', 'D', 'H', 'J', 'M', 'Q', 'T', 'V', 'X', 'Y'].freeze
16
16
  RISKY_AVS_CODES = ['A', 'C', 'E', 'F', 'G', 'I', 'K', 'L', 'N', 'O', 'P', 'R', 'S', 'U', 'W', 'Z'].freeze
17
17
 
18
- belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :payments
19
- belongs_to :source, polymorphic: true
20
- belongs_to :payment_method, -> { with_deleted }, class_name: 'Spree::PaymentMethod', inverse_of: :payments
18
+ belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :payments, optional: true
19
+ belongs_to :source, polymorphic: true, optional: true
20
+ belongs_to :payment_method, -> { with_deleted }, class_name: 'Spree::PaymentMethod', inverse_of: :payments, optional: true
21
21
 
22
22
  has_many :offsets, -> { offset_payment }, class_name: "Spree::Payment", foreign_key: :source_id
23
23
  has_many :log_entries, as: :source
@@ -47,7 +47,7 @@ module Spree
47
47
  default_scope -> { order(:created_at) }
48
48
 
49
49
  scope :from_credit_card, -> { where(source_type: 'Spree::CreditCard') }
50
- scope :with_state, ->(s) { where(state: s.to_s) }
50
+ scope :with_state, ->(state) { where(state: state.to_s) }
51
51
  # "offset" is reserved by activerecord
52
52
  scope :offset_payment, -> { where("source_type = 'Spree::Payment' AND amount < 0 AND state = 'completed'") }
53
53
 
@@ -63,44 +63,7 @@ module Spree
63
63
  scope :store_credits, -> { where(source_type: Spree::StoreCredit.to_s) }
64
64
  scope :not_store_credits, -> { where(arel_table[:source_type].not_eq(Spree::StoreCredit.to_s).or(arel_table[:source_type].eq(nil))) }
65
65
 
66
- # order state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
67
- state_machine initial: :checkout do
68
- # With card payments, happens before purchase or authorization happens
69
- #
70
- # Setting it after creating a profile and authorizing a full amount will
71
- # prevent the payment from being authorized again once Order transitions
72
- # to complete
73
- event :started_processing do
74
- transition from: [:checkout, :pending, :completed, :processing], to: :processing
75
- end
76
- # When processing during checkout fails
77
- event :failure do
78
- transition from: [:pending, :processing], to: :failed
79
- end
80
- # With card payments this represents authorizing the payment
81
- event :pend do
82
- transition from: [:checkout, :processing], to: :pending
83
- end
84
- # With card payments this represents completing a purchase or capture transaction
85
- event :complete do
86
- transition from: [:processing, :pending, :checkout], to: :completed
87
- end
88
- event :void do
89
- transition from: [:pending, :processing, :completed, :checkout], to: :void
90
- end
91
- # when the card brand isnt supported
92
- event :invalidate do
93
- transition from: [:checkout], to: :invalid
94
- end
95
-
96
- after_transition do |payment, transition|
97
- payment.state_changes.create!(
98
- previous_state: transition.from,
99
- next_state: transition.to,
100
- name: 'payment'
101
- )
102
- end
103
- end
66
+ include ::Spree::Config.state_machines.payment
104
67
 
105
68
  # @return [String] this payment's response code
106
69
  def transaction_id
@@ -232,8 +195,8 @@ module Spree
232
195
  return if source.imported
233
196
 
234
197
  payment_method.create_profile(self)
235
- rescue ActiveMerchant::ConnectionError => e
236
- gateway_error e
198
+ rescue ActiveMerchant::ConnectionError => error
199
+ gateway_error error
237
200
  end
238
201
 
239
202
  def invalidate_old_payments
@@ -273,7 +236,7 @@ module Spree
273
236
  # type of payment getting refunded, hence the additional check
274
237
  # if the source is a store credit.
275
238
  if store_credit? && source.is_a?(Spree::StoreCredit)
276
- source.update_attributes!({
239
+ source.update!({
277
240
  action: Spree::StoreCredit::ELIGIBLE_ACTION,
278
241
  action_amount: amount,
279
242
  action_authorization_code: response_code
@@ -59,7 +59,7 @@ module Spree
59
59
  )
60
60
  money = ::Money.new(amount, currency)
61
61
  capture_events.create!(amount: money.to_d)
62
- update_attributes!(amount: captured_amount)
62
+ update!(amount: captured_amount)
63
63
  handle_response(response, :complete, :failure)
64
64
  end
65
65
  end
@@ -199,8 +199,8 @@ module Spree
199
199
 
200
200
  def protect_from_connection_error
201
201
  yield
202
- rescue ActiveMerchant::ConnectionError => e
203
- gateway_error(e)
202
+ rescue ActiveMerchant::ConnectionError => error
203
+ gateway_error(error)
204
204
  end
205
205
 
206
206
  def gateway_error(error)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Spree
4
4
  class PaymentCaptureEvent < Spree::Base
5
- belongs_to :payment, class_name: 'Spree::Payment'
5
+ belongs_to :payment, class_name: 'Spree::Payment', optional: true
6
6
 
7
7
  def display_amount
8
8
  Spree::Money.new(amount, { currency: payment.currency })
@@ -93,8 +93,8 @@ module Spree
93
93
  else
94
94
  active.available_to_users.available_to_admin
95
95
  end
96
- available_payment_methods.select do |p|
97
- store.nil? || store.payment_methods.empty? || store.payment_methods.include?(p)
96
+ available_payment_methods.select do |payment|
97
+ store.nil? || store.payment_methods.empty? || store.payment_methods.include?(payment)
98
98
  end
99
99
  end
100
100
 
@@ -199,6 +199,9 @@ module Spree
199
199
  # 4. app/views/spree/admin/payments/source_views/_{partial_name}.html.erb
200
200
  # The view that represents your payment method on orders in the backend
201
201
  #
202
+ # 5. app/views/spree/api/payments/source_views/_{partial_name}.json.jbuilder
203
+ # The view that represents your payment method on orders through the api
204
+ #
202
205
  def partial_name
203
206
  deprecated_method_type_override || type.demodulize.underscore
204
207
  end
@@ -19,7 +19,7 @@ module Spree
19
19
  return if payment.source.has_payment_profile?
20
20
  # simulate the storage of credit card profile using remote service
21
21
  if success = VALID_CCS.include?(payment.source.number)
22
- payment.source.update_attributes(gateway_customer_profile_id: generate_profile_id(success))
22
+ payment.source.update(gateway_customer_profile_id: generate_profile_id(success))
23
23
  end
24
24
  end
25
25
 
@@ -4,7 +4,7 @@ module Spree
4
4
  class PaymentSource < Spree::Base
5
5
  self.abstract_class = true
6
6
 
7
- belongs_to :payment_method
7
+ belongs_to :payment_method, optional: true
8
8
 
9
9
  has_many :payments, as: :source
10
10
  has_many :wallet_payment_sources, class_name: 'Spree::WalletPaymentSource', as: :payment_source, inverse_of: :payment_source
@@ -12,8 +12,8 @@ module Spree
12
12
 
13
13
  MAXIMUM_AMOUNT = BigDecimal('99_999_999.99')
14
14
 
15
- belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant', touch: true
16
- belongs_to :country, class_name: "Spree::Country", foreign_key: "country_iso", primary_key: "iso"
15
+ belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant', touch: true, optional: true
16
+ belongs_to :country, class_name: "Spree::Country", foreign_key: "country_iso", primary_key: "iso", optional: true
17
17
 
18
18
  delegate :product, to: :variant
19
19
  delegate :tax_rates, to: :variant
@@ -25,7 +25,7 @@ module Spree
25
25
  variants_including_master.discard_all
26
26
  self.product_option_types = []
27
27
  self.product_properties = []
28
- self.classifications = []
28
+ self.classifications.destroy_all
29
29
  self.product_promotion_rules = []
30
30
  end
31
31
 
@@ -44,8 +44,8 @@ module Spree
44
44
  has_many :product_promotion_rules, dependent: :destroy
45
45
  has_many :promotion_rules, through: :product_promotion_rules
46
46
 
47
- belongs_to :tax_category, class_name: 'Spree::TaxCategory'
48
- belongs_to :shipping_category, class_name: 'Spree::ShippingCategory', inverse_of: :products
47
+ belongs_to :tax_category, class_name: 'Spree::TaxCategory', optional: true
48
+ belongs_to :shipping_category, class_name: 'Spree::ShippingCategory', inverse_of: :products, optional: true
49
49
 
50
50
  has_one :master,
51
51
  -> { where(is_master: true).with_deleted },
@@ -190,7 +190,7 @@ module Spree
190
190
  # @return [Hash] option_type as keys, array of variants as values.
191
191
  def categorise_variants_from_option(opt_type, pricing_options = Spree::Config.default_pricing_options)
192
192
  return {} unless option_types.include?(opt_type)
193
- variants.with_prices(pricing_options).group_by { |v| v.option_values.detect { |o| o.option_type == opt_type } }
193
+ variants.with_prices(pricing_options).group_by { |variant| variant.option_values.detect { |option| option.option_type == opt_type } }
194
194
  end
195
195
  deprecate :categorise_variants_from_option, deprecator: Spree::Deprecation
196
196
 
@@ -323,7 +323,7 @@ module Spree
323
323
 
324
324
  def any_variants_not_track_inventory?
325
325
  if variants_including_master.loaded?
326
- variants_including_master.any? { |v| !v.should_track_inventory? }
326
+ variants_including_master.any? { |variant| !variant.should_track_inventory? }
327
327
  else
328
328
  !Spree::Config.track_inventory_levels || variants_including_master.where(track_inventory: false).exists?
329
329
  end