solidus_core 4.6.2 → 4.7.0
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 +13 -13
- data/app/controllers/spree/base_controller.rb +2 -2
- data/app/helpers/spree/base_helper.rb +24 -24
- data/app/helpers/spree/checkout_helper.rb +7 -7
- data/app/helpers/spree/core/controller_helpers/auth.rb +1 -1
- data/app/helpers/spree/core/controller_helpers/common.rb +3 -2
- data/app/helpers/spree/core/controller_helpers/order.rb +3 -5
- data/app/helpers/spree/core/controller_helpers/payment_parameters.rb +1 -2
- data/app/helpers/spree/core/controller_helpers/strong_parameters.rb +10 -10
- data/app/helpers/spree/products_helper.rb +5 -5
- data/app/helpers/spree/store_helper.rb +1 -1
- data/app/mailers/spree/carton_mailer.rb +3 -3
- data/app/mailers/spree/order_mailer.rb +4 -4
- data/app/mailers/spree/reimbursement_mailer.rb +2 -2
- data/app/models/concerns/spree/active_storage_adapter/attachment.rb +5 -5
- data/app/models/concerns/spree/active_storage_adapter/normalization.rb +5 -5
- data/app/models/concerns/spree/active_storage_adapter.rb +2 -2
- data/app/models/concerns/spree/adjustment_source.rb +4 -4
- data/app/models/concerns/spree/display_money.rb +2 -2
- data/app/models/concerns/spree/named_type.rb +1 -1
- data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
- data/app/models/concerns/spree/preferences/persistable.rb +1 -1
- data/app/models/concerns/spree/ransackable_attributes.rb +1 -0
- data/app/models/concerns/spree/soft_deletable.rb +2 -1
- data/app/models/concerns/spree/state_change_tracking.rb +1 -1
- data/app/models/concerns/spree/user_address_book.rb +12 -12
- data/app/models/concerns/spree/user_methods.rb +9 -9
- data/app/models/concerns/spree/user_reporting.rb +1 -0
- data/app/models/spree/ability.rb +1 -1
- data/app/models/spree/address/name.rb +1 -1
- data/app/models/spree/address.rb +7 -7
- data/app/models/spree/adjustment.rb +11 -10
- data/app/models/spree/adjustment_reason.rb +2 -2
- data/app/models/spree/billing_integration.rb +2 -2
- data/app/models/spree/calculator/default_tax.rb +2 -2
- data/app/models/spree/calculator/flat_fee.rb +1 -1
- data/app/models/spree/calculator/flat_rate.rb +2 -2
- data/app/models/spree/calculator/returns/default_refund_amount.rb +3 -3
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +2 -2
- data/app/models/spree/calculator/shipping/flat_rate.rb +3 -3
- data/app/models/spree/calculator/shipping/flexi_rate.rb +8 -8
- data/app/models/spree/calculator/shipping/per_item.rb +3 -3
- data/app/models/spree/calculator/shipping/price_sack.rb +3 -3
- data/app/models/spree/calculator.rb +31 -6
- data/app/models/spree/carton.rb +4 -4
- data/app/models/spree/classification.rb +2 -2
- data/app/models/spree/core/state_machines/order/class_methods.rb +3 -3
- data/app/models/spree/core/state_machines/return_item/acceptance_status.rb +1 -1
- data/app/models/spree/country.rb +1 -1
- data/app/models/spree/credit_card.rb +27 -27
- data/app/models/spree/customer_return.rb +5 -4
- data/app/models/spree/distributed_amounts_handler.rb +1 -1
- data/app/models/spree/fulfilment_changer.rb +22 -22
- data/app/models/spree/image/active_storage_attachment.rb +2 -2
- data/app/models/spree/image/paperclip_attachment.rb +8 -8
- data/app/models/spree/in_memory_order_updater.rb +262 -0
- data/app/models/spree/inventory_unit.rb +11 -11
- data/app/models/spree/item_total.rb +1 -1
- data/app/models/spree/legacy_user.rb +2 -2
- data/app/models/spree/line_item.rb +21 -11
- data/app/models/spree/log_entry.rb +3 -3
- data/app/models/spree/mergeable_orders_finder.rb +44 -0
- data/app/models/spree/money.rb +2 -1
- data/app/models/spree/null_promotion_adjuster.rb +1 -1
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/option_value.rb +2 -2
- data/app/models/spree/order/number_generator.rb +1 -1
- data/app/models/spree/order.rb +66 -64
- data/app/models/spree/order_cancellations.rb +1 -3
- data/app/models/spree/order_inventory.rb +5 -8
- data/app/models/spree/order_mutex.rb +1 -1
- data/app/models/spree/order_shipping.rb +1 -1
- data/app/models/spree/order_updater.rb +59 -37
- data/app/models/spree/payment/cancellation.rb +2 -2
- data/app/models/spree/payment/processing.rb +22 -22
- data/app/models/spree/payment.rb +25 -25
- data/app/models/spree/payment_capture_event.rb +2 -2
- data/app/models/spree/payment_create.rb +1 -1
- data/app/models/spree/payment_method/bogus_credit_card.rb +18 -18
- data/app/models/spree/payment_method/check.rb +3 -3
- data/app/models/spree/payment_method/credit_card.rb +1 -1
- data/app/models/spree/payment_method/simple_bogus_credit_card.rb +3 -3
- data/app/models/spree/payment_method/store_credit.rb +13 -13
- data/app/models/spree/payment_method.rb +12 -11
- data/app/models/spree/payment_source.rb +2 -2
- data/app/models/spree/permission_sets/dashboard_display.rb +3 -3
- data/app/models/spree/permission_sets/default_customer.rb +1 -1
- data/app/models/spree/preference.rb +1 -1
- data/app/models/spree/price.rb +7 -6
- data/app/models/spree/product/scopes.rb +23 -23
- data/app/models/spree/product.rb +37 -41
- data/app/models/spree/product_option_type.rb +2 -2
- data/app/models/spree/product_property.rb +3 -3
- data/app/models/spree/refund.rb +10 -10
- data/app/models/spree/refund_reason.rb +2 -2
- data/app/models/spree/reimbursement/credit.rb +1 -1
- data/app/models/spree/reimbursement.rb +8 -8
- data/app/models/spree/reimbursement_tax_calculator.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +1 -1
- data/app/models/spree/reimbursement_type.rb +2 -2
- data/app/models/spree/return_authorization.rb +7 -6
- data/app/models/spree/return_item/eligibility_validator/base_validator.rb +2 -2
- data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/order_completed.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/rma_required.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
- data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +6 -6
- data/app/models/spree/return_item.rb +31 -30
- data/app/models/spree/return_reason.rb +1 -1
- data/app/models/spree/role.rb +1 -1
- data/app/models/spree/role_user.rb +1 -1
- data/app/models/spree/shipment.rb +37 -29
- data/app/models/spree/shipping_method.rb +9 -9
- data/app/models/spree/shipping_method_category.rb +2 -2
- data/app/models/spree/shipping_rate.rb +12 -10
- data/app/models/spree/shipping_rate_tax.rb +5 -4
- data/app/models/spree/simple_order_contents.rb +2 -2
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/stock/availability.rb +9 -9
- data/app/models/spree/stock/availability_validator.rb +3 -3
- data/app/models/spree/stock/differentiator.rb +2 -2
- data/app/models/spree/stock/estimator.rb +4 -4
- data/app/models/spree/stock/inventory_validator.rb +1 -1
- data/app/models/spree/stock/package.rb +3 -3
- data/app/models/spree/stock_item.rb +5 -5
- data/app/models/spree/stock_location.rb +6 -6
- data/app/models/spree/stock_movement.rb +2 -2
- data/app/models/spree/stock_quantities.rb +2 -2
- data/app/models/spree/store.rb +3 -3
- data/app/models/spree/store_credit.rb +30 -29
- data/app/models/spree/store_credit_category.rb +2 -2
- data/app/models/spree/store_credit_event.rb +6 -6
- data/app/models/spree/store_credit_reason.rb +1 -1
- data/app/models/spree/store_credit_type.rb +3 -3
- data/app/models/spree/store_selector/by_server_name.rb +1 -1
- data/app/models/spree/store_selector/legacy.rb +1 -1
- data/app/models/spree/tax/item_tax.rb +1 -0
- data/app/models/spree/tax/order_tax.rb +1 -0
- data/app/models/spree/tax_category.rb +3 -3
- data/app/models/spree/tax_rate.rb +5 -5
- data/app/models/spree/tax_rate_tax_category.rb +2 -2
- data/app/models/spree/taxon/active_storage_attachment.rb +2 -2
- data/app/models/spree/taxon/paperclip_attachment.rb +4 -4
- data/app/models/spree/taxon.rb +16 -17
- data/app/models/spree/taxon_brand_selector.rb +3 -3
- data/app/models/spree/unauthorized_redirect_handler.rb +1 -1
- data/app/models/spree/unit_cancel.rb +4 -4
- data/app/models/spree/user_address.rb +3 -3
- data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +6 -8
- data/app/models/spree/user_last_url_storer.rb +1 -1
- data/app/models/spree/variant/price_selector.rb +1 -1
- data/app/models/spree/variant/scopes.rb +9 -9
- data/app/models/spree/variant.rb +25 -25
- data/app/models/spree/variant_property_rule.rb +2 -2
- data/app/models/spree/variant_property_rule_condition.rb +1 -1
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +4 -4
- data/app/models/spree/wallet/default_payment_builder.rb +1 -1
- data/app/models/spree/wallet_payment_source.rb +2 -2
- data/app/models/spree/zone.rb +18 -18
- data/app/models/spree/zone_member.rb +1 -1
- data/app/subscribers/spree/carton_shipped_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/order_cancel_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/order_confirmation_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/order_inventory_cancellation_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/reimbursement_mailer_subscriber.rb +2 -2
- data/config/initializers/assets.rb +1 -1
- data/config/initializers/db_query_matchers.rb +9 -0
- data/config/initializers/friendly_id.rb +2 -2
- data/config/initializers/inflections.rb +1 -1
- data/config/initializers/money.rb +1 -1
- data/config/locales/en.yml +1 -0
- data/db/default/spree/countries.rb +7 -7
- data/db/default/spree/return_reasons.rb +11 -11
- data/db/default/spree/stock_locations.rb +1 -1
- data/db/default/spree/store_credit.rb +3 -4
- data/db/default/spree/stores.rb +1 -1
- data/db/default/spree/zones.rb +5 -5
- data/db/migrate/20160101010000_solidus_one_four.rb +16 -16
- data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +3 -3
- data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +7 -6
- data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +10 -10
- data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +6 -6
- data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +1 -1
- data/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb +4 -4
- data/db/migrate/20180322142651_add_amount_remaining_to_store_credit_events.rb +9 -16
- data/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb +1 -0
- data/db/migrate/20210815004823_add_unique_index_to_option_values_variants.rb +3 -3
- data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +1 -1
- data/db/migrate/20250214094207_add_reverse_charge_status_to_store.rb +1 -1
- data/db/migrate/20250225051308_add_vat_id_email_and_reverse_charge_status_to_addresses.rb +1 -1
- data/db/seeds.rb +3 -3
- data/lib/generators/solidus/install/app_templates/authentication/custom.rb +2 -2
- data/lib/generators/solidus/install/app_templates/authentication/devise.rb +3 -3
- data/lib/generators/solidus/install/app_templates/authentication/existing.rb +1 -1
- data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -1
- data/lib/generators/solidus/install/app_templates/payment_method/braintree.rb +1 -1
- data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +1 -1
- data/lib/generators/solidus/install/app_templates/payment_method/stripe.rb +2 -2
- data/lib/generators/solidus/install/install_generator.rb +51 -51
- data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +3 -0
- data/lib/generators/solidus/update/update_generator.rb +29 -29
- data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -6
- data/lib/generators/spree/dummy/dummy_generator.rb +22 -24
- data/lib/generators/spree/dummy/templates/rails/boot.rb +3 -3
- data/lib/generators/spree/dummy/templates/rails/test.rb +4 -4
- data/lib/solidus_core.rb +1 -1
- data/lib/spree/app_configuration.rb +59 -47
- data/lib/spree/bus.rb +1 -1
- data/lib/spree/config.rb +1 -1
- data/lib/spree/core/active_merchant_dependencies.rb +8 -8
- data/lib/spree/core/class_constantizer.rb +1 -1
- data/lib/spree/core/engine.rb +15 -15
- data/lib/spree/core/environment.rb +1 -1
- data/lib/spree/core/environment_extension.rb +2 -2
- data/lib/spree/core/importer/order.rb +15 -15
- data/lib/spree/core/importer/product.rb +4 -4
- data/lib/spree/core/importer.rb +2 -2
- data/lib/spree/core/null_promotion_configuration.rb +7 -7
- data/lib/spree/core/permalinks.rb +1 -1
- data/lib/spree/core/product_filters.rb +94 -93
- data/lib/spree/core/role_configuration.rb +3 -3
- data/lib/spree/core/search/base.rb +5 -6
- data/lib/spree/core/search/variant.rb +3 -3
- data/lib/spree/core/stock_configuration.rb +10 -49
- data/lib/spree/core/validators/email.rb +1 -1
- data/lib/spree/core/version.rb +3 -3
- data/lib/spree/core/versioned_value.rb +4 -6
- data/lib/spree/core.rb +49 -49
- data/lib/spree/deprecated_instance_variable_proxy.rb +1 -1
- data/lib/spree/deprecation.rb +1 -1
- data/lib/spree/deprecator.rb +2 -2
- data/lib/spree/i18n.rb +2 -2
- data/lib/spree/localized_number.rb +3 -3
- data/lib/spree/manipulative_query_monitor.rb +19 -0
- data/lib/spree/migrations.rb +2 -2
- data/lib/spree/permitted_attributes.rb +10 -10
- data/lib/spree/preferences/configuration.rb +5 -5
- data/lib/spree/preferences/preferable.rb +8 -10
- data/lib/spree/preferences/preferable_class_methods.rb +16 -16
- data/lib/spree/preferences/preference_differentiator.rb +1 -1
- data/lib/spree/preferences/scoped_store.rb +2 -2
- data/lib/spree/preferences/static_model_preferences.rb +2 -2
- data/lib/spree/preferences/store.rb +6 -6
- data/lib/spree/testing_support/ability_helpers.rb +30 -30
- data/lib/spree/testing_support/authorization_helpers.rb +6 -5
- data/lib/spree/testing_support/blacklist_urls.rb +1 -1
- data/lib/spree/testing_support/bus_helpers.rb +1 -1
- data/lib/spree/testing_support/capybara_driver.rb +1 -1
- data/lib/spree/testing_support/capybara_ext.rb +12 -12
- data/lib/spree/testing_support/common_rake.rb +17 -16
- data/lib/spree/testing_support/dummy_ability.rb +1 -1
- data/lib/spree/testing_support/dummy_app/migrations.rb +1 -1
- data/lib/spree/testing_support/dummy_app/rake_tasks.rb +5 -5
- data/lib/spree/testing_support/dummy_app/routes.rb +1 -1
- data/lib/spree/testing_support/dummy_app.rb +34 -34
- data/lib/spree/testing_support/extension_rake.rb +2 -2
- data/lib/spree/testing_support/factories/address_factory.rb +12 -12
- data/lib/spree/testing_support/factories/adjustment_factory.rb +7 -7
- data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/calculator_factory.rb +6 -6
- data/lib/spree/testing_support/factories/carton_factory.rb +1 -1
- data/lib/spree/testing_support/factories/country_factory.rb +3 -3
- data/lib/spree/testing_support/factories/credit_card_factory.rb +3 -3
- data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -2
- data/lib/spree/testing_support/factories/image_factory.rb +2 -2
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +4 -4
- data/lib/spree/testing_support/factories/line_item_factory.rb +2 -2
- data/lib/spree/testing_support/factories/option_type_factory.rb +2 -2
- data/lib/spree/testing_support/factories/option_value_factory.rb +2 -2
- data/lib/spree/testing_support/factories/order_factory.rb +16 -16
- data/lib/spree/testing_support/factories/payment_factory.rb +9 -9
- data/lib/spree/testing_support/factories/payment_method_factory.rb +10 -10
- data/lib/spree/testing_support/factories/price_factory.rb +2 -2
- data/lib/spree/testing_support/factories/product_factory.rb +2 -2
- data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
- data/lib/spree/testing_support/factories/property_factory.rb +3 -3
- data/lib/spree/testing_support/factories/refund_factory.rb +2 -2
- data/lib/spree/testing_support/factories/refund_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +3 -3
- data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/role_factory.rb +2 -2
- data/lib/spree/testing_support/factories/shipment_factory.rb +3 -3
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +7 -7
- data/lib/spree/testing_support/factories/shipping_rate_factory.rb +1 -1
- data/lib/spree/testing_support/factories/state_factory.rb +4 -4
- data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_location_factory.rb +7 -7
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +3 -3
- data/lib/spree/testing_support/factories/stock_package_factory.rb +3 -3
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -8
- data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +6 -6
- data/lib/spree/testing_support/factories/store_factory.rb +2 -2
- data/lib/spree/testing_support/factories/tax_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
- data/lib/spree/testing_support/factories/taxon_factory.rb +3 -3
- data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -1
- data/lib/spree/testing_support/factories/user_factory.rb +2 -2
- data/lib/spree/testing_support/factories/variant_factory.rb +2 -2
- data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +1 -1
- data/lib/spree/testing_support/factories/zone_factory.rb +3 -3
- data/lib/spree/testing_support/factory_bot.rb +1 -1
- data/lib/spree/testing_support/flaky.rb +3 -2
- data/lib/spree/testing_support/flash.rb +2 -2
- data/lib/spree/testing_support/order_walkthrough.rb +7 -7
- data/lib/spree/testing_support/preferences.rb +1 -1
- data/lib/spree/testing_support/rake.rb +1 -1
- data/lib/spree/testing_support/shared_examples/calculator.rb +1 -1
- data/lib/spree/testing_support/shared_examples/gallery.rb +7 -7
- data/lib/spree/testing_support/shared_examples/order_factory.rb +9 -9
- data/lib/spree/testing_support/shared_examples/working_factory.rb +1 -1
- data/lib/spree/testing_support/translations.rb +1 -1
- data/lib/spree_core.rb +1 -1
- data/lib/tasks/payment_method.rake +2 -2
- data/solidus_core.gemspec +49 -49
- metadata +60 -54
|
@@ -19,12 +19,12 @@ module Spree
|
|
|
19
19
|
belongs_to :zone, class_name: "Spree::Zone", inverse_of: :tax_rates, optional: true
|
|
20
20
|
|
|
21
21
|
has_many :tax_rate_tax_categories,
|
|
22
|
-
class_name:
|
|
22
|
+
class_name: "Spree::TaxRateTaxCategory",
|
|
23
23
|
dependent: :destroy,
|
|
24
24
|
inverse_of: :tax_rate
|
|
25
25
|
has_many :tax_categories,
|
|
26
26
|
through: :tax_rate_tax_categories,
|
|
27
|
-
class_name:
|
|
27
|
+
class_name: "Spree::TaxCategory",
|
|
28
28
|
inverse_of: :tax_rates
|
|
29
29
|
|
|
30
30
|
has_many :adjustments, as: :source
|
|
@@ -37,12 +37,12 @@ module Spree
|
|
|
37
37
|
# Finds all tax rates whose zones match a given address
|
|
38
38
|
scope :for_address, ->(address) { joins(:zone).merge(Spree::Zone.for_address(address)) }
|
|
39
39
|
scope :for_country,
|
|
40
|
-
|
|
40
|
+
->(country) { for_address(Spree::Tax::TaxLocation.new(country:)) }
|
|
41
41
|
scope :active, -> do
|
|
42
42
|
table = arel_table
|
|
43
43
|
time = Time.current
|
|
44
|
-
where(table[:starts_at].eq(nil).or(table[:starts_at].lt(time)))
|
|
45
|
-
where(table[:expires_at].eq(nil).or(table[:expires_at].gt(time)))
|
|
44
|
+
where(table[:starts_at].eq(nil).or(table[:starts_at].lt(time)))
|
|
45
|
+
.where(table[:expires_at].eq(nil).or(table[:expires_at].gt(time)))
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
# Finds geographically matching tax rates for a tax zone.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
module Spree
|
|
4
4
|
class TaxRateTaxCategory < Spree::Base
|
|
5
|
-
belongs_to :tax_rate, class_name:
|
|
6
|
-
belongs_to :tax_category, class_name:
|
|
5
|
+
belongs_to :tax_rate, class_name: "Spree::TaxRate", inverse_of: :tax_rate_tax_categories, optional: true
|
|
6
|
+
belongs_to :tax_category, class_name: "Spree::TaxCategory", inverse_of: :tax_rate_tax_categories, optional: true
|
|
7
7
|
end
|
|
8
8
|
end
|
|
@@ -6,8 +6,8 @@ module Spree::Taxon::ActiveStorageAttachment
|
|
|
6
6
|
|
|
7
7
|
included do
|
|
8
8
|
has_attachment :icon,
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
styles: Spree::Config.taxon_image_styles,
|
|
10
|
+
default_style: Spree::Config.taxon_image_style_default
|
|
11
11
|
validate :icon_is_an_image
|
|
12
12
|
end
|
|
13
13
|
end
|
|
@@ -7,12 +7,12 @@ module Spree::Taxon::PaperclipAttachment
|
|
|
7
7
|
has_attached_file :icon,
|
|
8
8
|
styles: Spree::Config.taxon_image_styles,
|
|
9
9
|
default_style: Spree::Config.taxon_image_style_default,
|
|
10
|
-
url:
|
|
11
|
-
path:
|
|
12
|
-
default_url:
|
|
10
|
+
url: "/spree/taxons/:id/:style/:basename.:extension",
|
|
11
|
+
path: ":rails_root/public/spree/taxons/:id/:style/:basename.:extension",
|
|
12
|
+
default_url: "/assets/default_taxon.png"
|
|
13
13
|
|
|
14
14
|
validates_attachment :icon,
|
|
15
|
-
content_type: {
|
|
15
|
+
content_type: {content_type: Spree::Config.allowed_image_mime_types}
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def icon_present?
|
data/app/models/spree/taxon.rb
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'spree/core/product_filters'
|
|
4
|
-
|
|
5
3
|
module Spree
|
|
6
4
|
class Taxon < Spree::Base
|
|
7
5
|
extend FriendlyId
|
|
6
|
+
|
|
8
7
|
friendly_id :permalink, use: :history, slug_column: :permalink
|
|
9
8
|
|
|
10
9
|
acts_as_nested_set dependent: :destroy
|
|
11
10
|
|
|
12
|
-
belongs_to :taxonomy, class_name:
|
|
11
|
+
belongs_to :taxonomy, class_name: "Spree::Taxonomy", inverse_of: :taxons
|
|
13
12
|
has_many :classifications, -> { order(:position) }, dependent: :delete_all, inverse_of: :taxon
|
|
14
13
|
has_many :products, through: :classifications
|
|
15
14
|
|
|
@@ -17,11 +16,11 @@ module Spree
|
|
|
17
16
|
after_update :update_child_permalinks, if: :saved_change_to_permalink?
|
|
18
17
|
|
|
19
18
|
validates :name, presence: true
|
|
20
|
-
validates :name, uniqueness: {
|
|
21
|
-
validates :meta_keywords, length: {
|
|
22
|
-
validates :meta_description, length: {
|
|
23
|
-
validates :meta_title, length: {
|
|
24
|
-
validates :taxonomy_id, uniqueness: {
|
|
19
|
+
validates :name, uniqueness: {scope: :parent_id, message: :must_be_unique_under_same_parent}
|
|
20
|
+
validates :meta_keywords, length: {maximum: 255}
|
|
21
|
+
validates :meta_description, length: {maximum: 255}
|
|
22
|
+
validates :meta_title, length: {maximum: 255}
|
|
23
|
+
validates :taxonomy_id, uniqueness: {scope: :parent_id, message: :can_have_only_one_root}, if: -> { root? }
|
|
25
24
|
|
|
26
25
|
after_save :touch_ancestors_and_taxonomy
|
|
27
26
|
after_touch :touch_ancestors_and_taxonomy
|
|
@@ -43,7 +42,7 @@ module Spree
|
|
|
43
42
|
# Sets this taxons permalink to a valid url encoded string based on its
|
|
44
43
|
# name and its parents permalink (if present.)
|
|
45
44
|
def set_permalink
|
|
46
|
-
permalink_tail = permalink.present? ? permalink.split(
|
|
45
|
+
permalink_tail = permalink.present? ? permalink.split("/").last : name
|
|
47
46
|
self.permalink_part = Spree::Config.taxon_url_parametizer_class.parameterize(permalink_tail)
|
|
48
47
|
end
|
|
49
48
|
|
|
@@ -75,7 +74,7 @@ module Spree
|
|
|
75
74
|
def all_products
|
|
76
75
|
scope = Product.joins(:taxons)
|
|
77
76
|
scope.where(
|
|
78
|
-
spree_taxons: {
|
|
77
|
+
spree_taxons: {id: self_and_descendants.select(:id)}
|
|
79
78
|
)
|
|
80
79
|
end
|
|
81
80
|
|
|
@@ -109,14 +108,14 @@ module Spree
|
|
|
109
108
|
end
|
|
110
109
|
|
|
111
110
|
def permalink_part
|
|
112
|
-
permalink.split(
|
|
111
|
+
permalink.split("/").last
|
|
113
112
|
end
|
|
114
113
|
|
|
115
114
|
def permalink_part=(value)
|
|
116
|
-
if parent.present?
|
|
117
|
-
|
|
115
|
+
self.permalink = if parent.present?
|
|
116
|
+
"#{parent.permalink}/#{value}"
|
|
118
117
|
else
|
|
119
|
-
|
|
118
|
+
value
|
|
120
119
|
end
|
|
121
120
|
end
|
|
122
121
|
|
|
@@ -129,13 +128,13 @@ module Spree
|
|
|
129
128
|
# override for {FriendlyId::Slugged#normalize_friendly_id} method,
|
|
130
129
|
# to control over the slug format
|
|
131
130
|
def normalize_friendly_id(value)
|
|
132
|
-
return
|
|
131
|
+
return "" if value.blank?
|
|
133
132
|
|
|
134
|
-
parts = value.to_s.split(
|
|
133
|
+
parts = value.to_s.split("/")
|
|
135
134
|
last_word = parts.pop
|
|
136
135
|
corrected_last_word = Spree::Config.taxon_url_parametizer_class.parameterize(last_word)
|
|
137
136
|
|
|
138
|
-
(parts << corrected_last_word).join(
|
|
137
|
+
(parts << corrected_last_word).join("/")
|
|
139
138
|
end
|
|
140
139
|
|
|
141
140
|
private
|
|
@@ -11,7 +11,7 @@ module Spree
|
|
|
11
11
|
|
|
12
12
|
# This method is responsible for handling unauthorized redirects
|
|
13
13
|
def call
|
|
14
|
-
flash[:error] = I18n.t(
|
|
14
|
+
flash[:error] = I18n.t("spree.authorization_failure")
|
|
15
15
|
redirect_back(fallback_location: "/unauthorized")
|
|
16
16
|
end
|
|
17
17
|
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
# The reason specifies why it was canceled.
|
|
5
5
|
# This class should encapsulate logic related to canceling inventory after order complete
|
|
6
6
|
class Spree::UnitCancel < Spree::Base
|
|
7
|
-
SHORT_SHIP =
|
|
8
|
-
DEFAULT_REASON =
|
|
7
|
+
SHORT_SHIP = "Short Ship"
|
|
8
|
+
DEFAULT_REASON = "Cancel"
|
|
9
9
|
|
|
10
10
|
belongs_to :inventory_unit, optional: true
|
|
11
11
|
has_one :adjustment, as: :source, dependent: :destroy
|
|
@@ -22,7 +22,7 @@ class Spree::UnitCancel < Spree::Base
|
|
|
22
22
|
source: self,
|
|
23
23
|
amount:,
|
|
24
24
|
order: inventory_unit.order,
|
|
25
|
-
label: "#{I18n.t(
|
|
25
|
+
label: "#{I18n.t("spree.cancellation")} - #{reason}",
|
|
26
26
|
finalized: true
|
|
27
27
|
)
|
|
28
28
|
|
|
@@ -47,6 +47,6 @@ class Spree::UnitCancel < Spree::Base
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
def quantity_of_line_item(line_item)
|
|
50
|
-
BigDecimal(line_item.inventory_units.not_canceled.
|
|
50
|
+
BigDecimal(line_item.inventory_units.not_canceled.count { |element| !element.original_return_item })
|
|
51
51
|
end
|
|
52
52
|
end
|
|
@@ -5,8 +5,8 @@ module Spree
|
|
|
5
5
|
belongs_to :user, class_name: UserClassHandle.new, foreign_key: "user_id", inverse_of: :user_addresses
|
|
6
6
|
belongs_to :address, class_name: "Spree::Address"
|
|
7
7
|
|
|
8
|
-
validates :address_id, uniqueness: {
|
|
9
|
-
validates :user_id, uniqueness: {
|
|
8
|
+
validates :address_id, uniqueness: {scope: :user_id}
|
|
9
|
+
validates :user_id, uniqueness: {conditions: -> { default_shipping }, message: :default_address_exists, if: :default?}
|
|
10
10
|
|
|
11
11
|
scope :with_address_values, ->(address_attributes) do
|
|
12
12
|
joins(:address).merge(
|
|
@@ -25,6 +25,6 @@ module Spree
|
|
|
25
25
|
all
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
default_scope -> { order([default: :desc, updated_at: :desc]) }
|
|
28
|
+
default_scope -> { order([{default: :desc, updated_at: :desc}]) }
|
|
29
29
|
end
|
|
30
30
|
end
|
|
@@ -20,15 +20,13 @@ module Spree
|
|
|
20
20
|
|
|
21
21
|
def disallowed_urls(controller)
|
|
22
22
|
@disallowed_urls ||= {}
|
|
23
|
-
@disallowed_urls[controller.controller_name] ||=
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
disallowed_urls << controller.send(route)
|
|
28
|
-
end
|
|
23
|
+
@disallowed_urls[controller.controller_name] ||= [].tap do |disallowed_urls|
|
|
24
|
+
AUTHENTICATION_ROUTES.each do |route|
|
|
25
|
+
if controller.respond_to?(route)
|
|
26
|
+
disallowed_urls << controller.send(route)
|
|
29
27
|
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
28
|
+
end
|
|
29
|
+
end.map! { |url| url[/\/\w+$/] }
|
|
32
30
|
end
|
|
33
31
|
end
|
|
34
32
|
end
|
|
@@ -34,7 +34,7 @@ module Spree
|
|
|
34
34
|
def store_location
|
|
35
35
|
return if self.class.rules.any? { |rule| rule.match? controller }
|
|
36
36
|
|
|
37
|
-
session[:spree_user_return_to] = request.fullpath.gsub(
|
|
37
|
+
session[:spree_user_return_to] = request.fullpath.gsub("//", "/")
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
private
|
|
@@ -11,7 +11,7 @@ module Spree
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
scope :by_stock_location, ->(stock_location_id) {
|
|
14
|
-
joins(:stock_locations).where(spree_stock_locations: {
|
|
14
|
+
joins(:stock_locations).where(spree_stock_locations: {id: stock_location_id})
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
class << self
|
|
@@ -24,19 +24,19 @@ module Spree
|
|
|
24
24
|
option_types = Spree::OptionType.table_name
|
|
25
25
|
|
|
26
26
|
option_type_conditions = case option_type
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
when OptionType then {"#{option_types}.name" => option_type.name}
|
|
28
|
+
when String then {"#{option_types}.name" => option_type}
|
|
29
|
+
else {"#{option_types}.id" => option_type}
|
|
30
|
+
end
|
|
31
31
|
|
|
32
32
|
relation = joins(option_values: :option_type).where(option_type_conditions)
|
|
33
33
|
|
|
34
34
|
option_values.each do |option_value|
|
|
35
35
|
option_value_conditions = case option_value
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
when OptionValue then {"#{Spree::OptionValue.table_name}.name" => option_value.name}
|
|
37
|
+
when String then {"#{Spree::OptionValue.table_name}.name" => option_value}
|
|
38
|
+
else {"#{Spree::OptionValue.table_name}.id" => option_value}
|
|
39
|
+
end
|
|
40
40
|
relation = relation.where(option_value_conditions)
|
|
41
41
|
end
|
|
42
42
|
|
data/app/models/spree/variant.rb
CHANGED
|
@@ -30,15 +30,15 @@ module Spree
|
|
|
30
30
|
|
|
31
31
|
# Consider that not all platforms digest structured data in the same way,
|
|
32
32
|
# you might have to modify the output on the frontend or in feeds accordingly.
|
|
33
|
-
enum :condition, {
|
|
33
|
+
enum :condition, {damaged: "damaged", new: "new", refurbished: "refurbished", used: "used"}, prefix: true
|
|
34
34
|
|
|
35
|
-
belongs_to :product, -> { with_discarded }, touch: true, class_name:
|
|
36
|
-
belongs_to :tax_category, class_name:
|
|
35
|
+
belongs_to :product, -> { with_discarded }, touch: true, class_name: "Spree::Product", inverse_of: :variants_including_master, optional: false
|
|
36
|
+
belongs_to :tax_category, class_name: "Spree::TaxCategory", optional: true
|
|
37
37
|
belongs_to :shipping_category, class_name: "Spree::ShippingCategory", optional: true
|
|
38
38
|
|
|
39
39
|
delegate :name, :description, :slug, :available_on, :discontinue_on, :discontinued?,
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
:meta_description, :meta_keywords,
|
|
41
|
+
to: :product
|
|
42
42
|
delegate :tax_category, :tax_category_id, to: :product, prefix: true
|
|
43
43
|
delegate :shipping_category, :shipping_category_id,
|
|
44
44
|
to: :product, prefix: true
|
|
@@ -60,7 +60,7 @@ module Spree
|
|
|
60
60
|
|
|
61
61
|
has_many :prices,
|
|
62
62
|
-> { with_discarded },
|
|
63
|
-
class_name:
|
|
63
|
+
class_name: "Spree::Price",
|
|
64
64
|
dependent: :destroy,
|
|
65
65
|
inverse_of: :variant,
|
|
66
66
|
autosave: true
|
|
@@ -72,9 +72,9 @@ module Spree
|
|
|
72
72
|
validates :product, presence: true
|
|
73
73
|
validate :check_price
|
|
74
74
|
|
|
75
|
-
validates :cost_price, numericality: {
|
|
76
|
-
validates :price,
|
|
77
|
-
validates :sku, uniqueness: {
|
|
75
|
+
validates :cost_price, numericality: {greater_than_or_equal_to: 0, allow_nil: true}
|
|
76
|
+
validates :price, numericality: {greater_than_or_equal_to: 0, allow_nil: true}
|
|
77
|
+
validates :sku, uniqueness: {allow_blank: true, case_sensitive: true, conditions: -> { where(deleted_at: nil) }, if: :enforce_unique_sku?}
|
|
78
78
|
|
|
79
79
|
after_create :create_stock_items
|
|
80
80
|
after_create :set_master_out_of_stock, unless: :is_master?
|
|
@@ -85,7 +85,7 @@ module Spree
|
|
|
85
85
|
after_destroy :destroy_option_values_variants
|
|
86
86
|
|
|
87
87
|
scope :template_variants, -> do
|
|
88
|
-
left_joins(product: {
|
|
88
|
+
left_joins(product: {option_types: :option_values}).where(is_master: true).where.not(spree_option_values: {id: nil}).reorder(nil).distinct
|
|
89
89
|
end
|
|
90
90
|
scope :non_template_variants, -> { where.not(id: template_variants) }
|
|
91
91
|
|
|
@@ -101,7 +101,7 @@ module Spree
|
|
|
101
101
|
return all unless Spree::Config.track_inventory_levels
|
|
102
102
|
in_stock_variants = joins(:stock_items).where(Spree::StockItem.arel_table[:count_on_hand].gt(0).or(arel_table[:track_inventory].eq(false)))
|
|
103
103
|
if stock_locations.present?
|
|
104
|
-
in_stock_variants = in_stock_variants.where(spree_stock_items: {
|
|
104
|
+
in_stock_variants = in_stock_variants.where(spree_stock_items: {stock_location_id: stock_locations.map(&:id)})
|
|
105
105
|
end
|
|
106
106
|
in_stock_variants.distinct
|
|
107
107
|
end
|
|
@@ -132,16 +132,16 @@ module Spree
|
|
|
132
132
|
# @return [ActiveRecord::Relation]
|
|
133
133
|
def self.with_prices(pricing_options = Spree::Config.default_pricing_options)
|
|
134
134
|
where(
|
|
135
|
-
Spree::Price
|
|
136
|
-
where(Spree::Variant.arel_table[:id].eq(Spree::Price.arel_table[:variant_id])).
|
|
135
|
+
Spree::Price
|
|
136
|
+
.where(Spree::Variant.arel_table[:id].eq(Spree::Price.arel_table[:variant_id])).
|
|
137
137
|
# This next clause should just be `where(pricing_options.search_arguments)`, but ActiveRecord
|
|
138
138
|
# generates invalid SQL, so the SQL here is written manually.
|
|
139
139
|
where(
|
|
140
140
|
"spree_prices.currency = ? AND (spree_prices.country_iso IS NULL OR spree_prices.country_iso = ?)",
|
|
141
141
|
pricing_options.search_arguments[:currency],
|
|
142
142
|
pricing_options.search_arguments[:country_iso].compact
|
|
143
|
-
)
|
|
144
|
-
arel.exists
|
|
143
|
+
)
|
|
144
|
+
.arel.exists
|
|
145
145
|
)
|
|
146
146
|
end
|
|
147
147
|
|
|
@@ -200,12 +200,12 @@ module Spree
|
|
|
200
200
|
#
|
|
201
201
|
# @return [Fixnum]
|
|
202
202
|
def on_backorder
|
|
203
|
-
inventory_units.with_state(
|
|
203
|
+
inventory_units.with_state("backordered").size
|
|
204
204
|
end
|
|
205
205
|
|
|
206
206
|
# @return [Boolean] true if this variant can be backordered
|
|
207
207
|
def is_backorderable?
|
|
208
|
-
Spree::
|
|
208
|
+
Spree::Config.stock.quantifier_class.new(self).backorderable?
|
|
209
209
|
end
|
|
210
210
|
|
|
211
211
|
# Creates a sentence out of the variant's (sorted) option values.
|
|
@@ -220,7 +220,7 @@ module Spree
|
|
|
220
220
|
"#{ov.option_type.presentation}: #{ov.presentation}"
|
|
221
221
|
end
|
|
222
222
|
|
|
223
|
-
values.to_sentence({
|
|
223
|
+
values.to_sentence({words_connector: ", ", two_words_connector: ", "})
|
|
224
224
|
end
|
|
225
225
|
|
|
226
226
|
# Determines the name of an Exchange variant.
|
|
@@ -235,7 +235,7 @@ module Spree
|
|
|
235
235
|
#
|
|
236
236
|
# @return [String] the generated name
|
|
237
237
|
def descriptive_name
|
|
238
|
-
is_master? ? name +
|
|
238
|
+
is_master? ? name + " - Master" : name + " - " + options_text
|
|
239
239
|
end
|
|
240
240
|
|
|
241
241
|
# Returns whether this variant has been deleted. Provided as a method of
|
|
@@ -315,7 +315,7 @@ module Spree
|
|
|
315
315
|
|
|
316
316
|
def price_same_as_master?(pricing_options = Spree::Config.default_pricing_options)
|
|
317
317
|
diff = price_difference_from_master(pricing_options)
|
|
318
|
-
diff
|
|
318
|
+
diff&.zero?
|
|
319
319
|
end
|
|
320
320
|
|
|
321
321
|
# Generates a friendly name and sku string.
|
|
@@ -345,7 +345,7 @@ module Spree
|
|
|
345
345
|
# check inventory in all available StockLocations.
|
|
346
346
|
# @return [Boolean] true if the desired quantity can be supplied
|
|
347
347
|
def can_supply?(quantity = 1, stock_location = nil)
|
|
348
|
-
Spree::
|
|
348
|
+
Spree::Config.stock.quantifier_class.new(self, stock_location).can_supply?(quantity)
|
|
349
349
|
end
|
|
350
350
|
|
|
351
351
|
# Fetches the on-hand quantity of the variant.
|
|
@@ -355,7 +355,7 @@ module Spree
|
|
|
355
355
|
# check inventory in all available StockLocations.
|
|
356
356
|
# @return [Fixnum] the number currently on-hand
|
|
357
357
|
def total_on_hand(stock_location = nil)
|
|
358
|
-
Spree::
|
|
358
|
+
Spree::Config.stock.quantifier_class.new(self, stock_location).total_on_hand
|
|
359
359
|
end
|
|
360
360
|
|
|
361
361
|
# Shortcut method to determine if inventory tracking is enabled for this
|
|
@@ -392,7 +392,7 @@ module Spree
|
|
|
392
392
|
end
|
|
393
393
|
|
|
394
394
|
def set_master_out_of_stock
|
|
395
|
-
if product.master
|
|
395
|
+
if product.master&.in_stock?
|
|
396
396
|
product.master.stock_items.update_all(backorderable: false)
|
|
397
397
|
product.master.stock_items.each(&:reduce_count_on_hand_to_zero)
|
|
398
398
|
end
|
|
@@ -405,7 +405,7 @@ module Spree
|
|
|
405
405
|
|
|
406
406
|
def check_price
|
|
407
407
|
if price.nil? && Spree::Config[:require_master_price] && is_master?
|
|
408
|
-
errors.add :price,
|
|
408
|
+
errors.add :price, "Must supply price for variant or master.price for product."
|
|
409
409
|
end
|
|
410
410
|
end
|
|
411
411
|
|
|
@@ -441,4 +441,4 @@ module Spree
|
|
|
441
441
|
end
|
|
442
442
|
end
|
|
443
443
|
|
|
444
|
-
require_dependency
|
|
444
|
+
require_dependency "spree/variant/scopes"
|
|
@@ -15,9 +15,9 @@ module Spree
|
|
|
15
15
|
class VariantPropertyRule < Spree::Base
|
|
16
16
|
belongs_to :product, touch: true
|
|
17
17
|
|
|
18
|
-
has_many :values, class_name:
|
|
18
|
+
has_many :values, class_name: "Spree::VariantPropertyRuleValue", dependent: :destroy
|
|
19
19
|
has_many :properties, through: :values
|
|
20
|
-
has_many :conditions, class_name:
|
|
20
|
+
has_many :conditions, class_name: "Spree::VariantPropertyRuleCondition", dependent: :destroy
|
|
21
21
|
has_many :option_values, through: :conditions
|
|
22
22
|
|
|
23
23
|
accepts_nested_attributes_for :values, allow_destroy: true, reject_if: lambda { |val| val[:property_name].blank? }
|
|
@@ -5,6 +5,6 @@ module Spree
|
|
|
5
5
|
belongs_to :option_value, optional: true
|
|
6
6
|
belongs_to :variant_property_rule, touch: true, optional: true
|
|
7
7
|
|
|
8
|
-
validates :option_value_id, uniqueness: {
|
|
8
|
+
validates :option_value_id, uniqueness: {scope: :variant_property_rule_id}
|
|
9
9
|
end
|
|
10
10
|
end
|
|
@@ -16,10 +16,10 @@ class Spree::Wallet::AddPaymentSourcesToWallet
|
|
|
16
16
|
if !order.temporary_payment_source && order.user
|
|
17
17
|
# select valid sources
|
|
18
18
|
payments = order.payments.valid
|
|
19
|
-
sources = payments.map(&:source)
|
|
20
|
-
uniq
|
|
21
|
-
compact
|
|
22
|
-
select { |payment| payment.try(:reusable?) }
|
|
19
|
+
sources = payments.map(&:source)
|
|
20
|
+
.uniq
|
|
21
|
+
.compact
|
|
22
|
+
.select { |payment| payment.try(:reusable?) }
|
|
23
23
|
|
|
24
24
|
# add valid sources to wallet and optionally set a default
|
|
25
25
|
if sources.any?
|
|
@@ -17,7 +17,7 @@ class Spree::Wallet::DefaultPaymentBuilder
|
|
|
17
17
|
if default && order.payments.where(source_type: default.payment_source_type).none?
|
|
18
18
|
Spree::Payment.new(
|
|
19
19
|
payment_method: default.payment_source.payment_method,
|
|
20
|
-
source: default.payment_source
|
|
20
|
+
source: default.payment_source
|
|
21
21
|
)
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
module Spree
|
|
4
4
|
class WalletPaymentSource < Spree::Base
|
|
5
|
-
belongs_to :user, class_name: Spree::UserClassHandle.new, foreign_key:
|
|
5
|
+
belongs_to :user, class_name: Spree::UserClassHandle.new, foreign_key: "user_id", inverse_of: :wallet_payment_sources, optional: true
|
|
6
6
|
belongs_to :payment_source, polymorphic: true, inverse_of: :wallet_payment_sources, optional: true
|
|
7
7
|
|
|
8
8
|
validates :user, presence: true
|
|
@@ -27,7 +27,7 @@ module Spree
|
|
|
27
27
|
return unless payment_source.present?
|
|
28
28
|
|
|
29
29
|
if payment_source.respond_to?(:user_id) &&
|
|
30
|
-
|
|
30
|
+
payment_source.user_id != user_id
|
|
31
31
|
errors.add(:payment_source, :not_owned_by_user)
|
|
32
32
|
end
|
|
33
33
|
end
|
data/app/models/spree/zone.rb
CHANGED
|
@@ -13,7 +13,7 @@ module Spree
|
|
|
13
13
|
has_many :shipping_method_zones, dependent: :destroy
|
|
14
14
|
has_many :shipping_methods, through: :shipping_method_zones
|
|
15
15
|
|
|
16
|
-
validates :name, presence: true, uniqueness: {
|
|
16
|
+
validates :name, presence: true, uniqueness: {allow_blank: true, case_sensitive: true}
|
|
17
17
|
after_save :remove_defunct_members
|
|
18
18
|
|
|
19
19
|
scope :with_member_ids, ->(state_ids, country_ids) do
|
|
@@ -22,11 +22,11 @@ module Spree
|
|
|
22
22
|
else
|
|
23
23
|
spree_zone_members_table = Spree::ZoneMember.arel_table
|
|
24
24
|
matching_state =
|
|
25
|
-
spree_zone_members_table[:zoneable_type].eq("Spree::State")
|
|
26
|
-
|
|
25
|
+
spree_zone_members_table[:zoneable_type].eq("Spree::State")
|
|
26
|
+
.and(spree_zone_members_table[:zoneable_id].in(state_ids))
|
|
27
27
|
matching_country =
|
|
28
|
-
spree_zone_members_table[:zoneable_type].eq("Spree::Country")
|
|
29
|
-
|
|
28
|
+
spree_zone_members_table[:zoneable_type].eq("Spree::Country")
|
|
29
|
+
.and(spree_zone_members_table[:zoneable_id].in(country_ids))
|
|
30
30
|
joins(:zone_members).where(matching_state.or(matching_country)).distinct
|
|
31
31
|
end
|
|
32
32
|
end
|
|
@@ -39,8 +39,8 @@ module Spree
|
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
accepts_nested_attributes_for :zone_members, allow_destroy: true, reject_if: proc { |member| member[
|
|
42
|
+
alias_method :members, :zone_members
|
|
43
|
+
accepts_nested_attributes_for :zone_members, allow_destroy: true, reject_if: proc { |member| member["zoneable_id"].blank? }
|
|
44
44
|
|
|
45
45
|
self.allowed_ransackable_attributes = %w[name description]
|
|
46
46
|
|
|
@@ -74,9 +74,9 @@ module Spree
|
|
|
74
74
|
|
|
75
75
|
members.any? do |zone_member|
|
|
76
76
|
case zone_member.zoneable_type
|
|
77
|
-
when
|
|
77
|
+
when "Spree::Country"
|
|
78
78
|
zone_member.zoneable_id == address.country_id
|
|
79
|
-
when
|
|
79
|
+
when "Spree::State"
|
|
80
80
|
zone_member.zoneable_id == address.state_id
|
|
81
81
|
else
|
|
82
82
|
false
|
|
@@ -87,10 +87,10 @@ module Spree
|
|
|
87
87
|
# convenience method for returning the countries contained within a zone
|
|
88
88
|
def country_list
|
|
89
89
|
@countries ||= case kind
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
90
|
+
when "country" then zoneables
|
|
91
|
+
when "state" then zoneables.collect(&:country)
|
|
92
|
+
else []
|
|
93
|
+
end.flatten.compact.uniq
|
|
94
94
|
end
|
|
95
95
|
|
|
96
96
|
def <=>(other)
|
|
@@ -104,7 +104,7 @@ module Spree
|
|
|
104
104
|
end
|
|
105
105
|
|
|
106
106
|
def country_ids
|
|
107
|
-
if kind ==
|
|
107
|
+
if kind == "country"
|
|
108
108
|
members.pluck(:zoneable_id)
|
|
109
109
|
else
|
|
110
110
|
[]
|
|
@@ -112,7 +112,7 @@ module Spree
|
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
def state_ids
|
|
115
|
-
if kind ==
|
|
115
|
+
if kind == "state"
|
|
116
116
|
members.pluck(:zoneable_id)
|
|
117
117
|
else
|
|
118
118
|
[]
|
|
@@ -120,18 +120,18 @@ module Spree
|
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
def country_ids=(ids)
|
|
123
|
-
set_zone_members(ids,
|
|
123
|
+
set_zone_members(ids, "Spree::Country")
|
|
124
124
|
end
|
|
125
125
|
|
|
126
126
|
def state_ids=(ids)
|
|
127
|
-
set_zone_members(ids,
|
|
127
|
+
set_zone_members(ids, "Spree::State")
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
private
|
|
131
131
|
|
|
132
132
|
def remove_defunct_members
|
|
133
133
|
if zone_members.any?
|
|
134
|
-
zone_members.where(
|
|
134
|
+
zone_members.where("zoneable_id IS NULL OR zoneable_type != ?", "Spree::#{kind.classify}").destroy_all
|
|
135
135
|
end
|
|
136
136
|
end
|
|
137
137
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
module Spree
|
|
4
4
|
class ZoneMember < Spree::Base
|
|
5
|
-
belongs_to :zone, class_name:
|
|
5
|
+
belongs_to :zone, class_name: "Spree::Zone", counter_cache: true, inverse_of: :zone_members, optional: true
|
|
6
6
|
belongs_to :zoneable, polymorphic: true, optional: true
|
|
7
7
|
|
|
8
8
|
delegate :name, to: :zoneable, allow_nil: true
|