solidus_core 2.1.1 → 2.2.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of solidus_core might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Rakefile +0 -1
- data/app/assets/config/solidus_core_manifest.js +1 -0
- data/app/assets/javascripts/spree.js.erb +72 -0
- data/app/helpers/spree/store_helper.rb +5 -0
- data/app/jobs/spree/promotion_code_batch_job.rb +24 -0
- data/app/mailers/spree/promotion_code_batch_mailer.rb +13 -0
- data/app/models/concerns/spree/calculated_adjustments.rb +1 -1
- data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
- data/app/models/concerns/spree/user_address_book.rb +4 -4
- data/app/models/concerns/spree/user_methods.rb +7 -0
- data/app/models/concerns/spree/user_payment_source.rb +12 -5
- data/app/models/spree/address.rb +14 -3
- data/app/models/spree/adjustment.rb +13 -1
- data/app/models/spree/app_configuration.rb +0 -19
- data/app/models/spree/base.rb +2 -0
- data/app/models/spree/credit_card.rb +34 -43
- data/app/models/spree/gateway/bogus.rb +1 -1
- data/app/models/spree/gateway.rb +6 -4
- data/app/models/spree/inventory_unit.rb +3 -2
- data/app/models/spree/order/checkout.rb +187 -273
- data/app/models/spree/order.rb +137 -71
- data/app/models/spree/order_contents.rb +1 -1
- data/app/models/spree/order_inventory.rb +11 -11
- data/app/models/spree/order_promotion.rb +2 -0
- data/app/models/spree/order_update_attributes.rb +1 -8
- data/app/models/spree/order_updater.rb +67 -63
- data/app/models/spree/payment.rb +0 -1
- data/app/models/spree/payment_create.rb +27 -7
- data/app/models/spree/payment_method/store_credit.rb +3 -3
- data/app/models/spree/payment_method.rb +4 -1
- data/app/models/spree/payment_source.rb +45 -0
- data/app/models/spree/product/scopes.rb +24 -24
- data/app/models/spree/product.rb +4 -4
- data/app/models/spree/promotion.rb +2 -0
- data/app/models/spree/promotion_code/batch_builder.rb +63 -0
- data/app/models/spree/promotion_code.rb +1 -0
- data/app/models/spree/promotion_code_batch.rb +25 -0
- data/app/models/spree/promotion_handler/cart.rb +2 -2
- data/app/models/spree/promotion_handler/coupon.rb +1 -2
- data/app/models/spree/promotion_handler/free_shipping.rb +32 -21
- data/app/models/spree/promotion_handler/page.rb +1 -1
- data/app/models/spree/reimbursement.rb +1 -1
- data/app/models/spree/return_authorization.rb +0 -28
- data/app/models/spree/return_item.rb +1 -1
- data/app/models/spree/shipment.rb +4 -4
- data/app/models/spree/shipping_method.rb +2 -2
- data/app/models/spree/shipping_rate.rb +1 -1
- data/app/models/spree/stock/availability_validator.rb +16 -17
- data/app/models/spree/stock/coordinator.rb +3 -3
- data/app/models/spree/stock/package.rb +1 -1
- data/app/models/spree/stock/quantifier.rb +5 -4
- data/app/models/spree/stock_location.rb +2 -2
- data/app/models/spree/store.rb +2 -2
- data/app/models/spree/store_credit.rb +1 -1
- data/app/models/spree/tax/tax_helpers.rb +3 -3
- data/app/models/spree/tax_rate.rb +7 -1
- data/app/models/spree/taxonomy.rb +1 -1
- data/app/models/spree/variant/scopes.rb +5 -5
- data/app/models/spree/variant/vat_price_generator.rb +8 -5
- data/app/models/spree/variant.rb +1 -0
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +19 -10
- data/app/models/spree/wallet/default_payment_builder.rb +6 -6
- data/app/models/spree/wallet.rb +71 -0
- data/app/models/spree/wallet_payment_source.rb +17 -0
- data/app/models/spree/zone.rb +1 -1
- data/app/views/spree/carton_mailer/shipped_email.text.erb +1 -1
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +2 -0
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +2 -0
- data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +0 -7
- data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +0 -5
- data/app/views/spree/shared/_error_messages.html.erb +1 -1
- data/app/views/spree/shipment_mailer/shipped_email.html.erb +1 -1
- data/config/initializers/assets.rb +1 -1
- data/config/initializers/friendly_id.rb +1 -1
- data/config/locales/en.yml +50 -12
- data/db/default/spree/store_credit.rb +2 -1
- data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +4 -6
- data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +23 -0
- data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +26 -0
- data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +36 -0
- data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +5 -0
- data/db/migrate/20170223235001_remove_spree_store_credits_column.rb +5 -0
- data/lib/generators/spree/dummy/templates/rails/application.rb +1 -1
- data/lib/generators/spree/dummy/templates/rails/test.rb +1 -1
- data/lib/generators/spree/install/install_generator.rb +6 -5
- data/lib/spree/core/controller_helpers/payment_parameters.rb +54 -0
- data/lib/spree/core/engine.rb +6 -9
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +0 -1
- data/lib/spree/money.rb +18 -0
- data/lib/spree/permission_sets/default_customer.rb +1 -1
- data/lib/spree/permitted_attributes.rb +1 -1
- data/lib/spree/testing_support/authorization_helpers.rb +1 -0
- data/lib/spree/testing_support/capybara_ext.rb +13 -0
- data/lib/spree/testing_support/factories/order_factory.rb +5 -1
- data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipment_factory.rb +0 -1
- data/solidus_core.gemspec +3 -3
- data/spec/jobs/promotion_code_batch_job_spec.rb +65 -0
- data/spec/lib/calculated_adjustments_spec.rb +105 -1
- data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +4 -1
- data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +8 -0
- data/spec/lib/spree/money_spec.rb +32 -0
- data/spec/lib/spree/permission_sets/default_customer_spec.rb +20 -0
- data/spec/mailers/promotion_code_batch_mailer_spec.rb +45 -0
- data/spec/models/spree/credit_card_spec.rb +86 -86
- data/spec/models/spree/gateway_spec.rb +3 -1
- data/spec/models/spree/inventory_unit_spec.rb +12 -4
- data/spec/models/spree/order/checkout_spec.rb +11 -32
- data/spec/models/spree/order/tax_spec.rb +2 -2
- data/spec/models/spree/order_contents_spec.rb +24 -1
- data/spec/models/spree/order_inventory_spec.rb +130 -83
- data/spec/models/spree/order_spec.rb +15 -117
- data/spec/models/spree/order_update_attributes_spec.rb +1 -44
- data/spec/models/spree/order_updater_spec.rb +10 -13
- data/spec/models/spree/payment_create_spec.rb +5 -1
- data/spec/models/spree/payment_method_spec.rb +16 -0
- data/spec/models/spree/payment_spec.rb +14 -8
- data/spec/models/spree/promotion_code/batch_builder_spec.rb +61 -0
- data/spec/models/spree/promotion_code_batch_spec.rb +58 -0
- data/spec/models/spree/promotion_code_spec.rb +4 -0
- data/spec/models/spree/promotion_spec.rb +3 -6
- data/spec/models/spree/return_authorization_spec.rb +0 -59
- data/spec/models/spree/shipment_spec.rb +4 -4
- data/spec/models/spree/stock/availability_validator_spec.rb +64 -9
- data/spec/models/spree/tax/item_adjuster_spec.rb +1 -2
- data/spec/models/spree/unit_cancel_spec.rb +0 -85
- data/spec/models/spree/user_spec.rb +3 -1
- data/spec/models/spree/variant/vat_price_generator_spec.rb +8 -2
- data/spec/models/spree/variant_spec.rb +16 -4
- data/spec/models/spree/wallet_payment_source_spec.rb +46 -0
- data/spec/models/spree/wallet_spec.rb +128 -0
- data/spec/support/concerns/payment_source.rb +64 -0
- metadata +51 -25
- data/app/assets/javascripts/spree.js.coffee.erb +0 -64
- data/app/models/spree/promotion_builder.rb +0 -55
- data/app/models/spree/promotion_code/code_builder.rb +0 -62
- data/config/initializers/premailer_assets.rb +0 -1
- data/lib/spree/core/unreturned_item_charger.rb +0 -106
- data/lib/tasks/exchanges.rake +0 -47
- data/spec/lib/spree/core/unreturned_item_charger_spec.rb +0 -126
- data/spec/lib/tasks/exchanges_spec.rb +0 -220
- data/spec/models/spree/promotion_builder_spec.rb +0 -120
- data/spec/models/spree/promotion_code/code_builder_spec.rb +0 -77
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5635c0bec12576a350d683b4140c8daa51e160a
|
4
|
+
data.tar.gz: 1163f3a0a622892863ba88006da9c321de52222f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c7d0c449fce5ebc575ea2c176f0e7577158e3ee09184ff95828abe5a03704bf8f3821b98077c83bba86c9690ceac16bc7e256f1eae96ae76ecf3de78bcf7f162
|
7
|
+
data.tar.gz: 6ffdb536d3e89da7f98e03a662a681742f053db49b4ec6b24dc023524763da40d5648b71bc6cd9564170f367ee1a6d067330ab633a7f1f3c689b95f017b07dbb
|
data/Rakefile
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
//= link_tree ../images
|
@@ -0,0 +1,72 @@
|
|
1
|
+
//= require jsuri
|
2
|
+
|
3
|
+
window.Spree = {};
|
4
|
+
|
5
|
+
Spree.ready = function(callback) {
|
6
|
+
if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {
|
7
|
+
jQuery(document).on('turbolinks:load', function() {
|
8
|
+
callback(jQuery);
|
9
|
+
});
|
10
|
+
} else {
|
11
|
+
jQuery(document).ready(callback);
|
12
|
+
}
|
13
|
+
};
|
14
|
+
|
15
|
+
Spree.mountedAt = function() {
|
16
|
+
return "<%= Rails.application.routes.url_helpers.spree_path(trailing_slash: true) %>";
|
17
|
+
};
|
18
|
+
|
19
|
+
Spree.pathFor = function(path) {
|
20
|
+
var locationOrigin;
|
21
|
+
locationOrigin = (window.location.protocol + "//" + window.location.hostname) + (window.location.port ? ":" + window.location.port : "");
|
22
|
+
return locationOrigin + Spree.mountedAt() + path;
|
23
|
+
};
|
24
|
+
|
25
|
+
Spree.url = function(uri, query) {
|
26
|
+
if (Spree.env === 'development' || Spree.env === 'test') {
|
27
|
+
console.warn('Spree.url is deprecated, please use Spree.ajax for your request instead.');
|
28
|
+
}
|
29
|
+
if (uri.path === undefined) {
|
30
|
+
uri = new Uri(uri);
|
31
|
+
}
|
32
|
+
if (query) {
|
33
|
+
$.each(query, function(key, value) {
|
34
|
+
return uri.addQueryParam(key, value);
|
35
|
+
});
|
36
|
+
}
|
37
|
+
return uri;
|
38
|
+
};
|
39
|
+
|
40
|
+
Spree.ajax = function(url, options) {
|
41
|
+
if (typeof url === "object") {
|
42
|
+
options = url;
|
43
|
+
url = undefined;
|
44
|
+
}
|
45
|
+
options = options || {};
|
46
|
+
options = $.extend(options, {
|
47
|
+
headers: {
|
48
|
+
"X-Spree-Token": Spree.api_key
|
49
|
+
}
|
50
|
+
});
|
51
|
+
return $.ajax(url, options);
|
52
|
+
};
|
53
|
+
|
54
|
+
Spree.routes = {
|
55
|
+
states_search: Spree.pathFor('api/states'),
|
56
|
+
apply_coupon_code: function(order_id) {
|
57
|
+
return Spree.pathFor("api/orders/" + order_id + "/apply_coupon_code");
|
58
|
+
}
|
59
|
+
};
|
60
|
+
|
61
|
+
Spree.getJSON = function(url, data, success) {
|
62
|
+
if (typeof data === 'function') {
|
63
|
+
success = data;
|
64
|
+
data = undefined;
|
65
|
+
}
|
66
|
+
return Spree.ajax({
|
67
|
+
dataType: "json",
|
68
|
+
url: url,
|
69
|
+
data: data,
|
70
|
+
success: success
|
71
|
+
});
|
72
|
+
};
|
@@ -8,6 +8,11 @@ module Spree
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def cache_key_for_taxons
|
11
|
+
Spree::Deprecation.warn <<-WARN.strip_heredoc
|
12
|
+
cache_key_for_taxons is deprecated. Rails >= 5 has built-in support for collection cache keys.
|
13
|
+
Instead in your view use:
|
14
|
+
cache [I18n.locale, @taxons] do
|
15
|
+
WARN
|
11
16
|
max_updated_at = @taxons.maximum(:updated_at).to_i
|
12
17
|
parts = [@taxon.try(:id), max_updated_at].compact.join("-")
|
13
18
|
"#{I18n.locale}/taxons/#{parts}"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Spree
|
2
|
+
class PromotionCodeBatchJob < ActiveJob::Base
|
3
|
+
queue_as :default
|
4
|
+
|
5
|
+
def perform(promotion_code_batch)
|
6
|
+
PromotionCode::BatchBuilder.new(
|
7
|
+
promotion_code_batch
|
8
|
+
).build_promotion_codes
|
9
|
+
|
10
|
+
if promotion_code_batch.email?
|
11
|
+
Spree::PromotionCodeBatchMailer
|
12
|
+
.promotion_code_batch_finished(promotion_code_batch)
|
13
|
+
.deliver_now
|
14
|
+
end
|
15
|
+
rescue => e
|
16
|
+
if promotion_code_batch.email?
|
17
|
+
Spree::PromotionCodeBatchMailer
|
18
|
+
.promotion_code_batch_errored(promotion_code_batch)
|
19
|
+
.deliver_now
|
20
|
+
end
|
21
|
+
raise e
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Spree
|
2
|
+
class PromotionCodeBatchMailer < ApplicationMailer
|
3
|
+
def promotion_code_batch_finished(promotion_code_batch)
|
4
|
+
@promotion_code_batch = promotion_code_batch
|
5
|
+
mail(to: promotion_code_batch.email)
|
6
|
+
end
|
7
|
+
|
8
|
+
def promotion_code_batch_errored(promotion_code_batch)
|
9
|
+
@promotion_code_batch = promotion_code_batch
|
10
|
+
mail(to: promotion_code_batch.email)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -4,7 +4,7 @@ module Spree
|
|
4
4
|
|
5
5
|
included do
|
6
6
|
has_one :calculator, class_name: "Spree::Calculator", as: :calculable, inverse_of: :calculable, dependent: :destroy, autosave: true
|
7
|
-
accepts_nested_attributes_for :calculator
|
7
|
+
accepts_nested_attributes_for :calculator, update_only: true
|
8
8
|
validates :calculator, presence: true
|
9
9
|
end
|
10
10
|
|
@@ -16,8 +16,8 @@ module Spree
|
|
16
16
|
|
17
17
|
def property_name=(name)
|
18
18
|
unless name.blank?
|
19
|
-
unless property = Property.find_by(name: name)
|
20
|
-
property = Property.create(name: name, presentation: name)
|
19
|
+
unless property = Spree::Property.find_by(name: name)
|
20
|
+
property = Spree::Property.create(name: name, presentation: name)
|
21
21
|
end
|
22
22
|
self.property = property
|
23
23
|
end
|
@@ -5,7 +5,7 @@ module Spree
|
|
5
5
|
included do
|
6
6
|
has_many :user_addresses, -> { active }, { foreign_key: "user_id", class_name: "Spree::UserAddress" } do
|
7
7
|
def find_first_by_address_values(address_attrs)
|
8
|
-
detect { |ua| ua.address == Address.new(address_attrs) }
|
8
|
+
detect { |ua| ua.address == Spree::Address.new(address_attrs) }
|
9
9
|
end
|
10
10
|
|
11
11
|
# @note this method enforces only one default address per user
|
@@ -37,7 +37,7 @@ module Spree
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def bill_address_attributes=(attributes)
|
40
|
-
self.bill_address = Address.immutable_merge(bill_address, attributes)
|
40
|
+
self.bill_address = Spree::Address.immutable_merge(bill_address, attributes)
|
41
41
|
end
|
42
42
|
|
43
43
|
def default_address=(address)
|
@@ -48,7 +48,7 @@ module Spree
|
|
48
48
|
# see "Nested Attributes Examples" section of http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for
|
49
49
|
# this #{fieldname}_attributes= method works with fields_for in the views
|
50
50
|
# even without declaring accepts_nested_attributes_for
|
51
|
-
self.default_address = Address.immutable_merge(default_address, attributes)
|
51
|
+
self.default_address = Spree::Address.immutable_merge(default_address, attributes)
|
52
52
|
end
|
53
53
|
|
54
54
|
alias_method :ship_address_attributes=, :default_address_attributes=
|
@@ -94,7 +94,7 @@ module Spree
|
|
94
94
|
return nil unless address_attributes.present?
|
95
95
|
address_attributes = address_attributes.to_h.with_indifferent_access
|
96
96
|
|
97
|
-
new_address = Address.factory(address_attributes)
|
97
|
+
new_address = Spree::Address.factory(address_attributes)
|
98
98
|
return new_address unless new_address.valid?
|
99
99
|
|
100
100
|
first_one = user_addresses.empty?
|
@@ -23,6 +23,9 @@ module Spree
|
|
23
23
|
has_many :store_credit_events, through: :store_credits
|
24
24
|
money_methods :total_available_store_credit
|
25
25
|
|
26
|
+
has_many :credit_cards, class_name: "Spree::CreditCard", foreign_key: :user_id
|
27
|
+
has_many :wallet_payment_sources, foreign_key: 'user_id', class_name: 'Spree::WalletPaymentSource', inverse_of: :user
|
28
|
+
|
26
29
|
after_create :auto_generate_spree_api_key
|
27
30
|
|
28
31
|
include Spree::RansackableAttributes unless included_modules.include?(Spree::RansackableAttributes)
|
@@ -31,6 +34,10 @@ module Spree
|
|
31
34
|
self.whitelisted_ransackable_attributes = %w[id email]
|
32
35
|
end
|
33
36
|
|
37
|
+
def wallet
|
38
|
+
Spree::Wallet.new(self)
|
39
|
+
end
|
40
|
+
|
34
41
|
# has_spree_role? simply needs to return true or false whether a user has a role or not.
|
35
42
|
def has_spree_role?(role_in_question)
|
36
43
|
spree_roles.any? { |role| role.name == role_in_question.to_s }
|
@@ -2,15 +2,22 @@ module Spree
|
|
2
2
|
module UserPaymentSource
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
included do
|
6
|
-
has_many :credit_cards, class_name: "Spree::CreditCard", foreign_key: :user_id
|
7
|
-
end
|
8
|
-
|
9
5
|
def default_credit_card
|
10
|
-
|
6
|
+
Spree::Deprecation.warn(
|
7
|
+
"user.default_credit_card is deprecated. Please use user.wallet.default_wallet_payment_source instead.",
|
8
|
+
caller
|
9
|
+
)
|
10
|
+
default = wallet.default_wallet_payment_source
|
11
|
+
if default && default.payment_source.is_a?(Spree::CreditCard)
|
12
|
+
default.payment_source
|
13
|
+
end
|
11
14
|
end
|
12
15
|
|
13
16
|
def payment_sources
|
17
|
+
Spree::Deprecation.warn(
|
18
|
+
"user.payment_sources is deprecated. Please use user.wallet.wallet_payment_sources instead.",
|
19
|
+
caller
|
20
|
+
)
|
14
21
|
credit_cards.with_payment_profile
|
15
22
|
end
|
16
23
|
end
|
data/app/models/spree/address.rb
CHANGED
@@ -105,20 +105,31 @@ module Spree
|
|
105
105
|
value_attributes == other_address.value_attributes
|
106
106
|
end
|
107
107
|
|
108
|
+
# @deprecated Do not use this. Use Address.== instead.
|
108
109
|
def same_as?(other_address)
|
109
|
-
Spree::Deprecation.warn("Address
|
110
|
+
Spree::Deprecation.warn("Address#same_as? is deprecated. It's equivalent to Address.==", caller)
|
110
111
|
self == other_address
|
111
112
|
end
|
112
113
|
|
114
|
+
# @deprecated Do not use this. Use Address.== instead.
|
113
115
|
def same_as(other_address)
|
114
|
-
Spree::Deprecation.warn("Address
|
116
|
+
Spree::Deprecation.warn("Address#same_as is deprecated. It's equivalent to Address.==", caller)
|
115
117
|
self == other_address
|
116
118
|
end
|
117
119
|
|
120
|
+
# @deprecated Do not use this
|
118
121
|
def empty?
|
122
|
+
Spree::Deprecation.warn("Address#empty? is deprecated.", caller)
|
119
123
|
attributes.except('id', 'created_at', 'updated_at', 'country_id').all? { |_, v| v.nil? }
|
120
124
|
end
|
121
125
|
|
126
|
+
# This exists because the default Object#blank?, checks empty? if it is
|
127
|
+
# defined, and we have defined empty.
|
128
|
+
# This should be removed once empty? is removed
|
129
|
+
def blank?
|
130
|
+
false
|
131
|
+
end
|
132
|
+
|
122
133
|
# @return [Hash] an ActiveMerchant compatible address hash
|
123
134
|
def active_merchant_hash
|
124
135
|
{
|
@@ -157,7 +168,7 @@ module Spree
|
|
157
168
|
# @return [Country] setter that sets self.country to the Country with a matching 2 letter iso
|
158
169
|
# @raise [ActiveRecord::RecordNotFound] if country with the iso doesn't exist
|
159
170
|
def country_iso=(iso)
|
160
|
-
self.country = Country.find_by!(iso: iso)
|
171
|
+
self.country = Spree::Country.find_by!(iso: iso)
|
161
172
|
end
|
162
173
|
|
163
174
|
private
|
@@ -105,7 +105,7 @@ module Spree
|
|
105
105
|
self.amount = source.compute_amount(adjustable)
|
106
106
|
|
107
107
|
if promotion?
|
108
|
-
self.eligible =
|
108
|
+
self.eligible = calculate_eligibility
|
109
109
|
end
|
110
110
|
|
111
111
|
# Persist only if changed
|
@@ -116,6 +116,18 @@ module Spree
|
|
116
116
|
amount
|
117
117
|
end
|
118
118
|
|
119
|
+
# Calculates based on attached promotion (if this is a promotion
|
120
|
+
# adjustment) whether this promotion is still eligible.
|
121
|
+
# @api private
|
122
|
+
# @return [true,false] Whether this adjustment is eligible
|
123
|
+
def calculate_eligibility
|
124
|
+
if !finalized? && source && promotion?
|
125
|
+
source.promotion.eligible?(adjustable, promotion_code: promotion_code)
|
126
|
+
else
|
127
|
+
eligible?
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
119
131
|
private
|
120
132
|
|
121
133
|
def require_promotion_code?
|
@@ -107,10 +107,6 @@ module Spree
|
|
107
107
|
# @return [Boolean] Request company field for billing and shipping addresses. (default: +false+)
|
108
108
|
preference :company, :boolean, default: false
|
109
109
|
|
110
|
-
# @!attribute [rw] create_rma_for_unreturned_exchange
|
111
|
-
# @return [Boolean] allows rma to be created for items after unreturned exchange charge has been made (default: +false+)
|
112
|
-
preference :create_rma_for_unreturned_exchange, :boolean, default: false
|
113
|
-
|
114
110
|
# @!attribute [rw] currency
|
115
111
|
# Currency to use by default when not defined on the site (default: +"USD"+)
|
116
112
|
# @return [String] ISO 4217 Three letter currency code
|
@@ -132,21 +128,6 @@ module Spree
|
|
132
128
|
# prices are entered in the backend (default: nil)
|
133
129
|
preference :admin_vat_country_iso, :string, default: nil
|
134
130
|
|
135
|
-
# @!attribute [rw] expedited_exchanges
|
136
|
-
# Kicks off an exchange shipment upon return authorization save.
|
137
|
-
# charge customer if they do not return items within timely manner.
|
138
|
-
# @note this requires payment profiles to be supported on your gateway of
|
139
|
-
# choice as well as a delayed job handler to be configured with
|
140
|
-
# activejob.
|
141
|
-
# @return [Boolean] Use expidited exchanges (default: +false+)
|
142
|
-
preference :expedited_exchanges, :boolean, default: false
|
143
|
-
|
144
|
-
# @!attribute [rw] expedited_exchanges_days_window
|
145
|
-
# @return [Integer] Number of days the customer has to return their item
|
146
|
-
# after the expedited exchange is shipped in order to avoid being
|
147
|
-
# charged (default: +14+)
|
148
|
-
preference :expedited_exchanges_days_window, :integer, default: 14
|
149
|
-
|
150
131
|
# @!attribute [rw] generate_api_key_for_all_roles
|
151
132
|
# @return [Boolean] Allow generating api key automatically for user
|
152
133
|
# at role_user creation for all roles. (default: +false+)
|
data/app/models/spree/base.rb
CHANGED
@@ -1,20 +1,16 @@
|
|
1
1
|
module Spree
|
2
2
|
# The default `source` of a `Spree::Payment`.
|
3
3
|
#
|
4
|
-
class CreditCard < Spree::
|
5
|
-
belongs_to :
|
6
|
-
belongs_to :user, class_name: Spree.user_class, foreign_key: 'user_id'
|
4
|
+
class CreditCard < Spree::PaymentSource
|
5
|
+
belongs_to :user, class_name: Spree::UserClassHandle.new, foreign_key: 'user_id'
|
7
6
|
belongs_to :address
|
8
|
-
has_many :payments, as: :source
|
9
7
|
|
10
8
|
before_save :set_last_digits
|
11
9
|
|
12
|
-
after_save :ensure_one_default
|
13
|
-
|
14
10
|
accepts_nested_attributes_for :address
|
15
11
|
|
16
|
-
attr_reader :number
|
17
|
-
attr_accessor :encrypted_data, :
|
12
|
+
attr_reader :number
|
13
|
+
attr_accessor :encrypted_data, :verification_value
|
18
14
|
|
19
15
|
validates :month, :year, numericality: { only_integer: true }, if: :require_card_numbers?, on: :create
|
20
16
|
validates :number, presence: true, if: :require_card_numbers?, on: :create, unless: :imported
|
@@ -22,7 +18,11 @@ module Spree
|
|
22
18
|
validates :verification_value, presence: true, if: :require_card_numbers?, on: :create, unless: :imported
|
23
19
|
|
24
20
|
scope :with_payment_profile, -> { where('gateway_customer_profile_id IS NOT NULL') }
|
25
|
-
|
21
|
+
|
22
|
+
def self.default
|
23
|
+
Spree::Deprecation.warn("CreditCard.default is deprecated. Please use Spree::Wallet instead.")
|
24
|
+
joins(:wallet_payment_sources).where(spree_wallet_payment_sources: { default: true })
|
25
|
+
end
|
26
26
|
|
27
27
|
# needed for some of the ActiveMerchant gateways (eg. SagePay)
|
28
28
|
alias_attribute :brand, :cc_type
|
@@ -44,8 +44,30 @@ module Spree
|
|
44
44
|
'laser' => /^(6304|6706|6709|6771(?!89))\d{8}(\d{4}|\d{6,7})?$/
|
45
45
|
}.freeze
|
46
46
|
|
47
|
+
def default
|
48
|
+
Spree::Deprecation.warn("CreditCard.default is deprecated. Please use user.wallet.default_wallet_payment_source instead.", caller)
|
49
|
+
return false if user.nil?
|
50
|
+
user.wallet.default_wallet_payment_source.try!(:payment_source) == self
|
51
|
+
end
|
52
|
+
|
53
|
+
def default=(set_as_default)
|
54
|
+
Spree::Deprecation.warn("CreditCard.default= is deprecated. Please use user.wallet.default_wallet_payment_source= instead.", caller)
|
55
|
+
if user.nil?
|
56
|
+
raise "Cannot set 'default' on a credit card without a user"
|
57
|
+
elsif set_as_default # setting this card as default
|
58
|
+
wallet_payment_source = user.wallet.add(self)
|
59
|
+
user.wallet.default_wallet_payment_source = wallet_payment_source
|
60
|
+
true
|
61
|
+
else # removing this card as default
|
62
|
+
if user.wallet.default_wallet_payment_source.try!(:payment_source) == self
|
63
|
+
user.wallet.default_wallet_payment_source = nil
|
64
|
+
end
|
65
|
+
false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
47
69
|
def address_attributes=(attributes)
|
48
|
-
self.address = Address.immutable_merge(address, attributes)
|
70
|
+
self.address = Spree::Address.immutable_merge(address, attributes)
|
49
71
|
end
|
50
72
|
|
51
73
|
# Sets the expiry date on this credit card.
|
@@ -123,31 +145,8 @@ module Spree
|
|
123
145
|
"XXXX-XXXX-XXXX-#{last_digits}"
|
124
146
|
end
|
125
147
|
|
126
|
-
|
127
|
-
|
128
|
-
%w{capture void credit}
|
129
|
-
end
|
130
|
-
|
131
|
-
# @param payment [Spree::Payment] the payment we want to know if can be captured
|
132
|
-
# @return [Boolean] true when the payment is in the pending or checkout states
|
133
|
-
def can_capture?(payment)
|
134
|
-
payment.pending? || payment.checkout?
|
135
|
-
end
|
136
|
-
|
137
|
-
# @param payment [Spree::Payment] the payment we want to know if can be voided
|
138
|
-
# @return [Boolean] true when the payment is not failed or voided
|
139
|
-
def can_void?(payment)
|
140
|
-
!payment.failed? && !payment.void?
|
141
|
-
end
|
142
|
-
|
143
|
-
# Indicates whether its possible to credit the payment. Note that most
|
144
|
-
# gateways require that the payment be settled first which generally
|
145
|
-
# happens within 12-24 hours of the transaction.
|
146
|
-
#
|
147
|
-
# @param payment [Spree::Payment] the payment we want to know if can be credited
|
148
|
-
# @return [Boolean] true when the payment is completed and can be credited
|
149
|
-
def can_credit?(payment)
|
150
|
-
payment.completed? && payment.credit_allowed > 0
|
148
|
+
def reusable?
|
149
|
+
has_payment_profile?
|
151
150
|
end
|
152
151
|
|
153
152
|
# @return [Boolean] true when there is a gateway customer or payment
|
@@ -192,13 +191,5 @@ module Spree
|
|
192
191
|
def require_card_numbers?
|
193
192
|
!encrypted_data.present? && !has_payment_profile?
|
194
193
|
end
|
195
|
-
|
196
|
-
def ensure_one_default
|
197
|
-
if user_id && default
|
198
|
-
CreditCard.where(default: true).where.not(id: id).where(user_id: user_id).each do |ucc|
|
199
|
-
ucc.update_columns(default: false, updated_at: Time.current)
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
194
|
end
|
204
195
|
end
|
@@ -79,7 +79,7 @@ module Spree
|
|
79
79
|
prefix = success ? 'BGS' : 'FAIL'
|
80
80
|
while record
|
81
81
|
random = "#{prefix}-#{Array.new(6){ rand(6) }.join}"
|
82
|
-
record = CreditCard.where(gateway_customer_profile_id: random).first
|
82
|
+
record = Spree::CreditCard.where(gateway_customer_profile_id: random).first
|
83
83
|
end
|
84
84
|
random
|
85
85
|
end
|
data/app/models/spree/gateway.rb
CHANGED
@@ -42,16 +42,18 @@ module Spree
|
|
42
42
|
source.has_payment_profile?
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
45
|
+
def reusable_sources_by_order(order)
|
46
46
|
source_ids = order.payments.where(payment_method_id: id).pluck(:source_id).uniq
|
47
|
-
payment_source_class.where(id: source_ids).
|
47
|
+
payment_source_class.where(id: source_ids).select(&:reusable?)
|
48
48
|
end
|
49
|
+
alias_method :sources_by_order, :reusable_sources_by_order
|
50
|
+
deprecate sources_by_order: :reusable_sources_by_order, deprecator: Spree::Deprecation
|
49
51
|
|
50
52
|
def reusable_sources(order)
|
51
53
|
if order.completed?
|
52
|
-
|
54
|
+
reusable_sources_by_order(order)
|
53
55
|
elsif order.user_id
|
54
|
-
|
56
|
+
order.user.wallet.wallet_payment_sources.map(&:payment_source).select(&:reusable?)
|
55
57
|
else
|
56
58
|
[]
|
57
59
|
end
|
@@ -21,6 +21,7 @@ module Spree
|
|
21
21
|
|
22
22
|
before_destroy :ensure_can_destroy
|
23
23
|
|
24
|
+
scope :pending, -> { where pending: true }
|
24
25
|
scope :backordered, -> { where state: 'backordered' }
|
25
26
|
scope :on_hand, -> { where state: 'on_hand' }
|
26
27
|
scope :pre_shipment, -> { where(state: PRE_SHIPMENT_STATES) }
|
@@ -29,7 +30,7 @@ module Spree
|
|
29
30
|
scope :returned, -> { where state: 'returned' }
|
30
31
|
scope :canceled, -> { where(state: 'canceled') }
|
31
32
|
scope :not_canceled, -> { where.not(state: 'canceled') }
|
32
|
-
scope :cancelable, -> { where(state: Spree::InventoryUnit::CANCELABLE_STATES) }
|
33
|
+
scope :cancelable, -> { where(state: Spree::InventoryUnit::CANCELABLE_STATES, pending: false) }
|
33
34
|
scope :backordered_per_variant, ->(stock_item) do
|
34
35
|
includes(:shipment, :order)
|
35
36
|
.where("spree_shipments.state != 'canceled'").references(:shipment)
|
@@ -140,7 +141,7 @@ module Spree
|
|
140
141
|
throw :abort
|
141
142
|
end
|
142
143
|
|
143
|
-
|
144
|
+
if shipment.shipped? || shipment.canceled?
|
144
145
|
errors.add(:base, :cannot_destroy_shipment_state, state: shipment.state)
|
145
146
|
throw :abort
|
146
147
|
end
|