<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>Adding Custom Commerce Order Status</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=121451370" />
  <subtitle>Adding Custom Commerce Order Status</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=121451370</id>
  <updated>2026-04-04T04:27:29Z</updated>
  <dc:date>2026-04-04T04:27:29Z</dc:date>
  <entry>
    <title>RE: RE: Adding Custom Commerce Order Status</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121453625" />
    <author>
      <name>Jay Savariya</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121453625</id>
    <updated>2022-06-27T11:06:15Z</updated>
    <published>2022-06-27T10:58:30Z</published>
    <summary type="html">&lt;p&gt;Hello Jeffrey, thanks for answering.&lt;/p&gt;
&lt;p&gt;I want to add READY_TO_SHIP status between PROCESSING  and SHIPPED 
  status, so as per the article that you have suggested I have
  implemented the same steps and getting this outcome :&lt;/p&gt;
&lt;p&gt;
  &lt;img alt="" src="https://liferay.dev/documents/14/0/orderStatus.png/6777912b-59c9-2677-68dd-ae856d5d52ce?t=1656308924784&amp;amp;imagePreview=1" /&gt;&lt;/p&gt;
&lt;p&gt;I have overridden the ShippedCommerceStatus as it is the next status
  after my custom status class as shown in below code blocks :&lt;/p&gt;
&lt;p&gt;1) SchedulingCommerceOrderStatus.java (I have kept the class name
  same as given in exaple but changed the label and key for READY_TO_SHIP)&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;@Component(&lt;br /&gt;     property = {&lt;br /&gt;       
     &amp;quot;commerce.order.status.key=131167&amp;quot;,&lt;br /&gt;       
     &amp;quot;commerce.order.status.priority:Integer=55&amp;quot;&lt;br /&gt;   
     },&lt;br /&gt;     service = CommerceOrderStatus.class&lt;br /&gt; )&lt;br /&gt;
    public class SchedulingCommerceOrderStatus implements
    CommerceOrderStatus {&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public CommerceOrder
    doTransition(CommerceOrder commerceOrder, long userId) throws
    PortalException {&lt;br /&gt;       
     commerceOrder.setOrderStatus(131167);&lt;br /&gt;         return
    _commerceOrderService.updateCommerceOrder(commerceOrder);&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public int getKey() {&lt;br /&gt;         return
    131167;&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public String getLabel(Locale locale)
    {&lt;br /&gt;         return &amp;quot;Ready to Ship&amp;quot;;&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public int getPriority() {&lt;br /&gt;       
     return 55;&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public boolean isComplete(CommerceOrder
    commerceOrder) {&lt;br /&gt;         ExpandoBridge expandoBridge = commerceOrder.getExpandoBridge();&lt;/p&gt;
  &lt;p&gt;        String[] values =
    (String[])expandoBridge.getAttribute(&lt;br /&gt;             &amp;quot;ready
    to ship&amp;quot;);&lt;/p&gt;
  &lt;p&gt;        if (ArrayUtil.isEmpty(values)) {&lt;br /&gt;             return
    false;&lt;br /&gt;         }&lt;/p&gt;
  &lt;p&gt;        return Objects.equals(values[0],
    &amp;quot;Confirmed&amp;quot;);&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public boolean
    isTransitionCriteriaMet(CommerceOrder commerceOrder)&lt;br /&gt;       
     throws PortalException {&lt;/p&gt;
  &lt;p&gt;        if (commerceOrder.getOrderStatus() ==
    CommerceOrderConstants.ORDER_STATUS_PROCESSING) {&lt;/p&gt;
  &lt;p&gt;            return true;&lt;br /&gt;         }&lt;br /&gt;         return
    true;&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Reference&lt;br /&gt;     private CommerceOrderService _commerceOrderService;&lt;/p&gt;
  &lt;p&gt;}&lt;br /&gt;  &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;2) ShippedCommerceOrderStatus.java&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;
    &lt;br /&gt; @Component(&lt;br /&gt;         property = {&lt;br /&gt;           
     &amp;quot;commerce.order.status.key=&amp;quot; +
    CommerceOrderConstants.ORDER_STATUS_SHIPPED,&lt;br /&gt;           
     &amp;quot;commerce.order.status.priority:Integer=60&amp;quot;,&lt;br /&gt;       
         &amp;quot;service.ranking:Integer=100&amp;quot;&lt;br /&gt;         },&lt;br /&gt;
            service = CommerceOrderStatus.class&lt;br /&gt; )&lt;br /&gt; public
    class ShippedCommerceOrderStatus implements CommerceOrderStatus {&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public CommerceOrder
    doTransition(CommerceOrder commerceOrder, long userId) throws
    PortalException {&lt;/p&gt;
  &lt;p&gt;        commerceOrder.setOrderStatus(CommerceOrderConstants.ORDER_STATUS_SHIPPED);&lt;/p&gt;
  &lt;p&gt;        return
    _commerceOrderService.updateCommerceOrder(commerceOrder);&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public int getKey() {&lt;br /&gt;         return
    CommerceOrderConstants.ORDER_STATUS_SHIPPED;&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public String getLabel(Locale locale)
    {&lt;br /&gt;         return &amp;quot;Shipped&amp;quot;;&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public int getPriority() {&lt;br /&gt;       
     return 60;&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public boolean isComplete(CommerceOrder
    commerceOrder) {&lt;/p&gt;
  &lt;p&gt;        if (commerceOrder.isApproved() &amp;amp;&amp;amp;
    !commerceOrder.isOpen() &amp;amp;&amp;amp; (commerceOrder.getOrderStatus()
    != 131167)) {&lt;br /&gt;             return true;&lt;br /&gt;         }&lt;/p&gt;
  &lt;p&gt;        return false;&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public boolean
    isTransitionCriteriaMet(CommerceOrder commerceOrder)&lt;br /&gt;       
     throws PortalException {&lt;/p&gt;
  &lt;p&gt;        if (commerceOrder.getOrderStatus() == 131167) {&lt;br /&gt;   
         return true;&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;        return false;&lt;br /&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br /&gt;     public boolean
    isValidForOrder(CommerceOrder commerceOrder)&lt;br /&gt;         throws
    PortalException {&lt;/p&gt;
  &lt;p&gt;        if (!_commerceShippingHelper.isShippable(commerceOrder))
    {&lt;br /&gt;             return false;&lt;br /&gt;         }&lt;/p&gt;
  &lt;p&gt;        return true;&lt;br /&gt;     }&lt;br /&gt;     @Reference&lt;br /&gt;   
     private CommerceOrderService _commerceOrderService;&lt;br /&gt;   
     @Reference&lt;br /&gt;     private CommerceOrderEngine
    _commerceOrderEngine;&lt;br /&gt;     @Reference&lt;br /&gt;     private
    CommerceShippingHelper _commerceShippingHelper;&lt;br /&gt; }&lt;/p&gt;&lt;/blockquote&gt;</summary>
    <dc:creator>Jay Savariya</dc:creator>
    <dc:date>2022-06-27T10:58:30Z</dc:date>
  </entry>
  <entry>
    <title>RE: Adding Custom Commerce Order Status</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121452946" />
    <author>
      <name>Jeffrey Handa</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121452946</id>
    <updated>2022-06-24T16:02:43Z</updated>
    <published>2022-06-24T16:02:43Z</published>
    <summary type="html">&lt;p&gt;Hi Jay, have you tried following the steps in this article?  &lt;/p&gt;
&lt;p&gt;https://learn.liferay.com/commerce/latest/en/developer-guide/order-management/implementing-a-custom-order-status.html&lt;/p&gt;
&lt;p&gt;If so, can you share what you've done and what problems you're experiencing?  &lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Also, one order will only have one shipment. (Is there any flag for this?)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;No, I don't believe there is a flag for limiting the number of
  shipments per order.&lt;/p&gt;</summary>
    <dc:creator>Jeffrey Handa</dc:creator>
    <dc:date>2022-06-24T16:02:43Z</dc:date>
  </entry>
  <entry>
    <title>Adding Custom Commerce Order Status</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121451369" />
    <author>
      <name>Jay Savariya</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121451369</id>
    <updated>2022-06-24T13:22:52Z</updated>
    <published>2022-06-23T12:53:11Z</published>
    <summary type="html">&lt;p&gt;I am trying to add a custom READY_TO_SHIP commerce order status
  between PROCESSING and SHIPPED  commerce order status. The PROCESSING
  status does not end until the shipment goes to SHIPPED status. And
  then the order goes to the SHIPPED status, but I want to add the
  READY_TO_SHIP status when the shipment goes to the READY_TO_SHIP status.&lt;/p&gt;
&lt;p&gt;So the problem is order status will still be PROCESSING until the
  shipment gets shipped so how can I insert the READY_TO_SHIP order
  status when a shipment gets to the READY_TO_SHIP status.&lt;/p&gt;
&lt;p&gt;Also, one order will only have one shipment. (Is there any flag for this?)&lt;/p&gt;</summary>
    <dc:creator>Jay Savariya</dc:creator>
    <dc:date>2022-06-23T12:53:11Z</dc:date>
  </entry>
</feed>
