Oracle ATG Web Commerce pricing services are based on two complementary elements: pricing engines and pricing calculators. These components work together to determine prices for orders, sales tax, and shipping.
Pricing engines are responsible for these tasks:
Retrieving any promotions that are available to site visitors
Determining which pricing calculators generate prices
Invoking the calculators in the correct order
Pricing calculators are responsible for the following:
Looking up the price.
Using information they receive from the pricing engines, promotions, and the qualifier service to determine prices.
The following overview describes the way Commerce calculates prices.
Note: If your promotions were generated using Oracle ATG Web Commerce 9.1 or earlier versions, see the documentation for that version; the pricing process treats promotions differently depending on the version of Commerce used to create them.
Before pricing happens, the following steps take place:
On a scheduled basis, the pricing engines load global promotions (those defined as applying automatically to all customers). An engine builds its list by using its
globalPromotionsQuery
property to query the Promotions repository, searching for any promotion where the Automatically Give to All Customers (global
) property is set totrue
. Each engine loads the global promotions that are specific to that pricing engine; for example, theItemPricingEngine
loads the global Item Discount promotions.At the start of the customer session, a
PricingModelHolder
instance is created.PricingModelHolder
calls each pricing engine’sgetPricingModels()
method.The pricing engine
getPricingModels()
method gets any promotions listed in theactivePromotions
property of the current customer’s profile and merges them with the global promotions list it previously created. The pricing engine can also veto promotions from being returned to thePricingModelHolder
at this point.PricingModelHolder
periodically updates both the global and active promotions.
The result is that PricingModelHolder
has a merged list of global and active promotions for each pricing engine. When the customer performs an action that prompts a pricing operation, such as adding an item to their cart, the following steps are performed:
The business layer logic (such as a
PriceItem
servlet bean in a page) invokes a pricing engine (see The Base Pricing Engine).The pricing operation invokes
PricingTools
which then gets thePricingModelHolder
for that customer.PricingTools
gets the promotions from thePricingModelHolder
and calls the pricing engine’spriceItems
method, passing in the promotions as a list.The pricing engine applies its configured precalculators in the order in which they appear in its
preCalculators
property. A precalculator modifies a price without using any associated promotions. For example, a site could use a list price precalculator or an order subtotal precalculator to establish a base price to which subsequent calculators then apply a discount.Each type of engine calls its corresponding type of precalculator – for example, the
OrderPricingEngineImpl
callsOrderPricingCalculators
and theTaxPricingEngineImpl
callsTaxPricingCalculators
.The pricing engine then takes the promotions list that was passed in and can again veto promotions from that list. The remaining promotions are sorted by priority and then evaluated.
Each promotion contains a PMDL rule that describes the discount. For example, a rule might define a discount in which a customer buys one item and receives a second for free. The PMDL specifies the calculator type to use to determine the amount of the discount in the
calculator-type
attribute of thediscount-structure
element. The calculator type maps to a calculator component in thecalculatorTypeCalculators
map.For each available promotion, Commerce does the following:
The pricing engine calls the appropriate helper method (
findQualifyingItems
,findQualifyingOrder
, orfindQualifyingShipping)
in theQualifier
class to determine which items should be discounted. The pricing engine passes the current pricing context into the helper method’s input parameters.The
findQualifyingItems()
method callsevaluateTarget()
, which returns a Collection ofQualfiedItem
objects, representingCommerceItem
objects. ThefindQualifyingOrder()
andfindQualifyingShipping()
methods return a singleMatchingObject
.The
QualifiedItem
andMatchingObject
include discount information such as the PMDL discount structure. See the QualifiedItem Class for more information.The
QualifiedItem
orMatchingObject
information is returned to the pricing engine, which uses the discount information to determine which calculator to use.The pricing engine calls the calculator and passes in the items to be discounted and the discount information.
The calculator marks items that have received a discount, which might not be eligible for further promotions.
The qualifier marks items that have already been used as qualifiers for the promotion. This prevents the qualifier items from being used again during the same price calculation.
The calculator applies the discount to the list of objects.
The pricing engine applies its configured
PostCalculators
, which make any necessary modifications to the price after discounts have been applied. Each pricing engine calls postcalculators of its own type.The pricing engine returns an updated
PriceInfo
object.
This process is repeated every time a price is requested. Price requests are resource-intensive, and should be performed only when necessary.