solidus_core 2.11.10 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +6 -2
- data/app/assets/javascripts/spree.js.erb +0 -51
- data/app/controllers/spree/base_controller.rb +1 -1
- data/app/helpers/spree/base_helper.rb +1 -1
- data/app/helpers/spree/products_helper.rb +2 -2
- data/app/helpers/spree/store_helper.rb +0 -11
- data/app/mailers/spree/carton_mailer.rb +1 -5
- data/app/models/concerns/spree/active_storage_adapter/attachment.rb +30 -11
- data/app/models/concerns/spree/active_storage_adapter.rb +1 -1
- data/app/models/concerns/spree/adjustment_source.rb +0 -15
- data/app/models/concerns/spree/calculated_adjustments.rb +0 -18
- data/app/models/concerns/spree/default_price.rb +39 -10
- data/app/models/concerns/spree/ransackable_attributes.rb +24 -4
- data/app/models/concerns/spree/soft_deletable.rb +2 -4
- data/app/models/concerns/spree/user_address_book.rb +10 -37
- data/app/models/concerns/spree/user_methods.rb +38 -13
- data/app/models/spree/ability.rb +0 -37
- data/app/models/spree/address/name.rb +2 -20
- data/app/models/spree/address.rb +8 -186
- data/app/models/spree/adjustment.rb +7 -33
- data/app/models/spree/base.rb +0 -53
- data/app/models/spree/calculator/flat_fee.rb +21 -0
- data/app/models/spree/calculator/flexi_rate.rb +0 -5
- data/app/models/spree/calculator.rb +0 -7
- data/app/models/spree/carton.rb +1 -1
- data/app/models/spree/country.rb +2 -7
- data/app/models/spree/credit_card.rb +1 -28
- data/app/models/spree/customer_return.rb +5 -7
- data/app/models/spree/image/active_storage_attachment.rb +2 -7
- data/app/models/spree/image/paperclip_attachment.rb +2 -2
- data/app/models/spree/image.rb +0 -7
- data/app/models/spree/inventory_unit.rb +0 -21
- data/app/models/spree/line_item.rb +6 -49
- data/app/models/spree/log_entry.rb +74 -1
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/option_value.rb +10 -1
- data/app/models/spree/order/number_generator.rb +7 -1
- data/app/models/spree/order.rb +82 -170
- data/app/models/spree/order_cancellations.rb +4 -24
- data/app/models/spree/order_contents.rb +2 -1
- data/app/models/spree/order_inventory.rb +1 -1
- data/app/models/spree/order_merger.rb +2 -2
- data/app/models/spree/order_promotion.rb +1 -1
- data/app/models/spree/order_shipping.rb +6 -9
- data/app/models/spree/order_taxation.rb +6 -4
- data/app/models/spree/order_updater.rb +17 -16
- data/app/models/spree/payment/cancellation.rb +1 -1
- data/app/models/spree/payment/processing.rb +58 -55
- data/app/models/spree/payment.rb +0 -3
- data/app/models/spree/payment_create.rb +1 -13
- data/app/models/spree/payment_method/bogus_credit_card.rb +6 -7
- data/app/models/spree/payment_method/credit_card.rb +1 -3
- data/app/models/spree/payment_method/simple_bogus_credit_card.rb +8 -0
- data/app/models/spree/payment_method.rb +26 -110
- data/app/models/spree/price.rb +3 -3
- data/app/models/spree/product/scopes.rb +24 -33
- data/app/models/spree/product.rb +15 -42
- data/app/models/spree/product_property.rb +1 -1
- data/app/models/spree/promotion/actions/create_adjustment.rb +4 -3
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +5 -9
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -3
- data/app/models/spree/promotion/actions/free_shipping.rb +1 -0
- data/app/models/spree/promotion/order_adjustments_recalculator.rb +92 -0
- data/app/models/spree/promotion/rules/item_total.rb +50 -6
- data/app/models/spree/promotion/rules/product.rb +20 -8
- data/app/models/spree/promotion/rules/store.rb +4 -0
- data/app/models/spree/promotion/rules/taxon.rb +6 -15
- data/app/models/spree/promotion/rules/user.rb +4 -0
- data/app/models/spree/promotion.rb +39 -32
- data/app/models/spree/promotion_action.rb +6 -9
- data/app/models/spree/promotion_code/batch_builder.rb +0 -14
- data/app/models/spree/promotion_code.rb +11 -7
- data/app/models/spree/promotion_handler/cart.rb +26 -6
- data/app/models/spree/promotion_rule.rb +5 -0
- data/app/models/spree/property.rb +1 -1
- data/app/models/spree/refund.rb +8 -52
- data/app/models/spree/reimbursement.rb +5 -43
- data/app/models/spree/reimbursement_performer.rb +2 -8
- data/app/models/spree/reimbursement_type/credit.rb +1 -4
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +1 -2
- data/app/models/spree/reimbursement_type/store_credit.rb +1 -4
- data/app/models/spree/return_authorization.rb +2 -5
- data/app/models/spree/return_item.rb +4 -24
- data/app/models/spree/shipment.rb +3 -56
- data/app/models/spree/shipping_method.rb +0 -25
- data/app/models/spree/shipping_rate.rb +0 -2
- data/app/models/spree/shipping_rate_tax.rb +1 -1
- data/app/models/spree/state.rb +1 -5
- data/app/models/spree/stock/allocator/on_hand_first.rb +2 -2
- data/app/models/spree/stock/availability.rb +11 -3
- data/app/models/spree/stock/quantifier.rb +12 -8
- data/app/models/spree/stock/simple_coordinator.rb +8 -26
- data/app/models/spree/stock/splitter/base.rb +2 -7
- data/app/models/spree/stock_item.rb +2 -8
- data/app/models/spree/stock_location.rb +2 -2
- data/app/models/spree/stock_movement.rb +2 -2
- data/app/models/spree/store.rb +0 -12
- data/app/models/spree/store_credit.rb +14 -1
- data/app/models/spree/store_credit_category.rb +0 -32
- data/app/models/spree/store_credit_prioritizer.rb +17 -0
- data/app/models/spree/tax/item_tax.rb +3 -2
- data/app/models/spree/tax/order_tax.rb +3 -1
- data/app/models/spree/tax/tax_helpers.rb +2 -2
- data/app/models/spree/tax/tax_location.rb +4 -7
- data/app/models/spree/tax_calculator/default.rb +31 -0
- data/app/models/spree/tax_calculator/shipping_rate.rb +2 -13
- data/app/models/spree/tax_rate.rb +9 -27
- data/app/models/spree/taxon/active_storage_attachment.rb +2 -7
- data/app/models/spree/taxon/paperclip_attachment.rb +3 -8
- data/app/models/spree/taxon.rb +1 -12
- data/app/models/spree/taxonomy.rb +1 -1
- data/app/models/spree/user_address.rb +0 -5
- data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +1 -1
- data/app/models/spree/variant/price_selector.rb +34 -4
- data/app/models/spree/variant.rb +52 -66
- data/app/models/spree/zone.rb +1 -1
- data/app/subscribers/spree/mailer_subscriber.rb +4 -0
- data/app/subscribers/spree/order_mailer_subscriber.rb +35 -0
- data/config/i18n-tasks.yml +134 -0
- data/config/locales/en.yml +406 -263
- data/db/migrate/20180416083007_add_apply_to_all_to_variant_property_rule.rb +1 -1
- data/db/migrate/20201127212108_add_type_before_removal_to_spree_payment_methods.rb +7 -0
- data/db/migrate/20210312061050_change_column_null_on_prices.rb +7 -0
- data/db/migrate/20220317165036_set_promotions_with_any_policy_to_all_if_possible.rb +20 -0
- data/db/migrate/20220805202442_add_level_to_spree_tax_rates.rb +5 -0
- data/db/migrate/20221123152807_add_shipping_category_to_spree_variants.rb +5 -0
- data/db/seeds.rb +4 -1
- data/lib/generators/solidus/install/app_templates/authentication/custom.rb +21 -0
- data/lib/generators/solidus/install/app_templates/authentication/devise.rb +16 -0
- data/lib/generators/solidus/install/app_templates/authentication/existing.rb +10 -0
- data/lib/generators/solidus/install/app_templates/authentication/none.rb +1 -0
- data/lib/generators/solidus/install/app_templates/frontend/break_down_solidus_gem.rb +54 -0
- data/lib/generators/solidus/install/app_templates/frontend/classic.rb +16 -0
- data/lib/generators/solidus/install/app_templates/frontend/none.rb +2 -0
- data/lib/generators/solidus/install/app_templates/frontend/starter.rb +3 -0
- data/lib/generators/solidus/install/app_templates/payment_method/bolt.rb +13 -0
- data/lib/generators/solidus/install/app_templates/payment_method/none.rb +1 -0
- data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +10 -0
- data/lib/generators/solidus/install/install_generator.rb +247 -149
- data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +15 -60
- data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/backend/all.js +2 -2
- data/lib/generators/solidus/update/templates/config/initializers/new_solidus_defaults.rb.tt +30 -0
- data/lib/generators/solidus/update/update_generator.rb +112 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -4
- data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +2 -6
- data/lib/generators/spree/custom_user/templates/migration.rb.tt +7 -3
- data/lib/generators/spree/dummy/dummy_generator.rb +12 -9
- data/lib/generators/spree/dummy/templates/rails/application.rb.tt +0 -1
- data/lib/generators/spree/dummy/templates/rails/database.yml +81 -39
- data/lib/generators/spree/dummy/templates/rails/storage.yml +3 -0
- data/lib/generators/spree/dummy/templates/rails/test.rb +2 -0
- data/lib/spree/app_configuration.rb +134 -64
- data/lib/spree/bus.rb +20 -0
- data/lib/spree/core/class_constantizer.rb +2 -0
- data/lib/spree/core/controller_helpers/auth.rb +10 -15
- data/lib/spree/core/controller_helpers/current_host.rb +5 -3
- data/lib/spree/core/controller_helpers/order.rb +12 -32
- data/lib/spree/core/controller_helpers/payment_parameters.rb +0 -54
- data/lib/spree/core/controller_helpers/pricing.rb +0 -8
- data/lib/spree/core/controller_helpers/search.rb +1 -1
- data/lib/spree/core/controller_helpers/strong_parameters.rb +0 -4
- data/lib/spree/core/engine.rb +54 -50
- data/lib/spree/core/environment_extension.rb +0 -9
- data/lib/spree/core/product_filters.rb +1 -41
- data/lib/spree/core/role_configuration.rb +0 -14
- data/lib/spree/core/search/base.rb +18 -35
- data/lib/spree/core/state_machines/order.rb +2 -2
- data/lib/spree/core/state_machines.rb +2 -11
- data/lib/spree/core/stock_configuration.rb +18 -0
- data/lib/spree/core/validators/email.rb +5 -3
- data/lib/spree/core/version.rb +5 -1
- data/lib/spree/core/versioned_value.rb +75 -0
- data/lib/spree/core.rb +40 -11
- data/lib/spree/deprecation.rb +1 -1
- data/lib/spree/event/configuration.rb +0 -5
- data/lib/spree/event/subscriber.rb +0 -18
- data/lib/spree/event/subscriber_registry.rb +7 -7
- data/lib/spree/event.rb +1 -32
- data/lib/spree/i18n.rb +0 -22
- data/lib/spree/migrations.rb +13 -11
- data/lib/spree/money.rb +3 -18
- data/lib/spree/permission_sets/default_customer.rb +8 -1
- data/lib/spree/permitted_attributes.rb +17 -59
- data/lib/spree/preferences/configuration.rb +84 -0
- data/lib/spree/preferences/preferable.rb +13 -0
- data/lib/spree/preferences/preferable_class_methods.rb +37 -4
- data/lib/spree/preferences/preference_differentiator.rb +29 -0
- data/lib/spree/preferences/static_model_preferences.rb +25 -10
- data/lib/spree/rails_compatibility.rb +106 -0
- data/lib/spree/testing_support/blacklist_urls.rb +1 -1
- data/lib/spree/testing_support/bus_helpers.rb +101 -0
- data/lib/spree/testing_support/capybara_ext.rb +0 -30
- data/lib/spree/testing_support/common_rake.rb +71 -23
- data/lib/spree/testing_support/controller_requests.rb +0 -82
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +1 -1
- data/lib/spree/testing_support/dummy_app/database.yml +42 -22
- data/lib/spree/testing_support/dummy_app/migrations.rb +0 -3
- data/lib/spree/testing_support/dummy_app.rb +47 -34
- data/lib/spree/testing_support/factories/address_factory.rb +9 -6
- data/lib/spree/testing_support/factories/calculator_factory.rb +3 -0
- data/lib/spree/testing_support/factories/country_factory.rb +1 -2
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -1
- data/lib/spree/testing_support/factories/order_factory.rb +8 -5
- data/lib/spree/testing_support/factories/product_factory.rb +4 -1
- data/lib/spree/testing_support/factories/promotion_factory.rb +28 -14
- data/lib/spree/testing_support/factories/refund_factory.rb +0 -1
- data/lib/spree/testing_support/factories/state_factory.rb +8 -2
- data/lib/spree/testing_support/factories/store_credit_factory.rb +4 -4
- data/lib/spree/testing_support/factories/user_factory.rb +6 -0
- data/lib/spree/testing_support/factory_bot.rb +2 -2
- data/lib/spree/testing_support/order_walkthrough.rb +6 -8
- data/lib/spree/testing_support/preferences.rb +0 -25
- data/lib/spree/testing_support/silence_deprecations.rb +9 -0
- data/lib/tasks/colorado_delivery_fee.rake +28 -0
- data/lib/tasks/payment_method.rake +29 -0
- data/lib/tasks/solidus/check_orders_with_invalid_email.rake +18 -0
- data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +8 -0
- data/lib/tasks/solidus/split_promotions_with_any_match_policy.rake +33 -0
- data/solidus_core.gemspec +14 -7
- metadata +127 -78
- data/app/mailers/spree/test_mailer.rb +0 -13
- data/app/models/concerns/spree/user_payment_source.rb +0 -26
- data/app/models/spree/calculator/free_shipping.rb +0 -22
- data/app/models/spree/calculator/percent_per_item.rb +0 -51
- data/app/models/spree/calculator/price_sack.rb +0 -28
- data/app/models/spree/gateway/bogus.rb +0 -13
- data/app/models/spree/gateway/bogus_simple.rb +0 -13
- data/app/models/spree/gateway.rb +0 -14
- data/app/models/spree/order/checkout.rb +0 -244
- data/app/models/spree/order_capturing.rb +0 -50
- data/app/models/spree/promotion_handler/free_shipping.rb +0 -9
- data/app/models/spree/tax/shipping_rate_taxer.rb +0 -24
- data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -10
- data/lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -9
- data/lib/generators/spree/install/install_generator.rb +0 -15
- data/lib/solidus/migrations/rename_gateways.rb +0 -41
- data/lib/spree/core/current_store.rb +0 -24
- data/lib/spree/paranoia_deprecations.rb +0 -41
- data/lib/spree/promo/environment.rb +0 -12
- data/lib/spree/testing_support/bar_ability.rb +0 -19
- data/lib/tasks/core.rake +0 -104
- data/lib/tasks/email.rake +0 -12
- data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +0 -119
- data/lib/tasks/migrations/migrate_address_names.rake +0 -158
- data/lib/tasks/migrations/migrate_default_billing_addresses_to_address_book.rake +0 -26
- data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +0 -22
- data/lib/tasks/migrations/migrate_user_addresses.rake +0 -34
- data/lib/tasks/migrations/rename_gateways.rake +0 -23
- data/lib/tasks/order_capturing.rake +0 -27
- data/lib/tasks/upgrade.rake +0 -13
@@ -3,7 +3,7 @@
|
|
3
3
|
module Spree
|
4
4
|
class OrderUpdater
|
5
5
|
attr_reader :order
|
6
|
-
delegate :payments, :line_items, :adjustments, :all_adjustments, :shipments, :
|
6
|
+
delegate :payments, :line_items, :adjustments, :all_adjustments, :shipments, :quantity, to: :order
|
7
7
|
|
8
8
|
def initialize(order)
|
9
9
|
@order = order
|
@@ -26,20 +26,11 @@ module Spree
|
|
26
26
|
update_shipments
|
27
27
|
update_shipment_state
|
28
28
|
end
|
29
|
-
|
30
|
-
Spree::Event.fire 'order_recalculated', order: order
|
29
|
+
Spree::Bus.publish :order_recalculated, order: order
|
31
30
|
persist_totals
|
32
31
|
end
|
33
32
|
end
|
34
33
|
|
35
|
-
def run_hooks
|
36
|
-
Spree::Deprecation.warn \
|
37
|
-
"This method is deprecated. Please run your hooks by subscribing " \
|
38
|
-
"to `order_recalculated` and/or `order_finalized` events instead, depending " \
|
39
|
-
" on when OrderUpdater#run_hooks was called.", caller(1)
|
40
|
-
update_hooks.each { |hook| order.send hook }
|
41
|
-
end
|
42
|
-
|
43
34
|
# Updates the +shipment_state+ attribute according to the following logic:
|
44
35
|
#
|
45
36
|
# shipped when all Shipments are in the "shipped" state
|
@@ -119,8 +110,7 @@ module Spree
|
|
119
110
|
# http://www.hmrc.gov.uk/vat/managing/charging/discounts-etc.htm#1
|
120
111
|
# It also fits the criteria for sales tax as outlined here:
|
121
112
|
# http://www.boe.ca.gov/formspubs/pub113/
|
122
|
-
|
123
|
-
update_order_promotions
|
113
|
+
update_promotions
|
124
114
|
update_taxes
|
125
115
|
update_cancellations
|
126
116
|
update_item_totals
|
@@ -166,11 +156,13 @@ module Spree
|
|
166
156
|
recalculate_adjustments
|
167
157
|
|
168
158
|
all_items = line_items + shipments
|
159
|
+
order_tax_adjustments = adjustments.select(&:eligible?).select(&:tax?)
|
169
160
|
|
170
161
|
order.adjustment_total = all_items.sum(&:adjustment_total) + adjustments.select(&:eligible?).sum(&:amount)
|
171
|
-
order.included_tax_total = all_items.sum(&:included_tax_total)
|
172
|
-
order.additional_tax_total = all_items.sum(&:additional_tax_total)
|
162
|
+
order.included_tax_total = all_items.sum(&:included_tax_total) + order_tax_adjustments.select(&:included?).sum(&:amount)
|
163
|
+
order.additional_tax_total = all_items.sum(&:additional_tax_total) + order_tax_adjustments.reject(&:included?).sum(&:amount)
|
173
164
|
|
165
|
+
# TODO: Delete this line in Solidus 4.0, when it is run in `update_promotions`.
|
174
166
|
order.promo_total = all_items.sum(&:promo_total) + adjustments.select(&:eligible?).select(&:promotion?).sum(&:amount)
|
175
167
|
|
176
168
|
update_order_total
|
@@ -186,7 +178,7 @@ module Spree
|
|
186
178
|
end
|
187
179
|
|
188
180
|
def persist_totals
|
189
|
-
order.save!
|
181
|
+
order.save!
|
190
182
|
end
|
191
183
|
|
192
184
|
def log_state_change(name)
|
@@ -204,6 +196,11 @@ module Spree
|
|
204
196
|
end
|
205
197
|
end
|
206
198
|
|
199
|
+
def update_promotions
|
200
|
+
Spree::Config.promotion_adjuster_class.new(order).call
|
201
|
+
end
|
202
|
+
|
203
|
+
# DEPRECATED; this functionality is handled in #update_promotions
|
207
204
|
def update_item_promotions
|
208
205
|
[*line_items, *shipments].each do |item|
|
209
206
|
promotion_adjustments = item.adjustments.select(&:promotion?)
|
@@ -214,16 +211,20 @@ module Spree
|
|
214
211
|
item.promo_total = promotion_adjustments.select(&:eligible?).sum(&:amount)
|
215
212
|
end
|
216
213
|
end
|
214
|
+
deprecate update_item_promotions: :update_promotions, deprecator: Spree::Deprecation
|
217
215
|
|
218
216
|
# Update and select the best promotion adjustment for the order.
|
219
217
|
# We don't update the order.promo_total yet. Order totals are updated later
|
220
218
|
# in #update_adjustment_total since they include the totals from the order's
|
221
219
|
# line items and/or shipments.
|
220
|
+
#
|
221
|
+
# DEPRECATED; this functionality is handled in #update_promotions
|
222
222
|
def update_order_promotions
|
223
223
|
promotion_adjustments = order.adjustments.select(&:promotion?)
|
224
224
|
promotion_adjustments.each(&:recalculate)
|
225
225
|
Spree::Config.promotion_chooser_class.new(promotion_adjustments).update
|
226
226
|
end
|
227
|
+
deprecate update_order_promotions: :update_promotions, deprecator: Spree::Deprecation
|
227
228
|
|
228
229
|
def update_taxes
|
229
230
|
Spree::Config.tax_adjuster_class.new(order).adjust!
|
@@ -29,7 +29,7 @@ module Spree
|
|
29
29
|
if response = payment.payment_method.try_void(payment)
|
30
30
|
payment.handle_void_response(response)
|
31
31
|
else
|
32
|
-
payment.refunds.create!(amount: payment.credit_allowed, reason: refund_reason
|
32
|
+
payment.refunds.create!(amount: payment.credit_allowed, reason: refund_reason).perform!
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -35,12 +35,36 @@ module Spree
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def authorize!
|
38
|
-
|
38
|
+
return unless check_payment_preconditions!
|
39
|
+
|
40
|
+
started_processing!
|
41
|
+
|
42
|
+
protect_from_connection_error do
|
43
|
+
response = payment_method.authorize(
|
44
|
+
money.money.cents,
|
45
|
+
source,
|
46
|
+
gateway_options,
|
47
|
+
)
|
48
|
+
pend! if handle_response(response)
|
49
|
+
end
|
39
50
|
end
|
40
51
|
|
41
52
|
# Captures the entire amount of a payment.
|
42
53
|
def purchase!
|
43
|
-
|
54
|
+
return unless check_payment_preconditions!
|
55
|
+
|
56
|
+
started_processing!
|
57
|
+
|
58
|
+
protect_from_connection_error do
|
59
|
+
response = payment_method.purchase(
|
60
|
+
money.money.cents,
|
61
|
+
source,
|
62
|
+
gateway_options,
|
63
|
+
)
|
64
|
+
complete! if handle_response(response)
|
65
|
+
end
|
66
|
+
|
67
|
+
capture_events.create!(amount: amount)
|
44
68
|
end
|
45
69
|
|
46
70
|
# Takes the amount in cents to capture.
|
@@ -62,7 +86,7 @@ module Spree
|
|
62
86
|
money = ::Money.new(capture_amount, currency)
|
63
87
|
capture_events.create!(amount: money.to_d)
|
64
88
|
update!(amount: captured_amount)
|
65
|
-
handle_response(response
|
89
|
+
complete! if handle_response(response)
|
66
90
|
end
|
67
91
|
end
|
68
92
|
|
@@ -139,67 +163,46 @@ module Spree
|
|
139
163
|
|
140
164
|
private
|
141
165
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
166
|
+
# @raises Spree::Core::GatewayError
|
167
|
+
def check_payment_preconditions!
|
168
|
+
return if processing?
|
169
|
+
return unless payment_method
|
170
|
+
return unless payment_method.source_required?
|
146
171
|
|
147
|
-
|
148
|
-
|
149
|
-
gateway_action(source, :purchase, :complete)
|
150
|
-
# This won't be called if gateway_action raises a GatewayError
|
151
|
-
capture_events.create!(amount: amount)
|
152
|
-
end
|
153
|
-
|
154
|
-
def handle_payment_preconditions(&_block)
|
155
|
-
unless block_given?
|
156
|
-
raise ArgumentError.new("handle_payment_preconditions must be called with a block")
|
172
|
+
unless source
|
173
|
+
gateway_error(I18n.t('spree.payment_processing_failed'))
|
157
174
|
end
|
158
175
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
if source
|
163
|
-
if !processing?
|
164
|
-
if payment_method.supports?(source)
|
165
|
-
yield
|
166
|
-
else
|
167
|
-
invalidate!
|
168
|
-
raise Core::GatewayError.new(I18n.t('spree.payment_method_not_supported'))
|
169
|
-
end
|
170
|
-
end
|
171
|
-
else
|
172
|
-
raise Core::GatewayError.new(I18n.t('spree.payment_processing_failed'))
|
176
|
+
unless payment_method.supports?(source)
|
177
|
+
invalidate!
|
178
|
+
gateway_error(I18n.t('spree.payment_method_not_supported'))
|
173
179
|
end
|
174
|
-
end
|
175
180
|
|
176
|
-
|
177
|
-
protect_from_connection_error do
|
178
|
-
response = payment_method.send(action, money.money.cents,
|
179
|
-
source,
|
180
|
-
gateway_options)
|
181
|
-
handle_response(response, success_state, :failure)
|
182
|
-
end
|
181
|
+
true
|
183
182
|
end
|
184
183
|
|
185
|
-
|
184
|
+
# @returns true if the response is successful
|
185
|
+
# @returns false (and calls #failure) if the response is not successful
|
186
|
+
def handle_response(response)
|
186
187
|
record_response(response)
|
187
188
|
|
188
|
-
|
189
|
-
|
190
|
-
self.response_code = response.authorization
|
191
|
-
self.avs_response = response.avs_result['code']
|
192
|
-
|
193
|
-
if response.cvv_result
|
194
|
-
self.cvv_response_code = response.cvv_result['code']
|
195
|
-
self.cvv_response_message = response.cvv_result['message']
|
196
|
-
end
|
197
|
-
end
|
198
|
-
send("#{success_state}!")
|
199
|
-
else
|
200
|
-
send(failure_state)
|
189
|
+
unless response.success?
|
190
|
+
failure
|
201
191
|
gateway_error(response)
|
192
|
+
return false
|
193
|
+
end
|
194
|
+
|
195
|
+
unless response.authorization.nil?
|
196
|
+
self.response_code = response.authorization
|
197
|
+
self.avs_response = response.avs_result['code']
|
198
|
+
|
199
|
+
if response.cvv_result
|
200
|
+
self.cvv_response_code = response.cvv_result['code']
|
201
|
+
self.cvv_response_message = response.cvv_result['message']
|
202
|
+
end
|
202
203
|
end
|
204
|
+
|
205
|
+
true
|
203
206
|
end
|
204
207
|
|
205
208
|
def record_response(response)
|
@@ -207,9 +210,9 @@ module Spree
|
|
207
210
|
end
|
208
211
|
|
209
212
|
def protect_from_connection_error
|
210
|
-
|
213
|
+
yield
|
211
214
|
rescue ActiveMerchant::ConnectionError => error
|
212
|
-
|
215
|
+
gateway_error(error)
|
213
216
|
end
|
214
217
|
|
215
218
|
def gateway_error(error)
|
data/app/models/spree/payment.rb
CHANGED
@@ -8,9 +8,6 @@ module Spree
|
|
8
8
|
class Payment < Spree::Base
|
9
9
|
include Spree::Payment::Processing
|
10
10
|
|
11
|
-
alias_attribute :identifier, :number
|
12
|
-
deprecate :identifier, :identifier=, deprecator: Spree::Deprecation
|
13
|
-
|
14
11
|
IDENTIFIER_CHARS = (('A'..'Z').to_a + ('0'..'9').to_a - %w(0 1 I O)).freeze
|
15
12
|
NON_RISKY_AVS_CODES = ['B', 'D', 'H', 'J', 'M', 'Q', 'T', 'V', 'X', 'Y'].freeze
|
16
13
|
RISKY_AVS_CODES = ['A', 'C', 'E', 'F', 'G', 'I', 'K', 'L', 'N', 'O', 'P', 'R', 'S', 'U', 'W', 'Z'].freeze
|
@@ -7,7 +7,6 @@ module Spree
|
|
7
7
|
# @param attributes [Hash,ActionController::Parameters] attributes which are assigned to the new payment
|
8
8
|
# * :payment_method_id Id of payment method used for this payment
|
9
9
|
# * :source_attributes Attributes used to build the source of this payment. Usually a {CreditCard}
|
10
|
-
# * :existing_card_id (Integer) Deprecated: The id of an existing {CreditCard} object to use
|
11
10
|
# * :wallet_payment_source_id (Integer): The id of a {WalletPaymentSource} to use
|
12
11
|
# @param request_env [Hash] rack env of user creating the payment
|
13
12
|
# @param payment [Payment] Internal use only. Instead of making a new payment, change the attributes for an existing one.
|
@@ -29,13 +28,7 @@ module Spree
|
|
29
28
|
@payment.request_env = @request_env if @request_env
|
30
29
|
@payment.attributes = @attributes
|
31
30
|
|
32
|
-
if source_attributes[:
|
33
|
-
Spree::Deprecation.warn(
|
34
|
-
"Passing existing_card_id to PaymentCreate is deprecated. Use wallet_payment_source_id instead.",
|
35
|
-
caller,
|
36
|
-
)
|
37
|
-
build_existing_card
|
38
|
-
elsif source_attributes[:wallet_payment_source_id].present?
|
31
|
+
if source_attributes[:wallet_payment_source_id].present?
|
39
32
|
build_from_wallet_payment_source
|
40
33
|
else
|
41
34
|
build_source
|
@@ -67,11 +60,6 @@ module Spree
|
|
67
60
|
build_from_payment_source(wallet_payment_source.payment_source)
|
68
61
|
end
|
69
62
|
|
70
|
-
def build_existing_card
|
71
|
-
credit_card = available_cards.find(source_attributes[:existing_card_id])
|
72
|
-
build_from_payment_source(credit_card)
|
73
|
-
end
|
74
|
-
|
75
63
|
def build_from_payment_source(payment_source)
|
76
64
|
# FIXME: does this work?
|
77
65
|
if source_attributes[:verification_value]
|
@@ -57,13 +57,12 @@ module Spree
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
def void(_response_code, _credit_card,
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE)
|
60
|
+
def void(_response_code, _credit_card, options = {})
|
61
|
+
if options[:originator].completed?
|
62
|
+
ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE)
|
63
|
+
else
|
64
|
+
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE)
|
65
|
+
end
|
67
66
|
end
|
68
67
|
|
69
68
|
def test?
|
@@ -14,7 +14,7 @@ module Spree
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def partial_name
|
17
|
-
|
17
|
+
'gateway'
|
18
18
|
end
|
19
19
|
|
20
20
|
def supports?(source)
|
@@ -27,8 +27,6 @@ module Spree
|
|
27
27
|
source_ids = order.payments.where(payment_method_id: id).pluck(:source_id).uniq
|
28
28
|
payment_source_class.where(id: source_ids).select(&:reusable?)
|
29
29
|
end
|
30
|
-
alias_method :sources_by_order, :reusable_sources_by_order
|
31
|
-
deprecate sources_by_order: :reusable_sources_by_order, deprecator: Spree::Deprecation
|
32
30
|
|
33
31
|
def reusable_sources(order)
|
34
32
|
if order.completed?
|
@@ -22,5 +22,13 @@ module Spree
|
|
22
22
|
ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE, message: FAILURE_MESSAGE, test: true)
|
23
23
|
end
|
24
24
|
end
|
25
|
+
|
26
|
+
def void(_response_code, options = {})
|
27
|
+
if options[:originator].completed?
|
28
|
+
ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE)
|
29
|
+
else
|
30
|
+
ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE)
|
31
|
+
end
|
32
|
+
end
|
25
33
|
end
|
26
34
|
end
|
@@ -13,6 +13,7 @@ module Spree
|
|
13
13
|
#
|
14
14
|
class PaymentMethod < Spree::Base
|
15
15
|
include Spree::Preferences::Persistable
|
16
|
+
class UnsupportedPaymentMethod < StandardError; end
|
16
17
|
|
17
18
|
preference :server, :string, default: 'test'
|
18
19
|
preference :test_mode, :boolean, default: true
|
@@ -21,19 +22,6 @@ module Spree
|
|
21
22
|
|
22
23
|
acts_as_list
|
23
24
|
|
24
|
-
# @private
|
25
|
-
def self.const_missing(name)
|
26
|
-
if name == :DISPLAY
|
27
|
-
Spree::Deprecation.warn(
|
28
|
-
"#{self}::DISPLAY has been deprecated and will be removed in Solidus v3.",
|
29
|
-
caller
|
30
|
-
)
|
31
|
-
const_set(:DISPLAY, [:both, :front_end, :back_end])
|
32
|
-
else
|
33
|
-
super
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
25
|
validates :name, :type, presence: true
|
38
26
|
|
39
27
|
has_many :payments, class_name: "Spree::Payment", inverse_of: :payment_method
|
@@ -70,50 +58,18 @@ module Spree
|
|
70
58
|
end
|
71
59
|
|
72
60
|
class << self
|
73
|
-
# @deprecated Use Spree::Config.environment.payment_methods instead
|
74
|
-
def providers
|
75
|
-
Spree::Deprecation.warn 'Spree::PaymentMethod.providers is deprecated and will be deleted in Solidus 3.0. ' \
|
76
|
-
'Please use Rails.application.config.spree.payment_methods instead'
|
77
|
-
Spree::Config.environment.payment_methods
|
78
|
-
end
|
79
|
-
|
80
|
-
# @deprecated Use {.active}, {.available_to_users}, and {.available_to_admin} scopes instead.
|
81
|
-
def available(display_on = nil, store: nil)
|
82
|
-
Spree::Deprecation.warn "Spree::PaymentMethod.available is deprecated."\
|
83
|
-
"Please use .active, .available_to_users, and .available_to_admin scopes instead."\
|
84
|
-
"For payment methods associated with a specific store, use Spree::PaymentMethod.available_to_store(your_store)"\
|
85
|
-
" as the base applying any further filtering"
|
86
|
-
|
87
|
-
display_on = display_on.to_s
|
88
|
-
|
89
|
-
available_payment_methods =
|
90
|
-
case display_on
|
91
|
-
when 'front_end'
|
92
|
-
active.available_to_users
|
93
|
-
when 'back_end'
|
94
|
-
active.available_to_admin
|
95
|
-
else
|
96
|
-
active.available_to_users.available_to_admin
|
97
|
-
end
|
98
|
-
available_payment_methods.select do |payment|
|
99
|
-
store.nil? || store.payment_methods.empty? || store.payment_methods.include?(payment)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
61
|
def model_name
|
104
62
|
ModelName.new(self, Spree)
|
105
63
|
end
|
106
64
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
Spree::Deprecation.warn "#{self}.find_with_destroyed is deprecated. Use #{self}.with_discarded.find instead"
|
116
|
-
unscoped { find(*args) }
|
65
|
+
def find_sti_class(type_name)
|
66
|
+
super(type_name)
|
67
|
+
rescue ActiveRecord::SubclassNotFound
|
68
|
+
raise UnsupportedPaymentMethod, "Found invalid payment type '#{type_name}'.\n"\
|
69
|
+
"This may happen after switching payment service provider, when payment methods "\
|
70
|
+
"reference old types that are not supported any more.\n"\
|
71
|
+
"If that is the case, consider running 'rake payment_method:deprecate_unsupported_payment_methods' "\
|
72
|
+
"to fix the issue."
|
117
73
|
end
|
118
74
|
end
|
119
75
|
|
@@ -141,8 +97,6 @@ module Spree
|
|
141
97
|
|
142
98
|
@gateway ||= gateway_class.new(gateway_options)
|
143
99
|
end
|
144
|
-
alias_method :provider, :gateway
|
145
|
-
deprecate provider: :gateway, deprecator: Spree::Deprecation
|
146
100
|
|
147
101
|
# Represents all preferences as a Hash
|
148
102
|
#
|
@@ -162,29 +116,6 @@ module Spree
|
|
162
116
|
raise ::NotImplementedError, "You must implement payment_source_class method for #{self.class}."
|
163
117
|
end
|
164
118
|
|
165
|
-
# @deprecated Use {Spree::PaymentMethod#available_to_users=} and {Spree::PaymentMethod#available_to_admin=} instead
|
166
|
-
def display_on=(value)
|
167
|
-
Spree::Deprecation.warn "Spree::PaymentMethod#display_on= is deprecated."\
|
168
|
-
"Please use #available_to_users= and #available_to_admin= instead."
|
169
|
-
self.available_to_users = value.blank? || value == 'front_end'
|
170
|
-
self.available_to_admin = value.blank? || value == 'back_end'
|
171
|
-
end
|
172
|
-
|
173
|
-
# @deprecated Use {Spree::PaymentMethod#available_to_users} and {Spree::PaymentMethod#available_to_admin} instead
|
174
|
-
def display_on
|
175
|
-
Spree::Deprecation.warn "Spree::PaymentMethod#display_on is deprecated."\
|
176
|
-
"Please use #available_to_users and #available_to_admin instead."
|
177
|
-
if available_to_users? && available_to_admin?
|
178
|
-
''
|
179
|
-
elsif available_to_users?
|
180
|
-
'front_end'
|
181
|
-
elsif available_to_admin?
|
182
|
-
'back_end'
|
183
|
-
else
|
184
|
-
'none'
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
119
|
# Used as partial name for your payment method
|
189
120
|
#
|
190
121
|
# Currently your payment method needs to provide these partials:
|
@@ -205,21 +136,7 @@ module Spree
|
|
205
136
|
# The view that represents your payment method on orders through the api
|
206
137
|
#
|
207
138
|
def partial_name
|
208
|
-
|
209
|
-
end
|
210
|
-
|
211
|
-
# :nodoc:
|
212
|
-
# If method_type has been overridden, call it and return the value, otherwise return nil
|
213
|
-
def deprecated_method_type_override
|
214
|
-
if method(:method_type).owner != Spree::PaymentMethod
|
215
|
-
Spree::Deprecation.warn "#{method(:method_type).owner} is overriding PaymentMethod#method_type. This is deprecated and will be removed from Solidus 3.0 (override partial_name instead).", caller[1..-1]
|
216
|
-
method_type
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
def method_type
|
221
|
-
Spree::Deprecation.warn "method_type is deprecated and will be removed from Solidus 3.0 (use partial_name instead)", caller
|
222
|
-
partial_name
|
139
|
+
type.demodulize.underscore
|
223
140
|
end
|
224
141
|
|
225
142
|
def payment_profiles_supported?
|
@@ -256,16 +173,22 @@ module Spree
|
|
256
173
|
# Return +false+ or +nil+ if the void is not possible anymore - because it was already processed by the bank.
|
257
174
|
# Solidus will refund the amount of the payment in this case.
|
258
175
|
#
|
259
|
-
#
|
260
|
-
#
|
261
|
-
# @return [false] if it can't be voided at this time
|
176
|
+
# This default implementation will void the payment if void succeeds,
|
177
|
+
# otherwise it returns false.
|
262
178
|
#
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
179
|
+
# @api public
|
180
|
+
# @param payment [Spree::Payment] the payment to void
|
181
|
+
# @return [ActiveMerchant::Billing::Response|FalseClass]
|
182
|
+
def try_void(payment)
|
183
|
+
void_attempt = if payment.payment_method.payment_profiles_supported?
|
184
|
+
void(payment.transaction_id, payment.source, { originator: payment })
|
185
|
+
else
|
186
|
+
void(payment.transaction_id, { originator: payment })
|
187
|
+
end
|
188
|
+
|
189
|
+
return void_attempt if void_attempt.success?
|
190
|
+
|
191
|
+
false
|
269
192
|
end
|
270
193
|
|
271
194
|
def store_credit?
|
@@ -277,14 +200,7 @@ module Spree
|
|
277
200
|
# Represents the gateway class of this payment method
|
278
201
|
#
|
279
202
|
def gateway_class
|
280
|
-
|
281
|
-
Spree::Deprecation.warn \
|
282
|
-
"provider_class is deprecated and will be removed from Solidus 3.0 " \
|
283
|
-
"(use gateway_class instead)"
|
284
|
-
public_send :provider_class
|
285
|
-
else
|
286
|
-
raise ::NotImplementedError, "You must implement gateway_class method for #{self.class}."
|
287
|
-
end
|
203
|
+
raise ::NotImplementedError, "You must implement gateway_class method for #{self.class}."
|
288
204
|
end
|
289
205
|
end
|
290
206
|
end
|
data/app/models/spree/price.rb
CHANGED
@@ -13,7 +13,7 @@ module Spree
|
|
13
13
|
delegate :tax_rates, to: :variant
|
14
14
|
|
15
15
|
validate :check_price
|
16
|
-
validates :amount,
|
16
|
+
validates :amount, numericality: {
|
17
17
|
greater_than_or_equal_to: 0,
|
18
18
|
less_than_or_equal_to: MAXIMUM_AMOUNT
|
19
19
|
}
|
@@ -30,7 +30,7 @@ module Spree
|
|
30
30
|
money_methods :amount, :price
|
31
31
|
alias_method :money, :display_amount
|
32
32
|
|
33
|
-
self.
|
33
|
+
self.allowed_ransackable_attributes = %w(amount variant_id currency country_iso)
|
34
34
|
|
35
35
|
# An alias for #amount
|
36
36
|
def price
|
@@ -55,7 +55,7 @@ module Spree
|
|
55
55
|
|
56
56
|
def display_country
|
57
57
|
if country_iso
|
58
|
-
"#{country_iso} (#{
|
58
|
+
"#{country_iso} (#{I18n.t(country_iso, scope: [:spree, :country_names])})"
|
59
59
|
else
|
60
60
|
I18n.t(:any_country, scope: [:spree, :admin, :prices])
|
61
61
|
end
|
@@ -29,25 +29,25 @@ module Spree
|
|
29
29
|
scope :descend_by_name, -> { order(name: :desc) }
|
30
30
|
|
31
31
|
add_search_scope :ascend_by_master_price do
|
32
|
-
joins(master: :
|
32
|
+
joins(master: :prices).select('spree_products.* , spree_prices.amount')
|
33
33
|
.order(Spree::Price.arel_table[:amount].asc)
|
34
34
|
end
|
35
35
|
|
36
36
|
add_search_scope :descend_by_master_price do
|
37
|
-
joins(master: :
|
37
|
+
joins(master: :prices).select('spree_products.* , spree_prices.amount')
|
38
38
|
.order(Spree::Price.arel_table[:amount].desc)
|
39
39
|
end
|
40
40
|
|
41
41
|
add_search_scope :price_between do |low, high|
|
42
|
-
joins(master: :
|
42
|
+
joins(master: :prices).where(Price.table_name => { amount: low..high })
|
43
43
|
end
|
44
44
|
|
45
45
|
add_search_scope :master_price_lte do |price|
|
46
|
-
joins(master: :
|
46
|
+
joins(master: :prices).where("#{price_table_name}.amount <= ?", price)
|
47
47
|
end
|
48
48
|
|
49
49
|
add_search_scope :master_price_gte do |price|
|
50
|
-
joins(master: :
|
50
|
+
joins(master: :prices).where("#{price_table_name}.amount >= ?", price)
|
51
51
|
end
|
52
52
|
|
53
53
|
# This scope selects products in taxon AND all its descendants
|
@@ -194,38 +194,29 @@ module Spree
|
|
194
194
|
group("spree_products.id").joins(:taxons).where(Spree::Taxon.arel_table[:name].eq(name))
|
195
195
|
end
|
196
196
|
|
197
|
-
def self.
|
198
|
-
sku_match = "%#{sku}%"
|
197
|
+
def self.with_all_variant_sku_cont(sku)
|
199
198
|
variant_table = Spree::Variant.arel_table
|
200
|
-
subquery = Spree::Variant.where(
|
199
|
+
subquery = Spree::Variant.with_discarded.where(
|
200
|
+
variant_table[:sku].matches("%#{sku}%").and(
|
201
|
+
variant_table[:product_id].eq(arel_table[:id])
|
202
|
+
)
|
203
|
+
)
|
201
204
|
where(subquery.arel.exists)
|
202
205
|
end
|
203
206
|
|
204
|
-
def self.
|
205
|
-
Spree::
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
# AND "spree_variants"."deleted_at" IS NULL LEFT OUTER JOIN "spree_prices" ON
|
218
|
-
# "spree_prices"."variant_id" = "spree_variants"."id" AND "spree_prices"."currency" = 'USD'
|
219
|
-
# AND "spree_prices"."deleted_at" IS NULL WHERE "spree_products"."deleted_at" IS NULL AND ('t'='t')
|
220
|
-
# ORDER BY "spree_prices"."amount" ASC LIMIT 10 OFFSET 0
|
221
|
-
#
|
222
|
-
# Don't allow sort_column, a variable coming from params,
|
223
|
-
# to be anything but a column in the database
|
224
|
-
if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL' && !column_names.include?(sort_column)
|
225
|
-
all
|
226
|
-
else
|
227
|
-
distinct
|
228
|
-
end
|
207
|
+
def self.with_kept_variant_sku_cont(sku)
|
208
|
+
variant_table = Spree::Variant.arel_table
|
209
|
+
subquery = Spree::Variant.where(
|
210
|
+
variant_table[:sku].matches("%#{sku}%").and(
|
211
|
+
variant_table[:product_id].eq(arel_table[:id])
|
212
|
+
)
|
213
|
+
)
|
214
|
+
where(subquery.arel.exists)
|
215
|
+
end
|
216
|
+
|
217
|
+
def self.with_variant_sku_cont(sku)
|
218
|
+
Spree::Deprecation.warn("use .with_kept_variant_sku_cont instead")
|
219
|
+
with_kept_variant_sku_cont(sku)
|
229
220
|
end
|
230
221
|
|
231
222
|
class << self
|