Saturday, December 31, 2011
ACC-Workflows : ATG
Workflows are graphical tools that are designed to help you manage
the online automation of many types of business process or activity. Like
scenarios, workflows track the progress of a subject through a specific
process. In the case of scenarios, the subject is a site visitor, and the
process is a series of events that define some form of activity on or related
to your Web site. Workflows use a similar concept, except the subject is an
entity such as a customer support case or a sales inquiry, and the process is a
series of events that define the lifecycle of that entity. For example, you
could design a workflow in which the subject is an online expense report and
the stages of its lifecycle (the elements in the workflow) are submission,
approval, and reimbursement.
The following illustration shows a workflow for an expense report.
(Note that the illustration is broken into two parts, but the workflow itself
contains no break.)
This workflow contains two tasks: Submission and Approval. The
Submission task is completed by an employee, and the Approval task is completed
by a manager. If the manager approves the expense report, the Reimburse
Employee custom action is triggered; this action reads relevant information,
such as the employee’s identity and the amount to reimburse, from the expense
report repository, and it initiates the payment. The report’s status property in the repository is then set to “Reimbursed.” If the
manager rejects the expense report, the report’s status is set to “Rejected,”
and the workflow reverts to the Submission task, allowing the employee to
revise his or her expenses.
You design the workflow in the ATG Control Center, and a page
developer sets up any relevant site pages; including any forms necessary for
completion of the different stages of the workflow. In the example of the
expense report, the page developer could create a site page accessible by
employees that includes an online version of a report and also contains a
Submit button; and a page accessible by managers that includes a list of
pending expense reports as well as Approve and Reject buttons.
The key differences between workflows and scenarios can be
summarized as follows:
·
The subjects that progress through scenarios are site visitors;
the subjects that progress through workflows represent other entities such as
documents. (The subjects of scenarios are user profiles, but the subjects of
workflows can be any repository item.)
·
Scenarios are used to track and respond to Web site activities
such as page visit or login events. Workflows are used to track business
activities that are completed either fully or partially through a Web site.
·
Scenarios are frequently used on extranets and commercial Web
sites; workflows are frequently used on intranets or other Web sites that
support a community of users.
·
The subjects progressing through a scenario have no direct
interaction with it (participation in a scenario is completely transparent to
the site visitor). Site users can, however, interact directly with a workflow.
·
Scenarios and workflows are derived from the same base package of
code (atg.process), but
they use different subclasses of this code, and the sets of elements available
for building scenarios and workflows in the ATG Control Center are different.
Important: You can create workflows only if your application developers have
created custom workflow elements for your organization. You cannot create a
workflow from a default set of elements as you can for scenarios. For more
information on this restriction, see Creating a Workflow.
Friday, December 30, 2011
Scheduled Task Example
Overview
There are a few simple things to watch out for when writing
a Scheduled Task in Dynamo. This example can be used as a boiler plate for your
own tasks.
The code shown in gray is specific to this example, so copy
the whole file and simply modify the bits you don't need.
Source Code and Configuration Files
Repeater.java - imagescript.atg.schedule.Repeater
package imagescript.atg.schedule;
import atg.nucleus.GenericService;
import atg.service.scheduler.*;
import atg.servlet.*;
public class Repeater
extends
GenericService
implements Schedulable
{
Schedule mSchedule;
Scheduler
mScheduler;
int mJobId;
String mMessage;
public String
getMessage(){ return mMessage; }
public void
setMessage(String s){ mMessage = s; }
public void
performScheduledTask(Scheduler sch, ScheduledJob job)
{
if(isLoggingDebug())
{
logDebug("Job Name = " + job.getJobName());
logDebug("Job Desc = " + job.getJobDescription());
logDebug("Job Id = " + job.getJobId());
logDebug("Job Source = " + job.getSourceName());
}
if(isLoggingInfo())
{
logInfo(getMessage());
}
}
//Demonstration of
using the value parser to manipulate the
// schedule
programmatically
public String
getScheduleString()
{
String str;
if(getSchedule()
!= null)
{
str =
getSchedule().scheduleString();
}
else
{
str = "No
Schedule Specified";
}
return str;
}
public void
setScheduleString(String s)
{
SchedulePropertyValueParser parser = new SchedulePropertyValueParser();
try
{
setSchedule((Schedule)parser.parsePropertyValue(s, Schedule.class));
}
catch(Exception
e)
{
if(isLoggingError()){ logError(e); }
}
}
public void
setSchedule(Schedule s){ mSchedule = s; }
public Schedule
getSchedule(){ return mSchedule; }
public void
setScheduler(Scheduler s){ mScheduler = s; }
public Scheduler
getScheduler(){ return mScheduler; }
public int
getJobId(){ return mJobId; }
public Repeater()
{
mJobId = 0;
mMessage =
"Default Message";
}
public void
doStartService()
{
startJob();
}
public void
doStopService()
{
stopJob();
}
void restartJob()
{
stopJob();
startJob();
}
void startJob()
{
if(getScheduler()
!= null)
{
if(mJobId == 0)
{
ScheduledJob
job = new ScheduledJob("repeater",
"Demonstrates schedule",
getAbsoluteName(),
getSchedule(),
(Schedulable)this,
ScheduledJob.SCHEDULER_THREAD);
mJobId =
getScheduler().addScheduledJob(job);
}
else
{
if(isLoggingError())
{
logError("Attempted to start job without stopping it first");
}
}
}
else
{
if(isLoggingError())
{
logError("Scheduler not specified");
}
}
}
void stopJob()
{
if(getScheduler() != null)
{
if(mJobId !=
0)
{
getScheduler().removeScheduledJob(mJobId);
mJobId = 0;
}
else
{
if(isLoggingError())
{
logError("Attempted to stop job without starting it first");
}
}
}
else
{
if(isLoggingError())
{
logError("Scheduler not specified");
}
}
}
public boolean
handleRestart(DynamoHttpServletRequest req,
DynamoHttpServletResponse res)
{
restartJob();
return true;
}
}
Repeater.properties
This is an example configuration file for the task
$class=imagescript.atg.schedule.Repeater
$scope=global
schedule=every\ 1\ minute
scheduler=/atg/dynamo/service/Scheduler
How to make sure the job starts automatically with Dynamo
Add your component to one of the inital arrays in an Initial
component. Dynamo has an Initial component on the root /Initial. Usually we
want to create our own Initial component for our application in a sub
directory, /example/Initial and add that component to the /Initial initial
list. Then add your component to your /example/Initial initial components list
Thursday, December 29, 2011
Installing Search : ATG SEARCH
Installing Search
This section describes the
actual installation process of ATG Search.
To install ATG Search:
1.
Download the ATG Search installation executable.
2.
Start the installer.
3.
On the start page, click Next to begin the installation.
4.
Read the license agreement. Select “I accept the terms of the
license agreement” and click Next.
5.
Select Search Administration + Search Engine for the installation
type. Click Next.
Enter an
installation location, or accept the default. Click Next.
6.
Select locations for product icons and shortcuts.
7.
Review your selections, and click Install to begin the
installation.
8.
Enter a Deployment Share folder. This is the scalable, shared
directory you created before beginning the installation.
9.
When the installation is finished, click Done.
Deploy Java code/ ATG components on JBoss
Pretty simple, on a production
environment you start JBoss with its run file and a series of commands, which
then picks up your EAR file from the deployment directory. Which is a fine
process to go through, but what if you’re developing code and you don’t want to
wait the several minutes for a build and deployment – on a windows system this
can take well over 20 minutes to achieve if you’re running things locally.
We want to do hot deployment so that when you make small changes
in your java class/ ATG component you don’t have to rebuild and restart JBoss
each time and you save yourself a lot of time.
We can do this by starting JBoss in the following way:
To avoid building an EAR file each time rather than using
JBoss’s run file (/JBoss/bin/run.bat or run.sh) ATG provides a way to start
JBoss and build the EAR on the fly from your working directory. This means that
you can make changes to JSP’s etc… and see the changes instantly. To do this
from your command prompt/shell go to your ATG home directory (/ATG/ATG22007.1/home/bin/)
and in the bin run this file: StartDynamoOnJBoss.
In order for this to work and hot deployments to work we need to
pass in a few parameters for this to work. Firstly the dynamo server to use –
if you’re using one. Next set the name of the jBoss server using the -c flag.
Then set the modules you want to load so your projects bin/ code source
directory, ATG modules etc… and finally set the most important command -f
-run-in-place which tells jBoss to compile and run the code from your projects
directory rather than look for an EAR file in its deploy directory. So the
start command looks like this:
startDynamoOnJBoss MY_DYNAMO_SERVER_NAME -c
MY_JBOSS_SERVER_NAME -m MYPROJECT.core -f -run-in-place
And thats it. Now you can make changes to your files in Eclipse
and you won’t need to restart jBoss. But there is one last thing – make sure to
set your project in Eclipse to build automatically – you can set this under the
project menu at the top.
ATG Components Examples
/atg/dynamo/service/CurrentDate
Ever need access to the current date from your application? Well then this is the component for you. Properties of this component include year, month, monthName, shortMonthName, dayOfWeek, dayOfWeekName, hour, minute, second and of course date./atg/dynamo/service/random/SecureRandom
The SecureRandom component is a pseudo-random number service. The component extends the java.security.SecureRandom class. Calling the nextDouble() method returns a uniform random number between 0.0 and 1.0. Other methods provide random integers, floats or bytes./atg/dynamo/service/Scheduler
If you need to schedule a component in nucleus to run periodically then the scheduler component can be used. Just register a nucleus component with the scheduler by calling the addScheduledJob() method. Your nucleus component will need to implement the atg.service.schedule.Schedulable interface which contains a single method call performScheduledTask() which is invoked by the scheduler when its time to run./atg/dynamo/service/SMTPEmail
This component can be used to send an email from nucleus. The component implements the atg.service.email.EmailSender interface. Variants of the sendEmailMessage() method allow one to send email to a recipient or group of recipients./atg/dynamo/service/jdbc/JTDataSource
High performance applications require connection pooling. The JTDataSource component provides access to a pool of JDBC connections. This component implements the standard javax.sql.DataSource interface. To checkout a connection from the pool of connections call the getConnection() method. Closing the connection returns the connection to the pool.This just gives you a taste of some of the components available as part the the nucleus component framework. ATG applications such as its flagship eCommerce application provide additional application specific componets such as order management and pricing components. And of course you could always write your own components and integrate them into the framework.
In our next addition we’ll talk about one of the characteristics that make nucleus truely unique: layered configuration.
Wednesday, December 28, 2011
ATG Nucleus An Overview
Nucleus - The heart of the (dark) matter
Nucleus is what lies at the heart of ATG. It’s essentially an object container that manages the lifecycle of POJOs using reflection and dependency injection. It's responsible for instantiating objects and setting their properties based on a very flexible but well defined configuration layering hierarchy using simple properties text files. In ATG world, these objects are called components (basically named JavaBeans and Servlets) that can be linked together via these configuration files by a developer to create an ATG application. Nucleus also maintains a name hierarchy and is responsible for resolving these names to components, which can be request, session or globally scoped.
Configuration layering is quite a useful feature of Dynamo. It lets you easily override settings in different application modules you are using, by e.g. creating a component properties file with the same path and name as that component in the corresponding folder in your own module, or in a corresponding folder in a localconfig folder. You can also use thislocalconfig folder to specify environment specific settings, allowing for the creation of environment agnostic builds without having to store all environment specific information in e.g. some database, or doing different builds for different environments. Another nice feature of Nucleus is that it comes with several web based tools that let you browse components in a running application and inspect properties or change their values on the fly, or invoke methods on those components (somewhat similar to a JMX console).
The following diagram gives an example of setting (and overriding) component properties at different layers on the configuration path. The first two files would be part of the application build, but the third file would be placed directly on the production file system to over-write some prebuilt settings.
DropletS / DSP examples
Droplets
/ DSP tag library
Droplets are ATG servlet beans that are used to dynamically
generate HTML. ATG provides numerous droplets to perform lots of common tasks
(e.g. display all the error messages for a form), but it’s possible to write
your own custom ones also. The DSP (dynamo server pages) tag library is
somewhat equivalent to JSTL but with the added ability that they naturally
interact with Nucleus components.
Droplets tend to be a bit verbose. For example, compare the
following piece of hypothetical code to display the contents of a shopping cart
written using ATG droplets with what it might look like if written in a bespoke JEE
application.
<h1>ATG shopping cart example</h1>
<dsp:droplet name="/atg/dynamo/droplet/ForEach"> <dsp:param name="array"
bean="/atg/commerce/ShoppingCart.current.commerceItems" />
<dsp:param name="elementName" value="commerceItem" />
<dsp:oparam name="output">
<dsp:getvalueof var="commerceItemId" param="commerceItem.id" />
<dsp:droplet name="SkuLookupDroplet">
<dsp:param name="id" param="commerceItem.catalogRefId" />
<dsp:param name="elementName" value="sku" />
<dsp:oparam name="output">
<dsp:getvalueof param="sku.displayName" var="skuDisplayName" />
</dsp:oparam>
</dsp:droplet>
<td><dsp:valueof param="skuDisplayName" /> <dsp:valueof
param="commerceItem.priceInfo.amount" converter="currency"
locale="${someCustomlocale}">0.00</dsp:valueof></td>
<td><dsp:a href="deliveryOptions.page"
bean="DeliveryOptionsFormHandler.value.itemId"
value="${commerceItemId}">Delivery Options</dsp:a></td>
</dsp:oparam>
</dsp:droplet>
<h1>Bespoke shopping cart example</h1>
<c:forEach var="commerceItem"
items="${shoppingCart.current.commerceItems}">
<td><customtag:getSkuDisplayName id="${commerceItem.catalogRefId}" />
<fmt:formatNumber type="currency" minFractionDigits="2"
value="${commerceItem.priceInfo.amount}" /></td>
<td><a href="deliveryOptions?itemId=${commerceItem.id}">Delivery Options</a></td>
</c:forEach>
Of course, there is no reason why you can't mix and match tag
libraries and only use the ATG tags and droplets where necessary.
Tuesday, December 27, 2011
ATG Commerce Overview
2
versions: ATG Consumer Commerce is used for developing standard
business-to-consumer (B2C) online stores. ATG Business Commerce is
used for sites oriented more toward business-to-business (B2B) uses.
1)
Product Catalog & Custom Catalog:
The product catalog is a collection of repository items (categories, products, media, etc.) that provides the organizational framework for your commerce site. ATG Commerce includes a standard catalog implementation, based on the ATG SQL Repository, that you can use or extend as necessary.
The product catalog is a collection of repository items (categories, products, media, etc.) that provides the organizational framework for your commerce site. ATG Commerce includes a standard catalog implementation, based on the ATG SQL Repository, that you can use or extend as necessary.
The
structure is built on Catalog –> Category –> Product –>
Sku
Where you can modify the features of each level.
The most important is to have the parent flag in the top categories
Each level has parent/child attributes, eg. parentCategories, childSku’s for product level.
You can have a linked template to display the element using it.
Some dropletes are dedicated on loading these elements: ItemLookupDroplet (generic) versus CategoryLookupDroplet, ProductLookupDroplet and SKULookupDroplet.
They take id as input and product the item/elements as output.
Where you can modify the features of each level.
The most important is to have the parent flag in the top categories
Each level has parent/child attributes, eg. parentCategories, childSku’s for product level.
You can have a linked template to display the element using it.
Some dropletes are dedicated on loading these elements: ItemLookupDroplet (generic) versus CategoryLookupDroplet, ProductLookupDroplet and SKULookupDroplet.
They take id as input and product the item/elements as output.
MediaLookupDroplet
for Media , 2 types exist: Media Internal and External (internally
referenced versus URL/File)
The data property is either binary (for media-internal-binary items) or text (for media-internal-text items)
The data property is either binary (for media-internal-binary items) or text (for media-internal-text items)
ATG
catalogs use several batch and dynamic services to perform catalog
updates and to verify catalog relationships. These services are
collectively referred to as the Catalog Maintenance System (CMS). The
CMS updates property values that enable navigation and hierarchical
search. It also verifies the relationships of catalog repository
items and properties.
**Batch Services : as
• AncestorGeneratorService
• CatalogVerificationService
• CatalogUpdateService
• CatalogMaintenanceService
Each service creates a global lock at the start of execution, using the global lock management, and releases it upon completion. This prevents services that use the same lock name from executing simultaneously on the same server, or other servers in the cluster.
**Dynamic Services : as
• CatalogChangesListener
• CatalogCompletionService
• StandardCatalogCompletionService
**Batch Services : as
• AncestorGeneratorService
• CatalogVerificationService
• CatalogUpdateService
• CatalogMaintenanceService
Each service creates a global lock at the start of execution, using the global lock management, and releases it upon completion. This prevents services that use the same lock name from executing simultaneously on the same server, or other servers in the cluster.
**Dynamic Services : as
• CatalogChangesListener
• CatalogCompletionService
• StandardCatalogCompletionService
Note
that some of these services are available only for custom catalogs;
others for both standard and
custom catalogs.
custom catalogs.
2)
Order Management:
A session scoped component which is ShoppingCart (atg/commerce/ShoppingCart) manage the current order (+last order and saved orders), order stored in memory and persisted frequently..
You can configure and customize it using orderrepositiory.xml (where you can define its components, cache size and lock mode).
Once Sku is added to the order–>it become CommerceItem that is related to ShoppingGroup that is related to ShippingAddress and ShippingMethod.
Once order is submitted , it become in incomplete status —> further processing –> fulfilled.
In case of B2B, order is hold for the needed approvals.
Once good feature exist in ATG Commerce, is the ability to have scheduled order.
A session scoped component which is ShoppingCart (atg/commerce/ShoppingCart) manage the current order (+last order and saved orders), order stored in memory and persisted frequently..
You can configure and customize it using orderrepositiory.xml (where you can define its components, cache size and lock mode).
Once Sku is added to the order–>it become CommerceItem that is related to ShoppingGroup that is related to ShippingAddress and ShippingMethod.
Once order is submitted , it become in incomplete status —> further processing –> fulfilled.
In case of B2B, order is hold for the needed approvals.
Once good feature exist in ATG Commerce, is the ability to have scheduled order.
Payment
methods include: Credit card, Store credit, gift certificate, invoice
request (in B2B)
CartModifierFormHandler:
Request scope
A form handler to handle adding items to order, remove items, change quantity, move the order forward (payment, shipping info),
A form handler to handle adding items to order, remove items, change quantity, move the order forward (payment, shipping info),
StoreCartFormHandler:
Handles continue shopping, expressCheckout, update, ….etc…
Handles continue shopping, expressCheckout, update, ….etc…
*Business
Layer:
-CommerceItemManager:
Create, add to order, remove from order..
Once sku is added to the order : sku id–> catalog ref Id in CommerceItem object, quantity , priceInfo , paymentGroup and shippingGroup are taken as well.
-CommerceItemManager:
Create, add to order, remove from order..
Once sku is added to the order : sku id–> catalog ref Id in CommerceItem object, quantity , priceInfo , paymentGroup and shippingGroup are taken as well.
-OrderManager:
load/save, create , allocate order to payment group.
These operations are handled by pipelines as mentioned before when we discuss the pipelines.
-OrderTools:
Provides low level raw operations..
-PurchaseProcessHelper:
Centralized functionality for purchase operations.
load/save, create , allocate order to payment group.
These operations are handled by pipelines as mentioned before when we discuss the pipelines.
-OrderTools:
Provides low level raw operations..
-PurchaseProcessHelper:
Centralized functionality for purchase operations.
*Best
Practise for Order Updating:
1.Acquire lock-manager write lock on profile id from the /atg/commerce/order/LocalLockManager
2.Begin Transaction
3.Synchronize on the Order object.
4.Modify Order
5.Call ((OrderImpl) pOrder).updateVersion();
6.Call OrderManager.updateOrder()
7.Release Order synchronization
8.End Transaction
9.Release lock-manager write lock on profile id from the /atg/commerce/order/LocalLockManager
1.Acquire lock-manager write lock on profile id from the /atg/commerce/order/LocalLockManager
2.Begin Transaction
3.Synchronize on the Order object.
4.Modify Order
5.Call ((OrderImpl) pOrder).updateVersion();
6.Call OrderManager.updateOrder()
7.Release Order synchronization
8.End Transaction
9.Release lock-manager write lock on profile id from the /atg/commerce/order/LocalLockManager
3)
Purchasing and Fulfillment Services :
ATG Commerce provides tools to handle pre-checkout order-processing tasks such as adding items to a shopping cart, ensuring items are shipped by the customer’s preferred method, and validating credit card information. The system is designed for flexibility and easy customization; you can create sites that support multiple shopping carts for a single user, multiple payment methods and shipping addresses.
You can integrate with third-party authorization and settlement tools such as Payflow Pro, CyberSource, and TAXWARE.
ATG Commerce provides tools to handle pre-checkout order-processing tasks such as adding items to a shopping cart, ensuring items are shipped by the customer’s preferred method, and validating credit card information. The system is designed for flexibility and easy customization; you can create sites that support multiple shopping carts for a single user, multiple payment methods and shipping addresses.
You can integrate with third-party authorization and settlement tools such as Payflow Pro, CyberSource, and TAXWARE.
4)
Inventory Management :
The inventory framework facilitates inventory querying and inventory management for your site.
InventoryManager
The InventoryManager is a public interface that contains all of the Inventory system functionality. Each method described below returns an integer status code. All successful return codes should be greater than or equal to zero, all failure codes should be less than zero. By default, the codes are:
INVENTORY_STATUS_SUCCEED=0 There was no problem performing the operation.
INVENTORY_STATUS_FAIL=-1 There was an unknown/generic problem performing the operation.
INVENTORY_STATUS_INSUFFICIENT_SUPPLY = -2 The operation couldn’t be completed because there were not enough of the item in the inventory system.
INVENTORY_STATUS_ITEM_NOT_FOUND = -3 The operation could not be completed
because a specified item could not be found in the inventory system.
The inventory framework facilitates inventory querying and inventory management for your site.
InventoryManager
The InventoryManager is a public interface that contains all of the Inventory system functionality. Each method described below returns an integer status code. All successful return codes should be greater than or equal to zero, all failure codes should be less than zero. By default, the codes are:
INVENTORY_STATUS_SUCCEED=0 There was no problem performing the operation.
INVENTORY_STATUS_FAIL=-1 There was an unknown/generic problem performing the operation.
INVENTORY_STATUS_INSUFFICIENT_SUPPLY = -2 The operation couldn’t be completed because there were not enough of the item in the inventory system.
INVENTORY_STATUS_ITEM_NOT_FOUND = -3 The operation could not be completed
because a specified item could not be found in the inventory system.
ATG
Commerce includes the following implementations of the
InventoryManager out of the box.
• AbstractInventoryManagerImpl
• NoInventoryManager
• RepositoryInventoryManager
• CachingInventoryManager
• LocalizingInventoryManager
• AbstractInventoryManagerImpl
• NoInventoryManager
• RepositoryInventoryManager
• CachingInventoryManager
• LocalizingInventoryManager
Preventing
Inventory Deadlocks
InventoryManager includes the acquireInventoryLocks and releaseInventoryLocks methods.
acquireInventoryLocks acquires locks for the inventory items that apply to the given IDs.
releaseInventoryLocks releases locks for the inventory items that apply to the given IDs.
InventoryManager includes the acquireInventoryLocks and releaseInventoryLocks methods.
acquireInventoryLocks acquires locks for the inventory items that apply to the given IDs.
releaseInventoryLocks releases locks for the inventory items that apply to the given IDs.
5)
Pricing Services :
ATG Commerce pricing services revolve around pricing engines and pricing calculators.
**The pricing engine determines the correct pricing model for an order, individual item, shipping charge, or tax, based on a customer’s profile.
**The pricing calculator performs the actual price calculation based on information
from the pricing engine.
ATG Commerce pricing services revolve around pricing engines and pricing calculators.
**The pricing engine determines the correct pricing model for an order, individual item, shipping charge, or tax, based on a customer’s profile.
**The pricing calculator performs the actual price calculation based on information
from the pricing engine.
Pricing
engines are responsible for three tasks:
• Retrieving any promotions that are available to the site visitor.
• Determining which calculators generate the price.
• Invoking the calculators in the correct order.
• Retrieving any promotions that are available to the site visitor.
• Determining which calculators generate the price.
• Invoking the calculators in the correct order.
Pricing
calculators are responsible for the following:
• Looking up the price in the catalog by priceList.
• Invoking a qualifier service that identifies the objects to discount.
• Using information they receive from the engines and from the qualifier service to
perform the actual process of determining prices.
• Looking up the price in the catalog by priceList.
• Invoking a qualifier service that identifies the objects to discount.
• Using information they receive from the engines and from the qualifier service to
perform the actual process of determining prices.
By
default, ATG Commerce can perform dynamic pricing for the following
types of pricing object:
• Items. Each item has a list price that can be specified in the listPrice property of the Product Catalog repository.(Note that an “item” is a CommerceItem, which represents a quantity of a SKU or a product).
• Orders.
• Shipping price.
• Tax.
• Items. Each item has a list price that can be specified in the listPrice property of the Product Catalog repository.(Note that an “item” is a CommerceItem, which represents a quantity of a SKU or a product).
• Orders.
• Shipping price.
• Tax.
Terminology:
-Qualifier : This is a service that interprets a PMDL rule and decides what, if
anything, may be discounted. The term qualifier also refers to the first part of a PMDL rule. This rule defines when something can receive a discount.
- Target : The second part of a PMDL rule is called the target. This rule
defines which part of an order receives a discount.
-Qualifier : This is a service that interprets a PMDL rule and decides what, if
anything, may be discounted. The term qualifier also refers to the first part of a PMDL rule. This rule defines when something can receive a discount.
- Target : The second part of a PMDL rule is called the target. This rule
defines which part of an order receives a discount.
4
Types of PriceInfo objects:
OrderPriceInfo,ItemPriceInfo, ShippingPriceInfo, and TaxPriceInfo
OrderPriceInfo,ItemPriceInfo, ShippingPriceInfo, and TaxPriceInfo
How
this works?
1-Invokation to price engine from business-layer logic, such as a PriceItem servlet
bean in a page or from the ATG Commerce PricingTools class.
2-Pricing engine applies its configured precalculators. A precalculator modifies a
price without using any associated promotions.
3-Pricing engine accesses the current customer’s profile and retrieves any
promotions listed in the activePromotions property of the profile
4-Pricing engine builds a list of global promotions and concatenate them.
5-Pricing engine applies promotions by priority (each promotion has pricingCalculatorService property that specifies the calculator that the system must use to apply it)
6-The pricing engine applies its configured PostCalculators.
7-The pricing engine modifies the PriceInfo object of the object being discounted.
1-Invokation to price engine from business-layer logic, such as a PriceItem servlet
bean in a page or from the ATG Commerce PricingTools class.
2-Pricing engine applies its configured precalculators. A precalculator modifies a
price without using any associated promotions.
3-Pricing engine accesses the current customer’s profile and retrieves any
promotions listed in the activePromotions property of the profile
4-Pricing engine builds a list of global promotions and concatenate them.
5-Pricing engine applies promotions by priority (each promotion has pricingCalculatorService property that specifies the calculator that the system must use to apply it)
6-The pricing engine applies its configured PostCalculators.
7-The pricing engine modifies the PriceInfo object of the object being discounted.
-When
building a product catalog, you must decide whether your site
requires dynamic product pricing and, if so, how granular you need it
to be. Using dynamic pricing on a product page can cause a
significant decrease in performance compared to using static
pricing..
-With
static pricing, each item in the catalog has a list price stored in
the listPrice property of the catalog repository.
Volume Pricing: Bulk 100 at 10, 200 at 9, …etc..
or Tiered: 1st 100->10 , 2nd 100 –>9 , …
Static uses 2 droplets: PriceDroplet and PriceRangeDroplet.
Volume Pricing: Bulk 100 at 10, 200 at 9, …etc..
or Tiered: 1st 100->10 , 2nd 100 –>9 , …
Static uses 2 droplets: PriceDroplet and PriceRangeDroplet.
**PriceEngine:
atg.commerce.pricing.PricingEngine is the main interface for interacting with the
atg.commerce.pricing package. Extensions of this interface describe objects that calculate a price for a specific class of object. For example, OrderPricingEngine extends PricingEngine and calculates prices for orders passed to it.
atg.commerce.pricing.PricingEngine is the main interface for interacting with the
atg.commerce.pricing package. Extensions of this interface describe objects that calculate a price for a specific class of object. For example, OrderPricingEngine extends PricingEngine and calculates prices for orders passed to it.
All
PricingEngine implementations process promotions. The PricingEngine
interface itself contains only one method, getPricingModels, which
extracts a collection of promotions from an input profile. (Price
Model can be customized by priceModel.xml).
The PricingEngine interface itself does not describe any functionality other than the promotion extraction API because of the wide range of information that different PricingEngine implementations might require to calculate a price for their specific class of object. For example, the ItemPricingEngine implementation needs one set of input parameters, while the OrderPricingEngine needs a different set.
The PricingEngine interface itself does not describe any functionality other than the promotion extraction API because of the wide range of information that different PricingEngine implementations might require to calculate a price for their specific class of object. For example, the ItemPricingEngine implementation needs one set of input parameters, while the OrderPricingEngine needs a different set.
The
individual extensions of the PricingEngine interface contain the API
methods for generating a given type of price. There is a Java object
type for each type of price that is generated. For
example,atg.commerce.pricing.OrderPricingEngine inherits the
promotion extraction API from PricingEngine and defines one new
method, priceOrder, to generate a price for an order in a given
context.
ATG
Commerce provides the following four extensions of the main
PricingEngine interface:
• 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.
• 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.
PricingTools
Class
The atg.commerce.pricing.PricingTools class performs a variety of pricing functions for different types of pricing engines. It also has a number of static, currency-related methods for use by all pricing engines.
The PricingTools class is the main way that business-layer logic interacts with the pricing engines and the other classes in the atg.commerce.pricing package.
The atg.commerce.pricing.PricingTools class performs a variety of pricing functions for different types of pricing engines. It also has a number of static, currency-related methods for use by all pricing engines.
The PricingTools class is the main way that business-layer logic interacts with the pricing engines and the other classes in the atg.commerce.pricing package.
The
properties of PricingTools are as follows:
• itemPricingEngine: The pricing engine that calculates prices for items, both
individually and in groups. An item is identified as a set quantity of a SKU or product.
• orderPricingEngine: The pricing engine that calculates prices for orders. Typically,
the price is just the sum of the prices of the items in the order. However, the order
might be discounted separately from the constituent items.
• shippingPricingEngine: The pricing engine that calculates prices for shipping
groups. An order contains one or more shipping groups when the contents of the
order require shipping for delivery. An order has no shipping groups when it is
delivered online, and shipping is therefore not calculated for this type of order.
• taxPricingEngine: The pricing engine that calculates tax for orders. Tax is calculated
on the order total.
• roundingDecimalPlaces: Specifies the number of decimal places to which the an
input price is rounded . This property is used by the round, roundDown and
needsRounding methods.
• itemPricingEngine: The pricing engine that calculates prices for items, both
individually and in groups. An item is identified as a set quantity of a SKU or product.
• orderPricingEngine: The pricing engine that calculates prices for orders. Typically,
the price is just the sum of the prices of the items in the order. However, the order
might be discounted separately from the constituent items.
• shippingPricingEngine: The pricing engine that calculates prices for shipping
groups. An order contains one or more shipping groups when the contents of the
order require shipping for delivery. An order has no shipping groups when it is
delivered online, and shipping is therefore not calculated for this type of order.
• taxPricingEngine: The pricing engine that calculates tax for orders. Tax is calculated
on the order total.
• roundingDecimalPlaces: Specifies the number of decimal places to which the an
input price is rounded . This property is used by the round, roundDown and
needsRounding methods.
Important
Methods:
priceEachItem, priceItem, priceItemsForOrderTotal, priceOrderForOrderTotal, priceOrderTotal, priceShippingForOrderTotal, priceTaxForOrderTotal, needsRounding, round.
priceEachItem, priceItem, priceItemsForOrderTotal, priceOrderForOrderTotal, priceOrderTotal, priceShippingForOrderTotal, priceTaxForOrderTotal, needsRounding, round.
The
Pricing Servlet Beans : You can insert on site pages as required and
use to
perform dynamic pricing.
• AvailableShippingMethods Servlet Bean
• ItemPricingDroplet Servlet Bean
• PriceEachItem Servlet Bean
• PriceItem Servlet Bean
• PriceDroplet Servlet Bean
• ComplexPriceDroplet Servlet Bean
perform dynamic pricing.
• AvailableShippingMethods Servlet Bean
• ItemPricingDroplet Servlet Bean
• PriceEachItem Servlet Bean
• PriceItem Servlet Bean
• PriceDroplet Servlet Bean
• ComplexPriceDroplet Servlet Bean
*Price
Lists:
Price Lists allow you to target a specific set of prices to a specific group of customers.
The PriceListManager class maintains the price lists. A price may be retrieved from the PriceListManager from a given price list by product, by SKU, or by a product/SKU pair.
The most important method in PriceListManager is getPrice. This is used during pricing of an order to get the correct price for a given product/SKU pair.
Price Lists allow you to target a specific set of prices to a specific group of customers.
The PriceListManager class maintains the price lists. A price may be retrieved from the PriceListManager from a given price list by product, by SKU, or by a product/SKU pair.
The most important method in PriceListManager is getPrice. This is used during pricing of an order to get the correct price for a given product/SKU pair.
It
is configured using priceList.xml
6)
Targeted Promotions :
Business managers can use ATG Commerce promotions to highlight products and offer discounts as a way of encouraging customers to make purchases.
Business managers can use ATG Commerce promotions to highlight products and offer discounts as a way of encouraging customers to make purchases.
Promotions
3 types: ItemDiscount, OrderDiscount and ShippingDiscount.
Pricing
Model Description Language (PMDL): rule describing the conditions
under which this promotion should take effect. The rule is created in
the ATG Control Center using the interface designed for promotion
creation.
7)
Order Management Web Services :
All order management web services are included in commerceWebServices.ear in the
orderManagement.war web application.
All order management web services are included in commerceWebServices.ear in the
orderManagement.war web application.
Subscribe to:
Posts (Atom)
Popular Posts
-
Creating a Payment Group A PaymentGroup contain information about the payment method that will be used to purchase a group of comme...
-
Creating Shipping Groups: A ShippingGroup contains information on the shipping address and delivery method for a group of commerce...
-
Scheduling a Task In order to schedule a task, a component needs a pointer to the Scheduler, which is usually set as a component proper...
-
ATG Consumer Commerce users do not have a price list functionality available by default. To add price list functionality, you should: ...