-
Promotion and Shipping calculators can be created or have their type changed without saving and reloading the page. #1618
-
Product slugs no longer have a minimum length validation to match the Product name validation. #1616
-
The OrderUpdater (as used by
order.update!
) now fully updates taxes.Previously there were two different ways taxes were calculated: a "full" and a "quick" calculation. The full calculation was performed with
order.create_tax_charge!
and would determine which tax rates applied and add taxes to items. The "quick" calculation was performed as part of an order update, and would only update the tax amounts on existing line items with taxes.Now
order.update!
will perform the full calculation every time.order.create_tax_charge!
is now deprecated and has been made equivalent toorder.update!
. -
ItemAdjustments
has been merged into theOrderUpdater
The previous behaviour between these two classes was to iterate over each item calculating promotions, taxes, and totals for each before moving on to the next item. To better support external tax services, we now calculate promotions for all items, followed by taxes for all items, etc.
-
Make frontend prices depend on
store.cart_tax_country_iso
Prices in the frontend now depend on
store.cart_tax_country_iso
instead ofSpree::Config.admin_vat_country_iso
. -
Deprecate methods related to Spree::Order#tax_zone
We're not using
Spree::Order#tax_zone
,Spree::Zone.default_tax
,Spree::Zone.match
, orSpree::Zone#contains?
in our code base anymore. They will be removed soon. Please useSpree::Order#tax_address
,Spree::Zone.for_address
, andSpree::Zone.include?
, respectively, instead. -
Product Prototypes have been removed from Solidus itself.
The new
solidus_prototype
extension provides the existing functionality. #1517 -
Analytics trackers have been removed from Solidus itself.
The new
solidus_trackers
extension provides the existing functionality. #1438 -
Bootstrap row and column classes have replaced the legacy skeleton classes throughout the admin. #1484
-
Remove
currency
from line items.It's no longer allowed to have line items with different currencies on the same order. This makes storing the currency on line items redundant, since it will always be considered the same as the order currency.
It will raise an exception if a line item with the wrong currency is added.
This change also deletes the
currency
database field (String) from theline_items
table, since it will not be used anymore. -
Add
Spree::Promotion#remove_from
andSpree::PromotionAction#remove_from
This will allow promotions to be removed from orders and allows promotion actions to define how to reverse their side effects on an order.
For now
PromotionAction
provides a default remove_from method, with a deprecation warning that subclasses should define their own remove_from method. -
Remove
is_default
boolean fromSpree::Price
modelThis boolean used to mean "the price to be used". With the new pricing architecture introduced in 1.3, it is now redundant and can be reduced to an order clause in the currently valid prices scope.
-
Remove callback
Spree::LineItem.after_create :update_tax_charge
Any code that creates
LineItem
s outside the context of OrderContents should ensure that it callsorder.update!
after doing so. -
Mark
Spree::Tax::ItemAdjuster
as api-private #1463 -
Updated Credit Card brand server-side detection regex to support more brands and MasterCard's new BIN range. #1477
Note: Most stores will be using client-side detection which was updated in Solidus 1.2
-
CreditCard
'sverification_value
field is now converted to a string and has whitespace removed on assignment instead of before validations. -
The
lastname
field onAddress
is now optional. #1369 -
The admin prices listings page now shows master and variant prices seperately. This changes
@prices
to@master_prices
and@variant_prices
in prices_controller -
Admin javascript assets are now individually
require
d using sprockets directives instead of usingrequire_tree
. This should fix issues where JS assets could not be overridden in applications. #1613 -
The admin has an improved image upload interface with drag and drop. #1553
-
PaymentMethod's
display_on
column has been replaced withavailable_to_users
andavailable_to_admin
. The existing attributes and scopes have been deprecated. -
ShippingMethod's
display_on
column has been replaced withavailable_to_users
. The existing attributes and scopes have been deprecated. -
Added experimental Spree::Config.tax_adjuster_class
To allow easier customization of tax calculation in extensions or applications.
This API is experimental and is likely to change in a future version.
-
Removals
-
Removed deprecated
STYLE_image
helpers from BaseHelper #1623 -
Removed deprecated method
Spree::TaxRate.adjust
(not to be confused with Spree::TaxRate#adjust) in favor ofSpree::Config.tax_adjuster_class
. -
Removed deprecated method
Promotion#expired?
in favor ofPromotion#inactive?
-
Removed nested attribute helpers
generate_template
,generate_html
, andremove_nested
. Also removes some javascript bound to selectors.remove
,a[id*=nested]
. -
Removed
accept_alert
anddismiss_alert
from CapybaraExt.accept_alert
is now a capybara builtin (that we were overriding) anddismiss_alert
can be replaced withdismiss_prompt
. -
Removed deprecated delegate_belongs_to
-
- Upgrade to rails 5.0
-
Use in-memory objects in OrderUpdater and related areas.
Solidus now uses in-memory data for updating orders in and around OrderUpdater. E.g. if an order already has
order.line_items
loaded into memory when OrderUpdater is run then it will use that information rather than requerying the database for it. This should help performance and makes some upcoming refactoring easier.Warning: If you bypass ActiveRecord while making updates to your orders you run the risk of generating invalid data. Example:
order.line_items.to_a order.line_items.update_all(price: ...) order.update!
Will now result in incorrect calculations in OrderUpdater because the line items will not be refetched.
In particular, when creating adjustments, you should always create the adjustment using the adjustable relationship.
Good example:
line_item.adjustments.create!(source: tax_rate, ...)
Bad examples:
tax_rate.adjustments.create!(adjustable: line_item, ...) Spree::Adjustment.create!(adjustable: line_item, source: tax_rate, ...)
We try to detect the latter examples and repair the in-memory objects (with a deprecation warning) but you should ensure that your code is keeping the adjustable's in-memory associations up to date. Custom promotion actions are an area likely to have this issue.
-
Make some 'wallet' behavior configurable
NOTE:
Order#persist_user_credit_card
has been renamed toOrder#add_payment_sources_to_wallet
. If you are overridingpersist_user_credit_card
you need to update your code.The following extension points have been added for customizing 'wallet' behavior.
- Spree::Config.add_payment_sources_to_wallet_class
- Spree::Config.default_payment_builder_class
-
Backend: UI, Remove icons from buttons and tabs
-
Backend: Deprecate args/options that add icons to buttons
-
Update Rules::Taxon/Product handling of invalid match policies
Rules::Taxon and Rules::Product now require valid match_policy values. Please ensure that all your Taxon and Product Rules have valid match_policy values.
-
Fix default value for Spree::Promotion::Rules::Taxon preferred_match_policy.
Previously this was defaulting to nil, which was sometimes interpreted as 'none'.
-
Deprecate
Spree::Shipment#address
(column renamed)Spree::Shipment#address
was not actually being used for anything in particular, so the association has been deprecated and delegated toSpree::Order#ship_address
instead. The database column has been renamedspree_shipments.deprecated_address_id
. -
Coupon code application has been separated from the Continue button on the Payment checkout page
- JavaScript for it has been moved from address.js into its own
spree/frontend/checkout/coupon-code
- Numerous small nuisances have been fixed #1090
- JavaScript for it has been moved from address.js into its own
-
Allow filtering orders by store when multiple stores are present. #1149
-
Remove unused
user_id
column from PromotionRule. #1259 -
Removed "Clear cache" button from the admin #1275
-
Adjustments and totals are no longer updated when saving a Shipment or LineItem.
Previously adjustments and total columns were updated after saving a Shipment or LineItem. This was unnecessary since it didn't update the order totals, and running order.update! would recalculate the adjustments and totals again.
-
Order now requires a
store_id
in validationsAll orders created since Spree v2.4 should have a store assigned. A migration exists to assign all orders without a store to the default store.
If you are seeing spec failures related to this, you may have to add
let!(:store) { create(:store) }
to some test cases. -
Deprecate
Spree::TaxRate.adjust
, removeSpree::TaxRate.match
The functionality of
Spree::TaxRate.adjust
is now contained in the newSpree::Tax::OrderAdjuster
class.Wherever you called
Spree::TaxRate.adjust(items, order_tax_zone)
, instead callSpree::Tax::OrderAdjuster.new(order).adjust!
.Spree::TaxRate.match
was an implementation detail ofSpree::TaxRate.adjust
. It has been removed, and its functionality is now contained in the private methodSpree::Tax::TaxHelpers#applicable_rates(order)
. -
Allow more options than
current_currency
to select pricesPreviously, availability of products/variants, caching and pricing was dependent only on a
current_currency
string. This has been changed to acurrent_pricing_options
object. For now, this object (Spree::Variant::PricingOptions
) only holds the currency. It is used for caching instead of the deprecatedcurrent_currency
helper.Additionally, your pricing can be customized using a
VariantPriceSelector
object, a default implementation of which can be found inSpree::Variant::PriceSelector
. It is responsible for finding the right price for variant, be it for front-end display or for adding it to the cart. You can set it through the newSpree::Config.variant_price_selector_class
setting. This class also knows whichPricingOptions
class it cooperates with.current_currency
helperSpree::Variant#categorise_variants_from_option
Spree::Variant#variants_and_option_values
(UseSpree::Variant#variants_and_option_values#for
instead)Spree::Core::Search::Base#current_currency
Spree::Core::Search::Base#current_currency=
There was a strange way of setting prices for line items depending on additional attributes being present on the line item (
gift_wrap: true
, for example). It also neededSpree::Variant
to be patched with methods likeSpree::Variant#gift_wrap_price_modifier_in
and is generally deemed a non-preferred way of modifying pricing. This functionality has now been moved into a Gem of its own to ease the transition to the newVariant::PriceSelector
system. -
Respect
Spree::Store#default_currency
Previously, the
current_currency
helper in both thecore
andapi
gems would always return the globally configured default currency rather than the current store's one. With Solidus 1.3, we respect that setting without having to install thespree_multi_domain
extension. -
Persist tax estimations on shipping rates
Previously, shipping rate taxes were calculated on the fly every time a shipping rate would be displayed. Now, shipping rate taxes are stored on a dedicated table to look up.
There is a new model Spree::ShippingRateTax where the taxes are stored, and a new Spree::Tax::ShippingRateTaxer that builds those taxes from within Spree::Stock::Estimator.
The shipping rate taxer class can be exchanged for a custom estimator class using the new Spree::Appconfiguration.shipping_rate_taxer_class preference.
In order to convert your historical shipping rate taxation data, please run
rake solidus:upgrade:one_point_three
- this will create persisted taxation notes for historical shipping rates. Be aware though that these taxation notes are estimations and should not be used for accounting purposes. -
Deprecate setting a line item's currency by hand
Previously, a line item's currency could be set directly, and differently from the line item's order's currency. This would result in an error. It still does, but is also now explicitly deprecated. In the future, we might delete the line item's
currency
column and just delegate to the line item's order. -
Taxes for carts now configurable via the
Spree::Store
objectIn VAT countries, carts (orders without addresses) have to be shown with adjustments for the country whose taxes the cart's prices supposedly include. This might differ from
Spree::Store
toSpree::Store
. We're introducting thecart_tax_country_iso
setting on Spree::Store for this purpose.Previously the setting for what country any prices include Spree::Zone.default_tax. That, however, would also implicitly tag all prices in Spree as including the taxes from that zone. Introducing the cart tax setting on Spree::Store relieves that boolean of some of its responsibilities.
-
Make Spree::Product#prices association return all prices
Previously, only non-master variant prices would have been returned here. Now, we get all the prices, including those from the master variant.
-
Changes to Spree::Stock::Estimator
- The package passed to Spree::Stock::Estimator#shipping_rates must have its shipment assigned and that shipment must have its order assigned. This is needed for some upcoming tax work in to calculate taxes correctly.
- Spree::Stock::Estimator.new no longer accepts an order argument. The order will be fetched from the shipment.
-
Removed Spree::Stock::Coordinator#packages from the public interface.
This will allow us to refactor more easily. solidusio#950
-
Removed
pre_tax_amount
column from line item and shipment tablesThis column was previously used as a caching column in the process of calculating VATs. Its value should have been (but wasn't) always the same as
discounted_amount - included_tax_total
. It's been replaced with a method that does just that. #941 -
Renamed return item
pre_tax_amount
column toamount
The naming and functioning of this column was inconsistent with how shipments and line items work: In those models, the base from which we calculate everything is the
amount
. The ReturnItem now works just like a line item.Usability-wise, this change entails that for VAT countries, when creating a refund for an order including VAT, you now have to enter the amount you want to refund including VAT. This is what a backend user working with prices including tax would expect.
For a non-VAT store, nothing changes except for the form field name, which now says
Amount
instead ofPre-tax-amount
. You might want to adjust the i18n translation here, depending on your circumstances. #706 -
Removed Spree::BaseHelper#gem_available? and Spree::BaseHelper#current_spree_page?
Both these methods were untested and not appropriate code to be in core. If you need these methods please pull them into your app. #710.
-
Fixed a bug where toggling 'show only complete order' on/off was not showing all orders. #749
-
ffaker has been updated to version 2.x
This version changes the namespace from Faker:: to FFaker::
-
versioncake has been updated to version 3.x
This version uses a rack middleware to determine the version, uses a different header name, and has some configuration changes.
You probably need to add this to your controller specs.
More information is available in the VersionCake README
-
Bootstrap 4.0.0-alpha.2 is included into the admin.
-
Pagination now uses an admin-specific kaminari theme, which uses the bootstrap4 styles. If you have a custom admin page with pagination you can use this style with the following.
<%= paginate @collection, theme: "solidus_admin" %>
-
Settings configuration menu has been replaced with groups of tabs at the top
- Settings pages were grouped into related partials as outlined in #634
- Partials are rendered on pages owned by the partials as tabs as a top bar
- Admin-nav has a sub-menu for the settings now
-
Lists of classes in configuration (
config.spree.calculators
,spree.spree.calculators
, etc.) are now stored internally as strings and constantized when accessed. This allows these classes to be reloaded in development mode and loaded later in the boot process. #1203
-
Admin menu has been moved from top of the page to the left side.
- Submenu items are accessible from any page. See the wiki for more information and instructions on upgrading.
- Solidus_auth_devise should be updated to '~> 1.3' to support the new menu.
- Added optional styles to the admin area to advance admin rebrand.
To use the new colors, add
@import 'spree/backend/themes/blue_steel/globals/_variables_override';
to yourspree/backend/globals/variables_override
.
-
Removed deface requirement from core
Projects and extensions which rely on deface will need to add it explicitly to their dependencies.
-
testing_support/capybara_ext.rb
no longer changes capybara's matching mode to:prefer_exact
, and instead uses capybara's default,:smart
.You can restore the old behaviour (not recommended) by adding
Capybara.match = :prefer_exact
to yourspec_helper.rb
.More information can be found in capybara's README
-
Fixed a bug where sorting in the admin would not save positions correctly. #632
-
Included (VAT-style) taxes, will be considered applicable if they are inside the default tax zone, rather than just when they are the defaut tax zone. #657
-
Update jQuery.payment to v1.3.2 (from 1.0) #608
-
Removed Order::CurrencyUpdater. #635
-
Removed
Product#set_master_variant_defaults
, which was unnecessary since master is build withis_master
alreadytrue
. -
Replaced admin taxon management interface #569
-
Fix logic around raising InsufficientStock when creating shipments. #566
Previously,
InsufficientStock
was raised if any StockLocations were fully out of inventory. This was incorrect because it was possible other stock locations could have fulfilled the inventory. This was also incorrect because the stock location could have some, but insufficient inventory, and not raise the exception (an incomplete package would be returned). Now the coordinator checks that the package is complete and raisesInsufficientStock
if it is incomplete for any reason.
-
Address is immutable (Address#readonly? is always true)
This allows us to minimize cloning addresses, while still ensuring historical data is preserved.
-
UserAddressBook module added to manage a user's multiple addresses
-
GET /admin/search/users searches all of a user's addresses, not just current bill and ship addresss
-
Adjustment state column has been replaced with a finalized boolean column. This includes a migration replacing the column, which may cause some downtime for large stores.
-
Handlebars templates in the admin are now stored in assets and precompiled with the rest of the admin js.
-
Removed
map_nested_attributes_keys
from the Api::BaseController. This method was only used in one place and was oblivious of strong_params. -
Change all mails deliveries to
#deliver_later
. Emails will now be sent in the background if you configure active_job to do so. See the rails guides for more information. -
Cartons deliveries now send one email per-order, instead of one per-carton. This allows setting
@order
and@store
correctly for the template. For most stores, which don't combine multiple orders into a carton, this will behave the same. -
Some HABTM associations have been converted to HMT associations. Referential integrity has also been added as well. Specifically:
- Prototype <=> Taxon
- ShippingMethod <=> Zone
- Product <=> PromotionRule
See https://github.com/solidusio/solidus/releases/tag/v1.0.1
See https://github.com/solidusio/solidus/releases/tag/v1.0.0