atg.commerce.pricing
Class PricingEngineService

java.lang.Object
  extended by atg.nucleus.logging.VariableArgumentApplicationLoggingImpl
      extended by atg.nucleus.GenericService
          extended by atg.commerce.pricing.PricingEngineService
All Implemented Interfaces:
atg.naming.AbsoluteNameable, NameContextBindingListener, NameContextElement, atg.naming.NameContextParentable, NameResolver, AdminableService, atg.nucleus.Configured, ApplicationLogging, atg.nucleus.logging.ApplicationLoggingSender, atg.nucleus.logging.TraceApplicationLogging, VariableArgumentApplicationLogging, ComponentNameResolver, Service, ServiceListener, Schedulable, java.util.EventListener
Direct Known Subclasses:
ItemPricingEngineImpl, OrderPricingEngineImpl, ShippingPricingEngineImpl, TaxPricingEngineImpl

public abstract class PricingEngineService
extends GenericService
implements Schedulable

A GenericService version of a PricingEngine. PricingEngine implementations can extend this class in order to leverage scheduling, global promotions, locale, and other configuration functionality from the PricingEngineService.

Properties:


Nested Class Summary
protected  class PricingEngineService.EmptyItemPriceInfo
          Internal class used to set up as yet unpriced commerce items used outside of item pricing.
 
Field Summary
static java.lang.String CLASS_VERSION
          Class version string
static java.lang.String EXTRA_PARAM_QUALIFIERSERVICE
           
protected  java.util.List mGlobalPromotions
           
protected  java.util.Map mPricingCalculatorServices
          Cache of calculator names to calculator service instances
 
Fields inherited from class atg.nucleus.GenericService
SERVICE_INFO_KEY
 
Fields inherited from interface atg.nucleus.logging.TraceApplicationLogging
DEFAULT_LOG_TRACE_STATUS
 
Fields inherited from interface atg.nucleus.logging.ApplicationLogging
DEFAULT_LOG_DEBUG_STATUS, DEFAULT_LOG_ERROR_STATUS, DEFAULT_LOG_INFO_STATUS, DEFAULT_LOG_WARNING_STATUS
 
Constructor Summary
PricingEngineService()
           
 
Method Summary
protected  boolean addPromotion(RepositoryItem pPromotion, java.util.Date pNow)
          This method determines if the given promotion should qualify for use in determining pricing.
 void addPromotionToList(RepositoryItem pPromotion, java.util.List pPricingModels, RepositoryItem pProfile)
          Adds a new promotion to the list of pricing models.
protected  void applyPromotionProcessing(atg.commerce.pricing.PromotionProcessingComponent[] pPromotionProcessingComponents, java.util.Collection<RepositoryItem> pPricingModels, PricingContext pPricingContext, java.util.Map pExtraParameters)
          Apply the given promotion processing components.
protected  void checkAndAddPromotions(java.util.Collection pSource, java.util.Collection pDestination, java.util.Date pNow, RepositoryItem pProfile)
          Receives a collection of promotionStatus objects which are cycled through to determine which of these promotions has expired, and which should be added to the pricingModels used.
protected  void checkAndMergePromotions(java.util.Collection pSource, java.util.Collection pCheckedMerge, java.util.Collection pDestination, java.util.Date pNow, RepositoryItem pProfile)
          Merges together two lists of promotions in the correct sorted order.
protected  boolean checkPromotionExpiration(RepositoryItem pPromotion, java.util.Date pNow)
          Return true if the promotion has expired and should be removed from the user's collection of active promotions
protected  ItemPriceInfo createEmptyItemPriceInfo()
          Creates a basic ItemPriceInfo to use for commerce items that have not yet been priced but which are being referenced outside of item pricing, e.g.
protected  AmountInfo createPriceInfo()
          Returns a new instance of the of the class defined through the priceInfoClass property.
protected  void createStackingRuleExclusionMessage(java.lang.Object[] pSkippedPromotionDetails, java.util.Map<java.lang.String,atg.web.messaging.UserMessage> pStackingRuleAppMessages, RepositoryItem pPricingModel, PricingContext pPricingContext, java.util.Map pExtraParameters)
          Creates a stacking rule exclusion message, if applicable.
protected  boolean didPromotionApply(RepositoryItem pPricingModel, AmountInfo pPriceInfo, java.util.Map pExtraParameters)
          Returns true if the promotion applied, false otherwise.
protected  boolean didPromotionQualify(RepositoryItem pPricingModel, PricingContext pPricingContext, java.util.Map pExtraParameters)
          Returns true if a promotion qualified, false otherwise.
 void doStartService()
          Loads the global promotions.
 void doStopService()
          Stops the schedule for updating the global promotions
protected  void expirePromotion(RepositoryItem pPromotion, RepositoryItem pProfile)
          Called if checkPromotionExpiration determines that a promotion has expired and should no longer be active.
protected  java.util.List findGlobalPromotions()
          Return the set of global promotions for this pricing engine
protected  void generateStackingRuleInfo(PricingContext pPricingContext, java.util.Map<RepositoryItem,RepositoryItem> pIncludedPromotions, java.util.Map<RepositoryItem,RepositoryItem> pExcludedPromotions, java.util.Map<RepositoryItem,RepositoryItem> pExcludedStackingRules, java.util.Map<RepositoryItem,java.lang.Integer> pStackingRuleUsage, java.util.Map<java.lang.String,atg.web.messaging.UserMessage> pStackingRuleAppMessages, java.util.Map pExtraParameters)
          Generates stacking rule tracking information and stacking rule exclusion messages based on the information linked to the applied promotions from pricing engines that have not been processed.
protected  java.util.List getAdjustmentPricingModels(AmountInfo pPriceInfo)
          Gets the pricingModels from the priceInfo's "adjustments" property These are the promotions the order has qualified for, and should not be evaluated for closeness
 boolean getAlwaysLoadGlobalPromotions()
          Gets whether or not to always load the global promotions rather than using the cache.
protected  java.util.List<RepositoryItem> getAppliedPromotions(AmountInfo pPriceInfo)
          Returns a list of applied promotions for the given price info.
protected  java.lang.Object getCalculator(RepositoryItem pPricingModel)
          Return the pricing calculator that should be used for the given promotion.
 java.lang.Object getCalculatorForCalculatorType(java.lang.String pCalculatorType)
          Returns the calculator service for the given type.
 ServiceMap getCalculatorTypeCalculators()
           
 CalculatorInfo[] getCalculatorTypes()
          Gets the information for the calculators this pricing engine supports
 ClosenessQualifierEvaluator getClosenessQualifierEvaluator()
           
protected  java.lang.String getCurrencyCode(java.util.Locale pLocale)
          Return the currency code which should be used for the given locale.
 java.util.Locale getDefaultLocale()
          Returns property DefaultLocale
 java.util.List getGlobalPromotions()
          Returns property GlobalPromotions
 RqlStatement getGlobalPromotionsQuery()
          Returns property GlobalPromotionsQuery
 CurrentDate getGlobalPromotionsSchedulableDate()
          Returns property GlobalPromotionsSchedulableDate
protected  java.util.List getInitialPromotions(RepositoryItem pProfile)
          Helper method that returns a List of promotions for given a Profile.
protected  java.util.Locale getLocale(PricingContext pPricingContext, java.util.Map pExtraParameters)
          Gets the locale to use.
 java.lang.Class getPriceInfoClass()
          Returns property PriceInfoClass
protected  java.util.List<AmountInfo> getPriceInfoDetails(PricingContext pPricingContext, java.util.Map pExtraParameters)
          Returns price info details.
protected  java.lang.String getPricingCurrencyCode(RepositoryItem pProfile, java.lang.String pPriceListPropertyName, boolean pUseDefaultPriceList, java.util.Map pExtraParameters, java.util.Locale pLocale)
          Gets the locale currency code for pricing.
 java.util.Comparator getPricingModelComparator()
          Returns property PricingModelComparator
 PricingModelEvaluationVetoer[] getPricingModelEvaluationVetoers()
           
 PricingModelHolderVetoer[] getPricingModelHolderVetoers()
           
 PricingModelProperties getPricingModelProperties()
          Returns a bean that contains properties for a PricingModel
 PricingTools getPricingTools()
          Returns property PricingTools
 java.lang.String[] getProfileProperties()
          The profile properties to inspect for pricing models
 RepositoryItemDescriptor[] getPromotionItemDescriptors()
          Returns the promotion item descriptors
 java.lang.String[] getPromotionItemTypes()
          Returns property PromotionItemTypes
 java.util.List getPromotions(RepositoryItem pProfile)
           
 Repository getPromotionsRepository()
          The repository which contains the promotions
 PromotionTools getPromotionTools()
          Returns property PromotionTools
 Qualifier getQualifierService()
           
 Qualifier getQualifierService(java.util.Map pExtraParameters)
          Gets the Qualifier service to use.
 Qualifier getQualifierService(RepositoryItem pPricingModel, java.util.Map pExtraParameters)
          Gets the Qualifier service to use.
 Scheduler getScheduler()
          Returns property Scheduler
protected  java.lang.String getStackingRuleOrderLimitReachedMessageIdentifier()
          Value for stacking rule order limit reached message identifier.
protected  java.lang.String getStackingRulePromotionExcludedMessageIdentifier()
          Value for stacking rule promotion excluded message identifier.
 Schedule getUpdateSchedule()
          Returns property UpdateSchedule
 java.util.List getUserOnlyPromotions(RepositoryItem pProfile)
           
 boolean isUseMerge()
          If true then this flag turns on an efficient merge algorithm to merge profile and global promotions.
protected  boolean isValidItemDescriptor(RepositoryItem pPromotion)
          This method determines if the given promotion's item descriptor matches that of the PricingEngine configured item descriptors, promotionItemDescriptors
 void loadGlobalPromotions()
          Find and load the global promotions.
 void performScheduledTask(Scheduler pScheduler, ScheduledJob pJob)
          Reload the global promotions
protected  java.util.List<atg.commerce.pricing.PricingEngineService.ValidEvaluationVetoer> prepareEvaluationVetoers(PricingEngineService pPricingEngine, PricingContext pPricingContext, java.util.Map pExtraParametersMap)
          Iterates over the configured pricing model evaluation vetoers and calls the prepare method for each.
protected  java.util.List<atg.commerce.pricing.PricingEngineService.ValidHolderVetoer> prepareHolderVetoers(PricingEngineService pPricingEngine, RepositoryItem pProfile)
          Iterates over the configured pricing model holdr vetoers and calls the prepare method for each.
protected  void pricingComplete(java.util.Map pExtraParameters)
          Method that keeps a track of the pricing engines that have completed pricing.
protected  java.util.List removeExpiredPromotions(java.util.List<RepositoryItem> pPricingModels)
          Builds up a new list of promotions, none of which will be expired.
protected  void resetEmptyItemPriceInfos(Order pOrder)
          Utility method to revert item price infos back to null if they were temporarily set to use the EmptyItemPriceInfo for pricing.
protected  java.lang.Object resolveCalculator(java.lang.String pCalcServiceString)
          Resolves the passed in calculator service nucleus path to a service reference.
 void setAlwaysLoadGlobalPromotions(boolean pAlwaysLoadGlobalPromotions)
          Sets whether or not to always load the global promotions rather than using the cache.
 void setCalculatorTypeCalculators(ServiceMap pCalculatorTypeCalculators)
           
 void setClosenessQualifierEvaluator(ClosenessQualifierEvaluator pClosenessQualifierEvaluator)
          Component that evaluates if an order or item meets the closenessQualifiers for relevant promotions
 void setDefaultLocale(java.util.Locale pDefaultLocale)
          Sets property DefaultLocale
 void setGlobalPromotionsQuery(RqlStatement pGlobalPromotionsQuery)
          Sets property GlobalPromotionsQuery
 void setGlobalPromotionsSchedulableDate(CurrentDate pGlobalPromotionsSchedulableDate)
          Sets property GlobalPromotionsSchedulableDate
 void setPriceInfoClass(java.lang.Class pPriceInfoClass)
          Sets property PriceInfoClass
 void setPricingModelComparator(java.util.Comparator pPricingModelComparator)
          Sets property PricingModelComparator
 void setPricingModelEvaluationVetoers(PricingModelEvaluationVetoer[] pPricingModelEvaluationVetoers)
           
 void setPricingModelHolderVetoers(PricingModelHolderVetoer[] pPricingModelHolderVetoers)
           
 void setPricingModelProperties(PricingModelProperties pPricingModelProperties)
           
 void setPricingTools(PricingTools pPricingTools)
          Sets property PricingTools
 void setProfileProperties(java.lang.String[] pProfileProperties)
           
 void setPromotionItemTypes(java.lang.String[] pPromotionItemTypes)
          Sets property PromotionItemTypes
 void setPromotionsRepository(Repository pPromotionsRepository)
           
 void setPromotionTools(PromotionTools pPromotionTools)
          Sets property PromotionTools
 void setQualifierService(Qualifier pQualifierService)
           
 void setScheduler(Scheduler pScheduler)
          Sets property Scheduler
 void setUpdateSchedule(Schedule pUpdateSchedule)
          Sets property UpdateSchedule
protected  void setupStackingRuleCollections(PricingContext pPricingContext, java.util.Map pExtraParameters)
          Sets up the stacking rule info collections: 1.
 void setUseMerge(boolean pUseMerge)
           
protected  java.lang.Object[] skipPromotion(PricingContext pPricingContext, RepositoryItem pPricingModel, java.util.Map<RepositoryItem,RepositoryItem> pIncludedPromotions, java.util.Map<RepositoryItem,RepositoryItem> pExcludedPromotions, java.util.Map<RepositoryItem,RepositoryItem> pExcludedStackingRules, java.util.Map<RepositoryItem,java.lang.Integer> pStackingRuleUsage, java.util.Map pExtraParameters)
          Determines whether or not the given promotion should not be applied.
protected  void updateStackingRuleTracking(RepositoryItem pPricingModel, java.util.Map<RepositoryItem,RepositoryItem> pIncludedPromotions, java.util.Map<RepositoryItem,RepositoryItem> pExcludedPromotions, java.util.Map<RepositoryItem,RepositoryItem> pExcludedStackingRules, java.util.Map<RepositoryItem,java.lang.Integer> pStackingRuleUsage, java.util.Map pExtraParameters)
          Updates the stacking rule tracking information, based upon the details relating to the applied promotion.
protected  java.util.Collection<RepositoryItem> vetoPromotionsForEvaluation(PricingContext pPricingContext, java.util.Map pExtraParametersMap, java.util.Collection<RepositoryItem> pPricingModels)
          Validates the passed in promotions against the configured vetoers for evaluation.
protected  boolean wasPromotionSkipped(PricingContext pPricingContext, RepositoryItem pPricingModel, java.util.Map<RepositoryItem,RepositoryItem> pIncludedPromotions, java.util.Map<RepositoryItem,RepositoryItem> pExcludedPromotions, java.util.Map<RepositoryItem,RepositoryItem> pExcludedStackingRules, java.util.Map<RepositoryItem,java.lang.Integer> pStackingRuleUsage, java.util.Map<java.lang.String,atg.web.messaging.UserMessage> pStackingRuleAppMessages, java.util.Map pExtraParameters)
          This method determines if a promotion was skipped, based on the stacking rule exclusion.
 
Methods inherited from class atg.nucleus.GenericService
addLogListener, createAdminServlet, getAbsoluteName, getAdminServlet, getAdminServletOutputStreamEncoding, getLoggingForVlogging, getLogListenerCount, getLogListeners, getName, getNameContext, getNucleus, getRoot, getServiceConfiguration, getServiceInfo, isAdminServletUseServletOutputStream, isLoggingDebug, isLoggingError, isLoggingInfo, isLoggingTrace, isLoggingWarning, isRunning, logDebug, logDebug, logDebug, logError, logError, logError, logInfo, logInfo, logInfo, logTrace, logTrace, logTrace, logWarning, logWarning, logWarning, nameContextElementBound, nameContextElementUnbound, removeLogListener, reResolveThis, resolveName, resolveName, resolveName, resolveName, sendLogEvent, setAdminServletOutputStreamEncoding, setAdminServletUseServletOutputStream, setLoggingDebug, setLoggingError, setLoggingInfo, setLoggingTrace, setLoggingWarning, setNucleus, setServiceInfo, startService, stopService
 
Methods inherited from class atg.nucleus.logging.VariableArgumentApplicationLoggingImpl
vlogDebug, vlogDebug, vlogDebug, vlogDebug, vlogDebugTrace, vlogError, vlogError, vlogError, vlogError, vlogInfo, vlogInfo, vlogInfo, vlogInfo, vlogTrace, vlogTrace, vlogTrace, vlogTrace, vlogWarning, vlogWarning, vlogWarning, vlogWarning
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

CLASS_VERSION

public static java.lang.String CLASS_VERSION
Class version string


EXTRA_PARAM_QUALIFIERSERVICE

public static final java.lang.String EXTRA_PARAM_QUALIFIERSERVICE
See Also:
Constant Field Values

mPricingCalculatorServices

protected java.util.Map mPricingCalculatorServices
Cache of calculator names to calculator service instances


mGlobalPromotions

protected java.util.List mGlobalPromotions
Constructor Detail

PricingEngineService

public PricingEngineService()
Method Detail

isUseMerge

public boolean isUseMerge()
If true then this flag turns on an efficient merge algorithm to merge profile and global promotions. If false then the standard java sorting algorithm will be used instead to combine the lists.

If the number of profile based promotions is typically very large it may be more efficient to disable this flag. Defaults to true.

Returns:
useMerge boolean

setUseMerge

public void setUseMerge(boolean pUseMerge)

getCalculatorTypeCalculators

public ServiceMap getCalculatorTypeCalculators()

setCalculatorTypeCalculators

public void setCalculatorTypeCalculators(ServiceMap pCalculatorTypeCalculators)

getPricingModelEvaluationVetoers

public PricingModelEvaluationVetoer[] getPricingModelEvaluationVetoers()

setPricingModelEvaluationVetoers

public void setPricingModelEvaluationVetoers(PricingModelEvaluationVetoer[] pPricingModelEvaluationVetoers)

getPricingModelHolderVetoers

public PricingModelHolderVetoer[] getPricingModelHolderVetoers()

setPricingModelHolderVetoers

public void setPricingModelHolderVetoers(PricingModelHolderVetoer[] pPricingModelHolderVetoers)

getQualifierService

public Qualifier getQualifierService()

setQualifierService

public void setQualifierService(Qualifier pQualifierService)

getPromotionItemDescriptors

public RepositoryItemDescriptor[] getPromotionItemDescriptors()
Returns the promotion item descriptors


setPromotionTools

public void setPromotionTools(PromotionTools pPromotionTools)
Sets property PromotionTools


getPromotionTools

public PromotionTools getPromotionTools()
Returns property PromotionTools


setPricingTools

public void setPricingTools(PricingTools pPricingTools)
Sets property PricingTools


getPricingTools

public PricingTools getPricingTools()
Returns property PricingTools


setScheduler

public void setScheduler(Scheduler pScheduler)
Sets property Scheduler


getScheduler

public Scheduler getScheduler()
Returns property Scheduler


setUpdateSchedule

public void setUpdateSchedule(Schedule pUpdateSchedule)
Sets property UpdateSchedule


getUpdateSchedule

public Schedule getUpdateSchedule()
Returns property UpdateSchedule


setDefaultLocale

public void setDefaultLocale(java.util.Locale pDefaultLocale)
Sets property DefaultLocale


getDefaultLocale

public java.util.Locale getDefaultLocale()
Returns property DefaultLocale


getGlobalPromotions

public java.util.List getGlobalPromotions()
Returns property GlobalPromotions


setPriceInfoClass

public void setPriceInfoClass(java.lang.Class pPriceInfoClass)
Sets property PriceInfoClass


getPriceInfoClass

public java.lang.Class getPriceInfoClass()
Returns property PriceInfoClass


setPricingModelComparator

public void setPricingModelComparator(java.util.Comparator pPricingModelComparator)
Sets property PricingModelComparator


getPricingModelComparator

public java.util.Comparator getPricingModelComparator()
Returns property PricingModelComparator


setClosenessQualifierEvaluator

public void setClosenessQualifierEvaluator(ClosenessQualifierEvaluator pClosenessQualifierEvaluator)
Component that evaluates if an order or item meets the closenessQualifiers for relevant promotions

Parameters:
pClosenessQualifierEvaluator - the component that evaluates if an order or item meets the closenessQualifiers for relevant promotions

getClosenessQualifierEvaluator

public ClosenessQualifierEvaluator getClosenessQualifierEvaluator()
Returns:
the component that evaluates if an order or item meets the closenessQualifiers for relevant promotions

setPricingModelProperties

public void setPricingModelProperties(PricingModelProperties pPricingModelProperties)

getPricingModelProperties

public PricingModelProperties getPricingModelProperties()
Returns a bean that contains properties for a PricingModel


setProfileProperties

public void setProfileProperties(java.lang.String[] pProfileProperties)

getProfileProperties

public java.lang.String[] getProfileProperties()
The profile properties to inspect for pricing models


setPromotionsRepository

public void setPromotionsRepository(Repository pPromotionsRepository)

getPromotionsRepository

public Repository getPromotionsRepository()
The repository which contains the promotions


setPromotionItemTypes

public void setPromotionItemTypes(java.lang.String[] pPromotionItemTypes)
Sets property PromotionItemTypes


getPromotionItemTypes

public java.lang.String[] getPromotionItemTypes()
Returns property PromotionItemTypes


setGlobalPromotionsQuery

public void setGlobalPromotionsQuery(RqlStatement pGlobalPromotionsQuery)
Sets property GlobalPromotionsQuery


getGlobalPromotionsQuery

public RqlStatement getGlobalPromotionsQuery()
Returns property GlobalPromotionsQuery


setGlobalPromotionsSchedulableDate

public void setGlobalPromotionsSchedulableDate(CurrentDate pGlobalPromotionsSchedulableDate)
Sets property GlobalPromotionsSchedulableDate


getGlobalPromotionsSchedulableDate

public CurrentDate getGlobalPromotionsSchedulableDate()
Returns property GlobalPromotionsSchedulableDate


setAlwaysLoadGlobalPromotions

public void setAlwaysLoadGlobalPromotions(boolean pAlwaysLoadGlobalPromotions)
Sets whether or not to always load the global promotions rather than using the cache.

Setting this property to true will ensure the global promotions are loaded from the repository if they haven't expired by the current date and time, i.e. it will not use the globalPromotionsSchedulableDate in the query.

This should be set to true for preview to allow merch users to see the latest promotion changes (see COMMERCE-168402).

Parameters:
pAlwaysLoadGlobalPromotions - boolean defaults to false

getAlwaysLoadGlobalPromotions

public boolean getAlwaysLoadGlobalPromotions()
Gets whether or not to always load the global promotions rather than using the cache.

If this property is true it will ensure the global promotions are loaded from the repository if they haven't expired by the current date and time, i.e. it will not use the globalPromotionsSchedulableDate in the query.

This would be set to true for preview to allow merch users to see the latest promotion changes (see COMMERCE-168402).

Returns:
boolean

findGlobalPromotions

protected java.util.List findGlobalPromotions()
Return the set of global promotions for this pricing engine


loadGlobalPromotions

public void loadGlobalPromotions()
                          throws PricingException
Find and load the global promotions. The global promotions are found through the method findGlobalPromotions. The list returned by this operation is made available through the globalPromotions property.

Throws:
PricingException

doStartService

public void doStartService()
                    throws ServiceException
Loads the global promotions.

Overrides:
doStartService in class GenericService
Throws:
ServiceException - if the Service had a problem starting up

doStopService

public void doStopService()
                   throws ServiceException
Stops the schedule for updating the global promotions

Overrides:
doStopService in class GenericService
Throws:
ServiceException - if an error occurred during the operation

performScheduledTask

public void performScheduledTask(Scheduler pScheduler,
                                 ScheduledJob pJob)
Reload the global promotions

Specified by:
performScheduledTask in interface Schedulable
Parameters:
pScheduler - calling the job
pJob - the ScheduledJob

getCurrencyCode

protected java.lang.String getCurrencyCode(java.util.Locale pLocale)
Return the currency code which should be used for the given locale. If the supplied locale parameter is null, then use the default locale.


getPricingCurrencyCode

protected java.lang.String getPricingCurrencyCode(RepositoryItem pProfile,
                                                  java.lang.String pPriceListPropertyName,
                                                  boolean pUseDefaultPriceList,
                                                  java.util.Map pExtraParameters,
                                                  java.util.Locale pLocale)
Gets the locale currency code for pricing. Gets the locale to use from PricingTools.getPricingLocale method which will try to get it from a price list if available.

Parameters:
pProfile - RepositoryItem profile
pPriceListPropertyName - String name of the price list property in the profile
pUseDefaultPriceList - boolean, true to use the default price list if needed
pExtraParameters - Optional map of extra parameters which may include the price list
pLocale - Locale to use if no price list or default locale is found
Returns:
String currency code to use for this pricing locale

createPriceInfo

protected AmountInfo createPriceInfo()
                              throws PricingException
Returns a new instance of the of the class defined through the priceInfoClass property.

Throws:
PricingException - if there was a problem instantiating the object

getInitialPromotions

protected java.util.List getInitialPromotions(RepositoryItem pProfile)
                                       throws PricingException
Helper method that returns a List of promotions for given a Profile. This is used by the out-of-the-box implementations of the PricingEngine interface for the getPromotions method. Extensions of the various PricingEngines will override the getPromotions method to behave as business requirments dictate.

Parameters:
pProfile - The user's profile from which the engine will extract promotions
Returns:
List of RepositoryItems which represent promotions for use in pricing. The list which is a combination of the global and user specific promotions.
Throws:
PricingException

removeExpiredPromotions

protected java.util.List removeExpiredPromotions(java.util.List<RepositoryItem> pPricingModels)
Builds up a new list of promotions, none of which will be expired.

Parameters:
pPricingModels - original list of promotions to work with
Returns:
a newly created list of valid promotions

addPromotionToList

public void addPromotionToList(RepositoryItem pPromotion,
                               java.util.List pPricingModels,
                               RepositoryItem pProfile)
Adds a new promotion to the list of pricing models.

Parameters:
pPromotion -
pPricingModels -
pProfile -
Throws:
PricingException
See Also:
checkAndAddPromotions(Collection, Collection, Date, RepositoryItem)

getUserOnlyPromotions

public java.util.List getUserOnlyPromotions(RepositoryItem pProfile)
                                     throws PricingException
Throws:
PricingException

getPromotions

public java.util.List getPromotions(RepositoryItem pProfile)
                             throws PricingException
Throws:
PricingException

checkAndAddPromotions

protected void checkAndAddPromotions(java.util.Collection pSource,
                                     java.util.Collection pDestination,
                                     java.util.Date pNow,
                                     RepositoryItem pProfile)
Receives a collection of promotionStatus objects which are cycled through to determine which of these promotions has expired, and which should be added to the pricingModels used.


applyPromotionProcessing

protected void applyPromotionProcessing(atg.commerce.pricing.PromotionProcessingComponent[] pPromotionProcessingComponents,
                                        java.util.Collection<RepositoryItem> pPricingModels,
                                        PricingContext pPricingContext,
                                        java.util.Map pExtraParameters)
                                 throws PricingException
Apply the given promotion processing components.

Parameters:
pPromotionProcessingComponents - Array of PromotionProcessingComponent's to invoke
pPricingContext - PricingContext
pPricingModels - Collection of PricingModel to process
pExtraParameters - Map of extra parameters, may be null
Throws:
PricingException

prepareEvaluationVetoers

protected java.util.List<atg.commerce.pricing.PricingEngineService.ValidEvaluationVetoer> prepareEvaluationVetoers(PricingEngineService pPricingEngine,
                                                                                                                   PricingContext pPricingContext,
                                                                                                                   java.util.Map pExtraParametersMap)

Iterates over the configured pricing model evaluation vetoers and calls the prepare method for each.

If a non null object is returned then it is added to the return list of ValidEvaluation Vetoer objects.

Parameters:
pPricingEngine - PricingEngineService that called this vetoer
pPricingContext - PricingContext for this pricing operation
pExtraParametersMap - Map of extra parameters if needed
Returns:
List of ValidVetoer for those vetoers that are valid.

vetoPromotionsForEvaluation

protected java.util.Collection<RepositoryItem> vetoPromotionsForEvaluation(PricingContext pPricingContext,
                                                                           java.util.Map pExtraParametersMap,
                                                                           java.util.Collection<RepositoryItem> pPricingModels)
Validates the passed in promotions against the configured vetoers for evaluation.

Parameters:
pPricingContext - PricingContext for pricing
pExtraParametersMap - Map of extra parameters if needed
pPricingModels - Collection of promotion items
Returns:
Collection of promotion items valid for evaluation

prepareHolderVetoers

protected java.util.List<atg.commerce.pricing.PricingEngineService.ValidHolderVetoer> prepareHolderVetoers(PricingEngineService pPricingEngine,
                                                                                                           RepositoryItem pProfile)

Iterates over the configured pricing model holdr vetoers and calls the prepare method for each.

If a non null object is returned then it is added to the return list of ValidHolderVetoer objects.

Parameters:
pPricingEngine - PricingEngineService that called this vetoer
pProfile - RepositoryItem profile for the holder session
Returns:
List of ValidVetoer for those vetoers that are valid

checkAndMergePromotions

protected void checkAndMergePromotions(java.util.Collection pSource,
                                       java.util.Collection pCheckedMerge,
                                       java.util.Collection pDestination,
                                       java.util.Date pNow,
                                       RepositoryItem pProfile)
Merges together two lists of promotions in the correct sorted order.
This is typically the global and user promotions.
Promotions are vetoed as required.

Note: It is assumed that pCheckedMerge has already been checked e.g. via checkAndAddPromotions.

Parameters:
pSource - - Source collection. It should be pre-sorted but this method will check expiry dates.
pCheckedMerge - Collection to merge into the source. It should be pre-sorted and pre-checked.
pDestination - - Destination Collection for the merge.
pNow - - today
pProfile - - RepositoryItem profile

addPromotion

protected boolean addPromotion(RepositoryItem pPromotion,
                               java.util.Date pNow)
This method determines if the given promotion should qualify for use in determining pricing.

Parameters:
pPromotion - the promotion that should be verified
pNow - the current date
Returns:
true if the promotion should be added to the list of promotions which can be used for pricing

isValidItemDescriptor

protected boolean isValidItemDescriptor(RepositoryItem pPromotion)
This method determines if the given promotion's item descriptor matches that of the PricingEngine configured item descriptors, promotionItemDescriptors

Parameters:
pPromotion - the promotion that should be verified
Returns:
true if the promotion matches any of the pricing engine's configured item descriptors

checkPromotionExpiration

protected boolean checkPromotionExpiration(RepositoryItem pPromotion,
                                           java.util.Date pNow)
Return true if the promotion has expired and should be removed from the user's collection of active promotions

Parameters:
pPromotion - the promotion that should be verified
pNow - the current date

expirePromotion

protected void expirePromotion(RepositoryItem pPromotion,
                               RepositoryItem pProfile)
Called if checkPromotionExpiration determines that a promotion has expired and should no longer be active. Currently this method calls PromotionTools.expirePromotion.

Parameters:
pProfile - the profile for which a promotion has expired
pPromotion - the promotion which has expired

getCalculatorTypes

public CalculatorInfo[] getCalculatorTypes()
Gets the information for the calculators this pricing engine supports

Returns:
CalculatorInfo[]

getCalculatorForCalculatorType

public java.lang.Object getCalculatorForCalculatorType(java.lang.String pCalculatorType)
                                                throws PricingException
Returns the calculator service for the given type.

Parameters:
pCalculatorType - String type
Returns:
Calculator reference
Throws:
PricingException - if a non-null calculator could not be found

getCalculator

protected java.lang.Object getCalculator(RepositoryItem pPricingModel)
                                  throws PricingException
Return the pricing calculator that should be used for the given promotion. Looks in member variable Map mPricingCalculatorServices for the PricingCalculator refered to by the PricingModel parameter. If the PricingCalculator is not in the Map, it is resolved in Nucleus and then stored in the Map for quick look up.

Parameters:
pPricingModel - The promotion to examine for its PricingCalculator
Returns:
The PricingCalculator service found for the promotion
Throws:
PricingException

resolveCalculator

protected java.lang.Object resolveCalculator(java.lang.String pCalcServiceString)
                                      throws PricingException
Resolves the passed in calculator service nucleus path to a service reference. The method uses a cache for efficiency.

Parameters:
pCalcServiceString - String nucleus path to the calculator service
Returns:
Object service reference
Throws:
PricingException - if the service could not be resolved

getAdjustmentPricingModels

protected java.util.List getAdjustmentPricingModels(AmountInfo pPriceInfo)
Gets the pricingModels from the priceInfo's "adjustments" property These are the promotions the order has qualified for, and should not be evaluated for closeness

Parameters:
pPriceInfo - the priceInfo object
Returns:
a List of the pricingModels from the priceInfo's adjustments

getQualifierService

public Qualifier getQualifierService(java.util.Map pExtraParameters)
Gets the Qualifier service to use. First checks the extra parameters map for a Qualifier object with the key EXTRA_PARAM_QUALIFIERSERVICE. If no Qualifier is in the map then it gets the default Qualifier this service is configured with.

Parameters:
pExtraParameters - Map of optional extra parameters. May be null.
Returns:
Qualifier to use.
See Also:
PromotionTools.getQualifierService(RepositoryItem, Map, Qualifier)

getQualifierService

public Qualifier getQualifierService(RepositoryItem pPricingModel,
                                     java.util.Map pExtraParameters)
Gets the Qualifier service to use. First checks the extra parameters map for a Qualifier object with the key EXTRA_PARAM_QUALIFIERSERVICE. If no Qualifier is in the map then it checks the promotion item 'qualifierService' property. If still no Qualifier then it uses the default Qualifier this service is configured with.

Parameters:
pPricingModel - RepositoryItem promotion item to check. May be null.
pExtraParameters - Map of optional extra parameters. May be null.
Returns:
Qualifier to use.
See Also:
PromotionTools.getQualifierService(RepositoryItem, Map, Qualifier)

didPromotionApply

protected boolean didPromotionApply(RepositoryItem pPricingModel,
                                    AmountInfo pPriceInfo,
                                    java.util.Map pExtraParameters)
Returns true if the promotion applied, false otherwise. A promotion can be deemed to have been applied if it is found to have caused a pricing adjustment.

Parameters:
pPricingModel - the promotion currently being evaluated
pPriceInfo - pricing information for the current item
pExtraParameters - contains the tracking collections
Returns:
return true if the promotion applied, false otherwise

setupStackingRuleCollections

protected void setupStackingRuleCollections(PricingContext pPricingContext,
                                            java.util.Map pExtraParameters)
                                     throws PricingException
Sets up the stacking rule info collections: 1. the collections are created if they don't exist. 2. the collections are populated with information relating to previously applied promotions 3. generate messages relating to previously applied promotions

Parameters:
pPricingContext - PricingContext for pricing
pExtraParameters - where the tracking collections should be created
Throws:
PricingException - if something went wrong

generateStackingRuleInfo

protected void generateStackingRuleInfo(PricingContext pPricingContext,
                                        java.util.Map<RepositoryItem,RepositoryItem> pIncludedPromotions,
                                        java.util.Map<RepositoryItem,RepositoryItem> pExcludedPromotions,
                                        java.util.Map<RepositoryItem,RepositoryItem> pExcludedStackingRules,
                                        java.util.Map<RepositoryItem,java.lang.Integer> pStackingRuleUsage,
                                        java.util.Map<java.lang.String,atg.web.messaging.UserMessage> pStackingRuleAppMessages,
                                        java.util.Map pExtraParameters)
                                 throws PricingException
Generates stacking rule tracking information and stacking rule exclusion messages based on the information linked to the applied promotions from pricing engines that have not been processed.

Parameters:
pPricingContext - PricingContext for pricing
pIncludedPromotions - promotions to be included
pExcludedPromotions - promotions to be excluded
pExcludedStackingRules - stacking rules to be excluded
pStackingRuleUsage - stacking rule usage
pStackingRuleAppMessages - collection of messages to be sent
pExtraParameters - where the tracking collections should be created
Throws:
PricingException - if something went wrong

wasPromotionSkipped

protected boolean wasPromotionSkipped(PricingContext pPricingContext,
                                      RepositoryItem pPricingModel,
                                      java.util.Map<RepositoryItem,RepositoryItem> pIncludedPromotions,
                                      java.util.Map<RepositoryItem,RepositoryItem> pExcludedPromotions,
                                      java.util.Map<RepositoryItem,RepositoryItem> pExcludedStackingRules,
                                      java.util.Map<RepositoryItem,java.lang.Integer> pStackingRuleUsage,
                                      java.util.Map<java.lang.String,atg.web.messaging.UserMessage> pStackingRuleAppMessages,
                                      java.util.Map pExtraParameters)
                               throws PricingException
This method determines if a promotion was skipped, based on the stacking rule exclusion. It returns true if the promotion was skipped and false otherwise. If a promotion is skipped, an exclusion message may or may not be generated. Messages are only sent that are relevant to what a user has in their shopping cart.

Parameters:
pPricingModel - a promotion
pPricingContext - PricingContext for pricing
pIncludedPromotions - promotions to be included
pExcludedPromotions - promotions to be excluded
pExcludedStackingRules - stacking rules to be excluded
pStackingRuleUsage - stacking rule usage
pStackingRuleAppMessages - collection of messages to be sent
pExtraParameters - extra parameters
Returns:
true if the promotion is to be skipped, false otherwise
Throws:
PricingException - if something went wrong

updateStackingRuleTracking

protected void updateStackingRuleTracking(RepositoryItem pPricingModel,
                                          java.util.Map<RepositoryItem,RepositoryItem> pIncludedPromotions,
                                          java.util.Map<RepositoryItem,RepositoryItem> pExcludedPromotions,
                                          java.util.Map<RepositoryItem,RepositoryItem> pExcludedStackingRules,
                                          java.util.Map<RepositoryItem,java.lang.Integer> pStackingRuleUsage,
                                          java.util.Map pExtraParameters)
Updates the stacking rule tracking information, based upon the details relating to the applied promotion.

Parameters:
pPricingModel - the applied promotion
pIncludedPromotions - promotions to be included
pExcludedPromotions - promotions to be excluded
pExcludedStackingRules - stacking rules to be excluded
pStackingRuleUsage - stacking rule usage
pExtraParameters - contains the tracking collections

skipPromotion

protected java.lang.Object[] skipPromotion(PricingContext pPricingContext,
                                           RepositoryItem pPricingModel,
                                           java.util.Map<RepositoryItem,RepositoryItem> pIncludedPromotions,
                                           java.util.Map<RepositoryItem,RepositoryItem> pExcludedPromotions,
                                           java.util.Map<RepositoryItem,RepositoryItem> pExcludedStackingRules,
                                           java.util.Map<RepositoryItem,java.lang.Integer> pStackingRuleUsage,
                                           java.util.Map pExtraParameters)
Determines whether or not the given promotion should not be applied. This can be determined by inspecting the stacking rule tracking information. If a promotion is to be skipped, an object array will be returned. The array will contain the following pieces of information: 1. message identifier 2. a localized message outlining why the promotion was skipped 3. id of the promotion to be skipped 4. id of the promotion that caused this one to be skipped

Parameters:
pPricingContext - PricingContext for pricing
pPricingModel - the promotion currently being evaluated
pIncludedPromotions - promotions to be included
pExcludedPromotions - promotions to be excluded
pExcludedStackingRules - stacking rules to be excluded
pStackingRuleUsage - stacking rule usage
pExtraParameters - contains the tracking collections
Returns:
an array of information relating to why the promotion was skipped, otherwise null if this promotion should not be skipped

getStackingRuleOrderLimitReachedMessageIdentifier

protected java.lang.String getStackingRuleOrderLimitReachedMessageIdentifier()
Value for stacking rule order limit reached message identifier.

Returns:
message identifier

getStackingRulePromotionExcludedMessageIdentifier

protected java.lang.String getStackingRulePromotionExcludedMessageIdentifier()
Value for stacking rule promotion excluded message identifier.

Returns:
message identifier

getAppliedPromotions

protected java.util.List<RepositoryItem> getAppliedPromotions(AmountInfo pPriceInfo)
Returns a list of applied promotions for the given price info.

Parameters:
pPriceInfo - the price info from which to extract all applied promotions
Returns:
a list of promotions that have applied

createStackingRuleExclusionMessage

protected void createStackingRuleExclusionMessage(java.lang.Object[] pSkippedPromotionDetails,
                                                  java.util.Map<java.lang.String,atg.web.messaging.UserMessage> pStackingRuleAppMessages,
                                                  RepositoryItem pPricingModel,
                                                  PricingContext pPricingContext,
                                                  java.util.Map pExtraParameters)
                                           throws PricingException
Creates a stacking rule exclusion message, if applicable. Note that the default implementation of didPromotionQualify() will return true, meaning that messages will be generated whether a promotion qualified or not. didPromotionQualify() should be overridden in the pricing engines to compute a more accurate answer.

Parameters:
pSkippedPromotionDetails - details of a skipped/excluded promotion
pStackingRuleAppMessages - collection of messages to be sent
pPricingModel - promotion being evaluated
pPricingContext - pricing context
pExtraParameters - extra parameters
Throws:
PricingException - if something went wrong

getLocale

protected java.util.Locale getLocale(PricingContext pPricingContext,
                                     java.util.Map pExtraParameters)
Gets the locale to use. Usually the users locale.

Parameters:
pPricingContext - PricingContext which may contain the locale
pExtraParameters - Map of extra parameters (optional)
Returns:
Locale

didPromotionQualify

protected boolean didPromotionQualify(RepositoryItem pPricingModel,
                                      PricingContext pPricingContext,
                                      java.util.Map pExtraParameters)
                               throws PricingException
Returns true if a promotion qualified, false otherwise.

The default for this method is true. This method should be overridden in the pricing engines to compute a more accurate answer.

Parameters:
pPricingModel - promotion to check
pPricingContext - PricingContext
pExtraParameters - Map of extra parameters, may be null
Returns:
true if the promotion qualified, false otherwise
Throws:
PricingException - if something went wrong

getPriceInfoDetails

protected java.util.List<AmountInfo> getPriceInfoDetails(PricingContext pPricingContext,
                                                         java.util.Map pExtraParameters)
Returns price info details.

Parameters:
pPricingContext - PricingContext
pExtraParameters - Map of extra parameters, may be null
Returns:
true if the promotion qualified, false otherwise
Throws:
PricingException - if something went wrong

pricingComplete

protected void pricingComplete(java.util.Map pExtraParameters)
Method that keeps a track of the pricing engines that have completed pricing. Should be called by each engine when pricing is complete.

Parameters:
pExtraParameters - Map of extra parameters, may be null

createEmptyItemPriceInfo

protected ItemPriceInfo createEmptyItemPriceInfo()
Creates a basic ItemPriceInfo to use for commerce items that have not yet been priced but which are being referenced outside of item pricing, e.g. to price shipping.

Care should be taken to only use this ItemPriceInfo temporarily for pricing and not to persist it with the order.

Returns:
ItemPriceInfo

resetEmptyItemPriceInfos

protected void resetEmptyItemPriceInfos(Order pOrder)
Utility method to revert item price infos back to null if they were temporarily set to use the EmptyItemPriceInfo for pricing.

Parameters:
pOrder - Order containing commerce items