Customizing Order-process

Customizing  Order-process for Ticketing System

Requirment:-

->if an customer place an order though COD (Cash ON Delivery)/(CHEQUE ON DELIVERY)
option then ,Internally  Ticket has to Create and it has to assign CsAgent(Admin).
->While Creating Ticket TicketStatus as Waiting and Order Status Will be in Wait_for_Approve
->CsAgent(Admin) has Right to Approve or reject the TicketStatus.
->if  TicketStatus has approve then OrderStatus will be on Ready State
->if  TicketStatus has reject then OrderStatus will be on cancel State

 

Solution

                                                                  DataModel:-

                          Below Code for defining the TicketStatus

 

<enumtype code=”CUSTTicketStatus” autocreate=”true” generate=”true” dynamic=”true”>
<value code=”wait”/>
<value code=”Approve” />
<value code=”Reject” />
</enumtype>

 

<itemtype code=”CUSTCsTicket” extends=”CsTicket” autocreate=”true” generate=”true”
jaloclass=”de.hybris.platform.ticket.jalo.CUSTCsTicket”>
<deployment table=”CUSTCsTickets” typecode=”20001″ />
<attributes>
<attribute qualifier=”ticketStatus” type=”CUSTTicketStatus”>
<persistence type=”property”></persistence>
</attribute>
</attributes>
</itemtype>

 

                          Below code for define the OrderStatus

 

<enumtype code=”OrderStatus” generate=”false” autocreate=”false”>
<value code=”WAITING_FOR_APPROVAL” />
</enumtype>

               Below code For to define the COD/cheque payment information

 

<itemtype code=”CUSTCODPaymentInfo” extends=”PaymentInfo” autocreate=”true” generate=”false”>
<description>Cash on Delivery payment info</description>
<attributes />
</itemtype>
<itemtype code=”CUSTChequePaymentInfo” extends=”PaymentInfo” autocreate=”true” generate=”false”>
<description>Check Payment Info</description>
<attributes>
<attribute qualifier=”checkNumber” type=”java.lang.String”>
<persistence type=”property” />
</attribute>
<attribute qualifier=”instrumentType” type=”java.lang.String”>
<persistence type=”property” />
</attribute>
<attribute qualifier=”date” type=”java.util.Date”>
<persistence type=”property” />
</attribute>
<attribute qualifier=”bankBranchName” type=”java.lang.String”>
<persistence type=”property” />
</attribute>
<attribute qualifier=”amount” type=”java.lang.Double”>
<persistence type=”property” />
</attribute>
<attribute qualifier=”dateOfReceipt” type=”java.util.Date”>
<persistence type=”property” />
</attribute>
<attribute qualifier=”dateOfClearance” type=”java.util.Date”>
<persistence type=”property” />
</attribute>
</attributes>
</itemtype>

 

Customizing the order-process.xml in customordermanagement extenstion

Below blockquote  actions are add for customizing the Order-process for Ticketing System

<?xml version=”1.0″ encoding=”utf-8″?>
<process xmlns=”http://www.hybris.de/xsd/processdefinition&#8221; start=”checkOrder”
name=”order-process” processClass=”de.hybris.platform.orderprocessing.model.OrderProcessModel”>

<!– Check Order –>
<action id=”checkOrder” bean=”checkOrderAction”>
<transition name=”OK” to=”fraudCheck”/>
<transition name=”NOK” to=”error”/>
</action>

<!– Fraud Check –>
<action id=”fraudCheck” bean=”fraudCheckOrderInternalAction”>
<transition name=”OK” to=”sendOrderPlacedNotification”/>
<transition name=”POTENTIAL” to=”manualOrderCheckCSA”/>
<transition name=”FRAUD” to=”cancelOrder”/>
</action>

<!– Fraud Check : OK –>
<action id=”sendOrderPlacedNotification” bean=”sendOrderPlacedNotificationAction”>
<transition name=”OK” to=”geocodeShippingAddress”/>
</action>

<!– Fraud Check : FRAUD –>
<action id=”cancelOrder” bean=”cancelOrderAction”>
<transition name=”OK” to=”notifyCustomer”/>
</action>

<action id=”notifyCustomer” bean=”notifyCustomerAboutFraudAction”>
<transition name=”OK” to=”failed”/>
</action>

<!– Fraud Check : POTENTIAL –>
<action id=”manualOrderCheckCSA” bean=”prepareOrderForManualCheckAction”>
<transition name=”OK” to=”waitForManualOrderCheckCSA”/>
</action>

<wait id=”waitForManualOrderCheckCSA” then=”orderManualChecked” prependProcessCode=”true”>
<event>CSAOrderVerified</event>
</wait>

  1. <action id=”orderManualChecked” bean=”orderManualCheckedAction”>
    <transition name=”OK” to=”sendOrderPlacedNotification”/>
    <transition name=”NOK” to=”cancelOrder”/>
    </action><!– Sourcing and Allocation –>
    <action id=”geocodeShippingAddress” bean=”geocodeShippingAddressAction”>
    <transition name=”OK” to=”sourceOrder”/>
    </action><action id=”sourceOrder” bean=”sourceOrderAction”>
    <transition name=”OK” to=”checkPaymentMode”/>
    </action>

    1.<action id=”checkPaymentMode” bean=”checkPaymentModeAction”> <transition name=”OK” to=”waitForOrderAction”/> <transition name=”COD” to=”createTicket”/> <transition name=”CHEQUE” to=”createTicket”/> <transition name=”NOK” to=”error”/> </action> <action id=”createTicket” bean=”createTicketAction”> <transition name=”OK” to=”waitforCSAgentApprovalAction”/> <transition name=”NOK” to=”error”/> </action>
  2. <!– Wait to perform action for Order Approval by CustomerCare Agent for COD / CHEQUE –> <wait id=”waitforCSAgentApprovalAction” prependProcessCode=”true” then=”failed”> <case event=”CUSTCSAgentTicketVerificationEvent”> <choice id=”ticketapproved” then=”confirmUpdateOrderStatus”/> <choice id=”ticketrejected” then=”waitForOrderCancellationCompletion”/> </case> </wait>
  3. <action id=”confirmUpdateOrderStatus” bean=”confirmUpdateOrderStatusAction”> <transition name=”OK” to=”waitForOrderAction”/> </action>

    <!– Wait to perform action on Order –>
    <wait id=”waitForOrderAction” prependProcessCode=”true” then=”failed”>
    <case event=”OrderActionEvent”>
    <choice id=”consignmentProcessEnded” then=”verifyOrderCompletion”/>
    <choice id=”cancelOrder” then=”waitForOrderCancellationCompletion”/>
    </case>
    </wait>

    <!– Wait for order cancellation to be completed –>
    <wait id=”waitForOrderCancellationCompletion” then=”verifyOrderPostCancellation” prependProcessCode=”true”>
    <event>CancellationCompletionEvent</event>
    </wait>

    <action id=”verifyOrderPostCancellation” bean=”verifyOrderPostCancellationAction”>
    <transition name=”NOK” to=”verifyOrderCompletion”/>
    <transition name=”OK” to=”success”/>
    <transition name=”WAIT” to=”waitForOrderAction”/>
    </action>

    <action id=”verifyOrderCompletion” bean=”verifyOrderCompletionAction”>
    <transition name=”OK” to=”postTaxes”/>
    <transition name=”NOK” to=”waitForOrderAction”/>
    </action>

    <!– Tax and Payment –>
    <action id=”postTaxes” bean=”postTaxesAction”>
    <transition name=”OK” to=”takePayment”/>
    </action>

    <action id=”takePayment” bean=”takePaymentAction”>
    <transition name=”OK” to=”completeOrder”/>
    <transition name=”NOK” to=”sendPaymentFailedNotification”/>
    </action>

    <action id=”completeOrder” bean=”completeOrderAction”>
    <transition name=”OK” to=”success”/>
    </action>

    <action id=”sendPaymentFailedNotification” bean=”sendPaymentFailedNotificationAction”>
    <transition name=”OK” to=”failed”/>
    </action>

    <end id=”error” state=”ERROR”>Order process error.</end>
    <end id=”failed” state=”FAILED”>Order process failed.</end>
    <end id=”success” state=”SUCCEEDED”>Order process completed.</end>

    </process>

 

Coding for Actions:-

  • <action id=”checkPaymentMode” bean=”checkPaymentModeAction”>
  • <transition name=”OK” to=”waitForOrderAction”/>
  • <transition name=”COD” to=”createTicket”/>
  • <transition name=”CHEQUE” to=”createTicket”/>
  • <transition name=”NOK” to=”error”/>
  • </action>

 

order-process-spring.xml:-

<bean id=”custAbstractcheckPaymentMode” class=”in.cust.CUSTAbstractcheckPaymentMode” abstract=”true” parent=”abstractOrderAction” />

CUSTAbstractcheckPaymentMode.java

packagein.cust;
import in.custl.actions.order.AbstractOrderAction;
import java.util.HashSet;
import java.util.Set;
import de.hybris.platform.orderprocessing.model.OrderProcessModel;
import de.hybris.platform.task.RetryLaterException;
public abstract class CUSTAbstractcheckPaymentMode <T extends OrderProcessModel> extends AbstractOrderAction<T>
{
@Override
public Set<String> getTransitions()
{
return Transition.getStringValues();
}
@Override
public String execute(final T process) throws RetryLaterException, Exception
{
return executeAction(process).toString();
}
public abstract Transition executeAction(T process) throws RetryLaterException, Exception;
public enum Transition
{
OK, NOK,COD,CHEQUE;
public static Set<String> getStringValues()
{
final Set<String> res = new HashSet<String>();
for (final Transition transitions : Transition.values())
{
res.add(transitions.toString());
}
return res;
}
}
}

<bean id=”checkPaymentModeAction” class=”in.cust.CUSTCheckPaymentModeAction”
parent=”custAbstractcheckPaymentMode” />


CUSTCheckPaymentModeAction.java
package in.cust;
import de.hybris.platform.core.enums.OrderStatus;
import de.hybris.platform.core.model.order.OrderModel;
import de.hybris.platform.core.model.order.payment.CUSTCODPaymentInfoModel;
import de.hybris.platform.core.model.order.payment.CUSTChequePaymentInfoModel;
import de.hybris.platform.orderprocessing.model.OrderProcessModel;
import de.hybris.platform.payment.dto.TransactionStatus;
import de.hybris.platform.payment.model.PaymentTransactionEntryModel;
import de.hybris.platform.payment.model.PaymentTransactionModel;
import de.hybris.platform.task.RetryLaterException;
import de.hybris.platform.payment.enums.*;
public class CUSTCheckPaymentModeAction extends CUSTAbstractcheckPaymentMode<OrderProcessModel> {
@Override
public Transition executeAction(OrderProcessModel process) throws RetryLaterException, Exception {
final OrderModel order = process.getOrder();
if (order != null) {
if (order.getPaymentInfo() instanceof  CUSTCODPaymentInfoModel) {
order.setStatus(OrderStatus.WAITING_FOR_APPROVAL);
modelService.save(order);
return Transition.COD;
} else if (order.getPaymentInfo() instanceof CUSTChequePaymentInfoModel) {
order.setStatus(OrderStatus.WAITING_FOR_APPROVAL);
modelService.save(order);
return Transition.CHEQUE;
} else {
// TODO if for individual payment methods capture is to be

for (final PaymentTransactionModel transaction : order.getPaymentTransactions()) {
for (final PaymentTransactionEntryModel entry : transaction.getEntries()) {
if (entry.getType().equals(PaymentTransactionType.CAPTURE)
&& TransactionStatus.ACCEPTED.name().equals(entry.getTransactionStatus())) {
order.setStatus(OrderStatus.PAYMENT_CAPTURED);
modelService.save(order);

return Transition.OK;
}
}
}
}
}
return Transition.OK;
}
}

Above  code can used to identification of cod/cheque/normal modes if it is  cod then  it will

  • code for triggring to cod in above CUSTCheckPaymentModeAction.java code
  • if (order.getPaymentInfo() instanceof  CUSTCODPaymentInfoModel) {
    return Transition.COD;  }
  •  <transition name=”COD” to=”createTicket”/>

After that we have to write Create Ticket logic for that ,Open  customordermanagement-spring.xml file then configure below class CUSTConfigureTicketCreation to overrid createTicket() from DefaultTicketBusinessService it is  outofBox Functionality to create the ticket.

customordermanagement-spring.xml

<bean id=”configureTicketCreation” class=”in.cust.CUSTConfigureTicketCreation”
parent=”defaultTicketBusinessService” />

 

CUSTConfigureTicketCreation.java
package in.cust;
import org.springframework.beans.factory.annotation.Autowired;
import de.hybris.platform.core.model.order.AbstractOrderModel;
import de.hybris.platform.core.model.order.OrderModel;
import de.hybris.platform.core.model.user.EmployeeModel;
import de.hybris.platform.core.model.user.UserModel;
import de.hybris.platform.ticket.enums.CsEventReason;
import de.hybris.platform.ticket.enums.CsInterventionType;
import de.hybris.platform.ticket.enums.CsTicketCategory;
import de.hybris.platform.ticket.enums.CsTicketPriority;
import de.hybris.platform.ticket.events.model.CsCustomerEventModel;
import de.hybris.platform.ticket.model.CsAgentGroupModel;
import de.hybris.platform.ticket.model.CsTicketModel;
import de.hybris.platform.ticket.model.CUSTCsTicketModel;
import de.hybris.platform.ticket.service.impl.DefaultTicketBusinessService;
import de.hybris.platform.ticket.strategies.TicketEventStrategy;
import in.com.core.enums.CUSTTicketStatus;
public class CUSTConfigureTicketCreation extends DefaultTicketBusinessService{
@Autowired
private TicketEventStrategy ticketEventStrategy;
@Override
public CsTicketModel createTicket(UserModel customer, OrderModel order, CsTicketCategory category, CsTicketPriority priority, EmployeeModel assignedAgent, CsAgentGroupModel assignedGroup, String headline, CsInterventionType interventionType, CsEventReason reason, String creationNotes) {
CUSTCsTicketModel ticket = (CUSTCsTicketModel)this.getModelService().create((Class)CUSTCsTicketModel.class);
ticket.setCustomer(customer);
ticket.setOrder((AbstractOrderModel)order);
ticket.setCategory(category);
ticket.setPriority(priority);
ticket.setAssignedAgent(assignedAgent);
ticket.setAssignedGroup(assignedGroup);
ticket.setHeadline(headline);
ticket.setTicketStatus(CUSTTicketStatus.WAIT);
CsCustomerEventModel creationEvent = this.ticketEventStrategy.createCreationEventForTicket(ticket, reason, interventionType, creationNotes);
return this.createTicket(ticket, creationEvent);
}
}
  • <action id=”createTicket” bean=”createTicketAction”>
  • <transition name=”OK” to=”waitforCSAgentApprovalAction”/>
  • <transition name=”NOK” to=”error”/>
  • </action>

 

order-process-spring.xml:-

<bean id=”createTicketAction” class=”in.cust.CreateTicketAction”
parent=”abstractAction”>
<property name=”userService” ref=”userService” />
<property name=”modelService” ref=”modelService” />
<property name=”businessProcessService” ref=”businessProcessService” /></bean>

CreateTicketAction.java
package in.cust;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import de.hybris.platform.core.GenericSearchConstants.LOG;
import de.hybris.platform.core.model.order.OrderModel;
import de.hybris.platform.core.model.user.CustomerModel;
import de.hybris.platform.core.model.user.EmployeeModel;
import de.hybris.platform.core.model.user.UserModel;
import de.hybris.platform.orderprocessing.model.OrderProcessModel;
import de.hybris.platform.processengine.BusinessProcessEvent;
import de.hybris.platform.processengine.BusinessProcessService;
import de.hybris.platform.processengine.action.AbstractSimpleDecisionAction;
import de.hybris.platform.servicelayer.model.ModelService;
import de.hybris.platform.servicelayer.user.UserService;
import de.hybris.platform.task.RetryLaterException;
import de.hybris.platform.ticket.enums.CsEventReason;
import de.hybris.platform.ticket.enums.CsInterventionType;
import de.hybris.platform.ticket.enums.CsTicketCategory;
import de.hybris.platform.ticket.enums.CsTicketPriority;
import de.hybris.platform.ticket.model.CsAgentGroupModel;
import
import in.com.constants.CustomerordermanagementConstants;
public class CreateTicketAction extends AbstractSimpleDecisionAction<OrderProcessModel> {
private static final Logger LOGGER = Logger.getLogger(CreateTicketAction.class);
private ModelService modelService;
private String ticketUserGroupName = “csagentmanagergroup”;
@Autowired
private CUSTConfigureTicketCreation ticketCreator;
private CsTicketCategory category = CsTicketCategory.ORDERVERIFICATION;;
private CsTicketPriority priority = CsTicketPriority.HIGH;
private EmployeeModel assignedAgent;
private CsAgentGroupModel assignedGroup;
private String headline = “Order_ticket”;
private CsInterventionType interventionType = CsInterventionType.EMAIL;
private CsEventReason reason = CsEventReason.COMPLAINT;
private String creationNotes = “Ticket information”;
public UserService getUserService() {
return userService;
}
@Required
public void setUserService(UserService userService) {
this.userService = userService;
}
protected UserService userService;
public ModelService getModelService() {
return modelService;
}
@Required
public void setModelService(ModelService modelService) {
this.modelService = modelService;
}
private BusinessProcessService businessProcessService;
protected BusinessProcessService getBusinessProcessService() {
return businessProcessService;
}
@Required
public void setBusinessProcessService(final BusinessProcessService businessProcessService) {
this.businessProcessService = businessProcessService;
}
@Override
public Transition executeAction(OrderProcessModel process) throws RetryLaterException, Exception {
OrderModel orderModel = process.getOrder();
if (orderModel != null) {
CsAgentGroupModel assignedGroup = (CsAgentGroupModel) userService.getUserGroupForUID(ticketUserGroupName);
EmployeeModel employee = userService.getAdminUser();
CustomerModel customer1 = (CustomerModel) process.getOrder().getUser();
headline.concat(orderModel.getCode().toString());
ticketCreator.createTicket(customer1, orderModel, category, priority, employee, assignedGroup, headline,
interventionType, reason, creationNotes);
LOGGER.info(“Creating Ticket”);
return Transition.OK;
} else
return Transition.NOK;
}
public CsTicketCategory getCategory() {
return category;
}
public void setCategory(CsTicketCategory category) {
this.category = category;
}
public CsTicketPriority getPriority() {
return priority;
}
public void setPriority(CsTicketPriority priority) {
this.priority = priority;
}
public EmployeeModel getAssignedAgent() {
return assignedAgent;
}
public void setAssignedAgent(EmployeeModel assignedAgent) {
this.assignedAgent = assignedAgent;
}
public CsAgentGroupModel getAssignedGroup() {
return assignedGroup;
}
public void setAssignedGroup(CsAgentGroupModel assignedGroup) {
this.assignedGroup = assignedGroup;
}
public String getHeadline() {
return headline;
}
public void setHeadline(String headline) {
this.headline = headline;
}
public CsInterventionType getInterventionType() {
return interventionType;
}
public void setInterventionType(CsInterventionType interventionType) {
this.interventionType = interventionType;
}
public CsEventReason getReason() {
return reason;
}
public void setReason(CsEventReason reason) {
this.reason = reason;
}
public String getCreationNotes() {
return creationNotes;
}
public void setCreationNotes(String creationNotes) {
this.creationNotes = creationNotes;
}
public CUSTConfigureTicketCreation getTicketCreator() {
return ticketCreator;
}
public void setTicketCreator(CUSTConfigureTicketCreation ticketCreator) {
this.ticketCreator = ticketCreator;
}
}

–> Ticket is created at this point and it will be goes to waiting state (waitforCSAgentApprovalAction) then admin will approve/reject the ticketstatus    mannually .

<wait id=”waitforCSAgentApprovalAction” prependProcessCode=”true” then=”failed”>
<case event=”CUSTCSAgentTicketVerificationEvent”>
<choice id=”ticketapproved” then=”confirmUpdateOrderStatus”/>
<choice id=”ticketrejected” then=”waitForOrderCancellationCompletion”/>
</case>
</wait>

After ticketapproved the ticketstatus then remaining process(order-process.xml) as to exicute ,for that we have to write Event And Listener(AfterSaveListener) .

AfterSaveListener=if Specific model will save in DataBase then this AfterSaveListener will trigger

configure below classes in customordermanagement-spring.xml

<bean id=”TicketStatusChangeEvent” class=”in.cust.CUSTTicketStatusChangeEvent” />
<bean id=”TicketStatusChangeEventListener” class=”in.CUSTTicketStatusChangeEventListener” />

 

CUSTTicketStatusChangeEvent.java

package in.cust;

import de.hybris.platform.core.PK;
import de.hybris.platform.core.model.ItemModel;
import de.hybris.platform.orderprocessing.model.OrderProcessModel;
import de.hybris.platform.servicelayer.event.events.AbstractEvent;
import de.hybris.platform.ticket.model.CUSTCsTicketModel;
public class CUSTTicketStatusChangeEvent extends AbstractEvent {
private CUSTCsTicketModel csTicketModel;
private String code;
private PK pk;
private String type;
private String modelTypeCode;
private ItemModel modelBeforeSave;
private ItemModel currentModel;
private CUSTCsTicketModel custmodelBeforeSave;
private CUSTCsTicketModel custcurrentModel;
public void setCUSTmodelBeforeSave(CUSTCsTicketModel custmodelBeforeSave) {
this.custmodelBeforeSave = custmodelBeforeSave;
}
public CUSTCsTicketModel getCUSTcurrentModel() {
return custcurrentModel;
}
public void setCUSTcurrentModel(CUSTCsTicketModel custcurrentModel) {
this.custcurrentModel = custcurrentModel;
}
public PK getPk() {
return pk;
}
public void setPk(PK pk) {
this.pk = pk;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getModelTypeCode() {
return modelTypeCode;
}
public void setModelTypeCode(String modelTypeCode) {
this.modelTypeCode = modelTypeCode;
}
public ItemModel getModelBeforeSave() {
return modelBeforeSave;
}
public void setModelBeforeSave(ItemModel modelBeforeSave) {
this.modelBeforeSave = modelBeforeSave;
}
public ItemModel getCurrentModel() {
return currentModel;
}
public void setCurrentModel(ItemModel currentModel) {
this.currentModel = currentModel;
}
public void setCsTicketModel(EMBCsTicketModel csTicketModel) {
this.csTicketModel = csTicketModel;
}
public void setCode(String code) {
this.code = code;
}
public CUSTCsTicketModel getCsTicketModel() {
return csTicketModel;
}
public String getCode() {
return code;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
}
}

open project.properies file in customordermanagement extension then define the CUSTCsTicket typecode 20001 which will be defined in *core-items.xml file

customerordermanagement.export.model.supported.typecodes=20001

CUSTTicketStatusChangeEventListener.java
package in.com.event;
import java.util.Collection;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import de.hybris.platform.core.Initialization;
import de.hybris.platform.core.enums.OrderStatus;
import de.hybris.platform.core.model.order.AbstractOrderModel;
import de.hybris.platform.core.model.order.OrderModel;
import de.hybris.platform.orderprocessing.model.OrderProcessModel;
import de.hybris.platform.processengine.BusinessProcessEvent;
import de.hybris.platform.processengine.BusinessProcessService;
import de.hybris.platform.processengine.model.ProcessTaskLogModel;
import de.hybris.platform.servicelayer.config.ConfigurationService;
import de.hybris.platform.servicelayer.event.EventService;
import de.hybris.platform.servicelayer.model.ModelService;
import de.hybris.platform.ticket.model.EMBCsTicketModel;
import de.hybris.platform.tx.AfterSaveEvent;
import de.hybris.platform.tx.AfterSaveListener;
public class CUSTTicketStatusChangeEventListener implements AfterSaveListener {
@Autowired
EventService eventService;
@Autowired
ModelService modelService;
@Autowired
ConfigurationService configurationService;
@Autowired
private BusinessProcessService businessProcessService;
public BusinessProcessService getBusinessProcessService() {
return businessProcessService;
}
public void setBusinessProcessService(BusinessProcessService businessProcessService) {
this.businessProcessService = businessProcessService;
}
@Override
public void afterSave(Collection<AfterSaveEvent> events) {
final String applicableTypeCodes = (String) this.configurationService.getConfiguration()
.getProperty(“customerordermanagement.export.model.supported.typecodes”);
final boolean isSystemInitialized = Initialization.isCurrentTenantInitializing();
final CUSTTicketStatusChangeEvent custTicketStatusChangeEvent = new CUSTTicketStatusChangeEvent();
if (!isSystemInitialized) {
for (final AfterSaveEvent afterSaveEvent : events) {
if (applicableTypeCodes.contains(afterSaveEvent.getPk().getTypeCodeAsString())) {
/* afterSaveEvent */
final Object model = this.modelService.get(afterSaveEvent.getPk());
if (model instanceof CUSTCsTicketModel) {
custTicketStatusChangeEvent.setcustcurrentModel((CUSTCsTicketModel) model);
if (custTicketStatusChangeEvent.getCUSTcurrentModel().getTicketStatus().toString()
.equalsIgnoreCase(“Approve”)) {
custTicketStatusChangeEvent.getCUSTcurrentModel().getOrder().setStatus(OrderStatus.READY);
modelService.save(custTicketStatusChangeEvent.getCUSTcurrentModel().getOrder());
AbstractOrderModel order = custTicketStatusChangeEvent.getCUSTcurrentModel().getOrder();
if (order instanceof OrderModel) {
Collection<OrderProcessModel> processModel = ((OrderModel) order).getOrderProcess();
for (OrderProcessModel orderProcessModel : processModel) {
if (orderProcessModel.getProcessDefinitionName().toString()
.equalsIgnoreCase(“order-process”)) {
final String eventId = orderProcessModel.getCode() + “_”
+ CustomerordermanagementConstants.EMB_CSAGENT_TICKET_VERIFICATION_EVENT;
final BusinessProcessEvent event = BusinessProcessEvent.builder(eventId)
.withChoice(“ticketapproved”).build();
getBusinessProcessService().triggerEvent(event);
}
}
}
}
else if (custTicketStatusChangeEvent.getCUSTcurrentModel().getTicketStatus().toString()
.equalsIgnoreCase(“wait”)) {
custTicketStatusChangeEvent.getCUSTcurrentModel().getOrder()
.setStatus(OrderStatus.WAITING_FOR_APPROVAL);
modelService.save(custTicketStatusChangeEvent.getCUSTcurrentModel().getOrder());
} else {
custTicketStatusChangeEvent.getCUSTcurrentModel().getOrder().setStatus(OrderStatus.CANCELLED);
modelService.save(custTicketStatusChangeEvent.getCUSTcurrentModel().getOrder());
}
this.eventService.publishEvent(embTicketStatusChangeEvent);
}
}
}
}
}
}

 

note:

customerordermanagement.export.model.supported.typecodes=20001 be the table CUSTCsTicket type code by using below code we will identify the respected Model,and if we do any changes and save in db of this model then CUSTTicketStatusChangeEventListener

will trigger .

final String applicableTypeCodes = (String) this.configurationService.getConfiguration()
.getProperty(“customerordermanagement.export.model.supported.typecodes”);

if (applicableTypeCodes.contains(afterSaveEvent.getPk().getTypeCodeAsString())) {

final Object model = this.modelService.get(afterSaveEvent.getPk());


 

<action id=”confirmUpdateOrderStatus” bean=”confirmUpdateOrderStatusAction”>
<transition name=”OK” to=”waitForOrderAction”/>
</action>

 

order-process-spring.xml:-

<bean id=”confirmUpdateOrderStatusAction” class=”in.cust.ConfirmUpdateOrderStatusAction”
parent=”abstractAction” />

 

CUSTConfirmUpdateOrderStatusAction.java
package in.cust;
import org.apache.log4j.Logger;
import de.hybris.platform.core.model.order.OrderModel;
import de.hybris.platform.orderprocessing.model.OrderProcessModel;
import de.hybris.platform.processengine.action.AbstractProceduralAction;
import de.hybris.platform.task.RetryLaterException;
public class CUSTConfirmUpdateOrderStatusAction extends AbstractProceduralAction<OrderProcessModel> {
@Override
public void executeAction(OrderProcessModel orderProcessModel) throws RetryLaterException, Exception {
// TODO Auto-generated method stub
if (orderProcessModel != null) {
LOG.info(“Process: ” + orderProcessModel.getCode() + ” in step ” + getClass().getSimpleName());
OrderModel orderModel = orderProcessModel.getOrder();
}
}

 

reffernce:-https://wiki.hybris.com/display/R5T/Trail+~+Customizing+OMS+Process+Engines