Dynamic Pricing Configuration
Dynamic Pricing enables you to control pricing for SKUs based on external criteria specifc to a given request instead of simply reading from the BLC_SKU table. For example, you may have location based pricing determined by a user's currently selected store.
This pricing model is based on ThreadLocal attributes that are set up in a filter in the request and then utilized later.
The first step is to create our filter that will add certain attributes to the current request's sku pricing considerations
@Component("myDynamicSkuPricingFilter")
public class MyDynamicSkuPricingFilter extends AbstractDynamicSkuPricingFilter {
@Resource(name="myDynamicSkuPricingService")
protected DynamicSkuPricingService skuPricingService;
@Override
public DynamicSkuPricingService getDynamicSkuPricingService(ServletRequest arg0) {
return skuPricingService;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public HashMap getPricingConsiderations(ServletRequest request) {
HashMap pricingConsiderations = new HashMap();
// Put some attribute into this map for use. For example, the current
// customer or the currently selected store
return pricingConsiderations;
}
}
Secondly, you will need to implement the DynamicSkuPricingService
interface. Here is a sample implementation
@Service("myDynamicSkuPricingService")
public class MyDynamicSkuPricingServiceImpl implements DynamicSkuPricingService {
@Override
public DynamicSkuPrices getSkuPrices(Sku sku, @SuppressWarnings("rawtypes") HashMap skuPricingConsiderations) {
Money retailPrice;
Money salePrice;
// Code here to determine what the retail price should be based on the
// current sku and the skuPricingConsiderations
DynamicSkuPrices prices = new DynamicSkuPrices();
prices.setRetailPrice(retailPrice);
prices.setSalePrice(salePrice);
return prices;
}
}
Lastly, we need to instruct the application to use our filter.
<filter>
<filter-name>dynamicSkuPricingFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>myDynamicSkuPricingFilter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>dynamicSkuPricingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
And there you go -- any time you call .getPrice() on a Sku, it will be returning your dynamically calculate price!