solidus_core 2.0.3 → 2.1.0.beta1
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/README.md +62 -3
- data/app/assets/javascripts/spree.js.coffee.erb +4 -1
- data/app/helpers/spree/base_helper.rb +7 -48
- data/app/models/spree/address.rb +5 -1
- data/app/models/spree/adjustment.rb +3 -3
- data/app/models/spree/app_configuration.rb +13 -0
- data/app/models/spree/calculator.rb +3 -2
- data/app/models/spree/calculator/default_tax.rb +6 -10
- data/app/models/spree/calculator/flat_percent_item_total.rb +0 -4
- data/app/models/spree/calculator/flat_rate.rb +0 -4
- data/app/models/spree/calculator/flexi_rate.rb +0 -4
- data/app/models/spree/calculator/free_shipping.rb +0 -3
- data/app/models/spree/calculator/percent_on_line_item.rb +0 -4
- data/app/models/spree/calculator/percent_per_item.rb +0 -4
- data/app/models/spree/calculator/price_sack.rb +0 -4
- data/app/models/spree/calculator/returns/default_refund_amount.rb +0 -3
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +0 -4
- data/app/models/spree/calculator/shipping/flat_rate.rb +0 -4
- data/app/models/spree/calculator/shipping/flexi_rate.rb +0 -4
- data/app/models/spree/calculator/shipping/per_item.rb +0 -4
- data/app/models/spree/calculator/shipping/price_sack.rb +0 -4
- data/app/models/spree/calculator/tiered_flat_rate.rb +0 -4
- data/app/models/spree/calculator/tiered_percent.rb +0 -4
- data/app/models/spree/credit_card.rb +27 -14
- data/app/models/spree/gateway.rb +4 -0
- data/app/models/spree/inventory_unit.rb +2 -0
- data/app/models/spree/line_item.rb +31 -26
- data/app/models/spree/option_type.rb +0 -3
- data/app/models/spree/order.rb +28 -31
- data/app/models/spree/order/checkout.rb +0 -2
- data/app/models/spree/order_contents.rb +0 -45
- data/app/models/spree/order_merger.rb +6 -6
- data/app/models/spree/order_update_attributes.rb +0 -2
- data/app/models/spree/order_updater.rb +91 -13
- data/app/models/spree/payment.rb +9 -2
- data/app/models/spree/payment/processing.rb +15 -9
- data/app/models/spree/payment_method.rb +48 -5
- data/app/models/spree/price.rb +7 -9
- data/app/models/spree/product.rb +1 -25
- data/app/models/spree/promotion.rb +22 -14
- data/app/models/spree/promotion/actions/create_adjustment.rb +12 -1
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +15 -1
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +5 -3
- data/app/models/spree/promotion/actions/free_shipping.rb +14 -0
- data/app/models/spree/promotion/rules/taxon.rb +7 -2
- data/app/models/spree/promotion/rules/user_role.rb +43 -0
- data/app/models/spree/promotion_action.rb +19 -2
- data/app/models/spree/promotion_handler/coupon.rb +1 -4
- data/app/models/spree/promotion_handler/free_shipping.rb +22 -17
- data/app/models/spree/promotion_rule_role.rb +6 -0
- data/app/models/spree/property.rb +0 -3
- data/app/models/spree/return_authorization.rb +2 -0
- data/app/models/spree/shipment.rb +5 -21
- data/app/models/spree/shipping_method.rb +23 -2
- data/app/models/spree/shipping_rate.rb +3 -0
- data/app/models/spree/stock/estimator.rb +1 -1
- data/app/models/spree/stock_location.rb +3 -0
- data/app/models/spree/store.rb +7 -0
- data/app/models/spree/tax/item_adjuster.rb +27 -12
- data/app/models/spree/tax/order_adjuster.rb +2 -5
- data/app/models/spree/tax/tax_helpers.rb +4 -8
- data/app/models/spree/tax_rate.rb +1 -15
- data/app/models/spree/taxon.rb +0 -3
- data/app/models/spree/transfer_item.rb +1 -1
- data/app/models/spree/user_class_handle.rb +14 -9
- data/app/models/spree/variant/pricing_options.rb +1 -1
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
- data/app/models/spree/zone.rb +20 -13
- data/config/locales/en.yml +144 -62
- data/db/migrate/20120831092320_spree_one_two.rb +0 -7
- data/db/migrate/20150723224133_remove_unnecessary_indexes.rb +0 -2
- data/db/migrate/20160924135758_remove_is_default_from_prices.rb +5 -0
- data/db/migrate/20161009141333_remove_currency_from_line_items.rb +5 -0
- data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +28 -0
- data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +20 -0
- data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +4 -0
- data/lib/generators/spree/dummy/dummy_generator.rb +0 -2
- data/lib/spree/core.rb +0 -5
- data/lib/spree/core/controller_helpers/pricing.rb +2 -1
- data/lib/spree/core/engine.rb +14 -0
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/deprecation.rb +1 -1
- data/lib/spree/localized_number.rb +3 -2
- data/lib/spree/permission_sets/configuration_display.rb +0 -1
- data/lib/spree/permission_sets/configuration_management.rb +0 -1
- data/lib/spree/permission_sets/product_display.rb +0 -1
- data/lib/spree/permission_sets/product_management.rb +0 -1
- data/lib/spree/permission_sets/user_management.rb +2 -4
- data/lib/spree/permitted_attributes.rb +3 -2
- data/lib/spree/testing_support/capybara_ext.rb +0 -12
- data/lib/spree/testing_support/factories/address_factory.rb +1 -1
- data/lib/spree/testing_support/factories/line_item_factory.rb +0 -1
- data/lib/spree/testing_support/factories/payment_factory.rb +4 -0
- data/lib/spree/testing_support/factories/payment_method_factory.rb +8 -1
- data/lib/spree/testing_support/factories/user_factory.rb +2 -2
- data/solidus_core.gemspec +4 -3
- data/spec/helpers/base_helper_spec.rb +0 -40
- data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +16 -0
- data/spec/lib/spree/core/importer/order_spec.rb +27 -18
- data/spec/lib/spree/core/price_migrator_spec.rb +3 -1
- data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +16 -0
- data/spec/lib/spree/core/unreturned_item_charger_spec.rb +0 -2
- data/spec/lib/tasks/exchanges_spec.rb +4 -2
- data/spec/lib/tasks/migrations/create_vat_prices_spec.rb +5 -3
- data/spec/models/spree/adjustment_spec.rb +136 -0
- data/spec/models/spree/calculator/default_tax_spec.rb +13 -7
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +3 -0
- data/spec/models/spree/calculator/flat_rate_spec.rb +3 -0
- data/spec/models/spree/calculator/flexi_rate_spec.rb +3 -0
- data/spec/models/spree/calculator/free_shipping_spec.rb +6 -0
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +9 -4
- data/spec/models/spree/calculator/percent_per_item_spec.rb +10 -0
- data/spec/models/spree/calculator/price_sack_spec.rb +3 -0
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +3 -0
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +3 -0
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +3 -0
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +3 -0
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +3 -0
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +4 -1
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +3 -0
- data/spec/models/spree/calculator/tiered_percent_spec.rb +3 -0
- data/spec/models/spree/credit_card_spec.rb +27 -1
- data/spec/models/spree/line_item_spec.rb +58 -65
- data/spec/models/spree/order/checkout_spec.rb +2 -1
- data/spec/models/spree/order/payment_spec.rb +9 -10
- data/spec/models/spree/order/tax_spec.rb +22 -7
- data/spec/models/spree/order/updating_spec.rb +1 -3
- data/spec/models/spree/order_cancellations_spec.rb +6 -4
- data/spec/models/spree/order_contents_spec.rb +34 -50
- data/spec/models/spree/order_inventory_spec.rb +3 -5
- data/spec/models/spree/order_merger_spec.rb +20 -0
- data/spec/models/spree/order_spec.rb +28 -64
- data/spec/models/spree/order_update_attributes_spec.rb +1 -5
- data/spec/models/spree/order_updater_spec.rb +251 -0
- data/spec/models/spree/payment_method_spec.rb +178 -28
- data/spec/models/spree/payment_spec.rb +35 -19
- data/spec/models/spree/permission_sets/configuration_display.rb +0 -4
- data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -2
- data/spec/models/spree/permission_sets/product_display_spec.rb +0 -4
- data/spec/models/spree/permission_sets/product_management_spec.rb +0 -2
- data/spec/models/spree/permission_sets/user_management_spec.rb +9 -2
- data/spec/models/spree/price_spec.rb +16 -1
- data/spec/models/spree/product_spec.rb +0 -75
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +20 -0
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +39 -15
- data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +203 -22
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +22 -3
- data/spec/models/spree/promotion/rules/taxon_spec.rb +26 -0
- data/spec/models/spree/promotion/rules/user_role_spec.rb +86 -0
- data/spec/models/spree/promotion_action_spec.rb +38 -0
- data/spec/models/spree/promotion_handler/coupon_spec.rb +36 -33
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +21 -22
- data/spec/models/spree/promotion_spec.rb +46 -6
- data/spec/models/spree/reimbursement_spec.rb +1 -1
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +2 -2
- data/spec/models/spree/shipment_spec.rb +68 -50
- data/spec/models/spree/shipping_method_spec.rb +41 -0
- data/spec/models/spree/shipping_rate_spec.rb +9 -3
- data/spec/models/spree/stock/estimator_spec.rb +4 -2
- data/spec/models/spree/store_credit_spec.rb +3 -3
- data/spec/models/spree/tax/item_adjuster_spec.rb +31 -21
- data/spec/models/spree/tax/order_adjuster_spec.rb +6 -10
- data/spec/models/spree/tax/taxation_integration_spec.rb +19 -0
- data/spec/models/spree/tax_rate_spec.rb +5 -26
- data/spec/models/spree/transfer_item_spec.rb +11 -0
- data/spec/models/spree/variant/pricing_options_spec.rb +7 -17
- data/spec/models/spree/variant_spec.rb +2 -4
- data/spec/models/spree/zone_spec.rb +60 -20
- data/spec/shared_examples/calculator_shared_examples.rb +8 -0
- metadata +19 -24
- data/app/models/spree/item_adjustments.rb +0 -89
- data/app/models/spree/option_type_prototype.rb +0 -6
- data/app/models/spree/property_prototype.rb +0 -6
- data/app/models/spree/prototype.rb +0 -14
- data/app/models/spree/prototype_taxon.rb +0 -6
- data/app/models/spree/tracker.rb +0 -8
- data/db/migrate/20150128032538_remove_environment_from_tracker.rb +0 -6
- data/lib/generators/spree/dummy/templates/initializers/custom_user.rb +0 -1
- data/lib/spree/core/delegate_belongs_to.rb +0 -94
- data/lib/spree/testing_support/factories/prototype_factory.rb +0 -8
- data/lib/spree/testing_support/factories/tracker_factory.rb +0 -6
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +0 -24
- data/spec/lib/spree/core/testing_support/factories/prototype_factory_spec.rb +0 -12
- data/spec/lib/spree/core/testing_support/factories/tracker_factory_spec.rb +0 -12
- data/spec/models/spree/item_adjustments_spec.rb +0 -306
- data/spec/models/spree/tracker_spec.rb +0 -21
|
@@ -26,7 +26,7 @@ module Spree
|
|
|
26
26
|
#
|
|
27
27
|
# The line items from `other_order` will be merged in to the `order` for
|
|
28
28
|
# this OrderMerger object. If the line items are for the same variant, it
|
|
29
|
-
# will the quantity of the incoming line item to the existing line item.
|
|
29
|
+
# will add the quantity of the incoming line item to the existing line item.
|
|
30
30
|
# Otherwise, it will assign the line item to the new order.
|
|
31
31
|
#
|
|
32
32
|
# After the orders have been merged the `other_order` will be destroyed.
|
|
@@ -46,11 +46,11 @@ module Spree
|
|
|
46
46
|
# specified, the order user association will not be changed.
|
|
47
47
|
# @return [void]
|
|
48
48
|
def merge!(other_order, user = nil)
|
|
49
|
-
other_order.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
if other_order.currency == order.currency
|
|
50
|
+
other_order.line_items.each do |other_order_line_item|
|
|
51
|
+
current_line_item = find_matching_line_item(other_order_line_item)
|
|
52
|
+
handle_merge(current_line_item, other_order_line_item)
|
|
53
|
+
end
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
set_user(user)
|
|
@@ -14,8 +14,6 @@ module Spree
|
|
|
14
14
|
# Assign the attributes to the order and save the order
|
|
15
15
|
# @return true if saved, otherwise false and errors will be set on the order
|
|
16
16
|
def apply
|
|
17
|
-
order.validate_payments_attributes(@payments_attributes)
|
|
18
|
-
|
|
19
17
|
assign_order_attributes
|
|
20
18
|
assign_payments_attributes
|
|
21
19
|
|
|
@@ -15,27 +15,39 @@ module Spree
|
|
|
15
15
|
# object with callbacks (otherwise you will end up in an infinite recursion as the
|
|
16
16
|
# associations try to save and then in turn try to call +update!+ again.)
|
|
17
17
|
def update
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
@order.transaction do
|
|
19
|
+
update_item_count
|
|
20
|
+
update_totals
|
|
21
|
+
if order.completed?
|
|
22
|
+
update_payment_state
|
|
23
|
+
update_shipments
|
|
24
|
+
update_shipment_state
|
|
25
|
+
end
|
|
26
|
+
run_hooks
|
|
27
|
+
persist_totals
|
|
24
28
|
end
|
|
25
|
-
run_hooks
|
|
26
|
-
persist_totals
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
def run_hooks
|
|
30
32
|
update_hooks.each { |hook| order.send hook }
|
|
31
33
|
end
|
|
32
34
|
|
|
35
|
+
# This will update and select the best promotion adjustment, update tax
|
|
36
|
+
# adjustments, update cancellation adjustments, and then update the total
|
|
37
|
+
# fields (promo_total, included_tax_total, additional_tax_total, and
|
|
38
|
+
# adjustment_total) on the item.
|
|
39
|
+
# @return [void]
|
|
33
40
|
def recalculate_adjustments
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
# Promotion adjustments must be applied first, then tax adjustments.
|
|
42
|
+
# This fits the criteria for VAT tax as outlined here:
|
|
43
|
+
# http://www.hmrc.gov.uk/vat/managing/charging/discounts-etc.htm#1
|
|
44
|
+
# It also fits the criteria for sales tax as outlined here:
|
|
45
|
+
# http://www.boe.ca.gov/formspubs/pub113/
|
|
46
|
+
update_item_promotions
|
|
47
|
+
update_order_promotions
|
|
48
|
+
update_taxes
|
|
49
|
+
update_cancellations
|
|
50
|
+
update_item_totals
|
|
39
51
|
end
|
|
40
52
|
|
|
41
53
|
# Updates the following Order total values:
|
|
@@ -164,5 +176,71 @@ module Spree
|
|
|
164
176
|
def round_money(n)
|
|
165
177
|
(n * 100).round / 100.0
|
|
166
178
|
end
|
|
179
|
+
|
|
180
|
+
def update_item_promotions
|
|
181
|
+
[*line_items, *shipments].each do |item|
|
|
182
|
+
promotion_adjustments = item.adjustments.select(&:promotion?)
|
|
183
|
+
|
|
184
|
+
promotion_adjustments.each(&:update!)
|
|
185
|
+
Spree::Config.promotion_chooser_class.new(promotion_adjustments).update
|
|
186
|
+
|
|
187
|
+
item.promo_total = promotion_adjustments.select(&:eligible?).sum(&:amount)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Update and select the best promotion adjustment for the order.
|
|
192
|
+
# We don't update the order.promo_total yet. Order totals are updated later
|
|
193
|
+
# in #update_adjustment_total since they include the totals from the order's
|
|
194
|
+
# line items and/or shipments.
|
|
195
|
+
def update_order_promotions
|
|
196
|
+
promotion_adjustments = order.adjustments.select(&:promotion?)
|
|
197
|
+
promotion_adjustments.each(&:update!)
|
|
198
|
+
Spree::Config.promotion_chooser_class.new(promotion_adjustments).update
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def update_taxes
|
|
202
|
+
Spree::Config.tax_adjuster_class.new(order).adjust!
|
|
203
|
+
|
|
204
|
+
[*line_items, *shipments].each do |item|
|
|
205
|
+
tax_adjustments = item.adjustments.select(&:tax?)
|
|
206
|
+
# Tax adjustments come in not one but *two* exciting flavours:
|
|
207
|
+
# Included & additional
|
|
208
|
+
|
|
209
|
+
# Included tax adjustments are those which are included in the price.
|
|
210
|
+
# These ones should not affect the eventual total price.
|
|
211
|
+
#
|
|
212
|
+
# Additional tax adjustments are the opposite, affecting the final total.
|
|
213
|
+
item.included_tax_total = tax_adjustments.select(&:included?).sum(&:amount)
|
|
214
|
+
item.additional_tax_total = tax_adjustments.reject(&:included?).sum(&:amount)
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def update_cancellations
|
|
219
|
+
line_items.each do |line_item|
|
|
220
|
+
line_item.adjustments.select(&:cancellation?).each(&:update!)
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def update_item_totals
|
|
225
|
+
[*line_items, *shipments].each do |item|
|
|
226
|
+
# The cancellation_total isn't persisted anywhere but is included in
|
|
227
|
+
# the adjustment_total
|
|
228
|
+
item_cancellation_total = item.adjustments.select(&:cancellation?).sum(&:amount)
|
|
229
|
+
|
|
230
|
+
item.adjustment_total = item.promo_total +
|
|
231
|
+
item.additional_tax_total +
|
|
232
|
+
item_cancellation_total
|
|
233
|
+
|
|
234
|
+
if item.changed?
|
|
235
|
+
item.update_columns(
|
|
236
|
+
promo_total: item.promo_total,
|
|
237
|
+
included_tax_total: item.included_tax_total,
|
|
238
|
+
additional_tax_total: item.additional_tax_total,
|
|
239
|
+
adjustment_total: item.adjustment_total,
|
|
240
|
+
updated_at: Time.current,
|
|
241
|
+
)
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
167
245
|
end
|
|
168
246
|
end
|
data/app/models/spree/payment.rb
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
module Spree
|
|
2
|
+
# Manage and process a payment for an order, from a specific
|
|
3
|
+
# source (e.g. `Spree::CreditCard`) using a specific payment method (e.g
|
|
4
|
+
# `Solidus::Gateway::Braintree`).
|
|
5
|
+
#
|
|
2
6
|
class Payment < Spree::Base
|
|
3
7
|
include Spree::Payment::Processing
|
|
4
8
|
|
|
@@ -39,7 +43,6 @@ module Spree
|
|
|
39
43
|
|
|
40
44
|
validates :amount, numericality: true
|
|
41
45
|
validates :source, presence: true, if: :source_required?
|
|
42
|
-
validates :payment_method, presence: true
|
|
43
46
|
|
|
44
47
|
default_scope -> { order(:created_at) }
|
|
45
48
|
|
|
@@ -249,7 +252,11 @@ WARN
|
|
|
249
252
|
|
|
250
253
|
def invalidate_old_payments
|
|
251
254
|
if !store_credit? && !['invalid', 'failed'].include?(state)
|
|
252
|
-
order.payments.
|
|
255
|
+
order.payments.select do |payment|
|
|
256
|
+
payment.state == 'checkout' &&
|
|
257
|
+
payment.payment_method_id == payment_method.try!(:id) &&
|
|
258
|
+
payment.id != id
|
|
259
|
+
end.each(&:invalidate!)
|
|
253
260
|
end
|
|
254
261
|
end
|
|
255
262
|
|
|
@@ -85,15 +85,21 @@ module Spree
|
|
|
85
85
|
|
|
86
86
|
def gateway_options
|
|
87
87
|
order.reload
|
|
88
|
-
options = {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
88
|
+
options = {
|
|
89
|
+
email: order.email,
|
|
90
|
+
customer: order.email,
|
|
91
|
+
customer_id: order.user_id,
|
|
92
|
+
ip: order.last_ip_address,
|
|
93
|
+
# Need to pass in a unique identifier here to make some
|
|
94
|
+
# payment gateways happy.
|
|
95
|
+
#
|
|
96
|
+
# For more information, please see Spree::Payment#set_unique_identifier
|
|
97
|
+
order_id: gateway_order_id,
|
|
98
|
+
# The originator is passed to options used by the payment method.
|
|
99
|
+
# One example of a place that it is used is in:
|
|
100
|
+
# app/models/spree/payment_method/store_credit.rb
|
|
101
|
+
originator: self
|
|
102
|
+
}
|
|
97
103
|
|
|
98
104
|
options[:shipping] = order.ship_total * 100
|
|
99
105
|
options[:tax] = order.additional_tax_total * 100
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
module Spree
|
|
2
|
+
# An abstract class which is implemented most commonly as a `Spree::Gateway`.
|
|
3
|
+
#
|
|
2
4
|
class PaymentMethod < Spree::Base
|
|
3
5
|
acts_as_paranoid
|
|
4
6
|
acts_as_list
|
|
@@ -12,6 +14,10 @@ module Spree
|
|
|
12
14
|
has_many :stores, through: :store_payment_methods
|
|
13
15
|
|
|
14
16
|
scope :ordered_by_position, -> { order(:position) }
|
|
17
|
+
scope :active, -> { where(active: true) }
|
|
18
|
+
scope :available_to_users, -> { where(available_to_users: true) }
|
|
19
|
+
scope :available_to_admin, -> { where(available_to_admin: true) }
|
|
20
|
+
scope :available_to_store, -> (store) { (store.present? && store.payment_methods.empty?) ? self : store.payment_methods }
|
|
15
21
|
|
|
16
22
|
include Spree::Preferences::StaticallyConfigurable
|
|
17
23
|
|
|
@@ -30,11 +36,48 @@ module Spree
|
|
|
30
36
|
raise ::NotImplementedError, "You must implement payment_source_class method for #{self.class}."
|
|
31
37
|
end
|
|
32
38
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
# @deprecated Use {#available_to_users=} and {#available_to_admin=} instead
|
|
40
|
+
def display_on=(value)
|
|
41
|
+
Spree::Deprecation.warn "Spree::PaymentMethod#display_on= is deprecated."\
|
|
42
|
+
"Please use #available_to_users= and #available_to_admin= instead."
|
|
43
|
+
self.available_to_users = value.blank? || value == 'front_end'
|
|
44
|
+
self.available_to_admin = value.blank? || value == 'back_end'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @deprecated Use {#available_to_users} and {#available_to_admin} instead
|
|
48
|
+
def display_on
|
|
49
|
+
Spree::Deprecation.warn "Spree::PaymentMethod#display_on is deprecated."\
|
|
50
|
+
"Please use #available_to_users and #available_to_admin instead."
|
|
51
|
+
if available_to_users? && available_to_admin?
|
|
52
|
+
''
|
|
53
|
+
elsif available_to_users?
|
|
54
|
+
'front_end'
|
|
55
|
+
elsif available_to_admin?
|
|
56
|
+
'back_end'
|
|
57
|
+
else
|
|
58
|
+
'none'
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def self.available(display_on=nil, store: nil)
|
|
63
|
+
Spree::Deprecation.warn "Spree::PaymentMethod.available is deprecated."\
|
|
64
|
+
"Please use .active, .available_to_users, and .available_to_admin scopes instead."\
|
|
65
|
+
"For payment methods associated with a specific store, use Spree::PaymentMethod.available_to_store(your_store)"\
|
|
66
|
+
" as the base applying any further filtering"
|
|
67
|
+
|
|
68
|
+
display_on = display_on.to_s
|
|
69
|
+
|
|
70
|
+
available_payment_methods =
|
|
71
|
+
case display_on
|
|
72
|
+
when 'front_end'
|
|
73
|
+
active.available_to_users
|
|
74
|
+
when 'back_end'
|
|
75
|
+
active.available_to_admin
|
|
76
|
+
else
|
|
77
|
+
active.available_to_users.available_to_admin
|
|
78
|
+
end
|
|
79
|
+
available_payment_methods.select do |p|
|
|
80
|
+
store.nil? || store.payment_methods.empty? || store.payment_methods.include?(p)
|
|
38
81
|
end
|
|
39
82
|
end
|
|
40
83
|
|
data/app/models/spree/price.rb
CHANGED
|
@@ -18,10 +18,11 @@ module Spree
|
|
|
18
18
|
validates :currency, inclusion: { in: ::Money::Currency.all.map(&:iso_code), message: :invalid_code }
|
|
19
19
|
validates :country, presence: true, unless: -> { for_any_country? }
|
|
20
20
|
|
|
21
|
-
scope :currently_valid, -> {
|
|
21
|
+
scope :currently_valid, -> { order("country_iso IS NULL, updated_at DESC") }
|
|
22
|
+
scope :for_master, -> { joins(:variant).where(spree_variants: { is_master: true }) }
|
|
23
|
+
scope :for_variant, -> { joins(:variant).where(spree_variants: { is_master: false }) }
|
|
22
24
|
scope :for_any_country, -> { where(country: nil) }
|
|
23
25
|
scope :with_default_attributes, -> { where(Spree::Config.default_pricing_options.desired_attributes) }
|
|
24
|
-
after_save :set_default_price
|
|
25
26
|
|
|
26
27
|
extend DisplayMoney
|
|
27
28
|
money_methods :amount, :price
|
|
@@ -58,6 +59,10 @@ module Spree
|
|
|
58
59
|
end
|
|
59
60
|
end
|
|
60
61
|
|
|
62
|
+
def country_iso=(country_iso)
|
|
63
|
+
self[:country_iso] = country_iso.presence
|
|
64
|
+
end
|
|
65
|
+
|
|
61
66
|
private
|
|
62
67
|
|
|
63
68
|
def sum_of_vat_amounts
|
|
@@ -69,13 +74,6 @@ module Spree
|
|
|
69
74
|
self.currency ||= Spree::Config[:currency]
|
|
70
75
|
end
|
|
71
76
|
|
|
72
|
-
def set_default_price
|
|
73
|
-
if is_default?
|
|
74
|
-
other_default_prices = variant.prices.currently_valid.where(pricing_options.desired_attributes).where.not(id: id)
|
|
75
|
-
other_default_prices.update_all(is_default: false)
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
77
|
def pricing_options
|
|
80
78
|
Spree::Config.pricing_options_class.from_price(self)
|
|
81
79
|
end
|
data/app/models/spree/product.rb
CHANGED
|
@@ -74,7 +74,6 @@ module Spree
|
|
|
74
74
|
|
|
75
75
|
has_many :variant_images, -> { order(:position) }, source: :images, through: :variants_including_master
|
|
76
76
|
|
|
77
|
-
after_create :add_associations_from_prototype
|
|
78
77
|
after_create :build_variants_from_option_values_hash, if: :option_values_hash
|
|
79
78
|
|
|
80
79
|
after_destroy :punch_slug
|
|
@@ -114,17 +113,6 @@ module Spree
|
|
|
114
113
|
super || TaxCategory.find_by(is_default: true)
|
|
115
114
|
end
|
|
116
115
|
|
|
117
|
-
# Overrides the prototype_id setter in order to ensure it is cast to an
|
|
118
|
-
# integer.
|
|
119
|
-
#
|
|
120
|
-
# @param value [#to_i] the intended new value
|
|
121
|
-
# @!attribute [rw] prototype_id
|
|
122
|
-
# @return [Fixnum]
|
|
123
|
-
attr_reader :prototype_id
|
|
124
|
-
def prototype_id=(value)
|
|
125
|
-
@prototype_id = value.to_i
|
|
126
|
-
end
|
|
127
|
-
|
|
128
116
|
# Ensures option_types and product_option_types exist for keys in
|
|
129
117
|
# option_values_hash.
|
|
130
118
|
#
|
|
@@ -227,9 +215,7 @@ module Spree
|
|
|
227
215
|
|
|
228
216
|
# @return [Boolean] true if there are no option values
|
|
229
217
|
def empty_option_values?
|
|
230
|
-
options.empty? ||
|
|
231
|
-
opt.option_type.option_values.empty?
|
|
232
|
-
end
|
|
218
|
+
options.empty? || !option_types.left_joins(:option_values).where('spree_option_values.id IS NULL').empty?
|
|
233
219
|
end
|
|
234
220
|
|
|
235
221
|
# @param property_name [String] the name of the property to find
|
|
@@ -292,16 +278,6 @@ module Spree
|
|
|
292
278
|
|
|
293
279
|
private
|
|
294
280
|
|
|
295
|
-
def add_associations_from_prototype
|
|
296
|
-
if prototype_id && prototype = Spree::Prototype.find_by(id: prototype_id)
|
|
297
|
-
prototype.properties.each do |property|
|
|
298
|
-
product_properties.create(property: property)
|
|
299
|
-
end
|
|
300
|
-
self.option_types = prototype.option_types
|
|
301
|
-
self.taxons = prototype.taxons
|
|
302
|
-
end
|
|
303
|
-
end
|
|
304
|
-
|
|
305
281
|
def any_variants_not_track_inventory?
|
|
306
282
|
if variants_including_master.loaded?
|
|
307
283
|
variants_including_master.any? { |v| !v.should_track_inventory? }
|
|
@@ -7,10 +7,10 @@ module Spree
|
|
|
7
7
|
|
|
8
8
|
belongs_to :promotion_category
|
|
9
9
|
|
|
10
|
-
has_many :promotion_rules, autosave: true, dependent: :destroy
|
|
10
|
+
has_many :promotion_rules, autosave: true, dependent: :destroy, inverse_of: :promotion
|
|
11
11
|
alias_method :rules, :promotion_rules
|
|
12
12
|
|
|
13
|
-
has_many :promotion_actions, autosave: true, dependent: :destroy
|
|
13
|
+
has_many :promotion_actions, autosave: true, dependent: :destroy, inverse_of: :promotion
|
|
14
14
|
alias_method :actions, :promotion_actions
|
|
15
15
|
|
|
16
16
|
has_many :order_promotions, class_name: "Spree::OrderPromotion"
|
|
@@ -82,15 +82,6 @@ module Spree
|
|
|
82
82
|
!active?
|
|
83
83
|
end
|
|
84
84
|
|
|
85
|
-
def expired?
|
|
86
|
-
Spree::Deprecation.warn <<-WARN.squish, caller
|
|
87
|
-
#expired? is deprecated, and will be removed in Solidus 2.0.
|
|
88
|
-
Please use #inactive? instead.
|
|
89
|
-
WARN
|
|
90
|
-
|
|
91
|
-
inactive?
|
|
92
|
-
end
|
|
93
|
-
|
|
94
85
|
def activate(order:, line_item: nil, user: nil, path: nil, promotion_code: nil)
|
|
95
86
|
return unless self.class.order_activatable?(order)
|
|
96
87
|
|
|
@@ -114,10 +105,13 @@ module Spree
|
|
|
114
105
|
|
|
115
106
|
if action_taken
|
|
116
107
|
# connect to the order
|
|
117
|
-
order_promotions.find_or_create_by!(
|
|
118
|
-
|
|
119
|
-
|
|
108
|
+
order.order_promotions.find_or_create_by!(
|
|
109
|
+
promotion: self,
|
|
110
|
+
promotion_code: promotion_code,
|
|
120
111
|
)
|
|
112
|
+
order.promotions.reset
|
|
113
|
+
order_promotions.reset
|
|
114
|
+
orders.reset
|
|
121
115
|
end
|
|
122
116
|
|
|
123
117
|
action_taken
|
|
@@ -220,6 +214,20 @@ module Spree
|
|
|
220
214
|
end
|
|
221
215
|
end
|
|
222
216
|
|
|
217
|
+
# Removes a promotion and any adjustments or other side effects from an
|
|
218
|
+
# order.
|
|
219
|
+
# @param order [Spree::Order] the order to remove the promotion from.
|
|
220
|
+
# @return [void]
|
|
221
|
+
def remove_from(order)
|
|
222
|
+
actions.each do |action|
|
|
223
|
+
action.remove_from(order)
|
|
224
|
+
end
|
|
225
|
+
# note: this destroys the join table entry, not the promotion itself
|
|
226
|
+
order.promotions.destroy(self)
|
|
227
|
+
order.order_promotions.reset
|
|
228
|
+
order_promotions.reset
|
|
229
|
+
end
|
|
230
|
+
|
|
223
231
|
private
|
|
224
232
|
|
|
225
233
|
def blacklisted?(promotable)
|