ATG  C om mer ce P ro g ramm in g   Gui d e 
15 3  
10  -  C o m merce  P rici n g  E ng i n es 
μ
10
Commerce Pricing Engines 
Pricing engines are responsible for the following tasks: 
Retrieving any promotions that are available to the site visitor. 
Determining which pricing calculators generate the price. 
Invoking the calculators in the correct order. 
This chapter describes the base Commerce pricing engine classes and interfaces. It includes the following 
sections: 
Pricing Engine Interfaces 
Default Pricing Engines 
Price Holding Classes 
Extending Pricing Engines 
For more information on the default pricing interfaces and classes, see the ATG API Reference. 
Pricing Engine Interfaces 
This section describes the ATG Commerce engine interfaces: 
The Base Pricing Engine 
ItemPricingEngine Interface 
OrderPricingEngine Interface 
ShippingPricingEngine Interface 
TaxPricingEngine Interface 
PricingConstants Interface 
The Base Pricing Engine 
atg.commerce.pricing.PricingEngine
is the main interface for interacting with the 
atg.commerce.pricing
package. Extensions of this interface describe objects that calculate prices for 
different types of Commerce object. The 
PricingEngine
interface itself contains only one method, 
getPricingModels
, which extracts a collection of promotions from an input profile. Different 
Cutting pdf pages - application software tool:C# PDF Page Extract Library: copy, paste, cut PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Easy to Use C# Code to Extract PDF Pages, Copy Pages from One PDF File and Paste into Others
www.rasteredge.com
Cutting pdf pages - application software tool:VB.NET PDF Page Extract Library: copy, paste, cut PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Detailed VB.NET Guide for Extracting Pages from Microsoft PDF Doc
www.rasteredge.com
ATG  C om merce  P ro gra mm in g  G ui d e 
15 4  
10  -  C o mm erce  Pri ci n g  En g in es  
PricingEngine
implementations take a range of information to calculate prices for their specific classes 
of object. 
ATG Commerce provides four extensions of the main 
PricingEngine
interface. Each extension provides 
a price for a different object type: 
atg.commerce.pricing.ItemPricingEngine
Provides a price for 
atg.commerce.order.CommerceItem
objects. 
atg.commerce.pricing.OrderPricingEngine
Provides a price for 
atg.commerce.order.Order
objects. 
atg.commerce.pricing.ShippingPricingEngine
Provides a price for 
atg.commerce.order.ShippingGroup
objects. 
atg.commerce.pricing.TaxPricingEngine
Determines tax for 
atg.commerce.order.Order
objects. 
The pricing context is defined by the method’s input parameters, which typically include the following: 
The objects to be priced. 
The promotions to apply to the prices. 
The customer’s profile. 
The locale for which the price is being generated. 
A hash table of extra parameters, which exists so that new APIs do not have to be 
created to accommodate additional pricing context information. One important use 
for extra parameters is to pass in the site ID, if you want to override the current site 
context.  
These engine interfaces are described in the sections that follow; the calculators are described in the 
Commerce Pricing Calculators chapter. 
ItemPricingEngine Interface 
atg.commerce.pricing.ItemPricingEngine
is an extension of the 
PricingEngine
interface. It 
describes an object that determines prices for 
atg.commerce.order.CommerceItem
objects. The prices 
that are generated are 
ItemPriceInfo
objects. 
An 
ItemPricingEngine
can determine prices in three ways: 
The 
priceItem
method prices an item as a single item. It reviews any promotions that 
are passed in through a 
pPricingModels
parameter. 
The single item that is passed in is the only one available to satisfy the requirements of 
any promotion. For example, if the item passed in is “5 blue women’s shorts,” and 
there is a promotion for “Buy 7 or more blue shorts, get one pair free,” the promotion 
would not take effect. This call is mainly used for displaying item prices when a 
customer is browsing the catalog. 
The 
priceEachItem
method batch processes all the items that are passed in, but they 
are priced as if they were passed into 
PriceItem
one at a time. 
application software tool:C# PDF copy, paste image Library: copy, paste, cut PDF images in
NET Demo Codes. Best .NET framework PDF editor SDK control for image copying, pasting and cutting from adobe PDF file in Visual C#.
www.rasteredge.com
application software tool:VB.NET PDF copy, paste image library: copy, paste, cut PDF images
NET framework PDF editor SDK control for image copying, pasting and cutting from adobe PDF file in VB.NET. PDF image cutting is similar to image deleting.
www.rasteredge.com
ATG  C om mer ce P ro g ramm in g   Gui d e 
15 5  
10  -  C o m merce  P rici n g  E ng i n es 
The 
priceItems
method prices all input items all in the same context. To continue 
with the same example, the customer now puts “6 blue men’s shorts” in the shopping 
cart in addition to the “5 blue women’s shorts.” While the customer is just browsing 
the catalog, the “Buy 7 or more blue shorts, get one pair free” promotion is not 
factored in when displaying prices. Therefore, when the customer makes the decision 
to add the shorts to the shopping cart, the price shown is still full price for all the 
shorts. However, when the customer subsequently displays the contents of his or her 
cart, the promotion takes effect and shows that one pair of shorts is free. 
The pricing context is defined by the method’s input parameters. In the case of 
priceItem
, the context is as follows: the items to be priced, the promotions to factor, 
the profile of the user, the locale, and any additional parameters. 
The context can be important because some promotions take effect only if the item 
appears in a pricing context with other items. For example, a certain promotion might 
give 10 percent off an order if the pricing context includes one shirt and one pair of 
pants. The items would only receive the discount if priced in the same context. 
ATG Commerce provides the 
ItemPricingEngineImpl
class as a default implementation of the 
ItemPricingEngine
interface. It computes the price of items both individually and in a larger context. It 
invokes a series of 
ItemPricingCalculators
OrderPricingEngine Interface 
atg.commerce.pricing.OrderPricingEngine
is an extension of the 
PricingEngine
interface. (See 
The Base Pricing Engine.) It describes an object that determines prices for 
Order
objects, which equal the 
total price of all items in a customer’s shopping cart. An 
OrderPricingEngine
uses the 
priceOrder
method to determine the price of an order. 
The pricing context is defined by the 
priceOrder
method’s input parameters. Implementations of this 
interface create an 
OrderPriceInfo
object that accurately represents the price of an input 
order
. The 
way in which they do this depends on the implementation. The specific way in which the engine creates 
the order object varies according to individual implementations. 
ATG Commerce provides the 
OrderPricingEngineImpl
class as a default implementation of the 
OrderPricingEngine
interface. It computes the price for an order, invoking a series of 
OrderPricingCalculators
ShippingPricingEngine Interface 
atg.commerce.pricing.ShippingPricingEngine
is an extension of the 
PricingEngine
interface. It 
describes an object that determines prices for 
ShippingGroup
objects. 
Implementations of this interface determine the cost of shipping the contents of a shipping group. The 
priceShippingGroup
method asks this object to determine a price for the specified shipping group. The 
getAvailableMethods
call returns the methods available for shipping the specified group. 
ATG Commerce provides the 
ShippingPricingEngineImpl
class as a default implementation of the 
ShippingPricingEngine
interface. It computes the shipping cost for an order by invoking a series of 
ShippingPricingCalculators
application software tool:VB.NET TIFF: How to Convert TIFF to Word Using VB.NET Sample Codes
Word document, without the trouble of cutting and pasting a single page or multiple pages into MS powerful & profession imaging controls, PDF document, tiff
www.rasteredge.com
ATG  C om merce  P ro gra mm in g  G ui d e 
15 6  
10  -  C o mm erce  Pri ci n g  En g in es  
TaxPricingEngine Interface 
atg.commerce.pricing.TaxPricingEngine
is an extension of the 
PricingEngine
interface. It 
describes an object that determines taxes for 
Order
objects. 
Implementations of this interface determine the price for the tax associated with a specified order object. 
The interface provides one way to ask for a tax price. The calling code provides the pricing context by 
inputting the order, any pricing models (promotions), a locale in which the pricing should occur, the 
current profile, and any additional parameters. 
ATG Commerce provides the 
TaxPricingEngineImpl
class as a default implementation of the 
TaxPricingEngine
interface. It computes the tax for an order, invoking a series of 
TaxPricingCalculators
PricingConstants Interface 
The 
atg.commerce.pricing.PricingConstants
interface contains constant values for static reference 
by other classes in the 
atg.commerce.pricing
package. 
Default Pricing Engines 
ATG Commerce includes four preconfigured implementations of its pricing engine classes. You can use 
these implementations as they are or adapt them for your own site development needs. 
Default Item Pricing Engine 
Default Order Pricing Engine 
Default Tax Pricing Engine 
Default Shipping Pricing Engine 
PricingEngineService 
The 
PricingEngineService
class is a 
GenericService
implementation of a 
PricingEngine
PricingEngine
implementations can extend this class to leverage scheduling, global promotions, locale, 
and other configuration functionality. 
The 
PricingEngineService
includes the 
getCalculatorForCalculatorType()
method, which 
determines the calculator component to use for promotions (note that it is not used for pre- or post-
calculators). To make this determination, it consults a Map in which the key is a 
CalculatorType
. The 
calculator type specified in the PMDL is used to identify the correct calculator component. The calculator 
identified by 
getCalculatorForCalculatorType()
is then used by the pricing calculator (such as 
ItemPriceCalculator
). You can use the map to extend the pricing engine and add your own 
calculators to the pricing system. 
Note: Only use the calculator type Map for promotions created in ATG Commerce 10 or later. Earlier 
versions use a different mechanism for retrieving calculator details. 
ATG  C om mer ce P ro g ramm in g   Gui d e 
15 7  
10  -  C o m merce  P rici n g  E ng i n es 
The 
QualifiedItems
and 
MatchingObjects
are passed to the calculator using the “extra parameters” 
Map. For the 
ItemPricingCalculator
, the List of 
QualifiedItem
objects is stored in 
Constants.QUALIFIED_ITEMS.
For 
Order
Shipping
, and 
TaxPricingCalculators
, the 
MatchingObject
is stored in 
Constants.MATCHING_OBJECT
. For both, the 
DiscountStructure
is 
stored in 
Constants.DISCOUNT_STRUCTURE
Default Item Pricing Engine 
The 
ItemPricingEngine
component is a preconfigured implementation of the 
ItemPricingEngineImpl
class. It determines the price of one or more items by retrieving applicable 
promotions from the customer’s profile and invoking one or more 
ItemPricingCalculators
You can view and modify this component in the ATG Control Center. Its location is 
/atg/commerce/pricing/ItemPricingEngine
Default Order Pricing Engine 
The 
OrderPricingEngine
component is a preconfigured implementation of the 
OrderPricingEngineImpl
class. It determines the price of an entire order by invoking a series of 
OrderPricingCalculators
. It uses the same mechanisms as the 
ItemPricingEngine
component for 
determining which promotions to apply. 
You can view and modify this component in the ATG Control Center. Its location is 
/atg/commerce/pricing/OrderPricingEngine
Default Tax Pricing Engine 
The 
TaxPricingEngine
component is a preconfigured implementation of the 
TaxPricingEngineImpl
class. It determines the price of tax for an order by invoking a series of 
TaxPricingCalculators
. It uses 
the same mechanisms as the 
ItemPricingEngine
component for determining which promotions to 
apply to taxes. 
The 
TaxPricingCalculator
determines if an item is taxable using 
pricingTools.isTaxable()
method. If an item is taxable, 
pricingTools.isTaxable()
returns true. By default, all items are taxable. 
pricingTools.calculateTaxableAmount() 
then determines the tax by returning 0 if 
isTaxable
returns 
false
, otherwise it returns the price of the item minus its 
orderDiscountShare
You can view and modify this component in the ATG Control Center. Its location is 
/atg/commerce/pricing/TaxPricingEngine
Default Shipping Pricing Engine 
The 
/atg/commerce/pricing/ShippingPricingEngine
component is a preconfigured 
implementation of the 
ShippingPricingEngineImpl
class. It determines the price of shipping for an 
order by invoking a series of 
ShippingPricingCalculators
. It uses the same mechanisms as the 
ItemPricingEngine
component for determining which promotions to apply. 
ATG  C om merce  P ro gra mm in g  G ui d e 
15 8  
10  -  C o mm erce  Pri ci n g  En g in es  
Price Holding Classes 
This section describes the ATG Commerce price holding classes. These classes are used to store price 
information about different object types. 
AmountInfo 
ItemPriceInfo 
DetailedItemPriceInfo 
OrderPriceInfo 
ShippingPriceInfo 
TaxPriceInfo 
AmountInfo 
The 
atg.commerce.pricing.AmountInfo
parent class represents price information about an object. In 
addition to the actual amount, it also contains information about how to interpret that amount. This class 
is the base for the ItemPriceInfo , OrderPriceInfoTaxPriceInfo, and ShippingPriceInfo classes. 
For information about 
AmountInfo
properties, see the ATG API Reference
ItemPriceInfo 
The 
atg.commerce.pricing.ItemPriceInfo
class contains information about the price of an item (a 
CommerceItem
). It also contains detailed price information about how individual quantities of the 
CommerceItem
were priced. For example, if an item’s quantity is 5, and 3 items received Discount A and 
the other two received Discount B, there would be two 
DetailedItemPriceInfo
entries in 
currentPriceDetails
One 
DetailedItemPriceInfo
entry for the quantity of 3, describing the changes 
discount A made to the price. 
One 
DetailedItemPriceInfo
entry for the quantity of 2, describing the changes 
discount B made to the price. 
The 
amount
property of 
ItemPriceInfo
(inherited from 
AmountInfo
) should always equal the sum of 
the amounts of the 
DetailedItemPriceInfo
entries in 
currentPriceDetails
For information about 
ItemPriceInfo
properties, see the ATG API Reference. 
DetailedItemPriceInfo 
This section describes 
DetailedItemPriceInfo
objects, including how 
DetailedItemPriceInfo
objects relate to each other and to their 
ItemPriceInfo
It is easiest to understand 
DetailedItemPriceInfo
by comparing it to 
ItemPriceInfo
. The 
ItemPriceInfo
object describes the price for an entire 
CommerceItem
in an order. The 
amount
property 
of the 
ItemPriceInfo
is the final price for the given 
CommerceItem
. If part of the quantity of the 
ATG  C om mer ce P ro g ramm in g   Gui d e 
15 9  
10  -  C o m merce  P rici n g  E ng i n es 
CommerceItem
was discounted due to a promotion, this information is reflected in the 
ItemPriceInfo
For example, if the order contains 10 shirts at $10.00 each, and there was a promotion “Buy 9 shirts, get 1 
free” then the 
amount
property of the 
ItemPriceInfo
would be $90.00. The 
PricingAdjustments
in 
the 
ItemPriceInfo
would contain one 
PricingAdjustment
for the list price, and one for the 
promotion. For more information on the 
ItemPriceInfo
object, see the ItemPriceInfo section. 
The 
DetailedItemPriceInfo
objects provide a much more detailed view of the price of an item. In the 
example above, there would be two 
DetailedItemPriceInfo
objects: 
DetailedItemPriceInfo
object #1: 
quantity
: 9 
amount
: $90.00 
PricingAdjustment
: set to the list price. 
DetailedItemPriceInfo
object #2: 
quantity
: 1 
amount
: $0.00 
PricingAdjustment
: There would be two 
PricingAdjustments
. One with 
the list price, and one with the promotion that caused the item to be free. 
Another feature of 
DetailedItemPriceInfo
is the 
range
property. Instead of a detail referring to “5 
items” it is more specific and refers to “the first 5 items” or “items 2-6”. This is used for two reasons: 
To split the details of items in different shipping groups. There is a 
range
property in 
ShippingGroupCommerceItemRelationship
DetailedItemPriceInfo
objects 
cannot refer to items in more than one shipping group. 
During qualification of a promotion (the process of determining if a particular 
promotion applies to the order) we need to know which items have been looked at 
and which items have already qualified a promotion. For more information, see the 
Qualifier Class section. 
The following statements are true for all 
CommerceItem
objects: 
Each 
CommerceItem
has exactly one 
ItemPriceInfo
The price of a particular item (if there are 10 shirts, the first shirt, or the second shirt, 
etc.) is described by exactly one detail. 
Each 
DetailedItemPriceInfo
in the 
ItemPriceInfo
describes the price of a 
quantity of items that are all priced in exactly the same way. (The same list price, the 
same sale price, and the same promotions.) 
All the items described by a 
DetailedItemPriceInfo
are in the same shipping 
group. 
To make sure all of the above statements are true, each 
ItemPricingCalculator
has the responsibility 
of manipulating the 
DetailedItemPriceInfos
correctly. 
The following sections describe how the three different types of item calculators interact with 
DetailedItemPriceInfos
ATG  C om merce  P ro gra mm in g  G ui d e 
16 0  
10  -  C o mm erce  Pri ci n g  En g in es  
Using List Price Calculators with DetailedItemPriceInfo Objects 
Using Sale Price Calculators with DetailedItemPriceInfo Objects 
Using Item Discount Calculators with DetailedItemPriceInfo Objects 
Using List Price Calculators with DetailedItemPriceInfo Objects 
The list price calculators are responsible for calculating the price based on the list price. They can usually 
look up a list price and multiply it by the quantity. If the entire quantity of the item is being shipped to the 
same place, there will only need to be one 
DetailedItemPriceInfo
. The logic for making sure that each 
detail only refers to items in one shipping group is contained in this method: 
pricingTools.detailedItemPriceTools.createInitialDetailedItemPriceInfos
This method takes the following parameters: 
TotalPrice
- The total price for which the new 
DetailedItemPriceInfo
objects 
must account. 
TotalPrice
is the price of the entire 
CommerceItem
(
listPrice
quantity
). 
PriceQuote
- The current working price of the 
Item
PriceQuote
is the 
ItemPriceInfo
to which the newly created details will be added. 
Item - The 
CommerceItem
being priced. This is needed to get to the 
ShippingGroupCommerceItemRelationships
PricingModel
- The discount that will be set in the 
PricingAdjustment
(usually 
null). 
Profile
- The person for whom the items are to be discounted (currently ignored). 
Locale
- The locale in which the items are to be discounted (currently ignored). 
ExtraParameters
- Any extra information that this method might need to set the 
number of the qualifying item (currently ignored). 
AdjustmentDescription
- The adjustment description used when creating all new 
PricingAdjustments
that is added to each new detail. 
These parameters are the only parameters required to perform list pricing and bulk pricing. The entire 
quantity gets the same price. To facilitate tiered pricing, there is another version of this method that also 
takes a 
Range
argument. This means that new details will only be created for the given range. In this case, 
the 
TotalPrice
is the price for the range as opposed to the entire 
CommerceItem
. The 
ItemTieredPriceCalculator
will call this method once per tier. 
This method will only modify the 
DetailedItemPriceInfo
objects. It is the responsibility of the caller to 
update the 
ItemPriceInfo
Using Sale Price Calculators with DetailedItemPriceInfo Objects 
The calculators responsible for calculating the sale price usually change the price of the entire quantity. 
The calculator retrieves the sale price, subtracts the list price, and then modifies the amount accordingly. 
This functionality is contained in a centralized method: 
pricingTools.detailedItemPriceTools.assignSalePriceToDetails
. The 
assignSalePriceToDetails
method takes the following parameters: 
ATG  C om mer ce P ro g ramm in g   Gui d e 
16 1  
10  -  C o m merce  P rici n g  E ng i n es 
DetailedItemPriceInfos
- The list of 
DetailedItemPriceInfo
objects that 
should be adjusted. This will usually be the entire list of details. 
UnitSalePrice
- The sale price for a single given 
CommerceItem
. The total 
adjustment for each detail is this amount times the quantity of the detail. 
PriceQuote
- The current working price of 
Item
. This is taken from the 
ItemPriceInfo
to which the newly created details will be added. This is also ignored. 
Item
CommerceItem
being priced. This is ignored in the default implementation. 
PricingModel
- The discount that will be set in the 
PricingAdjustment
(usually 
null). 
Profile
- The person for whom the items are to be discounted (currently ignored). 
Locale
- The locale in which the items are to be discounted (currently ignored). 
ExtraParameters
- Any extra information that this method might need to set the 
prices of a number of the qualifying item(currently ignored). 
AdjustmentDescription
- This is the adjustment description used when creating all 
new 
PricingAdjustments
The 
assignSalePriceToDetails
method walks through each detail and adjusts the amount 
accordingly. There is no reason to create any new details. This method will only modify the 
DetailedItemPriceInfo
objects. It is the responsibility of the caller to update the 
ItemPriceInfo
objects. 
One sale calculator that does not use this method is the 
ItemSalesTieredPriceCalculator
. This 
calculator splits the details since each quantity of the item will not necessarily get the same unit sale price. 
Therefore it usually splits each detail to maintain the property that each item in a detail was priced in 
exactly the same way (this includes having the same unit sale price). 
Using Item Discount Calculators with DetailedItemPriceInfo Objects 
The calculators that are responsible for discounting the price based on a promotion usually only adjust 
the price for some subset of the quantity. Therefore, the 
ItemDiscountCalculator
frequently splits 
details. The 
ItemDiscountCalculator
determines the range that is undiscounted vs. the range that is 
discounted. It creates a new 
DetailedItemPriceInfo
for the undiscounted portion and set its quantity 
to the number of undiscounted items. It modifies the current detail to be discounted and changes its 
price. Then, with each detail, it calls 
pricingTools.detailedItemPriceTools.splitDetailsAccordingtoRanges
This method takes the following parameters: 
Detail
—The 
DetailedItemPriceInfo
to split apart. 
Ranges
—The list of Ranges that should have a 
DetailedItemPriceInfo
. The size of 
these must equal the quantity of 
Detail
This method takes the current detail and creates enough new details so that there is one per Range that is 
passed in. All the details are returned. 
ATG  C om merce  P ro gra mm in g  G ui d e 
16 2  
10  -  C o mm erce  Pri ci n g  En g in es  
OrderPriceInfo 
The 
atg.commerce.pricing.OrderPriceInfo
class contains information about the price of an order. 
Its properties are modified by order pricing calculators and returned by order pricing engines. 
For information about 
OrerPriceInfo
properties, see the ATG API Reference. 
ShippingPriceInfo 
The 
atg.commerce.pricing.ShippingPriceInfo
class contains information about the price of a 
ShippingGroup
For information about 
ShippingPriceInfo
properties, see the ATG API Reference
TaxPriceInfo 
The 
atg.commerce.pricing.TaxPriceInfo
class represents tax price information. 
For information about 
TaxPriceInfo
properties, see the ATG API Reference
Extending Pricing Engines 
ATG Commerce provides several preconfigured pricing engines (see Default Pricing Engines). You can 
extend these engines to fit your sites’ requirements, and you can also create new pricing engines if 
necessary. 
Extending a Pricing Engine 
You can extend one or more of the pricing engine implementations to provide new pricing functionality. 
For example, you can extend 
ItemPricingEngineImpl
to create an algorithm that prices a set of items 
differently from the current implementation of 
priceEachItem
. You could create an algorithm that 
applies promotions in a random order rather than in order of ascending precedence. 
Because each implementation of the 
PricingEngine
interface extends the 
PricingEngineService 
class, you can extend one or all of the implementations to alter the behavior of a method of 
PricingEngineService
. For example, you could implement the 
expirePromotion
method to send a 
JMS event enabling the creation of scenarios related to unused and expired promotions. After you 
complete your extensions, configure the corresponding pricing engine component to use the class. (For 
more information, see the description of 
PricingEngineService
.) 
Each engine can also be extended to leverage existing code. For example, you can extend the pricing 
engine to determine global promotions using a Personify or NetPerceptions integration. The 
ItemPricingEngine
could be extended to get its global promotions from the integration. 
The relevant interfaces are: 
atg.commerce.pricing.ItemPricingEngine
Documents you may be interested
Documents you may be interested