spree_core 4.1.12 → 4.2.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/spree/base_controller.rb +1 -2
  3. data/app/finders/spree/addresses/find.rb +1 -12
  4. data/app/finders/spree/base_finder.rb +14 -0
  5. data/app/finders/spree/countries/find.rb +11 -3
  6. data/app/finders/spree/credit_cards/find.rb +2 -2
  7. data/app/finders/spree/orders/find_current.rb +1 -1
  8. data/app/helpers/spree/base_helper.rb +61 -20
  9. data/app/helpers/spree/mail_helper.rb +29 -0
  10. data/app/helpers/spree/products_helper.rb +2 -1
  11. data/app/mailers/spree/base_mailer.rb +19 -5
  12. data/app/mailers/spree/order_mailer.rb +13 -4
  13. data/app/mailers/spree/reimbursement_mailer.rb +4 -2
  14. data/app/mailers/spree/shipment_mailer.rb +4 -2
  15. data/app/models/concerns/spree/default_price.rb +3 -6
  16. data/app/models/concerns/spree/user_methods.rb +11 -5
  17. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  18. data/app/models/spree/ability.rb +2 -6
  19. data/app/models/spree/address.rb +17 -1
  20. data/app/models/spree/adjustment.rb +1 -0
  21. data/app/models/spree/app_configuration.rb +4 -0
  22. data/app/models/spree/app_dependencies.rb +4 -2
  23. data/app/models/spree/base.rb +5 -0
  24. data/app/models/spree/credit_card.rb +5 -0
  25. data/app/models/spree/fulfilment_changer.rb +58 -16
  26. data/app/models/spree/inventory_unit.rb +2 -7
  27. data/app/models/spree/line_item.rb +11 -7
  28. data/app/models/spree/log_entry.rb +1 -1
  29. data/app/models/spree/option_type.rb +7 -1
  30. data/app/models/spree/order.rb +27 -5
  31. data/app/models/spree/order/address_book.rb +7 -20
  32. data/app/models/spree/order/payments.rb +10 -2
  33. data/app/models/spree/payment.rb +18 -4
  34. data/app/models/spree/payment/processing.rb +2 -2
  35. data/app/models/spree/payment_method.rb +3 -3
  36. data/app/models/spree/preferences/store.rb +1 -1
  37. data/app/models/spree/price.rb +25 -6
  38. data/app/models/spree/product.rb +29 -9
  39. data/app/models/spree/promotion.rb +10 -15
  40. data/app/models/spree/promotion/rules/product.rb +2 -1
  41. data/app/models/spree/promotion/rules/user.rb +2 -1
  42. data/app/models/spree/promotion_handler/coupon.rb +2 -3
  43. data/app/models/spree/promotion_handler/promotion_duplicator.rb +9 -3
  44. data/app/models/spree/refund.rb +2 -2
  45. data/app/models/spree/reimbursement.rb +2 -0
  46. data/app/models/spree/return_item/eligibility_validator/default.rb +0 -2
  47. data/app/models/spree/return_item/eligibility_validator/{r_m_a_required.rb → rma_required.rb} +0 -0
  48. data/app/models/spree/shipment.rb +3 -6
  49. data/app/models/spree/shipping_method.rb +1 -5
  50. data/app/models/spree/shipping_rate.rb +2 -11
  51. data/app/models/spree/stock/availability_validator.rb +3 -4
  52. data/app/models/spree/stock_item.rb +1 -5
  53. data/app/models/spree/stock_location.rb +13 -2
  54. data/app/models/spree/store.rb +51 -2
  55. data/app/models/spree/store_credit.rb +1 -1
  56. data/app/models/spree/variant.rb +16 -10
  57. data/app/models/spree/zone.rb +17 -4
  58. data/app/presenters/spree/variant_presenter.rb +9 -1
  59. data/app/presenters/spree/variants/option_types_presenter.rb +1 -0
  60. data/app/services/spree/account/addresses/create.rb +6 -1
  61. data/app/services/spree/account/addresses/{base.rb → helper.rb} +1 -3
  62. data/app/services/spree/account/addresses/update.rb +6 -1
  63. data/app/services/spree/compare_line_items.rb +4 -2
  64. data/app/sorters/spree/base_sorter.rb +35 -0
  65. data/app/sorters/spree/orders/sort.rb +1 -37
  66. data/app/sorters/spree/products/sort.rb +9 -32
  67. data/app/validators/email_validator.rb +1 -1
  68. data/app/views/layouts/spree/base_mailer.html.erb +45 -40
  69. data/app/views/spree/order_mailer/cancel_email.html.erb +19 -25
  70. data/app/views/spree/order_mailer/cancel_email.text.erb +24 -2
  71. data/app/views/spree/order_mailer/confirm_email.html.erb +18 -65
  72. data/app/views/spree/order_mailer/confirm_email.text.erb +2 -1
  73. data/app/views/spree/order_mailer/store_owner_notification_email.html.erb +23 -0
  74. data/app/views/spree/order_mailer/store_owner_notification_email.text.erb +38 -0
  75. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +53 -58
  76. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +3 -1
  77. data/app/views/spree/shared/_base_mailer_footer.html.erb +6 -14
  78. data/app/views/spree/shared/_base_mailer_header.html.erb +12 -32
  79. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +293 -625
  80. data/app/views/spree/shared/_purchased_items_table.html.erb +60 -0
  81. data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +13 -0
  82. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +27 -0
  83. data/app/views/spree/shared/purchased_items_table/_subtotal.html.erb +13 -0
  84. data/app/views/spree/shared/purchased_items_table/_total.html.erb +13 -0
  85. data/app/views/spree/shipment_mailer/shipped_email.html.erb +31 -36
  86. data/app/views/spree/shipment_mailer/shipped_email.text.erb +2 -1
  87. data/config/initializers/assets.rb +1 -0
  88. data/config/initializers/inflections.rb +3 -0
  89. data/config/initializers/rails61_fixes.rb +3 -0
  90. data/config/locales/en.yml +145 -19
  91. data/db/default/spree/countries.rb +10 -4
  92. data/db/default/spree/states.rb +42 -5
  93. data/db/default/spree/stores.rb +17 -12
  94. data/db/default/spree/zones.rb +1 -1
  95. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
  96. data/db/migrate/20140309033438_create_store_from_preferences.rb +1 -1
  97. data/db/migrate/20191017121054_add_supported_currencies_to_store.rb +10 -0
  98. data/db/migrate/20200102141311_add_social_to_spree_stores.rb +3 -0
  99. data/db/migrate/20200308210757_add_default_locale_to_spree_store.rb +7 -0
  100. data/db/migrate/20200310145140_add_customer_support_email_to_spree_store.rb +7 -0
  101. data/db/migrate/20200421095017_add_compare_at_amount_to_spree_prices.rb +7 -0
  102. data/db/migrate/20200423123001_add_default_country_id_to_spree_store.rb +9 -0
  103. data/db/migrate/20200430072209_add_footer_fields_to_spree_stores.rb +8 -0
  104. data/db/migrate/20200513154939_add_show_property_to_spree_product_properties.rb +5 -0
  105. data/db/migrate/20200607161221_add_store_owner_order_notification_delivered_to_spree_orders.rb +7 -0
  106. data/db/migrate/20200607161222_add_new_order_notifications_email_to_spree_stores.rb +7 -0
  107. data/db/migrate/20200610113542_add_label_to_spree_addresses.rb +5 -0
  108. data/db/migrate/20200826075557_add_unique_index_on_taxon_id_and_product_id_to_spree_products_taxons.rb +5 -0
  109. data/db/migrate/20201006110150_add_checkout_zone_field_to_store.rb +12 -0
  110. data/db/migrate/20201012091259_add_filterable_column_to_spree_option_types.rb +6 -0
  111. data/db/migrate/20201013084504_add_seo_robots_to_spree_stores.rb +5 -0
  112. data/db/migrate/20201127084048_add_default_country_kind_to_spree_zones.rb +5 -0
  113. data/db/migrate/20210112193440_remove_contact_email_from_spree_stores.rb +5 -0
  114. data/db/migrate/20210114182625_create_spree_payment_methods_stores.rb +10 -0
  115. data/db/migrate/20210114220232_migrate_data_payment_methods_stores.rb +15 -0
  116. data/db/migrate/20210117112551_remove_store_id_from_spree_payment_methods.rb +5 -0
  117. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -2
  118. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -2
  119. data/lib/generators/spree/mailers_preview/mailers_preview_generator.rb +23 -0
  120. data/lib/generators/spree/mailers_preview/templates/mailers/previews/order_preview.rb +13 -0
  121. data/lib/generators/spree/mailers_preview/templates/mailers/previews/reimbursement_preview.rb +5 -0
  122. data/lib/generators/spree/mailers_preview/templates/mailers/previews/shipment_preview.rb +5 -0
  123. data/lib/generators/spree/mailers_preview/templates/mailers/previews/user_preview.rb +11 -0
  124. data/lib/spree/core.rb +2 -0
  125. data/lib/spree/core/controller_helpers/common.rb +1 -0
  126. data/lib/spree/core/controller_helpers/currency_helpers.rb +15 -0
  127. data/lib/spree/core/controller_helpers/order.rb +9 -4
  128. data/lib/spree/core/controller_helpers/store.rb +12 -1
  129. data/lib/spree/core/importer/order.rb +9 -9
  130. data/lib/spree/core/product_filters.rb +3 -3
  131. data/lib/spree/core/version.rb +1 -1
  132. data/lib/spree/i18n.rb +7 -21
  133. data/lib/spree/permitted_attributes.rb +8 -5
  134. data/lib/spree/service_module.rb +6 -2
  135. data/lib/spree/testing_support/authorization_helpers.rb +7 -4
  136. data/lib/spree/testing_support/capybara_config.rb +1 -1
  137. data/lib/spree/testing_support/factories/promotion_factory.rb +29 -17
  138. data/lib/spree/testing_support/factories/shipment_factory.rb +7 -9
  139. data/lib/spree/testing_support/factories/store_factory.rb +11 -8
  140. data/lib/spree/testing_support/factories/zone_factory.rb +16 -13
  141. data/lib/spree/testing_support/i18n.rb +1 -1
  142. data/lib/spree/testing_support/order_walkthrough.rb +8 -3
  143. data/lib/spree/testing_support/rspec_retry_config.rb +10 -0
  144. data/spree_core.gemspec +10 -8
  145. data/vendor/assets/javascripts/cleave.js +1669 -0
  146. metadata +105 -30
  147. data/app/views/spree/order_mailer/_adjustment.html.erb +0 -8
  148. data/app/views/spree/order_mailer/_subtotal.html.erb +0 -8
  149. data/app/views/spree/order_mailer/_total.html.erb +0 -8
  150. data/lib/spree/i18n/base.rb +0 -17
  151. data/lib/spree/i18n/initializer.rb +0 -1
@@ -52,10 +52,15 @@ module Spree
52
52
  end
53
53
 
54
54
  def set_current_order
55
- if try_spree_current_user && current_order
56
- try_spree_current_user.orders.incomplete.where('id != ?', current_order.id).each do |order|
57
- current_order.merge!(order, try_spree_current_user)
58
- end
55
+ return unless try_spree_current_user && current_order
56
+
57
+ orders_scope = try_spree_current_user.orders.
58
+ incomplete.
59
+ where.not(id: current_order.id).
60
+ where(store_id: current_store.id)
61
+
62
+ orders_scope.each do |order|
63
+ current_order.merge!(order, try_spree_current_user)
59
64
  end
60
65
  end
61
66
 
@@ -5,13 +5,24 @@ module Spree
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
+ helper_method :supported_currencies
8
9
  helper_method :current_currency
9
10
  helper_method :current_store
10
11
  helper_method :current_price_options
11
12
  end
12
13
 
13
14
  def current_currency
14
- current_store.default_currency
15
+ if defined?(session) && session.key?(:currency) && supported_currencies.map(&:iso_code).include?(session[:currency])
16
+ session[:currency]
17
+ elsif params[:currency].present? && supported_currencies.map(&:iso_code).include?(params[:currency])
18
+ params[:currency]
19
+ else
20
+ current_store.default_currency
21
+ end
22
+ end
23
+
24
+ def supported_currencies
25
+ current_store.supported_currencies_list
15
26
  end
16
27
 
17
28
  def current_store
@@ -38,7 +38,7 @@ module Spree
38
38
  end
39
39
  end
40
40
  order.reload
41
- rescue Exception => e
41
+ rescue StandardError => e
42
42
  order.destroy if order&.persisted?
43
43
  raise e.message
44
44
  end
@@ -80,7 +80,7 @@ module Spree
80
80
 
81
81
  adjustments = s.delete(:adjustments_attributes)
82
82
  create_adjustments_from_params(adjustments, order, shipment)
83
- rescue Exception => e
83
+ rescue StandardError => e
84
84
  raise "Order import shipments: #{e.message} #{s}"
85
85
  end
86
86
  end
@@ -115,7 +115,7 @@ module Spree
115
115
  line_item.save!
116
116
  end
117
117
  create_adjustments_from_params(adjustments, order, line_item)
118
- rescue Exception => e
118
+ rescue StandardError => e
119
119
  raise "Order import line items: #{e.message} #{line_item}"
120
120
  end
121
121
  end
@@ -132,7 +132,7 @@ module Spree
132
132
  )
133
133
  adjustment.save!
134
134
  adjustment.close!
135
- rescue Exception => e
135
+ rescue StandardError => e
136
136
  raise "Order import adjustments: #{e.message} #{a}"
137
137
  end
138
138
  end
@@ -150,7 +150,7 @@ module Spree
150
150
  payment.payment_method = Spree::PaymentMethod.find_by!(name: p[:payment_method])
151
151
  payment.source = create_source_payment_from_params(p[:source], payment) if p[:source]
152
152
  payment.save!
153
- rescue Exception => e
153
+ rescue StandardError => e
154
154
  raise "Order import payments: #{e.message} #{p}"
155
155
  end
156
156
  end
@@ -167,7 +167,7 @@ module Spree
167
167
  gateway_payment_profile_id: source_hash[:gateway_payment_profile_id],
168
168
  imported: true
169
169
  )
170
- rescue Exception => e
170
+ rescue StandardError => e
171
171
  raise "Order import source payments: #{e.message} #{source_hash}"
172
172
  end
173
173
 
@@ -179,7 +179,7 @@ module Spree
179
179
  hash
180
180
  rescue ActiveRecord::RecordNotFound => e
181
181
  raise "Ensure order import variant: Variant w/SKU #{sku} not found."
182
- rescue Exception => e
182
+ rescue StandardError => e
183
183
  raise "Ensure order import variant: #{e.message} #{hash}"
184
184
  end
185
185
 
@@ -200,7 +200,7 @@ module Spree
200
200
 
201
201
  address.delete(:country)
202
202
  address[:country_id] = Spree::Country.where(search).first!.id
203
- rescue Exception => e
203
+ rescue StandardError => e
204
204
  raise "Ensure order import address country: #{e.message} #{search}"
205
205
  end
206
206
  end
@@ -224,7 +224,7 @@ module Spree
224
224
  else
225
225
  address[:state_name] = search[:name] || search[:abbr]
226
226
  end
227
- rescue Exception => e
227
+ rescue StandardError => e
228
228
  raise "Ensure order import address state: #{e.message} #{search}"
229
229
  end
230
230
  end
@@ -68,9 +68,9 @@ module Spree
68
68
  def self.price_filter
69
69
  v = Spree::Price.arel_table
70
70
  conds = [[Spree.t(:under_price, price: format_price(10)), v[:amount].lteq(10)],
71
- ["#{format_price(10)} - #{format_price(15)}", v[:amount].in(10..15)],
72
- ["#{format_price(15)} - #{format_price(18)}", v[:amount].in(15..18)],
73
- ["#{format_price(18)} - #{format_price(20)}", v[:amount].in(18..20)],
71
+ ["#{format_price(10)} - #{format_price(15)}", v[:amount].between(10..15)],
72
+ ["#{format_price(15)} - #{format_price(18)}", v[:amount].between(15..18)],
73
+ ["#{format_price(18)} - #{format_price(20)}", v[:amount].between(18..20)],
74
74
  [Spree.t(:or_over_price, price: format_price(20)), v[:amount].gteq(20)]]
75
75
  {
76
76
  name: Spree.t(:price_range),
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- '4.1.12'
3
+ '4.2.0.rc3'
4
4
  end
5
5
  end
@@ -1,35 +1,21 @@
1
1
  require 'i18n'
2
2
  require 'active_support/core_ext/array/extract_options'
3
- require 'spree/i18n/base'
3
+ require 'action_view'
4
4
 
5
5
  module Spree
6
- extend ActionView::Helpers::TranslationHelper
7
- extend ActionView::Helpers::TagHelper
6
+ class TranslationHelperWrapper
7
+ include ActionView::Helpers::TranslationHelper
8
+ end
8
9
 
9
10
  class << self
10
11
  # Add spree namespace and delegate to Rails TranslationHelper for some nice
11
12
  # extra functionality. e.g return reasonable strings for missing translations
12
- def translate(*args)
13
- @virtual_path = virtual_path
13
+ def translate(key, options = {})
14
+ options[:scope] = [*options[:scope]].unshift(:spree).uniq
14
15
 
15
- options = args.extract_options!
16
- options[:scope] = [*options[:scope]].unshift(:spree)
17
- args << options
18
- super(*args)
16
+ TranslationHelperWrapper.new.translate(key, **options)
19
17
  end
20
18
 
21
19
  alias t translate
22
-
23
- def context
24
- Spree::ViewContext.context
25
- end
26
-
27
- def virtual_path
28
- if context
29
- path = context.instance_variable_get('@virtual_path')
30
-
31
- path&.gsub(/spree/, '')
32
- end
33
- end
34
20
  end
35
21
  end
@@ -33,7 +33,7 @@ module Spree
33
33
  :id, :firstname, :lastname, :first_name, :last_name,
34
34
  :address1, :address2, :city, :country_iso, :country_id, :state_id,
35
35
  :zipcode, :phone, :state_name, :alternative_phone, :company,
36
- :user_id, :deleted_at,
36
+ :user_id, :deleted_at, :label,
37
37
  country: [:iso, :name, :iso3, :iso_name],
38
38
  state: [:name, :abbr]
39
39
  ]
@@ -64,7 +64,7 @@ module Spree
64
64
  :meta_keywords, :price, :sku, :deleted_at, :prototype_id,
65
65
  :option_values_hash, :weight, :height, :width, :depth,
66
66
  :shipping_category_id, :tax_category_id,
67
- :cost_currency, :cost_price,
67
+ :cost_currency, :cost_price, :compare_at_price,
68
68
  option_type_ids: [], taxon_ids: []
69
69
  ]
70
70
 
@@ -96,9 +96,12 @@ module Spree
96
96
  :quantity, :stock_item, :stock_item_id, :originator, :action
97
97
  ]
98
98
 
99
- @@store_attributes = [:name, :url, :seo_title, :code, :meta_keywords,
99
+ @@store_attributes = [:name, :url, :seo_title, :code, :meta_keywords, :logo,
100
100
  :meta_description, :default_currency, :mail_from_address,
101
- :facebook, :twitter, :instagram]
101
+ :customer_support_email, :facebook, :twitter, :instagram,
102
+ :description, :address, :contact_phone,
103
+ :default_locale, :default_country_id, :supported_currencies,
104
+ :new_order_notifications_email, :mailer_logo, :checkout_zone_id, :seo_robots]
102
105
 
103
106
  @@store_credit_attributes = %i[amount currency category_id memo]
104
107
 
@@ -115,7 +118,7 @@ module Spree
115
118
  @@variant_attributes = [
116
119
  :name, :presentation, :cost_price, :discontinue_on, :lock_version,
117
120
  :position, :track_inventory,
118
- :product_id, :product, :option_values_attributes, :price,
121
+ :product_id, :product, :option_values_attributes, :price, :compare_at_price,
119
122
  :weight, :height, :width, :depth, :sku, :cost_currency,
120
123
  options: [:name, :value], option_value_ids: []
121
124
  ]
@@ -47,7 +47,11 @@ module Spree
47
47
  def call(input = nil)
48
48
  input ||= {}
49
49
  @_passed_input = Result.new(true, input)
50
- result = super
50
+ result = if input.is_a?(Hash)
51
+ super(**input)
52
+ else
53
+ super(input)
54
+ end
51
55
  @_passed_input = result if result.is_a? Result
52
56
  enforce_data_format
53
57
  @_passed_input
@@ -71,7 +75,7 @@ module Spree
71
75
  end
72
76
 
73
77
  begin
74
- @_passed_input = callable.call(@_passed_input.value)
78
+ @_passed_input = callable.call(**@_passed_input.value)
75
79
  rescue ArgumentError => e
76
80
  if e.message.include? 'missing'
77
81
  raise IncompatibleParamsPassed, "You didn't pass #{e.message} to callable '#{callable.name}'"
@@ -27,13 +27,14 @@ module Spree
27
27
 
28
28
  def stub_authorization!
29
29
  ability = build_ability
30
+ ability_class = Spree::Dependencies.ability_class.constantize
30
31
 
31
32
  after(:all) do
32
- Spree::Ability.remove_ability(ability)
33
+ ability_class.remove_ability(ability)
33
34
  end
34
35
 
35
36
  before(:all) do
36
- Spree::Ability.register_ability(ability)
37
+ ability_class.register_ability(ability)
37
38
  end
38
39
 
39
40
  before do
@@ -45,11 +46,13 @@ module Spree
45
46
 
46
47
  def custom_authorization!(&block)
47
48
  ability = build_ability(&block)
49
+ ability_class = Spree::Dependencies.ability_class.constantize
50
+
48
51
  after(:all) do
49
- Spree::Ability.remove_ability(ability)
52
+ ability_class.remove_ability(ability)
50
53
  end
51
54
  before(:all) do
52
- Spree::Ability.register_ability(ability)
55
+ ability_class.register_ability(ability)
53
56
  end
54
57
  end
55
58
  end
@@ -23,4 +23,4 @@ else
23
23
  end
24
24
  end
25
25
  Capybara.default_max_wait_time = 45
26
- Capybara.server = :webrick
26
+ Capybara.server = :puma
@@ -1,4 +1,21 @@
1
1
  FactoryBot.define do
2
+ trait :with_item_total_rule do
3
+ transient do
4
+ item_total_threshold_amount { 10 }
5
+ end
6
+
7
+ after(:create) do |promotion, evaluator|
8
+ rule = Spree::Promotion::Rules::ItemTotal.create!(
9
+ preferred_operator_min: 'gte',
10
+ preferred_operator_max: 'lte',
11
+ preferred_amount_min: evaluator.item_total_threshold_amount,
12
+ preferred_amount_max: evaluator.item_total_threshold_amount + 100
13
+ )
14
+ promotion.rules << rule
15
+ promotion.save!
16
+ end
17
+ end
18
+
2
19
  factory :promotion, class: Spree::Promotion do
3
20
  name { 'Promo' }
4
21
 
@@ -13,7 +30,16 @@ FactoryBot.define do
13
30
  Spree::Promotion::Actions::CreateItemAdjustments.create!(calculator: calculator, promotion: promotion)
14
31
  end
15
32
  end
33
+
34
+ trait :with_one_use_per_user_rule do
35
+ after(:create) do |promotion|
36
+ rule = Spree::Promotion::Rules::OneUsePerUser.create!
37
+ promotion.rules << rule
38
+ end
39
+ end
40
+
16
41
  factory :promotion_with_item_adjustment, traits: [:with_line_item_adjustment]
42
+ factory :promotion_with_one_use_per_user_rule, traits: [:with_line_item_adjustment, :with_one_use_per_user_rule]
17
43
 
18
44
  trait :with_order_adjustment do
19
45
  transient do
@@ -28,24 +54,8 @@ FactoryBot.define do
28
54
  promotion.save!
29
55
  end
30
56
  end
31
- factory :promotion_with_order_adjustment, traits: [:with_order_adjustment]
32
57
 
33
- trait :with_item_total_rule do
34
- transient do
35
- item_total_threshold_amount { 10 }
36
- end
37
-
38
- after(:create) do |promotion, evaluator|
39
- rule = Spree::Promotion::Rules::ItemTotal.create!(
40
- preferred_operator_min: 'gte',
41
- preferred_operator_max: 'lte',
42
- preferred_amount_min: evaluator.item_total_threshold_amount,
43
- preferred_amount_max: evaluator.item_total_threshold_amount + 100
44
- )
45
- promotion.rules << rule
46
- promotion.save!
47
- end
48
- end
58
+ factory :promotion_with_order_adjustment, traits: [:with_order_adjustment]
49
59
  factory :promotion_with_item_total_rule, traits: [:with_item_total_rule]
50
60
  end
51
61
 
@@ -57,5 +67,7 @@ FactoryBot.define do
57
67
  action.promotion = promotion
58
68
  action.save
59
69
  end
70
+
71
+ factory :free_shipping_promotion_with_item_total_rule, traits: [:with_item_total_rule]
60
72
  end
61
73
  end
@@ -8,15 +8,13 @@ FactoryBot.define do
8
8
 
9
9
  after(:create) do |shipment, _evalulator|
10
10
  shipment.add_shipping_method(create(:shipping_method), true)
11
-
12
- shipment.order.line_items.each do |line_item|
13
- line_item.quantity.times do
14
- shipment.inventory_units.create(
15
- order_id: shipment.order_id,
16
- variant_id: line_item.variant_id,
17
- line_item_id: line_item.id
18
- )
19
- end
11
+ shipment.order.line_items.map do |line_item|
12
+ shipment.inventory_units.create(
13
+ order_id: shipment.order_id,
14
+ variant_id: line_item.variant_id,
15
+ line_item_id: line_item.id,
16
+ quantity: line_item.quantity
17
+ )
20
18
  end
21
19
  end
22
20
  end
@@ -1,12 +1,15 @@
1
1
  FactoryBot.define do
2
2
  factory :store, class: Spree::Store do
3
- sequence(:code) { |i| "spree_#{i}" }
4
- name { 'Spree Test Store' }
5
- url { 'www.example.com' }
6
- mail_from_address { 'spree@example.org' }
7
- default_currency { 'USD' }
8
- facebook { 'spreecommerce' }
9
- twitter { 'spreecommerce' }
10
- instagram { 'spreecommerce' }
3
+ sequence(:code) { |i| "spree_#{i}" }
4
+ name { 'Spree Test Store' }
5
+ url { 'www.example.com' }
6
+ mail_from_address { 'no-reply@example.com' }
7
+ customer_support_email { 'support@example.com' }
8
+ new_order_notifications_email { 'store-owner@example.com' }
9
+ default_currency { 'USD' }
10
+ supported_currencies { 'USD,EUR,GBP' }
11
+ facebook { 'spreecommerce' }
12
+ twitter { 'spreecommerce' }
13
+ instagram { 'spreecommerce' }
11
14
  end
12
15
  end
@@ -1,24 +1,27 @@
1
1
  FactoryBot.define do
2
- factory :global_zone, class: Spree::Zone do
3
- name { 'GlobalZone' }
4
- description { generate(:random_string) }
5
- zone_members do |proxy|
6
- zone = proxy.instance_eval { @instance }
7
- Spree::Country.all.map do |c|
8
- Spree::ZoneMember.create(zoneable: c, zone: zone)
9
- end
10
- end
11
- end
12
-
13
2
  factory :zone, class: Spree::Zone do
14
3
  name { generate(:random_string) }
15
4
  description { generate(:random_string) }
16
5
 
17
6
  factory :zone_with_country do
7
+ kind { :country }
8
+
18
9
  zone_members do |proxy|
19
10
  zone = proxy.instance_eval { @instance }
20
- country = create(:country)
21
- [Spree::ZoneMember.create(zoneable: country, zone: zone)]
11
+
12
+ [Spree::ZoneMember.create(zoneable: create(:country), zone: zone)]
13
+ end
14
+
15
+ factory :global_zone, class: Spree::Zone do
16
+ sequence(:name) { |n| "GlobalZone_#{n}" }
17
+
18
+ zone_members do |proxy|
19
+ zone = proxy.instance_eval { @instance }
20
+
21
+ Spree::Country.all.map do |country|
22
+ Spree::ZoneMember.where(zoneable: country, zone: zone).first_or_create
23
+ end
24
+ end
22
25
  end
23
26
  end
24
27
  end