Store Management
- It’s now possible to manage multiple stores. (#2283)
- It’s now possible to manage multiple inventory locations per store. (#2286, #2669)
- Products now support drafts, autosaving, and versioning. (#2358)
- Product variants are now managed via nested element indexes rather than inline-editable blocks.
- Product variants’ field layouts now support multiple tabs.
- Product pages’ breadcrumbs now include a menu that links to each editable product type.
- It’s now possible to create new products from product select modals when a custom source is selected, if the source is configured to only show products of one type.
- The Products index page now shows a primary “New product” button when a custom source is selected, if the source is configured to only show products of one type.
- Order conditions can now have a “Total Weight” rule.
- Shipping methods and shipping rules now support flexible order matching, based on an order condition.
Development
- Added the
currentStore
Twig variable. - Added
commerce/pricing-catalog/generate
command. - Deprecated the
hasUnlimitedStock
variant query param.inventoryTracked
should be used instead. - Removed the
shippingCategory
,shippingCategoryId
,taxCategory
, andtaxCategoryId
product query params. The corresponding variant query params can be used instead.
Extensibility
- Added
craft\commerce\base\CatalogPricingConditionRuleInterface
. - Added
craft\commerce\base\EnumHelpersTrait
- Added
craft\commerce\base\HasStoreInterface
. - Added
craft\commerce\base\InventoryMovementInterface
. - Added
craft\commerce\base\InventoryMovement
. - Added
craft\commerce\base\Purchasable::$availableForPurchase
. - Added
craft\commerce\base\Purchasable::$freeShipping
. - Added
craft\commerce\base\Purchasable::$height
. - Added
craft\commerce\base\Purchasable::$inventoryTracked
- Added
craft\commerce\base\Purchasable::$length
. - Added
craft\commerce\base\Purchasable::$maxQty
. - Added
craft\commerce\base\Purchasable::$minQty
. - Added
craft\commerce\base\Purchasable::$promotable
. - Added
craft\commerce\base\Purchasable::$shippingCategoryId
. - Added
craft\commerce\base\Purchasable::$stock
- Added
craft\commerce\base\Purchasable::$taxCategoryId
. - Added
craft\commerce\base\Purchasable::$weight
. - Added
craft\commerce\base\Purchasable::$width
. - Added
craft\commerce\base\Purchasable::getInventoryItem()
. - Added
craft\commerce\base\Purchasable::getInventoryLevels()
. - Added
craft\commerce\base\Purchasable::getOnPromotion()
. - Added
craft\commerce\base\Purchasable::getPrice()
. - Added
craft\commerce\base\Purchasable::getPromotionalPrice()
. - Added
craft\commerce\base\Purchasable::getStock()
- Added
craft\commerce\base\Purchasable::getStore()
- Added
craft\commerce\base\Purchasable::setPrice()
. - Added
craft\commerce\base\Purchasable::setPromotionalPrice()
. - Added
craft\commerce\base\StoreRecordTrait
. - Added
craft\commerce\base\StoreTrait
. - Added
craft\commerce\behaviors\StoreBehavior
. - Added
craft\commerce\collections\InventoryMovementCollection
- Added
craft\commerce\collections\UpdateInventoryLevelCollection
- Added
craft\commerce\console\controllers\CatalogPricingController
. - Added
craft\commerce\controllers\CatalogPricingController
. - Added
craft\commerce\controllers\CatalogPricingRulesController
. - Added
craft\commerce\controllers\InventoryLocationsController
- Added
craft\commerce\controllers\InventoryLocationsStoresController
- Added
craft\commerce\controllers\VariantsController
. - Added
craft\commerce\db\Table::CATALOG_PRICING_RULES_USERS
. - Added
craft\commerce\db\Table::CATALOG_PRICING_RULES
. - Added
craft\commerce\db\Table::CATALOG_PRICING
. - Added
craft\commerce\db\Table::INVENTORYITEMS
. - Added
craft\commerce\db\Table::INVENTORYLOCATIONS_STORES
. - Added
craft\commerce\db\Table::INVENTORYLOCATIONS
. - Added
craft\commerce\db\Table::INVENTORYMOVEMENTS
. - Added
craft\commerce\db\Table::PURCHASABLES_STORES
. - Added
craft\commerce\db\Table::STORESETTINGS
. - Added
craft\commerce\db\Table::STORES
. - Added
craft\commerce\db\Table::TRANSFERS_INVENTORYITEMS
. - Added
craft\commerce\db\Table::TRANSFERS
. - Added
craft\commerce\elements\Product::getVariantManager()
. - Added
craft\commerce\elements\Variant::getProductSlug()
. - Added
craft\commerce\elements\Variant::getProductTypeHandle()
. - Added
craft\commerce\elements\Variant::setProductSlug()
. - Added
craft\commerce\elements\Variant::setProductTypeHandle()
. - Added
craft\commerce\elements\VariantCollection
. - Added
craft\commerce\elements\actions\SetDefaultVariant
. - Added
craft\commerce\elements\conditions\customer\CatalogPricingCustomerCondition
. - Added
craft\commerce\elements\conditions\orders\DiscountedItemSubtotalConditionRule
. - Added
craft\commerce\elements\conditions\orders\ShippingAddressZoneConditionRule
. - Added
craft\commerce\elements\conditions\orders\ShippingMethodOrderCondition
. - Added
craft\commerce\elements\conditions\orders\ShippingRuleOrderCondition
. - Added
craft\commerce\elements\conditions\orders\TotalWeightConditionRule
. - Added
craft\commerce\elements\conditions\products\ProductVariantInventoryTrackedConditionRule
. - Added
craft\commerce\elements\conditions\purchasables\CatalogPricingCondition
. - Added
craft\commerce\elements\conditions\purchasables\CatalogPricingCustomerConditionRule
. - Added
craft\commerce\elements\conditions\purchasables\CatalogPricingPurchasableConditionRule
. - Added
craft\commerce\elements\conditions\purchasables\PurchasableConditionRule
. - Added
craft\commerce\elements\db\OrderQuery::$totalWeight
. - Added
craft\commerce\elements\db\OrderQuery::totalWeight()
. - Added
craft\commerce\elements\traits\OrderValidatorsTrait::validateOrganizationTaxIdAsVatId()
. - Added
craft\commerce\enums\InventoryTransactionType
. - Added
craft\commerce\enums\InventoryUpdateQuantityType
. - Added
craft\commerce\events\RegisterAvailableShippingMethodsEvent::getShippingMethods()
. - Added
craft\commerce\events\RegisterAvailableShippingMethodsEvent::setShippingMethods()
. - Added
craft\commerce\fieldlayoutelements\PurchasabaleAllowedQtyField
. - Added
craft\commerce\fieldlayoutelements\PurchasabaleAvailableForPurchaseField
. - Added
craft\commerce\fieldlayoutelements\PurchasabaleDimensionsField
. - Added
craft\commerce\fieldlayoutelements\PurchasabaleFreeShippingField
. - Added
craft\commerce\fieldlayoutelements\PurchasabalePriceField
. - Added
craft\commerce\fieldlayoutelements\PurchasabalePromotableField
. - Added
craft\commerce\fieldlayoutelements\PurchasabaleSkuField
. - Added
craft\commerce\fieldlayoutelements\PurchasabaleStockField
. - Added
craft\commerce\fieldlayoutelements\PurchasabaleWeightField
. - Added
craft\commerce\helpers\Cp
. - Added
craft\commerce\helpers\Currency::moneyInputHtml()
. - Added
craft\commerce\helpers\Purchasable::catalogPricingRulesTableByPurchasableId()
. - Added
craft\commerce\models\CatalogPricingRule
. - Added
craft\commerce\models\Discount::$storeId
. - Added
craft\commerce\models\InventoryItem
. - Added
craft\commerce\models\InventoryLocation
. - Added
craft\commerce\models\InventoryTransaction
. - Added
craft\commerce\models\Level
. - Added
craft\commerce\models\LineItem::getSnapshot()
. - Added
craft\commerce\models\LineItem::setSnapshot()
. - Added
craft\commerce\models\LineItems::getFulfilledTotalQuantity()
. - Added
craft\commerce\models\PaymentSources::getStore()
. - Added
craft\commerce\models\ProductType::$maxVariants
. - Added
craft\commerce\models\PurchasableStore
. - Added
craft\commerce\models\Store::getInventoryLocations()
. - Added
craft\commerce\models\Store::getInventoryLocationsOptions()
. - Added
craft\commerce\models\inventory\InventoryCommittedMovement
- Added
craft\commerce\models\inventory\InventoryLocationDeactivatedMovement
. - Added
craft\commerce\models\inventory\InventoryManualMovement
. - Added
craft\commerce\models\inventory\UpdateInventoryLevel
. - Added
craft\commerce\plugin\Services::getVat()
. - Added
craft\commerce\records\CatalogPricingRulePurchasable
. - Added
craft\commerce\records\CatalogPricingRuleUser
. - Added
craft\commerce\records\CatalogPricingRule
. - Added
craft\commerce\records\CatalogPricing
. - Added
craft\commerce\records\InventoryItem
. - Added
craft\commerce\records\InventoryLocation
. - Added
craft\commerce\records\PurchasableStore
. - Added
craft\commerce\services\CatalogPricingRules
. - Added
craft\commerce\services\CatalogPricing
. - Added
craft\commerce\services\Discounts::getAllDiscountsByStoreId()
. - Added
craft\commerce\services\InventoryLocations
. - Added
craft\commerce\services\Inventory
. - Added
craft\commerce\services\OrderStatuses::getOrderStatusByUid()
. - Added
craft\commerce\services\Purchasables::updateStoreStockCache()
- Added
craft\commerce\services\Sales::canUseSales()
. - Added
craft\commerce\services\ShippingCategories::clearCaches()
. - Added
craft\commerce\services\Stores
. - Added
craft\commerce\services\Vat
. - Added
craft\commerce\web\assets\inventory\InventoryAsset
. - Deprecated
craft\commerce\base\Purchasable::getOnSale()
.getOnPromotion()
should be used instead. - Deprecated
craft\commerce\base\Variant::hasUnlimitedStock()
.craft\commerce\base\Purchasable::$inventoryTracked
should be used instead. - Deprecated
craft\commerce\elements\Order::$totalSaleAmount
.$totalPromotionalAmount
should be used instead. - Deprecated
craft\commerce\elements\Variant::getProduct()
.getOwner()
should be used instead. - Deprecated
craft\commerce\elements\Variant::getProductId()
.getOwnerId()
should be used instead. - Deprecated
craft\commerce\elements\Variant::setProduct()
.setOwner()
should be used instead. - Deprecated
craft\commerce\elements\Variant::setProductId()
.setOwnerId()
should be used instead. - Deprecated
craft\commerce\elements\conditions\products\ProductVariantHasUnlimitedStockConditionRule
.ProductVariantInventoryTrackedConditionRule
should be used instead. - Deprecated
craft\commerce\models\Store::getCountries()
.craft\commerce\models\Store::getSettings()->getCountries()
should be used instead. - Deprecated
craft\commerce\models\Store::getMarketAddressCondition()
.craft\commerce\models\Store::getSettings()->getMarketAddressCondition()
should be used instead. - Deprecated
craft\commerce\models\Store::setCountries()
.craft\commerce\models\Store::getSettings()->setCountries()
should be used instead. - Removed
craft\commerce\base\PurchasableInterface::getId()
. - Removed
craft\commerce\base\Variant::$unlimitedStock
.craft\commerce\base\Purchasable::$inventoryTracked
can be used instead. - Removed
craft\commerce\console\controllers\UpgradeController
. - Removed
craft\commerce\controllers\LiteShippingController
. - Removed
craft\commerce\controllers\LiteTaxController
. - Removed
craft\commerce\controllers\ProductsController::actionDeleteProduct()
. - Removed
craft\commerce\controllers\ProductsController::actionDuplicateProduct()
. - Removed
craft\commerce\controllers\ProductsController::actionVariantIndex()
. - Removed
craft\commerce\controllers\ProductsPreviewController
. - Removed
craft\commerce\elements\Variant::$stock
.craft\commerce\base\Purchasable::getStock()
can be used instead. - Removed
craft\commerce\helpers\Product
. - Removed
craft\commerce\helpers\VariantMatrix
. - Removed
craft\commerce\helpers\VariantMatrix
. - Removed
craft\commerce\models\Currency
. - Removed
craft\commerce\models\Discount::$baseDiscountType
. - Removed
craft\commerce\models\LiteShippingSettings
. - Removed
craft\commerce\models\LiteTaxSettings
. - Removed
craft\commerce\models\ProductType::$hasVariants
.$maxVariants
can be used instead. - Removed
craft\commerce\models\Settings::$allowCheckoutWithoutPayment
.craft\commerce\models\Store::getAllowCheckoutWithoutPayment()
can be used instead. - Removed
craft\commerce\models\Settings::$allowEmptyCartOnCheckout
.craft\commerce\models\Store::getAllowEmptyCartOnCheckout()
can be used instead. - Removed
craft\commerce\models\Settings::$allowPartialPaymentOnCheckout
.craft\commerce\models\Store::getAllowPartialPaymentOnCheckout()
can be used instead. - Removed
craft\commerce\models\Settings::$autoSetCartShippingMethodOption
.craft\commerce\models\Store::getAutoSetCartShippingMethodOption()
can be used instead. - Removed
craft\commerce\models\Settings::$autoSetNewCartAddresses
.craft\commerce\models\Store::getAutoSetNewCartAddresses()
can be used instead. - Removed
craft\commerce\models\Settings::$autoSetPaymentSource
.craft\commerce\models\Store::getAutoSetPaymentSource()
can be used instead. - Removed
craft\commerce\models\Settings::$emailSenderAddressPlaceholder
. - Removed
craft\commerce\models\Settings::$emailSenderAddress
.craft\commerce\models\Email::$senderAddress
can be used instead. - Removed
craft\commerce\models\Settings::$emailSenderNamePlaceholder
. - Removed
craft\commerce\models\Settings::$emailSenderName
.craft\commerce\models\Email::$senderName
can be used instead. - Removed
craft\commerce\models\Settings::$freeOrderPaymentStrategy
.craft\commerce\models\Store::getFreeOrderPaymentStrategy()
can be used instead. - Removed
craft\commerce\models\Settings::$minimumTotalPriceStrategy
.craft\commerce\models\Store::getMinimumTotalPriceStrategy()
can be used instead. - Removed
craft\commerce\models\Settings::$pdfPaperOrientation
.craft\commerce\models\Pdf::$paperOrientation
can be used instead. - Removed
craft\commerce\models\Settings::$pdfPaperSize
.craft\commerce\models\Pdf::$paperSize
can be used instead. - Removed
craft\commerce\models\Settings::$requireBillingAddressAtCheckout
.craft\commerce\models\Store::getRequireBillingAddressAtCheckout()
can be used instead. - Removed
craft\commerce\models\Settings::$requireShippingAddressAtCheckout
.craft\commerce\models\Store::getRequireShippingAddressAtCheckout()
can be used instead. - Removed
craft\commerce\models\Settings::$requireShippingMethodSelectionAtCheckout
.craft\commerce\models\Store::getRequireShippingMethodSelectionAtCheckout()
can be used instead. - Removed
craft\commerce\models\Settings::$useBillingAddressForTax
.craft\commerce\models\Store::getUseBillingAddressForTax()
can be used instead. - Removed
craft\commerce\models\Settings::$validateBusinessTaxIdasVatId
.craft\commerce\models\Store::getValidateOrganizationTaxIdasVatId()
can be used instead. - Removed
craft\commerce\models\Settings::FREE_ORDER_PAYMENT_STRATEGY_COMPLETE
.craft\commerce\models\Store::FREE_ORDER_PAYMENT_STRATEGY_COMPLETE
can be used instead. - Removed
craft\commerce\models\Settings::FREE_ORDER_PAYMENT_STRATEGY_PROCESS
.craft\commerce\models\Store::FREE_ORDER_PAYMENT_STRATEGY_PROCESS
can be used instead. - Removed
craft\commerce\models\Settings::MINIMUM_TOTAL_PRICE_STRATEGY_DEFAULT
.craft\commerce\models\Store::MINIMUM_TOTAL_PRICE_STRATEGY_DEFAULT
can be used instead. - Removed
craft\commerce\models\Settings::MINIMUM_TOTAL_PRICE_STRATEGY_SHIPPING
.craft\commerce\models\Store::MINIMUM_TOTAL_PRICE_STRATEGY_SHIPPING
can be used instead. - Removed
craft\commerce\models\Settings::MINIMUM_TOTAL_PRICE_STRATEGY_ZERO
.craft\commerce\models\Store::MINIMUM_TOTAL_PRICE_STRATEGY_ZERO
can be used instead. - Removed
craft\commerce\models\ShippingRule::$maxQty
. - Removed
craft\commerce\models\ShippingRule::$maxTotal
. - Removed
craft\commerce\models\ShippingRule::$maxWeight
. - Removed
craft\commerce\models\ShippingRule::$minMaxTotalType
. - Removed
craft\commerce\models\ShippingRule::$minQty
. - Removed
craft\commerce\models\ShippingRule::$minTotal
. - Removed
craft\commerce\models\ShippingRule::$minWeight
. - Removed
craft\commerce\models\ShippingRule::$shippingZoneId
. - Removed
craft\commerce\models\ShippingRule::getShippingZone()
. - Removed
craft\commerce\records\Discount::BASE_DISCOUNT_TYPE_PERCENT_ITEMS_DISCOUNTED
. - Removed
craft\commerce\records\Discount::BASE_DISCOUNT_TYPE_PERCENT_ITEMS
. - Removed
craft\commerce\records\Discount::BASE_DISCOUNT_TYPE_PERCENT_TOTAL_DISCOUNTED
. - Removed
craft\commerce\records\Discount::BASE_DISCOUNT_TYPE_PERCENT_TOTAL
. - Removed
craft\commerce\records\Discount::BASE_DISCOUNT_TYPE_VALUE
. - Removed
craft\commerce\records\ShippingRule::TYPE_MIN_MAX_TOTAL_SALEPRICE_WITH_DISCOUNTS
. - Removed
craft\commerce\records\ShippingRule::TYPE_MIN_MAX_TOTAL_SALEPRICE
. - Removed
craft\commerce\records\ShippingRule::getShippingZone()
. - Removed
craft\commerce\services\PaymentSources::getAllGatewayPaymentSourcesByUserId()
. - Removed
craft\commerce\services\PaymentSources::getAllPaymentSourcesByUserId()
. - Removed
craft\commerce\services\TaxRates::getTaxRatesForZone()
. - Removed
craft\commerce\validators\StoreCountryValidator
. - Removed
craft\commerce\widgets\Orders::$orderStatusId
.$orderStatuses
can be used instead. craft\commerce\base\PurchasableInterface
now extendscraft\base\ElementInterface
.craft\commerce\elements\Product::getVariants()
now returns a collection.craft\commerce\elements\Variant
now implementscraft\base\NestedElementTrait
.craft\commerce\elements\db\PurchasableQuery
is now abstract.craft\commerce\services\Discounts::getAllDiscounts()
now returns a collection.craft\commerce\services\Gateways::getAllCustomerEnabledGateways()
now returns a collection.craft\commerce\services\Gateways::getAllGateways()
now returns a collection.craft\commerce\services\PaymentSources::getAllGatewayPaymentSourcesByCustomerId()
now returns a collection.craft\commerce\services\PaymentSources::getAllPaymentSourcesByCustomerId()
now returns a collection.craft\commerce\services\PaymentSources::getAllPaymentSourcesByGatewayId()
now returns a collection.craft\commerce\services\ShippingCategories::getAllShippingCategories()
now returns a collection.craft\commerce\services\ShippingMethods::getAllShippingMethods()
now returns a collection.craft\commerce\services\ShippingRules::getAllShippingRules()
now returns a collection.craft\commerce\services\ShippingRules::getAllShippingRulesByShippingMethodId()
now returns a collection.craft\commerce\services\TaxRates::getAllTaxRates()
now returns a collection.craft\commerce\services\TaxRates::getTaxRatesByTaxZoneId()
now returns a collection.craft\commerce\services\TaxZones::getAllTaxZones()
now returns a collection.- Renamed
craft\commerce\base\Purchasable::tableAttributeHtml()
toattributeHtml()
. - Renamed
craft\commerce\controllers\BaseStoreSettingsController
toBaseStoreManagementController
. - Renamed
craft\commerce\controllers\StoreSettingsController
toStoreManagementController
. - Renamed
craft\commerce\elements\Subscription::tableAttributeHtml()
toattributeHtml()
. - Renamed
craft\commerce\elements\Variant::tableAttributeHtml()
toattributeHtml()
. - Renamed
craft\commerce\elements\traits\OrderElementTrait::tableAttributeHtml()
toattributeHtml()
.