spree_core 2.4.0.rc3 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/helpers/spree/base_helper.rb +1 -1
- data/app/models/concerns/spree/default_price.rb +34 -0
- data/app/models/spree/asset.rb +1 -1
- data/app/models/spree/option_type.rb +3 -1
- data/app/models/spree/option_value.rb +2 -1
- data/app/models/spree/order.rb +19 -2
- data/app/models/spree/order/checkout.rb +4 -0
- data/app/models/spree/order_contents.rb +5 -2
- data/app/models/spree/payment_method.rb +4 -4
- data/app/models/spree/price.rb +2 -18
- data/app/models/spree/product.rb +25 -24
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +4 -1
- data/app/models/spree/promotion/rules/taxon.rb +8 -0
- data/app/models/spree/reimbursement.rb +2 -0
- data/app/models/spree/return_item.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/base_validator.rb +2 -2
- data/app/models/spree/return_item/{default_eligibility_validator.rb → eligibility_validator/default.rb} +1 -1
- data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +1 -1
- data/app/models/spree/variant.rb +17 -38
- data/config/locales/en.yml +6 -0
- data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +1 -1
- data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +5 -0
- data/lib/spree/core.rb +3 -3
- data/lib/spree/core/controller_helpers/order.rb +3 -1
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/localized_number.rb +20 -0
- data/lib/spree/money.rb +2 -2
- data/lib/spree/testing_support/factories/options_factory.rb +3 -2
- data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
- data/lib/tasks/exchanges.rake +2 -2
- metadata +12 -10
- data/db/development.sqlite +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ed979ffaeda61e053a4b98e9dc25390529f0f0e
|
4
|
+
data.tar.gz: 3d4c081a21a8f8a118066c765c0970aa18322c5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b919e8bca207687063f08ddda21b392381991e04f409b86d8d32c63e6ee38158a3b0ea5348158f662d52693dbe17b4af3e402cc99c6f1555b2fe61ed94f235d1
|
7
|
+
data.tar.gz: d9c59d21c2b5faece11d94a153cdb1bcee54adf364662b20d9b069550067b25629a9403fcf709b5b150633356b925bf41462a0252954951171d0f582c1f3d6e2
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Spree
|
2
|
+
module DefaultPrice
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
has_one :default_price,
|
7
|
+
-> { where currency: Spree::Config[:currency] },
|
8
|
+
class_name: 'Spree::Price',
|
9
|
+
dependent: :destroy
|
10
|
+
|
11
|
+
delegate_belongs_to :default_price, :display_price, :display_amount, :price, :price=, :currency
|
12
|
+
|
13
|
+
after_save :save_default_price
|
14
|
+
|
15
|
+
def default_price
|
16
|
+
Spree::Price.unscoped { super }
|
17
|
+
end
|
18
|
+
|
19
|
+
def has_default_price?
|
20
|
+
!self.default_price.nil?
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def default_price_changed?
|
26
|
+
default_price && (default_price.changed? || default_price.new_record?)
|
27
|
+
end
|
28
|
+
|
29
|
+
def save_default_price
|
30
|
+
default_price.save if default_price_changed?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/app/models/spree/asset.rb
CHANGED
@@ -5,7 +5,9 @@ module Spree
|
|
5
5
|
has_many :products, through: :product_option_types
|
6
6
|
has_and_belongs_to_many :prototypes, join_table: 'spree_option_types_prototypes'
|
7
7
|
|
8
|
-
validates :name, :
|
8
|
+
validates :name, presence: true, uniqueness: true
|
9
|
+
validates :presentation, presence: true
|
10
|
+
|
9
11
|
default_scope -> { order("#{self.table_name}.position") }
|
10
12
|
|
11
13
|
accepts_nested_attributes_for :option_values, reject_if: lambda { |ov| ov[:name].blank? || ov[:presentation].blank? }, allow_destroy: true
|
@@ -4,7 +4,8 @@ module Spree
|
|
4
4
|
acts_as_list scope: :option_type
|
5
5
|
has_and_belongs_to_many :variants, join_table: 'spree_option_values_variants', class_name: "Spree::Variant"
|
6
6
|
|
7
|
-
validates :name, :
|
7
|
+
validates :name, presence: true, uniqueness: true
|
8
|
+
validates :presentation, presence: true
|
8
9
|
|
9
10
|
after_touch :touch_all_variants
|
10
11
|
|
data/app/models/spree/order.rb
CHANGED
@@ -430,9 +430,26 @@ module Spree
|
|
430
430
|
line_items.select(&:insufficient_stock?)
|
431
431
|
end
|
432
432
|
|
433
|
+
##
|
434
|
+
# Check to see if any line item variants are soft, deleted.
|
435
|
+
# If so add error and restart checkout.
|
436
|
+
def ensure_line_item_variants_are_not_deleted
|
437
|
+
if line_items.select{ |li| li.variant.destroyed? }.present?
|
438
|
+
errors.add(:base, Spree.t(:deleted_variants_present))
|
439
|
+
restart_checkout_flow
|
440
|
+
false
|
441
|
+
else
|
442
|
+
true
|
443
|
+
end
|
444
|
+
end
|
445
|
+
|
433
446
|
def ensure_line_items_are_in_stock
|
434
447
|
if insufficient_stock_lines.present?
|
435
|
-
errors.add(:base, Spree.t(:insufficient_stock_lines_present))
|
448
|
+
errors.add(:base, Spree.t(:insufficient_stock_lines_present))
|
449
|
+
restart_checkout_flow
|
450
|
+
false
|
451
|
+
else
|
452
|
+
true
|
436
453
|
end
|
437
454
|
end
|
438
455
|
|
@@ -446,7 +463,7 @@ module Spree
|
|
446
463
|
current_line_item = self.line_items.detect { |my_li|
|
447
464
|
my_li.variant == other_order_line_item.variant &&
|
448
465
|
self.line_item_comparison_hooks.all? { |hook|
|
449
|
-
self.send(hook, my_li, other_order_line_item)
|
466
|
+
self.send(hook, my_li, other_order_line_item.serializable_hash)
|
450
467
|
}
|
451
468
|
}
|
452
469
|
if current_line_item
|
@@ -99,8 +99,12 @@ module Spree
|
|
99
99
|
before_transition from: :delivery, do: :apply_free_shipping_promotions
|
100
100
|
end
|
101
101
|
|
102
|
+
before_transition to: :resumed, do: :ensure_line_item_variants_are_not_deleted
|
102
103
|
before_transition to: :resumed, do: :ensure_line_items_are_in_stock
|
103
104
|
|
105
|
+
before_transition to: :complete, do: :ensure_line_item_variants_are_not_deleted
|
106
|
+
before_transition to: :complete, do: :ensure_line_items_are_in_stock
|
107
|
+
|
104
108
|
after_transition to: :complete, do: :finalize!
|
105
109
|
after_transition to: :resumed, do: :after_resume
|
106
110
|
after_transition to: :canceled, do: :after_cancel
|
@@ -47,9 +47,12 @@ module Spree
|
|
47
47
|
filtered_params = params.symbolize_keys
|
48
48
|
return filtered_params if filtered_params[:line_items_attributes].nil? || filtered_params[:line_items_attributes][:id]
|
49
49
|
|
50
|
+
line_item_ids = order.line_items.pluck(:id)
|
51
|
+
|
50
52
|
params[:line_items_attributes].each_pair do |id, value|
|
51
|
-
|
52
|
-
|
53
|
+
unless line_item_ids.include?(value[:id].to_i) || value[:variant_id].present?
|
54
|
+
filtered_params[:line_items_attributes].delete(id)
|
55
|
+
end
|
53
56
|
end
|
54
57
|
filtered_params
|
55
58
|
end
|
@@ -16,14 +16,14 @@ module Spree
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def provider_class
|
19
|
-
raise 'You must implement provider_class method for this gateway.'
|
19
|
+
raise ::NotImplementedError, 'You must implement provider_class method for this gateway.'
|
20
20
|
end
|
21
21
|
|
22
22
|
# The class that will process payments for this payment type, used for @payment.source
|
23
23
|
# e.g. CreditCard in the case of a the Gateway payment type
|
24
24
|
# nil means the payment method doesn't require a source e.g. check
|
25
25
|
def payment_source_class
|
26
|
-
raise 'You must implement payment_source_class method for this gateway.'
|
26
|
+
raise ::NotImplementedError, 'You must implement payment_source_class method for this gateway.'
|
27
27
|
end
|
28
28
|
|
29
29
|
def self.available(display_on = 'both')
|
@@ -68,8 +68,8 @@ module Spree
|
|
68
68
|
true
|
69
69
|
end
|
70
70
|
|
71
|
-
def cancel
|
72
|
-
raise
|
71
|
+
def cancel(response)
|
72
|
+
raise ::NotImplementedError, 'You must implement cancel method for this payment method.'
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
data/app/models/spree/price.rb
CHANGED
@@ -21,7 +21,7 @@ module Spree
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def price=(price)
|
24
|
-
self[:amount] =
|
24
|
+
self[:amount] = Spree::LocalizedNumber.parse(price)
|
25
25
|
end
|
26
26
|
|
27
27
|
# Remove variant default_scope `deleted_at: nil`
|
@@ -32,23 +32,7 @@ module Spree
|
|
32
32
|
private
|
33
33
|
|
34
34
|
def check_price
|
35
|
-
|
36
|
-
|
37
|
-
if currency.nil?
|
38
|
-
self.currency = Spree::Config[:currency]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# strips all non-price-like characters from the price, taking into account locale settings
|
43
|
-
def parse_price(price)
|
44
|
-
return price unless price.is_a?(String)
|
45
|
-
|
46
|
-
separator, delimiter = I18n.t([:'number.currency.format.separator', :'number.currency.format.delimiter'])
|
47
|
-
non_price_characters = /[^0-9\-#{separator}]/
|
48
|
-
price.gsub!(non_price_characters, '') # strip everything else first
|
49
|
-
price.gsub!(separator, '.') unless separator == '.' # then replace the locale-specific decimal separator with the standard separator if necessary
|
50
|
-
|
51
|
-
price.to_d
|
35
|
+
self.currency ||= Spree::Config[:currency]
|
52
36
|
end
|
53
37
|
|
54
38
|
def maximum_amount
|
data/app/models/spree/product.rb
CHANGED
@@ -64,32 +64,33 @@ module Spree
|
|
64
64
|
|
65
65
|
delegate_belongs_to :master, :cost_price
|
66
66
|
|
67
|
+
delegate :images, to: :master, prefix: true
|
68
|
+
alias_method :images, :master_images
|
69
|
+
|
70
|
+
has_many :variant_images, -> { order(:position) }, source: :images, through: :variants_including_master
|
71
|
+
|
67
72
|
after_create :set_master_variant_defaults
|
68
73
|
after_create :add_associations_from_prototype
|
69
74
|
after_create :build_variants_from_option_values_hash, if: :option_values_hash
|
70
75
|
|
76
|
+
after_destroy :punch_slug
|
77
|
+
|
78
|
+
after_initialize :ensure_master
|
79
|
+
|
71
80
|
after_save :save_master
|
72
81
|
after_save :run_touch_callbacks, if: :anything_changed?
|
73
82
|
after_save :reset_nested_changes
|
74
83
|
after_touch :touch_taxons
|
75
84
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
has_many :variant_images, -> { order(:position) }, source: :images, through: :variants_including_master
|
85
|
+
before_validation :normalize_slug, on: :update
|
86
|
+
before_validation :validate_master
|
80
87
|
|
88
|
+
validates :meta_keywords, length: { maximum: 255 }
|
89
|
+
validates :meta_title, length: { maximum: 255 }
|
81
90
|
validates :name, presence: true
|
82
91
|
validates :price, presence: true, if: proc { Spree::Config[:require_master_price] }
|
83
92
|
validates :shipping_category_id, presence: true
|
84
|
-
validates :slug, length: { minimum: 3 }
|
85
|
-
|
86
|
-
validates :slug, uniqueness: { allow_blank: true }
|
87
|
-
validates :meta_keywords, length: { maximum: 255 }
|
88
|
-
validates :meta_title, length: { maximum: 255 }
|
89
|
-
|
90
|
-
before_validation :normalize_slug, on: :update
|
91
|
-
|
92
|
-
after_destroy :punch_slug
|
93
|
+
validates :slug, length: { minimum: 3 }, uniqueness: { allow_blank: true }
|
93
94
|
|
94
95
|
attr_accessor :option_values_hash
|
95
96
|
|
@@ -97,8 +98,6 @@ module Spree
|
|
97
98
|
|
98
99
|
alias :options :product_option_types
|
99
100
|
|
100
|
-
after_initialize :ensure_master
|
101
|
-
|
102
101
|
# the master variant is not a member of the variants array
|
103
102
|
def has_variants?
|
104
103
|
variants.any?
|
@@ -279,19 +278,21 @@ module Spree
|
|
279
278
|
# when saving so we force a save using a hook
|
280
279
|
# Fix for issue #5306
|
281
280
|
def save_master
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
281
|
+
if master && (master.changed? || master.new_record? || (master.default_price && (master.default_price.changed? || master.default_price.new_record?)))
|
282
|
+
master.save!
|
283
|
+
@nested_changes = true
|
284
|
+
end
|
285
|
+
end
|
287
286
|
|
288
|
-
|
289
|
-
|
290
|
-
|
287
|
+
# If the master cannot be saved, the Product object will get its errors
|
288
|
+
# and will be destroyed
|
289
|
+
def validate_master
|
290
|
+
# We call master.default_price here to ensure price is initialized.
|
291
|
+
# Required to avoid Variant#check_price validation failing on create.
|
292
|
+
unless master.default_price && master.valid?
|
291
293
|
master.errors.each do |att, error|
|
292
294
|
self.errors.add(att, error)
|
293
295
|
end
|
294
|
-
raise
|
295
296
|
end
|
296
297
|
end
|
297
298
|
|
@@ -64,7 +64,10 @@ module Spree
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def line_items_to_adjust(promotion, order)
|
67
|
-
excluded_ids = self.adjustments.
|
67
|
+
excluded_ids = self.adjustments.
|
68
|
+
where(adjustable_id: order.line_items.pluck(:id), adjustable_type: 'Spree::LineItem').
|
69
|
+
pluck(:adjustable_id)
|
70
|
+
|
68
71
|
order.line_items.where.not(id: excluded_ids).select do |line_item|
|
69
72
|
promotion.line_item_actionable? order, line_item
|
70
73
|
end
|
@@ -26,6 +26,10 @@ module Spree
|
|
26
26
|
eligibility_errors.empty?
|
27
27
|
end
|
28
28
|
|
29
|
+
def actionable?(line_item)
|
30
|
+
taxon_product_ids.include? line_item.variant.product_id
|
31
|
+
end
|
32
|
+
|
29
33
|
def taxon_ids_string
|
30
34
|
taxons.pluck(:id).join(',')
|
31
35
|
end
|
@@ -55,6 +59,10 @@ module Spree
|
|
55
59
|
def taxons_in_order_including_parents(order)
|
56
60
|
order_taxons_in_taxons_and_children(order).inject([]){ |taxons, taxon| taxons << taxon.self_and_ancestors }.flatten.uniq
|
57
61
|
end
|
62
|
+
|
63
|
+
def taxon_product_ids
|
64
|
+
Spree::Product.joins(:taxons).where(spree_taxons: {id: taxons.pluck(:id)}).pluck(:id).uniq
|
65
|
+
end
|
58
66
|
end
|
59
67
|
end
|
60
68
|
end
|
@@ -17,6 +17,8 @@ module Spree
|
|
17
17
|
|
18
18
|
before_create :generate_number
|
19
19
|
|
20
|
+
scope :reimbursed, -> { where(reimbursement_status: 'reimbursed') }
|
21
|
+
|
20
22
|
# The reimbursement_tax_calculator property should be set to an object that responds to "call"
|
21
23
|
# and accepts a reimbursement object. Invoking "call" should update the tax fields on the
|
22
24
|
# associated ReturnItems.
|
@@ -3,7 +3,7 @@ module Spree
|
|
3
3
|
COMPLETED_RECEPTION_STATUSES = %w(received given_to_customer)
|
4
4
|
|
5
5
|
class_attribute :return_eligibility_validator
|
6
|
-
self.return_eligibility_validator = ReturnItem::EligibilityValidator::
|
6
|
+
self.return_eligibility_validator = ReturnItem::EligibilityValidator::Default
|
7
7
|
|
8
8
|
class_attribute :exchange_variant_engine
|
9
9
|
self.exchange_variant_engine = ReturnItem::ExchangeVariantEligibility::SameProduct
|
@@ -8,11 +8,11 @@ module Spree
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def eligible_for_return?
|
11
|
-
raise
|
11
|
+
raise NotImplementedError, Spree.t(:implement_eligible_for_return)
|
12
12
|
end
|
13
13
|
|
14
14
|
def requires_manual_intervention?
|
15
|
-
raise
|
15
|
+
raise NotImplementedError, Spree.t(:implement_requires_manual_intervention)
|
16
16
|
end
|
17
17
|
|
18
18
|
private
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Spree
|
2
|
-
class ReturnItem::
|
2
|
+
class ReturnItem::EligibilityValidator::Default < Spree::ReturnItem::EligibilityValidator::BaseValidator
|
3
3
|
class_attribute :permitted_eligibility_validators
|
4
4
|
self.permitted_eligibility_validators = [
|
5
5
|
ReturnItem::EligibilityValidator::TimeSincePurchase,
|
@@ -3,7 +3,7 @@ module Spree
|
|
3
3
|
class SameProduct
|
4
4
|
|
5
5
|
def self.eligible_variants(variant)
|
6
|
-
Spree::Variant.where
|
6
|
+
Spree::Variant.where(product_id: variant.product_id, is_master: false).in_stock
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|
data/app/models/spree/variant.rb
CHANGED
@@ -2,6 +2,8 @@ module Spree
|
|
2
2
|
class Variant < Spree::Base
|
3
3
|
acts_as_paranoid
|
4
4
|
|
5
|
+
include Spree::DefaultPrice
|
6
|
+
|
5
7
|
belongs_to :product, touch: true, class_name: 'Spree::Product', inverse_of: :variants
|
6
8
|
belongs_to :tax_category, class_name: 'Spree::TaxCategory'
|
7
9
|
|
@@ -20,31 +22,27 @@ module Spree
|
|
20
22
|
has_and_belongs_to_many :option_values, join_table: :spree_option_values_variants
|
21
23
|
has_many :images, -> { order(:position) }, as: :viewable, dependent: :destroy, class_name: "Spree::Image"
|
22
24
|
|
23
|
-
has_one :default_price,
|
24
|
-
-> { where currency: Spree::Config[:currency] },
|
25
|
-
class_name: 'Spree::Price', inverse_of: :variant
|
26
|
-
|
27
|
-
delegate_belongs_to :default_price, :display_price, :display_amount, :price, :price=, :currency
|
28
|
-
|
29
25
|
has_many :prices,
|
30
26
|
class_name: 'Spree::Price',
|
31
27
|
dependent: :destroy,
|
32
28
|
inverse_of: :variant
|
33
29
|
|
30
|
+
before_validation :set_cost_currency
|
31
|
+
|
34
32
|
validate :check_price
|
35
33
|
|
36
34
|
validates :cost_price, numericality: { greater_than_or_equal_to: 0, allow_nil: true }
|
37
35
|
validates :price, numericality: { greater_than_or_equal_to: 0, allow_nil: true }
|
38
36
|
validates_uniqueness_of :sku, allow_blank: true, conditions: -> { where(deleted_at: nil) }
|
39
37
|
|
40
|
-
before_validation :set_cost_currency
|
41
|
-
after_save :save_default_price
|
42
38
|
after_create :create_stock_items
|
43
39
|
after_create :set_position
|
44
|
-
after_create :set_master_out_of_stock, :
|
40
|
+
after_create :set_master_out_of_stock, unless: :is_master?
|
45
41
|
|
46
42
|
after_touch :clear_in_stock_cache
|
47
43
|
|
44
|
+
scope :in_stock, -> { joins(:stock_items).where('count_on_hand > ? OR track_inventory = ?', 0, false) }
|
45
|
+
|
48
46
|
def self.active(currency = nil)
|
49
47
|
joins(:prices).where(deleted_at: nil).where('spree_prices.currency' => currency || Spree::Config[:currency]).where('spree_prices.amount IS NOT NULL')
|
50
48
|
end
|
@@ -58,7 +56,11 @@ module Spree
|
|
58
56
|
end
|
59
57
|
|
60
58
|
def cost_price=(price)
|
61
|
-
self[:cost_price] =
|
59
|
+
self[:cost_price] = Spree::LocalizedNumber.parse(price) if price.present?
|
60
|
+
end
|
61
|
+
|
62
|
+
def weight=(weight)
|
63
|
+
self[:weight] = Spree::LocalizedNumber.parse(weight) if weight.present?
|
62
64
|
end
|
63
65
|
|
64
66
|
# returns number of units currently on backorder for this variant.
|
@@ -66,6 +68,10 @@ module Spree
|
|
66
68
|
inventory_units.with_state('backordered').size
|
67
69
|
end
|
68
70
|
|
71
|
+
def is_backorderable?
|
72
|
+
Spree::Stock::Quantifier.new(self).backorderable?
|
73
|
+
end
|
74
|
+
|
69
75
|
def options_text
|
70
76
|
values = self.option_values.sort do |a, b|
|
71
77
|
a.option_type.position <=> b.option_type.position
|
@@ -92,10 +98,6 @@ module Spree
|
|
92
98
|
Spree::Product.unscoped { super }
|
93
99
|
end
|
94
100
|
|
95
|
-
def default_price
|
96
|
-
Spree::Price.unscoped { super }
|
97
|
-
end
|
98
|
-
|
99
101
|
def options=(options = {})
|
100
102
|
options.each do |option|
|
101
103
|
set_option_value(option[:name], option[:value])
|
@@ -136,10 +138,6 @@ module Spree
|
|
136
138
|
self.option_values.detect { |o| o.option_type.name == opt_name }.try(:presentation)
|
137
139
|
end
|
138
140
|
|
139
|
-
def has_default_price?
|
140
|
-
!self.default_price.nil?
|
141
|
-
end
|
142
|
-
|
143
141
|
def price_in(currency)
|
144
142
|
prices.select{ |price| price.currency == currency }.first || Spree::Price.new(variant_id: self.id, currency: currency)
|
145
143
|
end
|
@@ -167,7 +165,7 @@ module Spree
|
|
167
165
|
options.keys.map { |key|
|
168
166
|
m = "#{options[key]}_price_modifier_amount".to_sym
|
169
167
|
if self.respond_to? m
|
170
|
-
self.send(m, options[key])
|
168
|
+
self.send(m, options[key])
|
171
169
|
else
|
172
170
|
0
|
173
171
|
end
|
@@ -203,17 +201,6 @@ module Spree
|
|
203
201
|
end
|
204
202
|
|
205
203
|
private
|
206
|
-
# strips all non-price-like characters from the price, taking into account locale settings
|
207
|
-
def parse_price(price)
|
208
|
-
return price unless price.is_a?(String)
|
209
|
-
|
210
|
-
separator, delimiter = I18n.t([:'number.currency.format.separator', :'number.currency.format.delimiter'])
|
211
|
-
non_price_characters = /[^0-9\-#{separator}]/
|
212
|
-
price.gsub!(non_price_characters, '') # strip everything else first
|
213
|
-
price.gsub!(separator, '.') unless separator == '.' # then replace the locale-specific decimal separator with the standard separator if necessary
|
214
|
-
|
215
|
-
price.to_d
|
216
|
-
end
|
217
204
|
|
218
205
|
def set_master_out_of_stock
|
219
206
|
if product.master && product.master.in_stock?
|
@@ -234,14 +221,6 @@ module Spree
|
|
234
221
|
end
|
235
222
|
end
|
236
223
|
|
237
|
-
def default_price_changed?
|
238
|
-
default_price && (default_price.changed? || default_price.new_record?)
|
239
|
-
end
|
240
|
-
|
241
|
-
def save_default_price
|
242
|
-
default_price.save if default_price_changed?
|
243
|
-
end
|
244
|
-
|
245
224
|
def set_cost_currency
|
246
225
|
self.cost_currency = Spree::Config[:currency] if cost_currency.nil? || cost_currency.empty?
|
247
226
|
end
|
data/config/locales/en.yml
CHANGED
@@ -528,6 +528,9 @@ en:
|
|
528
528
|
choose_dashboard_locale: Choose Dashboard Locale
|
529
529
|
choose_location: Choose location
|
530
530
|
city: City
|
531
|
+
clear_cache: Clear Cache
|
532
|
+
clear_cache_ok: Cache was flushed
|
533
|
+
clear_cache_warning: Clearing cache will temporarily reduce the performance of your store.
|
531
534
|
click_and_drag_on_the_products_to_sort_them: Click and drag on the products to sort them.
|
532
535
|
clone: Clone
|
533
536
|
close: Close
|
@@ -614,6 +617,7 @@ en:
|
|
614
617
|
default_tax: Default Tax
|
615
618
|
default_tax_zone: Default Tax Zone
|
616
619
|
delete: Delete
|
620
|
+
deleted_variants_present: Some line items in this order have products that are no longer available.
|
617
621
|
delivery: Delivery
|
618
622
|
depth: Depth
|
619
623
|
description: Description
|
@@ -833,6 +837,8 @@ en:
|
|
833
837
|
month: Month
|
834
838
|
more: More
|
835
839
|
move_stock_between_locations: Move Stock Between Locations
|
840
|
+
must_implement_eligible_for_return: "Must implement #eligible_for_return? for your EligibilityValidator."
|
841
|
+
must_implement_requires_manual_intervention: "Must implement #requires_manual_intervention? for your EligibilityValidator."
|
836
842
|
my_account: My Account
|
837
843
|
my_orders: My Orders
|
838
844
|
name: Name
|
@@ -10,7 +10,7 @@ class MoveOrderTokenFromTokenizedPermission < ActiveRecord::Migration
|
|
10
10
|
Spree::Order.includes(:tokenized_permission).each do |o|
|
11
11
|
o.update_column :guest_token, o.tokenized_permission.token
|
12
12
|
end
|
13
|
-
when 'Mysql2'
|
13
|
+
when 'Mysql2', 'MySQL'
|
14
14
|
execute "UPDATE spree_orders, spree_tokenized_permissions
|
15
15
|
SET spree_orders.guest_token = spree_tokenized_permissions.token
|
16
16
|
WHERE spree_tokenized_permissions.permissable_id = spree_orders.id
|
data/lib/spree/core.rb
CHANGED
@@ -58,10 +58,12 @@ require 'spree/migrations'
|
|
58
58
|
require 'spree/core/engine'
|
59
59
|
|
60
60
|
require 'spree/i18n'
|
61
|
+
require 'spree/localized_number'
|
61
62
|
require 'spree/money'
|
62
|
-
|
63
63
|
require 'spree/permitted_attributes'
|
64
|
+
|
64
65
|
require 'spree/core/delegate_belongs_to'
|
66
|
+
require 'spree/core/importer'
|
65
67
|
require 'spree/core/permalinks'
|
66
68
|
require 'spree/core/product_duplicator'
|
67
69
|
require 'spree/core/controller_helpers/auth'
|
@@ -73,8 +75,6 @@ require 'spree/core/controller_helpers/ssl'
|
|
73
75
|
require 'spree/core/controller_helpers/store'
|
74
76
|
require 'spree/core/controller_helpers/strong_parameters'
|
75
77
|
|
76
|
-
require 'spree/core/importer'
|
77
|
-
|
78
78
|
# Hack waiting on https://github.com/pluginaweek/state_machine/pull/275
|
79
79
|
module StateMachine
|
80
80
|
module Integrations
|
@@ -22,13 +22,14 @@ module Spree
|
|
22
22
|
if @simple_current_order
|
23
23
|
@simple_current_order.last_ip_address = ip_address
|
24
24
|
return @simple_current_order
|
25
|
+
else
|
26
|
+
@simple_current_order = Spree::Order.new
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
28
30
|
# The current incomplete order from the guest_token for use in cart and during checkout
|
29
31
|
def current_order(options = {})
|
30
32
|
options[:create_order_if_necessary] ||= false
|
31
|
-
options[:lock] ||= false
|
32
33
|
|
33
34
|
return @current_order if @current_order
|
34
35
|
|
@@ -82,6 +83,7 @@ module Spree
|
|
82
83
|
end
|
83
84
|
|
84
85
|
def find_order_by_token_or_user(options={}, with_adjustments = false)
|
86
|
+
options[:lock] ||= false
|
85
87
|
|
86
88
|
# Find any incomplete orders for the guest_token
|
87
89
|
if with_adjustments
|
data/lib/spree/core/version.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Spree
|
2
|
+
class LocalizedNumber
|
3
|
+
|
4
|
+
# Strips all non-price-like characters from the number, taking into account locale settings.
|
5
|
+
def self.parse(number)
|
6
|
+
return number unless number.is_a?(String)
|
7
|
+
|
8
|
+
separator, delimiter = I18n.t([:'number.currency.format.separator', :'number.currency.format.delimiter'])
|
9
|
+
non_number_characters = /[^0-9\-#{separator}]/
|
10
|
+
|
11
|
+
# strip everything else first
|
12
|
+
number.gsub!(non_number_characters, '')
|
13
|
+
# then replace the locale-specific decimal separator with the standard separator if necessary
|
14
|
+
number.gsub!(separator, '.') unless separator == '.'
|
15
|
+
|
16
|
+
number.to_d
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
data/lib/spree/money.rb
CHANGED
@@ -6,7 +6,7 @@ module Spree
|
|
6
6
|
class Money
|
7
7
|
attr_reader :money
|
8
8
|
|
9
|
-
delegate :cents, :
|
9
|
+
delegate :cents, to: :money
|
10
10
|
|
11
11
|
def initialize(amount, options={})
|
12
12
|
@money = Monetize.parse([amount, (options[:currency] || Spree::Config[:currency])].join)
|
@@ -26,7 +26,7 @@ module Spree
|
|
26
26
|
@money.format(@options)
|
27
27
|
end
|
28
28
|
|
29
|
-
def to_html(options = { :
|
29
|
+
def to_html(options = { html: true })
|
30
30
|
output = @money.format(@options.merge(options))
|
31
31
|
if options[:html]
|
32
32
|
# 1) prevent blank, breaking spaces
|
@@ -1,12 +1,13 @@
|
|
1
1
|
FactoryGirl.define do
|
2
2
|
factory :option_value, class: Spree::OptionValue do
|
3
|
-
name
|
3
|
+
sequence(:name) { |n| "Size-#{n}" }
|
4
|
+
|
4
5
|
presentation 'S'
|
5
6
|
option_type
|
6
7
|
end
|
7
8
|
|
8
9
|
factory :option_type, class: Spree::OptionType do
|
9
|
-
name
|
10
|
+
sequence(:name) { |n| "foo-size-#{n}" }
|
10
11
|
presentation 'Size'
|
11
12
|
end
|
12
13
|
end
|
data/lib/tasks/exchanges.rake
CHANGED
@@ -4,8 +4,8 @@ namespace :exchanges do
|
|
4
4
|
task charge_unreturned_items: :environment do
|
5
5
|
|
6
6
|
unreturned_return_items = Spree::ReturnItem.awaiting_return.exchange_processed.joins(:exchange_inventory_unit).where([
|
7
|
-
"spree_inventory_units.created_at < :days_ago",
|
8
|
-
days_ago: Spree::Config[:expedited_exchanges_days_window].days.ago
|
7
|
+
"spree_inventory_units.created_at < :days_ago AND spree_inventory_units.state = :iu_state",
|
8
|
+
days_ago: Spree::Config[:expedited_exchanges_days_window].days.ago, iu_state: "shipped"
|
9
9
|
]).to_a
|
10
10
|
|
11
11
|
# Determine that a return item has already been deemed unreturned and therefore charged
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.0
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Schofield
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemerchant
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 3.0.
|
47
|
+
version: 3.0.1
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 3.0.
|
54
|
+
version: 3.0.1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: carmen
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -260,14 +260,14 @@ dependencies:
|
|
260
260
|
requirements:
|
261
261
|
- - "~>"
|
262
262
|
- !ruby/object:Gem::Version
|
263
|
-
version: 4.1.
|
263
|
+
version: 4.1.8
|
264
264
|
type: :runtime
|
265
265
|
prerelease: false
|
266
266
|
version_requirements: !ruby/object:Gem::Requirement
|
267
267
|
requirements:
|
268
268
|
- - "~>"
|
269
269
|
- !ruby/object:Gem::Version
|
270
|
-
version: 4.1.
|
270
|
+
version: 4.1.8
|
271
271
|
- !ruby/object:Gem::Dependency
|
272
272
|
name: ransack
|
273
273
|
requirement: !ruby/object:Gem::Requirement
|
@@ -379,6 +379,7 @@ files:
|
|
379
379
|
- app/mailers/spree/test_mailer.rb
|
380
380
|
- app/models/concerns/spree/adjustment_source.rb
|
381
381
|
- app/models/concerns/spree/calculated_adjustments.rb
|
382
|
+
- app/models/concerns/spree/default_price.rb
|
382
383
|
- app/models/concerns/spree/named_type.rb
|
383
384
|
- app/models/concerns/spree/user_address.rb
|
384
385
|
- app/models/concerns/spree/user_api_authentication.rb
|
@@ -489,8 +490,8 @@ files:
|
|
489
490
|
- app/models/spree/return_authorization.rb
|
490
491
|
- app/models/spree/return_authorization_reason.rb
|
491
492
|
- app/models/spree/return_item.rb
|
492
|
-
- app/models/spree/return_item/default_eligibility_validator.rb
|
493
493
|
- app/models/spree/return_item/eligibility_validator/base_validator.rb
|
494
|
+
- app/models/spree/return_item/eligibility_validator/default.rb
|
494
495
|
- app/models/spree/return_item/eligibility_validator/rma_required.rb
|
495
496
|
- app/models/spree/return_item/eligibility_validator/time_since_purchase.rb
|
496
497
|
- app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb
|
@@ -560,7 +561,6 @@ files:
|
|
560
561
|
- db/default/spree/states.rb
|
561
562
|
- db/default/spree/stores.rb
|
562
563
|
- db/default/spree/zones.rb
|
563
|
-
- db/development.sqlite
|
564
564
|
- db/migrate/20120831092320_spree_one_two.rb
|
565
565
|
- db/migrate/20120831092359_spree_promo_one_two.rb
|
566
566
|
- db/migrate/20120905145253_add_tax_rate_label.rb
|
@@ -750,6 +750,7 @@ files:
|
|
750
750
|
- db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb
|
751
751
|
- db/migrate/20141101231208_fix_adjustment_order_presence.rb
|
752
752
|
- db/migrate/20141105213646_update_classifications_positions.rb
|
753
|
+
- db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb
|
753
754
|
- db/seeds.rb
|
754
755
|
- lib/generators/spree/custom_user/custom_user_generator.rb
|
755
756
|
- lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt
|
@@ -797,6 +798,7 @@ files:
|
|
797
798
|
- lib/spree/i18n.rb
|
798
799
|
- lib/spree/i18n/base.rb
|
799
800
|
- lib/spree/i18n/initializer.rb
|
801
|
+
- lib/spree/localized_number.rb
|
800
802
|
- lib/spree/migrations.rb
|
801
803
|
- lib/spree/money.rb
|
802
804
|
- lib/spree/permitted_attributes.rb
|
@@ -884,9 +886,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
884
886
|
version: 1.9.3
|
885
887
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
886
888
|
requirements:
|
887
|
-
- - "
|
889
|
+
- - ">="
|
888
890
|
- !ruby/object:Gem::Version
|
889
|
-
version:
|
891
|
+
version: '0'
|
890
892
|
requirements: []
|
891
893
|
rubyforge_project:
|
892
894
|
rubygems_version: 2.2.2
|
data/db/development.sqlite
DELETED
File without changes
|