spree_core 2.2.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +26 -0
- data/app/helpers/spree/taxons_helper.rb +2 -2
- data/app/models/concerns/spree/user_api_authentication.rb +13 -0
- data/app/models/concerns/spree/user_reporting.rb +27 -0
- data/app/models/spree/adjustment.rb +3 -2
- data/app/models/spree/app_configuration.rb +1 -0
- data/app/models/spree/calculator/default_tax.rb +5 -1
- data/app/models/spree/calculator.rb +2 -2
- data/app/models/spree/credit_card.rb +11 -5
- data/app/models/spree/gateway.rb +25 -0
- data/app/models/spree/item_adjustments.rb +2 -0
- data/app/models/spree/legacy_user.rb +2 -3
- data/app/models/spree/line_item.rb +7 -0
- data/app/models/spree/order/checkout.rb +19 -7
- data/app/models/spree/order/currency_updater.rb +40 -0
- data/app/models/spree/order.rb +19 -3
- data/app/models/spree/order_updater.rb +1 -1
- data/app/models/spree/payment.rb +5 -2
- data/app/models/spree/payment_method.rb +1 -0
- data/app/models/spree/product/scopes.rb +13 -17
- data/app/models/spree/product.rb +10 -2
- data/app/models/spree/promotion/actions/free_shipping.rb +4 -2
- data/app/models/spree/promotion/rules/product.rb +0 -9
- data/app/models/spree/promotion.rb +1 -1
- data/app/models/spree/shipment.rb +19 -14
- data/app/models/spree/shipping_method.rb +2 -2
- data/app/models/spree/shipping_rate.rb +15 -9
- data/app/models/spree/stock/estimator.rb +4 -1
- data/app/models/spree/stock_location.rb +1 -0
- data/app/models/spree/tax_rate.rb +81 -7
- data/config/initializers/user_class_extensions.rb +3 -0
- data/config/locales/en.yml +26 -0
- data/db/default/spree/countries.rb +2 -1
- data/db/migrate/20130213191427_create_default_stock.rb +3 -3
- data/db/migrate/20130417120035_update_adjustment_states.rb +2 -2
- data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +1 -1
- data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +1 -1
- data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +5 -7
- data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +13 -0
- data/lib/generators/spree/dummy/templates/rails/database.yml +6 -6
- data/lib/spree/core/controller_helpers/auth.rb +10 -1
- data/lib/spree/core/controller_helpers/order.rb +1 -1
- data/lib/spree/core/controller_helpers/respond_with.rb +6 -1
- data/lib/spree/core/importer/order.rb +168 -0
- data/lib/spree/core/importer.rb +8 -0
- data/lib/spree/core/product_duplicator.rb +1 -1
- data/lib/spree/core/user_address.rb +2 -0
- data/lib/spree/core/user_payment_source.rb +20 -0
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +4 -0
- data/lib/spree/migrations.rb +1 -1
- data/lib/spree/permitted_attributes.rb +1 -1
- data/lib/spree/testing_support/capybara_ext.rb +23 -1
- data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -6
- data/lib/spree/testing_support/factories/order_factory.rb +8 -8
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +3 -1
- data/lib/spree/testing_support/factories/user_factory.rb +5 -0
- metadata +11 -3
@@ -6,7 +6,7 @@ module Spree
|
|
6
6
|
belongs_to :address, class_name: 'Spree::Address', inverse_of: :shipments
|
7
7
|
belongs_to :stock_location, class_name: 'Spree::StockLocation'
|
8
8
|
|
9
|
-
has_many :shipping_rates, dependent: :delete_all
|
9
|
+
has_many :shipping_rates, -> { order('cost ASC') }, dependent: :delete_all
|
10
10
|
has_many :shipping_methods, through: :shipping_rates
|
11
11
|
has_many :state_changes, as: :stateful
|
12
12
|
has_many :inventory_units, dependent: :delete_all, inverse_of: :shipment
|
@@ -94,7 +94,7 @@ module Spree
|
|
94
94
|
end
|
95
95
|
|
96
96
|
def add_shipping_method(shipping_method, selected = false)
|
97
|
-
shipping_rates.create(shipping_method: shipping_method, selected: selected)
|
97
|
+
shipping_rates.create(shipping_method: shipping_method, selected: selected, cost: cost)
|
98
98
|
end
|
99
99
|
|
100
100
|
def selected_shipping_rate
|
@@ -167,6 +167,10 @@ module Spree
|
|
167
167
|
Spree::Money.new(discounted_cost, { currency: currency })
|
168
168
|
end
|
169
169
|
|
170
|
+
def display_final_price
|
171
|
+
Spree::Money.new(final_price, { currency: currency })
|
172
|
+
end
|
173
|
+
|
170
174
|
def display_item_cost
|
171
175
|
Spree::Money.new(item_cost, { currency: currency })
|
172
176
|
end
|
@@ -178,12 +182,16 @@ module Spree
|
|
178
182
|
ManifestItem = Struct.new(:line_item, :variant, :quantity, :states)
|
179
183
|
|
180
184
|
def manifest
|
181
|
-
|
182
|
-
|
185
|
+
# Grouping by the ID means that we don't have to call out to the association accessor
|
186
|
+
# This makes the grouping by faster because it results in less SQL cache hits.
|
187
|
+
inventory_units.group_by(&:variant_id).map do |variant_id, units|
|
188
|
+
units.group_by(&:line_item_id).map do |line_item_id, units|
|
183
189
|
|
184
190
|
states = {}
|
185
191
|
units.group_by(&:state).each { |state, iu| states[state] = iu.count }
|
186
192
|
|
193
|
+
line_item = units.first.line_item
|
194
|
+
variant = units.first.variant
|
187
195
|
ManifestItem.new(line_item, variant, units.length, states)
|
188
196
|
end
|
189
197
|
end.flatten
|
@@ -269,17 +277,14 @@ module Spree
|
|
269
277
|
)
|
270
278
|
end
|
271
279
|
|
272
|
-
def persist_cost
|
273
|
-
self.cost = selected_shipping_rate.cost
|
274
|
-
update_amounts
|
275
|
-
end
|
276
|
-
|
277
280
|
def update_amounts
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
281
|
+
if selected_shipping_rate
|
282
|
+
self.update_columns(
|
283
|
+
cost: selected_shipping_rate.cost,
|
284
|
+
adjustment_total: adjustments.additional.map(&:update!).compact.sum,
|
285
|
+
updated_at: Time.now,
|
286
|
+
)
|
287
|
+
end
|
283
288
|
end
|
284
289
|
|
285
290
|
private
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Spree
|
2
2
|
class ShippingMethod < ActiveRecord::Base
|
3
|
+
acts_as_paranoid
|
3
4
|
include Spree::Core::CalculatedAdjustments
|
4
5
|
DISPLAY = [:both, :front_end, :back_end]
|
5
6
|
|
6
7
|
default_scope -> { where(deleted_at: nil) }
|
7
8
|
|
8
|
-
has_many :adjustments, as: :source
|
9
|
-
has_many :shipments
|
10
9
|
has_many :shipping_method_categories, :dependent => :destroy
|
11
10
|
has_many :shipping_categories, through: :shipping_method_categories
|
12
11
|
has_many :shipping_rates, inverse_of: :shipping_method
|
12
|
+
has_many :shipments, :through => :shipping_rates
|
13
13
|
|
14
14
|
has_and_belongs_to_many :zones, :join_table => 'spree_shipping_methods_zones',
|
15
15
|
:class_name => 'Spree::Zone',
|
@@ -4,11 +4,6 @@ module Spree
|
|
4
4
|
belongs_to :shipping_method, class_name: 'Spree::ShippingMethod', inverse_of: :shipping_rates
|
5
5
|
belongs_to :tax_rate, class_name: 'Spree::TaxRate'
|
6
6
|
|
7
|
-
scope :with_shipping_method,
|
8
|
-
-> { includes(:shipping_method).
|
9
|
-
references(:shipping_method).
|
10
|
-
order("cost ASC") }
|
11
|
-
|
12
7
|
delegate :order, :currency, to: :shipment
|
13
8
|
delegate :name, to: :shipping_method
|
14
9
|
|
@@ -16,17 +11,24 @@ module Spree
|
|
16
11
|
Spree::Money.new(cost, currency: currency)
|
17
12
|
end
|
18
13
|
|
19
|
-
def
|
20
|
-
|
14
|
+
def calculate_tax_amount
|
15
|
+
tax_rate.calculator.compute_shipping_rate(self)
|
21
16
|
end
|
22
17
|
|
23
18
|
def display_price
|
24
19
|
price = display_base_price.to_s
|
25
20
|
if tax_rate
|
26
|
-
|
21
|
+
tax_amount = calculate_tax_amount
|
27
22
|
if tax_rate.included_in_price?
|
28
|
-
|
23
|
+
if tax_amount > 0
|
24
|
+
amount = "#{display_tax_amount(tax_amount)} #{tax_rate.name}"
|
25
|
+
price += " (incl. #{amount})"
|
26
|
+
else
|
27
|
+
amount = "#{display_tax_amount(tax_amount*-1)} #{tax_rate.name}"
|
28
|
+
price += " (excl. #{amount})"
|
29
|
+
end
|
29
30
|
else
|
31
|
+
amount = "#{display_tax_amount(tax_amount)} #{tax_rate.name}"
|
30
32
|
price += " (+ #{amount})"
|
31
33
|
end
|
32
34
|
end
|
@@ -34,6 +36,10 @@ module Spree
|
|
34
36
|
end
|
35
37
|
alias_method :display_cost, :display_price
|
36
38
|
|
39
|
+
def display_tax_amount(tax_amount)
|
40
|
+
Spree::Money.new(tax_amount, currency: currency)
|
41
|
+
end
|
42
|
+
|
37
43
|
def shipping_method
|
38
44
|
Spree::ShippingMethod.unscoped { super }
|
39
45
|
end
|
@@ -32,7 +32,10 @@ module Spree
|
|
32
32
|
tax_category = shipping_method.tax_category
|
33
33
|
if tax_category
|
34
34
|
tax_rate = tax_category.tax_rates.detect do |rate|
|
35
|
-
rate
|
35
|
+
# If the rate's zone matches the order's zone, a positive adjustment will be applied.
|
36
|
+
# If the rate is from the default tax zone, then a negative adjustment will be applied.
|
37
|
+
# See the tests in shipping_rate_spec.rb for an example of this.d
|
38
|
+
rate.zone == package.order.tax_zone || rate.zone.default_tax?
|
36
39
|
end
|
37
40
|
end
|
38
41
|
|
@@ -26,9 +26,28 @@ module Spree
|
|
26
26
|
# Gets the array of TaxRates appropriate for the specified order
|
27
27
|
def self.match(order)
|
28
28
|
return [] unless order.tax_zone
|
29
|
-
all.select do |rate|
|
30
|
-
|
31
|
-
|
29
|
+
rates = all.select do |rate|
|
30
|
+
# Why "potentially"?
|
31
|
+
# Go see the documentation for that method.
|
32
|
+
rate.potentially_applicable?(order)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Imagine with me this scenario:
|
36
|
+
# You are living in Spain and you have a store which ships to France.
|
37
|
+
# Spain is therefore your default tax rate.
|
38
|
+
# When you ship to Spain, you want the Spanish rate to apply.
|
39
|
+
# When you ship to France, you want the French rate to apply.
|
40
|
+
#
|
41
|
+
# Normally, Spree would notice that you have two potentially applicable
|
42
|
+
# tax rates for one particular item.
|
43
|
+
# When you ship to Spain, only the Spanish one will apply.
|
44
|
+
# When you ship to France, you'll see a Spanish refund AND a French tax.
|
45
|
+
# This little bit of code at the end stops the Spanish refund from appearing.
|
46
|
+
#
|
47
|
+
# For further discussion, see #4397 and #4327.
|
48
|
+
rates.delete_if do |rate|
|
49
|
+
rate.included_in_price? &&
|
50
|
+
(rates - [rate]).map(&:tax_category).include?(rate.tax_category)
|
32
51
|
end
|
33
52
|
end
|
34
53
|
|
@@ -48,6 +67,7 @@ module Spree
|
|
48
67
|
end
|
49
68
|
end
|
50
69
|
|
70
|
+
# This method is best described by the documentation on #potentially_applicable?
|
51
71
|
def self.adjust(order, items)
|
52
72
|
rates = self.match(order)
|
53
73
|
tax_categories = rates.map(&:tax_category)
|
@@ -75,13 +95,62 @@ module Spree
|
|
75
95
|
rate || 0
|
76
96
|
end
|
77
97
|
|
98
|
+
|
99
|
+
# Tax rates can *potentially* be applicable to an order.
|
100
|
+
# We do not know if they are/aren't until we attempt to apply these rates to
|
101
|
+
# the items contained within the Order itself.
|
102
|
+
# For instance, if a rate passes the criteria outlined in this method,
|
103
|
+
# but then has a tax category that doesn't match against any of the line items
|
104
|
+
# inside of the order, then that tax rate will not be applicable to anything.
|
105
|
+
# For instance:
|
106
|
+
#
|
107
|
+
# Zones:
|
108
|
+
# - Spain (default tax zone)
|
109
|
+
# - France
|
110
|
+
#
|
111
|
+
# Tax rates: (note: amounts below do not actually reflect real VAT rates)
|
112
|
+
# 21% inclusive - "Clothing" - Spain
|
113
|
+
# 18% inclusive - "Clothing" - France
|
114
|
+
# 10% inclusive - "Food" - Spain
|
115
|
+
# 8% inclusive - "Food" - France
|
116
|
+
# 5% inclusive - "Hotels" - Spain
|
117
|
+
# 2% inclusive - "Hotels" - France
|
118
|
+
#
|
119
|
+
# Order has:
|
120
|
+
# Line Item #1 - Tax Category: Clothing
|
121
|
+
# Line Item #2 - Tax Category: Food
|
122
|
+
#
|
123
|
+
# Tax rates that should be selected:
|
124
|
+
#
|
125
|
+
# 21% inclusive - "Clothing" - Spain
|
126
|
+
# 10% inclusive - "Food" - Spain
|
127
|
+
#
|
128
|
+
# If the order's address changes to one in France, then the tax will be recalculated:
|
129
|
+
#
|
130
|
+
# 18% inclusive - "Clothing" - France
|
131
|
+
# 8% inclusive - "Food" - France
|
132
|
+
#
|
133
|
+
# Note here that the "Hotels" tax rates will not be used at all.
|
134
|
+
# This is because there are no items which have the tax category of "Hotels".
|
135
|
+
#
|
136
|
+
# Under no circumstances should negative adjustments be applied for the Spanish tax rates.
|
137
|
+
#
|
138
|
+
# Those rates should never come into play at all and only the French rates should apply.
|
139
|
+
def potentially_applicable?(order)
|
140
|
+
# If the rate's zone matches the order's tax zone, then it's applicable.
|
141
|
+
self.zone == order.tax_zone ||
|
142
|
+
# If the rate's zone *contains* the order's tax zone, then it's applicable.
|
143
|
+
self.zone.contains?(order.tax_zone) ||
|
144
|
+
# 1) The rate's zone is the default zone, then it's always applicable.
|
145
|
+
(self.included_in_price? && self.zone.default_tax)
|
146
|
+
end
|
147
|
+
|
78
148
|
# Creates necessary tax adjustments for the order.
|
79
149
|
def adjust(order, item)
|
80
|
-
amount =
|
150
|
+
amount = compute_amount(item)
|
81
151
|
return if amount == 0
|
82
152
|
|
83
|
-
included = included_in_price &&
|
84
|
-
Zone.default_tax.contains?(item.order.tax_zone)
|
153
|
+
included = included_in_price && default_zone_or_zone_match?(item)
|
85
154
|
|
86
155
|
if amount < 0
|
87
156
|
label = Spree.t(:refund) + ' ' + create_label
|
@@ -99,7 +168,7 @@ module Spree
|
|
99
168
|
# This method is used by Adjustment#update to recalculate the cost.
|
100
169
|
def compute_amount(item)
|
101
170
|
if included_in_price
|
102
|
-
if
|
171
|
+
if default_zone_or_zone_match?(item)
|
103
172
|
calculator.compute(item)
|
104
173
|
else
|
105
174
|
# In this case, it's a refund.
|
@@ -110,6 +179,11 @@ module Spree
|
|
110
179
|
end
|
111
180
|
end
|
112
181
|
|
182
|
+
def default_zone_or_zone_match?(item)
|
183
|
+
Zone.default_tax.contains?(item.order.tax_zone) ||
|
184
|
+
item.order.tax_zone == self.zone
|
185
|
+
end
|
186
|
+
|
113
187
|
private
|
114
188
|
|
115
189
|
def create_label
|
@@ -1,6 +1,9 @@
|
|
1
1
|
Spree::Core::Engine.config.to_prepare do
|
2
2
|
if Spree.user_class
|
3
3
|
Spree.user_class.class_eval do
|
4
|
+
|
5
|
+
include Spree::UserReporting
|
6
|
+
include Spree::UserApiAuthentication
|
4
7
|
has_and_belongs_to_many :spree_roles,
|
5
8
|
:join_table => 'spree_roles_users',
|
6
9
|
:foreign_key => "user_id",
|
data/config/locales/en.yml
CHANGED
@@ -189,6 +189,9 @@ en:
|
|
189
189
|
spree/state:
|
190
190
|
one: State
|
191
191
|
other: States
|
192
|
+
spree/stock_movement:
|
193
|
+
one: Stock Movement
|
194
|
+
other: Stock Movements
|
192
195
|
spree/stock_location:
|
193
196
|
one: Stock Location
|
194
197
|
other: Stock Locations
|
@@ -229,6 +232,10 @@ en:
|
|
229
232
|
attributes:
|
230
233
|
base:
|
231
234
|
card_expired: "Card has expired"
|
235
|
+
spree/line_item:
|
236
|
+
attributes:
|
237
|
+
currency:
|
238
|
+
must_match_order_currency: "Must match order currency"
|
232
239
|
devise:
|
233
240
|
confirmations:
|
234
241
|
confirmed: Your account was successfully confirmed. You are now signed in.
|
@@ -339,6 +346,15 @@ en:
|
|
339
346
|
taxonomies: Taxonomies
|
340
347
|
taxons: Taxons
|
341
348
|
users: Users
|
349
|
+
user:
|
350
|
+
account: Account
|
351
|
+
addresses: Addresses
|
352
|
+
items: Items
|
353
|
+
items_purchased: Items Purchased
|
354
|
+
order_history: Order History
|
355
|
+
order_num: "Order #"
|
356
|
+
orders: Orders
|
357
|
+
user_information: User Information
|
342
358
|
administration: Administration
|
343
359
|
agree_to_privacy_policy: Agree to Privacy Policy
|
344
360
|
agree_to_terms_of_service: Agree to Terms of Service
|
@@ -370,6 +386,7 @@ en:
|
|
370
386
|
authorization_failure: Authorization Failure
|
371
387
|
auto_capture: Auto Capture
|
372
388
|
available_on: Available On
|
389
|
+
average_order_value: Average Order Value
|
373
390
|
avs_response: AVS Response
|
374
391
|
back: Back
|
375
392
|
back_end: Backend
|
@@ -430,6 +447,7 @@ en:
|
|
430
447
|
choose_a_taxon_to_sort_products_for: "Choose a taxon to sort products for"
|
431
448
|
choose_currency: Choose Currency
|
432
449
|
choose_dashboard_locale: Choose Dashboard Locale
|
450
|
+
choose_location: Choose location
|
433
451
|
city: City
|
434
452
|
clone: Clone
|
435
453
|
close: Close
|
@@ -571,6 +589,7 @@ en:
|
|
571
589
|
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.
|
572
590
|
expiration: Expiration
|
573
591
|
extension: Extension
|
592
|
+
existing_shipments: Existing shipments
|
574
593
|
failed_payment_attempts: Failed Payment Attempts
|
575
594
|
filename: Filename
|
576
595
|
fill_in_customer_info: Please fill in customer info
|
@@ -624,6 +643,7 @@ en:
|
|
624
643
|
intercept_email_address: Intercept Email Address
|
625
644
|
intercept_email_instructions: Override email recipient and replace with this address.
|
626
645
|
internal_name: Internal Name
|
646
|
+
invalid_credit_card: Invalid credit card.
|
627
647
|
invalid_payment_provider: Invalid payment provider.
|
628
648
|
invalid_promotion_action: Invalid promotion action.
|
629
649
|
invalid_promotion_rule: Invalid promotion rule.
|
@@ -646,6 +666,7 @@ en:
|
|
646
666
|
last_name: Last Name
|
647
667
|
last_name_begins_with: Last Name Begins With
|
648
668
|
learn_more: Learn More
|
669
|
+
lifetime_stats: Lifetime Stats
|
649
670
|
line_item_adjustments: "Line item adjustments"
|
650
671
|
list: List
|
651
672
|
listing_countries: Listing Countries
|
@@ -686,6 +707,7 @@ en:
|
|
686
707
|
all: All
|
687
708
|
none: None
|
688
709
|
max_items: Max Items
|
710
|
+
member_since: Member Since
|
689
711
|
meta_description: Meta Description
|
690
712
|
meta_keywords: Meta Keywords
|
691
713
|
metadata: Metadata
|
@@ -715,6 +737,7 @@ en:
|
|
715
737
|
new_return_authorization: New Return Authorization
|
716
738
|
new_shipping_category: New Shipping Category
|
717
739
|
new_shipping_method: New Shipping Method
|
740
|
+
new_shipment_at_location: New shipment at location
|
718
741
|
new_state: New State
|
719
742
|
new_stock_location: New Stock Location
|
720
743
|
new_stock_movement: New Stock Movement
|
@@ -755,6 +778,7 @@ en:
|
|
755
778
|
product_not_deleted: Product could not be deleted
|
756
779
|
variant_deleted: Variant has been deleted
|
757
780
|
variant_not_deleted: Variant could not be deleted
|
781
|
+
num_orders: "# Orders"
|
758
782
|
on_hand: On Hand
|
759
783
|
open: Open
|
760
784
|
open_all_adjustments: Open All Adjustments
|
@@ -1055,6 +1079,7 @@ en:
|
|
1055
1079
|
stock_location: Stock Location
|
1056
1080
|
stock_location_info: Stock location info
|
1057
1081
|
stock_locations: Stock Locations
|
1082
|
+
stock_locations_need_a_default_country: You must create a default country before creating a stock location.
|
1058
1083
|
stock_management: Stock Management
|
1059
1084
|
stock_management_requires_a_stock_location: Please create a stock location in order to manage stock.
|
1060
1085
|
stock_movements: Stock Movements
|
@@ -1104,6 +1129,7 @@ en:
|
|
1104
1129
|
to_add_variants_you_must_first_define: To add variants, you must first define
|
1105
1130
|
total: Total
|
1106
1131
|
total_price: Total price
|
1132
|
+
total_sales: Total Sales
|
1107
1133
|
track_inventory: Track Inventory
|
1108
1134
|
tracking: Tracking
|
1109
1135
|
tracking_number: Tracking Number
|
@@ -225,6 +225,7 @@ Spree::Country.create!([
|
|
225
225
|
{ name: "Macedonia", iso3: "MKD", iso: "MK", iso_name: "MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF", numcode: "807" },
|
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
|
-
{ name: "Serbia", iso3: "SRB", iso: "RS", "iso_name" => "SERBIA", numcode: "999" }
|
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
230
|
])
|
230
231
|
Spree::Config[:default_country_id] = Spree::Country.find_by(name: "United States").id
|
@@ -5,11 +5,11 @@ class CreateDefaultStock < ActiveRecord::Migration
|
|
5
5
|
location = Spree::StockLocation.new(name: 'default')
|
6
6
|
location.save(validate: false)
|
7
7
|
|
8
|
-
Spree::Variant.
|
8
|
+
Spree::Variant.find_each do |variant|
|
9
9
|
stock_item = Spree::StockItem.unscoped.build(stock_location: location, variant: variant)
|
10
10
|
stock_item.send(:count_on_hand=, variant.count_on_hand)
|
11
11
|
# Avoid running default_scope defined by acts_as_paranoid, related to #3805,
|
12
|
-
# validations would run a query with a delete_at column
|
12
|
+
# validations would run a query with a delete_at column that might not be present yet
|
13
13
|
stock_item.save! validate: false
|
14
14
|
end
|
15
15
|
|
@@ -19,7 +19,7 @@ class CreateDefaultStock < ActiveRecord::Migration
|
|
19
19
|
def down
|
20
20
|
add_column :spree_variants, :count_on_hand, :integer
|
21
21
|
|
22
|
-
Spree::StockItem.
|
22
|
+
Spree::StockItem.find_each do |stock_item|
|
23
23
|
stock_item.variant.update_column :count_on_hand, stock_item.count_on_hand
|
24
24
|
end
|
25
25
|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
class UpdateAdjustmentStates < ActiveRecord::Migration
|
2
2
|
def up
|
3
|
-
Spree::Order.complete.
|
3
|
+
Spree::Order.complete.find_each do |order|
|
4
4
|
order.adjustments.update_all(:state => 'closed')
|
5
5
|
end
|
6
6
|
|
7
|
-
Spree::Shipment.shipped.
|
7
|
+
Spree::Shipment.shipped.includes(:adjustment).find_each do |shipment|
|
8
8
|
shipment.adjustment.update_column(:state, 'finalized') if shipment.adjustment
|
9
9
|
end
|
10
10
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class AddShippingRatesToShipments < ActiveRecord::Migration
|
2
2
|
def up
|
3
|
-
Spree::Shipment.
|
3
|
+
Spree::Shipment.find_each do |shipment|
|
4
4
|
shipment.shipping_rates.create(:shipping_method_id => shipment.shipping_method_id,
|
5
5
|
:cost => shipment.cost,
|
6
6
|
:selected => true)
|
@@ -6,7 +6,7 @@ class AddNumberToStockTransfer < ActiveRecord::Migration
|
|
6
6
|
rename_column :spree_stock_transfers, :reference_number, :reference
|
7
7
|
add_column :spree_stock_transfers, :number, :string
|
8
8
|
|
9
|
-
Spree::StockTransfer.
|
9
|
+
Spree::StockTransfer.find_each do |transfer|
|
10
10
|
transfer.send(:generate_stock_transfer_number)
|
11
11
|
transfer.save!
|
12
12
|
end
|
@@ -1,12 +1,10 @@
|
|
1
1
|
class MigrateTaxCategoriesToLineItems < ActiveRecord::Migration
|
2
2
|
def change
|
3
|
-
Spree::LineItem.
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
line_item.update_column(:tax_category_id, line_item.product.tax_category_id)
|
9
|
-
end
|
3
|
+
Spree::LineItem.find_each do |line_item|
|
4
|
+
next if line_item.variant.nil?
|
5
|
+
next if line_item.variant.product.nil?
|
6
|
+
next if line_item.product.nil?
|
7
|
+
line_item.update_column(:tax_category_id, line_item.product.tax_category_id)
|
10
8
|
end
|
11
9
|
end
|
12
10
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class AddUserIdToSpreeCreditCards < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
unless Spree::CreditCard.column_names.include? "user_id"
|
4
|
+
add_column :spree_credit_cards, :user_id, :integer
|
5
|
+
add_index :spree_credit_cards, :user_id
|
6
|
+
end
|
7
|
+
|
8
|
+
unless Spree::CreditCard.column_names.include? "payment_method_id"
|
9
|
+
add_column :spree_credit_cards, :payment_method_id, :integer
|
10
|
+
add_index :spree_credit_cards, :payment_method_id
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -16,21 +16,21 @@ production:
|
|
16
16
|
<% when 'mysql' %>
|
17
17
|
development:
|
18
18
|
adapter: mysql2
|
19
|
-
database: <%= database_prefix %>
|
19
|
+
database: <%= database_prefix %><%= options[:lib_name] %>_spree_development
|
20
20
|
encoding: utf8
|
21
21
|
test:
|
22
22
|
adapter: mysql2
|
23
|
-
database: <%= database_prefix %>
|
23
|
+
database: <%= database_prefix %><%= options[:lib_name] %>_spree_test
|
24
24
|
encoding: utf8
|
25
25
|
production:
|
26
26
|
adapter: mysql2
|
27
|
-
database: <%= database_prefix %>
|
27
|
+
database: <%= database_prefix %><%= options[:lib_name] %>_spree_production
|
28
28
|
encoding: utf8
|
29
29
|
<% when 'postgres' %>
|
30
30
|
<% db_host = ENV['DB_HOST'] -%>
|
31
31
|
development:
|
32
32
|
adapter: postgresql
|
33
|
-
database: <%= database_prefix %>
|
33
|
+
database: <%= database_prefix %><%= options[:lib_name] %>_spree_development
|
34
34
|
username: postgres
|
35
35
|
min_messages: warning
|
36
36
|
<% unless db_host.blank? %>
|
@@ -38,7 +38,7 @@ development:
|
|
38
38
|
<% end %>
|
39
39
|
test:
|
40
40
|
adapter: postgresql
|
41
|
-
database: <%= database_prefix %>
|
41
|
+
database: <%= database_prefix %><%= options[:lib_name] %>_spree_test
|
42
42
|
username: postgres
|
43
43
|
min_messages: warning
|
44
44
|
<% unless db_host.blank? %>
|
@@ -46,7 +46,7 @@ test:
|
|
46
46
|
<% end %>
|
47
47
|
production:
|
48
48
|
adapter: postgresql
|
49
|
-
database: <%= database_prefix %>
|
49
|
+
database: <%= database_prefix %><%= options[:lib_name] %>_spree_production
|
50
50
|
username: postgres
|
51
51
|
min_messages: warning
|
52
52
|
<% unless db_host.blank? %>
|
@@ -53,7 +53,16 @@ module Spree
|
|
53
53
|
# proxy method to *possible* spree_current_user method
|
54
54
|
# Authentication extensions (such as spree_auth_devise) are meant to provide spree_current_user
|
55
55
|
def try_spree_current_user
|
56
|
-
|
56
|
+
# This one will be defined by apps looking to hook into Spree
|
57
|
+
# As per authentication_helpers.rb
|
58
|
+
if respond_to?(:spree_current_user)
|
59
|
+
spree_current_user
|
60
|
+
# This one will be defined by Devise
|
61
|
+
elsif respond_to?(:current_spree_user)
|
62
|
+
current_spree_user
|
63
|
+
else
|
64
|
+
nil
|
65
|
+
end
|
57
66
|
end
|
58
67
|
|
59
68
|
def redirect_back_or_default(default)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'spree/responder'
|
2
|
+
|
1
3
|
module ActionController
|
2
4
|
class Base
|
3
5
|
def respond_with(*resources, &block)
|
@@ -17,7 +19,8 @@ module ActionController
|
|
17
19
|
# The action name is needed for processing
|
18
20
|
options.merge!(:action_name => action_name.to_sym)
|
19
21
|
# If responder is not specified then pass in Spree::Responder
|
20
|
-
|
22
|
+
responder = options.delete(:responder) || self.responder
|
23
|
+
responder.call(self, resources, options)
|
21
24
|
end
|
22
25
|
end
|
23
26
|
end
|
@@ -33,6 +36,8 @@ module Spree
|
|
33
36
|
included do
|
34
37
|
cattr_accessor :spree_responders
|
35
38
|
self.spree_responders = {}
|
39
|
+
|
40
|
+
self.responder = Spree::Responder
|
36
41
|
end
|
37
42
|
|
38
43
|
module ClassMethods
|