spree_core 4.1.13 → 4.2.0.rc4

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 (150) 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 +45 -34
  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 +8 -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/payments.rb +10 -2
  32. data/app/models/spree/payment.rb +18 -4
  33. data/app/models/spree/payment/processing.rb +2 -2
  34. data/app/models/spree/payment_method.rb +3 -3
  35. data/app/models/spree/preferences/store.rb +1 -1
  36. data/app/models/spree/price.rb +25 -6
  37. data/app/models/spree/product.rb +29 -9
  38. data/app/models/spree/promotion.rb +10 -15
  39. data/app/models/spree/promotion/rules/product.rb +2 -1
  40. data/app/models/spree/promotion/rules/user.rb +2 -1
  41. data/app/models/spree/promotion_handler/coupon.rb +1 -1
  42. data/app/models/spree/promotion_handler/promotion_duplicator.rb +9 -3
  43. data/app/models/spree/refund.rb +2 -2
  44. data/app/models/spree/reimbursement.rb +2 -0
  45. data/app/models/spree/return_item/eligibility_validator/default.rb +0 -2
  46. data/app/models/spree/return_item/eligibility_validator/{r_m_a_required.rb → rma_required.rb} +0 -0
  47. data/app/models/spree/shipment.rb +3 -6
  48. data/app/models/spree/shipping_method.rb +1 -5
  49. data/app/models/spree/shipping_rate.rb +2 -11
  50. data/app/models/spree/stock/availability_validator.rb +3 -4
  51. data/app/models/spree/stock_item.rb +1 -5
  52. data/app/models/spree/stock_location.rb +13 -2
  53. data/app/models/spree/store.rb +51 -2
  54. data/app/models/spree/store_credit.rb +1 -1
  55. data/app/models/spree/variant.rb +16 -10
  56. data/app/models/spree/zone.rb +17 -4
  57. data/app/presenters/spree/variant_presenter.rb +9 -1
  58. data/app/presenters/spree/variants/option_types_presenter.rb +1 -0
  59. data/app/services/spree/account/addresses/create.rb +6 -1
  60. data/app/services/spree/account/addresses/{base.rb → helper.rb} +1 -3
  61. data/app/services/spree/account/addresses/update.rb +6 -1
  62. data/app/services/spree/compare_line_items.rb +4 -2
  63. data/app/sorters/spree/base_sorter.rb +35 -0
  64. data/app/sorters/spree/orders/sort.rb +1 -37
  65. data/app/sorters/spree/products/sort.rb +9 -32
  66. data/app/validators/email_validator.rb +1 -1
  67. data/app/views/layouts/spree/base_mailer.html.erb +45 -40
  68. data/app/views/spree/order_mailer/cancel_email.html.erb +19 -25
  69. data/app/views/spree/order_mailer/cancel_email.text.erb +24 -2
  70. data/app/views/spree/order_mailer/confirm_email.html.erb +18 -65
  71. data/app/views/spree/order_mailer/confirm_email.text.erb +2 -1
  72. data/app/views/spree/order_mailer/store_owner_notification_email.html.erb +23 -0
  73. data/app/views/spree/order_mailer/store_owner_notification_email.text.erb +38 -0
  74. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +53 -58
  75. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +3 -1
  76. data/app/views/spree/shared/_base_mailer_footer.html.erb +6 -14
  77. data/app/views/spree/shared/_base_mailer_header.html.erb +12 -32
  78. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +293 -625
  79. data/app/views/spree/shared/_purchased_items_table.html.erb +60 -0
  80. data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +13 -0
  81. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +27 -0
  82. data/app/views/spree/shared/purchased_items_table/_subtotal.html.erb +13 -0
  83. data/app/views/spree/shared/purchased_items_table/_total.html.erb +13 -0
  84. data/app/views/spree/shipment_mailer/shipped_email.html.erb +31 -36
  85. data/app/views/spree/shipment_mailer/shipped_email.text.erb +2 -1
  86. data/config/initializers/assets.rb +1 -0
  87. data/config/initializers/inflections.rb +3 -0
  88. data/config/initializers/rails61_fixes.rb +3 -0
  89. data/config/locales/en.yml +145 -19
  90. data/db/default/spree/countries.rb +10 -4
  91. data/db/default/spree/states.rb +42 -5
  92. data/db/default/spree/stores.rb +17 -12
  93. data/db/default/spree/zones.rb +5 -2
  94. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
  95. data/db/migrate/20140309033438_create_store_from_preferences.rb +1 -1
  96. data/db/migrate/20191017121054_add_supported_currencies_to_store.rb +10 -0
  97. data/db/migrate/20200102141311_add_social_to_spree_stores.rb +3 -0
  98. data/db/migrate/20200308210757_add_default_locale_to_spree_store.rb +7 -0
  99. data/db/migrate/20200310145140_add_customer_support_email_to_spree_store.rb +7 -0
  100. data/db/migrate/20200421095017_add_compare_at_amount_to_spree_prices.rb +7 -0
  101. data/db/migrate/20200423123001_add_default_country_id_to_spree_store.rb +9 -0
  102. data/db/migrate/20200430072209_add_footer_fields_to_spree_stores.rb +8 -0
  103. data/db/migrate/20200513154939_add_show_property_to_spree_product_properties.rb +5 -0
  104. data/db/migrate/20200607161221_add_store_owner_order_notification_delivered_to_spree_orders.rb +7 -0
  105. data/db/migrate/20200607161222_add_new_order_notifications_email_to_spree_stores.rb +7 -0
  106. data/db/migrate/20200610113542_add_label_to_spree_addresses.rb +5 -0
  107. data/db/migrate/20200826075557_add_unique_index_on_taxon_id_and_product_id_to_spree_products_taxons.rb +5 -0
  108. data/db/migrate/20201006110150_add_checkout_zone_field_to_store.rb +12 -0
  109. data/db/migrate/20201012091259_add_filterable_column_to_spree_option_types.rb +6 -0
  110. data/db/migrate/20201013084504_add_seo_robots_to_spree_stores.rb +5 -0
  111. data/db/migrate/20201127084048_add_default_country_kind_to_spree_zones.rb +5 -0
  112. data/db/migrate/20210112193440_remove_contact_email_from_spree_stores.rb +5 -0
  113. data/db/migrate/20210114182625_create_spree_payment_methods_stores.rb +10 -0
  114. data/db/migrate/20210114220232_migrate_data_payment_methods_stores.rb +15 -0
  115. data/db/migrate/20210117112551_remove_store_id_from_spree_payment_methods.rb +5 -0
  116. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -2
  117. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -2
  118. data/lib/generators/spree/mailers_preview/mailers_preview_generator.rb +23 -0
  119. data/lib/generators/spree/mailers_preview/templates/mailers/previews/order_preview.rb +13 -0
  120. data/lib/generators/spree/mailers_preview/templates/mailers/previews/reimbursement_preview.rb +5 -0
  121. data/lib/generators/spree/mailers_preview/templates/mailers/previews/shipment_preview.rb +5 -0
  122. data/lib/generators/spree/mailers_preview/templates/mailers/previews/user_preview.rb +11 -0
  123. data/lib/spree/core.rb +2 -0
  124. data/lib/spree/core/controller_helpers/common.rb +1 -0
  125. data/lib/spree/core/controller_helpers/currency_helpers.rb +15 -0
  126. data/lib/spree/core/controller_helpers/order.rb +9 -4
  127. data/lib/spree/core/controller_helpers/store.rb +16 -1
  128. data/lib/spree/core/importer/order.rb +9 -9
  129. data/lib/spree/core/product_filters.rb +3 -3
  130. data/lib/spree/core/version.rb +1 -1
  131. data/lib/spree/i18n.rb +7 -21
  132. data/lib/spree/permitted_attributes.rb +8 -5
  133. data/lib/spree/service_module.rb +6 -2
  134. data/lib/spree/testing_support/authorization_helpers.rb +7 -4
  135. data/lib/spree/testing_support/capybara_config.rb +1 -1
  136. data/lib/spree/testing_support/factories/promotion_factory.rb +29 -17
  137. data/lib/spree/testing_support/factories/shipment_factory.rb +7 -9
  138. data/lib/spree/testing_support/factories/store_factory.rb +11 -8
  139. data/lib/spree/testing_support/factories/zone_factory.rb +16 -13
  140. data/lib/spree/testing_support/i18n.rb +1 -1
  141. data/lib/spree/testing_support/order_walkthrough.rb +8 -3
  142. data/lib/spree/testing_support/rspec_retry_config.rb +10 -0
  143. data/spree_core.gemspec +10 -8
  144. data/vendor/assets/javascripts/cleave.js +1669 -0
  145. metadata +105 -30
  146. data/app/views/spree/order_mailer/_adjustment.html.erb +0 -8
  147. data/app/views/spree/order_mailer/_subtotal.html.erb +0 -8
  148. data/app/views/spree/order_mailer/_total.html.erb +0 -8
  149. data/lib/spree/i18n/base.rb +0 -17
  150. data/lib/spree/i18n/initializer.rb +0 -1
@@ -1,9 +1,8 @@
1
1
  module Spree
2
2
  class ShippingRate < Spree::Base
3
3
  belongs_to :shipment, class_name: 'Spree::Shipment'
4
- belongs_to :tax_rate, class_name: 'Spree::TaxRate'
5
- belongs_to :shipping_method, class_name: 'Spree::ShippingMethod', inverse_of: :shipping_rates
6
-
4
+ belongs_to :tax_rate, -> { with_deleted }, class_name: 'Spree::TaxRate'
5
+ belongs_to :shipping_method, -> { with_deleted }, class_name: 'Spree::ShippingMethod', inverse_of: :shipping_rates
7
6
  extend Spree::DisplayMoney
8
7
 
9
8
  money_methods :base_price, :final_price, :tax_amount
@@ -32,14 +31,6 @@ module Spree
32
31
  @tax_amount ||= tax_rate&.calculator&.compute_shipping_rate(self) || BigDecimal(0)
33
32
  end
34
33
 
35
- def shipping_method
36
- Spree::ShippingMethod.unscoped { super }
37
- end
38
-
39
- def tax_rate
40
- Spree::TaxRate.unscoped { super }
41
- end
42
-
43
34
  # returns base price - any available discounts for this Shipment
44
35
  # useful when you want to present a list of available shipping rates
45
36
  def final_price
@@ -14,10 +14,9 @@ module Spree
14
14
  display_name = variant.name.to_s
15
15
  display_name += " (#{variant.options_text})" unless variant.options_text.blank?
16
16
 
17
- line_item.errors[:quantity] << Spree.t(
18
- :selected_quantity_not_available,
19
- item: display_name.inspect
20
- )
17
+ line_item.errors.add(:quantity,
18
+ :selected_quantity_not_available,
19
+ message: Spree.t(:selected_quantity_not_available, item: display_name.inspect))
21
20
  end
22
21
 
23
22
  private
@@ -4,7 +4,7 @@ module Spree
4
4
 
5
5
  with_options inverse_of: :stock_items do
6
6
  belongs_to :stock_location, class_name: 'Spree::StockLocation'
7
- belongs_to :variant, class_name: 'Spree::Variant'
7
+ belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant'
8
8
  end
9
9
  has_many :stock_movements, inverse_of: :stock_item
10
10
 
@@ -56,10 +56,6 @@ module Spree
56
56
  in_stock? || backorderable?
57
57
  end
58
58
 
59
- def variant
60
- Spree::Variant.unscoped { super }
61
- end
62
-
63
59
  def reduce_count_on_hand_to_zero
64
60
  set_count_on_hand(0) if count_on_hand > 0
65
61
  end
@@ -106,8 +106,19 @@ module Spree
106
106
  private
107
107
 
108
108
  def create_stock_items
109
- Variant.includes(:product).find_each do |variant|
110
- propagate_variant(variant)
109
+ variants_scope = Spree::Variant
110
+ prepared_stock_items = variants_scope.ids.map do |variant_id|
111
+ Hash[
112
+ 'stock_location_id', id,
113
+ 'variant_id', variant_id,
114
+ 'backorderable', backorderable_default,
115
+ 'created_at', Time.current,
116
+ 'updated_at', Time.current
117
+ ]
118
+ end
119
+ if prepared_stock_items.any?
120
+ stock_items.insert_all(prepared_stock_items)
121
+ variants_scope.touch_all
111
122
  end
112
123
  end
113
124
 
@@ -2,12 +2,27 @@ module Spree
2
2
  class Store < Spree::Base
3
3
  has_many :orders, class_name: 'Spree::Order'
4
4
  has_many :payment_methods, class_name: 'Spree::PaymentMethod'
5
+ belongs_to :default_country, class_name: 'Spree::Country'
6
+ belongs_to :checkout_zone, class_name: 'Spree::Zone'
5
7
 
6
8
  with_options presence: true do
7
- validates :name, :url, :mail_from_address
8
- validates :default_currency
9
+ validates :name, :url, :mail_from_address, :default_currency, :code
9
10
  end
10
11
 
12
+ validates :code, uniqueness: true
13
+
14
+ if !ENV['SPREE_DISABLE_DB_CONNECTION'] &&
15
+ connected? &&
16
+ table_exists? &&
17
+ connection.column_exists?(:spree_stores, :new_order_notifications_email)
18
+ validates :new_order_notifications_email, email: { allow_blank: true }
19
+ end
20
+
21
+ has_one_attached :logo
22
+ has_one_attached :mailer_logo
23
+
24
+ validates :mailer_logo, content_type: ['image/png', 'image/jpg', 'image/jpeg']
25
+
11
26
  before_save :ensure_default_exists_and_is_unique
12
27
  before_destroy :validate_not_default
13
28
 
@@ -15,6 +30,8 @@ module Spree
15
30
 
16
31
  after_commit :clear_cache
17
32
 
33
+ alias_attribute :contact_email, :customer_support_email
34
+
18
35
  def self.current(domain = nil)
19
36
  current_store = domain ? Store.by_url(domain).first : nil
20
37
  current_store || Store.default
@@ -26,6 +43,38 @@ module Spree
26
43
  end
27
44
  end
28
45
 
46
+ def supported_currencies_list
47
+ (read_attribute(:supported_currencies).to_s.split(',') << default_currency).map(&:to_s).map do |code|
48
+ ::Money::Currency.find(code.strip)
49
+ end.uniq.compact
50
+ end
51
+
52
+ def unique_name
53
+ "#{name} (#{code})"
54
+ end
55
+
56
+ def formatted_url
57
+ return if url.blank?
58
+
59
+ if url.match(/http:\/\/|https:\/\//)
60
+ url
61
+ else
62
+ Rails.env.development? ? "http://#{url}" : "https://#{url}"
63
+ end
64
+ end
65
+
66
+ def countries_available_for_checkout
67
+ checkout_zone_or_default.try(:country_list) || Spree::Country.all
68
+ end
69
+
70
+ def states_available_for_checkout(country)
71
+ checkout_zone_or_default.try(:state_list_for, country) || country.states
72
+ end
73
+
74
+ def checkout_zone_or_default
75
+ checkout_zone || Spree::Zone.default_checkout_zone
76
+ end
77
+
29
78
  private
30
79
 
31
80
  def ensure_default_exists_and_is_unique
@@ -68,7 +68,7 @@ module Spree
68
68
  end
69
69
 
70
70
  def validate_authorization(amount, order_currency)
71
- if amount_remaining.to_d < amount.to_d
71
+ if BigDecimal(amount_remaining, 3) < BigDecimal(amount, 3)
72
72
  errors.add(:base, Spree.t('store_credit_payment_method.insufficient_funds'))
73
73
  elsif currency != order_currency
74
74
  errors.add(:base, Spree.t('store_credit_payment_method.currency_mismatch'))
@@ -3,7 +3,7 @@ module Spree
3
3
  acts_as_paranoid
4
4
  acts_as_list scope: :product
5
5
 
6
- belongs_to :product, touch: true, class_name: 'Spree::Product', inverse_of: :variants
6
+ belongs_to :product, -> { with_deleted }, touch: true, class_name: 'Spree::Product', inverse_of: :variants
7
7
  belongs_to :tax_category, class_name: 'Spree::TaxCategory', optional: true
8
8
 
9
9
  delegate :name, :name=, :description, :slug, :available_on, :shipping_category_id,
@@ -103,10 +103,19 @@ module Spree
103
103
 
104
104
  self.whitelisted_ransackable_associations = %w[option_values product prices default_price]
105
105
  self.whitelisted_ransackable_attributes = %w[weight sku]
106
- self.whitelisted_ransackable_scopes = %i(product_name_or_sku_cont)
106
+ self.whitelisted_ransackable_scopes = %i(product_name_or_sku_cont search_by_product_name_or_sku)
107
107
 
108
108
  def self.product_name_or_sku_cont(query)
109
- joins(:product).where("#{Product.table_name}.name LIKE :query OR sku LIKE :query", query: "%#{query}%")
109
+ joins(:product).where("LOWER(#{Product.table_name}.name) LIKE LOWER(:query) OR LOWER(sku) LIKE LOWER(:query)", query: "%#{query}%")
110
+ end
111
+
112
+ def self.search_by_product_name_or_sku(query)
113
+ if defined?(SpreeGlobalize)
114
+ joins(product: :translations).where("LOWER(#{Product::Translation.table_name}.name) LIKE LOWER(:query) OR LOWER(sku) LIKE LOWER(:query)",
115
+ query: "%#{query}%")
116
+ else
117
+ product_name_or_sku_cont(query)
118
+ end
110
119
  end
111
120
 
112
121
  def available?
@@ -141,13 +150,6 @@ module Spree
141
150
  !!deleted_at
142
151
  end
143
152
 
144
- # Product may be created with deleted_at already set,
145
- # which would make AR's default finder return nil.
146
- # This is a stopgap for that little problem.
147
- def product
148
- Spree::Product.unscoped { super }
149
- end
150
-
151
153
  def options=(options = {})
152
154
  options.each do |option|
153
155
  set_option_value(option[:name], option[:value])
@@ -223,6 +225,10 @@ module Spree
223
225
  end.sum
224
226
  end
225
227
 
228
+ def compare_at_price
229
+ price_in(cost_currency).try(:compare_at_amount)
230
+ end
231
+
226
232
  def name_and_sku
227
233
  "#{name} - #{sku}"
228
234
  end
@@ -70,6 +70,10 @@ module Spree
70
70
  matches.first
71
71
  end
72
72
 
73
+ def self.default_checkout_zone
74
+ find_by(name: Spree::Config[:checkout_zone])
75
+ end
76
+
73
77
  def kind
74
78
  if self[:kind].present?
75
79
  self[:kind]
@@ -97,8 +101,6 @@ module Spree
97
101
  zone_member.zoneable_id == address.country_id
98
102
  when 'Spree::State'
99
103
  zone_member.zoneable_id == address.state_id
100
- else
101
- false
102
104
  end
103
105
  end
104
106
  end
@@ -110,8 +112,6 @@ module Spree
110
112
  zoneables
111
113
  when 'state' then
112
114
  zoneables.collect(&:country)
113
- else
114
- []
115
115
  end.flatten.compact.uniq
116
116
  end
117
117
 
@@ -167,6 +167,19 @@ module Spree
167
167
  true
168
168
  end
169
169
 
170
+ def state_list
171
+ case kind
172
+ when 'country'
173
+ zoneables.map(&:states)
174
+ when 'state'
175
+ zoneables
176
+ end.flatten.compact.uniq
177
+ end
178
+
179
+ def state_list_for(country)
180
+ state_list.select { |state| state.country == country }
181
+ end
182
+
170
183
  private
171
184
 
172
185
  def remove_defunct_members
@@ -3,19 +3,23 @@ module Spree
3
3
  include Rails.application.routes.url_helpers
4
4
  include Spree::BaseHelper
5
5
 
6
- attr_reader :current_currency, :current_price_options
6
+ attr_reader :current_currency, :current_price_options, :current_store
7
7
 
8
8
  def initialize(opts = {})
9
9
  @variants = opts[:variants]
10
10
  @is_product_available_in_currency = opts[:is_product_available_in_currency]
11
11
  @current_currency = opts[:current_currency]
12
12
  @current_price_options = opts[:current_price_options]
13
+ @current_store = opts[:current_store]
13
14
  end
14
15
 
15
16
  def call
16
17
  @variants.map do |variant|
17
18
  {
18
19
  display_price: display_price(variant),
20
+ price: variant.price_in(current_currency),
21
+ display_compare_at_price: display_compare_at_price(variant),
22
+ should_display_compare_at_price: should_display_compare_at_price(variant),
19
23
  is_product_available_in_currency: @is_product_available_in_currency,
20
24
  backorderable: backorderable?(variant),
21
25
  in_stock: in_stock?(variant),
@@ -71,5 +75,9 @@ module Spree
71
75
  purchasable: variant.purchasable?
72
76
  }
73
77
  end
78
+
79
+ def should_display_compare_at_price(variant)
80
+ variant.compare_at_price.present? && variant.compare_at_price > variant.price
81
+ end
74
82
  end
75
83
  end
@@ -76,6 +76,7 @@ module Spree
76
76
  id: option_value.id,
77
77
  position: option_value.position,
78
78
  presentation: option_value.presentation,
79
+ name: option_value.name,
79
80
  variant_id: option_value.variants.where(id: @variant_ids).order(:position).first.id,
80
81
  is_default: option_value == default_variant_data[:option_value]
81
82
  }
@@ -1,7 +1,12 @@
1
1
  module Spree
2
2
  module Account
3
3
  module Addresses
4
- class Create < ::Spree::Account::Addresses::Base
4
+ class Create
5
+ prepend Spree::ServiceModule::Base
6
+ include Spree::Account::Addresses::Helper
7
+
8
+ attr_accessor :country
9
+
5
10
  def call(user:, address_params:)
6
11
  fill_country_and_state_ids(address_params)
7
12
 
@@ -1,9 +1,7 @@
1
1
  module Spree
2
2
  module Account
3
3
  module Addresses
4
- class Base
5
- prepend Spree::ServiceModule::Base
6
-
4
+ module Helper
7
5
  private
8
6
 
9
7
  attr_accessor :country
@@ -1,7 +1,12 @@
1
1
  module Spree
2
2
  module Account
3
3
  module Addresses
4
- class Update < ::Spree::Account::Addresses::Base
4
+ class Update
5
+ prepend Spree::ServiceModule::Base
6
+ include Spree::Account::Addresses::Helper
7
+
8
+ attr_accessor :country
9
+
5
10
  def call(address:, address_params:)
6
11
  address_params[:country_id] ||= address.country_id
7
12
  fill_country_and_state_ids(address_params)
@@ -1,9 +1,11 @@
1
1
  # This class should be refactored
2
2
  module Spree
3
3
  class CompareLineItems
4
- prepend Spree::ServiceModule:: Base
4
+ prepend Spree::ServiceModule::Base
5
+
6
+ def call(order:, line_item:, options: {}, comparison_hooks: nil)
7
+ comparison_hooks ||= Rails.application.config.spree.line_item_comparison_hooks
5
8
 
6
- def call(order:, line_item:, options: {}, comparison_hooks: Rails.application.config.spree.line_item_comparison_hooks)
7
9
  legacy_part = comparison_hooks.all? do |hook|
8
10
  order.send(hook, line_item, options)
9
11
  end
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ class BaseSorter
3
+ def initialize(scope, params = {}, allowed_sort_attributes = [])
4
+ @scope = scope
5
+ @sort = params[:sort]
6
+ @allowed_sort_attributes = allowed_sort_attributes
7
+ end
8
+
9
+ def call
10
+ by_param_attribute(scope)
11
+ end
12
+
13
+ protected
14
+
15
+ attr_reader :scope, :collection, :sort, :allowed_sort_attributes
16
+
17
+ def by_param_attribute(scope)
18
+ return scope if sort_field.blank? || !allowed_sort_attributes.include?(sort_field.to_sym)
19
+
20
+ scope.order("#{sort_field}": order_direction)
21
+ end
22
+
23
+ def desc_order
24
+ @desc_order ||= String(sort)[0] == '-'
25
+ end
26
+
27
+ def sort_field
28
+ @sort_field ||= desc_order ? sort[1..-1] : sort
29
+ end
30
+
31
+ def order_direction
32
+ desc_order ? :desc : :asc
33
+ end
34
+ end
35
+ end
@@ -1,42 +1,6 @@
1
1
  module Spree
2
2
  module Orders
3
- class Sort
4
- attr_reader :scope, :sort
5
-
6
- def initialize(scope, params)
7
- @scope = scope
8
- @sort = params[:sort]
9
- end
10
-
11
- def call
12
- orders = completed_at(scope)
13
-
14
- orders
15
- end
16
-
17
- private
18
-
19
- def desc_order
20
- @desc_order ||= String(sort)[0] == '-'
21
- end
22
-
23
- def sort_field
24
- @sort_field ||= desc_order ? sort[1..-1] : sort
25
- end
26
-
27
- def order_direction
28
- desc_order ? :asc : :desc
29
- end
30
-
31
- def completed_at?
32
- sort_field.eql?('completed_at')
33
- end
34
-
35
- def completed_at(orders)
36
- return orders unless completed_at?
37
-
38
- orders.order(completed_at: order_direction)
39
- end
3
+ class Sort < ::Spree::BaseSorter
40
4
  end
41
5
  end
42
6
  end