spree_core 2.2.1 → 2.2.2
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/products_helper.rb +3 -3
- data/app/models/concerns/spree/user_reporting.rb +2 -2
- data/app/models/spree/address.rb +7 -7
- data/app/models/spree/credit_card.rb +11 -5
- data/app/models/spree/gateway.rb +4 -1
- data/app/models/spree/item_adjustments.rb +17 -7
- data/app/models/spree/line_item.rb +2 -2
- data/app/models/spree/order.rb +35 -19
- data/app/models/spree/order/checkout.rb +3 -1
- data/app/models/spree/order_updater.rb +8 -2
- data/app/models/spree/payment.rb +2 -2
- data/app/models/spree/payment/processing.rb +9 -0
- data/app/models/spree/payment_method.rb +6 -0
- data/app/models/spree/price.rb +2 -2
- data/app/models/spree/product.rb +7 -2
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +1 -0
- data/app/models/spree/promotion/rules/product.rb +4 -2
- data/app/models/spree/promotion/rules/user.rb +2 -2
- data/app/models/spree/promotion_handler/coupon.rb +6 -1
- data/app/models/spree/shipment.rb +0 -1
- data/app/models/spree/shipping_rate.rb +11 -9
- data/app/models/spree/stock/availability_validator.rb +1 -1
- data/app/models/spree/stock/quantifier.rb +1 -9
- data/app/models/spree/stock_item.rb +4 -0
- data/app/models/spree/tax_rate.rb +9 -8
- data/app/models/spree/taxon.rb +3 -0
- data/app/models/spree/variant.rb +1 -5
- data/config/locales/en.yml +1 -0
- data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
- data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +5 -0
- data/lib/generators/spree/dummy/dummy_generator.rb +7 -2
- data/lib/spree/core.rb +2 -0
- data/lib/spree/core/engine.rb +1 -1
- data/lib/spree/core/importer/order.rb +13 -2
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/migrations.rb +10 -1
- data/lib/spree/money.rb +1 -1
- data/lib/spree/testing_support/capybara_ext.rb +1 -1
- data/lib/spree/testing_support/factories/address_factory.rb +1 -1
- metadata +34 -11
- data/vendor/assets/fonts/FontAwesome.otf +0 -0
- data/vendor/assets/fonts/fontawesome-webfont.eot +0 -0
- data/vendor/assets/fonts/fontawesome-webfont.svg +0 -399
- data/vendor/assets/fonts/fontawesome-webfont.ttf +0 -0
- data/vendor/assets/fonts/fontawesome-webfont.woff +0 -0
- data/vendor/assets/stylesheets/font-awesome.scss +0 -1475
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a5120849e1aaa18b3747ba821d39be5e0e22c64
|
4
|
+
data.tar.gz: 472557e5032544f1c53694c452989910466e7fa9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8dec314e53c791de3fa15d96772d7b6b46771873321ff7219fe5a7a8316d61f6dfa82fc50d6b176d1186a3c1944eeb9962488570dea5f14a8fb7a40ac6fba4fe
|
7
|
+
data.tar.gz: 3423ee941bbce9284bad16a6137a991efe553553a87abca67585cb5bf8dc9e10a4cf4b364b456e8404f37b0649050b154ecd266fa78965a5ec9758866b53896b
|
@@ -9,7 +9,6 @@ module Spree
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
12
|
# returns the formatted price for the specified variant as a difference from product price
|
14
13
|
def variant_price_diff(variant)
|
15
14
|
diff = variant.amount_in(current_currency) - variant.product.amount_in(current_currency)
|
@@ -54,8 +53,9 @@ module Spree
|
|
54
53
|
end
|
55
54
|
|
56
55
|
def cache_key_for_products
|
57
|
-
|
58
|
-
|
56
|
+
count = @products.count
|
57
|
+
max_updated_at = (@products.maximum(:updated_at) || Date.today).to_s(:number)
|
58
|
+
"#{current_currency}/spree/products/all-#{params[:page]}-#{max_updated_at}-#{count}"
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
module UserReporting
|
3
3
|
def lifetime_value
|
4
|
-
|
4
|
+
spree_orders.complete.pluck(:total).sum
|
5
5
|
end
|
6
6
|
|
7
7
|
def display_lifetime_value
|
@@ -9,7 +9,7 @@ module Spree
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def order_count
|
12
|
-
BigDecimal(
|
12
|
+
BigDecimal(spree_orders.complete.count)
|
13
13
|
end
|
14
14
|
|
15
15
|
def average_order_value
|
data/app/models/spree/address.rb
CHANGED
@@ -82,15 +82,15 @@ module Spree
|
|
82
82
|
}
|
83
83
|
end
|
84
84
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
end
|
85
|
+
def require_phone?
|
86
|
+
true
|
87
|
+
end
|
89
88
|
|
90
|
-
|
91
|
-
|
92
|
-
|
89
|
+
def require_zipcode?
|
90
|
+
true
|
91
|
+
end
|
93
92
|
|
93
|
+
private
|
94
94
|
def state_validate
|
95
95
|
# Skip state validation without country (also required)
|
96
96
|
# or when disabled by preference
|
@@ -29,12 +29,18 @@ module Spree
|
|
29
29
|
}
|
30
30
|
|
31
31
|
def expiry=(expiry)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
return unless expiry.present?
|
33
|
+
|
34
|
+
self[:month], self[:year] =
|
35
|
+
if expiry.match(/\d\s?\/\s?\d/) # will match mm/yy and mm / yyyy
|
36
|
+
expiry.delete(' ').split('/')
|
37
|
+
elsif match = expiry.match(/(\d{2})(\d{2,4})/) # will match mmyy and mmyyyy
|
38
|
+
[match[1], match[2]]
|
37
39
|
end
|
40
|
+
|
41
|
+
self[:year] = "20" + self[:year] if self[:year].length == 2
|
42
|
+
self[:year] = self[:year].to_i
|
43
|
+
self[:month] = self[:month].to_i
|
38
44
|
end
|
39
45
|
|
40
46
|
def number=(num)
|
data/app/models/spree/gateway.rb
CHANGED
@@ -64,7 +64,7 @@ module Spree
|
|
64
64
|
payment_source_class.where(id: source_ids).with_payment_profile
|
65
65
|
end
|
66
66
|
|
67
|
-
def
|
67
|
+
def reusable_sources(order)
|
68
68
|
if order.completed?
|
69
69
|
sources_by_order order
|
70
70
|
else
|
@@ -75,5 +75,8 @@ module Spree
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
end
|
78
|
+
|
79
|
+
# for backwards compatibility
|
80
|
+
alias_method :source_with_profiles, :reusable_sources
|
78
81
|
end
|
79
82
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Spree
|
2
2
|
# Manage (recalculate) item (LineItem or Shipment) adjustments
|
3
3
|
class ItemAdjustments
|
4
|
+
include ActiveSupport::Callbacks
|
5
|
+
define_callbacks :promo_adjustments, :tax_adjustments
|
4
6
|
attr_reader :item
|
5
7
|
|
6
8
|
delegate :adjustments, :order, to: :item
|
@@ -32,14 +34,22 @@ module Spree
|
|
32
34
|
# Included tax adjustments are those which are included in the price.
|
33
35
|
# These ones should not effect the eventual total price.
|
34
36
|
#
|
35
|
-
# Additional tax adjustments are the opposite; effecting the final total.
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
# Additional tax adjustments are the opposite; effecting the final total.
|
38
|
+
promo_total = 0
|
39
|
+
run_callbacks :promo_adjustments do
|
40
|
+
promotion_total = adjustments.promotion.reload.map(&:update!).compact.sum
|
41
|
+
unless promotion_total == 0
|
42
|
+
choose_best_promotion_adjustment
|
43
|
+
end
|
44
|
+
promo_total = best_promotion_adjustment.try(:amount).to_f
|
45
|
+
end
|
46
|
+
|
47
|
+
included_tax_total = 0
|
48
|
+
additional_tax_total = 0
|
49
|
+
run_callbacks :tax_adjustments do
|
50
|
+
included_tax_total = adjustments.tax.included.reload.map(&:update!).compact.sum
|
51
|
+
additional_tax_total = adjustments.tax.additional.reload.map(&:update!).compact.sum
|
39
52
|
end
|
40
|
-
promo_total = best_promotion_adjustment.try(:amount).to_f
|
41
|
-
included_tax_total = adjustments.tax.included.reload.map(&:update!).compact.sum
|
42
|
-
additional_tax_total = adjustments.tax.additional.reload.map(&:update!).compact.sum
|
43
53
|
|
44
54
|
item.update_columns(
|
45
55
|
:promo_total => promo_total,
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
class LineItem < ActiveRecord::Base
|
3
3
|
before_validation :adjust_quantity
|
4
|
-
belongs_to :order, class_name: "Spree::Order", inverse_of: :line_items
|
4
|
+
belongs_to :order, class_name: "Spree::Order", inverse_of: :line_items, touch: true
|
5
5
|
belongs_to :variant, class_name: "Spree::Variant", inverse_of: :line_items
|
6
6
|
belongs_to :tax_category, class_name: "Spree::TaxCategory"
|
7
7
|
|
@@ -78,7 +78,7 @@ module Spree
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def sufficient_stock?
|
81
|
-
Stock::Quantifier.new(
|
81
|
+
Stock::Quantifier.new(variant).can_supply? quantity
|
82
82
|
end
|
83
83
|
|
84
84
|
def insufficient_stock?
|
data/app/models/spree/order.rb
CHANGED
@@ -48,6 +48,8 @@ module Spree
|
|
48
48
|
has_many :line_item_adjustments, through: :line_items, source: :adjustments
|
49
49
|
has_many :shipment_adjustments, through: :shipments, source: :adjustments
|
50
50
|
has_many :inventory_units, inverse_of: :order
|
51
|
+
has_many :products, through: :variants
|
52
|
+
has_many :variants, through: :line_items
|
51
53
|
|
52
54
|
has_and_belongs_to_many :promotions, join_table: 'spree_orders_promotions'
|
53
55
|
|
@@ -87,8 +89,12 @@ module Spree
|
|
87
89
|
where(number: number)
|
88
90
|
end
|
89
91
|
|
92
|
+
scope :created_between, ->(start_date, end_date) { where(created_at: start_date..end_date) }
|
93
|
+
scope :completed_between, ->(start_date, end_date) { where(completed_at: start_date..end_date) }
|
94
|
+
|
90
95
|
def self.between(start_date, end_date)
|
91
|
-
|
96
|
+
ActiveSupport::Deprecation.warn("Order#between will be deprecated in Spree 2.3, please use either Order#created_between or Order#completed_between instead.")
|
97
|
+
self.created_between(start_date, end_date)
|
92
98
|
end
|
93
99
|
|
94
100
|
def self.by_customer(customer)
|
@@ -114,7 +120,8 @@ module Spree
|
|
114
120
|
end
|
115
121
|
|
116
122
|
def all_adjustments
|
117
|
-
Adjustment.where("order_id = :order_id OR adjustable_id = :order_id
|
123
|
+
Adjustment.where("order_id = :order_id OR (adjustable_id = :order_id AND adjustable_type = 'Spree::Order')",
|
124
|
+
:order_id => self.id)
|
118
125
|
end
|
119
126
|
|
120
127
|
# For compatiblity with Calculator::PriceSack
|
@@ -146,6 +153,10 @@ module Spree
|
|
146
153
|
Spree::Money.new(additional_tax_total, { currency: currency })
|
147
154
|
end
|
148
155
|
|
156
|
+
def display_tax_total
|
157
|
+
Spree::Money.new(included_tax_total + additional_tax_total, { currency: currency })
|
158
|
+
end
|
159
|
+
|
149
160
|
def display_shipment_total
|
150
161
|
Spree::Money.new(shipment_total, { currency: currency })
|
151
162
|
end
|
@@ -197,7 +208,7 @@ module Spree
|
|
197
208
|
# Returns the relevant zone (if any) to be used for taxation purposes.
|
198
209
|
# Uses default tax zone unless there is a specific match
|
199
210
|
def tax_zone
|
200
|
-
Zone.match(tax_address) || Zone.default_tax
|
211
|
+
@tax_zone ||= Zone.match(tax_address) || Zone.default_tax
|
201
212
|
end
|
202
213
|
|
203
214
|
# Indicates whether tax should be backed out of the price calcualtions in
|
@@ -205,7 +216,7 @@ module Spree
|
|
205
216
|
# taxes in that case.
|
206
217
|
def exclude_tax?
|
207
218
|
return false unless Spree::Config[:prices_inc_tax]
|
208
|
-
|
219
|
+
tax_zone != Zone.default_tax
|
209
220
|
end
|
210
221
|
|
211
222
|
# Returns the address for taxation based on configuration
|
@@ -244,14 +255,16 @@ module Spree
|
|
244
255
|
end
|
245
256
|
|
246
257
|
# Associates the specified user with the order.
|
247
|
-
def associate_user!(user)
|
258
|
+
def associate_user!(user, override_email = true)
|
248
259
|
self.user = user
|
249
|
-
|
250
|
-
|
260
|
+
attrs_to_set = { user_id: user.id }
|
261
|
+
attrs_to_set[:email] = user.email if override_email
|
262
|
+
attrs_to_set[:created_by_id] = user.id if self.created_by.blank?
|
263
|
+
assign_attributes(attrs_to_set)
|
251
264
|
|
252
265
|
if persisted?
|
253
266
|
# immediately persist the changes we just made, but don't use save since we might have an invalid address associated
|
254
|
-
self.class.unscoped.where(id: id).update_all(
|
267
|
+
self.class.unscoped.where(id: id).update_all(attrs_to_set)
|
255
268
|
end
|
256
269
|
end
|
257
270
|
|
@@ -395,16 +408,8 @@ module Spree
|
|
395
408
|
bill_address.try(:lastname)
|
396
409
|
end
|
397
410
|
|
398
|
-
def products
|
399
|
-
line_items.map(&:product)
|
400
|
-
end
|
401
|
-
|
402
|
-
def variants
|
403
|
-
line_items.map(&:variant)
|
404
|
-
end
|
405
|
-
|
406
411
|
def insufficient_stock_lines
|
407
|
-
|
412
|
+
line_items.select(&:insufficient_stock?)
|
408
413
|
end
|
409
414
|
|
410
415
|
def merge!(order, user = nil)
|
@@ -422,6 +427,10 @@ module Spree
|
|
422
427
|
|
423
428
|
self.associate_user!(user) if !self.user && !user.blank?
|
424
429
|
|
430
|
+
updater.update_item_count
|
431
|
+
updater.update_item_total
|
432
|
+
updater.persist_totals
|
433
|
+
|
425
434
|
# So that the destroy doesn't take out line items which may have been re-assigned
|
426
435
|
order.line_items.reload
|
427
436
|
order.destroy
|
@@ -429,6 +438,8 @@ module Spree
|
|
429
438
|
|
430
439
|
def empty!
|
431
440
|
line_items.destroy_all
|
441
|
+
updater.update_item_count
|
442
|
+
|
432
443
|
adjustments.destroy_all
|
433
444
|
update_totals
|
434
445
|
persist_totals
|
@@ -575,6 +586,11 @@ module Spree
|
|
575
586
|
self.ensure_updated_shipments
|
576
587
|
end
|
577
588
|
|
589
|
+
def reload
|
590
|
+
remove_instance_variable(:@tax_zone) if defined?(@tax_zone)
|
591
|
+
super
|
592
|
+
end
|
593
|
+
|
578
594
|
private
|
579
595
|
|
580
596
|
def link_by_email
|
@@ -583,7 +599,7 @@ module Spree
|
|
583
599
|
|
584
600
|
# Determine if email is required (we don't want validation errors before we hit the checkout)
|
585
601
|
def require_email
|
586
|
-
|
602
|
+
true unless new_record? or ['cart', 'address'].include?(state)
|
587
603
|
end
|
588
604
|
|
589
605
|
def ensure_line_items_present
|
@@ -607,7 +623,7 @@ module Spree
|
|
607
623
|
|
608
624
|
def after_cancel
|
609
625
|
shipments.each { |shipment| shipment.cancel! }
|
610
|
-
payments.completed.each { |payment| payment.
|
626
|
+
payments.completed.each { |payment| payment.cancel! }
|
611
627
|
|
612
628
|
send_cancel_email
|
613
629
|
self.update_column(:payment_state, 'credit_owed') unless shipped?
|
@@ -38,7 +38,7 @@ module Spree
|
|
38
38
|
# To avoid multiple occurrences of the same transition being defined
|
39
39
|
# On first definition, state_machines will not be defined
|
40
40
|
state_machines.clear if respond_to?(:state_machines)
|
41
|
-
state_machine :state, :initial => :cart do
|
41
|
+
state_machine :state, :initial => :cart, :use_transactions => false, :action => :save_state do
|
42
42
|
klass.next_event_transitions.each { |t| transition(t.merge(:on => :next)) }
|
43
43
|
|
44
44
|
# Persist the state on the order
|
@@ -101,6 +101,8 @@ module Spree
|
|
101
101
|
order.persist_totals
|
102
102
|
end
|
103
103
|
end
|
104
|
+
|
105
|
+
alias_method :save_state, :save
|
104
106
|
end
|
105
107
|
|
106
108
|
def self.go_to_state(name, options={})
|
@@ -149,9 +149,15 @@ module Spree
|
|
149
149
|
elsif payments.last.state == 'checkout'
|
150
150
|
order.payment_state = 'pending'
|
151
151
|
elsif payments.last.state == 'completed'
|
152
|
-
|
153
|
-
|
152
|
+
if line_items.empty?
|
153
|
+
order.payment_state = 'credit_owed'
|
154
|
+
else
|
155
|
+
order.payment_state = 'balance_due'
|
156
|
+
end
|
157
|
+
elsif payments.last.state == 'pending'
|
154
158
|
order.payment_state = 'balance_due'
|
159
|
+
else
|
160
|
+
order.payment_state = 'credit_owed'
|
155
161
|
end
|
156
162
|
else
|
157
163
|
order.payment_state = 'balance_due'
|
data/app/models/spree/payment.rb
CHANGED
@@ -113,8 +113,8 @@ module Spree
|
|
113
113
|
|
114
114
|
# see https://github.com/spree/spree/issues/981
|
115
115
|
def build_source
|
116
|
-
return
|
117
|
-
if
|
116
|
+
return unless new_record?
|
117
|
+
if source_attributes.present? && source.blank? && payment_method.try(:payment_source_class)
|
118
118
|
self.source = payment_method.payment_source_class.new(source_attributes)
|
119
119
|
self.source.payment_method_id = payment_method.id
|
120
120
|
self.source.user_id = self.order.user_id if self.order
|
@@ -111,6 +111,14 @@ module Spree
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
+
def cancel!
|
115
|
+
if payment_method.respond_to?(:cancel)
|
116
|
+
payment_method.cancel(response_code)
|
117
|
+
else
|
118
|
+
credit!
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
114
122
|
def partial_credit(amount)
|
115
123
|
return if amount > credit_allowed
|
116
124
|
started_processing!
|
@@ -118,6 +126,7 @@ module Spree
|
|
118
126
|
end
|
119
127
|
|
120
128
|
def gateway_options
|
129
|
+
order.reload
|
121
130
|
options = { :email => order.email,
|
122
131
|
:customer => order.email,
|
123
132
|
:customer_id => order.user_id,
|
@@ -54,6 +54,12 @@ module Spree
|
|
54
54
|
true
|
55
55
|
end
|
56
56
|
|
57
|
+
# Custom gateways should redefine this method. See Gateway implementation
|
58
|
+
# as an example
|
59
|
+
def reusable_sources(order)
|
60
|
+
[]
|
61
|
+
end
|
62
|
+
|
57
63
|
def auto_capture?
|
58
64
|
self.auto_capture.nil? ? Spree::Config[:auto_capture] : self.auto_capture
|
59
65
|
end
|
data/app/models/spree/price.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
class Price < ActiveRecord::Base
|
3
3
|
acts_as_paranoid
|
4
|
-
belongs_to :variant, class_name: 'Spree::Variant', inverse_of: :prices
|
4
|
+
belongs_to :variant, class_name: 'Spree::Variant', inverse_of: :prices, touch: true
|
5
5
|
|
6
6
|
validate :check_price
|
7
7
|
validates :amount, numericality: { greater_than_or_equal_to: 0 }, allow_nil: true
|
@@ -29,6 +29,7 @@ module Spree
|
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|
32
|
+
|
32
33
|
def check_price
|
33
34
|
raise "Price must belong to a variant" if variant.nil?
|
34
35
|
|
@@ -51,4 +52,3 @@ module Spree
|
|
51
52
|
|
52
53
|
end
|
53
54
|
end
|
54
|
-
|
data/app/models/spree/product.rb
CHANGED
@@ -201,7 +201,7 @@ module Spree
|
|
201
201
|
if self.variants_including_master.any? { |v| !v.should_track_inventory? }
|
202
202
|
Float::INFINITY
|
203
203
|
else
|
204
|
-
self.stock_items.sum(&:count_on_hand)
|
204
|
+
self.stock_items.to_a.sum(&:count_on_hand)
|
205
205
|
end
|
206
206
|
end
|
207
207
|
|
@@ -257,8 +257,13 @@ module Spree
|
|
257
257
|
self.master ||= Variant.new
|
258
258
|
end
|
259
259
|
|
260
|
+
# Iterate through this products taxons and taxonomies and touch their timestamps in a batch
|
260
261
|
def touch_taxons
|
261
|
-
|
262
|
+
taxons_to_touch = taxons.map(&:self_and_ancestors).flatten.uniq
|
263
|
+
Spree::Taxon.where(id: taxons_to_touch.map(&:id)).update_all(updated_at: Time.current)
|
264
|
+
|
265
|
+
taxonomy_ids_to_touch = taxons_to_touch.map(&:taxonomy_id).flatten.uniq
|
266
|
+
Spree::Taxonomy.where(id: taxonomy_ids_to_touch).update_all(updated_at: Time.current)
|
262
267
|
end
|
263
268
|
end
|
264
269
|
end
|