spree_core 4.1.10 → 4.2.0.rc2
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/controllers/spree/base_controller.rb +1 -0
- data/app/helpers/spree/base_helper.rb +61 -14
- data/app/helpers/spree/mail_helper.rb +29 -0
- data/app/helpers/spree/products_helper.rb +2 -1
- data/app/mailers/spree/base_mailer.rb +17 -3
- data/app/mailers/spree/order_mailer.rb +11 -2
- data/app/mailers/spree/reimbursement_mailer.rb +4 -2
- data/app/mailers/spree/shipment_mailer.rb +4 -2
- data/app/models/concerns/spree/default_price.rb +2 -1
- data/app/models/concerns/spree/user_methods.rb +11 -5
- data/app/models/concerns/spree/user_payment_source.rb +1 -1
- data/app/models/spree/address.rb +13 -1
- data/app/models/spree/adjustment.rb +1 -0
- data/app/models/spree/app_configuration.rb +4 -0
- data/app/models/spree/credit_card.rb +5 -0
- data/app/models/spree/line_item.rb +12 -2
- data/app/models/spree/log_entry.rb +1 -1
- data/app/models/spree/option_type.rb +7 -1
- data/app/models/spree/order.rb +33 -7
- data/app/models/spree/order/address_book.rb +7 -20
- data/app/models/spree/order/payments.rb +10 -2
- data/app/models/spree/preferences/store.rb +1 -1
- data/app/models/spree/price.rb +26 -2
- data/app/models/spree/product.rb +17 -7
- data/app/models/spree/promotion.rb +10 -15
- data/app/models/spree/promotion_handler/coupon.rb +2 -3
- data/app/models/spree/promotion_handler/promotion_duplicator.rb +9 -3
- data/app/models/spree/reimbursement.rb +2 -0
- data/app/models/spree/shipment.rb +2 -5
- data/app/models/spree/stock_location.rb +13 -2
- data/app/models/spree/store.rb +27 -2
- data/app/models/spree/variant.rb +15 -2
- data/app/models/spree/zone.rb +4 -0
- data/app/presenters/spree/variant_presenter.rb +9 -1
- data/app/presenters/spree/variants/option_types_presenter.rb +1 -0
- data/app/views/layouts/spree/base_mailer.html.erb +45 -40
- data/app/views/spree/order_mailer/cancel_email.html.erb +19 -25
- data/app/views/spree/order_mailer/cancel_email.text.erb +24 -2
- data/app/views/spree/order_mailer/confirm_email.html.erb +18 -65
- data/app/views/spree/order_mailer/confirm_email.text.erb +2 -1
- data/app/views/spree/order_mailer/store_owner_notification_email.html.erb +23 -0
- data/app/views/spree/order_mailer/store_owner_notification_email.text.erb +38 -0
- data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +53 -58
- data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +3 -1
- data/app/views/spree/shared/_base_mailer_footer.html.erb +6 -14
- data/app/views/spree/shared/_base_mailer_header.html.erb +12 -32
- data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +293 -625
- data/app/views/spree/shared/_purchased_items_table.html.erb +60 -0
- data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +13 -0
- data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +27 -0
- data/app/views/spree/shared/purchased_items_table/_subtotal.html.erb +13 -0
- data/app/views/spree/shared/purchased_items_table/_total.html.erb +13 -0
- data/app/views/spree/shipment_mailer/shipped_email.html.erb +31 -36
- data/app/views/spree/shipment_mailer/shipped_email.text.erb +2 -1
- data/config/initializers/assets.rb +1 -0
- data/config/locales/en.yml +125 -16
- data/db/default/spree/countries.rb +10 -4
- data/db/default/spree/states.rb +42 -5
- data/db/default/spree/stores.rb +17 -12
- data/db/default/spree/zones.rb +1 -1
- data/db/migrate/20140309033438_create_store_from_preferences.rb +1 -1
- data/db/migrate/20191017121054_add_supported_currencies_to_store.rb +10 -0
- data/db/migrate/20200102141311_add_social_to_spree_stores.rb +3 -0
- data/db/migrate/20200308210757_add_default_locale_to_spree_store.rb +7 -0
- data/db/migrate/20200310145140_add_customer_support_email_to_spree_store.rb +7 -0
- data/db/migrate/20200421095017_add_compare_at_amount_to_spree_prices.rb +7 -0
- data/db/migrate/20200423123001_add_default_country_id_to_spree_store.rb +9 -0
- data/db/migrate/20200430072209_add_footer_fields_to_spree_stores.rb +8 -0
- data/db/migrate/20200513154939_add_show_property_to_spree_product_properties.rb +5 -0
- data/db/migrate/20200607161221_add_store_owner_order_notification_delivered_to_spree_orders.rb +7 -0
- data/db/migrate/20200607161222_add_new_order_notifications_email_to_spree_stores.rb +7 -0
- data/db/migrate/20200610113542_add_label_to_spree_addresses.rb +5 -0
- data/db/migrate/20200826075557_add_unique_index_on_taxon_id_and_product_id_to_spree_products_taxons.rb +5 -0
- data/db/migrate/20201006110150_add_checkout_zone_field_to_store.rb +12 -0
- data/db/migrate/20201012091259_add_filterable_column_to_spree_option_types.rb +6 -0
- data/db/migrate/20201013084504_add_seo_robots_to_spree_stores.rb +5 -0
- data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -2
- data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -2
- data/lib/generators/spree/mailers_preview/mailers_preview_generator.rb +23 -0
- data/lib/generators/spree/mailers_preview/templates/mailers/previews/order_preview.rb +13 -0
- data/lib/generators/spree/mailers_preview/templates/mailers/previews/reimbursement_preview.rb +5 -0
- data/lib/generators/spree/mailers_preview/templates/mailers/previews/shipment_preview.rb +5 -0
- data/lib/generators/spree/mailers_preview/templates/mailers/previews/user_preview.rb +11 -0
- data/lib/spree/core.rb +2 -0
- data/lib/spree/core/controller_helpers/common.rb +1 -0
- data/lib/spree/core/controller_helpers/currency_helpers.rb +15 -0
- data/lib/spree/core/controller_helpers/order.rb +9 -4
- data/lib/spree/core/controller_helpers/store.rb +12 -1
- data/lib/spree/core/importer/order.rb +9 -9
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/permitted_attributes.rb +8 -5
- data/lib/spree/testing_support/authorization_helpers.rb +7 -4
- data/lib/spree/testing_support/factories/promotion_factory.rb +29 -17
- data/lib/spree/testing_support/factories/store_factory.rb +11 -8
- data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
- data/lib/spree/testing_support/i18n.rb +1 -1
- data/spree_core.gemspec +6 -5
- data/vendor/assets/javascripts/cleave.js +1669 -0
- metadata +57 -16
- data/app/views/spree/order_mailer/_adjustment.html.erb +0 -8
- data/app/views/spree/order_mailer/_subtotal.html.erb +0 -8
- data/app/views/spree/order_mailer/_total.html.erb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c4aedf602c42650159969df6a8bc7f450fd1c68f6d93d2a40ff8635f691b5be
|
4
|
+
data.tar.gz: 41c8433179fb96ecb5ea01dd0b7f35cf600652531f8bdebdb837e24977cf795f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f3c60e7a972db6b1a2747b06485210904a431959eda4bdf5e9b0948207b5352bbff1b9fca5c414ac68b03d872301fb8aaffdbb1aef8b61777c51c5fa927b0c1
|
7
|
+
data.tar.gz: 15fa837cab8e2f12a409ff45432206e01f3d54211545b52c3ae26c0291baa2ee40cd8f49edaccdb9d6914411b8bacff269abc91993968741b959d555b8bdab30
|
@@ -7,6 +7,7 @@ class Spree::BaseController < ApplicationController
|
|
7
7
|
include Spree::Core::ControllerHelpers::Search
|
8
8
|
include Spree::Core::ControllerHelpers::Store
|
9
9
|
include Spree::Core::ControllerHelpers::StrongParameters
|
10
|
+
include Spree::Core::ControllerHelpers::CurrencyHelpers
|
10
11
|
|
11
12
|
respond_to :html
|
12
13
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
module BaseHelper
|
3
3
|
def available_countries
|
4
|
-
checkout_zone = Spree::Zone.
|
4
|
+
checkout_zone = current_store.checkout_zone || Spree::Zone.default_checkout_zone
|
5
5
|
|
6
6
|
countries = if checkout_zone && checkout_zone.kind == 'country'
|
7
7
|
checkout_zone.country_list
|
@@ -22,6 +22,13 @@ module Spree
|
|
22
22
|
to_html
|
23
23
|
end
|
24
24
|
|
25
|
+
def display_compare_at_price(product_or_variant)
|
26
|
+
product_or_variant.
|
27
|
+
price_in(current_currency).
|
28
|
+
display_compare_at_price_including_vat_for(current_price_options).
|
29
|
+
to_html
|
30
|
+
end
|
31
|
+
|
25
32
|
def link_to_tracking(shipment, options = {})
|
26
33
|
return unless shipment.tracking && shipment.shipping_method
|
27
34
|
|
@@ -34,7 +41,15 @@ module Spree
|
|
34
41
|
end
|
35
42
|
end
|
36
43
|
|
37
|
-
def logo(image_path =
|
44
|
+
def logo(image_path = nil, options = {})
|
45
|
+
image_path ||= if current_store.logo.attached? && current_store.logo.variable?
|
46
|
+
main_app.url_for(current_store.logo.variant(resize: '244x104>'))
|
47
|
+
elsif current_store.logo.attached? && current_store.logo.image?
|
48
|
+
main_app.url_for(current_store.logo)
|
49
|
+
else
|
50
|
+
Spree::Config[:logo]
|
51
|
+
end
|
52
|
+
|
38
53
|
path = spree.respond_to?(:root_path) ? spree.root_path : main_app.root_path
|
39
54
|
|
40
55
|
link_to path, 'aria-label': current_store.name, method: options[:method] do
|
@@ -42,8 +57,33 @@ module Spree
|
|
42
57
|
end
|
43
58
|
end
|
44
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
|
+
|
45
86
|
def meta_data
|
46
|
-
object = instance_variable_get('@' + controller_name.singularize)
|
47
87
|
meta = {}
|
48
88
|
|
49
89
|
if object.is_a? ApplicationRecord
|
@@ -67,16 +107,10 @@ module Spree
|
|
67
107
|
meta
|
68
108
|
end
|
69
109
|
|
70
|
-
def
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
image = default_image_for_product_or_variant(object)
|
75
|
-
image&.attachment.present? ? main_app.url_for(image.attachment) : asset_path(Spree::Config[:logo])
|
76
|
-
end
|
77
|
-
|
78
|
-
def meta_image_data_tag
|
79
|
-
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")
|
80
114
|
end
|
81
115
|
|
82
116
|
def meta_data_tags
|
@@ -97,7 +131,13 @@ module Spree
|
|
97
131
|
def pretty_time(time)
|
98
132
|
return '' if time.blank?
|
99
133
|
|
100
|
-
[I18n.l(time.to_date, format: :long), time.strftime('%l:%M %p')].join(' ')
|
134
|
+
[I18n.l(time.to_date, format: :long), time.strftime('%l:%M %p %Z')].join(' ')
|
135
|
+
end
|
136
|
+
|
137
|
+
def pretty_date(date)
|
138
|
+
return '' if date.blank?
|
139
|
+
|
140
|
+
[I18n.l(date.to_date, format: :long)].join(' ')
|
101
141
|
end
|
102
142
|
|
103
143
|
def seo_url(taxon, options = nil)
|
@@ -168,5 +208,12 @@ module Spree
|
|
168
208
|
style if style.in? Spree::Image.styles.with_indifferent_access
|
169
209
|
end
|
170
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
|
171
218
|
end
|
172
219
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Spree
|
2
|
+
module MailHelper
|
3
|
+
include BaseHelper
|
4
|
+
|
5
|
+
def variant_image_url(variant)
|
6
|
+
image = default_image_for_product_or_variant(variant)
|
7
|
+
image ? main_app.url_for(image.url(:small)) : 'noimage/small.png'
|
8
|
+
end
|
9
|
+
|
10
|
+
def name_for(order)
|
11
|
+
order.name || Spree.t('customer')
|
12
|
+
end
|
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
|
+
|
22
|
+
def logo_path
|
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?
|
27
|
+
end
|
28
|
+
end
|
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
|
|
@@ -1,10 +1,18 @@
|
|
1
1
|
module Spree
|
2
2
|
class BaseMailer < ActionMailer::Base
|
3
|
+
add_template_helper(MailHelper)
|
4
|
+
|
5
|
+
def current_store
|
6
|
+
@current_store ||= Spree::Store.current
|
7
|
+
end
|
8
|
+
helper_method :current_store
|
9
|
+
|
3
10
|
def from_address
|
4
|
-
|
11
|
+
@order&.store&.mail_from_address || current_store.mail_from_address
|
5
12
|
end
|
6
13
|
|
7
|
-
def money(amount, currency =
|
14
|
+
def money(amount, currency = nil)
|
15
|
+
currency ||= current_store.default_currency
|
8
16
|
Spree::Money.new(amount, currency: currency).to_s
|
9
17
|
end
|
10
18
|
helper_method :money
|
@@ -16,6 +24,7 @@ module Spree
|
|
16
24
|
|
17
25
|
def mail(headers = {}, &block)
|
18
26
|
ensure_default_action_mailer_url_host
|
27
|
+
set_email_locale
|
19
28
|
super if Spree::Config[:send_core_emails]
|
20
29
|
end
|
21
30
|
|
@@ -26,7 +35,12 @@ module Spree
|
|
26
35
|
# http://guides.rubyonrails.org/action_mailer_basics.html#generating-urls-in-action-mailer-views
|
27
36
|
def ensure_default_action_mailer_url_host
|
28
37
|
ActionMailer::Base.default_url_options ||= {}
|
29
|
-
ActionMailer::Base.default_url_options[:host] ||=
|
38
|
+
ActionMailer::Base.default_url_options[:host] ||= current_store.url
|
39
|
+
end
|
40
|
+
|
41
|
+
def set_email_locale
|
42
|
+
locale = @order&.store&.default_locale || current_store&.default_locale
|
43
|
+
I18n.locale = locale if locale.present?
|
30
44
|
end
|
31
45
|
end
|
32
46
|
end
|
@@ -2,15 +2,24 @@ module Spree
|
|
2
2
|
class OrderMailer < BaseMailer
|
3
3
|
def confirm_email(order, resend = false)
|
4
4
|
@order = order.respond_to?(:id) ? order : Spree::Order.find(order)
|
5
|
+
current_store = @order.store
|
5
6
|
subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
|
6
|
-
subject += "#{
|
7
|
+
subject += "#{current_store.name} #{Spree.t('order_mailer.confirm_email.subject')} ##{@order.number}"
|
7
8
|
mail(to: @order.email, from: from_address, subject: subject)
|
8
9
|
end
|
9
10
|
|
11
|
+
def store_owner_notification_email(order)
|
12
|
+
@order = order.respond_to?(:id) ? order : Spree::Order.find(order)
|
13
|
+
current_store = @order.store
|
14
|
+
subject = Spree.t('order_mailer.store_owner_notification_email.subject', store_name: current_store.name)
|
15
|
+
mail(to: current_store.new_order_notifications_email, from: from_address, subject: subject)
|
16
|
+
end
|
17
|
+
|
10
18
|
def cancel_email(order, resend = false)
|
11
19
|
@order = order.respond_to?(:id) ? order : Spree::Order.find(order)
|
20
|
+
current_store = @order.store
|
12
21
|
subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
|
13
|
-
subject += "#{
|
22
|
+
subject += "#{current_store.name} #{Spree.t('order_mailer.cancel_email.subject')} ##{@order.number}"
|
14
23
|
mail(to: @order.email, from: from_address, subject: subject)
|
15
24
|
end
|
16
25
|
end
|
@@ -2,9 +2,11 @@ module Spree
|
|
2
2
|
class ReimbursementMailer < BaseMailer
|
3
3
|
def reimbursement_email(reimbursement, resend = false)
|
4
4
|
@reimbursement = reimbursement.respond_to?(:id) ? reimbursement : Spree::Reimbursement.find(reimbursement)
|
5
|
+
@order = @reimbursement.order
|
6
|
+
current_store = @reimbursement.store || Spree::Store.current
|
5
7
|
subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
|
6
|
-
subject += "#{
|
7
|
-
mail(to: @
|
8
|
+
subject += "#{current_store.name} #{Spree.t('reimbursement_mailer.reimbursement_email.subject')} ##{@order.number}"
|
9
|
+
mail(to: @order.email, from: current_store.mail_from_address, subject: subject)
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
@@ -2,9 +2,11 @@ module Spree
|
|
2
2
|
class ShipmentMailer < BaseMailer
|
3
3
|
def shipped_email(shipment, resend = false)
|
4
4
|
@shipment = shipment.respond_to?(:id) ? shipment : Spree::Shipment.find(shipment)
|
5
|
+
@order = @shipment.order
|
6
|
+
current_store = @shipment.store
|
5
7
|
subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
|
6
|
-
subject += "#{
|
7
|
-
mail(to: @
|
8
|
+
subject += "#{current_store.name} #{Spree.t('shipment_mailer.shipped_email.subject')} ##{@order.number}"
|
9
|
+
mail(to: @order.email, from: from_address, subject: subject)
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
@@ -9,7 +9,8 @@ module Spree
|
|
9
9
|
dependent: :destroy
|
10
10
|
|
11
11
|
delegate :display_price, :display_amount, :price, :currency, :price=,
|
12
|
-
:price_including_vat_for, :currency=,
|
12
|
+
:price_including_vat_for, :currency=, :display_compare_at_price,
|
13
|
+
:compare_at_price, :compare_at_price=, to: :find_or_build_default_price
|
13
14
|
|
14
15
|
after_save :save_default_price
|
15
16
|
|
@@ -30,15 +30,20 @@ module Spree
|
|
30
30
|
self.whitelisted_ransackable_associations = %w[bill_address ship_address]
|
31
31
|
self.whitelisted_ransackable_attributes = %w[id email]
|
32
32
|
|
33
|
+
def self.with_email(query)
|
34
|
+
where('email LIKE ?', "%#{query}%")
|
35
|
+
end
|
36
|
+
|
33
37
|
def self.with_address(query, address = :ship_address)
|
34
38
|
left_outer_joins(address).
|
35
39
|
where("#{Spree::Address.table_name}.firstname like ?", "%#{query}%").
|
36
40
|
or(left_outer_joins(address).where("#{Spree::Address.table_name}.lastname like ?", "%#{query}%"))
|
37
41
|
end
|
38
42
|
|
39
|
-
def self.
|
40
|
-
|
41
|
-
|
43
|
+
def self.with_email_or_address(email, address)
|
44
|
+
left_outer_joins(:addresses).
|
45
|
+
where("#{Spree::Address.table_name}.firstname LIKE ? or #{Spree::Address.table_name}.lastname LIKE ? or email LIKE ?",
|
46
|
+
"%#{address}%", "%#{address}%", "%#{email}%")
|
42
47
|
end
|
43
48
|
end
|
44
49
|
|
@@ -54,8 +59,9 @@ module Spree
|
|
54
59
|
first
|
55
60
|
end
|
56
61
|
|
57
|
-
def total_available_store_credit
|
58
|
-
|
62
|
+
def total_available_store_credit(currency = nil)
|
63
|
+
currency ||= Spree::Config[:currency]
|
64
|
+
store_credits.where(currency: currency).reload.to_a.sum(&:amount_remaining)
|
59
65
|
end
|
60
66
|
|
61
67
|
private
|
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
|
|
@@ -27,6 +27,7 @@ module Spree
|
|
27
27
|
belongs_to :source
|
28
28
|
end
|
29
29
|
belongs_to :order, class_name: 'Spree::Order', inverse_of: :all_adjustments
|
30
|
+
belongs_to :promotion_action, class_name: 'Spree::PromotionAction', foreign_key: :source_id, optional: true # created only for has_free_shipping?
|
30
31
|
|
31
32
|
validates :adjustable, :order, :label, presence: true
|
32
33
|
validates :amount, numericality: true
|
@@ -49,6 +49,7 @@ module Spree
|
|
49
49
|
preference :expedited_exchanges_days_window, :integer, default: 14 # the amount of days the customer has to return their item after the expedited exchange is shipped in order to avoid being charged
|
50
50
|
preference :layout, :string, default: 'spree/layouts/spree_application'
|
51
51
|
preference :logo, :string, default: 'logo/spree_50.png'
|
52
|
+
preference :mailer_logo, :string, default: 'logo/spree_50.png'
|
52
53
|
preference :max_level_in_taxons_menu, :integer, default: 1 # maximum nesting level in taxons menu
|
53
54
|
preference :products_per_page, :integer, default: 12
|
54
55
|
preference :require_master_price, :boolean, default: true
|
@@ -67,6 +68,9 @@ module Spree
|
|
67
68
|
preference :non_expiring_credit_types, :array, default: []
|
68
69
|
preference :credit_to_new_allocation, :boolean, default: false
|
69
70
|
|
71
|
+
# Multi currency configurations
|
72
|
+
preference :show_store_currency_selector, :boolean, default: false
|
73
|
+
|
70
74
|
# searcher_class allows spree extension writers to provide their own Search class
|
71
75
|
def searcher_class
|
72
76
|
@searcher_class ||= Spree::Core::Search::Base
|
@@ -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
|
@@ -57,7 +57,16 @@ module Spree
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def update_price
|
60
|
-
|
60
|
+
if Spree::Config.show_store_currency_selector == true
|
61
|
+
currency_price = Spree::Price.where(
|
62
|
+
currency: order.currency,
|
63
|
+
variant_id: variant_id
|
64
|
+
).first
|
65
|
+
|
66
|
+
self.price = currency_price.price_including_vat_for(tax_zone: tax_zone)
|
67
|
+
else
|
68
|
+
self.price = variant.price_including_vat_for(tax_zone: tax_zone)
|
69
|
+
end
|
61
70
|
end
|
62
71
|
|
63
72
|
def copy_tax_category
|
@@ -66,7 +75,8 @@ module Spree
|
|
66
75
|
|
67
76
|
extend DisplayMoney
|
68
77
|
money_methods :amount, :subtotal, :discounted_amount, :final_amount, :total, :price,
|
69
|
-
: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
|
70
80
|
|
71
81
|
alias single_money display_price
|
72
82
|
alias single_display_amount display_price
|