spree_core 2.2.4 → 2.2.5
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/spree/credit_card.rb +7 -3
- data/app/models/spree/inventory_unit.rb +1 -0
- data/app/models/spree/item_adjustments.rb +3 -2
- data/app/models/spree/line_item.rb +1 -1
- data/app/models/spree/order.rb +24 -16
- data/app/models/spree/order/checkout.rb +6 -3
- data/app/models/spree/order_contents.rb +3 -6
- data/app/models/spree/order_populator.rb +1 -1
- data/app/models/spree/order_updater.rb +12 -1
- data/app/models/spree/payment/processing.rb +5 -1
- data/app/models/spree/product.rb +78 -54
- data/app/models/spree/promotion/actions/create_adjustment.rb +2 -11
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +2 -19
- data/app/models/spree/promotion_handler/cart.rb +14 -2
- data/app/models/spree/promotion_handler/coupon.rb +8 -2
- data/app/models/spree/return_authorization.rb +2 -2
- data/app/models/spree/shipment.rb +30 -0
- data/app/models/spree/shipping_rate.rb +2 -2
- data/app/models/spree/stock/availability_validator.rb +3 -7
- data/app/models/spree/stock/package.rb +1 -0
- data/app/models/spree/stock_item.rb +6 -1
- data/app/models/spree/stock_location.rb +4 -0
- data/app/models/spree/tax_rate.rb +15 -2
- data/app/models/spree/variant.rb +5 -1
- data/config/locales/en.yml +6 -0
- data/db/default/spree/countries.rb +2 -1
- data/db/migrate/20130807024302_rename_adjustment_fields.rb +2 -5
- data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +10 -0
- data/lib/generators/spree/install/install_generator.rb +8 -0
- data/lib/spree/core.rb +1 -0
- data/lib/spree/core/adjustment_source.rb +26 -0
- data/lib/spree/core/controller_helpers/order.rb +1 -1
- data/lib/spree/core/importer/order.rb +15 -8
- data/lib/spree/core/version.rb +1 -1
- metadata +34 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88ab16ad8f605d308074b823d9a7c70f6504bb08
|
4
|
+
data.tar.gz: 6bcb7afca77e7006f6eb12e4ba1177b66bd3a585
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91fa2acf65367622c4d6d526beb7d696dad6b2a143ee03a376c4045741620840c60b01f749feb8e771ca9fd618695872b37498d08369c35052c6b1d10cc2c176
|
7
|
+
data.tar.gz: 8e1596b38affe2af7d32a8dfefceea76e9626ad4b1540bf8ba3655d0d787fc6834544476ebfc0f7529413aac35ac132690574a6fbeb6afc83d333df7d7f253fa
|
@@ -118,7 +118,7 @@ module Spree
|
|
118
118
|
countries.collect do |country|
|
119
119
|
country.name = Spree.t(country.iso, scope: 'country_names', default: country.name)
|
120
120
|
country
|
121
|
-
end.
|
121
|
+
end.sort_by { |c| c.name.parameterize }
|
122
122
|
end
|
123
123
|
|
124
124
|
def seo_url(taxon)
|
@@ -132,9 +132,13 @@ module Spree
|
|
132
132
|
|
133
133
|
def expiry_not_in_the_past
|
134
134
|
if year.present? && month.present?
|
135
|
-
|
136
|
-
|
137
|
-
|
135
|
+
if month.to_i < 1 || month.to_i > 12
|
136
|
+
errors.add(:base, :expiry_invalid)
|
137
|
+
else
|
138
|
+
time = Time.zone.parse("#{year}-#{month}-1")
|
139
|
+
if time < Time.zone.now.to_time.beginning_of_month
|
140
|
+
errors.add(:base, :card_expired)
|
141
|
+
end
|
138
142
|
end
|
139
143
|
end
|
140
144
|
end
|
@@ -47,8 +47,9 @@ module Spree
|
|
47
47
|
included_tax_total = 0
|
48
48
|
additional_tax_total = 0
|
49
49
|
run_callbacks :tax_adjustments do
|
50
|
-
|
51
|
-
|
50
|
+
tax = (item.respond_to?(:all_adjustments) ? item.all_adjustments : item.adjustments).tax
|
51
|
+
included_tax_total = tax.included.reload.map(&:update!).compact.sum
|
52
|
+
additional_tax_total = tax.additional.reload.map(&:update!).compact.sum
|
52
53
|
end
|
53
54
|
|
54
55
|
item.update_columns(
|
data/app/models/spree/order.rb
CHANGED
@@ -3,16 +3,13 @@ require 'spree/order/checkout'
|
|
3
3
|
|
4
4
|
module Spree
|
5
5
|
class Order < ActiveRecord::Base
|
6
|
-
include Checkout
|
7
|
-
include CurrencyUpdater
|
6
|
+
include Spree::Order::Checkout
|
7
|
+
include Spree::Order::CurrencyUpdater
|
8
8
|
|
9
9
|
checkout_flow do
|
10
10
|
go_to_state :address
|
11
11
|
go_to_state :delivery
|
12
|
-
go_to_state :payment, if: ->(order)
|
13
|
-
order.set_shipments_cost if order.shipments.any?
|
14
|
-
order.payment_required?
|
15
|
-
end
|
12
|
+
go_to_state :payment, if: ->(order) { order.payment_required? }
|
16
13
|
go_to_state :confirm, if: ->(order) { order.confirmation_required? }
|
17
14
|
go_to_state :complete
|
18
15
|
remove_transition from: :delivery, to: :confirm
|
@@ -76,6 +73,7 @@ module Spree
|
|
76
73
|
|
77
74
|
validates :email, presence: true, if: :require_email
|
78
75
|
validates :email, email: true, if: :require_email, allow_blank: true
|
76
|
+
validates :number, uniqueness: true
|
79
77
|
validate :has_available_shipment
|
80
78
|
|
81
79
|
make_permalink field: :number
|
@@ -91,6 +89,7 @@ module Spree
|
|
91
89
|
|
92
90
|
scope :created_between, ->(start_date, end_date) { where(created_at: start_date..end_date) }
|
93
91
|
scope :completed_between, ->(start_date, end_date) { where(completed_at: start_date..end_date) }
|
92
|
+
scope :reverse_chronological, -> { order(created_at: :desc) }
|
94
93
|
|
95
94
|
def self.between(start_date, end_date)
|
96
95
|
ActiveSupport::Deprecation.warn("Order#between will be deprecated in Spree 2.3, please use either Order#created_between or Order#completed_between instead.")
|
@@ -268,15 +267,18 @@ module Spree
|
|
268
267
|
end
|
269
268
|
end
|
270
269
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
270
|
+
def generate_order_number(digits = 9)
|
271
|
+
self.number ||= loop do
|
272
|
+
# Make a random number.
|
273
|
+
random = "R#{Array.new(digits){rand(10)}.join}"
|
274
|
+
# Use the random number if no other order exists with it.
|
275
|
+
if self.class.exists?(number: random)
|
276
|
+
# If over half of all possible options are taken add another digit.
|
277
|
+
digits += 1 if self.class.count > (10 ** digits / 2)
|
278
|
+
else
|
279
|
+
break random
|
280
|
+
end
|
281
|
+
end
|
280
282
|
end
|
281
283
|
|
282
284
|
def shipped_shipments
|
@@ -412,6 +414,12 @@ module Spree
|
|
412
414
|
line_items.select(&:insufficient_stock?)
|
413
415
|
end
|
414
416
|
|
417
|
+
def ensure_line_items_are_in_stock
|
418
|
+
if insufficient_stock_lines.present?
|
419
|
+
errors.add(:base, Spree.t(:insufficient_stock_lines_present)) and return false
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
415
423
|
def merge!(order, user = nil)
|
416
424
|
order.line_items.each do |line_item|
|
417
425
|
next unless line_item.currency == currency
|
@@ -582,7 +590,7 @@ module Spree
|
|
582
590
|
self.ensure_updated_shipments
|
583
591
|
end
|
584
592
|
|
585
|
-
def reload
|
593
|
+
def reload(options=nil)
|
586
594
|
remove_instance_variable(:@tax_zone) if defined?(@tax_zone)
|
587
595
|
super
|
588
596
|
end
|
@@ -92,9 +92,11 @@ module Spree
|
|
92
92
|
before_transition :from => :delivery, :do => :apply_free_shipping_promotions
|
93
93
|
end
|
94
94
|
|
95
|
-
|
96
|
-
|
97
|
-
after_transition :
|
95
|
+
before_transition to: :resumed, do: :ensure_line_items_are_in_stock
|
96
|
+
|
97
|
+
after_transition to: :complete, do: :finalize!
|
98
|
+
after_transition to: :resumed, do: :after_resume
|
99
|
+
after_transition to: :canceled, do: :after_cancel
|
98
100
|
|
99
101
|
after_transition :from => any - :cart, :to => any - [:confirm, :complete] do |order|
|
100
102
|
order.update_totals
|
@@ -230,6 +232,7 @@ module Spree
|
|
230
232
|
end
|
231
233
|
|
232
234
|
success = self.update_attributes(attributes)
|
235
|
+
set_shipments_cost if self.shipments.any?
|
233
236
|
end
|
234
237
|
@updating_params = nil
|
235
238
|
success
|
@@ -9,6 +9,7 @@ module Spree
|
|
9
9
|
def add(variant, quantity = 1, currency = nil, shipment = nil)
|
10
10
|
line_item = add_to_line_item(variant, quantity, currency, shipment)
|
11
11
|
reload_totals
|
12
|
+
shipment.present? ? shipment.update_amounts : order.ensure_updated_shipments
|
12
13
|
PromotionHandler::Cart.new(order, line_item).activate
|
13
14
|
ItemAdjustments.new(line_item).update
|
14
15
|
reload_totals
|
@@ -18,6 +19,7 @@ module Spree
|
|
18
19
|
def remove(variant, quantity = 1, shipment = nil)
|
19
20
|
line_item = remove_from_line_item(variant, quantity, shipment)
|
20
21
|
reload_totals
|
22
|
+
shipment.present? ? shipment.update_amounts : order.ensure_updated_shipments
|
21
23
|
PromotionHandler::Cart.new(order, line_item).activate
|
22
24
|
ItemAdjustments.new(line_item).update
|
23
25
|
reload_totals
|
@@ -47,12 +49,7 @@ module Spree
|
|
47
49
|
|
48
50
|
def reload_totals
|
49
51
|
order_updater.update_item_count
|
50
|
-
order_updater.
|
51
|
-
order_updater.update_adjustment_total
|
52
|
-
|
53
|
-
order_updater.update_payment_state if order.completed?
|
54
|
-
order_updater.persist_totals
|
55
|
-
|
52
|
+
order_updater.update
|
56
53
|
order.reload
|
57
54
|
end
|
58
55
|
|
@@ -38,6 +38,7 @@ module Spree
|
|
38
38
|
# +payment_total+ The total value of all finalized Payments (NOTE: non-finalized Payments are excluded)
|
39
39
|
# +item_total+ The total value of all LineItems
|
40
40
|
# +adjustment_total+ The total value of all adjustments (promotions, credits, etc.)
|
41
|
+
# +promo_total+ The total value of all promotion adjustments
|
41
42
|
# +total+ The so-called "order total." This is equivalent to +item_total+ plus +adjustment_total+.
|
42
43
|
def update_totals
|
43
44
|
order.payment_total = payments.completed.sum(:amount)
|
@@ -49,7 +50,12 @@ module Spree
|
|
49
50
|
|
50
51
|
# give each of the shipments a chance to update themselves
|
51
52
|
def update_shipments
|
52
|
-
shipments.each
|
53
|
+
shipments.each do |shipment|
|
54
|
+
next unless shipment.persisted?
|
55
|
+
shipment.update!(order)
|
56
|
+
shipment.refresh_rates
|
57
|
+
shipment.update_amounts
|
58
|
+
end
|
53
59
|
end
|
54
60
|
|
55
61
|
def update_shipment_total
|
@@ -69,6 +75,10 @@ module Spree
|
|
69
75
|
order.included_tax_total = line_items.sum(:included_tax_total) + shipments.sum(:included_tax_total)
|
70
76
|
order.additional_tax_total = line_items.sum(:additional_tax_total) + shipments.sum(:additional_tax_total)
|
71
77
|
|
78
|
+
order.promo_total = line_items.sum(:promo_total) +
|
79
|
+
shipments.sum(:promo_total) +
|
80
|
+
adjustments.promotion.eligible.sum(:amount)
|
81
|
+
|
72
82
|
update_order_total
|
73
83
|
end
|
74
84
|
|
@@ -92,6 +102,7 @@ module Spree
|
|
92
102
|
additional_tax_total: order.additional_tax_total,
|
93
103
|
payment_total: order.payment_total,
|
94
104
|
shipment_total: order.shipment_total,
|
105
|
+
promo_total: order.promo_total,
|
95
106
|
total: order.total,
|
96
107
|
updated_at: Time.now,
|
97
108
|
)
|
@@ -5,7 +5,7 @@ module Spree
|
|
5
5
|
if payment_method && payment_method.source_required?
|
6
6
|
if source
|
7
7
|
if !processing?
|
8
|
-
if payment_method.supports?(source)
|
8
|
+
if payment_method.supports?(source) || token_based?
|
9
9
|
if payment_method.auto_capture?
|
10
10
|
purchase!
|
11
11
|
else
|
@@ -219,6 +219,10 @@ module Spree
|
|
219
219
|
def gateway_order_id
|
220
220
|
"#{order.number}-#{self.identifier}"
|
221
221
|
end
|
222
|
+
|
223
|
+
def token_based?
|
224
|
+
source.gateway_customer_profile_id.present? || source.gateway_payment_profile_id.present?
|
225
|
+
end
|
222
226
|
end
|
223
227
|
end
|
224
228
|
end
|
data/app/models/spree/product.rb
CHANGED
@@ -65,7 +65,8 @@ module Spree
|
|
65
65
|
after_create :add_properties_and_option_types_from_prototype
|
66
66
|
after_create :build_variants_from_option_values_hash, if: :option_values_hash
|
67
67
|
after_save :save_master
|
68
|
-
after_save :
|
68
|
+
after_save :run_touch_callbacks, if: :anything_changed?
|
69
|
+
after_save :reset_nested_changes
|
69
70
|
after_touch :touch_taxons
|
70
71
|
|
71
72
|
delegate :images, to: :master, prefix: true
|
@@ -201,10 +202,10 @@ module Spree
|
|
201
202
|
end
|
202
203
|
|
203
204
|
def total_on_hand
|
204
|
-
if
|
205
|
+
if any_variants_not_track_inventory?
|
205
206
|
Float::INFINITY
|
206
207
|
else
|
207
|
-
|
208
|
+
stock_items.sum(:count_on_hand)
|
208
209
|
end
|
209
210
|
end
|
210
211
|
|
@@ -217,70 +218,93 @@ module Spree
|
|
217
218
|
|
218
219
|
private
|
219
220
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
# Builds variants from a hash of option types & values
|
225
|
-
def build_variants_from_option_values_hash
|
226
|
-
ensure_option_types_exist_for_values_hash
|
227
|
-
values = option_values_hash.values
|
228
|
-
values = values.inject(values.shift) { |memo, value| memo.product(value).map(&:flatten) }
|
229
|
-
|
230
|
-
values.each do |ids|
|
231
|
-
variant = variants.create(
|
232
|
-
option_value_ids: ids,
|
233
|
-
price: master.price
|
234
|
-
)
|
221
|
+
def add_properties_and_option_types_from_prototype
|
222
|
+
if prototype_id && prototype = Spree::Prototype.find_by(id: prototype_id)
|
223
|
+
prototype.properties.each do |property|
|
224
|
+
product_properties.create(property: property)
|
235
225
|
end
|
236
|
-
|
226
|
+
self.option_types = prototype.option_types
|
237
227
|
end
|
228
|
+
end
|
238
229
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
self.option_types = prototype.option_types
|
245
|
-
end
|
230
|
+
def any_variants_not_track_inventory?
|
231
|
+
if variants_including_master.loaded?
|
232
|
+
variants_including_master.any? { |v| !v.should_track_inventory? }
|
233
|
+
else
|
234
|
+
!Spree::Config.track_inventory_levels || variants_including_master.where(track_inventory: false).any?
|
246
235
|
end
|
236
|
+
end
|
247
237
|
|
248
|
-
|
249
|
-
|
250
|
-
|
238
|
+
# Builds variants from a hash of option types & values
|
239
|
+
def build_variants_from_option_values_hash
|
240
|
+
ensure_option_types_exist_for_values_hash
|
241
|
+
values = option_values_hash.values
|
242
|
+
values = values.inject(values.shift) { |memo, value| memo.product(value).map(&:flatten) }
|
243
|
+
|
244
|
+
values.each do |ids|
|
245
|
+
variant = variants.create(
|
246
|
+
option_value_ids: ids,
|
247
|
+
price: master.price
|
248
|
+
)
|
251
249
|
end
|
250
|
+
save
|
251
|
+
end
|
252
252
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
end
|
253
|
+
def ensure_master
|
254
|
+
return unless new_record?
|
255
|
+
self.master ||= Variant.new
|
256
|
+
end
|
258
257
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
end
|
258
|
+
def normalize_slug
|
259
|
+
self.slug = normalize_friendly_id(slug)
|
260
|
+
end
|
263
261
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
Spree::Taxon.where(id: taxons_to_touch.map(&:id)).update_all(updated_at: Time.current)
|
262
|
+
def punch_slug
|
263
|
+
update_column :slug, "#{Time.now.to_i}_#{slug}" # punch slug with date prefix to allow reuse of original
|
264
|
+
end
|
268
265
|
|
269
|
-
|
270
|
-
|
271
|
-
|
266
|
+
def anything_changed?
|
267
|
+
changed? || @nested_changes
|
268
|
+
end
|
272
269
|
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
:name,
|
277
|
-
[:name, :sku]
|
278
|
-
]
|
279
|
-
end
|
270
|
+
def reset_nested_changes
|
271
|
+
@nested_changes = false
|
272
|
+
end
|
280
273
|
|
281
|
-
|
282
|
-
|
274
|
+
# there's a weird quirk with the delegate stuff that does not automatically save the delegate object
|
275
|
+
# when saving so we force a save using a hook.
|
276
|
+
def save_master
|
277
|
+
if master && (master.changed? || master.new_record? || (master.default_price && (master.default_price.changed? || master.default_price.new_record?)))
|
278
|
+
master.save
|
279
|
+
@nested_changes = true
|
283
280
|
end
|
281
|
+
end
|
282
|
+
|
283
|
+
# ensures the master variant is flagged as such
|
284
|
+
def set_master_variant_defaults
|
285
|
+
master.is_master = true
|
286
|
+
end
|
287
|
+
|
288
|
+
# Try building a slug based on the following fields in increasing order of specificity.
|
289
|
+
def slug_candidates
|
290
|
+
[
|
291
|
+
:name,
|
292
|
+
[:name, :sku]
|
293
|
+
]
|
294
|
+
end
|
295
|
+
|
296
|
+
def run_touch_callbacks
|
297
|
+
run_callbacks(:touch)
|
298
|
+
end
|
299
|
+
|
300
|
+
# Iterate through this products taxons and taxonomies and touch their timestamps in a batch
|
301
|
+
def touch_taxons
|
302
|
+
taxons_to_touch = taxons.map(&:self_and_ancestors).flatten.uniq
|
303
|
+
Spree::Taxon.where(id: taxons_to_touch.map(&:id)).update_all(updated_at: Time.current)
|
304
|
+
|
305
|
+
taxonomy_ids_to_touch = taxons_to_touch.map(&:taxonomy_id).flatten.uniq
|
306
|
+
Spree::Taxonomy.where(id: taxonomy_ids_to_touch).update_all(updated_at: Time.current)
|
307
|
+
end
|
284
308
|
|
285
309
|
end
|
286
310
|
end
|
@@ -3,13 +3,14 @@ module Spree
|
|
3
3
|
module Actions
|
4
4
|
class CreateAdjustment < PromotionAction
|
5
5
|
include Spree::Core::CalculatedAdjustments
|
6
|
+
include Spree::Core::AdjustmentSource
|
6
7
|
|
7
8
|
has_many :adjustments, as: :source
|
8
9
|
|
9
10
|
delegate :eligible?, to: :promotion
|
10
11
|
|
11
12
|
before_validation :ensure_action_has_calculator
|
12
|
-
before_destroy :
|
13
|
+
before_destroy :deals_with_adjustments_for_deleted_source
|
13
14
|
|
14
15
|
# Creates the adjustment related to a promotion for the order passed
|
15
16
|
# through options hash
|
@@ -55,16 +56,6 @@ module Spree
|
|
55
56
|
self.calculator = Calculator::FlatPercentItemTotal.new
|
56
57
|
end
|
57
58
|
|
58
|
-
def deals_with_adjustments
|
59
|
-
adjustment_scope = self.adjustments.joins("LEFT OUTER JOIN spree_orders ON spree_orders.id = spree_adjustments.adjustable_id")
|
60
|
-
# For incomplete orders, remove the adjustment completely.
|
61
|
-
adjustment_scope.where("spree_orders.completed_at IS NULL").readonly(false).destroy_all
|
62
|
-
|
63
|
-
# For complete orders, the source will be invalid.
|
64
|
-
# Therefore we nullify the source_id, leaving the adjustment in place.
|
65
|
-
# This would mean that the order's total is not altered at all.
|
66
|
-
adjustment_scope.where("spree_orders.completed_at IS NOT NULL").update_all("source_id = NULL")
|
67
|
-
end
|
68
59
|
end
|
69
60
|
end
|
70
61
|
end
|
@@ -3,13 +3,14 @@ module Spree
|
|
3
3
|
module Actions
|
4
4
|
class CreateItemAdjustments < PromotionAction
|
5
5
|
include Spree::Core::CalculatedAdjustments
|
6
|
+
include Spree::Core::AdjustmentSource
|
6
7
|
|
7
8
|
has_many :adjustments, as: :source
|
8
9
|
|
9
10
|
delegate :eligible?, to: :promotion
|
10
11
|
|
11
12
|
before_validation :ensure_action_has_calculator
|
12
|
-
before_destroy :
|
13
|
+
before_destroy :deals_with_adjustments_for_deleted_source
|
13
14
|
|
14
15
|
def perform(payload = {})
|
15
16
|
order = payload[:order]
|
@@ -62,24 +63,6 @@ module Spree
|
|
62
63
|
self.calculator = Calculator::PercentOnLineItem.new
|
63
64
|
end
|
64
65
|
|
65
|
-
def deals_with_adjustments
|
66
|
-
adjustment_scope = self.adjustments.includes(:order).references(:spree_orders)
|
67
|
-
|
68
|
-
# For incomplete orders, remove the adjustment completely.
|
69
|
-
adjustment_scope.where("spree_orders.completed_at IS NULL").each do |adjustment|
|
70
|
-
adjustment.destroy
|
71
|
-
end
|
72
|
-
|
73
|
-
# For complete orders, the source will be invalid.
|
74
|
-
# Therefore we nullify the source_id, leaving the adjustment in place.
|
75
|
-
# This would mean that the order's total is not altered at all.
|
76
|
-
adjustment_scope.where("spree_orders.completed_at IS NOT NULL").each do |adjustment|
|
77
|
-
adjustment.update_columns(
|
78
|
-
source_id: nil,
|
79
|
-
updated_at: Time.now,
|
80
|
-
)
|
81
|
-
end
|
82
|
-
end
|
83
66
|
end
|
84
67
|
end
|
85
68
|
end
|
@@ -29,9 +29,21 @@ module Spree
|
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|
32
|
-
|
33
32
|
def promotions
|
34
|
-
Promotion.
|
33
|
+
promo_table = Promotion.arel_table
|
34
|
+
join_table = Arel::Table.new(:spree_orders_promotions)
|
35
|
+
|
36
|
+
join_condition = promo_table.join(join_table, Arel::Nodes::OuterJoin).on(
|
37
|
+
promo_table[:id].eq(join_table[:promotion_id])
|
38
|
+
).join_sources
|
39
|
+
|
40
|
+
Promotion.active.includes(:promotion_rules).
|
41
|
+
joins(join_condition).
|
42
|
+
where(
|
43
|
+
promo_table[:code].eq(nil).and(
|
44
|
+
promo_table[:path].eq(nil)
|
45
|
+
).or(join_table[:order_id].eq(order.id))
|
46
|
+
).distinct
|
35
47
|
end
|
36
48
|
end
|
37
49
|
end
|
@@ -81,8 +81,14 @@ module Spree
|
|
81
81
|
order.persist_totals
|
82
82
|
self.success = Spree.t(:coupon_code_applied)
|
83
83
|
else
|
84
|
-
# if the promotion
|
85
|
-
|
84
|
+
# if the promotion exists on an order, but wasn't found above,
|
85
|
+
# we've already selected a better promotion
|
86
|
+
if order.promotions.with_coupon_code(order.coupon_code)
|
87
|
+
self.error = Spree.t(:coupon_code_better_exists)
|
88
|
+
else
|
89
|
+
# if the promotion was created after the order
|
90
|
+
self.error = Spree.t(:coupon_code_not_found)
|
91
|
+
end
|
86
92
|
end
|
87
93
|
end
|
88
94
|
end
|
@@ -2,7 +2,7 @@ module Spree
|
|
2
2
|
class ReturnAuthorization < ActiveRecord::Base
|
3
3
|
belongs_to :order, class_name: 'Spree::Order'
|
4
4
|
|
5
|
-
has_many :inventory_units
|
5
|
+
has_many :inventory_units, dependent: :nullify
|
6
6
|
belongs_to :stock_location
|
7
7
|
before_create :generate_number
|
8
8
|
before_save :force_positive_amount
|
@@ -62,7 +62,7 @@ module Spree
|
|
62
62
|
order.shipped_shipments.collect{|s| s.inventory_units.to_a}.flatten
|
63
63
|
end
|
64
64
|
|
65
|
-
# Used when Adjustment#update! wants to update the related
|
65
|
+
# Used when Adjustment#update! wants to update the related adjustment
|
66
66
|
def compute_amount(*args)
|
67
67
|
amount.abs * -1
|
68
68
|
end
|
@@ -287,6 +287,36 @@ module Spree
|
|
287
287
|
end
|
288
288
|
end
|
289
289
|
|
290
|
+
# Update Shipment and make sure Order states follow the shipment changes
|
291
|
+
def update_attributes_and_order(params = {})
|
292
|
+
if self.update_attributes params
|
293
|
+
if params.has_key? :selected_shipping_rate_id
|
294
|
+
# Changing the selected Shipping Rate won't update the cost (for now)
|
295
|
+
# so we persist the Shipment#cost before calculating order shipment
|
296
|
+
# total and updating payment state (given a change in shipment cost
|
297
|
+
# might change the Order#payment_state)
|
298
|
+
self.update_amounts
|
299
|
+
|
300
|
+
order.updater.update_shipment_total
|
301
|
+
order.updater.update_payment_state
|
302
|
+
|
303
|
+
# Update shipment state only after order total is updated because it
|
304
|
+
# (via Order#paid?) affects the shipment state (YAY)
|
305
|
+
self.update_columns(
|
306
|
+
state: determine_state(order),
|
307
|
+
updated_at: Time.now
|
308
|
+
)
|
309
|
+
|
310
|
+
# And then it's time to update shipment states and finally persist
|
311
|
+
# order changes
|
312
|
+
order.updater.update_shipment_state
|
313
|
+
order.updater.persist_totals
|
314
|
+
end
|
315
|
+
|
316
|
+
true
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
290
320
|
private
|
291
321
|
|
292
322
|
def manifest_unstock(item)
|
@@ -23,10 +23,10 @@ module Spree
|
|
23
23
|
if tax_rate.included_in_price?
|
24
24
|
if tax_amount > 0
|
25
25
|
amount = "#{display_tax_amount(tax_amount)} #{tax_rate.name}"
|
26
|
-
price += " (incl
|
26
|
+
price += " (#{Spree.t(:incl)} #{amount})"
|
27
27
|
else
|
28
28
|
amount = "#{display_tax_amount(tax_amount*-1)} #{tax_rate.name}"
|
29
|
-
price += " (excl
|
29
|
+
price += " (#{Spree.t(:excl)} #{amount})"
|
30
30
|
end
|
31
31
|
else
|
32
32
|
amount = "#{display_tax_amount(tax_amount)} #{tax_rate.name}"
|
@@ -2,13 +2,9 @@ module Spree
|
|
2
2
|
module Stock
|
3
3
|
class AvailabilityValidator < ActiveModel::Validator
|
4
4
|
def validate(line_item)
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
quantity = line_item.quantity - units.count
|
9
|
-
else
|
10
|
-
quantity = line_item.quantity
|
11
|
-
end
|
5
|
+
unit_count = line_item.inventory_units.size
|
6
|
+
return if unit_count >= line_item.quantity
|
7
|
+
quantity = line_item.quantity - unit_count
|
12
8
|
|
13
9
|
quantifier = Stock::Quantifier.new(line_item.variant)
|
14
10
|
|
@@ -8,10 +8,11 @@ module Spree
|
|
8
8
|
|
9
9
|
validates_presence_of :stock_location, :variant
|
10
10
|
validates_uniqueness_of :variant_id, scope: [:stock_location_id, :deleted_at]
|
11
|
+
validates :count_on_hand, numericality: { greater_than_or_equal_to: 0 }, if: :verify_count_on_hand?
|
11
12
|
|
12
13
|
delegate :weight, :should_track_inventory?, to: :variant
|
13
14
|
|
14
|
-
after_save :conditional_variant_touch
|
15
|
+
after_save :conditional_variant_touch, if: :changed?
|
15
16
|
after_touch { variant.touch }
|
16
17
|
|
17
18
|
def backordered_inventory_units
|
@@ -52,6 +53,10 @@ module Spree
|
|
52
53
|
end
|
53
54
|
|
54
55
|
private
|
56
|
+
def verify_count_on_hand?
|
57
|
+
count_on_hand_changed? && !backorderable? && (count_on_hand < count_on_hand_was) && (count_on_hand < 0)
|
58
|
+
end
|
59
|
+
|
55
60
|
def count_on_hand=(value)
|
56
61
|
write_attribute(:count_on_hand, value)
|
57
62
|
end
|
@@ -13,6 +13,10 @@ module Spree
|
|
13
13
|
|
14
14
|
after_create :create_stock_items, :if => "self.propagate_all_variants?"
|
15
15
|
|
16
|
+
def state_text
|
17
|
+
state.try(:abbr) || state.try(:name) || state_name
|
18
|
+
end
|
19
|
+
|
16
20
|
# Wrapper for creating a new stock item respecting the backorderable config
|
17
21
|
def propagate_variant(variant)
|
18
22
|
self.stock_items.create!(variant: variant, backorderable: self.backorderable_default)
|
@@ -12,15 +12,18 @@ module Spree
|
|
12
12
|
class TaxRate < ActiveRecord::Base
|
13
13
|
acts_as_paranoid
|
14
14
|
include Spree::Core::CalculatedAdjustments
|
15
|
+
include Spree::Core::AdjustmentSource
|
15
16
|
belongs_to :zone, class_name: "Spree::Zone"
|
16
17
|
belongs_to :tax_category, class_name: "Spree::TaxCategory"
|
17
18
|
|
18
|
-
has_many :adjustments, as: :source
|
19
|
+
has_many :adjustments, as: :source
|
19
20
|
|
20
21
|
validates :amount, presence: true, numericality: true
|
21
22
|
validates :tax_category_id, presence: true
|
22
23
|
validates_with DefaultTaxZoneValidator
|
23
24
|
|
25
|
+
before_destroy :deals_with_adjustments_for_deleted_source
|
26
|
+
|
24
27
|
scope :by_zone, ->(zone) { where(zone_id: zone) }
|
25
28
|
|
26
29
|
# Gets the array of TaxRates appropriate for the specified order
|
@@ -72,7 +75,7 @@ module Spree
|
|
72
75
|
def self.adjust(order, items)
|
73
76
|
rates = self.match(order)
|
74
77
|
tax_categories = rates.map(&:tax_category)
|
75
|
-
relevant_items = items.
|
78
|
+
relevant_items, non_relevant_items = items.partition { |item| tax_categories.include?(item.tax_category) }
|
76
79
|
relevant_items.each do |item|
|
77
80
|
item.adjustments.tax.delete_all
|
78
81
|
relevant_rates = rates.select { |rate| rate.tax_category == item.tax_category }
|
@@ -81,6 +84,13 @@ module Spree
|
|
81
84
|
rate.adjust(order, item)
|
82
85
|
end
|
83
86
|
end
|
87
|
+
non_relevant_items.each do |item|
|
88
|
+
if item.adjustments.tax.present?
|
89
|
+
item.adjustments.tax.delete_all
|
90
|
+
item.update_column(:pre_tax_amount, nil)
|
91
|
+
Spree::ItemAdjustments.new(item).update
|
92
|
+
end
|
93
|
+
end
|
84
94
|
end
|
85
95
|
|
86
96
|
# For Vat the default rate is the rate that is configured for the default category
|
@@ -191,6 +201,9 @@ module Spree
|
|
191
201
|
label = ""
|
192
202
|
label << (name.present? ? name : tax_category.name) + " "
|
193
203
|
label << (show_rate_in_label? ? "#{amount * 100}%" : "")
|
204
|
+
label << " (#{Spree.t(:included_in_price)})" if included_in_price?
|
205
|
+
label
|
194
206
|
end
|
207
|
+
|
195
208
|
end
|
196
209
|
end
|
data/app/models/spree/variant.rb
CHANGED
@@ -202,8 +202,12 @@ module Spree
|
|
202
202
|
end
|
203
203
|
end
|
204
204
|
|
205
|
+
def default_price_changed?
|
206
|
+
default_price && (default_price.changed? || default_price.new_record?)
|
207
|
+
end
|
208
|
+
|
205
209
|
def save_default_price
|
206
|
-
default_price.save if
|
210
|
+
default_price.save if default_price_changed?
|
207
211
|
end
|
208
212
|
|
209
213
|
def set_cost_currency
|
data/config/locales/en.yml
CHANGED
@@ -232,6 +232,7 @@ en:
|
|
232
232
|
attributes:
|
233
233
|
base:
|
234
234
|
card_expired: "Card has expired"
|
235
|
+
expiry_invalid: "Card expiration is invalid"
|
235
236
|
spree/line_item:
|
236
237
|
attributes:
|
237
238
|
currency:
|
@@ -404,6 +405,7 @@ en:
|
|
404
405
|
back_to_prototypes_list: Back To Prototypes List
|
405
406
|
back_to_reports_list: Back To Reports List
|
406
407
|
back_to_shipping_categories: Back To Shipping Categories
|
408
|
+
back_to_shipping_categories_list: Back To Shipping Categories List
|
407
409
|
back_to_shipping_methods_list: Back To Shipping Methods List
|
408
410
|
back_to_states_list: Back To States List
|
409
411
|
back_to_stock_locations_list: Back to Stock Locations List
|
@@ -449,6 +451,7 @@ en:
|
|
449
451
|
choose_dashboard_locale: Choose Dashboard Locale
|
450
452
|
choose_location: Choose location
|
451
453
|
city: City
|
454
|
+
click_and_drag_on_the_products_to_sort_them: 'Click & drag on the products to sort them.'
|
452
455
|
clone: Clone
|
453
456
|
close: Close
|
454
457
|
close_all_adjustments: Close All Adjustments
|
@@ -588,6 +591,7 @@ en:
|
|
588
591
|
signup: User signup
|
589
592
|
exceptions:
|
590
593
|
count_on_hand_setter: Cannot set count_on_hand manually, as it is set automatically by the recalculate_count_on_hand callback. Please use `update_column(:count_on_hand, value)` instead.
|
594
|
+
excl: excl.
|
591
595
|
expiration: Expiration
|
592
596
|
extension: Extension
|
593
597
|
existing_shipments: Existing shipments
|
@@ -637,10 +641,12 @@ en:
|
|
637
641
|
image: Image
|
638
642
|
images: Images
|
639
643
|
inactive: Inactive
|
644
|
+
incl: incl.
|
640
645
|
included_in_price: Included in Price
|
641
646
|
included_price_validation: cannot be selected unless you have set a Default Tax Zone
|
642
647
|
instructions_to_reset_password: Please enter your email on the form below
|
643
648
|
insufficient_stock: Insufficient stock available, only %{on_hand} remaining
|
649
|
+
insufficient_stock_lines_present: Some line items in this order have insufficient quantity.
|
644
650
|
intercept_email_address: Intercept Email Address
|
645
651
|
intercept_email_instructions: Override email recipient and replace with this address.
|
646
652
|
internal_name: Internal Name
|
@@ -226,6 +226,7 @@ Spree::Country.create!([
|
|
226
226
|
{ name: "New Zealand", iso3: "NZL", iso: "NZ", iso_name: "NEW ZEALAND", numcode: "554" },
|
227
227
|
{ name: "Saint Kitts and Nevis", iso3: "KNA", iso: "KN", iso_name: "SAINT KITTS AND NEVIS", numcode: "659", states_required: true },
|
228
228
|
{ name: "Serbia", iso3: "SRB", iso: "RS", "iso_name" => "SERBIA", numcode: "999" },
|
229
|
-
{ name: "Montenegro", iso3: "MNE", iso: "ME", iso_name: "MONTENEGRO", numcode: "499" }
|
229
|
+
{ name: "Montenegro", iso3: "MNE", iso: "ME", iso_name: "MONTENEGRO", numcode: "499" },
|
230
|
+
{ name: "Jersey", iso3: "JEY", iso: "JE", iso_name: "JERSEY", numcode: "44" }
|
230
231
|
])
|
231
232
|
Spree::Config[:default_country_id] = Spree::Country.find_by(name: "United States").id
|
@@ -7,11 +7,8 @@ class RenameAdjustmentFields < ActiveRecord::Migration
|
|
7
7
|
|
8
8
|
# This enables the Spree::Order#all_adjustments association to work correctly
|
9
9
|
Spree::Adjustment.reset_column_information
|
10
|
-
Spree::Adjustment.find_each do |adjustment|
|
11
|
-
|
12
|
-
adjustment.order = adjustment.adjustable
|
13
|
-
adjustment.save
|
14
|
-
end
|
10
|
+
Spree::Adjustment.where(adjustable_type: "Spree::Order").find_each do |adjustment|
|
11
|
+
adjustment.update_column(:order_id, adjustment.adjustable_id)
|
15
12
|
end
|
16
13
|
end
|
17
14
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class AddDefaultToShipmentCost < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
change_column :spree_shipments, :cost, :decimal, precision: 10, scale: 2, default: 0.0
|
4
|
+
Spree::Shipment.where(cost: nil).update_all(cost: 0)
|
5
|
+
end
|
6
|
+
|
7
|
+
def down
|
8
|
+
change_column :spree_shipments, :cost, :decimal, precision: 10, scale: 2
|
9
|
+
end
|
10
|
+
end
|
@@ -13,6 +13,7 @@ module Spree
|
|
13
13
|
class_option :admin_email, :type => :string
|
14
14
|
class_option :admin_password, :type => :string
|
15
15
|
class_option :lib_name, :type => :string, :default => 'spree'
|
16
|
+
class_option :enforce_available_locales, :type => :boolean, :default => nil
|
16
17
|
|
17
18
|
def self.source_paths
|
18
19
|
paths = self.superclass.source_paths
|
@@ -104,6 +105,13 @@ Disallow: /account
|
|
104
105
|
end
|
105
106
|
end
|
106
107
|
APP
|
108
|
+
|
109
|
+
if !options[:enforce_available_locales].nil?
|
110
|
+
application <<-APP
|
111
|
+
# Prevent this deprecation message: https://github.com/svenfuchs/i18n/commit/3b6e56e
|
112
|
+
I18n.enforce_available_locales = #{options[:enforce_available_locales]}
|
113
|
+
APP
|
114
|
+
end
|
107
115
|
end
|
108
116
|
|
109
117
|
def include_seed_data
|
data/lib/spree/core.rb
CHANGED
@@ -69,6 +69,7 @@ require 'spree/core/delegate_belongs_to'
|
|
69
69
|
require 'spree/core/permalinks'
|
70
70
|
require 'spree/core/token_resource'
|
71
71
|
require 'spree/core/calculated_adjustments'
|
72
|
+
require 'spree/core/adjustment_source'
|
72
73
|
require 'spree/core/product_duplicator'
|
73
74
|
require 'spree/core/controller_helpers'
|
74
75
|
require 'spree/core/controller_helpers/strong_parameters'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Spree
|
2
|
+
module Core
|
3
|
+
module AdjustmentSource
|
4
|
+
def self.included(klass)
|
5
|
+
klass.class_eval do
|
6
|
+
def deals_with_adjustments_for_deleted_source
|
7
|
+
adjustment_scope = self.adjustments.includes(:order).references(:spree_orders)
|
8
|
+
|
9
|
+
# For incomplete orders, remove the adjustment completely.
|
10
|
+
adjustment_scope.where("spree_orders.completed_at IS NULL").destroy_all
|
11
|
+
|
12
|
+
# For complete orders, the source will be invalid.
|
13
|
+
# Therefore we nullify the source_id, leaving the adjustment in place.
|
14
|
+
# This would mean that the order's total is not altered at all.
|
15
|
+
adjustment_scope.where("spree_orders.completed_at IS NOT NULL").each do |adjustment|
|
16
|
+
adjustment.update_columns(
|
17
|
+
source_id: nil,
|
18
|
+
updated_at: Time.now,
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -13,7 +13,7 @@ module Spree
|
|
13
13
|
|
14
14
|
# Used in the link_to_cart helper.
|
15
15
|
def simple_current_order
|
16
|
-
@
|
16
|
+
@simple_current_order ||= Spree::Order.find_by(id: session[:order_id], currency: current_currency)
|
17
17
|
end
|
18
18
|
|
19
19
|
# The current incomplete order from the session for use in cart and during checkout
|
@@ -18,8 +18,7 @@ module Spree
|
|
18
18
|
create_adjustments_from_params(params.delete(:adjustments_attributes), order)
|
19
19
|
create_payments_from_params(params.delete(:payments_attributes), order)
|
20
20
|
|
21
|
-
|
22
|
-
if(completed_at = params.delete(:completed_at))
|
21
|
+
if completed_at = params.delete(:completed_at)
|
23
22
|
order.completed_at = completed_at
|
24
23
|
order.state = 'complete'
|
25
24
|
end
|
@@ -30,9 +29,9 @@ module Spree
|
|
30
29
|
end
|
31
30
|
|
32
31
|
order.update_attributes!(params)
|
33
|
-
|
34
|
-
order
|
35
|
-
order.
|
32
|
+
|
33
|
+
# Really ensure that the order totals & states are correct
|
34
|
+
order.updater.update
|
36
35
|
order.reload
|
37
36
|
rescue Exception => e
|
38
37
|
order.destroy if order && order.persisted?
|
@@ -45,9 +44,14 @@ module Spree
|
|
45
44
|
shipments_hash.each do |s|
|
46
45
|
begin
|
47
46
|
shipment = order.shipments.build
|
48
|
-
shipment.tracking
|
47
|
+
shipment.tracking = s[:tracking]
|
49
48
|
shipment.stock_location = Spree::StockLocation.find_by_name!(s[:stock_location])
|
50
49
|
|
50
|
+
if s[:shipped_at].present?
|
51
|
+
shipment.shipped_at = s[:shipped_at]
|
52
|
+
shipment.state = 'shipped'
|
53
|
+
end
|
54
|
+
|
51
55
|
inventory_units = s[:inventory_units] || []
|
52
56
|
inventory_units.each do |iu|
|
53
57
|
ensure_variant_id_from_params(iu)
|
@@ -63,6 +67,7 @@ module Spree
|
|
63
67
|
rate = shipment.shipping_rates.create!(:shipping_method => shipping_method,
|
64
68
|
:cost => s[:cost])
|
65
69
|
shipment.selected_shipping_rate_id = rate.id
|
70
|
+
shipment.update_amounts
|
66
71
|
|
67
72
|
rescue Exception => e
|
68
73
|
raise "Order import shipments: #{e.message} #{s}"
|
@@ -104,9 +109,11 @@ module Spree
|
|
104
109
|
return [] unless payments_hash
|
105
110
|
payments_hash.each do |p|
|
106
111
|
begin
|
107
|
-
payment = order.payments.build
|
112
|
+
payment = order.payments.build order: order
|
108
113
|
payment.amount = p[:amount].to_f
|
109
|
-
|
114
|
+
# Order API should be using state as that's the normal payment field.
|
115
|
+
# spree_wombat serializes payment state as status so imported orders should fall back to status field.
|
116
|
+
payment.state = p[:state] || p[:status] || 'completed'
|
110
117
|
payment.payment_method = Spree::PaymentMethod.find_by_name!(p[:payment_method])
|
111
118
|
payment.save!
|
112
119
|
rescue Exception => e
|
data/lib/spree/core/version.rb
CHANGED
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.2.
|
4
|
+
version: 2.2.5
|
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
|
+
date: 2014-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemerchant
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '1.16'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: font-awesome-rails
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '4.0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '4.0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: friendly_id
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +164,20 @@ dependencies:
|
|
150
164
|
- - "~>"
|
151
165
|
- !ruby/object:Gem::Version
|
152
166
|
version: '0.11'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: i18n
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - '='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.6.9
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - '='
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.6.9
|
153
181
|
- !ruby/object:Gem::Dependency
|
154
182
|
name: json
|
155
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -226,14 +254,14 @@ dependencies:
|
|
226
254
|
requirements:
|
227
255
|
- - "~>"
|
228
256
|
- !ruby/object:Gem::Version
|
229
|
-
version: 4.0.
|
257
|
+
version: 4.0.8
|
230
258
|
type: :runtime
|
231
259
|
prerelease: false
|
232
260
|
version_requirements: !ruby/object:Gem::Requirement
|
233
261
|
requirements:
|
234
262
|
- - "~>"
|
235
263
|
- !ruby/object:Gem::Version
|
236
|
-
version: 4.0.
|
264
|
+
version: 4.0.8
|
237
265
|
- !ruby/object:Gem::Dependency
|
238
266
|
name: ransack
|
239
267
|
requirement: !ruby/object:Gem::Requirement
|
@@ -290,20 +318,6 @@ dependencies:
|
|
290
318
|
- - '='
|
291
319
|
- !ruby/object:Gem::Version
|
292
320
|
version: 0.9.2
|
293
|
-
- !ruby/object:Gem::Dependency
|
294
|
-
name: font-awesome-rails
|
295
|
-
requirement: !ruby/object:Gem::Requirement
|
296
|
-
requirements:
|
297
|
-
- - "~>"
|
298
|
-
- !ruby/object:Gem::Version
|
299
|
-
version: '4.0'
|
300
|
-
type: :runtime
|
301
|
-
prerelease: false
|
302
|
-
version_requirements: !ruby/object:Gem::Requirement
|
303
|
-
requirements:
|
304
|
-
- - "~>"
|
305
|
-
- !ruby/object:Gem::Version
|
306
|
-
version: '4.0'
|
307
321
|
description: The bare bones necessary for Spree.
|
308
322
|
email: sean@spreecommerce.com
|
309
323
|
executables: []
|
@@ -593,6 +607,7 @@ files:
|
|
593
607
|
- db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb
|
594
608
|
- db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb
|
595
609
|
- db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb
|
610
|
+
- db/migrate/20140804185157_add_default_to_shipment_cost.rb
|
596
611
|
- db/seeds.rb
|
597
612
|
- lib/generators/spree/custom_user/custom_user_generator.rb
|
598
613
|
- lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt
|
@@ -613,6 +628,7 @@ files:
|
|
613
628
|
- lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css
|
614
629
|
- lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css
|
615
630
|
- lib/spree/core.rb
|
631
|
+
- lib/spree/core/adjustment_source.rb
|
616
632
|
- lib/spree/core/calculated_adjustments.rb
|
617
633
|
- lib/spree/core/controller_helpers.rb
|
618
634
|
- lib/spree/core/controller_helpers/auth.rb
|