spree_core 3.6.6 → 3.7.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree.js +60 -0
  3. data/app/finders/spree/countries/find.rb +31 -0
  4. data/app/finders/spree/credit_cards/find.rb +12 -0
  5. data/app/finders/spree/line_items/find_by_variant.rb +13 -0
  6. data/app/finders/spree/orders/find_current.rb +34 -0
  7. data/app/finders/spree/products/find.rb +93 -0
  8. data/app/finders/spree/taxons/find.rb +79 -0
  9. data/app/helpers/spree/base_helper.rb +7 -3
  10. data/app/helpers/spree/products_helper.rb +2 -1
  11. data/app/models/concerns/spree/adjustment_source.rb +11 -6
  12. data/app/models/concerns/spree/user_address.rb +2 -2
  13. data/app/models/concerns/spree/vat_price_calculation.rb +2 -1
  14. data/app/models/spree/ability.rb +2 -2
  15. data/app/models/spree/address.rb +23 -14
  16. data/app/models/spree/adjustable/adjustments_updater.rb +1 -1
  17. data/app/models/spree/adjustable/promotion_accumulator.rb +2 -1
  18. data/app/models/spree/adjustment.rb +18 -3
  19. data/app/models/spree/asset/support/active_storage.rb +1 -1
  20. data/app/models/spree/calculator.rb +1 -4
  21. data/app/models/spree/calculator/flexi_rate.rb +8 -11
  22. data/app/models/spree/calculator/returns/default_refund_amount.rb +3 -1
  23. data/app/models/spree/calculator/shipping/flexi_rate.rb +13 -13
  24. data/app/models/spree/country.rb +4 -0
  25. data/app/models/spree/credit_card.rb +8 -2
  26. data/app/models/spree/customer_return.rb +1 -0
  27. data/app/models/spree/fulfilment_changer.rb +117 -0
  28. data/app/models/spree/gateway.rb +1 -0
  29. data/app/models/spree/gateway/bogus.rb +3 -2
  30. data/app/models/spree/image.rb +13 -0
  31. data/app/models/spree/image/configuration/active_storage.rb +3 -3
  32. data/app/models/spree/inventory_unit.rb +1 -1
  33. data/app/models/spree/line_item.rb +3 -2
  34. data/app/models/spree/order.rb +72 -28
  35. data/app/models/spree/order/checkout.rb +10 -0
  36. data/app/models/spree/order/store_credit.rb +14 -35
  37. data/app/models/spree/order_contents.rb +22 -118
  38. data/app/models/spree/order_inventory.rb +6 -2
  39. data/app/models/spree/order_merger.rb +1 -3
  40. data/app/models/spree/order_promotion.rb +10 -0
  41. data/app/models/spree/order_updater.rb +11 -8
  42. data/app/models/spree/payment.rb +9 -3
  43. data/app/models/spree/payment/processing.rb +4 -4
  44. data/app/models/spree/preferences/store.rb +3 -3
  45. data/app/models/spree/product.rb +32 -0
  46. data/app/models/spree/product/scopes.rb +13 -34
  47. data/app/models/spree/product_property.rb +1 -1
  48. data/app/models/spree/promotion.rb +2 -0
  49. data/app/models/spree/promotion/actions/create_adjustment.rb +6 -1
  50. data/app/models/spree/promotion/actions/create_item_adjustments.rb +10 -2
  51. data/app/models/spree/promotion/actions/create_line_items.rb +3 -2
  52. data/app/models/spree/promotion/actions/free_shipping.rb +1 -0
  53. data/app/models/spree/promotion/rules/item_total.rb +2 -2
  54. data/app/models/spree/promotion_handler/coupon.rb +10 -6
  55. data/app/models/spree/promotion_handler/page.rb +1 -1
  56. data/app/models/spree/promotion_handler/promotion_duplicator.rb +4 -4
  57. data/app/models/spree/refund.rb +1 -1
  58. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -0
  59. data/app/models/spree/reimbursement_tax_calculator.rb +2 -2
  60. data/app/models/spree/return_item.rb +7 -4
  61. data/app/models/spree/return_item/eligibility_validator/default.rb +6 -6
  62. data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +1 -1
  63. data/app/models/spree/shipment.rb +27 -34
  64. data/app/models/spree/shipping_method.rb +2 -0
  65. data/app/models/spree/shipping_rate.rb +31 -16
  66. data/app/models/spree/stock/adjuster.rb +1 -0
  67. data/app/models/spree/stock/estimator.rb +2 -0
  68. data/app/models/spree/stock/inventory_unit_builder.rb +5 -5
  69. data/app/models/spree/stock/packer.rb +1 -0
  70. data/app/models/spree/stock/quantifier.rb +16 -4
  71. data/app/models/spree/stock_item.rb +1 -0
  72. data/app/models/spree/stock_location.rb +1 -1
  73. data/app/models/spree/stock_movement.rb +1 -0
  74. data/app/models/spree/stock_transfer.rb +1 -1
  75. data/app/models/spree/store_credit.rb +5 -10
  76. data/app/models/spree/tax_rate.rb +3 -0
  77. data/app/models/spree/taxon.rb +2 -2
  78. data/app/models/spree/taxon_image.rb +18 -0
  79. data/app/models/spree/{taxon_icon → taxon_image}/configuration/active_storage.rb +2 -2
  80. data/app/models/spree/{taxon_icon → taxon_image}/configuration/paperclip.rb +1 -1
  81. data/app/models/spree/variant.rb +28 -2
  82. data/app/models/spree/zone.rb +5 -5
  83. data/app/paginators/spree/shared/paginate.rb +19 -0
  84. data/app/services/spree/cart/add_item.rb +43 -0
  85. data/app/services/spree/cart/create.rb +21 -0
  86. data/app/services/spree/cart/recalculate.rb +32 -0
  87. data/app/services/spree/cart/remove_item.rb +37 -0
  88. data/app/services/spree/cart/remove_line_item.rb +16 -0
  89. data/app/services/spree/cart/set_quantity.rb +22 -0
  90. data/app/services/spree/cart/update.rb +37 -0
  91. data/app/services/spree/checkout/add_store_credit.rb +51 -0
  92. data/app/services/spree/checkout/advance.rb +18 -0
  93. data/app/services/spree/checkout/complete.rb +23 -0
  94. data/app/services/spree/checkout/get_shipping_rates.rb +48 -0
  95. data/app/services/spree/checkout/next.rb +13 -0
  96. data/app/services/spree/checkout/remove_store_credit.rb +17 -0
  97. data/app/services/spree/checkout/update.rb +13 -0
  98. data/app/services/spree/compare_line_items.rb +21 -0
  99. data/app/services/spree/generate_token.rb +20 -0
  100. data/app/sorters/spree/products/sort.rb +58 -0
  101. data/config/locales/en.yml +20 -1
  102. data/db/default/spree/countries.rb +1 -1
  103. data/db/default/spree/default_reimbursement_type.rb +1 -1
  104. data/db/default/spree/roles.rb +2 -2
  105. data/db/default/spree/states.rb +2 -1
  106. data/db/default/spree/stores.rb +1 -1
  107. data/db/default/spree/zones.rb +5 -6
  108. data/db/migrate/20120831092320_spree_one_two.rb +36 -36
  109. data/db/migrate/20120831092359_spree_promo_one_two.rb +1 -1
  110. data/db/migrate/20130211190146_create_spree_stock_items.rb +1 -1
  111. data/db/migrate/20130211191120_create_spree_stock_locations.rb +1 -1
  112. data/db/migrate/20130301162924_create_shipping_method_categories.rb +1 -1
  113. data/db/migrate/20130304162240_create_spree_shipping_rates.rb +1 -1
  114. data/db/migrate/20130305143310_create_stock_movements.rb +1 -1
  115. data/db/migrate/20130418125341_create_spree_stock_transfers.rb +1 -1
  116. data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +1 -1
  117. data/db/migrate/20140309023735_migrate_old_preferences.rb +5 -1
  118. data/db/migrate/20140309024355_create_spree_stores.rb +1 -1
  119. data/db/migrate/20140625214618_create_spree_refunds.rb +1 -1
  120. data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +1 -1
  121. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +1 -1
  122. data/db/migrate/20140713140527_create_spree_refund_reasons.rb +1 -1
  123. data/db/migrate/20140715182625_create_spree_promotion_categories.rb +1 -1
  124. data/db/migrate/20140718133010_create_spree_customer_returns.rb +1 -1
  125. data/db/migrate/20140725131539_create_spree_reimbursements.rb +1 -1
  126. data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +1 -1
  127. data/db/migrate/20150118210639_create_spree_store_credits.rb +1 -1
  128. data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +1 -1
  129. data/db/migrate/20150118212051_create_spree_store_credit_events.rb +1 -1
  130. data/db/migrate/20150118212101_create_spree_store_credit_types.rb +1 -1
  131. data/db/migrate/20150309161154_ensure_payments_have_numbers.rb +6 -2
  132. data/db/migrate/20180613080857_rename_guest_token_to_token_in_orders.rb +5 -0
  133. data/db/migrate/20180915160001_add_timestamps_to_spree_prices.rb +12 -0
  134. data/db/migrate/20181024100754_add_deleted_at_to_spree_credit_cards.rb +6 -0
  135. data/lib/generators/spree/custom_user/custom_user_generator.rb +1 -3
  136. data/lib/generators/spree/dummy/dummy_generator.rb +30 -33
  137. data/lib/generators/spree/dummy/templates/rails/database.yml +6 -1
  138. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -0
  139. data/lib/generators/spree/dummy_model/dummy_model_generator.rb +1 -1
  140. data/lib/generators/spree/install/install_generator.rb +2 -1
  141. data/lib/spree/core.rb +2 -4
  142. data/lib/spree/core/controller_helpers/auth.rb +15 -5
  143. data/lib/spree/core/controller_helpers/common.rb +0 -11
  144. data/lib/spree/core/controller_helpers/order.rb +6 -6
  145. data/lib/spree/core/controller_helpers/respond_with.rb +3 -1
  146. data/lib/spree/core/controller_helpers/strong_parameters.rb +1 -0
  147. data/lib/spree/core/engine.rb +9 -3
  148. data/lib/spree/core/importer/order.rb +8 -12
  149. data/lib/spree/core/product_duplicator.rb +6 -1
  150. data/lib/spree/core/product_filters.rb +15 -14
  151. data/lib/spree/core/query_filters.rb +11 -0
  152. data/lib/spree/core/query_filters/comparable.rb +46 -0
  153. data/lib/spree/core/query_filters/date.rb +8 -0
  154. data/lib/spree/core/query_filters/number.rb +8 -0
  155. data/lib/spree/core/query_filters/text.rb +32 -0
  156. data/lib/spree/core/token_generator.rb +2 -2
  157. data/lib/spree/core/version.rb +1 -1
  158. data/lib/spree/i18n.rb +1 -1
  159. data/lib/spree/migrations.rb +2 -0
  160. data/lib/spree/money.rb +12 -12
  161. data/lib/spree/permitted_attributes.rb +11 -6
  162. data/lib/spree/service_module.rb +98 -0
  163. data/lib/spree/testing_support/capybara_config.rb +20 -0
  164. data/lib/spree/testing_support/capybara_ext.rb +6 -3
  165. data/lib/spree/testing_support/factories.rb +1 -1
  166. data/lib/spree/testing_support/factories/address_factory.rb +10 -9
  167. data/lib/spree/testing_support/factories/adjustment_factory.rb +8 -6
  168. data/lib/spree/testing_support/factories/country_factory.rb +4 -4
  169. data/lib/spree/testing_support/factories/credit_card_factory.rb +7 -5
  170. data/lib/spree/testing_support/factories/customer_return_factory.rb +1 -1
  171. data/lib/spree/testing_support/factories/image_factory.rb +7 -1
  172. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +5 -4
  173. data/lib/spree/testing_support/factories/line_item_factory.rb +3 -2
  174. data/lib/spree/testing_support/factories/options_factory.rb +2 -3
  175. data/lib/spree/testing_support/factories/order_factory.rb +16 -12
  176. data/lib/spree/testing_support/factories/order_promotion_factory.rb +6 -0
  177. data/lib/spree/testing_support/factories/payment_factory.rb +9 -7
  178. data/lib/spree/testing_support/factories/payment_method_factory.rb +8 -8
  179. data/lib/spree/testing_support/factories/price_factory.rb +2 -2
  180. data/lib/spree/testing_support/factories/product_factory.rb +10 -10
  181. data/lib/spree/testing_support/factories/promotion_category_factory.rb +1 -1
  182. data/lib/spree/testing_support/factories/promotion_factory.rb +14 -4
  183. data/lib/spree/testing_support/factories/property_factory.rb +2 -2
  184. data/lib/spree/testing_support/factories/prototype_factory.rb +3 -3
  185. data/lib/spree/testing_support/factories/refund_factory.rb +6 -6
  186. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
  187. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +2 -2
  188. data/lib/spree/testing_support/factories/return_authorization_factory.rb +4 -3
  189. data/lib/spree/testing_support/factories/role_factory.rb +1 -1
  190. data/lib/spree/testing_support/factories/shipment_factory.rb +3 -3
  191. data/lib/spree/testing_support/factories/shipping_method_factory.rb +4 -4
  192. data/lib/spree/testing_support/factories/state_factory.rb +2 -5
  193. data/lib/spree/testing_support/factories/stock_factory.rb +3 -3
  194. data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
  195. data/lib/spree/testing_support/factories/stock_location_factory.rb +7 -7
  196. data/lib/spree/testing_support/factories/stock_movement_factory.rb +3 -3
  197. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +2 -2
  198. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +1 -1
  199. data/lib/spree/testing_support/factories/store_factory.rb +5 -4
  200. data/lib/spree/testing_support/factories/tax_rate_factory.rb +2 -1
  201. data/lib/spree/testing_support/factories/user_factory.rb +4 -4
  202. data/lib/spree/testing_support/factories/variant_factory.rb +15 -15
  203. data/lib/spree/testing_support/factories/zone_factory.rb +3 -3
  204. data/lib/spree/testing_support/image_helpers.rb +19 -0
  205. data/lib/tasks/core.rake +21 -4
  206. data/lib/tasks/exchanges.rake +4 -4
  207. data/spree_core.gemspec +3 -3
  208. data/vendor/assets/javascripts/fetch.umd.js +531 -0
  209. data/vendor/assets/javascripts/polyfill.min.js +1 -0
  210. metadata +50 -17
  211. data/app/assets/javascripts/spree.js.coffee +0 -59
  212. data/app/models/spree/taxon_icon.rb +0 -5
  213. data/lib/generators/spree/dummy/templates/initializers/custom_user.rb +0 -1
  214. data/lib/spree/core/environment.rb +0 -15
  215. data/lib/spree/core/environment/calculators.rb +0 -11
  216. data/lib/spree/core/environment_extension.rb +0 -28
  217. data/lib/spree/core/validators/email.rb +0 -8
  218. data/lib/spree/promo/environment.rb +0 -9
@@ -19,6 +19,7 @@ module Spree
19
19
 
20
20
  def create_profile(payment)
21
21
  return if payment.source.has_payment_profile?
22
+
22
23
  # simulate the storage of credit card profile using remote service
23
24
  if success = VALID_CCS.include?(payment.source.number)
24
25
  payment.source.update_attributes(gateway_customer_profile_id: generate_profile_id(success))
@@ -27,7 +28,7 @@ module Spree
27
28
 
28
29
  def authorize(_money, credit_card, _options = {})
29
30
  profile_id = credit_card.gateway_customer_profile_id
30
- if VALID_CCS.include?(credit_card.number) || (profile_id && profile_id.starts_with?('BGS-'))
31
+ if VALID_CCS.include?(credit_card.number) || (profile_id&.starts_with?('BGS-'))
31
32
  ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'D' })
32
33
  else
33
34
  ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { message: 'Bogus Gateway: Forced failure' }, test: true)
@@ -36,7 +37,7 @@ module Spree
36
37
 
37
38
  def purchase(_money, credit_card, _options = {})
38
39
  profile_id = credit_card.gateway_customer_profile_id
39
- if VALID_CCS.include?(credit_card.number) || (profile_id && profile_id.starts_with?('BGS-'))
40
+ if VALID_CCS.include?(credit_card.number) || (profile_id&.starts_with?('BGS-'))
40
41
  ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'M' })
41
42
  else
42
43
  ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', message: 'Bogus Gateway: Forced failure', test: true)
@@ -1,5 +1,18 @@
1
1
  module Spree
2
2
  class Image < Asset
3
3
  include Rails.application.config.use_paperclip ? Configuration::Paperclip : Configuration::ActiveStorage
4
+ include Rails.application.routes.url_helpers
5
+
6
+ def styles
7
+ self.class.styles.map do |_, size|
8
+ width, height = size[/(\d+)x(\d+)/].split('x')
9
+
10
+ {
11
+ url: polymorphic_path(attachment.variant(resize: size), only_path: true),
12
+ width: width,
13
+ height: height
14
+ }
15
+ end
16
+ end
4
17
  end
5
18
  end
@@ -12,10 +12,10 @@ module Spree
12
12
 
13
13
  def self.styles
14
14
  @styles ||= {
15
- mini: '48x48>',
16
- small: '100x100>',
15
+ mini: '48x48>',
16
+ small: '100x100>',
17
17
  product: '240x240>',
18
- large: '600x600>'
18
+ large: '600x600>'
19
19
  }
20
20
  end
21
21
 
@@ -127,7 +127,7 @@ module Spree
127
127
  end
128
128
 
129
129
  def percentage_of_line_item
130
- quantity / BigDecimal.new(line_item.quantity)
130
+ quantity / BigDecimal(line_item.quantity)
131
131
  end
132
132
 
133
133
  def current_return_item
@@ -32,7 +32,7 @@ module Spree
32
32
 
33
33
  after_create :update_tax_charge
34
34
 
35
- delegate :name, :description, :sku, :should_track_inventory?, :product, :options_text, to: :variant
35
+ delegate :name, :description, :sku, :should_track_inventory?, :product, :options_text, :slug, to: :variant
36
36
  delegate :brand, :category, to: :product
37
37
  delegate :tax_zone, to: :order
38
38
 
@@ -58,7 +58,8 @@ module Spree
58
58
  end
59
59
 
60
60
  extend DisplayMoney
61
- money_methods :amount, :subtotal, :discounted_amount, :final_amount, :total, :price
61
+ money_methods :amount, :subtotal, :discounted_amount, :final_amount, :total, :price,
62
+ :adjustment_total, :additional_tax_total, :promo_total, :included_tax_total
62
63
 
63
64
  alias single_money display_price
64
65
  alias single_display_amount display_price
@@ -22,15 +22,39 @@ module Spree
22
22
  alias display_ship_total display_shipment_total
23
23
  alias_attribute :ship_total, :shipment_total
24
24
 
25
+ def guest_token
26
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
27
+ Order#guest_token is deprecated and will be removed in Spree 4.0. Please use Order#token instead
28
+ DEPRECATION
29
+
30
+ token
31
+ end
32
+
33
+ def guest_token?
34
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
35
+ Order#guest_token? is deprecated and will be removed in Spree 4.0. Please use Order#token? instead
36
+ DEPRECATION
37
+
38
+ token?
39
+ end
40
+
41
+ def guest_token=(value)
42
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
43
+ Order#guest_token= is deprecated and will be removed in Spree 4.0. Please use Order#token= instead
44
+ DEPRECATION
45
+
46
+ self.token = value
47
+ end
48
+
25
49
  MONEY_THRESHOLD = 100_000_000
26
50
  MONEY_VALIDATION = {
27
- presence: true,
51
+ presence: true,
28
52
  numericality: {
29
53
  greater_than: -MONEY_THRESHOLD,
30
- less_than: MONEY_THRESHOLD,
31
- allow_blank: true
54
+ less_than: MONEY_THRESHOLD,
55
+ allow_blank: true
32
56
  },
33
- format: { with: /\A-?\d+(?:\.\d{1,2})?\z/, allow_blank: true }
57
+ format: { with: /\A-?\d+(?:\.\d{1,2})?\z/, allow_blank: true }
34
58
  }.freeze
35
59
 
36
60
  POSITIVE_MONEY_VALIDATION = MONEY_VALIDATION.deep_dup.tap do |validation|
@@ -51,7 +75,7 @@ module Spree
51
75
  end
52
76
 
53
77
  self.whitelisted_ransackable_associations = %w[shipments user promotions bill_address ship_address line_items store]
54
- self.whitelisted_ransackable_attributes = %w[completed_at email number state payment_state shipment_state total considered_risky]
78
+ self.whitelisted_ransackable_attributes = %w[completed_at email number state payment_state shipment_state total considered_risky channel]
55
79
 
56
80
  attr_reader :coupon_code
57
81
  attr_accessor :temporary_address, :temporary_credit_card
@@ -114,7 +138,8 @@ module Spree
114
138
  accepts_nested_attributes_for :shipments
115
139
 
116
140
  # Needs to happen before save_permalink is called
117
- before_validation :set_currency
141
+ before_validation :ensure_store_presence
142
+ before_validation :ensure_currency_presence
118
143
  before_validation :clone_billing_address, if: :use_billing?
119
144
  attr_accessor :use_billing
120
145
 
@@ -126,6 +151,8 @@ module Spree
126
151
  validates :number, length: { maximum: 32, allow_blank: true }, uniqueness: { allow_blank: true }
127
152
  validates :email, length: { maximum: 254, allow_blank: true }, email: { allow_blank: true }, if: :require_email
128
153
  validates :item_count, numericality: { greater_than_or_equal_to: 0, less_than: 2**31, only_integer: true, allow_blank: true }
154
+ validates :store
155
+ validates :currency
129
156
  end
130
157
  validates :payment_state, inclusion: { in: PAYMENT_STATES, allow_blank: true }
131
158
  validates :shipment_state, inclusion: { in: SHIPMENT_STATES, allow_blank: true }
@@ -145,9 +172,6 @@ module Spree
145
172
  class_attribute :update_hooks
146
173
  self.update_hooks = Set.new
147
174
 
148
- class_attribute :line_item_comparison_hooks
149
- self.line_item_comparison_hooks = Set.new
150
-
151
175
  scope :created_between, ->(start_date, end_date) { where(created_at: start_date..end_date) }
152
176
  scope :completed_between, ->(start_date, end_date) { where(completed_at: start_date..end_date) }
153
177
  scope :complete, -> { where.not(completed_at: nil) }
@@ -165,7 +189,12 @@ module Spree
165
189
  # Use this method in other gems that wish to register their own custom logic
166
190
  # that should be called when determining if two line items are equal.
167
191
  def self.register_line_item_comparison_hook(hook)
168
- line_item_comparison_hooks.add(hook)
192
+ ActiveSupport::Deprecation.warn(<<-EOS, caller)
193
+ Order.register_line_item_comparison_hook is deprecated and will be removed in Spree 4.0. Please use
194
+ `Rails.application.config.spree.line_item_comparison_hooks << hook` instead.
195
+ EOS
196
+
197
+ Rails.application.config.spree.line_item_comparison_hooks << hook
169
198
  end
170
199
 
171
200
  # For compatiblity with Calculator::PriceSack
@@ -178,10 +207,6 @@ module Spree
178
207
  line_items.to_a.sum(&:pre_tax_amount)
179
208
  end
180
209
 
181
- def currency
182
- self[:currency] || Spree::Config[:currency]
183
- end
184
-
185
210
  def shipping_discount
186
211
  shipment_adjustments.non_tax.eligible.sum(:amount) * - 1
187
212
  end
@@ -249,8 +274,13 @@ module Spree
249
274
  true
250
275
  end
251
276
 
277
+ def ensure_store_presence
278
+ self.store ||= Spree::Store.default
279
+ end
280
+
252
281
  def allow_cancel?
253
282
  return false if !completed? || canceled?
283
+
254
284
  shipment_state.nil? || %w{ready backorder pending}.include?(shipment_state)
255
285
  end
256
286
 
@@ -299,11 +329,13 @@ module Spree
299
329
  #
300
330
  # def product_customizations_match
301
331
  def line_item_options_match(line_item, options)
332
+ ActiveSupport::Deprecation.warn(<<-EOS, caller)
333
+ Order#add is deprecated and will be removed in Spree 4.0. Please use
334
+ Spree::CompareLineItems service instead.
335
+ EOS
302
336
  return true unless options
303
337
 
304
- line_item_comparison_hooks.all? do |hook|
305
- send(hook, line_item, options)
306
- end
338
+ CompareLineItems.new.call(order: self, line_item: line_item, options: options).value
307
339
  end
308
340
 
309
341
  # Creates new tax charges if there are any applicable rates. If prices already
@@ -319,7 +351,7 @@ module Spree
319
351
 
320
352
  def update_line_item_prices!
321
353
  transaction do
322
- line_items.each(&:update_price)
354
+ line_items.reload.each(&:update_price)
323
355
  save!
324
356
  end
325
357
  end
@@ -459,20 +491,24 @@ module Spree
459
491
  old_state = send("#{state}_was")
460
492
  new_state = send(state)
461
493
  unless old_state == new_state
462
- state_changes.create(
463
- previous_state: old_state,
464
- next_state: new_state,
465
- name: name,
466
- user_id: user_id
467
- )
494
+ log_state_changes(state_name: name, old_state: old_state, new_state: new_state)
468
495
  end
469
496
  end
470
497
  end
471
498
 
499
+ def log_state_changes(state_name:, old_state:, new_state:)
500
+ state_changes.create(
501
+ previous_state: old_state,
502
+ next_state: new_state,
503
+ name: state_name,
504
+ user_id: user_id
505
+ )
506
+ end
507
+
472
508
  def coupon_code=(code)
473
509
  @coupon_code = begin
474
510
  code.strip.downcase
475
- rescue
511
+ rescue StandardError
476
512
  nil
477
513
  end
478
514
  end
@@ -533,7 +569,7 @@ module Spree
533
569
  end
534
570
 
535
571
  def shipping_eq_billing_address?
536
- (bill_address.empty? && ship_address.empty?) || bill_address.same_as?(ship_address)
572
+ bill_address == ship_address
537
573
  end
538
574
 
539
575
  def set_shipments_cost
@@ -688,12 +724,20 @@ module Spree
688
724
  use_billing.in?([true, 'true', '1'])
689
725
  end
690
726
 
727
+ def ensure_currency_presence
728
+ self.currency ||= store.default_currency || Spree::Config[:currency]
729
+ end
730
+
691
731
  def set_currency
692
- self.currency = Spree::Config[:currency] if self[:currency].nil?
732
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
733
+ Spree::Order#set_currency was renamed to Spree::Order#ensure_currency_presence
734
+ and will be removed in Spree 4.0. Please update your code to avoid problems after update
735
+ DEPRECATION
736
+ ensure_currency_presence
693
737
  end
694
738
 
695
739
  def create_token
696
- self.guest_token ||= generate_guest_token
740
+ self.token ||= generate_token
697
741
  end
698
742
 
699
743
  def collect_payment_methods
@@ -16,6 +16,7 @@ module Spree
16
16
 
17
17
  def self.checkout_flow(&block)
18
18
  return @checkout_flow unless block_given?
19
+
19
20
  @checkout_flow = block
20
21
  define_state_machine!
21
22
  end
@@ -124,6 +125,7 @@ module Spree
124
125
  self.checkout_steps[name] = options
125
126
  self.previous_states.each { |state| add_transition({ from: state, to: name }.merge(options)) }
126
127
  return self.previous_states << name if options[:if]
128
+
127
129
  self.previous_states = [name]
128
130
  end
129
131
 
@@ -166,6 +168,7 @@ module Spree
166
168
 
167
169
  def self.find_transition(options = {})
168
170
  return nil if options.nil? || !options.include?(:from) || !options.include?(:to)
171
+
169
172
  self.next_event_transitions.detect do |transition|
170
173
  transition[options[:from].to_sym] == options[:to].to_sym
171
174
  end
@@ -182,6 +185,7 @@ module Spree
182
185
  def checkout_steps
183
186
  steps = (self.class.checkout_steps.each_with_object([]) do |(step, options), checkout_steps|
184
187
  next if options.include?(:if) && !options[:if].call(self)
188
+
185
189
  checkout_steps << step
186
190
  end).map(&:to_s)
187
191
  # Ensure there is always a complete step
@@ -203,6 +207,7 @@ module Spree
203
207
 
204
208
  def can_go_to_state?(state)
205
209
  return false unless has_checkout_step?(self.state) && has_checkout_step?(state)
210
+
206
211
  checkout_step_index(state) > checkout_step_index(self.state)
207
212
  end
208
213
 
@@ -260,26 +265,31 @@ module Spree
260
265
 
261
266
  def clone_billing
262
267
  return unless !bill_address_id && user.bill_address.try(:valid?)
268
+
263
269
  self.bill_address = user.bill_address.try(:clone)
264
270
  end
265
271
 
266
272
  def clone_shipping
267
273
  return unless !ship_address_id && user.ship_address.try(:valid?)
274
+
268
275
  self.ship_address = user.ship_address.try(:clone)
269
276
  end
270
277
 
271
278
  def persist_user_address!
272
279
  return unless !temporary_address && user && user.respond_to?(:persist_order_address) && bill_address_id
280
+
273
281
  user.persist_order_address(self)
274
282
  end
275
283
 
276
284
  def persist_user_credit_card
277
285
  return unless !temporary_credit_card && user_id && valid_credit_cards.present?
286
+
278
287
  valid_credit_cards.first.update(user_id: user_id, default: true)
279
288
  end
280
289
 
281
290
  def assign_default_credit_card
282
291
  return unless payments.from_credit_card.size.empty? && user_has_valid_default_card? && payment_required?
292
+
283
293
  cc = user.default_credit_card
284
294
  payments.create!(payment_method_id: cc.payment_method_id, source: cc, amount: total)
285
295
  end
@@ -1,39 +1,34 @@
1
1
  module Spree
2
2
  class Order < Spree::Base
3
3
  module StoreCredit
4
- def add_store_credit_payments
5
- payments.store_credits.where(state: :checkout).map(&:invalidate!)
4
+ def add_store_credit_payments(amount = nil)
5
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
6
+ Spree::Order#add_store_credit_payments method is deprecated and will be removed in Spree 4.0.
7
+ Please use Spree::Checkout::AddStoreCredit service to add Store Credit to Order.
8
+ DEPRECATION
6
9
 
7
- remaining_total = outstanding_balance
8
-
9
- if user && user.store_credits.any?
10
- payment_method = Spree::PaymentMethod::StoreCredit.available.first
11
- raise 'Store credit payment method could not be found' unless payment_method
12
-
13
- user.store_credits.order_by_priority.each do |credit|
14
- break if remaining_total.zero?
15
- next if credit.amount_remaining.zero?
16
-
17
- amount_to_take = store_credit_amount(credit, remaining_total)
18
- create_store_credit_payment(payment_method, credit, amount_to_take)
19
- remaining_total -= amount_to_take
20
- end
21
- payments.store_credits.checkout
22
- end
10
+ Spree::Checkout::AddStoreCredit.call(order: self, amount: amount)
23
11
  end
24
12
 
25
13
  def remove_store_credit_payments
26
- payments.checkout.store_credits.map(&:invalidate!) unless completed?
14
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
15
+ Spree::Order#remove_store_credit_payments method is deprecated and will be removed in Spree 4.0.
16
+ Please use Spree::Checkout::RemoveStoreCredit service to remove Store Credit from Order.
17
+ DEPRECATION
18
+
19
+ Spree::Checkout::RemoveStoreCredit.call(order: self)
27
20
  end
28
21
 
29
22
  def covered_by_store_credit?
30
23
  return false unless user
24
+
31
25
  user.total_available_store_credit >= total
32
26
  end
33
27
  alias covered_by_store_credit covered_by_store_credit?
34
28
 
35
29
  def total_available_store_credit
36
30
  return 0.0 unless user
31
+
37
32
  user.total_available_store_credit
38
33
  end
39
34
 
@@ -80,22 +75,6 @@ module Spree
80
75
  def display_store_credit_remaining_after_capture
81
76
  Spree::Money.new(total_available_store_credit - total_applicable_store_credit, currency: currency)
82
77
  end
83
-
84
- private
85
-
86
- def create_store_credit_payment(payment_method, credit, amount)
87
- payments.create!(
88
- source: credit,
89
- payment_method: payment_method,
90
- amount: amount,
91
- state: 'checkout',
92
- response_code: credit.generate_authorization_code
93
- )
94
- end
95
-
96
- def store_credit_amount(credit, total)
97
- [credit.amount_remaining, total].min
98
- end
99
78
  end
100
79
  end
101
80
  end
@@ -7,134 +7,38 @@ module Spree
7
7
  end
8
8
 
9
9
  def add(variant, quantity = 1, options = {})
10
- timestamp = Time.current
11
- ActiveRecord::Base.transaction do
12
- line_item = add_to_line_item(variant, quantity, options)
13
- options[:line_item_created] = true if timestamp <= line_item.created_at
14
- after_add_or_remove(line_item, options)
15
- end
16
- end
10
+ ActiveSupport::Deprecation.warn(<<-EOS, caller)
11
+ OrderContents#add method is deprecated and will be removed in Spree 4.0. Please use Spree::Cart::AddItem service
12
+ to add items to cart.
13
+ EOS
17
14
 
18
- def remove(variant, quantity = 1, options = {})
19
- ActiveRecord::Base.transaction do
20
- line_item = remove_from_line_item(variant, quantity, options)
21
- after_add_or_remove(line_item, options)
22
- end
15
+ Spree::Cart::AddItem.call(order: order, variant: variant, quantity: quantity, options: options).value
23
16
  end
24
17
 
25
- def remove_line_item(line_item, options = {})
26
- ActiveRecord::Base.transaction do
27
- line_item.destroy!
28
- after_add_or_remove(line_item, options)
29
- end
30
- end
31
-
32
- def update_cart(params)
33
- if order.update_attributes(filter_order_items(params))
34
- order.line_items = order.line_items.select { |li| li.quantity > 0 }
35
- # Update totals, then check if the order is eligible for any cart promotions.
36
- # If we do not update first, then the item total will be wrong and ItemTotal
37
- # promotion rules would not be triggered.
38
- ActiveRecord::Base.transaction do
39
- persist_totals
40
- PromotionHandler::Cart.new(order).activate
41
- order.ensure_updated_shipments
42
- order.payments.store_credits.checkout.destroy_all
43
- persist_totals
44
- end
45
- true
46
- else
47
- false
48
- end
49
- end
50
-
51
- private
52
-
53
- def after_add_or_remove(line_item, options = {})
54
- order.payments.store_credits.checkout.destroy_all
55
- persist_totals
56
- shipment = options[:shipment]
57
- if shipment.present?
58
- # ADMIN END SHIPMENT RATE FIX
59
- # refresh shipments to ensure correct shipment amount is calculated when using price sack calculator
60
- # for calculating shipment rates.
61
- # Currently shipment rate is calculated on previous order total instead of current order total when updating a shipment from admin end.
62
- order.refresh_shipment_rates(ShippingMethod::DISPLAY_ON_BACK_END)
63
- shipment.update_amounts
64
- else
65
- order.ensure_updated_shipments
66
- end
67
- PromotionHandler::Cart.new(order, line_item).activate
68
- Adjustable::AdjustmentsUpdater.update(line_item)
69
- TaxRate.adjust(order, [line_item]) if options[:line_item_created]
70
- persist_totals
71
- line_item
72
- end
73
-
74
- def filter_order_items(params)
75
- return params if params[:line_items_attributes].nil? || params[:line_items_attributes][:id]
76
-
77
- line_item_ids = order.line_items.pluck(:id)
78
-
79
- params[:line_items_attributes].each_pair do |id, value|
80
- unless line_item_ids.include?(value[:id].to_i) || value[:variant_id].present?
81
- params[:line_items_attributes].delete(id)
82
- end
83
- end
84
- params
85
- end
86
-
87
- def order_updater
88
- @updater ||= OrderUpdater.new(order)
89
- end
90
-
91
- def persist_totals
92
- order_updater.update
93
- end
94
-
95
- def add_to_line_item(variant, quantity, options = {})
96
- line_item = grab_line_item_by_variant(variant, false, options)
97
-
98
- if line_item
99
- line_item.quantity += quantity.to_i
100
- line_item.currency = currency unless currency.nil?
101
- else
102
- options_params = options.is_a?(ActionController::Parameters) ? options : ActionController::Parameters.new(options.to_h)
103
- opts = options_params.
104
- permit(PermittedAttributes.line_item_attributes).to_h.
105
- merge(currency: order.currency)
18
+ def remove(variant, quantity = 1, options = {})
19
+ ActiveSupport::Deprecation.warn(<<-EOS, caller)
20
+ OrderContents#remove method is deprecated and will be removed in Spree 4.0. Please use Spree::Cart::RemoveItem
21
+ service to remove item from cart.
22
+ EOS
106
23
 
107
- line_item = order.line_items.new(quantity: quantity,
108
- variant: variant,
109
- options: opts)
110
- end
111
- line_item.target_shipment = options[:shipment] if options.key? :shipment
112
- line_item.save!
113
- line_item
24
+ Spree::Cart::RemoveItem.call(order: order, variant: variant, quantity: quantity, options: options).value
114
25
  end
115
26
 
116
- def remove_from_line_item(variant, quantity, options = {})
117
- line_item = grab_line_item_by_variant(variant, true, options)
118
- line_item.quantity -= quantity
119
- line_item.target_shipment = options[:shipment]
120
-
121
- if line_item.quantity.zero?
122
- order.line_items.destroy(line_item)
123
- else
124
- line_item.save!
125
- end
27
+ def remove_line_item(line_item, options = {})
28
+ ActiveSupport::Deprecation.warn(<<-EOS, caller)
29
+ OrderContents#remove_line_item method is deprecated and will be removed in Spree 4.0.
30
+ EOS
126
31
 
127
- line_item
32
+ Spree::Cart::RemoveLineItem.call(order: @order, line_item: line_item, options: options).value
128
33
  end
129
34
 
130
- def grab_line_item_by_variant(variant, raise_error = false, options = {})
131
- line_item = order.find_line_item_by_variant(variant, options)
132
-
133
- if !line_item.present? && raise_error
134
- raise ActiveRecord::RecordNotFound, "Line item not found for variant #{variant.sku}"
135
- end
35
+ def update_cart(params)
36
+ ActiveSupport::Deprecation.warn(<<-EOS, caller)
37
+ OrderContents#update_cart method is deprecated and will be removed in Spree 4.0. Please use Spree::Cart::Update
38
+ service to update cart.
39
+ EOS
136
40
 
137
- line_item
41
+ Spree::Cart::Update.call(order: order, params: params).value
138
42
  end
139
43
  end
140
44
  end