Processing multiple shipments with a single approval
You can process multiple shipments at a time with a single authorization
approval by customizing the PaymentEventListenerImpl class. Without
customization, the PaymentEventListenerImpl class uses the default
payment rules and processes multiple transactions for multiple shipments.
Procedure
-
Override the
finalization amount
andreservation amount
in the PaymentEventListenerImpl class. Update theupdateAtomicPaymentAfterHashActions()
method to correct the final amount of the order.Use the example to override theupdateAtomicPaymentAfterHashActions()
method:protected void updateAtomicPaymentAfterHashActions(HashMap actionLists, int phase) throws InvalidRequestException, InvalidDataException, ObjectCannotBeFoundException, EDPException {
PaymentActionData actionData = null; List actions = null; int numberOfActions = 0; Iterator iter = actionLists.keySet().iterator(); while (iter.hasNext()) { Long piId = (Long) iter.next(); actions = (List) actionLists.get(piId); numberOfActions = actions.size(); // Loop through the array of Action objects for (int j = 0; j < numberOfActions; j++) { actionData = (PaymentActionData) actions.get(j); if(actionData.getActionName().equals("DepositAction")) { Long apKeyId = actionData.getAtomicPaymentId(); AtomicPaymentData payment = getOMF().getAtomicPayment(apKeyId); if(phase == Constants.PHASE_FINALIZATION) { BigDecimal amount = actionData.getAmount().add(payment.getFinalizationAmount()); actionData.setAmount(amount); } if(phase == Constants.PHASE_RESERVATION) { BigDecimal amount = actionData.getAmount().add(payment.getReservationAmount()); actionData.setAmount(amount); } } } }
super.updateAtomicPaymentAfterHashActions(actionLists, phase); } - Open the configuration file.
-
Use the updated version of PaymentEventListenerImpl class.
For example:
<component
compClassName
="com.ibm.commerce.payment.actions.commands.PaymentEventListenerImpl" enable="true" name="Payment Rule Listener"> <property display="false"> <start enabled="true"/> <event name="PaymentRule"/> </property> </component> -
Set the target in the CorePaymentActions.xml file.
- Go to workspace_dir/WC/xml/config/payments/edp/groups/group_name/paymentConfiguration.
- Set the target for deposit in the CorePaymentActions.xml file:
<TargetDeposited> ... <CurrentApproved> <AmountLessThanRequested> <Action name="Deposit" amount="existing" target="existing"/> <Action name="Approve" amount="delta" target="additional"/> <Action name="Deposit" amount="delta" target="existing"/> </AmountLessThanRequested> <AmountEqualsRequested> <Action name="Deposit" amount="existing" target="existing"/> </AmountEqualsRequested>
<AmountGreaterThanRequested> <Action name="Deposit" amount="requested" target="existing"/> </AmountGreaterThanRequested>
</CurrentApproved> ... </TargetDeposited>