Transcript Slide 1

E-commerce Scenarios
Partners’ Webinar
10/25/2012
Karol Jarkovsky
Solution Architect
[email protected]
Agenda
1. Customization Model Overview
2. Bundling Product with Custom Data
3. Customization Scenarios
• DEMO:
• DEMO:
• DEMO:
Flexible shipping,
Multiple pricing level per SKU
Shared membership
Customization Model
•
Full details available as blog and video on DevNet, and in the Developer’s Guide,
<XYZ>InfoProvider.cs
UserInfoProvider.cs
public static
ProviderObject
public static
ProviderObject
public static
<methodName>()
public static
GetUserInfo(int userId)
protected virtual
<methodName>Internal()
protected virtual
GetUserInfoInternal
(int userId)
Custom Data Bundling: CustomData
Database
COM_ShoppingCartSKU [Table]
CartItemCustomData [Column]
<customdata>
<mycustomvalue3>CME Group</mycustomvalue3>
<mycustomvalue2>25.55</mycustomvalue2>
<mycustomvalue4>35.47</mycustomvalue4>
<mycustomvalue1>Sample value 1</mycustomvalue1>
</customdata>
COM_ShoppingCart [Table]
ShoppingCartCustomData [Column]
<customdata>
<mycustomvalue1>CME Group</mycustomvalue1>
<mycustomvalue2>Sample value 1</mycustomvalue2>
</customdata>
COM_OrderItem [Table]
OrderItemCustomData [Column]
<customdata>
<mycustomvalue3>CME Group</mycustomvalue3>
<mycustomvalue2>25.55</mycustomvalue2>
<mycustomvalue4>35.47</mycustomvalue4>
<mycustomvalue1>Sample value 1</mycustomvalue1>
</customdata>
COM_Order [Table]
OrderCustomData [Column]
<customdata>
<mycustomvalue1>CME Group</mycustomvalue1>
<mycustomvalue2>Sample value 1</mycustomvalue2>
</customdata>
API
protected override ShoppingCartItemInfo AddShoppingCartItemInternal(ShoppingCartInfo cart, ShoppingCartItemParameters itemParams)
{
// Add item to the shopping cart
ShoppingCartItemInfo item = base.AddShoppingCartItemInternal(cart, itemParams);
if (item != null)
{
// Accepts simple data values
item.CartItemCustomData["MyCustomValue1"] = "Sample value 1";
item.CartItemCustomData["MyCustomValue2"] = 25.55;
// int myVal = (int)item.CartItemCustomData["MyCustomValue2"];
// Hashtable myValues = item.CartItemCustomData.ConvertToHashtable();
}
return item;
}
Custom Data Bundling: RelatedData
API
// Registering for event fired when lazy-loaded RelatedData property is accessed
SKUInfo.TYPEINFOSKU.OnLoadRelatedData += new TypeInfo.ObjectLoadRelatedDataEventHandler(TYPEINFOSKU_OnLoadRelatedData);
protected object TYPEINFOSKU_OnLoadRelatedData(BaseInfo infoObj)
{
CustomDataContainer result = null;
SKUInfo prod = (infoObj as SKUInfo);
if (prod != null)
{
result = new CustomDataContainer() { MarketPriceSourceName = "CME Group", MarketPriceValue = 35.47 };
}
return result;
}
/// <summary>
/// Summary description for CustomDataContainer
/// </summary>
public class CustomDataContainer : IDataContainer
{
// Implementation of IDataContainer members
}
protected override ShoppingCartItemInfo AddShoppingCartItemInternal(ShoppingCartInfo cart, ShoppingCartItemParameters itemParams)
{
// Add item to the shopping cart
ShoppingCartItemInfo item = base.AddShoppingCartItemInternal(cart, itemParams);
if (item != null)
{
// Accepts simple data values
item.CartItemCustomData["MyCustomValue3"] = item.SKU.GetValue("MarketPriceSourceName");
item.CartItemCustomData["MyCustomValue4"] = item.SKU.GetValue("MarketPriceValue");
}
return item;
}
Scenarios
DEMO: Flexible shipping
Scenario
•
Instead of flat shipping fee specified for shipping
option you want to apply different shipping costs per
product (e.g. based on dimensions),
•
Total shipping costs should be discounted or
completely waved if certain numbers of products are
added to the cart
DEMO: Flexible shipping
API
CMS.Ecommerce.ShippingOptionInfoProvider
ApplyShippingFreeLimit[Internal](double shipping, double totalPrice,
double siteStoreFreeLimit)
o Evaluates store free-shipping limit against total price and return shipping costs,
CalculateShipping[Internal](ShoppingCartInfo cartObj)
o Evaluates total shipping costs for whole cart (all items),
o To implement custom shipping cost calculation you need to override this method,
CalculateShippingTax[Internal](ShoppingCartInfo cartObj)
o Evaluates taxes for total shipping costs,
IsShippingNeeded[Internal](ShoppingCartInfo cart)
o Indicates whether the shipping is necessary for given shopping cart,
o Returns TRUE if any of the products in the cart requires shipping (has Needs shipping setting enabled),
o Bundled items are not included within evaluation.
Scenarios
DEMO: Multiple pricing level per SKU
Scenario
•
Instead of single (flat) price you want to display price
customized for current visitor,
•
Each product will have two price variants – variant A
representing full price and variant B representing
special offer price for new customers,
• New visitor is unknown customer,
•
Also, if visitor is exiting customer you want to add 10%
discount on any product they already purchased (in last
30 days)
DEMO: Multiple pricing level per SKU
DEMO: Multiple pricing level per SKU
API
CMS.Ecommerce.SKUInfoProvider
CalculateSKUDiscount[Internal](SKUInfo sku, ShoppingCartInfo cart, IItemDiscount discount,
double priceAfterDiscount)
o Calculates discount for given SKU reflecting given discount information,
o Performs actual calculation using price with any previous discounts applied,
GetSKUDiscounts[Internal](SKUInfo sku, ShoppingCartInfo cart, bool forCart)
o Returns list of discounts that are then applied to the base price in order they are included in the list,
o Method that is performing calculation is CalculateSKUDiscount[Internal]() above,
GetSKUPrice[Internal](SKUInfo sku, ShoppingCartInfo cart)
GetSKUPrice[Internal](SKUInfo sku, ShoppingCartInfo cart, string column)
GetSKUPrice[Internal](SKUInfo sku, ShoppingCartInfo cart, bool discounts, bool taxes, bool forCart,
string column)
o Returns price for given product,
o Customizations should be done by overwriting highlighted (bold) override as both methods left are internally calling this method,
Scenarios
DEMO: Shared membership
Scenario
•
You want to assign purchased membership for all users
coming from the same company/organization,
•
In other words instead of single-user membership
product you want to allow buying shared membership
DEMO: Shared membership
API
CMS.Ecommerce.OrderInfoProvider
CreateEmailMacroResolver[Internal](ShoppingCartInfo cartObj)
CMS.Ecommerce.ShoppingCartInfoProvider.GetShoppingCartResolver[Internal](ShoppingCartInfo cart,
bool specialMacros)
o CreateEmailMacroResolver[Internal]() is called only from
OrderInfoProvider.SendEmailNotification[Internal]()
o If you want to add resolver data available across whole E-commerce module (not just e-mail templates) you need to customize
CMS.Ecommerce.ShoppingCartInfoProvider.GetShoppingCartResolver[Internal](),
o CreateEmailMacroResolver[Internal]() is calling this method internally to get base resolver,
ProcessOrderIsPaidChangeInternal(OrderInfo oi)
o Raised when order is paid status changes (automatically or manually from the UI) ,
o Handles alternative product types (e-product, membership) and sends out e-mail notifications,
o Modify if you want to send additional notifications or so, however e-product processing is customized through separate methods
(below),
ProcessMembership[Internal](OrderInfo oi, OrderItemInfo oii, SKUInfo skui, UserInfo ui,
DateTime now)
ProcessEProduct[Internal](OrderInfo oi, OrderItemInfo oii, SKUInfo skui, DateTime now)
o Called from ProcessOrderIsPaidChange[Internal]() based on product type,
General
THANK YOU!