solidus_core 1.2.3 → 1.3.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/Gemfile +1 -1
- data/Rakefile +1 -1
- data/app/assets/javascripts/spree.js.coffee.erb +1 -1
- data/app/helpers/spree/base_helper.rb +21 -43
- data/app/helpers/spree/orders_helper.rb +0 -1
- data/app/helpers/spree/products_helper.rb +10 -12
- data/app/helpers/spree/taxons_helper.rb +4 -4
- data/app/mailers/spree/base_mailer.rb +1 -3
- data/app/mailers/spree/carton_mailer.rb +2 -2
- data/app/mailers/spree/order_mailer.rb +2 -2
- data/app/models/concerns/spree/adjustment_source.rb +12 -16
- data/app/models/concerns/spree/calculated_adjustments.rb +17 -14
- data/app/models/concerns/spree/default_price.rb +10 -26
- data/app/models/concerns/spree/display_money.rb +1 -1
- data/app/models/concerns/spree/ordered_property_value_list.rb +10 -12
- data/app/models/concerns/spree/ransackable_attributes.rb +6 -5
- data/app/models/concerns/spree/user_address_book.rb +87 -81
- data/app/models/concerns/spree/user_methods.rb +2 -2
- data/app/models/concerns/spree/user_payment_source.rb +12 -8
- data/app/models/spree/ability.rb +2 -2
- data/app/models/spree/address.rb +37 -38
- data/app/models/spree/adjustment.rb +2 -6
- data/app/models/spree/app_configuration.rb +60 -5
- data/app/models/spree/base.rb +1 -1
- data/app/models/spree/calculator/default_tax.rb +28 -24
- data/app/models/spree/calculator/flat_percent_item_total.rb +1 -1
- data/app/models/spree/calculator/flat_rate.rb +2 -2
- data/app/models/spree/calculator/flexi_rate.rb +4 -4
- data/app/models/spree/calculator/percent_per_item.rb +8 -9
- data/app/models/spree/calculator/price_sack.rb +3 -3
- data/app/models/spree/calculator/returns/default_refund_amount.rb +11 -12
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -1
- data/app/models/spree/calculator/shipping/flat_rate.rb +2 -2
- data/app/models/spree/calculator/shipping/flexi_rate.rb +3 -3
- data/app/models/spree/calculator/shipping/per_item.rb +1 -1
- data/app/models/spree/calculator/shipping/price_sack.rb +3 -3
- data/app/models/spree/calculator/tiered_flat_rate.rb +2 -1
- data/app/models/spree/calculator/tiered_percent.rb +2 -1
- data/app/models/spree/calculator.rb +3 -3
- data/app/models/spree/carton.rb +2 -2
- data/app/models/spree/country.rb +7 -4
- data/app/models/spree/credit_card.rb +26 -22
- data/app/models/spree/customer_return.rb +8 -7
- data/app/models/spree/exchange.rb +1 -9
- data/app/models/spree/gateway/bogus.rb +31 -31
- data/app/models/spree/gateway/bogus_simple.rb +6 -8
- data/app/models/spree/gateway.rb +9 -15
- data/app/models/spree/image.rb +3 -3
- data/app/models/spree/inventory_unit.rb +23 -23
- data/app/models/spree/item_adjustments.rb +3 -2
- data/app/models/spree/legacy_user.rb +1 -5
- data/app/models/spree/line_item.rb +95 -84
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/option_value.rb +3 -1
- data/app/models/spree/order/checkout.rb +45 -44
- data/app/models/spree/order/payments.rb +42 -45
- data/app/models/spree/order.rb +70 -75
- data/app/models/spree/order_cancellations.rb +4 -4
- data/app/models/spree/order_capturing.rb +3 -2
- data/app/models/spree/order_contents.rb +61 -59
- data/app/models/spree/order_inventory.rb +59 -54
- data/app/models/spree/order_mutex.rb +0 -1
- data/app/models/spree/order_shipping.rb +8 -9
- data/app/models/spree/order_stock_location.rb +3 -3
- data/app/models/spree/order_update_attributes.rb +0 -2
- data/app/models/spree/order_updater.rb +11 -24
- data/app/models/spree/payment/processing.rb +26 -37
- data/app/models/spree/payment.rb +68 -71
- data/app/models/spree/payment_method/check.rb +2 -2
- data/app/models/spree/payment_method/store_credit.rb +6 -7
- data/app/models/spree/payment_method.rb +11 -8
- data/app/models/spree/preferences/configuration.rb +2 -2
- data/app/models/spree/preferences/preferable.rb +1 -1
- data/app/models/spree/preferences/preferable_class_methods.rb +1 -1
- data/app/models/spree/preferences/scoped_store.rb +6 -5
- data/app/models/spree/preferences/static_model_preferences.rb +1 -1
- data/app/models/spree/preferences/statically_configurable.rb +2 -2
- data/app/models/spree/preferences/store.rb +2 -6
- data/app/models/spree/price.rb +17 -19
- data/app/models/spree/product/scopes.rb +18 -17
- data/app/models/spree/product.rb +28 -11
- data/app/models/spree/product_property.rb +2 -0
- data/app/models/spree/product_scope/scopes.rb +22 -22
- data/app/models/spree/promotion/actions/create_adjustment.rb +3 -4
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +8 -8
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +3 -3
- data/app/models/spree/promotion/actions/free_shipping.rb +4 -4
- data/app/models/spree/promotion/rules/first_order.rb +7 -6
- data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +2 -3
- data/app/models/spree/promotion/rules/item_total.rb +5 -2
- data/app/models/spree/promotion/rules/nth_order.rb +3 -4
- data/app/models/spree/promotion/rules/one_use_per_user.rb +1 -2
- data/app/models/spree/promotion/rules/option_value.rb +1 -2
- data/app/models/spree/promotion/rules/product.rb +4 -4
- data/app/models/spree/promotion/rules/taxon.rb +5 -5
- data/app/models/spree/promotion/rules/user.rb +1 -1
- data/app/models/spree/promotion/rules/user_logged_in.rb +1 -1
- data/app/models/spree/promotion.rb +8 -8
- data/app/models/spree/promotion_action.rb +1 -1
- data/app/models/spree/promotion_builder.rb +2 -2
- data/app/models/spree/promotion_chooser.rb +1 -0
- data/app/models/spree/promotion_code/code_builder.rb +3 -3
- data/app/models/spree/promotion_handler/cart.rb +17 -16
- data/app/models/spree/promotion_handler/coupon.rb +10 -14
- data/app/models/spree/promotion_handler/page.rb +4 -4
- data/app/models/spree/promotion_rule.rb +4 -3
- data/app/models/spree/prototype.rb +0 -1
- data/app/models/spree/refund.rb +3 -3
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -3
- data/app/models/spree/reimbursement.rb +3 -5
- data/app/models/spree/reimbursement_performer.rb +0 -5
- data/app/models/spree/reimbursement_tax_calculator.rb +2 -7
- data/app/models/spree/reimbursement_type/credit.rb +1 -1
- data/app/models/spree/reimbursement_type/original_payment.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +3 -3
- data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
- data/app/models/spree/reimbursement_type.rb +1 -1
- data/app/models/spree/return_authorization.rb +38 -37
- data/app/models/spree/return_item/eligibility_validator/default.rb +4 -4
- data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +0 -1
- data/app/models/spree/return_item/eligibility_validator/rma_required.rb +0 -1
- data/app/models/spree/return_item.rb +24 -23
- data/app/models/spree/returns_calculator.rb +1 -2
- data/app/models/spree/shipment.rb +80 -74
- data/app/models/spree/shipping_calculator.rb +4 -5
- data/app/models/spree/shipping_manifest.rb +3 -4
- data/app/models/spree/shipping_method.rb +54 -23
- data/app/models/spree/shipping_method_stock_location.rb +4 -0
- data/app/models/spree/shipping_rate.rb +24 -29
- data/app/models/spree/shipping_rate_tax.rb +41 -0
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/state_change.rb +1 -1
- data/app/models/spree/stock/availability_validator.rb +2 -2
- data/app/models/spree/stock/coordinator.rb +12 -13
- data/app/models/spree/stock/differentiator.rb +1 -0
- data/app/models/spree/stock/estimator.rb +18 -25
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
- data/app/models/spree/stock/package.rb +19 -9
- data/app/models/spree/stock/packer.rb +2 -3
- data/app/models/spree/stock/prioritizer.rb +3 -2
- data/app/models/spree/stock/quantifier.rb +2 -3
- data/app/models/spree/stock/shipping_rate_selector.rb +0 -1
- data/app/models/spree/stock/shipping_rate_sorter.rb +0 -1
- data/app/models/spree/stock/splitter/backordered.rb +0 -2
- data/app/models/spree/stock/splitter/base.rb +3 -2
- data/app/models/spree/stock/splitter/shipping_category.rb +2 -1
- data/app/models/spree/stock/splitter/weight.rb +2 -2
- data/app/models/spree/stock_item.rb +36 -37
- data/app/models/spree/stock_location.rb +17 -13
- data/app/models/spree/stock_movement.rb +1 -3
- data/app/models/spree/stock_transfer.rb +8 -8
- data/app/models/spree/store.rb +6 -0
- data/app/models/spree/store_credit.rb +24 -24
- data/app/models/spree/store_credit_category.rb +1 -2
- data/app/models/spree/tax/item_adjuster.rb +37 -0
- data/app/models/spree/tax/order_adjuster.rb +38 -0
- data/app/models/spree/tax/shipping_rate_taxer.rb +31 -0
- data/app/models/spree/tax/tax_helpers.rb +49 -0
- data/app/models/spree/tax/tax_location.rb +33 -0
- data/app/models/spree/tax_category.rb +1 -1
- data/app/models/spree/tax_rate.rb +46 -111
- data/app/models/spree/taxon.rb +36 -12
- data/app/models/spree/taxonomy.rb +10 -10
- data/app/models/spree/validations/db_maximum_length_validator.rb +0 -1
- data/app/models/spree/variant/pricer.rb +19 -0
- data/app/models/spree/variant/pricing_options.rb +31 -0
- data/app/models/spree/variant/scopes.rb +9 -9
- data/app/models/spree/variant.rb +95 -89
- data/app/models/spree/variant_property_rule.rb +1 -1
- data/app/models/spree/variant_property_rule_value.rb +2 -0
- data/app/models/spree/zone.rb +60 -24
- data/config/initializers/friendly_id.rb +1 -1
- data/config/locales/en.yml +337 -51
- data/config/routes.rb +1 -1
- data/db/default/spree/countries.rb +9 -15
- data/db/default/spree/roles.rb +1 -2
- data/db/default/spree/states.rb +7 -11
- data/db/default/spree/store_credit.rb +2 -2
- data/db/default/spree/stores.rb +2 -1
- data/db/migrate/20120831092320_spree_one_two.rb +100 -101
- data/db/migrate/20120831092359_spree_promo_one_two.rb +12 -12
- data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +1 -1
- data/db/migrate/20121009142519_add_lock_version_to_variant.rb +1 -1
- data/db/migrate/20121010142909_add_states_required_to_countries.rb +1 -1
- data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +2 -2
- data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +4 -4
- data/db/migrate/20121031162139_split_prices_from_variants.rb +8 -8
- data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +2 -2
- data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +1 -1
- data/db/migrate/20121124203911_add_position_to_taxonomies.rb +1 -1
- data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +1 -2
- data/db/migrate/20130211190146_create_spree_stock_items.rb +1 -1
- data/db/migrate/20130213191427_create_default_stock.rb +12 -21
- data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +1 -1
- data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +2 -2
- data/db/migrate/20130228210442_create_shipping_method_zone.rb +1 -1
- data/db/migrate/20130301162924_create_shipping_method_categories.rb +2 -2
- data/db/migrate/20130304162240_create_spree_shipping_rates.rb +4 -4
- data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +2 -3
- data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +1 -1
- data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +1 -1
- data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +1 -1
- data/db/migrate/20130319062004_change_orders_total_precision.rb +4 -4
- data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +1 -3
- data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +2 -4
- data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +1 -3
- data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +2 -2
- data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +2 -2
- data/db/migrate/20130417120035_update_adjustment_states.rb +2 -2
- data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +3 -3
- data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +1 -1
- data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +3 -3
- data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +1 -1
- data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +2 -2
- data/db/migrate/20130807024301_upgrade_adjustments.rb +3 -3
- data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +1 -1
- data/db/migrate/20130813140619_expand_order_number_size.rb +2 -2
- data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +1 -1
- data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +1 -1
- data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +1 -1
- data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +1 -1
- data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
- data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +1 -0
- data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +1 -1
- data/db/migrate/20131118043959_add_included_to_adjustments.rb +1 -1
- data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +0 -1
- data/db/migrate/20131211112807_create_spree_orders_promotions.rb +1 -1
- data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +1 -1
- data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +1 -0
- data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +1 -1
- data/db/migrate/20140309023735_migrate_old_preferences.rb +4 -3
- data/db/migrate/20140309033438_create_store_from_preferences.rb +2 -2
- data/db/migrate/20140410141842_add_many_missing_indexes.rb +13 -15
- data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +38 -40
- data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +4 -4
- data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +1 -1
- data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +0 -1
- data/db/migrate/20140718195325_create_friendly_id_slugs.rb +4 -4
- data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +4 -6
- data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +1 -0
- data/db/migrate/20141217215630_update_product_slug_index.rb +2 -4
- data/db/migrate/20150112194216_add_position_to_stock_location.rb +2 -2
- data/db/migrate/20150225205344_move_promotion_code_to_promotion_code_value.rb +0 -1
- data/db/migrate/20150313201503_copy_shipped_shipments_to_cartons.rb +0 -1
- data/db/migrate/20150506181611_create_spree_store_credit_payment_method.rb +3 -3
- data/db/migrate/20150515211137_fix_adjustment_order_id.rb +0 -1
- data/db/migrate/20150612205731_remove_spree_configurations.rb +2 -2
- data/db/migrate/20150619160613_create_adjustment_reason.rb +1 -1
- data/db/migrate/20150723224133_remove_unnecessary_indexes.rb +10 -2
- data/db/migrate/20150731201146_add_spree_user_addresses.rb +0 -1
- data/db/migrate/20150811211025_add_finalized_to_spree_adjustments.rb +1 -1
- data/db/migrate/20151001121454_create_spree_shipping_method_stock_locations.rb +13 -0
- data/db/migrate/20151002023248_add_foreign_key_to_shipping_method_stock_location.rb +6 -0
- data/db/migrate/20151026093607_change_return_item_pre_tax_amount_to_amount.rb +29 -0
- data/db/migrate/20160111091912_add_column_available_to_all_on_spree_shipping_method.rb +5 -0
- data/db/migrate/20160116133604_add_position_to_spree_payment_methods.rb +5 -0
- data/db/migrate/20160122182105_add_carrier_and_service_level_to_spree_shipping_methods.rb +6 -0
- data/db/migrate/20160224201413_create_spree_shipping_rate_taxes.rb +11 -0
- data/db/migrate/20160229133259_add_cart_tax_country_iso_to_spree_store.rb +5 -0
- data/db/migrate/20160301103333_remove_pre_tax_amount_on_line_item_and_shipment.rb +6 -0
- data/db/migrate/20160308000300_disallow_adjustment_finalized_nulls.rb +19 -0
- data/db/migrate/20160318145302_add_timestamps_to_prices.rb +5 -0
- data/db/migrate/20160330204846_add_missing_timestamp_columns.rb +20 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +3 -8
- data/lib/generators/spree/dummy/dummy_generator.rb +17 -19
- data/lib/generators/spree/install/install_generator.rb +15 -15
- data/lib/generators/spree/install/templates/config/initializers/spree.rb +1 -0
- data/lib/spree/core/controller_helpers/auth.rb +2 -4
- data/lib/spree/core/controller_helpers/common.rb +42 -43
- data/lib/spree/core/controller_helpers/order.rb +5 -9
- data/lib/spree/core/controller_helpers/payment_parameters.rb +4 -5
- data/lib/spree/core/controller_helpers/pricing.rb +27 -0
- data/lib/spree/core/controller_helpers/respond_with.rb +4 -4
- data/lib/spree/core/controller_helpers/search.rb +2 -2
- data/lib/spree/core/controller_helpers/store.rb +3 -3
- data/lib/spree/core/controller_helpers/strong_parameters.rb +4 -4
- data/lib/spree/core/current_store.rb +1 -1
- data/lib/spree/core/delegate_belongs_to.rb +19 -21
- data/lib/spree/core/engine.rb +12 -8
- data/lib/spree/core/environment/calculators.rb +0 -1
- data/lib/spree/core/environment_extension.rb +4 -4
- data/lib/spree/core/importer/order.rb +17 -22
- data/lib/spree/core/importer/product.rb +10 -9
- data/lib/spree/core/permalinks.rb +16 -16
- data/lib/spree/core/product_duplicator.rb +2 -3
- data/lib/spree/core/product_filters.rb +15 -16
- data/lib/spree/core/role_configuration.rb +2 -2
- data/lib/spree/core/search/base.rb +71 -57
- data/lib/spree/core/search/variant.rb +2 -4
- data/lib/spree/core/unreturned_item_charger.rb +1 -2
- data/lib/spree/core/validators/email.rb +2 -2
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +2 -4
- data/lib/spree/i18n.rb +1 -1
- data/lib/spree/localized_number.rb +3 -1
- data/lib/spree/migrations.rb +27 -26
- data/lib/spree/money.rb +19 -4
- data/lib/spree/permission_sets/base.rb +1 -1
- data/lib/spree/permitted_attributes.rb +7 -7
- data/lib/spree/responder.rb +4 -5
- data/lib/spree/testing_support/authorization_helpers.rb +1 -1
- data/lib/spree/testing_support/caching.rb +8 -8
- data/lib/spree/testing_support/capybara_ext.rb +11 -13
- data/lib/spree/testing_support/common_rake.rb +4 -4
- data/lib/spree/testing_support/controller_requests.rb +1 -1
- data/lib/spree/testing_support/extension_rake.rb +1 -2
- data/lib/spree/testing_support/factories/address_factory.rb +14 -3
- data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/carton_factory.rb +2 -2
- data/lib/spree/testing_support/factories/credit_card_factory.rb +4 -0
- data/lib/spree/testing_support/factories/customer_return_factory.rb +4 -6
- data/lib/spree/testing_support/factories/line_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/order_factory.rb +10 -11
- data/lib/spree/testing_support/factories/payment_factory.rb +5 -0
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -1
- data/lib/spree/testing_support/factories/promotion_factory.rb +0 -1
- data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +5 -2
- data/lib/spree/testing_support/factories/state_factory.rb +17 -7
- data/lib/spree/testing_support/factories/stock_location_factory.rb +4 -4
- data/lib/spree/testing_support/factories/stock_transfer_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +0 -1
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +0 -2
- data/lib/spree/testing_support/factories/tax_category_factory.rb +2 -2
- data/lib/spree/testing_support/factories/user_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_factory.rb +1 -2
- data/lib/spree/testing_support/factories/zone_factory.rb +2 -1
- data/lib/spree/testing_support/i18n.rb +4 -5
- data/lib/spree/testing_support/order_walkthrough.rb +8 -9
- data/lib/spree/testing_support/preferences.rb +1 -1
- data/lib/spree/testing_support/sequences.rb +5 -4
- data/lib/tasks/core.rake +15 -19
- data/lib/tasks/email.rake +3 -3
- data/lib/tasks/exchanges.rake +12 -14
- data/lib/tasks/migrations/assure_store_on_orders.rake +38 -0
- data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +2 -2
- data/lib/tasks/migrations/copy_shipped_shipments_to_cartons.rake +1 -11
- data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +17 -0
- data/lib/tasks/migrations/migrate_user_addresses.rake +1 -1
- data/lib/tasks/order_capturing.rake +1 -1
- data/lib/tasks/upgrade.rake +11 -0
- data/script/rails +0 -1
- data/solidus_core.gemspec +6 -8
- data/spec/helpers/base_helper_spec.rb +15 -18
- data/spec/helpers/order_helper_spec.rb +2 -2
- data/spec/helpers/products_helper_spec.rb +43 -51
- data/spec/helpers/taxons_helper_spec.rb +1 -1
- data/spec/lib/i18n_spec.rb +11 -11
- data/spec/lib/search/base_spec.rb +12 -14
- data/spec/lib/search/variant_spec.rb +1 -0
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +1 -7
- data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +26 -28
- data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +63 -0
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +4 -2
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +1 -1
- data/spec/lib/spree/core/importer/order_spec.rb +95 -90
- data/spec/lib/spree/core/role_configuration_spec.rb +16 -16
- data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +35 -0
- data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +10 -1
- data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +0 -1
- data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +6 -1
- data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +37 -1
- data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +2 -2
- data/spec/lib/spree/core/testing_support/factories/stock_packer_factory_spec.rb +1 -1
- data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +1 -2
- data/spec/lib/spree/core/testing_support/preferences_spec.rb +26 -0
- data/spec/lib/spree/core/unreturned_item_charger_spec.rb +7 -9
- data/spec/lib/spree/core/validators/email_spec.rb +8 -6
- data/spec/lib/spree/localized_number_spec.rb +1 -3
- data/spec/lib/spree/migrations_spec.rb +2 -2
- data/spec/lib/spree/money_spec.rb +75 -6
- data/spec/lib/tasks/exchanges_spec.rb +2 -12
- data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +0 -1
- data/spec/lib/tasks/order_capturing_spec.rb +1 -1
- data/spec/mailers/carton_mailer_spec.rb +3 -3
- data/spec/mailers/order_mailer_spec.rb +9 -11
- data/spec/mailers/reimbursement_mailer_spec.rb +2 -2
- data/spec/mailers/test_mailer_spec.rb +1 -1
- data/spec/models/spree/ability_spec.rb +4 -7
- data/spec/models/spree/address_spec.rb +32 -35
- data/spec/models/spree/adjustment_reason_spec.rb +0 -2
- data/spec/models/spree/adjustment_spec.rb +2 -2
- data/spec/models/spree/app_configuration_spec.rb +33 -3
- data/spec/models/spree/asset_spec.rb +1 -2
- data/spec/models/spree/calculator/default_tax_spec.rb +141 -52
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +1 -1
- data/spec/models/spree/calculator/flexi_rate_spec.rb +6 -6
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +1 -1
- data/spec/models/spree/calculator/price_sack_spec.rb +2 -2
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +9 -11
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +4 -4
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +2 -2
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +6 -7
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +2 -2
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +2 -2
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +1 -2
- data/spec/models/spree/calculator/tiered_percent_spec.rb +1 -1
- data/spec/models/spree/calculator_spec.rb +3 -8
- data/spec/models/spree/carton_spec.rb +1 -1
- data/spec/models/spree/classification_spec.rb +1 -1
- data/spec/models/spree/concerns/display_money_spec.rb +0 -1
- data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +26 -1
- data/spec/models/spree/concerns/user_address_book_spec.rb +19 -12
- data/spec/models/spree/concerns/user_methods_spec.rb +1 -1
- data/spec/models/spree/country_spec.rb +52 -0
- data/spec/models/spree/credit_card_spec.rb +17 -12
- data/spec/models/spree/customer_return_spec.rb +27 -23
- data/spec/models/spree/exchange_spec.rb +2 -7
- data/spec/models/spree/gateway/bogus_simple.rb +2 -4
- data/spec/models/spree/gateway/bogus_spec.rb +4 -2
- data/spec/models/spree/gateway_spec.rb +8 -3
- data/spec/models/spree/inventory_unit_spec.rb +13 -14
- data/spec/models/spree/item_adjustments_spec.rb +36 -40
- data/spec/models/spree/line_item_spec.rb +92 -48
- data/spec/models/spree/option_type_spec.rb +1 -1
- data/spec/models/spree/option_value_spec.rb +1 -1
- data/spec/models/spree/order/address_spec.rb +1 -1
- data/spec/models/spree/order/callbacks_spec.rb +3 -3
- data/spec/models/spree/order/checkout_spec.rb +55 -48
- data/spec/models/spree/order/finalizing_spec.rb +8 -9
- data/spec/models/spree/order/payment_spec.rb +20 -20
- data/spec/models/spree/order/risk_assessment_spec.rb +1 -1
- data/spec/models/spree/order/state_machine_spec.rb +40 -131
- data/spec/models/spree/order/tax_spec.rb +11 -12
- data/spec/models/spree/order/totals_spec.rb +3 -3
- data/spec/models/spree/order/updating_spec.rb +2 -2
- data/spec/models/spree/order/validations_spec.rb +2 -2
- data/spec/models/spree/order_cancellations_spec.rb +1 -1
- data/spec/models/spree/order_capturing_spec.rb +1 -1
- data/spec/models/spree/order_contents_spec.rb +10 -11
- data/spec/models/spree/order_inventory_spec.rb +11 -11
- data/spec/models/spree/order_merger_spec.rb +1 -0
- data/spec/models/spree/order_shipping_spec.rb +8 -10
- data/spec/models/spree/order_spec.rb +137 -124
- data/spec/models/spree/order_stock_location_spec.rb +2 -2
- data/spec/models/spree/order_update_attributes_spec.rb +6 -10
- data/spec/models/spree/order_updater_spec.rb +4 -8
- data/spec/models/spree/payment_create_spec.rb +11 -12
- data/spec/models/spree/payment_method/store_credit_spec.rb +10 -6
- data/spec/models/spree/payment_method_spec.rb +4 -5
- data/spec/models/spree/payment_spec.rb +61 -69
- data/spec/models/spree/permission_sets/base_spec.rb +1 -1
- data/spec/models/spree/permission_sets/configuration_display.rb +0 -1
- data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/dashboard_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/order_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/order_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/product_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/product_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/promotion_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/promotion_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/report_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/restricted_stock_transfer_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/restricted_stock_transfer_management_spec.rb +6 -6
- data/spec/models/spree/permission_sets/stock_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/stock_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/stock_transfer_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/stock_transfer_management_spec.rb +0 -2
- data/spec/models/spree/permission_sets/user_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/user_management_spec.rb +0 -1
- data/spec/models/spree/preference_spec.rb +1 -4
- data/spec/models/spree/preferences/configuration_spec.rb +2 -7
- data/spec/models/spree/preferences/preferable_spec.rb +13 -24
- data/spec/models/spree/preferences/scoped_store_spec.rb +1 -1
- data/spec/models/spree/preferences/static_model_preferences_spec.rb +5 -6
- data/spec/models/spree/preferences/statically_configurable_spec.rb +2 -6
- data/spec/models/spree/preferences/store_spec.rb +2 -3
- data/spec/models/spree/price_spec.rb +6 -6
- data/spec/models/spree/product/scopes_spec.rb +20 -20
- data/spec/models/spree/product_duplicator_spec.rb +16 -29
- data/spec/models/spree/product_filter_spec.rb +2 -2
- data/spec/models/spree/product_spec.rb +53 -20
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +10 -12
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +4 -4
- data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +9 -9
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +1 -1
- data/spec/models/spree/promotion/rules/first_order_spec.rb +10 -10
- data/spec/models/spree/promotion/rules/item_total_spec.rb +63 -19
- data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +1 -1
- data/spec/models/spree/promotion/rules/product_spec.rb +8 -8
- data/spec/models/spree/promotion/rules/taxon_spec.rb +4 -4
- data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +3 -4
- data/spec/models/spree/promotion/rules/user_spec.rb +7 -7
- data/spec/models/spree/promotion_builder_spec.rb +10 -8
- data/spec/models/spree/promotion_category_spec.rb +1 -1
- data/spec/models/spree/promotion_code/code_builder_spec.rb +1 -3
- data/spec/models/spree/promotion_code_spec.rb +8 -7
- data/spec/models/spree/promotion_handler/cart_spec.rb +1 -1
- data/spec/models/spree/promotion_handler/coupon_spec.rb +28 -28
- data/spec/models/spree/promotion_handler/page_spec.rb +6 -7
- data/spec/models/spree/promotion_rule_spec.rb +1 -2
- data/spec/models/spree/promotion_spec.rb +25 -21
- data/spec/models/spree/refund_spec.rb +8 -11
- data/spec/models/spree/reimbursement/credit_spec.rb +2 -2
- data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +6 -4
- data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +1 -1
- data/spec/models/spree/reimbursement_performer_spec.rb +2 -2
- data/spec/models/spree/reimbursement_spec.rb +9 -11
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +4 -5
- data/spec/models/spree/reimbursement_type/credit_spec.rb +2 -2
- data/spec/models/spree/reimbursement_type/exchange_spec.rb +2 -3
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +4 -4
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +1 -1
- data/spec/models/spree/return_authorization_spec.rb +18 -21
- data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +7 -7
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -1
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -1
- data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +1 -1
- data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +1 -1
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +1 -2
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +3 -5
- data/spec/models/spree/return_item_spec.rb +29 -31
- data/spec/models/spree/returns_calculator_spec.rb +1 -1
- data/spec/models/spree/shipment_spec.rb +59 -43
- data/spec/models/spree/shipping_calculator_spec.rb +3 -3
- data/spec/models/spree/shipping_manifest_spec.rb +8 -7
- data/spec/models/spree/shipping_method_spec.rb +149 -24
- data/spec/models/spree/shipping_rate_spec.rb +116 -76
- data/spec/models/spree/shipping_rate_tax_spec.rb +83 -0
- data/spec/models/spree/state_spec.rb +2 -2
- data/spec/models/spree/stock/availability_validator_spec.rb +4 -4
- data/spec/models/spree/stock/coordinator_spec.rb +33 -49
- data/spec/models/spree/stock/differentiator_spec.rb +1 -1
- data/spec/models/spree/stock/estimator_spec.rb +83 -54
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +1 -3
- data/spec/models/spree/stock/package_spec.rb +27 -10
- data/spec/models/spree/stock/packer_spec.rb +4 -4
- data/spec/models/spree/stock/prioritizer_spec.rb +1 -1
- data/spec/models/spree/stock/quantifier_spec.rb +2 -6
- data/spec/models/spree/stock/splitter/backordered_spec.rb +1 -1
- data/spec/models/spree/stock/splitter/base_spec.rb +1 -2
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +1 -3
- data/spec/models/spree/stock/splitter/weight_spec.rb +3 -3
- data/spec/models/spree/stock_item_spec.rb +16 -16
- data/spec/models/spree/stock_location_spec.rb +6 -8
- data/spec/models/spree/stock_movement_spec.rb +1 -1
- data/spec/models/spree/stock_transfer_spec.rb +1 -3
- data/spec/models/spree/store_credit_category_spec.rb +1 -1
- data/spec/models/spree/store_credit_event_spec.rb +3 -5
- data/spec/models/spree/store_credit_spec.rb +24 -23
- data/spec/models/spree/store_spec.rb +21 -2
- data/spec/models/spree/tax/item_adjuster_spec.rb +74 -0
- data/spec/models/spree/tax/order_adjuster_spec.rb +49 -0
- data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +50 -0
- data/spec/models/spree/tax/tax_location_spec.rb +68 -0
- data/spec/models/spree/tax/taxation_integration_spec.rb +787 -0
- data/spec/models/spree/tax_category_spec.rb +2 -2
- data/spec/models/spree/tax_rate_spec.rb +185 -536
- data/spec/models/spree/taxon_spec.rb +69 -5
- data/spec/models/spree/taxonomy_spec.rb +2 -3
- data/spec/models/spree/tracker_spec.rb +1 -1
- data/spec/models/spree/transfer_item_spec.rb +1 -1
- data/spec/models/spree/unit_cancel_spec.rb +9 -14
- data/spec/models/spree/user_spec.rb +19 -24
- data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +1 -1
- data/spec/models/spree/variant/pricer_spec.rb +48 -0
- data/spec/models/spree/variant/pricing_options_spec.rb +106 -0
- data/spec/models/spree/variant/scopes_spec.rb +31 -8
- data/spec/models/spree/variant_property_rule_spec.rb +1 -1
- data/spec/models/spree/variant_spec.rb +166 -52
- data/spec/models/spree/zone_spec.rb +135 -10
- data/spec/support/big_decimal.rb +1 -1
- data/spec/support/concerns/working_factories.rb +2 -2
- data/spec/support/dummy_ability.rb +0 -1
- metadata +55 -44
- data/lib/generators/spree/dummy/templates/initializers/devise.rb +0 -3
- data/lib/spree/migration_helpers.rb +0 -19
- data/vendor/assets/stylesheets/skeleton.css +0 -242
|
@@ -15,7 +15,7 @@ class Spree::StoreCredit < Spree::Base
|
|
|
15
15
|
belongs_to :user, class_name: Spree::UserClassHandle.new
|
|
16
16
|
belongs_to :created_by, class_name: Spree::UserClassHandle.new
|
|
17
17
|
belongs_to :category, class_name: "Spree::StoreCreditCategory"
|
|
18
|
-
belongs_to :credit_type, class_name: 'Spree::StoreCreditType', :
|
|
18
|
+
belongs_to :credit_type, class_name: 'Spree::StoreCreditType', foreign_key: 'type_id'
|
|
19
19
|
has_many :store_credit_events
|
|
20
20
|
|
|
21
21
|
validates_presence_of :user_id, :category_id, :type_id, :created_by_id, :currency
|
|
@@ -44,7 +44,7 @@ class Spree::StoreCredit < Spree::Base
|
|
|
44
44
|
amount - amount_used - amount_authorized
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
def authorize(amount, order_currency, options={})
|
|
47
|
+
def authorize(amount, order_currency, options = {})
|
|
48
48
|
authorization_code = options[:action_authorization_code]
|
|
49
49
|
if authorization_code
|
|
50
50
|
if store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code: authorization_code)
|
|
@@ -62,7 +62,7 @@ class Spree::StoreCredit < Spree::Base
|
|
|
62
62
|
action_originator: options[:action_originator],
|
|
63
63
|
action_authorization_code: authorization_code,
|
|
64
64
|
|
|
65
|
-
amount_authorized:
|
|
65
|
+
amount_authorized: amount_authorized + amount
|
|
66
66
|
})
|
|
67
67
|
authorization_code
|
|
68
68
|
else
|
|
@@ -77,10 +77,10 @@ class Spree::StoreCredit < Spree::Base
|
|
|
77
77
|
elsif currency != order_currency
|
|
78
78
|
errors.add(:base, Spree.t('store_credit.currency_mismatch'))
|
|
79
79
|
end
|
|
80
|
-
|
|
80
|
+
errors.blank?
|
|
81
81
|
end
|
|
82
82
|
|
|
83
|
-
def capture(amount, authorization_code, order_currency, options={})
|
|
83
|
+
def capture(amount, authorization_code, order_currency, options = {})
|
|
84
84
|
return false unless authorize(amount, order_currency, action_authorization_code: authorization_code)
|
|
85
85
|
auth_event = store_credit_events.find_by!(action: AUTHORIZE_ACTION, authorization_code: authorization_code)
|
|
86
86
|
|
|
@@ -95,8 +95,8 @@ class Spree::StoreCredit < Spree::Base
|
|
|
95
95
|
action_originator: options[:action_originator],
|
|
96
96
|
action_authorization_code: authorization_code,
|
|
97
97
|
|
|
98
|
-
amount_used:
|
|
99
|
-
amount_authorized:
|
|
98
|
+
amount_used: amount_used + amount,
|
|
99
|
+
amount_authorized: amount_authorized - auth_event.amount
|
|
100
100
|
})
|
|
101
101
|
authorization_code
|
|
102
102
|
end
|
|
@@ -106,15 +106,15 @@ class Spree::StoreCredit < Spree::Base
|
|
|
106
106
|
end
|
|
107
107
|
end
|
|
108
108
|
|
|
109
|
-
def void(authorization_code, options={})
|
|
109
|
+
def void(authorization_code, options = {})
|
|
110
110
|
if auth_event = store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code: authorization_code)
|
|
111
|
-
|
|
111
|
+
update_attributes!({
|
|
112
112
|
action: VOID_ACTION,
|
|
113
113
|
action_amount: auth_event.amount,
|
|
114
114
|
action_authorization_code: authorization_code,
|
|
115
115
|
action_originator: options[:action_originator],
|
|
116
116
|
|
|
117
|
-
amount_authorized: amount_authorized - auth_event.amount
|
|
117
|
+
amount_authorized: amount_authorized - auth_event.amount
|
|
118
118
|
})
|
|
119
119
|
true
|
|
120
120
|
else
|
|
@@ -123,11 +123,11 @@ class Spree::StoreCredit < Spree::Base
|
|
|
123
123
|
end
|
|
124
124
|
end
|
|
125
125
|
|
|
126
|
-
def credit(amount, authorization_code, order_currency, options={})
|
|
126
|
+
def credit(amount, authorization_code, order_currency, options = {})
|
|
127
127
|
# Find the amount related to this authorization_code in order to add the store credit back
|
|
128
128
|
capture_event = store_credit_events.find_by(action: CAPTURE_ACTION, authorization_code: authorization_code)
|
|
129
129
|
|
|
130
|
-
if currency != order_currency
|
|
130
|
+
if currency != order_currency # sanity check to make sure the order currency hasn't changed since the auth
|
|
131
131
|
errors.add(:base, Spree.t('store_credit.currency_mismatch'))
|
|
132
132
|
false
|
|
133
133
|
elsif capture_event && amount <= capture_event.amount
|
|
@@ -135,7 +135,7 @@ class Spree::StoreCredit < Spree::Base
|
|
|
135
135
|
action: CREDIT_ACTION,
|
|
136
136
|
action_amount: amount,
|
|
137
137
|
action_originator: options[:action_originator],
|
|
138
|
-
action_authorization_code: authorization_code
|
|
138
|
+
action_authorization_code: authorization_code
|
|
139
139
|
}
|
|
140
140
|
create_credit_record(amount, action_attributes)
|
|
141
141
|
true
|
|
@@ -162,7 +162,7 @@ class Spree::StoreCredit < Spree::Base
|
|
|
162
162
|
end
|
|
163
163
|
|
|
164
164
|
def generate_authorization_code
|
|
165
|
-
"#{
|
|
165
|
+
"#{id}-SC-#{Time.current.utc.strftime('%Y%m%d%H%M%S%6N')}"
|
|
166
166
|
end
|
|
167
167
|
|
|
168
168
|
def editable?
|
|
@@ -208,7 +208,7 @@ class Spree::StoreCredit < Spree::Base
|
|
|
208
208
|
|
|
209
209
|
private
|
|
210
210
|
|
|
211
|
-
def create_credit_record(amount, action_attributes={})
|
|
211
|
+
def create_credit_record(amount, action_attributes = {})
|
|
212
212
|
# Setting credit_to_new_allocation to true will create a new allocation anytime #credit is called
|
|
213
213
|
# If it is not set, it will update the store credit's amount in place
|
|
214
214
|
credit = if Spree::Config[:credit_to_new_allocation]
|
|
@@ -225,17 +225,17 @@ class Spree::StoreCredit < Spree::Base
|
|
|
225
225
|
def create_credit_record_params(amount)
|
|
226
226
|
{
|
|
227
227
|
amount: amount,
|
|
228
|
-
user_id:
|
|
229
|
-
category_id:
|
|
230
|
-
created_by_id:
|
|
231
|
-
currency:
|
|
232
|
-
type_id:
|
|
233
|
-
memo: credit_allocation_memo
|
|
228
|
+
user_id: user_id,
|
|
229
|
+
category_id: category_id,
|
|
230
|
+
created_by_id: created_by_id,
|
|
231
|
+
currency: currency,
|
|
232
|
+
type_id: type_id,
|
|
233
|
+
memo: credit_allocation_memo
|
|
234
234
|
}
|
|
235
235
|
end
|
|
236
236
|
|
|
237
237
|
def credit_allocation_memo
|
|
238
|
-
Spree.t("store_credit.credit_allocation_memo", id:
|
|
238
|
+
Spree.t("store_credit.credit_allocation_memo", id: id)
|
|
239
239
|
end
|
|
240
240
|
|
|
241
241
|
def store_event
|
|
@@ -252,7 +252,7 @@ class Spree::StoreCredit < Spree::Base
|
|
|
252
252
|
authorization_code: action_authorization_code || event.authorization_code || generate_authorization_code,
|
|
253
253
|
user_total_amount: user.total_available_store_credit,
|
|
254
254
|
originator: action_originator,
|
|
255
|
-
update_reason: update_reason
|
|
255
|
+
update_reason: update_reason
|
|
256
256
|
})
|
|
257
257
|
end
|
|
258
258
|
|
|
@@ -283,7 +283,7 @@ class Spree::StoreCredit < Spree::Base
|
|
|
283
283
|
end
|
|
284
284
|
|
|
285
285
|
def associate_credit_type
|
|
286
|
-
unless
|
|
286
|
+
unless type_id
|
|
287
287
|
credit_type_name = category.try(:non_expiring?) ? Spree.t("store_credit.non_expiring") : Spree.t("store_credit.expiring")
|
|
288
288
|
self.credit_type = Spree::StoreCreditType.find_by_name(credit_type_name)
|
|
289
289
|
end
|
|
@@ -5,7 +5,7 @@ class Spree::StoreCreditCategory < Spree::Base
|
|
|
5
5
|
class_attribute :reimbursement_category_name
|
|
6
6
|
self.reimbursement_category_name = Spree.t("store_credit_category.default")
|
|
7
7
|
|
|
8
|
-
def self.reimbursement_category(
|
|
8
|
+
def self.reimbursement_category(_reimbursement)
|
|
9
9
|
Spree::StoreCreditCategory.find_by(name: reimbursement_category_name) ||
|
|
10
10
|
Spree::StoreCreditCategory.first
|
|
11
11
|
end
|
|
@@ -13,5 +13,4 @@ class Spree::StoreCreditCategory < Spree::Base
|
|
|
13
13
|
def non_expiring?
|
|
14
14
|
self.class.non_expiring_credit_types.include? name
|
|
15
15
|
end
|
|
16
|
-
|
|
17
16
|
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Tax
|
|
3
|
+
# Adjust a single taxable item (line item or shipment)
|
|
4
|
+
class ItemAdjuster
|
|
5
|
+
attr_reader :item, :order
|
|
6
|
+
|
|
7
|
+
include TaxHelpers
|
|
8
|
+
|
|
9
|
+
# @param [Spree::LineItem,Spree::Shipment] item to adjust
|
|
10
|
+
# @param [Hash] options like already known tax rates for the order's zone
|
|
11
|
+
def initialize(item, options = {})
|
|
12
|
+
@item = item
|
|
13
|
+
@order = @item.order
|
|
14
|
+
# set instance variable so `TaxRate.match` is only called when necessary
|
|
15
|
+
@rates_for_order_zone = options[:rates_for_order_zone]
|
|
16
|
+
@rates_for_default_zone = options[:rates_for_default_zone]
|
|
17
|
+
@order_tax_zone = options[:order_tax_zone]
|
|
18
|
+
@skip_destroy_adjustments = options[:skip_destroy_adjustments]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Deletes all existing tax adjustments and creates new adjustments for all
|
|
22
|
+
# (geographically and category-wise) applicable tax rates.
|
|
23
|
+
#
|
|
24
|
+
# Creating the adjustments will also run the ItemAdjustments class and
|
|
25
|
+
# persist all taxation and promotion totals on the item.
|
|
26
|
+
#
|
|
27
|
+
# @return [Array<Spree::Adjustment>] newly created adjustments
|
|
28
|
+
def adjust!
|
|
29
|
+
return unless order_tax_zone(order)
|
|
30
|
+
# Using .destroy_all to make sure callbacks fire
|
|
31
|
+
item.adjustments.tax.destroy_all unless @skip_destroy_adjustments
|
|
32
|
+
|
|
33
|
+
rates_for_item(item).map { |rate| rate.adjust(order_tax_zone(order), item) }
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Tax
|
|
3
|
+
# Add tax adjustments to all line items and shipments in an order
|
|
4
|
+
class OrderAdjuster
|
|
5
|
+
attr_reader :order
|
|
6
|
+
|
|
7
|
+
include TaxHelpers
|
|
8
|
+
|
|
9
|
+
# @param [Spree::Order] order to be adjusted
|
|
10
|
+
def initialize(order)
|
|
11
|
+
@order = order
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Creates tax adjustments for all taxable items (shipments and line items)
|
|
15
|
+
# in the given order.
|
|
16
|
+
def adjust!
|
|
17
|
+
return unless order_tax_zone(order)
|
|
18
|
+
|
|
19
|
+
order.all_adjustments.tax.destroy_all
|
|
20
|
+
|
|
21
|
+
(order.line_items + order.shipments).each do |item|
|
|
22
|
+
ItemAdjuster.new(item, order_wide_options).adjust!
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def order_wide_options
|
|
29
|
+
{
|
|
30
|
+
rates_for_order_zone: rates_for_order_zone(order),
|
|
31
|
+
rates_for_default_zone: rates_for_default_zone,
|
|
32
|
+
order_tax_zone: order_tax_zone(order),
|
|
33
|
+
skip_destroy_adjustments: true
|
|
34
|
+
}
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Tax
|
|
3
|
+
# Used to build shipping rate taxes
|
|
4
|
+
class ShippingRateTaxer
|
|
5
|
+
include TaxHelpers
|
|
6
|
+
|
|
7
|
+
# Build shipping rate taxes for a shipping rate
|
|
8
|
+
# Modifies the passed-in shipping rate with associated shipping rate taxes.
|
|
9
|
+
# @param [Spree::ShippingRate] shipping_rate The shipping rate to add taxes to.
|
|
10
|
+
# This parameter will be modified.
|
|
11
|
+
# @return [Spree::ShippingRate] The shipping rate with associated tax objects
|
|
12
|
+
def tax(shipping_rate)
|
|
13
|
+
tax_rates_for_shipping_rate(shipping_rate).each do |tax_rate|
|
|
14
|
+
shipping_rate.taxes.build(
|
|
15
|
+
amount: tax_rate.compute_amount(shipping_rate),
|
|
16
|
+
tax_rate: tax_rate
|
|
17
|
+
)
|
|
18
|
+
end
|
|
19
|
+
shipping_rate
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def tax_rates_for_shipping_rate(shipping_rate)
|
|
25
|
+
applicable_rates(shipping_rate.order).select do |tax_rate|
|
|
26
|
+
tax_rate.tax_category == shipping_rate.tax_category
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Tax
|
|
3
|
+
module TaxHelpers
|
|
4
|
+
private
|
|
5
|
+
|
|
6
|
+
# Imagine with me this scenario:
|
|
7
|
+
# You are living in Spain and you have a store which ships to France.
|
|
8
|
+
# Spain is therefore your default tax rate.
|
|
9
|
+
# When you ship to Spain, you want the Spanish rate to apply.
|
|
10
|
+
# When you ship to France, you want the French rate to apply.
|
|
11
|
+
#
|
|
12
|
+
# Normally, Spree would notice that you have two potentially applicable
|
|
13
|
+
# tax rates for one particular item.
|
|
14
|
+
# When you ship to Spain, only the Spanish one will apply.
|
|
15
|
+
# When you ship to France, you'll see a Spanish refund AND a French tax.
|
|
16
|
+
# This little bit of code at the end stops the Spanish refund from appearing.
|
|
17
|
+
#
|
|
18
|
+
# For further discussion, see https://github.com/spree/spree/issues/4397 and https://github.com/spree/spree/issues/4327.
|
|
19
|
+
def applicable_rates(order)
|
|
20
|
+
order_zone_tax_categories = rates_for_order_zone(order).map(&:tax_category)
|
|
21
|
+
default_rates_with_unmatched_tax_category = rates_for_default_zone.to_a.delete_if do |default_rate|
|
|
22
|
+
order_zone_tax_categories.include?(default_rate.tax_category)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
(rates_for_order_zone(order) + default_rates_with_unmatched_tax_category).uniq
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def rates_for_order_zone(order)
|
|
29
|
+
@rates_for_order_zone ||= Spree::TaxRate.for_zone(order_tax_zone(order))
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def rates_for_default_zone
|
|
33
|
+
@rates_for_default_zone ||= Spree::TaxRate.for_zone(Spree::Zone.default_tax)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def order_tax_zone(order)
|
|
37
|
+
@order_tax_zone ||= order.tax_zone
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def sum_of_included_tax_rates(item)
|
|
41
|
+
rates_for_item(item).map(&:amount).sum
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def rates_for_item(item)
|
|
45
|
+
applicable_rates(item.order).select { |rate| rate.tax_category == item.tax_category }
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Tax
|
|
3
|
+
# A class exclusively used as a drop-in replacement for a default tax address.
|
|
4
|
+
# It responds to `:country_id` and `:state_id`.
|
|
5
|
+
#
|
|
6
|
+
# @attr_reader [Integer] country_id the ID of a Spree::Country object
|
|
7
|
+
# @attr_reader [Integer] state_id the ID of a Spree::State object
|
|
8
|
+
class TaxLocation
|
|
9
|
+
attr_reader :country_id, :state_id
|
|
10
|
+
|
|
11
|
+
# Create a new TaxLocation object
|
|
12
|
+
#
|
|
13
|
+
# @see Spree::Zone.for_address
|
|
14
|
+
#
|
|
15
|
+
# @param [Spree::Country] country a Spree::Country object, default: nil
|
|
16
|
+
# @param [Spree::State] state a Spree::State object, default: nil
|
|
17
|
+
#
|
|
18
|
+
# @return [Spree::Tax::TaxLocation] a Spree::Tax::TaxLocation object
|
|
19
|
+
def initialize(country: nil, state: nil)
|
|
20
|
+
@country_id = country && country.id
|
|
21
|
+
@state_id = state && state.id
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def ==(other)
|
|
25
|
+
state_id == other.state_id && country_id == other.country_id
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def empty?
|
|
29
|
+
country_id.nil? && state_id.nil?
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -13,7 +13,7 @@ module Spree
|
|
|
13
13
|
|
|
14
14
|
def ensure_one_default
|
|
15
15
|
if is_default
|
|
16
|
-
Spree::TaxCategory.where(is_default: true).where.not(id:
|
|
16
|
+
Spree::TaxCategory.where(is_default: true).where.not(id: id).update_all(is_default: false, updated_at: Time.current)
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
end
|
|
@@ -22,90 +22,17 @@ module Spree
|
|
|
22
22
|
belongs_to :tax_category, class_name: "Spree::TaxCategory", inverse_of: :tax_rates
|
|
23
23
|
|
|
24
24
|
has_many :adjustments, as: :source
|
|
25
|
+
has_many :shipping_rate_taxes, class_name: "Spree::ShippingRateTax"
|
|
25
26
|
|
|
26
27
|
validates :amount, presence: true, numericality: true
|
|
27
28
|
validates :tax_category_id, presence: true
|
|
28
29
|
validates_with DefaultTaxZoneValidator
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
# Finds all tax rates whose zones match a given address
|
|
32
|
+
scope :for_address, ->(address) { joins(:zone).merge(Spree::Zone.for_address(address)) }
|
|
31
33
|
|
|
32
|
-
#
|
|
33
|
-
|
|
34
|
-
return [] unless order_tax_zone
|
|
35
|
-
rates = includes(zone: { zone_members: :zoneable }).load.select do |rate|
|
|
36
|
-
# Why "potentially"?
|
|
37
|
-
# Go see the documentation for that method.
|
|
38
|
-
rate.potentially_applicable?(order_tax_zone)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# Imagine with me this scenario:
|
|
42
|
-
# You are living in Spain and you have a store which ships to France.
|
|
43
|
-
# Spain is therefore your default tax rate.
|
|
44
|
-
# When you ship to Spain, you want the Spanish rate to apply.
|
|
45
|
-
# When you ship to France, you want the French rate to apply.
|
|
46
|
-
#
|
|
47
|
-
# Normally, Spree would notice that you have two potentially applicable
|
|
48
|
-
# tax rates for one particular item.
|
|
49
|
-
# When you ship to Spain, only the Spanish one will apply.
|
|
50
|
-
# When you ship to France, you'll see a Spanish refund AND a French tax.
|
|
51
|
-
# This little bit of code at the end stops the Spanish refund from appearing.
|
|
52
|
-
#
|
|
53
|
-
# For further discussion, see https://github.com/spree/spree/issues/4397 and https://github.com/spree/spree/issues/4327.
|
|
54
|
-
|
|
55
|
-
remaining_rates = rates.dup
|
|
56
|
-
rates.each do |rate|
|
|
57
|
-
if rate.included_in_price?
|
|
58
|
-
if remaining_rates.any?{|r| r != rate && r.tax_category == rate.tax_category }
|
|
59
|
-
remaining_rates.delete(rate)
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
remaining_rates
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# Pre-tax amounts must be stored so that we can calculate
|
|
68
|
-
# correct rate amounts in the future. For example:
|
|
69
|
-
# https://github.com/spree/spree/issues/4318#issuecomment-34723428
|
|
70
|
-
def self.store_pre_tax_amount(item, rates)
|
|
71
|
-
pre_tax_amount = case item
|
|
72
|
-
when Spree::LineItem then item.discounted_amount
|
|
73
|
-
when Spree::Shipment then item.discounted_cost
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
included_rates = rates.select(&:included_in_price)
|
|
77
|
-
if included_rates.any?
|
|
78
|
-
pre_tax_amount /= (1 + included_rates.map(&:amount).sum)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
item.update_column(:pre_tax_amount, pre_tax_amount.round(2))
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# This method is best described by the documentation on #potentially_applicable?
|
|
85
|
-
def self.adjust(order_tax_zone, items)
|
|
86
|
-
rates = self.match(order_tax_zone)
|
|
87
|
-
tax_categories = rates.map(&:tax_category)
|
|
88
|
-
relevant_items, non_relevant_items = items.partition { |item| tax_categories.include?(item.tax_category) }
|
|
89
|
-
relevant_items.group_by { |item| item.class.name }.each do |class_name, items|
|
|
90
|
-
Spree::Adjustment.where(adjustable_type: class_name, adjustable_id: items.map(&:id)).tax.destroy_all
|
|
91
|
-
end
|
|
92
|
-
relevant_items.each do |item|
|
|
93
|
-
relevant_rates = rates.select { |rate| rate.tax_category == item.tax_category }
|
|
94
|
-
store_pre_tax_amount(item, relevant_rates)
|
|
95
|
-
relevant_rates.each do |rate|
|
|
96
|
-
rate.adjust(order_tax_zone, item)
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
non_relevant_items.each do |item|
|
|
100
|
-
if item.adjustments.tax.present?
|
|
101
|
-
item.adjustments.tax.destroy_all # using destroy_all to ensure adjustment destroy callback fires.
|
|
102
|
-
item.update_columns pre_tax_amount: 0
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
# Tax rates can *potentially* be applicable to an order.
|
|
108
|
-
# We do not know if they are/aren't until we attempt to apply these rates to
|
|
34
|
+
# Finds geographically matching tax rates for a tax zone.
|
|
35
|
+
# We do not know if they are/aren't applicable until we attempt to apply these rates to
|
|
109
36
|
# the items contained within the Order itself.
|
|
110
37
|
# For instance, if a rate passes the criteria outlined in this method,
|
|
111
38
|
# but then has a tax category that doesn't match against any of the line items
|
|
@@ -144,11 +71,20 @@ module Spree
|
|
|
144
71
|
# Under no circumstances should negative adjustments be applied for the Spanish tax rates.
|
|
145
72
|
#
|
|
146
73
|
# Those rates should never come into play at all and only the French rates should apply.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
74
|
+
scope :for_zone, ->(zone) { where(zone_id: Spree::Zone.with_shared_members(zone).pluck(:id)) }
|
|
75
|
+
scope :included_in_price, -> { where(included_in_price: true) }
|
|
76
|
+
|
|
77
|
+
# Create tax adjustments for some items that have the same tax zone.
|
|
78
|
+
#
|
|
79
|
+
# @deprecated Please use Spree::Tax::OrderAdjuster or Spree::Tax::ItemAdjuster instead.
|
|
80
|
+
#
|
|
81
|
+
# @param [Spree::Zone] order_tax_zone is the smalles applicable zone to the order's tax address
|
|
82
|
+
# @param [Array<Spree::LineItem,Spree::Shipment>] items to be adjusted
|
|
83
|
+
def self.adjust(order_tax_zone, items)
|
|
84
|
+
ActiveSupport::Deprecation.warn("Please use Spree::Tax::OrderAdjuster or Spree::Tax::ItemAdjuster instead", caller)
|
|
85
|
+
items.map do |item|
|
|
86
|
+
Spree::Tax::ItemAdjuster.new(item, rates_for_order_zone: for_zone(order_tax_zone)).adjust!
|
|
87
|
+
end
|
|
152
88
|
end
|
|
153
89
|
|
|
154
90
|
# Creates necessary tax adjustments for the order.
|
|
@@ -156,44 +92,43 @@ module Spree
|
|
|
156
92
|
amount = compute_amount(item)
|
|
157
93
|
return if amount == 0
|
|
158
94
|
|
|
159
|
-
included = included_in_price &&
|
|
160
|
-
|
|
161
|
-
if amount < 0
|
|
162
|
-
label = Spree.t(:refund) + ' ' + create_label
|
|
163
|
-
end
|
|
95
|
+
included = included_in_price && amount > 0
|
|
164
96
|
|
|
165
|
-
|
|
166
|
-
:
|
|
167
|
-
:
|
|
168
|
-
:
|
|
169
|
-
:
|
|
170
|
-
:
|
|
97
|
+
adjustments.create!({
|
|
98
|
+
adjustable: item,
|
|
99
|
+
amount: amount,
|
|
100
|
+
order_id: item.order_id,
|
|
101
|
+
label: adjustment_label(amount),
|
|
102
|
+
included: included
|
|
171
103
|
})
|
|
172
104
|
end
|
|
173
105
|
|
|
174
106
|
# This method is used by Adjustment#update to recalculate the cost.
|
|
175
107
|
def compute_amount(item)
|
|
176
|
-
|
|
177
|
-
# In this case, it's a refund.
|
|
178
|
-
calculator.compute(item) * - 1
|
|
179
|
-
else
|
|
180
|
-
calculator.compute(item)
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
def default_zone_or_zone_match?(order_tax_zone)
|
|
185
|
-
Zone.default_tax.try!(:contains?, order_tax_zone) || self.zone.contains?(order_tax_zone)
|
|
108
|
+
calculator.compute(item)
|
|
186
109
|
end
|
|
187
110
|
|
|
188
111
|
private
|
|
189
112
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
end
|
|
113
|
+
def adjustment_label(amount)
|
|
114
|
+
Spree.t translation_key(amount),
|
|
115
|
+
scope: "adjustment_labels.tax_rates",
|
|
116
|
+
name: name.presence || tax_category.name,
|
|
117
|
+
amount: amount_for_adjustment_label
|
|
118
|
+
end
|
|
197
119
|
|
|
120
|
+
def amount_for_adjustment_label
|
|
121
|
+
ActiveSupport::NumberHelper::NumberToPercentageConverter.convert(
|
|
122
|
+
amount * 100,
|
|
123
|
+
locale: I18n.locale
|
|
124
|
+
)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def translation_key(amount)
|
|
128
|
+
key = included_in_price? ? "vat" : "sales_tax"
|
|
129
|
+
key += "_refund" if amount < 0
|
|
130
|
+
key += "_with_rate" if show_rate_in_label?
|
|
131
|
+
key.to_sym
|
|
132
|
+
end
|
|
198
133
|
end
|
|
199
134
|
end
|
data/app/models/spree/taxon.rb
CHANGED
|
@@ -13,6 +13,8 @@ module Spree
|
|
|
13
13
|
has_many :promotion_rules, through: :promotion_rule_taxons
|
|
14
14
|
|
|
15
15
|
before_create :set_permalink
|
|
16
|
+
before_update :set_permalink
|
|
17
|
+
after_update :update_child_permalinks, if: :permalink_changed?
|
|
16
18
|
|
|
17
19
|
validates :name, presence: true
|
|
18
20
|
validates :meta_keywords, length: { maximum: 255 }
|
|
@@ -47,7 +49,7 @@ module Spree
|
|
|
47
49
|
# @return [String] meta_title if set otherwise a string containing the
|
|
48
50
|
# root name and taxon name
|
|
49
51
|
def seo_title
|
|
50
|
-
|
|
52
|
+
if meta_title.present?
|
|
51
53
|
meta_title
|
|
52
54
|
else
|
|
53
55
|
root? ? name : "#{root.name} - #{name}"
|
|
@@ -57,11 +59,22 @@ module Spree
|
|
|
57
59
|
# Sets this taxons permalink to a valid url encoded string based on its
|
|
58
60
|
# name and its parents permalink (if present.)
|
|
59
61
|
def set_permalink
|
|
60
|
-
if
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
permalink_tail = permalink.split('/').last if permalink.present?
|
|
63
|
+
permalink_tail ||= name.to_url
|
|
64
|
+
self.permalink_part = permalink_tail
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Update the permalink for this taxon and all children (if necessary)
|
|
68
|
+
def update_permalinks
|
|
69
|
+
set_permalink
|
|
70
|
+
|
|
71
|
+
# This will trigger update_child_permalinks if permalink has changed
|
|
72
|
+
save!
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Update the permalinks for all children
|
|
76
|
+
def update_child_permalinks
|
|
77
|
+
children.each(&:update_permalinks)
|
|
65
78
|
end
|
|
66
79
|
|
|
67
80
|
# @return [String] this taxon's permalink
|
|
@@ -72,16 +85,15 @@ module Spree
|
|
|
72
85
|
# @return [ActiveRecord::Relation<Spree::Product>] the active products the
|
|
73
86
|
# belong to this taxon
|
|
74
87
|
def active_products
|
|
75
|
-
products.
|
|
88
|
+
products.not_deleted.available
|
|
76
89
|
end
|
|
77
90
|
|
|
78
91
|
# @return [String] this taxon's ancestors names followed by its own name,
|
|
79
92
|
# separated by arrows
|
|
80
93
|
def pretty_name
|
|
81
|
-
ancestor_chain =
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
ancestor_chain + "#{name}"
|
|
94
|
+
ancestor_chain = ancestors.map(&:name)
|
|
95
|
+
ancestor_chain << name
|
|
96
|
+
ancestor_chain.join(" -> ")
|
|
85
97
|
end
|
|
86
98
|
|
|
87
99
|
# @see https://github.com/spree/spree/issues/3390
|
|
@@ -92,7 +104,19 @@ module Spree
|
|
|
92
104
|
#
|
|
93
105
|
# NOTE: no :position column needed - awesom_nested_set doesn't handle the
|
|
94
106
|
# reordering if you bring your own :order_column.
|
|
95
|
-
move_to_child_with_index(parent, idx.to_i) unless
|
|
107
|
+
move_to_child_with_index(parent, idx.to_i) unless new_record?
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def permalink_part
|
|
111
|
+
permalink.split('/').last
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def permalink_part=(value)
|
|
115
|
+
if parent.present?
|
|
116
|
+
self.permalink = "#{parent.permalink}/#{value}"
|
|
117
|
+
else
|
|
118
|
+
self.permalink = value
|
|
119
|
+
end
|
|
96
120
|
end
|
|
97
121
|
|
|
98
122
|
private
|
|
@@ -12,16 +12,16 @@ module Spree
|
|
|
12
12
|
default_scope -> { order(:position) }
|
|
13
13
|
|
|
14
14
|
private
|
|
15
|
-
def set_name
|
|
16
|
-
if root
|
|
17
|
-
root.update_columns(
|
|
18
|
-
name: name,
|
|
19
|
-
updated_at: Time.current,
|
|
20
|
-
)
|
|
21
|
-
else
|
|
22
|
-
self.root = Taxon.create!(taxonomy_id: id, name: name)
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
15
|
|
|
16
|
+
def set_name
|
|
17
|
+
if root
|
|
18
|
+
root.update_columns(
|
|
19
|
+
name: name,
|
|
20
|
+
updated_at: Time.current
|
|
21
|
+
)
|
|
22
|
+
else
|
|
23
|
+
self.root = Taxon.create!(taxonomy_id: id, name: name)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
26
|
end
|
|
27
27
|
end
|