spree_core 4.1.13 → 4.2.0.rc4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/spree/base_controller.rb +1 -2
- data/app/finders/spree/addresses/find.rb +1 -12
- data/app/finders/spree/base_finder.rb +14 -0
- data/app/finders/spree/countries/find.rb +11 -3
- data/app/finders/spree/credit_cards/find.rb +2 -2
- data/app/finders/spree/orders/find_current.rb +1 -1
- data/app/helpers/spree/base_helper.rb +61 -20
- data/app/helpers/spree/mail_helper.rb +29 -0
- data/app/helpers/spree/products_helper.rb +2 -1
- data/app/mailers/spree/base_mailer.rb +19 -5
- data/app/mailers/spree/order_mailer.rb +13 -4
- data/app/mailers/spree/reimbursement_mailer.rb +4 -2
- data/app/mailers/spree/shipment_mailer.rb +4 -2
- data/app/models/concerns/spree/default_price.rb +3 -6
- data/app/models/concerns/spree/user_methods.rb +11 -5
- data/app/models/concerns/spree/user_payment_source.rb +1 -1
- data/app/models/spree/ability.rb +45 -34
- data/app/models/spree/address.rb +17 -1
- data/app/models/spree/adjustment.rb +1 -0
- data/app/models/spree/app_configuration.rb +4 -0
- data/app/models/spree/app_dependencies.rb +4 -2
- data/app/models/spree/base.rb +5 -0
- data/app/models/spree/credit_card.rb +5 -0
- data/app/models/spree/fulfilment_changer.rb +58 -16
- data/app/models/spree/inventory_unit.rb +2 -7
- data/app/models/spree/line_item.rb +8 -7
- data/app/models/spree/log_entry.rb +1 -1
- data/app/models/spree/option_type.rb +7 -1
- data/app/models/spree/order.rb +27 -5
- data/app/models/spree/order/payments.rb +10 -2
- data/app/models/spree/payment.rb +18 -4
- data/app/models/spree/payment/processing.rb +2 -2
- data/app/models/spree/payment_method.rb +3 -3
- data/app/models/spree/preferences/store.rb +1 -1
- data/app/models/spree/price.rb +25 -6
- data/app/models/spree/product.rb +29 -9
- data/app/models/spree/promotion.rb +10 -15
- data/app/models/spree/promotion/rules/product.rb +2 -1
- data/app/models/spree/promotion/rules/user.rb +2 -1
- data/app/models/spree/promotion_handler/coupon.rb +1 -1
- data/app/models/spree/promotion_handler/promotion_duplicator.rb +9 -3
- data/app/models/spree/refund.rb +2 -2
- data/app/models/spree/reimbursement.rb +2 -0
- data/app/models/spree/return_item/eligibility_validator/default.rb +0 -2
- data/app/models/spree/return_item/eligibility_validator/{r_m_a_required.rb → rma_required.rb} +0 -0
- data/app/models/spree/shipment.rb +3 -6
- data/app/models/spree/shipping_method.rb +1 -5
- data/app/models/spree/shipping_rate.rb +2 -11
- data/app/models/spree/stock/availability_validator.rb +3 -4
- data/app/models/spree/stock_item.rb +1 -5
- data/app/models/spree/stock_location.rb +13 -2
- data/app/models/spree/store.rb +51 -2
- data/app/models/spree/store_credit.rb +1 -1
- data/app/models/spree/variant.rb +16 -10
- data/app/models/spree/zone.rb +17 -4
- data/app/presenters/spree/variant_presenter.rb +9 -1
- data/app/presenters/spree/variants/option_types_presenter.rb +1 -0
- data/app/services/spree/account/addresses/create.rb +6 -1
- data/app/services/spree/account/addresses/{base.rb → helper.rb} +1 -3
- data/app/services/spree/account/addresses/update.rb +6 -1
- data/app/services/spree/compare_line_items.rb +4 -2
- data/app/sorters/spree/base_sorter.rb +35 -0
- data/app/sorters/spree/orders/sort.rb +1 -37
- data/app/sorters/spree/products/sort.rb +9 -32
- data/app/validators/email_validator.rb +1 -1
- data/app/views/layouts/spree/base_mailer.html.erb +45 -40
- data/app/views/spree/order_mailer/cancel_email.html.erb +19 -25
- data/app/views/spree/order_mailer/cancel_email.text.erb +24 -2
- data/app/views/spree/order_mailer/confirm_email.html.erb +18 -65
- data/app/views/spree/order_mailer/confirm_email.text.erb +2 -1
- data/app/views/spree/order_mailer/store_owner_notification_email.html.erb +23 -0
- data/app/views/spree/order_mailer/store_owner_notification_email.text.erb +38 -0
- data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +53 -58
- data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +3 -1
- data/app/views/spree/shared/_base_mailer_footer.html.erb +6 -14
- data/app/views/spree/shared/_base_mailer_header.html.erb +12 -32
- data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +293 -625
- data/app/views/spree/shared/_purchased_items_table.html.erb +60 -0
- data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +13 -0
- data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +27 -0
- data/app/views/spree/shared/purchased_items_table/_subtotal.html.erb +13 -0
- data/app/views/spree/shared/purchased_items_table/_total.html.erb +13 -0
- data/app/views/spree/shipment_mailer/shipped_email.html.erb +31 -36
- data/app/views/spree/shipment_mailer/shipped_email.text.erb +2 -1
- data/config/initializers/assets.rb +1 -0
- data/config/initializers/inflections.rb +3 -0
- data/config/initializers/rails61_fixes.rb +3 -0
- data/config/locales/en.yml +145 -19
- data/db/default/spree/countries.rb +10 -4
- data/db/default/spree/states.rb +42 -5
- data/db/default/spree/stores.rb +17 -12
- data/db/default/spree/zones.rb +5 -2
- data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
- data/db/migrate/20140309033438_create_store_from_preferences.rb +1 -1
- data/db/migrate/20191017121054_add_supported_currencies_to_store.rb +10 -0
- data/db/migrate/20200102141311_add_social_to_spree_stores.rb +3 -0
- data/db/migrate/20200308210757_add_default_locale_to_spree_store.rb +7 -0
- data/db/migrate/20200310145140_add_customer_support_email_to_spree_store.rb +7 -0
- data/db/migrate/20200421095017_add_compare_at_amount_to_spree_prices.rb +7 -0
- data/db/migrate/20200423123001_add_default_country_id_to_spree_store.rb +9 -0
- data/db/migrate/20200430072209_add_footer_fields_to_spree_stores.rb +8 -0
- data/db/migrate/20200513154939_add_show_property_to_spree_product_properties.rb +5 -0
- data/db/migrate/20200607161221_add_store_owner_order_notification_delivered_to_spree_orders.rb +7 -0
- data/db/migrate/20200607161222_add_new_order_notifications_email_to_spree_stores.rb +7 -0
- data/db/migrate/20200610113542_add_label_to_spree_addresses.rb +5 -0
- data/db/migrate/20200826075557_add_unique_index_on_taxon_id_and_product_id_to_spree_products_taxons.rb +5 -0
- data/db/migrate/20201006110150_add_checkout_zone_field_to_store.rb +12 -0
- data/db/migrate/20201012091259_add_filterable_column_to_spree_option_types.rb +6 -0
- data/db/migrate/20201013084504_add_seo_robots_to_spree_stores.rb +5 -0
- data/db/migrate/20201127084048_add_default_country_kind_to_spree_zones.rb +5 -0
- data/db/migrate/20210112193440_remove_contact_email_from_spree_stores.rb +5 -0
- data/db/migrate/20210114182625_create_spree_payment_methods_stores.rb +10 -0
- data/db/migrate/20210114220232_migrate_data_payment_methods_stores.rb +15 -0
- data/db/migrate/20210117112551_remove_store_id_from_spree_payment_methods.rb +5 -0
- data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -2
- data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -2
- data/lib/generators/spree/mailers_preview/mailers_preview_generator.rb +23 -0
- data/lib/generators/spree/mailers_preview/templates/mailers/previews/order_preview.rb +13 -0
- data/lib/generators/spree/mailers_preview/templates/mailers/previews/reimbursement_preview.rb +5 -0
- data/lib/generators/spree/mailers_preview/templates/mailers/previews/shipment_preview.rb +5 -0
- data/lib/generators/spree/mailers_preview/templates/mailers/previews/user_preview.rb +11 -0
- data/lib/spree/core.rb +2 -0
- data/lib/spree/core/controller_helpers/common.rb +1 -0
- data/lib/spree/core/controller_helpers/currency_helpers.rb +15 -0
- data/lib/spree/core/controller_helpers/order.rb +9 -4
- data/lib/spree/core/controller_helpers/store.rb +16 -1
- data/lib/spree/core/importer/order.rb +9 -9
- data/lib/spree/core/product_filters.rb +3 -3
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/i18n.rb +7 -21
- data/lib/spree/permitted_attributes.rb +8 -5
- data/lib/spree/service_module.rb +6 -2
- data/lib/spree/testing_support/authorization_helpers.rb +7 -4
- data/lib/spree/testing_support/capybara_config.rb +1 -1
- data/lib/spree/testing_support/factories/promotion_factory.rb +29 -17
- data/lib/spree/testing_support/factories/shipment_factory.rb +7 -9
- data/lib/spree/testing_support/factories/store_factory.rb +11 -8
- data/lib/spree/testing_support/factories/zone_factory.rb +16 -13
- data/lib/spree/testing_support/i18n.rb +1 -1
- data/lib/spree/testing_support/order_walkthrough.rb +8 -3
- data/lib/spree/testing_support/rspec_retry_config.rb +10 -0
- data/spree_core.gemspec +10 -8
- data/vendor/assets/javascripts/cleave.js +1669 -0
- metadata +105 -30
- data/app/views/spree/order_mailer/_adjustment.html.erb +0 -8
- data/app/views/spree/order_mailer/_subtotal.html.erb +0 -8
- data/app/views/spree/order_mailer/_total.html.erb +0 -8
- data/lib/spree/i18n/base.rb +0 -17
- data/lib/spree/i18n/initializer.rb +0 -1
@@ -32,7 +32,7 @@ module Spree
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def pending_payments
|
35
|
-
payments.
|
35
|
+
payments.pending
|
36
36
|
end
|
37
37
|
|
38
38
|
def unprocessed_payments
|
@@ -52,7 +52,7 @@ module Spree
|
|
52
52
|
|
53
53
|
payment.public_send(method)
|
54
54
|
|
55
|
-
if payment.completed? && payment_total !=
|
55
|
+
if payment.completed? && payment_total != total_without_pending_store_credits
|
56
56
|
self.payment_total += payment.amount
|
57
57
|
end
|
58
58
|
end
|
@@ -60,6 +60,14 @@ module Spree
|
|
60
60
|
result = !!Spree::Config[:allow_checkout_on_gateway_error]
|
61
61
|
errors.add(:base, e.message) && (return result)
|
62
62
|
end
|
63
|
+
|
64
|
+
# Pending store credits are not added to `self.payment_total`.
|
65
|
+
# It can cause a situation where the amount of the credit card payment reduced with store credits
|
66
|
+
# may be added twice to `self.payment_total` causing wrong `order.outstanding_balance`
|
67
|
+
# calculations and thus an incorrect payment state.
|
68
|
+
def total_without_pending_store_credits
|
69
|
+
total - payments.map { |p| p.amount if p.source.is_a?(Spree::StoreCredit) && p.pending? }.sum(&:to_f)
|
70
|
+
end
|
63
71
|
end
|
64
72
|
end
|
65
73
|
end
|
data/app/models/spree/payment.rb
CHANGED
@@ -14,7 +14,7 @@ module Spree
|
|
14
14
|
|
15
15
|
with_options inverse_of: :payments do
|
16
16
|
belongs_to :order, class_name: 'Spree::Order', touch: true
|
17
|
-
belongs_to :payment_method, class_name: 'Spree::PaymentMethod'
|
17
|
+
belongs_to :payment_method, -> { with_deleted }, class_name: 'Spree::PaymentMethod'
|
18
18
|
end
|
19
19
|
belongs_to :source, polymorphic: true
|
20
20
|
|
@@ -195,14 +195,28 @@ module Spree
|
|
195
195
|
|
196
196
|
def validate_source
|
197
197
|
if source && !source.valid?
|
198
|
-
|
199
|
-
|
200
|
-
|
198
|
+
if Rails::VERSION::STRING >= '6.1'
|
199
|
+
source.errors.map { |error| { field: error.attribute, message: error&.message } }.each do |err|
|
200
|
+
next if err[:field].blank? || err[:message].blank?
|
201
|
+
|
202
|
+
add_source_error(err[:field], err[:message])
|
203
|
+
end
|
204
|
+
else
|
205
|
+
source.errors.messages.each do |field, error|
|
206
|
+
next if field.blank? || error.empty?
|
207
|
+
|
208
|
+
add_source_error(field, error.first)
|
209
|
+
end
|
201
210
|
end
|
202
211
|
end
|
203
212
|
!errors.present?
|
204
213
|
end
|
205
214
|
|
215
|
+
def add_source_error(field, message)
|
216
|
+
field_name = I18n.t("activerecord.attributes.#{source.class.to_s.underscore}.#{field}")
|
217
|
+
errors.add(Spree.t(source.class.to_s.demodulize.underscore), "#{field_name} #{message}")
|
218
|
+
end
|
219
|
+
|
206
220
|
def profiles_supported?
|
207
221
|
payment_method.respond_to?(:payment_profiles_supported?) && payment_method.payment_profiles_supported?
|
208
222
|
end
|
@@ -163,8 +163,8 @@ module Spree
|
|
163
163
|
else
|
164
164
|
error.to_s
|
165
165
|
end
|
166
|
-
logger.error(Spree.t(:gateway_error))
|
167
|
-
logger.error(" #{error.to_yaml}")
|
166
|
+
Rails.logger.error(Spree.t(:gateway_error))
|
167
|
+
Rails.logger.error(" #{error.to_yaml}")
|
168
168
|
raise Core::GatewayError, text
|
169
169
|
end
|
170
170
|
|
@@ -12,7 +12,7 @@ module Spree
|
|
12
12
|
|
13
13
|
validates :name, presence: true
|
14
14
|
|
15
|
-
|
15
|
+
has_and_belongs_to_many :stores
|
16
16
|
|
17
17
|
with_options dependent: :restrict_with_error do
|
18
18
|
has_many :payments, class_name: 'Spree::Payment', inverse_of: :payment_method
|
@@ -79,9 +79,9 @@ module Spree
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def available_for_store?(store)
|
82
|
-
return true if store.blank?
|
82
|
+
return true if store.blank?
|
83
83
|
|
84
|
-
|
84
|
+
store_ids.include?(store.id)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
end
|
data/app/models/spree/price.rb
CHANGED
@@ -6,7 +6,7 @@ module Spree
|
|
6
6
|
|
7
7
|
MAXIMUM_AMOUNT = BigDecimal('99_999_999.99')
|
8
8
|
|
9
|
-
belongs_to :variant, class_name: 'Spree::Variant', inverse_of: :prices, touch: true
|
9
|
+
belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant', inverse_of: :prices, touch: true
|
10
10
|
|
11
11
|
before_validation :ensure_currency
|
12
12
|
|
@@ -15,10 +15,16 @@ module Spree
|
|
15
15
|
less_than_or_equal_to: MAXIMUM_AMOUNT
|
16
16
|
}
|
17
17
|
|
18
|
+
validates :compare_at_amount, allow_nil: true, numericality: {
|
19
|
+
greater_than_or_equal_to: 0,
|
20
|
+
less_than_or_equal_to: MAXIMUM_AMOUNT
|
21
|
+
}
|
22
|
+
|
18
23
|
extend DisplayMoney
|
19
|
-
money_methods :amount, :price
|
24
|
+
money_methods :amount, :price, :compare_at_amount
|
25
|
+
alias display_compare_at_price display_compare_at_amount
|
20
26
|
|
21
|
-
self.whitelisted_ransackable_attributes = ['amount']
|
27
|
+
self.whitelisted_ransackable_attributes = ['amount', 'compare_at_amount']
|
22
28
|
|
23
29
|
def money
|
24
30
|
Spree::Money.new(amount || 0, currency: currency)
|
@@ -28,20 +34,33 @@ module Spree
|
|
28
34
|
self[:amount] = Spree::LocalizedNumber.parse(amount)
|
29
35
|
end
|
30
36
|
|
37
|
+
def compare_at_money
|
38
|
+
Spree::Money.new(compare_at_amount || 0, currency: currency)
|
39
|
+
end
|
40
|
+
|
41
|
+
def compare_at_amount=(compare_at_amount)
|
42
|
+
self[:compare_at_amount] = Spree::LocalizedNumber.parse(compare_at_amount)
|
43
|
+
end
|
44
|
+
|
31
45
|
alias_attribute :price, :amount
|
46
|
+
alias_attribute :compare_at_price, :compare_at_amount
|
32
47
|
|
33
48
|
def price_including_vat_for(price_options)
|
34
49
|
options = price_options.merge(tax_category: variant.tax_category)
|
35
50
|
gross_amount(price, options)
|
36
51
|
end
|
37
52
|
|
53
|
+
def compare_at_price_including_vat_for(price_options)
|
54
|
+
options = price_options.merge(tax_category: variant.tax_category)
|
55
|
+
gross_amount(compare_at_price, options)
|
56
|
+
end
|
57
|
+
|
38
58
|
def display_price_including_vat_for(price_options)
|
39
59
|
Spree::Money.new(price_including_vat_for(price_options), currency: currency)
|
40
60
|
end
|
41
61
|
|
42
|
-
|
43
|
-
|
44
|
-
Spree::Variant.unscoped { super }
|
62
|
+
def display_compare_at_price_including_vat_for(price_options)
|
63
|
+
Spree::Money.new(compare_at_price_including_vat_for(price_options), currency: currency)
|
45
64
|
end
|
46
65
|
|
47
66
|
private
|
data/app/models/spree/product.rb
CHANGED
@@ -113,17 +113,17 @@ module Spree
|
|
113
113
|
|
114
114
|
self.whitelisted_ransackable_associations = %w[taxons stores variants_including_master master variants]
|
115
115
|
self.whitelisted_ransackable_attributes = %w[description name slug discontinue_on]
|
116
|
-
self.whitelisted_ransackable_scopes = %w[not_discontinued]
|
116
|
+
self.whitelisted_ransackable_scopes = %w[not_discontinued search_by_name]
|
117
117
|
|
118
118
|
[
|
119
119
|
:sku, :price, :currency, :weight, :height, :width, :depth, :is_master,
|
120
|
-
:cost_currency, :price_in, :amount_in, :cost_price
|
120
|
+
:cost_currency, :price_in, :amount_in, :cost_price, :compare_at_price
|
121
121
|
].each do |method_name|
|
122
122
|
delegate method_name, :"#{method_name}=", to: :find_or_build_master
|
123
123
|
end
|
124
124
|
|
125
125
|
delegate :display_amount, :display_price, :has_default_price?,
|
126
|
-
:images, to: :find_or_build_master
|
126
|
+
:display_compare_at_price, :images, to: :find_or_build_master
|
127
127
|
|
128
128
|
alias master_images images
|
129
129
|
|
@@ -160,10 +160,8 @@ module Spree
|
|
160
160
|
#
|
161
161
|
# @return [Spree::Variant]
|
162
162
|
def default_variant
|
163
|
-
|
164
|
-
|
165
|
-
Rails.cache.fetch("spree/default-variant/#{cache_key_with_version}/#{track_inventory}") do
|
166
|
-
if track_inventory && variants.in_stock_or_backorderable.any?
|
163
|
+
Rails.cache.fetch(default_variant_cache_key) do
|
164
|
+
if Spree::Config[:track_inventory_levels] && variants.in_stock_or_backorderable.any?
|
167
165
|
variants.in_stock_or_backorderable.first
|
168
166
|
else
|
169
167
|
has_variants? ? variants.first : master
|
@@ -252,6 +250,14 @@ module Spree
|
|
252
250
|
where conditions.inject(:or)
|
253
251
|
end
|
254
252
|
|
253
|
+
def self.search_by_name(query)
|
254
|
+
if defined?(SpreeGlobalize)
|
255
|
+
joins(:translations).order(:name).where("LOWER(#{Product::Translation.table_name}.name) LIKE LOWER(:query)", query: "%#{query}%").distinct
|
256
|
+
else
|
257
|
+
where("LOWER(#{Product.table_name}.name) LIKE LOWER(:query)", query: "%#{query}%")
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
255
261
|
# Suitable for displaying only variants that has at least one option value.
|
256
262
|
# There may be scenarios where an option type is removed and along with it
|
257
263
|
# all option values. At that point all variants associated with only those
|
@@ -344,6 +350,10 @@ module Spree
|
|
344
350
|
save
|
345
351
|
end
|
346
352
|
|
353
|
+
def default_variant_cache_key
|
354
|
+
"spree/default-variant/#{cache_key_with_version}/#{Spree::Config[:track_inventory_levels]}"
|
355
|
+
end
|
356
|
+
|
347
357
|
def ensure_master
|
348
358
|
return unless new_record?
|
349
359
|
|
@@ -401,8 +411,18 @@ module Spree
|
|
401
411
|
# We call master.default_price here to ensure price is initialized.
|
402
412
|
# Required to avoid Variant#check_price validation failing on create.
|
403
413
|
unless master.default_price && master.valid?
|
404
|
-
|
405
|
-
errors.
|
414
|
+
if Rails::VERSION::STRING >= '6.1'
|
415
|
+
master.errors.map { |error| { field: error.attribute, message: error&.message } }.each do |err|
|
416
|
+
next if err[:field].blank? || err[:message].blank?
|
417
|
+
|
418
|
+
errors.add(err[:field], err[:message])
|
419
|
+
end
|
420
|
+
else
|
421
|
+
master.errors.messages.each do |field, error|
|
422
|
+
next if field.blank? || error.empty?
|
423
|
+
|
424
|
+
errors.add(field, error.first)
|
425
|
+
end
|
406
426
|
end
|
407
427
|
end
|
408
428
|
end
|
@@ -28,6 +28,8 @@ module Spree
|
|
28
28
|
|
29
29
|
before_save :normalize_blank_values
|
30
30
|
|
31
|
+
before_validation :normalize_code
|
32
|
+
|
31
33
|
scope :coupons, -> { where.not(code: nil) }
|
32
34
|
scope :advertised, -> { where(advertise: true) }
|
33
35
|
scope :applied, lambda {
|
@@ -192,21 +194,10 @@ module Spree
|
|
192
194
|
end
|
193
195
|
|
194
196
|
def used_by?(user, excluded_orders = [])
|
195
|
-
|
196
|
-
:
|
197
|
-
:
|
198
|
-
:
|
199
|
-
].any? do |adjustment_type|
|
200
|
-
user.orders.complete.joins(adjustment_type).where(
|
201
|
-
spree_adjustments: {
|
202
|
-
source_type: 'Spree::PromotionAction',
|
203
|
-
source_id: actions.map(&:id),
|
204
|
-
eligible: true
|
205
|
-
}
|
206
|
-
).where.not(
|
207
|
-
id: excluded_orders.map(&:id)
|
208
|
-
).any?
|
209
|
-
end
|
197
|
+
user.orders.complete.joins(:promotions).joins(:all_adjustments).
|
198
|
+
where.not(spree_orders: { id: excluded_orders.map(&:id) }).
|
199
|
+
where(spree_promotions: { id: id }).
|
200
|
+
where(spree_adjustments: { source_type: 'Spree::PromotionAction', eligible: true }).any?
|
210
201
|
end
|
211
202
|
|
212
203
|
private
|
@@ -227,6 +218,10 @@ module Spree
|
|
227
218
|
end
|
228
219
|
end
|
229
220
|
|
221
|
+
def normalize_code
|
222
|
+
self.code = code.strip if code.present?
|
223
|
+
end
|
224
|
+
|
230
225
|
def match_all?
|
231
226
|
match_policy == 'all'
|
232
227
|
end
|
@@ -27,7 +27,7 @@ module Spree
|
|
27
27
|
promotion = order.promotions.with_coupon_code(coupon_code)
|
28
28
|
if promotion.present?
|
29
29
|
# Order promotion has to be destroyed before line item removing
|
30
|
-
order.order_promotions.
|
30
|
+
order.order_promotions.where(promotion_id: promotion.id).destroy_all
|
31
31
|
|
32
32
|
remove_promotion_adjustments(promotion)
|
33
33
|
remove_promotion_line_items(promotion)
|
@@ -1,15 +1,16 @@
|
|
1
1
|
module Spree
|
2
2
|
module PromotionHandler
|
3
3
|
class PromotionDuplicator
|
4
|
-
def initialize(promotion)
|
4
|
+
def initialize(promotion, random_string: nil)
|
5
5
|
@promotion = promotion
|
6
|
+
@random_string = random_string || generate_random_string(4)
|
6
7
|
end
|
7
8
|
|
8
9
|
def duplicate
|
9
10
|
@new_promotion = @promotion.dup
|
10
|
-
@new_promotion.path = "#{@promotion.path}
|
11
|
+
@new_promotion.path = "#{@promotion.path}_#{@random_string}"
|
11
12
|
@new_promotion.name = "New #{@promotion.name}"
|
12
|
-
@new_promotion.code = "#{@promotion.code}
|
13
|
+
@new_promotion.code = "#{@promotion.code}_#{@random_string}"
|
13
14
|
|
14
15
|
ActiveRecord::Base.transaction do
|
15
16
|
@new_promotion.save
|
@@ -33,6 +34,11 @@ module Spree
|
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
37
|
+
def generate_random_string(number)
|
38
|
+
charset = Array('A'..'Z') + Array('a'..'z')
|
39
|
+
Array.new(number) { charset.sample }.join
|
40
|
+
end
|
41
|
+
|
36
42
|
def copy_actions
|
37
43
|
@promotion.promotion_actions.each do |action|
|
38
44
|
new_action = action.dup
|
data/app/models/spree/refund.rb
CHANGED
@@ -61,14 +61,14 @@ module Spree
|
|
61
61
|
end
|
62
62
|
|
63
63
|
unless response.success?
|
64
|
-
logger.error(Spree.t(:gateway_error) + " #{response.to_yaml}")
|
64
|
+
Rails.logger.error(Spree.t(:gateway_error) + " #{response.to_yaml}")
|
65
65
|
text = response.params['message'] || response.params['response_reason_text'] || response.message
|
66
66
|
raise Core::GatewayError, text
|
67
67
|
end
|
68
68
|
|
69
69
|
response
|
70
70
|
rescue ActiveMerchant::ConnectionError => e
|
71
|
-
logger.error(Spree.t(:gateway_error) + " #{e.inspect}")
|
71
|
+
Rails.logger.error(Spree.t(:gateway_error) + " #{e.inspect}")
|
72
72
|
raise Core::GatewayError, Spree.t(:unable_to_connect_to_gateway)
|
73
73
|
end
|
74
74
|
|
@@ -60,6 +60,8 @@ module Spree
|
|
60
60
|
class_attribute :reimbursement_failure_hooks
|
61
61
|
self.reimbursement_failure_hooks = []
|
62
62
|
|
63
|
+
delegate :store, :currency, to: :order
|
64
|
+
|
63
65
|
state_machine :reimbursement_status, initial: :pending do
|
64
66
|
event :errored do
|
65
67
|
transition to: :errored, from: :pending
|
data/app/models/spree/return_item/eligibility_validator/{r_m_a_required.rb → rma_required.rb}
RENAMED
File without changes
|
@@ -42,6 +42,8 @@ module Spree
|
|
42
42
|
scope :reverse_chronological, -> { order(Arel.sql('coalesce(spree_shipments.shipped_at, spree_shipments.created_at) desc'), id: :desc) }
|
43
43
|
scope :valid, -> { where.not(state: :canceled) }
|
44
44
|
|
45
|
+
delegate :store, :currency, to: :order
|
46
|
+
|
45
47
|
# shipment state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
|
46
48
|
state_machine initial: :pending, use_transactions: false do
|
47
49
|
event :ready do
|
@@ -104,11 +106,6 @@ module Spree
|
|
104
106
|
inventory_units.any?(&:backordered?)
|
105
107
|
end
|
106
108
|
|
107
|
-
# TODO: delegate currency to Order, order.currency is mandatory
|
108
|
-
def currency
|
109
|
-
order ? order.currency : Spree::Config[:currency]
|
110
|
-
end
|
111
|
-
|
112
109
|
# Determines the appropriate +state+ according to the following logic:
|
113
110
|
#
|
114
111
|
# pending unless order is complete and +order.payment_state+ is +paid+
|
@@ -365,7 +362,7 @@ module Spree
|
|
365
362
|
desired_shipment: shipment_to_transfer_to,
|
366
363
|
variant: variant,
|
367
364
|
quantity: quantity
|
368
|
-
)
|
365
|
+
)
|
369
366
|
end
|
370
367
|
|
371
368
|
private
|
@@ -19,7 +19,7 @@ module Spree
|
|
19
19
|
foreign_key: 'shipping_method_id'
|
20
20
|
has_many :zones, through: :shipping_method_zones, class_name: 'Spree::Zone'
|
21
21
|
|
22
|
-
belongs_to :tax_category, class_name: 'Spree::TaxCategory', optional: true
|
22
|
+
belongs_to :tax_category, -> { with_deleted }, class_name: 'Spree::TaxCategory', optional: true
|
23
23
|
|
24
24
|
validates :name, :display_on, presence: true
|
25
25
|
|
@@ -44,10 +44,6 @@ module Spree
|
|
44
44
|
select { |c| c.to_s.constantize < Spree::ShippingCalculator }
|
45
45
|
end
|
46
46
|
|
47
|
-
def tax_category
|
48
|
-
Spree::TaxCategory.unscoped { super }
|
49
|
-
end
|
50
|
-
|
51
47
|
def available_to_display?(display_filter)
|
52
48
|
(frontend? && display_filter == DISPLAY_ON_FRONT_END) ||
|
53
49
|
(backend? && display_filter == DISPLAY_ON_BACK_END)
|