spree_core 4.2.0.beta → 4.2.0.rc1
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/app/finders/spree/addresses/find.rb +17 -0
- data/app/helpers/spree/base_helper.rb +37 -11
- data/app/helpers/spree/mail_helper.rb +12 -7
- data/app/helpers/spree/products_helper.rb +2 -1
- data/app/mailers/spree/base_mailer.rb +1 -1
- data/app/models/concerns/spree/user_payment_source.rb +1 -1
- data/app/models/spree/address.rb +13 -1
- data/app/models/spree/app_dependencies.rb +7 -1
- data/app/models/spree/credit_card.rb +5 -0
- data/app/models/spree/line_item.rb +2 -1
- data/app/models/spree/order.rb +7 -2
- data/app/models/spree/order/payments.rb +10 -2
- data/app/models/spree/preferences/store.rb +1 -1
- data/app/models/spree/promotion.rb +6 -0
- data/app/models/spree/promotion_handler/promotion_duplicator.rb +9 -3
- data/app/models/spree/store.rb +3 -0
- data/app/presenters/spree/variant_presenter.rb +2 -1
- data/app/services/spree/account/addresses/base.rb +39 -0
- data/app/services/spree/account/addresses/create.rb +18 -0
- data/app/services/spree/account/addresses/update.rb +18 -0
- data/app/services/spree/checkout/update.rb +13 -2
- data/config/locales/en.yml +11 -4
- data/db/default/spree/countries.rb +10 -4
- data/db/default/spree/states.rb +42 -5
- data/db/default/spree/stores.rb +17 -13
- data/db/default/spree/zones.rb +1 -1
- data/db/migrate/20200610113542_add_label_to_spree_addresses.rb +5 -0
- data/db/migrate/20201013084504_add_seo_robots_to_spree_stores.rb +5 -0
- data/lib/spree/core.rb +1 -0
- data/lib/spree/core/controller_helpers/order.rb +9 -4
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/permitted_attributes.rb +2 -2
- data/spree_core.gemspec +1 -0
- metadata +28 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9aaaa7166983682cd10080012ae8c4b54c89808552125eed36bce0345c2ed023
|
4
|
+
data.tar.gz: b330046bd7a2af73be37cfedc5bae1a591c22e0344d62d1672d5ba84d0cf6f84
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2faa906d370fd03cb6e477b00e9e52c5a658e051df9cf02d6f19a62f1480a99785e038e3ade796c92b2a8dc1cec4c820602e68dcc3615142c9cfe1a191f33bb
|
7
|
+
data.tar.gz: 578828b9e6649880bfd6f1029adc1f0b5563ef5c68cda14d5ff1e3237ccc057953f0b30c4cad0984eff273417701c5303f6efe6ef3f13b19dd4cec4bc67358e2
|
@@ -57,8 +57,33 @@ module Spree
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
def object
|
61
|
+
instance_variable_get('@' + controller_name.singularize)
|
62
|
+
end
|
63
|
+
|
64
|
+
def og_meta_data
|
65
|
+
og_meta = {}
|
66
|
+
|
67
|
+
if object.is_a? Spree::Product
|
68
|
+
image = default_image_for_product_or_variant(object)
|
69
|
+
og_meta['og:image'] = main_app.url_for(image.attachment) if image&.attachment
|
70
|
+
|
71
|
+
og_meta['og:url'] = spree.url_for(object) if frontend_available? # url_for product needed
|
72
|
+
og_meta['og:type'] = object.class.name.demodulize.downcase
|
73
|
+
og_meta['og:title'] = object.name
|
74
|
+
og_meta['og:description'] = object.description
|
75
|
+
|
76
|
+
price = object.price_in(current_currency)
|
77
|
+
if price
|
78
|
+
og_meta['product:price:amount'] = price.amount
|
79
|
+
og_meta['product:price:currency'] = current_currency
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
og_meta
|
84
|
+
end
|
85
|
+
|
60
86
|
def meta_data
|
61
|
-
object = instance_variable_get('@' + controller_name.singularize)
|
62
87
|
meta = {}
|
63
88
|
|
64
89
|
if object.is_a? ApplicationRecord
|
@@ -82,16 +107,10 @@ module Spree
|
|
82
107
|
meta
|
83
108
|
end
|
84
109
|
|
85
|
-
def
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
image = default_image_for_product_or_variant(object)
|
90
|
-
image&.attachment.present? ? main_app.url_for(image.attachment) : asset_path(Spree::Config[:logo])
|
91
|
-
end
|
92
|
-
|
93
|
-
def meta_image_data_tag
|
94
|
-
tag('meta', property: 'og:image', content: meta_image_url_path) if meta_image_url_path
|
110
|
+
def og_meta_data_tags
|
111
|
+
og_meta_data.map do |property, content|
|
112
|
+
tag('meta', property: property, content: content) unless property.nil? || content.nil?
|
113
|
+
end.join("\n")
|
95
114
|
end
|
96
115
|
|
97
116
|
def meta_data_tags
|
@@ -189,5 +208,12 @@ module Spree
|
|
189
208
|
style if style.in? Spree::Image.styles.with_indifferent_access
|
190
209
|
end
|
191
210
|
end
|
211
|
+
|
212
|
+
def meta_robots
|
213
|
+
return unless current_store.respond_to?(:seo_robots)
|
214
|
+
return if current_store.seo_robots.blank?
|
215
|
+
|
216
|
+
tag('meta', name: 'robots', content: current_store.seo_robots)
|
217
|
+
end
|
192
218
|
end
|
193
219
|
end
|
@@ -11,14 +11,19 @@ module Spree
|
|
11
11
|
order.name || Spree.t('customer')
|
12
12
|
end
|
13
13
|
|
14
|
+
def store_logo
|
15
|
+
@order&.store&.mailer_logo || @order&.store&.logo || current_store.mailer_logo || current_store.logo
|
16
|
+
end
|
17
|
+
|
18
|
+
def default_logo
|
19
|
+
Spree::Config.mailer_logo || Spree::Config.logo
|
20
|
+
end
|
21
|
+
|
14
22
|
def logo_path
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
else
|
20
|
-
Spree::Config.mailer_logo || Spree::Config.logo
|
21
|
-
end
|
23
|
+
return default_logo unless store_logo.attached?
|
24
|
+
return main_app.url_for(store_logo.variant(resize: '244x104>')) if store_logo.variable?
|
25
|
+
|
26
|
+
return main_app.url_for(store_logo) if store_logo.image?
|
22
27
|
end
|
23
28
|
end
|
24
29
|
end
|
@@ -110,7 +110,8 @@ module Spree
|
|
110
110
|
variants: @variants,
|
111
111
|
is_product_available_in_currency: is_product_available_in_currency,
|
112
112
|
current_currency: current_currency,
|
113
|
-
current_price_options: current_price_options
|
113
|
+
current_price_options: current_price_options,
|
114
|
+
current_store: current_store
|
114
115
|
).call.to_json
|
115
116
|
end
|
116
117
|
|
data/app/models/spree/address.rb
CHANGED
@@ -10,10 +10,16 @@ module Spree
|
|
10
10
|
'TO', 'TV', 'UG', 'AE', 'VU', 'YE', 'ZW'
|
11
11
|
].freeze
|
12
12
|
|
13
|
+
# The required states listed below match those used by PayPal and Shopify.
|
14
|
+
STATES_REQUIRED = [
|
15
|
+
'AU', 'AE', 'BR', 'CA', 'CN', 'ES', 'HK', 'IE', 'IN',
|
16
|
+
'IT', 'MY', 'MX', 'NZ', 'PT', 'RO', 'TH', 'US', 'ZA'
|
17
|
+
].freeze
|
18
|
+
|
13
19
|
# we're not freezing this on purpose so developers can extend and manage
|
14
20
|
# those attributes depending of the logic of their applications
|
15
21
|
ADDRESS_FIELDS = %w(firstname lastname company address1 address2 city state zipcode country phone)
|
16
|
-
EXCLUDED_KEYS_FOR_COMPARISION = %w(id updated_at created_at deleted_at user_id)
|
22
|
+
EXCLUDED_KEYS_FOR_COMPARISION = %w(id updated_at created_at deleted_at label user_id)
|
17
23
|
|
18
24
|
belongs_to :country, class_name: 'Spree::Country'
|
19
25
|
belongs_to :state, class_name: 'Spree::State', optional: true
|
@@ -31,6 +37,12 @@ module Spree
|
|
31
37
|
|
32
38
|
validate :state_validate, :postal_code_validate
|
33
39
|
|
40
|
+
validates :label, uniqueness: { conditions: -> { where(deleted_at: nil) },
|
41
|
+
scope: :user_id,
|
42
|
+
case_sensitive: false,
|
43
|
+
allow_blank: true,
|
44
|
+
allow_nil: true }
|
45
|
+
|
34
46
|
delegate :name, :iso3, :iso, :iso_name, to: :country, prefix: true
|
35
47
|
delegate :abbr, to: :state, prefix: true, allow_nil: true
|
36
48
|
|
@@ -11,7 +11,8 @@ module Spree
|
|
11
11
|
:checkout_remove_store_credit_service, :checkout_get_shipping_rates_service,
|
12
12
|
:coupon_handler, :country_finder, :current_order_finder, :credit_card_finder,
|
13
13
|
:completed_order_finder, :order_sorter, :cart_compare_line_items_service, :collection_paginator, :products_sorter,
|
14
|
-
:products_finder, :taxon_finder, :line_item_by_variant_finder, :cart_estimate_shipping_rates_service
|
14
|
+
:products_finder, :taxon_finder, :line_item_by_variant_finder, :cart_estimate_shipping_rates_service,
|
15
|
+
:account_create_address_service, :account_update_address_service, :address_finder
|
15
16
|
].freeze
|
16
17
|
|
17
18
|
attr_accessor *INJECTION_POINTS
|
@@ -59,9 +60,14 @@ module Spree
|
|
59
60
|
# coupons
|
60
61
|
# TODO: we should split this service into 2 seperate - Add and Remove
|
61
62
|
@coupon_handler = 'Spree::PromotionHandler::Coupon'
|
63
|
+
|
64
|
+
# account
|
65
|
+
@account_create_address_service = 'Spree::Account::Addresses::Create'
|
66
|
+
@account_update_address_service = 'Spree::Account::Addresses::Update'
|
62
67
|
end
|
63
68
|
|
64
69
|
def set_default_finders
|
70
|
+
@address_finder = 'Spree::Addresses::Find'
|
65
71
|
@country_finder = 'Spree::Countries::Find'
|
66
72
|
@current_order_finder = 'Spree::Orders::FindCurrent'
|
67
73
|
@completed_order_finder = 'Spree::Orders::FindComplete'
|
@@ -37,6 +37,11 @@ module Spree
|
|
37
37
|
|
38
38
|
scope :with_payment_profile, -> { where.not(gateway_customer_profile_id: nil) }
|
39
39
|
scope :default, -> { where(default: true) }
|
40
|
+
scope :not_expired, lambda {
|
41
|
+
where('CAST(spree_credit_cards.year AS DECIMAL) > ?', Time.current.year).
|
42
|
+
or(where('CAST(spree_credit_cards.year AS DECIMAL) = ?', Time.current.year).
|
43
|
+
where('CAST(spree_credit_cards.month AS DECIMAL) >= ?', Time.current.month))
|
44
|
+
}
|
40
45
|
|
41
46
|
# needed for some of the ActiveMerchant gateways (eg. SagePay)
|
42
47
|
alias_attribute :brand, :cc_type
|
@@ -75,7 +75,8 @@ module Spree
|
|
75
75
|
|
76
76
|
extend DisplayMoney
|
77
77
|
money_methods :amount, :subtotal, :discounted_amount, :final_amount, :total, :price,
|
78
|
-
:adjustment_total, :additional_tax_total, :promo_total, :included_tax_total
|
78
|
+
:adjustment_total, :additional_tax_total, :promo_total, :included_tax_total,
|
79
|
+
:pre_tax_amount
|
79
80
|
|
80
81
|
alias single_money display_price
|
81
82
|
alias single_display_amount display_price
|
data/app/models/spree/order.rb
CHANGED
@@ -22,7 +22,7 @@ module Spree
|
|
22
22
|
money_methods :outstanding_balance, :item_total, :adjustment_total,
|
23
23
|
:included_tax_total, :additional_tax_total, :tax_total,
|
24
24
|
:shipment_total, :promo_total, :total,
|
25
|
-
:cart_promo_total
|
25
|
+
:cart_promo_total, :pre_tax_item_amount, :pre_tax_total
|
26
26
|
|
27
27
|
alias display_ship_total display_shipment_total
|
28
28
|
alias_attribute :ship_total, :shipment_total
|
@@ -174,7 +174,12 @@ module Spree
|
|
174
174
|
|
175
175
|
# Sum of all line item amounts pre-tax
|
176
176
|
def pre_tax_item_amount
|
177
|
-
line_items.
|
177
|
+
line_items.sum(:pre_tax_amount)
|
178
|
+
end
|
179
|
+
|
180
|
+
# Sum of all line item and shipment pre-tax
|
181
|
+
def pre_tax_total
|
182
|
+
pre_tax_item_amount + shipments.sum(:pre_tax_amount)
|
178
183
|
end
|
179
184
|
|
180
185
|
def shipping_discount
|
@@ -32,7 +32,7 @@ module Spree
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def pending_payments
|
35
|
-
payments.
|
35
|
+
payments.pending
|
36
36
|
end
|
37
37
|
|
38
38
|
def unprocessed_payments
|
@@ -52,7 +52,7 @@ module Spree
|
|
52
52
|
|
53
53
|
payment.public_send(method)
|
54
54
|
|
55
|
-
if payment.completed? && payment_total !=
|
55
|
+
if payment.completed? && payment_total != total_without_pending_store_credits
|
56
56
|
self.payment_total += payment.amount
|
57
57
|
end
|
58
58
|
end
|
@@ -60,6 +60,14 @@ module Spree
|
|
60
60
|
result = !!Spree::Config[:allow_checkout_on_gateway_error]
|
61
61
|
errors.add(:base, e.message) && (return result)
|
62
62
|
end
|
63
|
+
|
64
|
+
# Pending store credits are not added to `self.payment_total`.
|
65
|
+
# It can cause a situation where the amount of the credit card payment reduced with store credits
|
66
|
+
# may be added twice to `self.payment_total` causing wrong `order.outstanding_balance`
|
67
|
+
# calculations and thus an incorrect payment state.
|
68
|
+
def total_without_pending_store_credits
|
69
|
+
total - payments.map { |p| p.amount if p.source.is_a?(Spree::StoreCredit) && p.pending? }.sum(&:to_f)
|
70
|
+
end
|
63
71
|
end
|
64
72
|
end
|
65
73
|
end
|
@@ -28,6 +28,8 @@ module Spree
|
|
28
28
|
|
29
29
|
before_save :normalize_blank_values
|
30
30
|
|
31
|
+
before_validation :normalize_code
|
32
|
+
|
31
33
|
scope :coupons, -> { where.not(code: nil) }
|
32
34
|
scope :advertised, -> { where(advertise: true) }
|
33
35
|
scope :applied, lambda {
|
@@ -227,6 +229,10 @@ module Spree
|
|
227
229
|
end
|
228
230
|
end
|
229
231
|
|
232
|
+
def normalize_code
|
233
|
+
self.code = code.strip if code.present?
|
234
|
+
end
|
235
|
+
|
230
236
|
def match_all?
|
231
237
|
match_policy == 'all'
|
232
238
|
end
|
@@ -1,15 +1,16 @@
|
|
1
1
|
module Spree
|
2
2
|
module PromotionHandler
|
3
3
|
class PromotionDuplicator
|
4
|
-
def initialize(promotion)
|
4
|
+
def initialize(promotion, random_string: nil)
|
5
5
|
@promotion = promotion
|
6
|
+
@random_string = random_string || generate_random_string(4)
|
6
7
|
end
|
7
8
|
|
8
9
|
def duplicate
|
9
10
|
@new_promotion = @promotion.dup
|
10
|
-
@new_promotion.path = "#{@promotion.path}
|
11
|
+
@new_promotion.path = "#{@promotion.path}_#{@random_string}"
|
11
12
|
@new_promotion.name = "New #{@promotion.name}"
|
12
|
-
@new_promotion.code = "#{@promotion.code}
|
13
|
+
@new_promotion.code = "#{@promotion.code}_#{@random_string}"
|
13
14
|
|
14
15
|
ActiveRecord::Base.transaction do
|
15
16
|
@new_promotion.save
|
@@ -33,6 +34,11 @@ module Spree
|
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
37
|
+
def generate_random_string(number)
|
38
|
+
charset = Array('A'..'Z') + Array('a'..'z')
|
39
|
+
Array.new(number) { charset.sample }.join
|
40
|
+
end
|
41
|
+
|
36
42
|
def copy_actions
|
37
43
|
@promotion.promotion_actions.each do |action|
|
38
44
|
new_action = action.dup
|
data/app/models/spree/store.rb
CHANGED
@@ -18,6 +18,9 @@ module Spree
|
|
18
18
|
end
|
19
19
|
|
20
20
|
has_one_attached :logo
|
21
|
+
has_one_attached :mailer_logo
|
22
|
+
|
23
|
+
validates :mailer_logo, content_type: ['image/png', 'image/jpg', 'image/jpeg']
|
21
24
|
|
22
25
|
before_save :ensure_default_exists_and_is_unique
|
23
26
|
before_destroy :validate_not_default
|
@@ -3,13 +3,14 @@ module Spree
|
|
3
3
|
include Rails.application.routes.url_helpers
|
4
4
|
include Spree::BaseHelper
|
5
5
|
|
6
|
-
attr_reader :current_currency, :current_price_options
|
6
|
+
attr_reader :current_currency, :current_price_options, :current_store
|
7
7
|
|
8
8
|
def initialize(opts = {})
|
9
9
|
@variants = opts[:variants]
|
10
10
|
@is_product_available_in_currency = opts[:is_product_available_in_currency]
|
11
11
|
@current_currency = opts[:current_currency]
|
12
12
|
@current_price_options = opts[:current_price_options]
|
13
|
+
@current_store = opts[:current_store]
|
13
14
|
end
|
14
15
|
|
15
16
|
def call
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Spree
|
2
|
+
module Account
|
3
|
+
module Addresses
|
4
|
+
class Base
|
5
|
+
prepend Spree::ServiceModule::Base
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
attr_accessor :country
|
10
|
+
|
11
|
+
def fill_country_and_state_ids(params)
|
12
|
+
replace_country_iso_with_id(params)
|
13
|
+
fill_state_id(params)
|
14
|
+
end
|
15
|
+
|
16
|
+
def replace_country_iso_with_id(params)
|
17
|
+
iso = params[:country_iso]
|
18
|
+
return params unless iso.present?
|
19
|
+
|
20
|
+
country = Spree::Country.by_iso(iso)
|
21
|
+
params[:country_id] = country&.id
|
22
|
+
params.delete(:country_iso)
|
23
|
+
params
|
24
|
+
end
|
25
|
+
|
26
|
+
def fill_state_id(params)
|
27
|
+
state_name = params[:state_name]
|
28
|
+
return params unless state_name.present?
|
29
|
+
|
30
|
+
country ||= Spree::Country.find(params[:country_id]) if params[:country_id].present?
|
31
|
+
return params unless country
|
32
|
+
|
33
|
+
params[:state_id] = country.states.find_by(name: state_name)&.id
|
34
|
+
params
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Spree
|
2
|
+
module Account
|
3
|
+
module Addresses
|
4
|
+
class Create < ::Spree::Account::Addresses::Base
|
5
|
+
def call(user:, address_params:)
|
6
|
+
fill_country_and_state_ids(address_params)
|
7
|
+
|
8
|
+
address = user.addresses.new(address_params)
|
9
|
+
if address.save
|
10
|
+
success(address)
|
11
|
+
else
|
12
|
+
failure(address)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Spree
|
2
|
+
module Account
|
3
|
+
module Addresses
|
4
|
+
class Update < ::Spree::Account::Addresses::Base
|
5
|
+
def call(address:, address_params:)
|
6
|
+
address_params[:country_id] ||= address.country_id
|
7
|
+
fill_country_and_state_ids(address_params)
|
8
|
+
|
9
|
+
if address.update(address_params)
|
10
|
+
success(address)
|
11
|
+
else
|
12
|
+
failure(address)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -4,8 +4,12 @@ module Spree
|
|
4
4
|
prepend Spree::ServiceModule::Base
|
5
5
|
|
6
6
|
def call(order:, params:, permitted_attributes:, request_env:)
|
7
|
-
|
8
|
-
|
7
|
+
ship_changed = address_with_country_iso_present?(params, 'ship')
|
8
|
+
bill_changed = address_with_country_iso_present?(params, 'bill')
|
9
|
+
params = replace_country_iso_with_id(params, 'ship') if ship_changed
|
10
|
+
params = replace_country_iso_with_id(params, 'bill') if bill_changed
|
11
|
+
order.state = 'address' if (ship_changed || bill_changed) && order.has_checkout_step?('address')
|
12
|
+
order.state = 'delivery' if selected_shipping_rate_present?(params) && order.has_checkout_step?('delivery')
|
9
13
|
return success(order) if order.update_from_params(params, permitted_attributes, request_env)
|
10
14
|
|
11
15
|
failure(order)
|
@@ -20,6 +24,13 @@ module Spree
|
|
20
24
|
true
|
21
25
|
end
|
22
26
|
|
27
|
+
def selected_shipping_rate_present?(params)
|
28
|
+
shipments_attributes = params.dig(:order, :shipments_attributes)
|
29
|
+
return false unless shipments_attributes
|
30
|
+
|
31
|
+
shipments_attributes.any? { |s| s.dig(:selected_shipping_rate_id) }
|
32
|
+
end
|
33
|
+
|
23
34
|
def replace_country_iso_with_id(params, address_kind = 'ship')
|
24
35
|
country_id = Spree::Country.by_iso(params[:order]["#{address_kind}_address_attributes"].fetch(:country_iso))&.id
|
25
36
|
|
data/config/locales/en.yml
CHANGED
@@ -13,6 +13,7 @@ en:
|
|
13
13
|
activerecord:
|
14
14
|
attributes:
|
15
15
|
spree/address:
|
16
|
+
label: Address name
|
16
17
|
address1: Address
|
17
18
|
address2: Address (contd.)
|
18
19
|
city: City
|
@@ -502,10 +503,14 @@ en:
|
|
502
503
|
address_book:
|
503
504
|
other_address: "Other address"
|
504
505
|
add_new_shipping_address: "Add new address"
|
505
|
-
|
506
|
-
|
506
|
+
label: Address Name
|
507
|
+
address_name_label: Address Name
|
508
|
+
address_name_placeholder: Give this address a unique name (Work, Home, etc.)
|
509
|
+
new_address: "New Address"
|
510
|
+
edit_address: "Edit Address"
|
511
|
+
remove_address: Remove Address
|
507
512
|
no_shipping_addresses_on_file: "No addresses on file"
|
508
|
-
|
513
|
+
addresses: "Addresses"
|
509
514
|
successfully_created: "Address has been successfully created."
|
510
515
|
successfully_removed: "Address has been successfully removed."
|
511
516
|
successfully_saved: "Saved successfully"
|
@@ -945,6 +950,7 @@ en:
|
|
945
950
|
fields: Fields
|
946
951
|
language: Language
|
947
952
|
country: Country
|
953
|
+
default_country: Default Country
|
948
954
|
localization_settings: Localization Settings
|
949
955
|
only_incomplete: Only incomplete
|
950
956
|
only_complete: Only complete
|
@@ -1036,6 +1042,7 @@ en:
|
|
1036
1042
|
make_refund: Make refund
|
1037
1043
|
make_sure_the_above_reimbursement_amount_is_correct: Make sure the above reimbursement amount is correct
|
1038
1044
|
mail_from_address: Mail from address
|
1045
|
+
mailer_logo: Mailer logo (JPG or PNG images only)
|
1039
1046
|
manage_promotion_categories: Manage Promotion Categories
|
1040
1047
|
manual_intervention_required: Manual intervention required
|
1041
1048
|
manage_variants: Manage Variants
|
@@ -1637,7 +1644,7 @@ en:
|
|
1637
1644
|
stock_transfer:
|
1638
1645
|
errors:
|
1639
1646
|
must_have_variant: You must add at least one variant.
|
1640
|
-
variants_unavailable: "Some variants are not available on %{stock}"
|
1647
|
+
variants_unavailable: "Some variants are not available on %{stock}"
|
1641
1648
|
stock_transfers: Stock Transfers
|
1642
1649
|
stop: Stop
|
1643
1650
|
store: Store
|
@@ -1,18 +1,24 @@
|
|
1
1
|
require 'carmen'
|
2
2
|
|
3
|
+
EXCLUDED_COUNTRIES = ['AQ', 'AX', 'GS', 'UM', 'HM', 'IO', 'EH', 'BV', 'TF'].freeze
|
4
|
+
|
3
5
|
Carmen::Country.all.each do |country|
|
6
|
+
# Skip the creation of some territories, uninhabited islands and the Antarctic.
|
7
|
+
next if EXCLUDED_COUNTRIES.include?(country.alpha_2_code)
|
8
|
+
|
4
9
|
Spree::Country.where(
|
5
10
|
name: country.name,
|
6
11
|
iso3: country.alpha_3_code,
|
7
12
|
iso: country.alpha_2_code,
|
8
13
|
iso_name: country.name.upcase,
|
9
|
-
numcode: country.numeric_code
|
10
|
-
states_required: country.subregions?
|
14
|
+
numcode: country.numeric_code
|
11
15
|
).first_or_create
|
12
16
|
end
|
13
17
|
|
14
18
|
Spree::Config[:default_country_id] = Spree::Country.find_by(iso: 'US').id
|
15
19
|
|
16
|
-
#
|
17
|
-
|
20
|
+
# Find countries that do not use postal codes (by iso) and set 'zipcode_required' to false for them.
|
18
21
|
Spree::Country.where(iso: Spree::Address::NO_ZIPCODE_ISO_CODES).update_all(zipcode_required: false)
|
22
|
+
|
23
|
+
# Find all countries that require a state (province) at checkout and set 'states_required' to true.
|
24
|
+
Spree::Country.where(iso: Spree::Address::STATES_REQUIRED).update_all(states_required: true)
|
data/db/default/spree/states.rb
CHANGED
@@ -1,12 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
EXCLUDED_US_STATES = ['UM', 'AS', 'MP', 'VI', 'PR', 'GU'].freeze
|
4
|
+
EXCLUDED_CN_STATES = ['HK', 'MO', 'TW'].freeze
|
5
|
+
|
6
|
+
def state_level(country, subregion)
|
7
|
+
country.states.where(
|
8
|
+
name: subregion.name,
|
9
|
+
abbr: subregion.code
|
10
|
+
).first_or_create
|
11
|
+
end
|
12
|
+
|
13
|
+
def province_level(country, subregion)
|
14
|
+
subregion.subregions.each do |province|
|
15
|
+
country.states.where(
|
16
|
+
name: province.name,
|
17
|
+
abbr: province.code
|
18
|
+
).first_or_create
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
1
22
|
Spree::Country.where(states_required: true).each do |country|
|
2
23
|
carmen_country = Carmen::Country.named(country.name)
|
3
24
|
next unless carmen_country
|
4
25
|
|
5
26
|
carmen_country.subregions.each do |subregion|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
27
|
+
if carmen_country.alpha_2_code == 'US'
|
28
|
+
# Produces 50 states, one postal district (Washington DC)
|
29
|
+
# and 3 APO's as you would expect to see on any good U.S. states list.
|
30
|
+
next if EXCLUDED_US_STATES.include?(subregion.code)
|
31
|
+
|
32
|
+
state_level(country, subregion)
|
33
|
+
elsif carmen_country.alpha_2_code == 'CA' || carmen_country.alpha_2_code == 'MX'
|
34
|
+
# Force Canada and Mexico to use state-level data import from Carmen Gem
|
35
|
+
# else we pull in a subset of provinces that are not common at checkout.
|
36
|
+
state_level(country, subregion)
|
37
|
+
elsif carmen_country.alpha_2_code == 'CN'
|
38
|
+
# Removes 3 "States" from that list that are also listed as Countries,
|
39
|
+
# Hong Kong, Taiwan and Macao
|
40
|
+
next if EXCLUDED_CN_STATES.include?(subregion.code)
|
41
|
+
|
42
|
+
state_level(country, subregion)
|
43
|
+
elsif subregion.subregions?
|
44
|
+
province_level(country, subregion)
|
45
|
+
else
|
46
|
+
state_level(country, subregion)
|
47
|
+
end
|
11
48
|
end
|
12
49
|
end
|
data/db/default/spree/stores.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
default_store = Spree::Store.default
|
2
|
+
|
3
|
+
if default_store.persisted?
|
4
|
+
default_store.update!(default_country_id: Spree::Config[:default_country_id])
|
5
|
+
else
|
3
6
|
Spree::Store.new do |s|
|
4
|
-
s.name
|
5
|
-
s.code
|
6
|
-
s.url
|
7
|
-
s.mail_from_address
|
8
|
-
s.customer_support_email
|
9
|
-
s.default_currency
|
10
|
-
s.
|
11
|
-
s.
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
s.
|
7
|
+
s.name = 'Spree Demo Site'
|
8
|
+
s.code = 'spree'
|
9
|
+
s.url = Rails.application.routes.default_url_options[:host] || 'demo.spreecommerce.org'
|
10
|
+
s.mail_from_address = 'no-reply@example.com'
|
11
|
+
s.customer_support_email = 'support@example.com'
|
12
|
+
s.default_currency = 'USD'
|
13
|
+
s.default_country_id = Spree::Config[:default_country_id]
|
14
|
+
s.seo_title = 'Spree Commerce Demo Shop'
|
15
|
+
s.meta_description = 'This is the new Spree UX DEMO | OVERVIEW: http://bit.ly/new-spree-ux | DOCS: http://bit.ly/spree-ux-customization-docs | CONTACT: https://spreecommerce.org/contact/'
|
16
|
+
s.facebook = 'spreecommerce'
|
17
|
+
s.twitter = 'spreecommerce'
|
18
|
+
s.instagram = 'spreecommerce'
|
15
19
|
end.save!
|
16
20
|
end
|
data/db/default/spree/zones.rb
CHANGED
@@ -16,7 +16,7 @@ end
|
|
16
16
|
middle_east.zone_members.where(zoneable: Spree::Country.find_by!(iso: name)).first_or_create!
|
17
17
|
end
|
18
18
|
|
19
|
-
%w(AF AM AZ BH BD BT BN KH CN CX CC
|
19
|
+
%w(AF AM AZ BH BD BT BN KH CN CX CC GE HK IN ID IR IQ IL JP JO KZ KW KG LA LB MO MY MV MN MM NP
|
20
20
|
KP OM PK PS PH QA SA SG KR LK SY TW TJ TH TR TM AE UZ VN YE).each do |name|
|
21
21
|
asia.zone_members.where(zoneable: Spree::Country.find_by!(iso: name)).first_or_create!
|
22
22
|
end
|
data/lib/spree/core.rb
CHANGED
@@ -13,6 +13,7 @@ require 'premailer/rails'
|
|
13
13
|
require 'ransack'
|
14
14
|
require 'responders'
|
15
15
|
require 'state_machines-activerecord'
|
16
|
+
require 'active_storage_validations'
|
16
17
|
|
17
18
|
# This is required because ActiveModel::Validations#invalid? conflicts with the
|
18
19
|
# invalid state of a Payment. In the future this should be removed.
|
@@ -52,10 +52,15 @@ module Spree
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def set_current_order
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
return unless try_spree_current_user && current_order
|
56
|
+
|
57
|
+
orders_scope = try_spree_current_user.orders.
|
58
|
+
incomplete.
|
59
|
+
where.not(id: current_order.id).
|
60
|
+
where(store_id: current_store.id)
|
61
|
+
|
62
|
+
orders_scope.each do |order|
|
63
|
+
current_order.merge!(order, try_spree_current_user)
|
59
64
|
end
|
60
65
|
end
|
61
66
|
|
data/lib/spree/core/version.rb
CHANGED
@@ -33,7 +33,7 @@ module Spree
|
|
33
33
|
:id, :firstname, :lastname, :first_name, :last_name,
|
34
34
|
:address1, :address2, :city, :country_iso, :country_id, :state_id,
|
35
35
|
:zipcode, :phone, :state_name, :alternative_phone, :company,
|
36
|
-
:user_id, :deleted_at,
|
36
|
+
:user_id, :deleted_at, :label,
|
37
37
|
country: [:iso, :name, :iso3, :iso_name],
|
38
38
|
state: [:name, :abbr]
|
39
39
|
]
|
@@ -101,7 +101,7 @@ module Spree
|
|
101
101
|
:customer_support_email, :facebook, :twitter, :instagram,
|
102
102
|
:description, :address, :contact_email, :contact_phone,
|
103
103
|
:default_locale, :default_country_id, :supported_currencies,
|
104
|
-
:new_order_notifications_email]
|
104
|
+
:new_order_notifications_email, :mailer_logo]
|
105
105
|
|
106
106
|
@@store_credit_attributes = %i[amount currency category_id memo]
|
107
107
|
|
data/spree_core.gemspec
CHANGED
@@ -50,6 +50,7 @@ Gem::Specification.new do |s|
|
|
50
50
|
s.add_dependency 'sprockets-rails'
|
51
51
|
s.add_dependency 'mini_magick', '>= 4.9.4', '< 4.11.0'
|
52
52
|
s.add_dependency 'image_processing', '~> 1.2'
|
53
|
+
s.add_dependency 'active_storage_validations', '~> 0.9'
|
53
54
|
|
54
55
|
s.add_development_dependency 'email_spec', '~> 2.2'
|
55
56
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.2.0.
|
4
|
+
version: 4.2.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Schofield
|
8
8
|
- Spark Solutions
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-
|
12
|
+
date: 2020-10-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemerchant
|
@@ -377,6 +377,20 @@ dependencies:
|
|
377
377
|
- - "~>"
|
378
378
|
- !ruby/object:Gem::Version
|
379
379
|
version: '1.2'
|
380
|
+
- !ruby/object:Gem::Dependency
|
381
|
+
name: active_storage_validations
|
382
|
+
requirement: !ruby/object:Gem::Requirement
|
383
|
+
requirements:
|
384
|
+
- - "~>"
|
385
|
+
- !ruby/object:Gem::Version
|
386
|
+
version: '0.9'
|
387
|
+
type: :runtime
|
388
|
+
prerelease: false
|
389
|
+
version_requirements: !ruby/object:Gem::Requirement
|
390
|
+
requirements:
|
391
|
+
- - "~>"
|
392
|
+
- !ruby/object:Gem::Version
|
393
|
+
version: '0.9'
|
380
394
|
- !ruby/object:Gem::Dependency
|
381
395
|
name: email_spec
|
382
396
|
requirement: !ruby/object:Gem::Requirement
|
@@ -407,6 +421,7 @@ files:
|
|
407
421
|
- app/assets/images/noimage/small.png
|
408
422
|
- app/assets/javascripts/spree.js
|
409
423
|
- app/controllers/spree/base_controller.rb
|
424
|
+
- app/finders/spree/addresses/find.rb
|
410
425
|
- app/finders/spree/countries/find.rb
|
411
426
|
- app/finders/spree/credit_cards/find.rb
|
412
427
|
- app/finders/spree/line_items/find_by_variant.rb
|
@@ -620,6 +635,9 @@ files:
|
|
620
635
|
- app/presenters/spree/variant_presenter.rb
|
621
636
|
- app/presenters/spree/variants/option_types_presenter.rb
|
622
637
|
- app/presenters/spree/variants/options_presenter.rb
|
638
|
+
- app/services/spree/account/addresses/base.rb
|
639
|
+
- app/services/spree/account/addresses/create.rb
|
640
|
+
- app/services/spree/account/addresses/update.rb
|
623
641
|
- app/services/spree/cart/add_item.rb
|
624
642
|
- app/services/spree/cart/create.rb
|
625
643
|
- app/services/spree/cart/estimate_shipping_rates.rb
|
@@ -956,7 +974,9 @@ files:
|
|
956
974
|
- db/migrate/20200513154939_add_show_property_to_spree_product_properties.rb
|
957
975
|
- db/migrate/20200607161221_add_store_owner_order_notification_delivered_to_spree_orders.rb
|
958
976
|
- db/migrate/20200607161222_add_new_order_notifications_email_to_spree_stores.rb
|
977
|
+
- db/migrate/20200610113542_add_label_to_spree_addresses.rb
|
959
978
|
- db/migrate/20200826075557_add_unique_index_on_taxon_id_and_product_id_to_spree_products_taxons.rb
|
979
|
+
- db/migrate/20201013084504_add_seo_robots_to_spree_stores.rb
|
960
980
|
- db/seeds.rb
|
961
981
|
- lib/friendly_id/slug_rails5_patch.rb
|
962
982
|
- lib/generators/spree/custom_user/custom_user_generator.rb
|
@@ -1108,10 +1128,10 @@ licenses:
|
|
1108
1128
|
- BSD-3-Clause
|
1109
1129
|
metadata:
|
1110
1130
|
bug_tracker_uri: https://github.com/spree/spree/issues
|
1111
|
-
changelog_uri: https://github.com/spree/spree/releases/tag/v4.2.0.
|
1131
|
+
changelog_uri: https://github.com/spree/spree/releases/tag/v4.2.0.rc1
|
1112
1132
|
documentation_uri: https://guides.spreecommerce.org/
|
1113
|
-
source_code_uri: https://github.com/spree/spree/tree/v4.2.0.
|
1114
|
-
post_install_message:
|
1133
|
+
source_code_uri: https://github.com/spree/spree/tree/v4.2.0.rc1
|
1134
|
+
post_install_message:
|
1115
1135
|
rdoc_options: []
|
1116
1136
|
require_paths:
|
1117
1137
|
- lib
|
@@ -1126,8 +1146,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1126
1146
|
- !ruby/object:Gem::Version
|
1127
1147
|
version: 1.8.23
|
1128
1148
|
requirements: []
|
1129
|
-
rubygems_version: 3.1.
|
1130
|
-
signing_key:
|
1149
|
+
rubygems_version: 3.1.4
|
1150
|
+
signing_key:
|
1131
1151
|
specification_version: 4
|
1132
1152
|
summary: The bare bones necessary for Spree.
|
1133
1153
|
test_files: []
|