solidus_core 3.0.0 → 4.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/Rakefile +7 -2
- data/app/assets/images/logo/solidus.svg +18 -1
- data/app/assets/images/logo/solidus_logo.png +0 -0
- data/app/controllers/spree/base_controller.rb +1 -3
- data/app/helpers/spree/base_helper.rb +3 -3
- data/app/helpers/spree/core/controller_helpers/auth.rb +66 -0
- data/app/helpers/spree/core/controller_helpers/common.rb +82 -0
- data/app/helpers/spree/core/controller_helpers/order.rb +86 -0
- data/app/helpers/spree/core/controller_helpers/payment_parameters.rb +165 -0
- data/{lib/spree/core/controller_helpers/current_host.rb → app/helpers/spree/core/controller_helpers/pricing.rb} +6 -4
- data/app/helpers/spree/core/controller_helpers/search.rb +16 -0
- data/app/helpers/spree/core/controller_helpers/store.rb +19 -0
- data/app/helpers/spree/core/controller_helpers/strong_parameters.rb +74 -0
- data/app/helpers/spree/products_helper.rb +2 -2
- data/app/mailers/spree/base_mailer.rb +1 -1
- data/app/mailers/spree/carton_mailer.rb +1 -1
- data/app/mailers/spree/order_mailer.rb +3 -3
- data/app/mailers/spree/reimbursement_mailer.rb +1 -1
- data/app/models/concerns/spree/active_storage_adapter/attachment.rb +30 -11
- data/app/models/concerns/spree/active_storage_adapter/normalization.rb +1 -1
- data/app/models/concerns/spree/active_storage_adapter.rb +1 -18
- data/app/models/concerns/spree/default_price.rb +30 -10
- data/app/models/concerns/spree/display_money.rb +1 -1
- data/app/models/concerns/spree/metadata.rb +64 -0
- data/app/models/concerns/spree/named_type.rb +2 -0
- data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
- data/app/models/concerns/spree/ransackable_attributes.rb +9 -5
- data/app/models/concerns/spree/user_address_book.rb +19 -10
- data/app/models/concerns/spree/user_methods.rb +40 -6
- data/app/models/spree/address.rb +11 -9
- data/app/models/spree/adjustment.rb +15 -76
- data/app/models/spree/adjustment_reason.rb +2 -0
- data/app/models/spree/calculator/flat_fee.rb +21 -0
- data/app/models/spree/calculator/returns/default_refund_amount.rb +1 -1
- data/app/models/spree/carton.rb +3 -3
- data/app/models/spree/core/state_machines/inventory_unit.rb +42 -0
- data/app/models/spree/core/state_machines/order/class_methods.rb +217 -0
- data/app/models/spree/core/state_machines/order.rb +42 -0
- data/app/models/spree/core/state_machines/payment.rb +61 -0
- data/app/models/spree/core/state_machines/reimbursement.rb +33 -0
- data/app/models/spree/core/state_machines/return_authorization.rb +32 -0
- data/app/models/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
- data/app/models/spree/core/state_machines/return_item/reception_status.rb +42 -0
- data/app/models/spree/core/state_machines/shipment.rb +58 -0
- data/app/models/spree/country.rb +1 -1
- data/app/models/spree/credit_card.rb +13 -10
- data/app/models/spree/customer_return.rb +6 -3
- data/app/models/spree/deprecated_configurable_class.rb +40 -0
- data/app/models/spree/fulfilment_changer.rb +56 -29
- data/app/models/spree/image/active_storage_attachment.rb +2 -7
- data/app/models/spree/image/paperclip_attachment.rb +2 -2
- data/app/models/spree/inventory_unit.rb +2 -2
- data/app/models/spree/item_total.rb +28 -0
- data/app/models/spree/legacy_user.rb +1 -0
- data/app/models/spree/line_item.rb +26 -8
- data/app/models/spree/log_entry.rb +98 -1
- data/app/models/spree/money.rb +120 -0
- data/app/models/spree/null_promotion_adjuster.rb +13 -0
- data/app/models/spree/null_promotion_advertiser.rb +9 -0
- data/app/models/spree/null_promotion_finder.rb +9 -0
- data/app/models/spree/null_promotion_handler.rb +44 -0
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/option_value.rb +4 -3
- data/app/models/spree/order/number_generator.rb +7 -1
- data/app/models/spree/order.rb +143 -96
- data/app/models/spree/order_cancellations.rb +8 -8
- data/app/models/spree/order_inventory.rb +7 -5
- data/app/models/spree/order_merger.rb +5 -7
- data/app/models/spree/order_mutex.rb +2 -2
- data/app/models/spree/order_shipping.rb +15 -19
- data/app/models/spree/order_taxation.rb +7 -4
- data/app/models/spree/order_update_attributes.rb +3 -1
- data/app/models/spree/order_updater.rb +25 -63
- data/app/models/spree/payment/processing.rb +60 -57
- data/app/models/spree/payment.rb +14 -27
- data/app/models/spree/payment_create.rb +1 -1
- data/app/models/spree/payment_method/bogus_credit_card.rb +18 -14
- data/app/models/spree/payment_method/credit_card.rb +0 -4
- data/app/models/spree/payment_method/simple_bogus_credit_card.rb +18 -4
- data/app/models/spree/payment_method/store_credit.rb +1 -1
- data/app/models/spree/payment_method.rb +29 -10
- data/app/models/spree/payment_source.rb +5 -1
- data/app/models/spree/permission_set.rb +11 -0
- data/app/models/spree/permission_sets/base.rb +45 -0
- data/app/models/spree/permission_sets/configuration_display.rb +53 -0
- data/app/models/spree/permission_sets/configuration_management.rb +52 -0
- data/app/models/spree/permission_sets/dashboard_display.rb +28 -0
- data/app/models/spree/permission_sets/default_customer.rb +83 -0
- data/app/models/spree/permission_sets/order_display.rb +50 -0
- data/app/models/spree/permission_sets/order_management.rb +50 -0
- data/app/models/spree/permission_sets/product_display.rb +43 -0
- data/app/models/spree/permission_sets/product_management.rb +47 -0
- data/app/models/spree/permission_sets/restricted_stock_display.rb +33 -0
- data/app/models/spree/permission_sets/restricted_stock_management.rb +33 -0
- data/app/models/spree/permission_sets/stock_display.rb +26 -0
- data/app/models/spree/permission_sets/stock_management.rb +26 -0
- data/app/models/spree/permission_sets/super_user.rb +26 -0
- data/app/models/spree/permission_sets/user_display.rb +27 -0
- data/app/models/spree/permission_sets/user_management.rb +44 -0
- data/app/models/spree/preference.rb +1 -1
- data/app/models/spree/price.rb +3 -3
- data/app/models/spree/product/scopes.rb +23 -10
- data/app/models/spree/product.rb +30 -23
- data/app/models/spree/product_property.rb +1 -1
- data/app/models/spree/property.rb +1 -1
- data/app/models/spree/refund.rb +13 -3
- data/app/models/spree/refund_reason.rb +6 -1
- data/app/models/spree/reimbursement.rb +6 -6
- data/app/models/spree/reimbursement_performer.rb +3 -3
- data/app/models/spree/reimbursement_tax_calculator.rb +3 -3
- data/app/models/spree/reimbursement_type/credit.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +6 -6
- data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
- data/app/models/spree/reimbursement_type.rb +6 -1
- data/app/models/spree/return_authorization.rb +3 -1
- data/app/models/spree/return_item.rb +13 -15
- data/app/models/spree/return_reason.rb +6 -1
- data/app/models/spree/role.rb +3 -1
- data/app/models/spree/role_permission.rb +8 -0
- data/app/models/spree/shipment.rb +12 -10
- data/app/models/spree/shipping_category.rb +2 -0
- data/app/models/spree/shipping_rate.rb +2 -3
- data/app/models/spree/shipping_rate_tax.rb +1 -1
- data/app/models/spree/{order_contents.rb → simple_order_contents.rb} +10 -13
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/stock/allocator/on_hand_first.rb +2 -2
- data/app/models/spree/stock/availability.rb +11 -3
- data/app/models/spree/stock/estimator.rb +1 -1
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
- data/app/models/spree/stock/package.rb +2 -2
- data/app/models/spree/stock/quantifier.rb +12 -8
- data/app/models/spree/stock/simple_coordinator.rb +38 -28
- data/app/models/spree/stock/splitter/shipping_category.rb +1 -1
- data/app/models/spree/stock_item.rb +2 -1
- data/app/models/spree/stock_location.rb +7 -7
- data/app/models/spree/stock_movement.rb +2 -2
- data/app/models/spree/store.rb +3 -1
- data/app/models/spree/store_credit.rb +31 -16
- data/app/models/spree/store_credit_event.rb +4 -3
- data/app/models/spree/store_credit_prioritizer.rb +17 -0
- data/app/models/spree/store_credit_reason.rb +6 -1
- data/app/models/spree/store_selector/by_server_name.rb +1 -1
- data/app/models/spree/tax/item_tax.rb +3 -2
- data/app/models/spree/tax/order_tax.rb +3 -1
- data/app/models/spree/tax/tax_helpers.rb +14 -3
- data/app/models/spree/tax/tax_location.rb +4 -7
- data/app/models/spree/tax_calculator/default.rb +32 -1
- data/app/models/spree/tax_calculator/shipping_rate.rb +2 -2
- data/app/models/spree/tax_category.rb +3 -1
- data/app/models/spree/tax_rate.rb +14 -1
- 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 +25 -3
- data/app/models/spree/taxon_brand_selector.rb +22 -0
- data/app/models/spree/taxonomy.rb +4 -3
- data/app/models/spree/unauthorized_redirect_handler.rb +24 -0
- data/app/models/spree/unit_cancel.rb +1 -2
- data/app/models/spree/user_address.rb +9 -3
- data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +1 -1
- data/app/models/spree/variant/price_selector.rb +25 -8
- data/app/models/spree/variant/scopes.rb +4 -0
- data/app/models/spree/variant/vat_price_generator.rb +1 -1
- data/app/models/spree/variant.rb +64 -37
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +4 -4
- data/app/models/spree/wallet.rb +2 -2
- data/app/models/spree/zone.rb +1 -1
- data/app/subscribers/spree/order_mailer_subscriber.rb +35 -0
- data/app/views/layouts/spree/base_mailer.html.erb +2 -2
- data/app/views/spree/order_mailer/cancel_email.html.erb +1 -1
- data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
- data/app/views/spree/order_mailer/confirm_email.html.erb +5 -5
- data/app/views/spree/order_mailer/confirm_email.text.erb +5 -5
- data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +0 -1
- data/config/i18n-tasks.yml +134 -0
- data/config/locales/en.yml +439 -338
- data/db/default/spree/permission_sets.rb +10 -0
- data/db/default/spree/return_reasons.rb +3 -1
- data/db/default/spree/states.rb +2 -2
- data/db/migrate/20160101010000_solidus_one_four.rb +0 -127
- data/db/migrate/20180710170104_create_spree_store_credit_reasons_table.rb +2 -2
- data/db/migrate/20201127212108_add_type_before_removal_to_spree_payment_methods.rb +7 -0
- data/db/migrate/20210312061050_change_column_null_on_prices.rb +7 -0
- data/db/migrate/20210815004823_add_unique_index_to_option_values_variants.rb +16 -0
- data/db/migrate/20220419170826_remove_archived_user_addresses.rb +12 -0
- data/db/migrate/20220805202442_add_level_to_spree_tax_rates.rb +5 -0
- data/db/migrate/20221123152807_add_shipping_category_to_spree_variants.rb +5 -0
- data/db/migrate/20230321161854_change_column_null_option_values_option_type_id.rb +5 -0
- data/db/migrate/20230425103509_remove_taxon_position.rb +5 -0
- data/db/migrate/20230427095534_drop_deprecated_address_id_from_shipments.rb +11 -0
- data/db/migrate/20240821173254_create_spree_permission_sets_in_core.rb +9 -0
- data/db/migrate/20240821173341_create_spree_roles_permissions_in_core.rb +9 -0
- data/db/migrate/20240821173641_add_description_to_spree_roles.rb +5 -0
- data/db/migrate/20240904152041_add_privilege_and_category_to_spree_permission_sets.rb +6 -0
- data/db/migrate/20250129061658_add_metadata_to_spree_resources.rb +28 -0
- data/db/migrate/20250201172950_add_gtin_and_condition_to_spree_variant.rb +6 -0
- data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +7 -0
- data/db/migrate/20250221152004_add_metadata_to_users.rb +13 -0
- data/db/seeds.rb +5 -1
- data/lib/generators/solidus/install/app_templates/authentication/custom.rb +16 -0
- data/lib/generators/solidus/install/app_templates/authentication/devise.rb +16 -0
- data/lib/generators/solidus/install/app_templates/authentication/existing.rb +10 -0
- data/lib/generators/solidus/install/app_templates/authentication/none.rb +1 -0
- data/lib/generators/solidus/install/app_templates/frontend/none.rb +1 -0
- data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -0
- data/lib/generators/solidus/install/app_templates/payment_method/braintree.rb +5 -0
- data/lib/generators/solidus/install/app_templates/payment_method/none.rb +1 -0
- data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +5 -0
- data/lib/generators/solidus/install/app_templates/payment_method/stripe.rb +5 -0
- data/lib/generators/solidus/install/install_generator.rb +210 -156
- data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +27 -33
- data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/backend/all.js +2 -2
- data/lib/generators/solidus/update/templates/config/initializers/new_solidus_defaults.rb.tt +30 -0
- data/lib/generators/solidus/update/update_generator.rb +124 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -4
- data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +2 -6
- data/lib/generators/spree/custom_user/templates/migration.rb.tt +7 -3
- data/lib/generators/spree/dummy/dummy_generator.rb +12 -9
- data/lib/generators/spree/dummy/templates/rails/application.rb.tt +1 -2
- data/lib/generators/spree/dummy/templates/rails/database.yml +48 -63
- data/lib/generators/spree/dummy/templates/rails/manifest.js +3 -0
- data/lib/generators/spree/dummy/templates/rails/test.rb +7 -2
- data/lib/spree/app_configuration.rb +220 -71
- data/lib/spree/bus.rb +11 -0
- data/lib/spree/core/class_constantizer.rb +2 -2
- data/lib/spree/core/controller_helpers/auth.rb +5 -69
- data/lib/spree/core/controller_helpers/common.rb +5 -80
- data/lib/spree/core/controller_helpers/order.rb +5 -86
- data/lib/spree/core/controller_helpers/payment_parameters.rb +5 -165
- data/lib/spree/core/controller_helpers/pricing.rb +5 -17
- data/lib/spree/core/controller_helpers/search.rb +5 -14
- data/lib/spree/core/controller_helpers/store.rb +5 -17
- data/lib/spree/core/controller_helpers/strong_parameters.rb +5 -71
- data/lib/spree/core/engine.rb +49 -16
- data/lib/spree/core/environment/calculators.rb +35 -3
- data/lib/spree/core/environment/promotions.rb +25 -4
- data/lib/spree/core/environment_extension.rb +16 -2
- data/lib/spree/core/importer/order.rb +6 -6
- data/lib/spree/core/importer/product.rb +3 -3
- data/lib/spree/core/nested_class_set.rb +28 -0
- data/lib/spree/core/null_promotion_configuration.rb +84 -0
- data/lib/spree/core/product_duplicator.rb +1 -1
- data/lib/spree/core/product_filters.rb +2 -2
- data/lib/spree/core/search/base.rb +18 -9
- data/lib/spree/core/search/variant.rb +2 -2
- data/lib/spree/core/state_machines/inventory_unit.rb +5 -40
- data/lib/spree/core/state_machines/order.rb +5 -247
- data/lib/spree/core/state_machines/payment.rb +5 -59
- data/lib/spree/core/state_machines/reimbursement.rb +5 -31
- data/lib/spree/core/state_machines/return_authorization.rb +5 -30
- data/lib/spree/core/state_machines/return_item/acceptance_status.rb +5 -49
- data/lib/spree/core/state_machines/return_item/reception_status.rb +5 -40
- data/lib/spree/core/state_machines/shipment.rb +5 -56
- data/lib/spree/core/state_machines.rb +48 -81
- data/lib/spree/core/stock_configuration.rb +18 -0
- data/lib/spree/core/validators/email.rb +2 -4
- data/lib/spree/core/version.rb +5 -1
- data/lib/spree/core/versioned_value.rb +75 -0
- data/lib/spree/core.rb +40 -16
- data/lib/spree/deprecated_instance_variable_proxy.rb +57 -0
- data/lib/spree/deprecation.rb +3 -51
- data/lib/spree/deprecator.rb +9 -0
- data/lib/spree/i18n.rb +1 -1
- data/lib/spree/mailer_previews/carton_preview.rb +1 -1
- data/lib/spree/migration_helpers.rb +3 -3
- data/lib/spree/migrations.rb +13 -11
- data/lib/spree/money.rb +5 -118
- data/lib/spree/permission_sets/base.rb +5 -30
- data/lib/spree/permission_sets/configuration_display.rb +5 -23
- data/lib/spree/permission_sets/configuration_management.rb +5 -23
- data/lib/spree/permission_sets/dashboard_display.rb +5 -9
- data/lib/spree/permission_sets/default_customer.rb +5 -35
- data/lib/spree/permission_sets/order_display.rb +5 -19
- data/lib/spree/permission_sets/order_management.rb +5 -20
- data/lib/spree/permission_sets/product_display.rb +5 -17
- data/lib/spree/permission_sets/product_management.rb +5 -19
- data/lib/spree/permission_sets/restricted_stock_display.rb +5 -16
- data/lib/spree/permission_sets/restricted_stock_management.rb +5 -16
- data/lib/spree/permission_sets/stock_display.rb +5 -10
- data/lib/spree/permission_sets/stock_management.rb +5 -10
- data/lib/spree/permission_sets/super_user.rb +5 -9
- data/lib/spree/permission_sets/user_display.rb +5 -11
- data/lib/spree/permission_sets/user_management.rb +5 -23
- data/lib/spree/permission_sets.rb +5 -18
- data/lib/spree/permitted_attributes.rb +35 -14
- data/lib/spree/preferences/configuration.rb +88 -0
- data/lib/spree/preferences/persistable.rb +7 -1
- data/lib/spree/preferences/preferable.rb +13 -0
- data/lib/spree/preferences/preferable_class_methods.rb +12 -4
- data/lib/spree/preferences/preference_differentiator.rb +29 -0
- data/lib/spree/preferences/static_model_preferences.rb +25 -10
- data/lib/spree/preferences/store.rb +2 -2
- data/lib/spree/testing_support/blacklist_urls.rb +1 -1
- data/lib/spree/testing_support/bus_helpers.rb +101 -0
- data/lib/spree/testing_support/capybara_ext.rb +11 -1
- data/lib/spree/testing_support/common_rake.rb +76 -23
- data/lib/spree/testing_support/dummy_ability.rb +7 -0
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
- data/lib/spree/testing_support/dummy_app/assets/stylesheets/solidus_admin/tailwind.css +1 -0
- data/lib/spree/testing_support/dummy_app/database.yml +39 -28
- data/lib/spree/testing_support/dummy_app/migrations.rb +8 -15
- data/lib/spree/testing_support/dummy_app/rake_tasks.rb +3 -10
- data/lib/spree/testing_support/dummy_app.rb +71 -42
- data/lib/spree/testing_support/extension_rake.rb +2 -2
- data/lib/spree/testing_support/factories/address_factory.rb +9 -13
- data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -13
- data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/calculator_factory.rb +4 -10
- data/lib/spree/testing_support/factories/carton_factory.rb +2 -10
- data/lib/spree/testing_support/factories/country_factory.rb +1 -7
- data/lib/spree/testing_support/factories/credit_card_factory.rb +0 -5
- data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -11
- data/lib/spree/testing_support/factories/image_factory.rb +0 -5
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +4 -14
- data/lib/spree/testing_support/factories/line_item_factory.rb +0 -8
- data/lib/spree/testing_support/factories/option_type_factory.rb +0 -8
- data/lib/spree/testing_support/factories/option_value_factory.rb +0 -5
- data/lib/spree/testing_support/factories/order_factory.rb +19 -38
- data/lib/spree/testing_support/factories/payment_factory.rb +0 -10
- data/lib/spree/testing_support/factories/payment_method_factory.rb +0 -5
- data/lib/spree/testing_support/factories/price_factory.rb +0 -7
- data/lib/spree/testing_support/factories/product_factory.rb +5 -13
- data/lib/spree/testing_support/factories/product_option_type_factory.rb +0 -8
- data/lib/spree/testing_support/factories/product_property_factory.rb +0 -8
- data/lib/spree/testing_support/factories/property_factory.rb +0 -5
- data/lib/spree/testing_support/factories/refund_factory.rb +0 -8
- data/lib/spree/testing_support/factories/refund_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +0 -7
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +0 -5
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +0 -9
- data/lib/spree/testing_support/factories/return_item_factory.rb +0 -9
- data/lib/spree/testing_support/factories/return_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/role_factory.rb +0 -5
- data/lib/spree/testing_support/factories/shipment_factory.rb +1 -11
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +0 -5
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +0 -9
- data/lib/spree/testing_support/factories/shipping_rate_factory.rb +0 -8
- data/lib/spree/testing_support/factories/state_factory.rb +8 -10
- data/lib/spree/testing_support/factories/stock_item_factory.rb +5 -9
- data/lib/spree/testing_support/factories/stock_location_factory.rb +0 -9
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +0 -7
- data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -9
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +0 -5
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +0 -8
- data/lib/spree/testing_support/factories/store_credit_factory.rb +4 -13
- data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +0 -5
- data/lib/spree/testing_support/factories/store_factory.rb +0 -5
- data/lib/spree/testing_support/factories/tax_category_factory.rb +0 -8
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +0 -9
- data/lib/spree/testing_support/factories/taxon_factory.rb +5 -10
- data/lib/spree/testing_support/factories/taxonomy_factory.rb +3 -6
- data/lib/spree/testing_support/factories/user_factory.rb +6 -9
- data/lib/spree/testing_support/factories/variant_factory.rb +0 -10
- data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +0 -8
- data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +0 -9
- data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +0 -8
- data/lib/spree/testing_support/factories/zone_factory.rb +1 -9
- data/lib/spree/testing_support/factory_bot.rb +6 -29
- data/lib/spree/testing_support/flaky.rb +22 -0
- data/lib/spree/testing_support/order_walkthrough.rb +7 -6
- data/lib/spree/testing_support/sequences.rb +0 -5
- data/lib/spree/testing_support/shared_examples/calculator.rb +10 -0
- data/lib/spree/testing_support/shared_examples/order_factory.rb +141 -0
- data/lib/spree/testing_support/shared_examples/working_factory.rb +15 -0
- data/lib/spree/testing_support/silence_deprecations.rb +9 -0
- data/lib/spree/user_class_handle.rb +2 -2
- data/lib/tasks/colorado_delivery_fee.rake +28 -0
- data/lib/tasks/payment_method.rake +29 -0
- data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +8 -0
- data/solidus_core.gemspec +18 -8
- metadata +233 -117
- data/app/jobs/spree/promotion_code_batch_job.rb +0 -26
- data/app/mailers/spree/promotion_code_batch_mailer.rb +0 -15
- data/app/models/spree/calculator/distributed_amount.rb +0 -33
- data/app/models/spree/calculator/flat_percent_item_total.rb +0 -23
- data/app/models/spree/calculator/flexi_rate.rb +0 -22
- data/app/models/spree/calculator/percent_on_line_item.rb +0 -13
- data/app/models/spree/calculator/tiered_flat_rate.rb +0 -52
- data/app/models/spree/calculator/tiered_percent.rb +0 -62
- data/app/models/spree/line_item_action.rb +0 -8
- data/app/models/spree/order_promotion.rb +0 -27
- data/app/models/spree/promotion/actions/create_adjustment.rb +0 -77
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +0 -99
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -139
- data/app/models/spree/promotion/actions/free_shipping.rb +0 -58
- data/app/models/spree/promotion/rules/first_order.rb +0 -38
- data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +0 -36
- data/app/models/spree/promotion/rules/item_total.rb +0 -53
- data/app/models/spree/promotion/rules/nth_order.rb +0 -45
- data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -25
- data/app/models/spree/promotion/rules/option_value.rb +0 -50
- data/app/models/spree/promotion/rules/product.rb +0 -74
- data/app/models/spree/promotion/rules/store.rb +0 -22
- data/app/models/spree/promotion/rules/taxon.rb +0 -87
- data/app/models/spree/promotion/rules/user.rb +0 -30
- data/app/models/spree/promotion/rules/user_logged_in.rb +0 -20
- data/app/models/spree/promotion/rules/user_role.rb +0 -45
- data/app/models/spree/promotion.rb +0 -284
- data/app/models/spree/promotion_action.rb +0 -43
- data/app/models/spree/promotion_category.rb +0 -8
- data/app/models/spree/promotion_chooser.rb +0 -34
- data/app/models/spree/promotion_code/batch_builder.rb +0 -64
- data/app/models/spree/promotion_code.rb +0 -50
- data/app/models/spree/promotion_code_batch.rb +0 -27
- data/app/models/spree/promotion_handler/cart.rb +0 -55
- data/app/models/spree/promotion_handler/coupon.rb +0 -123
- data/app/models/spree/promotion_handler/page.rb +0 -26
- data/app/models/spree/promotion_handler/shipping.rb +0 -61
- data/app/models/spree/promotion_rule.rb +0 -55
- data/app/models/spree/promotion_rule_role.rb +0 -8
- data/app/models/spree/promotion_rule_store.rb +0 -10
- data/app/models/spree/promotion_rule_taxon.rb +0 -8
- data/app/models/spree/promotion_rule_user.rb +0 -10
- data/app/models/spree/tax/shipping_rate_taxer.rb +0 -24
- data/app/subscribers/spree/mailer_subscriber.rb +0 -25
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +0 -2
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +0 -2
- data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +0 -38
- data/db/migrate/20180202190713_create_promotion_rule_stores.rb +0 -12
- data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +0 -11
- data/db/migrate/20190106184413_remove_code_from_spree_promotions.rb +0 -42
- data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -10
- data/lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -9
- data/lib/generators/spree/dummy/templates/rails/script/rails +0 -6
- data/lib/solidus/migrations/promotions_with_code_handlers.rb +0 -66
- data/lib/spree/event/adapters/active_support_notifications.rb +0 -67
- data/lib/spree/event/configuration.rb +0 -25
- data/lib/spree/event/subscriber.rb +0 -86
- data/lib/spree/event/subscriber_registry.rb +0 -94
- data/lib/spree/event.rb +0 -119
- data/lib/spree/permission_sets/promotion_display.rb +0 -15
- data/lib/spree/permission_sets/promotion_management.rb +0 -15
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +0 -10
- data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/frontend/all.css +0 -9
- data/lib/spree/testing_support/dummy_app/views/layouts/application.html.erb +0 -1
- data/lib/spree/testing_support/factories/order_promotion_factory.rb +0 -16
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -12
- data/lib/spree/testing_support/factories/promotion_code_factory.rb +0 -16
- data/lib/spree/testing_support/factories/promotion_factory.rb +0 -92
- data/lib/spree/testing_support/factories.rb +0 -11
- data/lib/spree/testing_support.rb +0 -31
- data/lib/tasks/upgrade.rake +0 -15
@@ -3,7 +3,7 @@
|
|
3
3
|
module Spree
|
4
4
|
class Variant < Spree::Base
|
5
5
|
# This class is responsible for selecting a price for a variant given certain pricing options.
|
6
|
-
# A variant can have multiple or even dynamic prices. The `
|
6
|
+
# A variant can have multiple or even dynamic prices. The `price_for_options`
|
7
7
|
# method determines which price applies under the given circumstances.
|
8
8
|
#
|
9
9
|
class PriceSelector
|
@@ -22,15 +22,32 @@ module Spree
|
|
22
22
|
@variant = variant
|
23
23
|
end
|
24
24
|
|
25
|
-
# The variant's
|
25
|
+
# The variant's Spree::Price record, given a set of pricing options
|
26
26
|
# @param [Spree::Variant::PricingOptions] price_options Pricing Options to abide by
|
27
|
-
# @return [Spree::
|
28
|
-
def
|
29
|
-
variant.
|
30
|
-
(
|
31
|
-
|
27
|
+
# @return [Spree::Price, nil] The most specific price for this set of pricing options.
|
28
|
+
def price_for_options(price_options)
|
29
|
+
sorted_prices_for(variant).detect do |price|
|
30
|
+
(price.country_iso == price_options.desired_attributes[:country_iso] ||
|
31
|
+
price.country_iso.nil?
|
32
32
|
) && price.currency == price_options.desired_attributes[:currency]
|
33
|
-
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# Returns `#prices` prioritized for being considered as default price
|
39
|
+
#
|
40
|
+
# @return [Array<Spree::Price>]
|
41
|
+
def sorted_prices_for(variant)
|
42
|
+
variant.prices.select do |price|
|
43
|
+
variant.discarded? || price.kept?
|
44
|
+
end.sort_by do |price|
|
45
|
+
[
|
46
|
+
price.country_iso.nil? ? 0 : 1,
|
47
|
+
price.updated_at || Time.zone.now,
|
48
|
+
price.id || Float::INFINITY,
|
49
|
+
]
|
50
|
+
end.reverse
|
34
51
|
end
|
35
52
|
end
|
36
53
|
end
|
@@ -10,6 +10,10 @@ module Spree
|
|
10
10
|
order(Arel.sql("COALESCE((SELECT COUNT(*) FROM #{Spree::LineItem.quoted_table_name} GROUP BY #{Spree::LineItem.quoted_table_name}.variant_id HAVING #{Spree::LineItem.quoted_table_name}.variant_id = #{Spree::Variant.quoted_table_name}.id), 0) DESC"))
|
11
11
|
}
|
12
12
|
|
13
|
+
scope :by_stock_location, ->(stock_location_id) {
|
14
|
+
joins(:stock_locations).where(spree_stock_locations: { id: stock_location_id })
|
15
|
+
}
|
16
|
+
|
13
17
|
class << self
|
14
18
|
# Returns variants that match a given option value
|
15
19
|
#
|
@@ -41,7 +41,7 @@ module Spree
|
|
41
41
|
def find_or_initialize_price_by(country_iso, currency)
|
42
42
|
variant.prices.detect do |price|
|
43
43
|
price.country_iso == country_iso && price.currency == currency
|
44
|
-
end || variant.prices.build(country_iso
|
44
|
+
end || variant.prices.build(country_iso:, currency:)
|
45
45
|
end
|
46
46
|
|
47
47
|
# nil is added to the array so we always have an export price.
|
data/app/models/spree/variant.rb
CHANGED
@@ -23,21 +23,27 @@ module Spree
|
|
23
23
|
after_discard do
|
24
24
|
stock_items.discard_all
|
25
25
|
images.destroy_all
|
26
|
-
prices.discard_all
|
27
|
-
currently_valid_prices.discard_all
|
28
26
|
end
|
29
27
|
|
30
28
|
attr_writer :rebuild_vat_prices
|
31
29
|
include Spree::DefaultPrice
|
32
30
|
|
33
|
-
|
31
|
+
# Consider that not all platforms digest structured data in the same way,
|
32
|
+
# you might have to modify the output on the frontend or in feeds accordingly.
|
33
|
+
enum :condition, { damaged: "damaged", new: "new", refurbished: "refurbished", used: "used" }, prefix: true
|
34
|
+
|
35
|
+
belongs_to :product, -> { with_discarded }, touch: true, class_name: 'Spree::Product', inverse_of: :variants_including_master, optional: false
|
34
36
|
belongs_to :tax_category, class_name: 'Spree::TaxCategory', optional: true
|
37
|
+
belongs_to :shipping_category, class_name: "Spree::ShippingCategory", optional: true
|
35
38
|
|
36
39
|
delegate :name, :description, :slug, :available_on, :discontinue_on, :discontinued?,
|
37
|
-
:
|
40
|
+
:meta_description, :meta_keywords,
|
38
41
|
to: :product
|
39
|
-
delegate :tax_category, to: :product, prefix: true
|
42
|
+
delegate :tax_category, :tax_category_id, to: :product, prefix: true
|
43
|
+
delegate :shipping_category, :shipping_category_id,
|
44
|
+
to: :product, prefix: true
|
40
45
|
delegate :tax_rates, to: :tax_category
|
46
|
+
delegate :price_for_options, to: :price_selector
|
41
47
|
|
42
48
|
has_many :inventory_units, inverse_of: :variant
|
43
49
|
has_many :line_items, inverse_of: :variant
|
@@ -53,13 +59,7 @@ module Spree
|
|
53
59
|
has_many :images, -> { order(:position) }, as: :viewable, dependent: :destroy, class_name: "Spree::Image"
|
54
60
|
|
55
61
|
has_many :prices,
|
56
|
-
|
57
|
-
dependent: :destroy,
|
58
|
-
inverse_of: :variant,
|
59
|
-
autosave: true
|
60
|
-
|
61
|
-
has_many :currently_valid_prices,
|
62
|
-
-> { currently_valid },
|
62
|
+
-> { with_discarded },
|
63
63
|
class_name: 'Spree::Price',
|
64
64
|
dependent: :destroy,
|
65
65
|
inverse_of: :variant,
|
@@ -74,10 +74,9 @@ module Spree
|
|
74
74
|
|
75
75
|
validates :cost_price, numericality: { greater_than_or_equal_to: 0, allow_nil: true }
|
76
76
|
validates :price, numericality: { greater_than_or_equal_to: 0, allow_nil: true }
|
77
|
-
validates_uniqueness_of :sku, allow_blank: true, case_sensitive: true, if: :enforce_unique_sku?
|
77
|
+
validates_uniqueness_of :sku, 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
|
-
after_create :set_position
|
81
80
|
after_create :set_master_out_of_stock, unless: :is_master?
|
82
81
|
|
83
82
|
after_save :clear_in_stock_cache
|
@@ -85,6 +84,11 @@ module Spree
|
|
85
84
|
|
86
85
|
after_destroy :destroy_option_values_variants
|
87
86
|
|
87
|
+
scope :template_variants, -> do
|
88
|
+
left_joins(product: { option_types: :option_values }).where(is_master: true).where.not(spree_option_values: { id: nil }).reorder(nil).distinct
|
89
|
+
end
|
90
|
+
scope :non_template_variants, -> { where.not(id: template_variants) }
|
91
|
+
|
88
92
|
# Returns variants that are in stock. When stock locations are provided as
|
89
93
|
# a parameter, the scope is limited to variants that are in stock in the
|
90
94
|
# provided stock locations.
|
@@ -99,7 +103,7 @@ module Spree
|
|
99
103
|
if stock_locations.present?
|
100
104
|
in_stock_variants = in_stock_variants.where(spree_stock_items: { stock_location_id: stock_locations.map(&:id) })
|
101
105
|
end
|
102
|
-
in_stock_variants
|
106
|
+
in_stock_variants.distinct
|
103
107
|
end
|
104
108
|
|
105
109
|
# Returns a scope of Variants which are suppliable. This includes:
|
@@ -118,8 +122,8 @@ module Spree
|
|
118
122
|
joins(:stock_items).where(arel_conditions.inject(:or)).distinct
|
119
123
|
end
|
120
124
|
|
121
|
-
self.
|
122
|
-
self.
|
125
|
+
self.allowed_ransackable_associations = %w[option_values product prices default_price]
|
126
|
+
self.allowed_ransackable_attributes = %w[weight sku]
|
123
127
|
|
124
128
|
# Returns variants that have a price for the given pricing options
|
125
129
|
# If you have modified the pricing options class, you might want to modify this scope too.
|
@@ -150,6 +154,32 @@ module Spree
|
|
150
154
|
super || product_tax_category
|
151
155
|
end
|
152
156
|
|
157
|
+
# @return [Integer] the variant's tax category ID
|
158
|
+
#
|
159
|
+
# This returns the product's tax category ID if the tax category ID on the variant is nil. It looks
|
160
|
+
# like an association, but really is an override.
|
161
|
+
#
|
162
|
+
def tax_category_id
|
163
|
+
super || product_tax_category_id
|
164
|
+
end
|
165
|
+
|
166
|
+
# @return [Spree::ShippingCategory] the variant's shipping category
|
167
|
+
#
|
168
|
+
# This returns the product's shipping category if the shipping category ID on the variant is nil. It looks
|
169
|
+
# like an association, but really is an override.
|
170
|
+
#
|
171
|
+
def shipping_category
|
172
|
+
super || product_shipping_category
|
173
|
+
end
|
174
|
+
|
175
|
+
# @return [Integer] the variant's shipping category id
|
176
|
+
#
|
177
|
+
# This returns the product's shipping category if if the shipping category ID on the variant is nil.
|
178
|
+
#
|
179
|
+
def shipping_category_id
|
180
|
+
super || product_shipping_category_id
|
181
|
+
end
|
182
|
+
|
153
183
|
# Sets the cost_price for the variant.
|
154
184
|
#
|
155
185
|
# @param price [Any] the price to set
|
@@ -182,7 +212,7 @@ module Spree
|
|
182
212
|
#
|
183
213
|
# @return [String] a sentence-ified string of option values.
|
184
214
|
def options_text
|
185
|
-
values = option_values.
|
215
|
+
values = option_values.sort_by do |option_value|
|
186
216
|
option_value.option_type.position
|
187
217
|
end
|
188
218
|
|
@@ -218,8 +248,8 @@ module Spree
|
|
218
248
|
|
219
249
|
# Assign given options hash to option values.
|
220
250
|
#
|
221
|
-
# @param options [Array] array of hashes with a name and value.
|
222
|
-
def options=(options =
|
251
|
+
# @param options [Array<Hash{name: String, value: String}>] array of hashes with a name and value.
|
252
|
+
def options=(options = [])
|
223
253
|
options.each do |option|
|
224
254
|
set_option_value(option[:name], option[:value])
|
225
255
|
end
|
@@ -275,17 +305,12 @@ module Spree
|
|
275
305
|
@price_selector ||= Spree::Config.variant_price_selector_class.new(self)
|
276
306
|
end
|
277
307
|
|
278
|
-
# Chooses an appropriate price for the given pricing options
|
279
|
-
#
|
280
|
-
# @see Spree::Variant::PriceSelector#price_for
|
281
|
-
delegate :price_for, to: :price_selector
|
282
|
-
|
283
308
|
# Returns the difference in price from the master variant
|
284
309
|
def price_difference_from_master(pricing_options = Spree::Config.default_pricing_options)
|
285
|
-
master_price = product.master.
|
286
|
-
variant_price =
|
310
|
+
master_price = product.master.price_for_options(pricing_options)
|
311
|
+
variant_price = price_for_options(pricing_options)
|
287
312
|
return unless master_price && variant_price
|
288
|
-
variant_price - master_price
|
313
|
+
Spree::Money.new(variant_price.amount - master_price.amount, currency: pricing_options.currency)
|
289
314
|
end
|
290
315
|
|
291
316
|
def price_same_as_master?(pricing_options = Spree::Config.default_pricing_options)
|
@@ -315,16 +340,22 @@ module Spree
|
|
315
340
|
end
|
316
341
|
|
317
342
|
# @param quantity [Fixnum] how many are desired
|
343
|
+
# @param stock_location [Spree::StockLocation] Optionally restrict stock
|
344
|
+
# quantity check to a specific stock location. If unspecified it will
|
345
|
+
# check inventory in all available StockLocations.
|
318
346
|
# @return [Boolean] true if the desired quantity can be supplied
|
319
|
-
def can_supply?(quantity = 1)
|
320
|
-
Spree::Stock::Quantifier.new(self).can_supply?(quantity)
|
347
|
+
def can_supply?(quantity = 1, stock_location = nil)
|
348
|
+
Spree::Stock::Quantifier.new(self, stock_location).can_supply?(quantity)
|
321
349
|
end
|
322
350
|
|
323
351
|
# Fetches the on-hand quantity of the variant.
|
324
352
|
#
|
353
|
+
# @param stock_location [Spree::StockLocation] Optionally restrict stock
|
354
|
+
# quantity check to a specific stock location. If unspecified it will
|
355
|
+
# check inventory in all available StockLocations.
|
325
356
|
# @return [Fixnum] the number currently on-hand
|
326
|
-
def total_on_hand
|
327
|
-
Spree::Stock::Quantifier.new(self).total_on_hand
|
357
|
+
def total_on_hand(stock_location = nil)
|
358
|
+
Spree::Stock::Quantifier.new(self, stock_location).total_on_hand
|
328
359
|
end
|
329
360
|
|
330
361
|
# Shortcut method to determine if inventory tracking is enabled for this
|
@@ -383,7 +414,7 @@ module Spree
|
|
383
414
|
end
|
384
415
|
|
385
416
|
def create_stock_items
|
386
|
-
StockLocation.where(propagate_all_variants: true).
|
417
|
+
StockLocation.where(propagate_all_variants: true).find_each do |stock_location|
|
387
418
|
stock_location.propagate_variant(self)
|
388
419
|
end
|
389
420
|
end
|
@@ -392,10 +423,6 @@ module Spree
|
|
392
423
|
Spree::Config.variant_vat_prices_generator_class.new(self).run
|
393
424
|
end
|
394
425
|
|
395
|
-
def set_position
|
396
|
-
update_column(:position, product.variants.maximum(:position).to_i + 1)
|
397
|
-
end
|
398
|
-
|
399
426
|
def in_stock_cache_key
|
400
427
|
"variant-#{id}-in_stock"
|
401
428
|
end
|
@@ -24,19 +24,19 @@ class Spree::Wallet::AddPaymentSourcesToWallet
|
|
24
24
|
# add valid sources to wallet and optionally set a default
|
25
25
|
if sources.any?
|
26
26
|
# arbitrarily sort by id for picking a default
|
27
|
-
sources.sort_by(&:id).
|
27
|
+
order_wallet_payment_sources = sources.sort_by(&:id).map do |source|
|
28
28
|
order.user.wallet.add(source)
|
29
29
|
end
|
30
30
|
|
31
|
-
make_default
|
31
|
+
make_default(order_wallet_payment_sources)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
protected
|
37
37
|
|
38
|
-
def make_default
|
39
|
-
order.user.wallet.default_wallet_payment_source =
|
38
|
+
def make_default(sources)
|
39
|
+
order.user.wallet.default_wallet_payment_source = sources.last
|
40
40
|
end
|
41
41
|
|
42
42
|
private
|
data/app/models/spree/wallet.rb
CHANGED
@@ -28,7 +28,7 @@ class Spree::Wallet
|
|
28
28
|
# @param payment_source [PaymentSource] The payment source to add to the wallet
|
29
29
|
# @return [WalletPaymentSource] the generated WalletPaymentSource
|
30
30
|
def add(payment_source)
|
31
|
-
user.wallet_payment_sources.find_or_create_by!(payment_source:
|
31
|
+
user.wallet_payment_sources.find_or_create_by!(payment_source:)
|
32
32
|
end
|
33
33
|
|
34
34
|
# Remove a PaymentSource from the wallet.
|
@@ -37,7 +37,7 @@ class Spree::Wallet
|
|
37
37
|
# @raise [ActiveRecord::RecordNotFound] if the source is not in the wallet.
|
38
38
|
# @return [WalletPaymentSource] the destroyed WalletPaymentSource
|
39
39
|
def remove(payment_source)
|
40
|
-
user.wallet_payment_sources.find_by!(payment_source:
|
40
|
+
user.wallet_payment_sources.find_by!(payment_source:).destroy!
|
41
41
|
end
|
42
42
|
|
43
43
|
# Find a WalletPaymentSource in the wallet by id.
|
data/app/models/spree/zone.rb
CHANGED
@@ -42,7 +42,7 @@ module Spree
|
|
42
42
|
alias :members :zone_members
|
43
43
|
accepts_nested_attributes_for :zone_members, allow_destroy: true, reject_if: proc { |member| member['zoneable_id'].blank? }
|
44
44
|
|
45
|
-
self.
|
45
|
+
self.allowed_ransackable_attributes = %w[name description]
|
46
46
|
|
47
47
|
# Returns all zones that contain any of the zone members of the zone passed
|
48
48
|
# in. This also includes any country zones that contain the state of the
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
# Mailing after events on a {Spree::Order}
|
5
|
+
class OrderMailerSubscriber
|
6
|
+
include Omnes::Subscriber
|
7
|
+
|
8
|
+
handle :order_finalized,
|
9
|
+
with: :send_confirmation_email,
|
10
|
+
id: :spree_order_mailer_send_confirmation_email
|
11
|
+
|
12
|
+
handle :reimbursement_reimbursed,
|
13
|
+
with: :send_reimbursement_email,
|
14
|
+
id: :spree_order_mailer_send_reimbursement_email
|
15
|
+
|
16
|
+
# Sends confirmation email to the user
|
17
|
+
#
|
18
|
+
# @param event [Omnes::UnstructuredEvent]
|
19
|
+
def send_confirmation_email(event)
|
20
|
+
order = event[:order]
|
21
|
+
unless order.confirmation_delivered?
|
22
|
+
Spree::Config.order_mailer_class.confirm_email(order).deliver_later
|
23
|
+
order.update_column(:confirmation_delivered, true)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Sends reimbursement email to the user
|
28
|
+
#
|
29
|
+
# @param event [Omnes::UnstructuredEvent]
|
30
|
+
def send_reimbursement_email(event)
|
31
|
+
reimbursement = event[:reimbursement]
|
32
|
+
Spree::Config.reimbursement_mailer_class.reimbursement_email(reimbursement.id).deliver_later
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
2
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
3
|
<head>
|
4
|
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"
|
5
|
-
<meta name="viewport" content="width=device-width"
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width">
|
6
6
|
<style>
|
7
7
|
/**********************************************
|
8
8
|
* Ink v1.0.5 - Copyright 2013 ZURB Inc *
|
@@ -26,7 +26,7 @@
|
|
26
26
|
<td><%= t('.subtotal') %></td>
|
27
27
|
<td><%= @order.display_item_total %></td>
|
28
28
|
</tr>
|
29
|
-
<% @order.adjustments.
|
29
|
+
<% @order.adjustments.each do |adjustment| %>
|
30
30
|
<tr>
|
31
31
|
<td></td>
|
32
32
|
<td><%= sanitize(adjustment.label) %></td>
|
@@ -10,7 +10,7 @@
|
|
10
10
|
<% end %>
|
11
11
|
============================================================
|
12
12
|
<%= t('.subtotal') %> <%= @order.display_item_total %>
|
13
|
-
<% @order.adjustments.
|
13
|
+
<% @order.adjustments.each do |adjustment| %>
|
14
14
|
<%= raw(adjustment.label) %> <%= adjustment.display_amount %>
|
15
15
|
<% end %>
|
16
16
|
<%= t('.total') %> <%= @order.display_total %>
|
@@ -31,8 +31,8 @@
|
|
31
31
|
</td>
|
32
32
|
</tr>
|
33
33
|
<% if @order.line_item_adjustments.exists? %>
|
34
|
-
<% if @order.all_adjustments.promotion.
|
35
|
-
<% @order.all_adjustments.promotion.
|
34
|
+
<% if @order.all_adjustments.promotion.exists? %>
|
35
|
+
<% @order.all_adjustments.promotion.group_by(&:label).each do |label, adjustments| %>
|
36
36
|
<tr>
|
37
37
|
<td></td>
|
38
38
|
<td><%= t('spree.promotion') %> <%= label %>:</td>
|
@@ -48,8 +48,8 @@
|
|
48
48
|
<td><%= Spree::Money.new(shipments.sum(&:total_before_tax), currency: @order.currency) %></td>
|
49
49
|
</tr>
|
50
50
|
<% end %>
|
51
|
-
<% if @order.all_adjustments.
|
52
|
-
<% @order.all_adjustments.
|
51
|
+
<% if @order.all_adjustments.tax.exists? %>
|
52
|
+
<% @order.all_adjustments.tax.group_by(&:label).each do |label, adjustments| %>
|
53
53
|
<tr>
|
54
54
|
<td></td>
|
55
55
|
<td><%= t('spree.tax') %> <%= label %>:</td>
|
@@ -57,7 +57,7 @@
|
|
57
57
|
</tr>
|
58
58
|
<% end %>
|
59
59
|
<% end %>
|
60
|
-
<% @order.adjustments.
|
60
|
+
<% @order.adjustments.each do |adjustment| %>
|
61
61
|
<% next if (adjustment.source_type == 'Spree::TaxRate') and (adjustment.amount == 0) %>
|
62
62
|
<tr>
|
63
63
|
<td></td>
|
@@ -11,8 +11,8 @@
|
|
11
11
|
============================================================
|
12
12
|
<%= t('.subtotal') %> <%= @order.display_item_total %>
|
13
13
|
<% if @order.line_item_adjustments.exists? %>
|
14
|
-
<% if @order.all_adjustments.promotion.
|
15
|
-
<% @order.all_adjustments.promotion.
|
14
|
+
<% if @order.all_adjustments.promotion.exists? %>
|
15
|
+
<% @order.all_adjustments.promotion.group_by(&:label).each do |label, adjustments| %>
|
16
16
|
<%= t('spree.promotion') %>: <%= label %> <%= Spree::Money.new(adjustments.sum(&:amount), currency: @order.currency) %>
|
17
17
|
<% end %>
|
18
18
|
<% end %>
|
@@ -22,13 +22,13 @@
|
|
22
22
|
<%= t('spree.shipping') %>: <%= name %> <%= Spree::Money.new(shipments.sum(&:total_before_tax), currency: @order.currency) %>
|
23
23
|
<% end %>
|
24
24
|
|
25
|
-
<% if @order.all_adjustments.
|
26
|
-
<% @order.all_adjustments.
|
25
|
+
<% if @order.all_adjustments.tax.exists? %>
|
26
|
+
<% @order.all_adjustments.tax.group_by(&:label).each do |label, adjustments| %>
|
27
27
|
<%= t('spree.tax') %>: <%= label %> <%= Spree::Money.new(adjustments.sum(&:amount), currency: @order.currency) %>
|
28
28
|
<% end %>
|
29
29
|
<% end %>
|
30
30
|
|
31
|
-
<% @order.adjustments.
|
31
|
+
<% @order.adjustments.each do |adjustment| %>
|
32
32
|
<% next if (adjustment.source_type == 'Spree::TaxRate') and (adjustment.amount == 0) %>
|
33
33
|
<%= adjustment.label %> <%= adjustment.display_amount %>
|
34
34
|
<% end %>
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# i18n-tasks finds and manages missing and unused translations: https://github.com/glebm/i18n-tasks
|
2
|
+
|
3
|
+
# The "main" locale.
|
4
|
+
base_locale: en
|
5
|
+
## All available locales are inferred from the data by default. Alternatively, specify them explicitly:
|
6
|
+
# locales: [es, fr]
|
7
|
+
## Reporting locale, default: en. Available: en, ru.
|
8
|
+
# internal_locale: en
|
9
|
+
|
10
|
+
# Read and write translations.
|
11
|
+
data:
|
12
|
+
## Translations are read from the file system. Supported format: YAML, JSON.
|
13
|
+
## Provide a custom adapter:
|
14
|
+
# adapter: I18n::Tasks::Data::FileSystem
|
15
|
+
|
16
|
+
# Locale files or `File.find` patterns where translations are read from:
|
17
|
+
read:
|
18
|
+
## Default:
|
19
|
+
# - config/locales/%{locale}.yml
|
20
|
+
## More files:
|
21
|
+
# - config/locales/**/*.%{locale}.yml
|
22
|
+
|
23
|
+
# Locale files to write new keys to, based on a list of key pattern => file rules. Matched from top to bottom:
|
24
|
+
# `i18n-tasks normalize -p` will force move the keys according to these rules
|
25
|
+
write:
|
26
|
+
## For example, write devise and simple form keys to their respective files:
|
27
|
+
# - ['{devise, simple_form}.*', 'config/locales/\1.%{locale}.yml']
|
28
|
+
## Catch-all default:
|
29
|
+
# - config/locales/%{locale}.yml
|
30
|
+
|
31
|
+
# External locale data (e.g. gems).
|
32
|
+
# This data is not considered unused and is never written to.
|
33
|
+
external:
|
34
|
+
## Example (replace %#= with %=):
|
35
|
+
# - "<%#= %x[bundle info vagrant --path].chomp %>/templates/locales/%{locale}.yml"
|
36
|
+
|
37
|
+
## Specify the router (see Readme for details). Valid values: conservative_router, pattern_router, or a custom class.
|
38
|
+
# router: conservative_router
|
39
|
+
|
40
|
+
yaml:
|
41
|
+
write:
|
42
|
+
# do not wrap lines at 80 characters
|
43
|
+
line_width: -1
|
44
|
+
|
45
|
+
## Pretty-print JSON:
|
46
|
+
# json:
|
47
|
+
# write:
|
48
|
+
# indent: ' '
|
49
|
+
# space: ' '
|
50
|
+
# object_nl: "\n"
|
51
|
+
# array_nl: "\n"
|
52
|
+
|
53
|
+
# Find translate calls
|
54
|
+
search:
|
55
|
+
## Paths or `File.find` patterns to search in:
|
56
|
+
# paths:
|
57
|
+
# - app/
|
58
|
+
|
59
|
+
## Root directories for relative keys resolution.
|
60
|
+
# relative_roots:
|
61
|
+
# - app/controllers
|
62
|
+
# - app/helpers
|
63
|
+
# - app/mailers
|
64
|
+
# - app/presenters
|
65
|
+
# - app/views
|
66
|
+
|
67
|
+
## Files or `File.fnmatch` patterns to exclude from search. Some files are always excluded regardless of this setting:
|
68
|
+
## %w(*.jpg *.png *.gif *.svg *.ico *.eot *.otf *.ttf *.woff *.woff2 *.pdf *.css *.sass *.scss *.less *.yml *.json)
|
69
|
+
exclude:
|
70
|
+
- app/assets/images
|
71
|
+
- app/assets/fonts
|
72
|
+
- app/assets/videos
|
73
|
+
|
74
|
+
## Alternatively, the only files or `File.fnmatch patterns` to search in `paths`:
|
75
|
+
## If specified, this settings takes priority over `exclude`, but `exclude` still applies.
|
76
|
+
# only: ["*.rb", "*.html.slim"]
|
77
|
+
|
78
|
+
## If `strict` is `false`, guess usages such as t("categories.#{category}.title"). The default is `true`.
|
79
|
+
# strict: true
|
80
|
+
|
81
|
+
## Multiple scanners can be used. Their results are merged.
|
82
|
+
## The options specified above are passed down to each scanner. Per-scanner options can be specified as well.
|
83
|
+
## See this example of a custom scanner: https://github.com/glebm/i18n-tasks/wiki/A-custom-scanner-example
|
84
|
+
|
85
|
+
## Translation Services
|
86
|
+
# translation:
|
87
|
+
# # Google Translate
|
88
|
+
# # Get an API key and set billing info at https://code.google.com/apis/console to use Google Translate
|
89
|
+
# google_translate_api_key: "AbC-dEf5"
|
90
|
+
# # DeepL Pro Translate
|
91
|
+
# # Get an API key and subscription at https://www.deepl.com/pro to use DeepL Pro
|
92
|
+
# deepl_api_key: "48E92789-57A3-466A-9959-1A1A1A1A1A1A"
|
93
|
+
|
94
|
+
## Do not consider these keys missing:
|
95
|
+
ignore_missing:
|
96
|
+
- 'number.currency.format.separator'
|
97
|
+
# - 'errors.messages.{accepted,blank,invalid,too_short,too_long}'
|
98
|
+
# - '{devise,simple_form}.*'
|
99
|
+
|
100
|
+
## Consider these keys used:
|
101
|
+
#ignore_unused:
|
102
|
+
# - 'activerecord.attributes.*'
|
103
|
+
# - '{devise,kaminari,will_paginate}.*'
|
104
|
+
# - 'simple_form.{yes,no}'
|
105
|
+
# - 'simple_form.{placeholders,hints,labels}.*'
|
106
|
+
# - 'simple_form.{error_notification,required}.:'
|
107
|
+
|
108
|
+
## Exclude these keys from the `i18n-tasks eq-base' report:
|
109
|
+
# ignore_eq_base:
|
110
|
+
# all:
|
111
|
+
# - common.ok
|
112
|
+
# fr,es:
|
113
|
+
# - common.brand
|
114
|
+
|
115
|
+
## Exclude these keys from the `i18n-tasks check-consistent-interpolations` report:
|
116
|
+
# ignore_inconsistent_interpolations:
|
117
|
+
# - 'activerecord.attributes.*'
|
118
|
+
|
119
|
+
## Ignore these keys completely:
|
120
|
+
# ignore:
|
121
|
+
# - kaminari.*
|
122
|
+
|
123
|
+
## Sometimes, it isn't possible for i18n-tasks to match the key correctly,
|
124
|
+
## e.g. in case of a relative key defined in a helper method.
|
125
|
+
## In these cases you can use the built-in PatternMapper to map patterns to keys, e.g.:
|
126
|
+
#
|
127
|
+
# <%# I18n::Tasks.add_scanner 'I18n::Tasks::Scanners::PatternMapper',
|
128
|
+
# only: %w(*.html.haml *.html.slim),
|
129
|
+
# patterns: [['= title\b', '.page_title']] %>
|
130
|
+
#
|
131
|
+
# The PatternMapper can also match key literals via a special %{key} interpolation, e.g.:
|
132
|
+
#
|
133
|
+
# <%# I18n::Tasks.add_scanner 'I18n::Tasks::Scanners::PatternMapper',
|
134
|
+
# patterns: [['\bSpree\.t[( ]\s*%{key}', 'spree.%{key}']] %>
|