c# wpf document viewer pdf : Delete pages of pdf preview software SDK project winforms wpf asp.net UWP ATGCommProgGuide37-part2115

ATG  C om mer ce P ro g ramm in g   Gui d e 
35 3  
16  -  C o n fi g u rin g   Pu rch as e  Pro ces s  S ervices  
μ
PaymentManagerPipelineArgs params = 
(PaymentManagerPipelineArgs)pParam; 
Order order = params.getOrder(); 
StorePoints storePoints = (StorePoints)params.getPaymentGroup(); 
double amount = params.getAmount(); 
// create and populate store points info class 
StorePointsInfo spi = getStorePointsInfo(); 
addDataToStorePointsInfo(order, storePoints, amount, params, spi); 
if (isLoggingDebug()) 
logDebug("Putting StorePointsInfo object into pipeline: " + 
spi.toString()); 
params.setPaymentInfo(spi); 
return SUCCESS; 
//---------------------------------------------------------------------- 
/** 
* Return the possible return values for this processor.  This processor 
* always returns a success code. 
**/ 
public int[] getRetCodes() { 
int retCodes[] = {SUCCESS}; 
return retCodes; 
As previously mentioned, the 
StorePointsStatus
object represents a transaction on a 
StorePoints
PaymentGroup
. When the 
PaymentManager
gets this object, it adds it to one of the 
authorizationStatus
debitStatus
, or 
creditStatus
List
objects in the 
PaymentGroup
. The 
specific list to which it is added depends on the operation. 
Because none of the 
StorePointsProcessor
methods throw exceptions, all operations must return an 
object that implements the 
PaymentStatus
interface, as 
PaymentStatusImpl
does. Therefore, when 
you implement 
StorePointsStatus
, you should extend 
PaymentStatusImpl
, which implements the 
atg.payment.PaymentStatus
interface. Follow the steps in Extending the Purchase Process to ensure 
that objects are persisted properly. The following table describes the properties in the 
PaymentStatus
interface. 
PaymentStatus Property  Type 
Description 
transactionId 
String 
A unique ID for the transaction that is generated by the 
payment processor. 
Delete pages of pdf preview - software SDK project:C# PDF Page Extract Library: copy, paste, cut PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Easy to Use C# Code to Extract PDF Pages, Copy Pages from One PDF File and Paste into Others
www.rasteredge.com
Delete pages of pdf preview - software SDK project:VB.NET PDF Page Extract Library: copy, paste, cut PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Detailed VB.NET Guide for Extracting Pages from Microsoft PDF Doc
www.rasteredge.com
ATG  C om merce  P ro gra mm in g  G ui d e 
35 4  
16  -  C o n fi g uri n g  P u rch as e P ro ces s  Serv ices  
amount 
double 
The amount of the transaction. 
transactionSuccess 
boolean 
Indicates whether the transaction was successful. True 
indicates that the transaction succeeded. False indicates 
that it failed. 
errorMessage 
String 
A detailed error message about the failure. 
transactionTimestamp 
Date 
The time that the transaction was executed. 
Below is an example of the 
StorePointsStatus
class. All properties in this object must have values. The 
most important property is 
transactionSuccess
. If 
transactionSuccess
is false, then an exception is 
thrown with the message in the 
errorMessage
property. 
package store.some.package; 
import atg.payment.*; 
public class StorePointsStatus extends PaymentStatusImpl 
public StorePointsStatus() { 
private String mConfirmationNumber = null; 
public String getConfirmationNumber() { 
return mConfirmationNumber; 
public void setConfirmationNumber(String pConfirmationNumber) { 
mConfirmationNumber = pConfirmationNumber; 
Integrating the New Payment Processors into the PaymentManager 
Integrating the new payment processors that you created in step 2 for the 
StorePoints
PaymentGroup
This involves two steps: 
1.
Create the pipeline that creates 
StorePointsInfo
objects and processes the 
StorePoints
PaymentGroup
for authorization, debits, and credits. 
2.
Configure the 
PaymentManager
to invoke the pipeline when an operation is 
requested on a 
StorePoints
PaymentGroup
See the sections that follow for details. 
Creating the Pipeline 
To create the pipeline that creates the 
StorePointsInfo
objects and performs actions on the 
StorePoints
PaymentGroup
software SDK project:How to C#: Preview Document Content Using XDoc.Word
How to C#: Preview Document Content Using XDoc.Word. Get Preview From File. You may get document preview image from an existing Word file in C#.net.
www.rasteredge.com
software SDK project:How to C#: Preview Document Content Using XDoc.PowerPoint
How to C#: Preview Document Content Using XDoc.PowerPoint. Get Preview From File. You may get document preview image from an existing PowerPoint file in C#.net.
www.rasteredge.com
ATG  C om mer ce P ro g ramm in g   Gui d e 
35 5  
16  -  C o n fi g u rin g   Pu rch as e  Pro ces s  S ervices  
1.
Configure a pipeline processor to create the 
StorePointsInfo
object. To do this, 
create a Nucleus component for the 
ProcCreateStorePointsInfo
object. To create 
a Nucleus component located at 
/store/payment/processor/CreateStorePointsInfo
, place the following 
properties file into Nucleus at that path: 
$class=store.some.package.ProcCreateStorePointsInfo 
$scope=global 
storePointsInfoClass=store.some.package.StorePointsInfo
2.
Configure a pipeline processor to authorize, debit, and credit the 
StorePoints
payment method. To do this, create a Nucleus component for the 
ProcProcessStorePoints
object. To create a Nucleus component located at 
/store/payment/processor/ProcessStorePoints
, place the following properties 
file into Nucleus at that path: 
$class=store.some.package.ProcProcessStorePoints 
$scope=global 
storePointsProcessor=/store/payment/StorePointsProcessorImpl 
Note that the 
ProcessStorePoints.storePointsProcessor
property is set to the 
StorePointsProcessor
object that actually performs the payment operations. 
ProcessStorePoints
calls through to this object to perform the operations. In this 
example, it would be set to the 
StorePointsProcessorImpl
Nucleus component. 
3.
Create a Nucleus component for the 
StorePointsProcessorImpl
object. This is the 
object that actual performs the payment operations on the 
StorePoints
payment 
method. To create a Nucleus component located at 
/store/payment/StorePointsProcessor
, place the following properties file into 
Nucleus at that path: 
$class=store.some.package.StorePointsProcessorImpl 
$scope=global
4.
Define the 
storePointsProcessorChain
pipeline and add it to the pipelines used 
by the 
/atg/commerce/payment/PaymentPipelineManager
. To do this, create a 
paymentpipeline.xml
file in Nucleus at 
/atg/commerce/payment/paymentpipeline.xml
. This XML file should define the 
single pipeline that operates on 
StorePoints
PaymentGroups
; it will be combined 
with the existing XML definition of payment pipelines using XML file combination. 
The following is a code example of the 
storePointsProcessorChain
pipeline: 
<pipelinemanager> 
<!-- This chain is used to process a store point payment group--> 
<!-- This single chain knows how to auth/credit/debit a        --> 
<!-- payment group.  It also creates the StorePointInfo object--> 
<pipelinechain name="storePointProcessorChain" transaction="TX_REQUIRED" 
headlink="createStorePointInfo"> 
<pipelinelink name="createStorePointInfo" transaction="TX_MANDATORY"> 
<processor jndi="/store/payment/processor/CreateStorePointInfo"/> 
<transition returnvalue="1" link="processStorePoints"/> 
software SDK project:VB.NET PDF File Compress Library: Compress reduce PDF size in vb.
a preview component enables compressing and decompressing in preview in ASP images size reducing can help to reduce PDF file size Delete unimportant contents:
www.rasteredge.com
software SDK project:C# WinForms Viewer: Load, View, Convert, Annotate and Edit PDF
Erase PDF images. • Erase PDF pages. Miscellaneous. • Select PDF text on viewer. • Search PDF text in preview. • View PDF outlines. Related Resources.
www.rasteredge.com
ATG  C om merce  P ro gra mm in g  G ui d e 
35 6  
16  -  C o n fi g uri n g  P u rch as e P ro ces s  Serv ices  
</pipelinelink> 
<pipelinelink name="processStorePoints" transaction="TX_MANDATORY"> 
<processor jndi="/store/payment/processor/ProcessStorePoints"/> 
</pipelinelink> 
</pipelinechain> 
</pipelinemanager> 
Configure the PaymentManager to Invoke the StorePointsProcessorChain 
To configure the 
PaymentManager
to invoke the 
storePointsProcessorChain
pipeline when an 
operation is requested on a 
StorePoints
PaymentGroup
, you need to add a new entry to 
PaymentManager.paymentGroupToChainNameMap
. The 
paymentGroupToChainNameMap
property 
stores a mapping of 
PaymentGroup
class names to the names of the pipelines to invoke when an 
operation for those 
PaymentGroups
is requested. 
To add a new entry to 
PaymentManager.paymentGroupToChainNameMap
, layer on a configuration file 
that makes an additional entry to the 
paymentGroupToChainNameMap
property. The new configuration 
file would be located in Nucleus at 
/atg/commerce/payment/PaymentManager
and would look like the 
following: 
PaymentGroupToChainNameMap+=Store.some.package.StorePoints=storePointsProc 
essorChain 
Extending Order Validation to Support New Payment Methods 
Note: You can also follow this process to extend shipping group validation. 
If you have implemented a custom payment method, such as the 
StorePoints
payment method 
described in detail in the previous section, you may want to perform validation on the custom payment 
method during checkout. For example, for the 
StorePoints
payment method you might want to make 
sure that the number of points specified is greater than zero. You might also want to include other 
validation logic – for example, you might decide that users cannot apply more than 500 store points to 
any order, and that store points may not be used to pay for more than 25% of the order price. You can test 
all of these conditions in a custom validation component for the 
StorePoints
payment group. 
When a user checks out an 
Order
, the ATG Commerce purchase process performs validation checks on all 
of the payment groups in the 
Order
by executing the 
validateForCheckout
pipeline, which is defined 
in 
commercepipeline.xml
. The 
validateForCheckout
pipeline includes a 
ValidatePaymentGroupsForCheckout
processor, which iterates over the payment groups in the 
Order
and calls the 
validatePaymentGroup
pipeline for each one to verify that the payment group is ready for 
checkout. 
The 
validatePaymentGroup
pipeline begins with a processor that examines the type of the current 
PaymentGroup
and transfers control to a pipeline processor appropriate to that type. Credit cards are 
checked by one processor, gift certificates by another, store credits by still another. You can add your own 
pipeline processor to check the custom payment groups that you create. 
Adding validation for your new payment method involves four steps: 
software SDK project:C# PDF Page Insert Library: insert pages into PDF file in C#.net
document files by C# code, how to rotate PDF document page, how to delete PDF page using C# .NET, how to reorganize PDF document pages and how
www.rasteredge.com
software SDK project:How to C#: Preview Document Content Using XDoc.excel
How to C#: Preview Document Content Using XDoc.Excel. Get Preview From File. You may get document preview image from an existing Excel file in C#.net.
www.rasteredge.com
ATG  C om mer ce P ro g ramm in g   Gui d e 
35 7  
16  -  C o n fi g u rin g   Pu rch as e  Pro ces s  S ervices  
Step 1: Implement a validation pipeline processor
Step 2: Create an instance of the processor
Step 3: Add the custom payment method to the ValidatePaymentGroupByType 
processor
Step 4: Add the custom payment method to the validatePaymentGroup pipeline
This subsections that follow describe each step in detail, using the 
StorePoints
payment group that you 
created in the previous section as an example. 
Step 1: Implement a validation pipeline processor 
The first step in validating your custom payment method is to write a pipeline processor that examines a 
payment group and determines whether it meets the criteria for use in the 
Order
. Recall that your 
processor must implement the interface 
atg.service.pipeline.PipelineProcessor
, which consists 
of two methods: 
public int[] getRetCodes();
public int runProcess(Object pParam, PipelineResult pResult) throws 
Exception;
A validation processor for 
StorePoints
might look similar to the following: 
package store.checkout; 
import atg.service.pipeline.*; 
import atg.nucleus.GenericService; 
import atg.commerce.order.processor.ValidatePaymentGroupArgs; 
import store.payment.StorePoints; 
public class ValidateStorePoints 
extends GenericService 
implements PipelineProcessor 
private static int SUCCESS_CODE = 1; 
private static int[] RETURN_CODES = { SUCCESS_CODE }; 
/** 
* Return the list of possible return values from this 
* processor.  This processor always returns a single value 
* indicating success.  In case of errors, it adds messages 
* to the pipeline result object. 
**/ 
public int[] getRetCodes() 
return RETURN_CODES; 
/** 
software SDK project:VB.NET PDF delete text library: delete, remove text from PDF file
Visual Studio .NET application. Delete text from PDF file in preview without adobe PDF reader component installed. Able to pull text
www.rasteredge.com
software SDK project:C# Word - Delete Word Document Page in C#.NET
doc.Save(outPutFilePath); Delete Consecutive Pages from Word in C#. int[] detelePageindexes = new int[] { 1, 3, 5, 7, 9 }; // Delete pages.
www.rasteredge.com
ATG  C om merce  P ro gra mm in g  G ui d e 
35 8  
16  -  C o n fi g uri n g  P u rch as e P ro ces s  Serv ices  
* Perform validation for a StorePoints payment group. 
**/ 
public int runProcess(Object pParam, PipelineResult pResult) 
ValidatePaymentGroupPipelineArgs args; 
// Dynamo guarantees that the pipeline parameter object 
// passed to a payment group validation processor will be 
// of type ValidatePaymentGroupPipelineArgs. 
args = (ValidatePaymentGroupPipelineArgs)pParam; 
PaymentGroup pg = args.getPaymentGroup(); 
// Now try casting the payment group to the type we expect 
// and validating the fields.  If the payment group is of 
// the wrong type, or if anything else goes wrong, add an 
// error to the pipeline result so the order manager will 
// abort the checkout process. 
try 
StorePoints points = (StorePoints)pg; 
int nPoints = points.getNumberOfPoints(); 
Order order = args.getOrder(); 
double orderPrice = order.getPriceInfo().getTotal(); 
// Log some debugging info about the number of points 
// and the total order price. 
if (isLoggingDebug()) 
logDebug("Applying " + nPoints + " store points " + 
" to an order totaling " + orderPrice); 
// Are we using more than 500 points or trying to pay 
// for more than 25% of the order?  If so, add an error 
// to the pipeline result before returning. 
if (nPoints <= 0) 
pResult.addError( 
"NoPointsUsed", 
"The number of points should be greater than zero."); 
else if (nPoints > 500) 
pResult.addError( 
"TooManyPointsUsed", 
"A maximum of 500 points can be used per order."); 
else if (nPoints > orderPrice * .25) 
pResult.addError( 
"PointsValueExceeded", 
"Store points cannot pay for more than 25% of an order."); 
software SDK project:C# PDF delete text Library: delete, remove text from PDF file in
Delete text from PDF file in preview without adobe PDF reader component installed in ASP.NET. C#.NET PDF: Delete Text from Consecutive PDF Pages.
www.rasteredge.com
software SDK project:C# PowerPoint - Delete PowerPoint Document Page in C#.NET
doc.Save(outPutFilePath); Delete Consecutive Pages from PowerPoint in C#. int[] detelePageindexes = new int[] { 1, 3, 5, 7, 9 }; // Delete pages.
www.rasteredge.com
ATG  C om mer ce P ro g ramm in g   Gui d e 
35 9  
16  -  C o n fi g u rin g   Pu rch as e  Pro ces s  S ervices  
catch (ClassCastException cce) 
pResult.addError( 
"ClassNotRecognized", 
"Expected a StorePoints payment group, but got " 
+ pg.getClass().getName() + " instead."); 
return SUCCESS_CODE; 
Note the use of the 
ValidatePaymentGroupPipelineArgs
class in the 
runProcess()
method. When 
the 
OrderManager
validates payment groups, it guarantees that the pipeline arguments passed to your 
processor are an instance of this class. This provides you with a convenient way to retrieve items like the 
Order
, the 
OrderManager
, the 
PaymentGroup
, and the server’s 
Locale
from the pipeline parameter 
map. 
Step 2: Create an instance of the processor 
After implementing your pipeline processor, you must configure an instance of the processor in Nucleus. 
For the 
StorePoints
example, the validation processor might be located at 
/store/checkout/ValidateStorePoints
, and it is configured with the following properties file: 
# Store Points validation processor 
$class=store.checkout.ValidateStorePoints 
loggingDebug=true 
In this simple example the processor doesn’t require any additional property settings. 
Step 3: Add the custom payment method to the ValidatePaymentGroupByType processor 
Recall that payment groups are validated at checkout by invoking the 
validatePaymentGroup
pipeline 
for each payment group in the order. The 
validatePaymentGroup
pipeline begins with a pipeline 
processor called 
ValidatePaymentGroupByType
, which examines the type of each payment group and 
returns an Integer that identifies the payment method. The pipeline then dispatches control to one of a 
number of different processors based on this return code. 
To add support for your payment method, you must add an entry to 
ValidatePaymentGroupByType
’s 
returnValues
property, which maps your payment method’s name (
storePoints
in this example) to a 
unique return value. You can use any return value as long as it isn’t used by any other payment method. 
This example uses a value of 10. Configure the property by creating a file as follows in 
localconfig/atg/commerce/order/processor/ValidatePaymentGroupByType.properties
# Add a return code for the storePoints payment method 
returnValues+=\ 
storePoints=10 
ATG  C om merce  P ro gra mm in g  G ui d e 
36 0  
16  -  C o n fi g uri n g  P u rch as e P ro ces s  Serv ices  
Note that the payment method name, 
storePoints
, is the name you added to the 
paymentTypeClassMap
in the 
OrderTools
component; it is not the name of your payment group’s 
implementation class. 
Step 4: Add the custom payment method to the validatePaymentGroup pipeline 
The final step in adding validation for your 
StorePoints
payment method is to reconfigure the 
validatePaymentGroup
pipeline so it invokes the 
ValidateStorePoints
processor when 
ValidatePaymentGroupByType
returns a value of 10. This requires two changes to the pipeline 
configuration. 
First, add a new transition tag to the 
dispatchOnPGType
pipeline link in order to specify the pipeline link 
to use when 
ValidatePaymentGroupByType
returns a value of 10. Second, define the new pipeline link 
and configure it to invoke your 
ValidateStorePoints
component (in bold in the example that follows). 
You can do both steps using XML combination facilities. Modify the pipeline using the following code in 
localconfig/atg/commerce/commercepipeline.xml
<!-- Modify the validatePaymentGroup chain to include  --> 
<!-- validation for payment groups of type storePoints --> 
<pipelinemanager> 
<pipelinechain name="validatePaymentGroup"> 
<pipelinelink name="dispatchOnPGType"> 
<transition returnvalue="10" link="validateStorePoints"/> 
</pipelinelink> 
<pipelinelink name="validateStorePoints"> 
<processor jndi="/store/checkout/ValidateStorePoints"/> 
</pipelinelink> 
</pipelinechain> 
</pipelinemanager> 
ATG Commerce will now perform validation on your 
StorePoints
payment method. 
Scheduling Recurring Orders 
Sites often require the functionality to create orders to be fulfilled repeatedly on a specific schedule, or to 
construct and save orders to be placed at a later date. You can use ATG Commerce to support these 
requirements through the use of scheduled orders. 
In ATG Commerce, a scheduled 
Order
object (of type 
scheduledOrder
) maintains the schedule 
information for the scheduled order, and a template 
Order
object maintains the order information for the 
scheduled order. The template 
Order
object is a typical 
Order
in the 
orderRepository
, but it has a state 
of TEMPLATE. When a scheduled order is placed, the template order is cloned, and the cloned order is 
checked out and sent to Fulfillment. Consequently, the template 
Order
is never processed, but simply 
serves as a prototype. 
ATG  C om mer ce P ro g ramm in g   Gui d e 
36 1  
16  -  C o n fi g u rin g   Pu rch as e  Pro ces s  S ervices  
Template orders must include enough information, such as all necessary shipping and payment 
information, to process the cloned 
Order
without further user interaction. A previously processed order 
or even the user’s shopping cart (once the shipping and payment information has been specified) can be 
used to create a template order. 
This section describes the ATG Commerce framework that supports scheduled orders and includes the 
following subsections: 
Understanding the scheduledOrder Repository Item 
Submitting Scheduled Orders 
Creating, Modifying, and Deleting Scheduled Orders 
Using Scheduled Orders with Registered Sites 
For an example implementation of scheduled orders, see the Scheduling Orders section of the My Account 
chapter in the ATG Business Commerce Reference Application Guide. 
Understanding the scheduledOrder Repository Item 
The scheduled 
Order
objects, stored in the Order Repository, maintain the schedule information for 
scheduled orders, as well as extra information as defined by the 
scheduledOrder
item descriptor (for 
example, 
name
and 
state
). 
The 
scheduledOrder
item descriptor is defined in 
<ATG10dir>/B2BCommerce/atg/commerce/order/orderRepository.xml
. By default, a 
scheduledOrder
repository item contains the following properties: 
Property 
Description 
name 
The name that the user has assigned to the scheduled 
Order
profileId 
The profile ID of the user who created the scheduled 
Order
templateOrderId 
The ID of the template 
Order
that is cloned whenever the scheduled order 
is placed. 
state 
The state of the scheduled 
Order
(active, inactive, or error).  
clonedOrders 
The list of scheduled orders that have been placed. These 
Orders
are clones 
of the template 
Order
that have been checked out. 
schedule 
A string describing the 
Order
’s placement schedule. 
nextScheduledRun 
The next date and time that the scheduled 
Order
should be placed. 
createDate 
The date and time that the scheduled 
Order
was created. 
startDate 
The date and time that start the period within which the scheduled 
Order
can be placed.  
ATG  C om merce  P ro gra mm in g  G ui d e 
36 2  
16  -  C o n fi g uri n g  P u rch as e P ro ces s  Serv ices  
endDate 
The date and time that end the period within which the scheduled 
Order
can be placed. 
Note: If unset, the scheduled 
Order
is repeatedly placed indefinitely. 
id 
The ID of the scheduled 
Order
object. A read-only property. 
type 
The type of repository item. This is set to 
scheduledOrder
Version 
A value used to protect against data corruption that might be caused if two 
users attempt to edit this repository item at the same time. The system 
updates this read-only property automatically. 
maxThreads 
The current implementation of the scheduled order service can be 
configured to employ multiple threads when placing orders. By setting the 
parameter 
maxThreads
to a number greater than 1, you can specify the 
number of threads that are started to process scheduled orders. If the 
maxThreads
parameter is kept at the default of 1, all orders will be 
processed in the main thread. The optimal number of threads depends on a 
variety of factors, including server load, machine and database speed and 
the complexity of the scheduled order templates. 
Submitting Scheduled Orders 
The 
ScheduledOrderService
is the back-end service that polls the Order Repository at a periodic 
interval and submits scheduled 
Orders
according to their schedules. 
When an application that includes ATG Commerce deploys, a 
PlaceScheduledOrders
task is scheduled 
with the 
/atg/dynamo/service/Scheduler
. This scheduled task is run at the interval specified in 
ScheduledOrderService.schedule
. When the scheduled task is run, the 
Scheduler
calls 
ScheduledOrderService.performScheduledTask()
. The 
ScheduledOrderService
then attempts 
to obtain a global write lock from the server lock manager. If the lock is obtained successfully, then it calls 
doScheduledTask()
At a general level, the 
ScheduledOrderService.doScheduledTask()
method polls the Order 
Repository for all scheduled 
Orders
that should be checked out. For each scheduled 
Order
it finds due 
for checkout, it then clones the template 
Order
associated with the scheduled 
Order
, checks out the 
cloned 
Order
, and sets the 
nextScheduledRun
property of the scheduled 
Order
to the next date and 
time it should be checked out. If an error occurs when processing an individual scheduled 
Order
, then a 
CommerceException
is thrown, the state of the scheduled 
Order
is set to Error, and the state of the 
cloned 
Order
is set to PENDING_MERCHANT_ACTION. However, the remaining scheduled 
Orders
are 
processed. 
The following table describes the various methods of 
ScheduledOrderService
that support this 
process: 
Documents you may be interested
Documents you may be interested