Fluent Commerce Logo
Sign In

Enable Return Order with Exchange in Fluent OMS

How-to Guide
Extend

Authors:

Valery Kornilovich, Sergey Chebotarev

Changed on:

20 Mar 2025

Key Points

  • Eligibility & Conditions – Clearly define the conditions under which an item can be exchanged, such as time limits, product conditions, and receipt requirements.
  • Exchange Process – Outline the step-by-step process, including how customers initiate an exchange, return shipping details, and replacement timelines.
  • Inventory & Availability – Ensure the desired replacement item is in stock and provide alternatives if it's unavailable.
  • Refund vs. Exchange Policy – Specify whether price differences will be refunded or charged.
  • Customer Communication – Keep customers informed at every stage with order tracking, confirmation emails, and support availability.
No alt text provided

Steps

Step arrow right iconUse Case

A use case for a return order with exchange is when a customer receives a defective product and wants to exchange it for a functional one without incurring additional costs.

Step arrow right iconSolution Approach

As a solution we need to modify workflows to support Return Process with or without RMA. 

Add new custom rules so support changes in workflow

Modify existed UI component to support better visualization and add ability to initiate Exchange process.

Step arrow right iconChallenges / Limitations

Current solution does not provide some side functionality that needs to be implemented based on the client specific Workflow features (or linked 3rd party solutions) as standalone rules:

  • no automatic generation of FinancialTransaction (the information of price change is transferred to the rule)
  • no automatic e-mail send (can be done based on other 3rd party solutions like "Mandrill")
  • no display of some additional specific information for the Return order done with Exchange (can be done as a separate page of additional information elements for existing pages)

Step arrow right iconRules changes

CreateReturnOrderFromOrder rule

CreateReturnOrderFromOrder rule creates a new Return Order according to User Action attributes. It also creates Exchange Order if Exchange Items list is not empty. 

Context Entity: ORDER

Required Event attributes

  • returnItems - list of the returned items;
  • exchangeItems - an object that contains the list of the exchange items, sign of Uneven Exchange, and the list of Financial Transactions (optional);
  • pickupLocation - Pickup Location Ref or Pickup Address;
  • destinationLocation - Destination Location Ref;
  • lodgedLocation - Lodged Location Ref (deprecated attribute, it is an empty field now);
  • type - Type of Return Order, contains DEFAULT value.
1{
2    "returnItems": [
3      {
4        "orderItemRef": "ShoesBeige7",
5        "returnReason": {
6          "label": "Wrong Size",
7          "value": "WRONGSIZE"
8        },
9        "unitQuantity": {
10          "quantity": 1
11        },
12        "returnCondition": {
13          "label": "Reusable",
14          "value": "GOOD"
15        }
16      }
17    ],
18    "exchangeItems": {
19      "even": false,
20      "items": [
21        {
22          "ref": "TrainersCitron8",
23          "price": "132.00",
24          "taxType": "VAT",
25          "currency": "GBP",
26          "quantity": 2,
27          "productCatalogueRef": "DEFAULT:34"
28        }
29      ],
30      "financialTransactions": [
31        {
32          "ref": "9ffdadb9-47f4-4aec-8b99-b6d06bdc2695",
33          "type": "PAYMENT",
34          "amount": 78,
35          "cardType": "MASTERCARD",
36          "currency": "GBP",
37          "paymentMethod": "CREDITCARD",
38          "paymentProvider": "BRAINTREE",
39          "externalTransactionId": "",
40          "externalTransactionCode": ""
41        }
42      ]
43    },
44    "pickupLocation": {
45      "lodgedLocation": "STORE_5_DEMO_GB"
46    },
47    "destinationLocation": "DC_2_DEMO_GB",
48    "lodgedLocation": "",
49    "type": "DEFAULT"
50  }
1{
2    "name": "{{fluent.account.client_id}}.sefeature.CreateReturnOrderFromOrder",
3    "props": null
4}
CopyReturnAttributesToOrderItems rule

CopyReturnAttributesToOrderItems rule copies values of RETURN_TYPE and RETURN_PERIOD attributes from Variant or Standard Product to Order Items of the Order. This rule should be used when a Fulfilment of the Order goes into Awaiting Collection (CC Workflow) or Courier Collection (HD Workflow) status.

Context Entity: FULFILMENT

1{
2    "name": "{{fluent.account.client_id}}.sefeature.CopyReturnAttributesToOrderItems",
3    "props": {}
4}
CalculateReturnableQuantityForOrderItems rule

CalculateReturnableQuantityForOrderItems rule calculates returnable quantity for each Order Items in the current Order and saves this value in returnableQty attribute of the Order Item. This rule takes into account that Order Item could be partially or fully substituted. Substituted quantity is stored in substituteQuantity attribute of Order Item.

Context Entity: ORDER

1content missing :)
CalculateReturnDateLimitForOrderItems rule

CalculateReturnDateLimitForOrderItems rule calculates return date limit for each Order Items in the current Order and saves this value in RETURN_DATE_LIMIT attribute of the Order Item. If the Order Item is not returnable date limit is not calculated. RETURN_PERIOD attribute of Order Item is used to calculate return date limit according to the next formula Return-Date-Limit = Current-Date + RETURN_PERIOD (number of days).

Context Entity: ORDER

1{
2    "name": "{{fluent.account.client_id}}.sefeature.CalculateReturnDateLimitForOrderItems",
3    "props": {}
4}
AssignRmaToReturnOrder rule

AssignRmaToReturnOrder rule creates RMA key and calculates RMA Key Expiration Date. These values is stored in returnAuthorisationKey and returnAuthorisationKeyExpiry fields of the current Return Order respectively.

Context Entity: RETURN_ORDER

1{
2    "name": "{{fluent.account.client_id}}.sefeature.AssignRmaToReturnOrder",
3    "props": null
4}
ValidateReturnOrderItems rule

ValidateReturnOrderItems rule validates all Return Order Items of a newly created Return Order. It checks three points:

  • the Order Items has to be returnable;
  • the return date limit (if it is set) has not to be expired;
  • quantity has not to exceed current returnable quantity of the item.

If all checks passes return order confirmation event is invocated (name of this event is passed in confirmReturnOrder property of the rule).

If any checks for any Order Item fails return order rejection event is invocated (name of this event is passed in rejectReturnOrder property of the rule). Rejection reasons are saved in RETURN_REJECTION_REASONS attribute of the Return Order.

Context Entity: RETURN_ORDER

Rule properties:

  • confirmReturnOrder - Name of Event to be sent if all Order Items pass all checks
  • rejectReturnOrder - Name of Event to be sent if at least one Order Item does not pass any checks
1{
2    "name": "{{fluent.account.client_id}}.sefeature.ValidateReturnOrderItems",
3    "props": {
4        "rejectReturnOrder": "RejectReturnOrder",
5        "confirmReturnOrder": "ConfirmReturnOrder"
6    }
7}
CreateReturnFulfilments rule

CreateReturnFulfilments rule creates Return Fulfilments for the current Return Order. All Order Items are grouped by value of RETURN_TYPE attributes. A Return Fulfilment is created for each group: DEFAULT and RMA. Value of return type is saved into RETURN_TYPE attribute of the Return Fulfilment.

Context Entity: RETURN_ORDER

1{
2    "name": "{{fluent.account.client_id}}.sefeature.CreateReturnFulfilments",
3    "props": null
4}
SendEventIfAllReturnFulfilmentsInStatuses rule

SendEventIfAllReturnFulfilmentsInStatuses rule checks that all Return Fulfilments of the current Return Order are in statuses listed on status property of the rule. If check passes an event is executed. Event name is passed in eventName property of the rule.

Context Entity: RETURN_ORDER

Rule properties:

  • status - the list of checked Fulfilment statuses
  • eventName - name of the Event to be sent if all checks are passed
1{
2    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfAllReturnFulfilmentsInStatuses",
3    "props": {
4        "status": [
5            "CANCELLED"
6        ],
7    "eventName": "CancelReturnOrder"
8    }
9}
SendEventIfAnyReturnFulfilmentInStatuses rule

SendEventIfAnyReturnFulfilmentInStatuses rule checks that any of Return Fulfilments of the current Return Order is in status listed on status property of the rule. If check passes an event is executed. Event name is passed in eventName property of the rule.

Context Entity: RETURN_ORDER

Rule properties:

  • status - the list of checked Fulfilment statuses
  • eventName - name of the Event to be sent if any check is passed
1{
2    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfAnyReturnFulfilmentInStatuses",
3    "props": {
4        "status": [
5            "COMPLETE"
6        ],
7        "eventName": "CheckIfReturnOrderIsVerified"
8    }
9}
SendEventIfReturnFulfilmentAttributeEqualsTo rule

SendEventIfReturnFulfilmentAttributeEqualsTo rule checks if Return Fulfilment attribute with name passed in attributeName property exists and equal to the value passed in attributeValue property. If the check is successful event with name passed in eventName property is invoked.

Context Entity: RETURN_FULFILMENT

Rule properties:

  • attributeName - name of Return Fulfilment attribute that has to be checked
  • attributeValue - attribute value to be checked with
  • eventName - name of the Event to be sent if values matches with Attribute value
1{
2    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfReturnFulfilmentAttributeEqualsTo",
3    "props": {
4        "eventName": "CheckIfThereIsExchangeOrder",
5        "attributeName": "RETURN_TYPE",
6        "attributeValue": "RMA"
7    }
8}
SendEventIfReturnOrderIsRMA rule

SendEventIfReturnOrderIsRMA rule checks if the current Return Order contains RMA Return Items. If there is event with name passed in eventName property is invoked. Delay of the invocation can be specified in delay property.

Context Entity: RETURN_ORDER

Rule properties:

  • eventName - name of the Event to be sent
  • delay - time delay for sending Event in seconds
1{
2    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfReturnOrderIsRMA",
3    "props": {
4        "delay": 1,
5        "eventName": "ProcessRMAReturnOrderWithExchange"
6    }
7}
SendEventIfReturnOrderIsNotRMA rule

SendEventIfReturnOrderIsNotRMA rule checks if the current Return Order contains RMA Return Items. If there is NOT event with name passed in eventName property is invoked. Delay of the invocation can be specified in delay property.

Context Entity: RETURN_ORDER

Rule properties:

  • eventName - name of the Event to be sent
  • delay - time delay for sending Event in seconds
1{
2    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfReturnOrderIsNotRMA",
3    "props": {
4        "delay": 1,
5        "eventName": "ProcessDefaultReturnOrderWithExchange"
6    }
7}
SendEventIfExchangeOrderExistedOrNot rule

SendEventIfExchangeOrderExistedOrNot rule checks if the current Return Order contains Exchange Order. The event with name passed in eventName is invoked according a value passed in exchangeOrderExisted property. The event is sent if the value is TRUE and Exchange Order exists or the value is FALSE and Exchange Order doesn’t exist.

Context Entity: RETURN_ORDER

Rule properties:

  • eventName - name of the Event to be sent
  • delay - time delay for sending Event in seconds
  • exchangeOrderExisted - boolean value to decide in what case Event has to be sent
1{
2    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
3    "props": {
4        "eventName": "NotifyExchangeOrder",
5        "delay": 1,
6        "exchangeOrderExisted": "TRUE"
7    }
8}
SendEventToAllReturnFulfilments rule

SendEventToAllReturnFulfilments rule sends event with name specified in eventName property to all Return Fulfilments of the current Return Order.

Context Entity: RETURN_ORDER

Rule properties:

  • eventName - name of the Event to be sent
1{
2    "name": "{{fluent.account.client_id}}.sefeature.SendEventToAllReturnFulfilments",
3    "props": {
4        "eventName": "CancelReturnOrderFulfilment"
5    }
6}
SendEventToReturnOrderFromFulfilment rule

SendEventToReturnOrderFromFulfilment rule sends event with name specified in eventName property to Return Order (root entity) from the current Return Fulfilment. Delay of the invocation can be specified in delay property.

Context Entity: RETURN_FULFILMENT

Rule properties:

  • eventName - name of the Event to be sent
  • delay - time delay for sending Event in seconds
1{
2    "name": "{{fluent.account.client_id}}.sefeature.SendEventToReturnOrderFromFulfilment",
3    "props": {
4        "delay": 1,
5        "eventName": "NotifyReturnOrder"
6    }
7}
SendEventToUpdateInventoryQuantityReturnOrder rule

SendEventToUpdateInventoryQuantityReturnOrder rule sends event with name specified in eventName property to Inventory Catalogue with reference specified in inventoryCatalogueRef property. List of the items that should be updated is passed in items attribute of the event. This list contains only items that have conditions specified in returnConditions property and belong to Return Fulfilments that are in status specified in fulfilmentStatuses property.

Context Entity: RETURN_ORDER

Rule properties:

  • eventName - name of the Event to be sent
  • inventoryCatalogueRef - Ref of the Inventory Catalogue
  • returnConditions - the list of accepted Return Conditions
  • fulfilmentStatuses - the list of accepted return fulfilment statuses

Generated Event attributes:

  • items - list of the items that have to be returned into Inventory
1[
2    {
3        "skuRef": "ShoesBeige8",
4        "saleQty": 0,
5        "quantity": 0,
6        "cancelQty": 0,
7        "reserveQty": 1,
8        "locationRef": "DC_2_DEMO_GB",
9        "fulfilmentId": "HD-1739520611128-R81518",
10        "correctionQty": 0
11    }
12]
1{
2    "name": "{{fluent.account.client_id}}.sefeature.SendEventToUpdateInventoryQuantityReturnOrder",
3    "props": {
4        "eventName": "UpdateReturnOrderInventoryQty",
5        "returnConditions": [
6            "GOOD"
7        ],
8        "fulfilmentStatuses": [
9            "COMPLETE"
10        ],
11        "inventoryCatalogueRef": "DEFAULT:{{fluent.retailer.current.id}}"
12    }
13}
SendEventToExchangeOrderIfReturnOrderInStatus rule

SendEventToExchangeOrderIfReturnOrderInStatus rule sends event with name specified in eventName property to an Exchange Order if it exists for the current Return Order and the Return Order is in status which value is equal to setting with name specified in setting property.

Context Entity: RETURN_ORDER

Rule properties:

  • eventName - name of the Event to be sent
  • setting - name of the Setting that contains Status name
1{
2    "name": "{{fluent.account.client_id}}.sefeature.SendEventToExchangeOrderIfReturnOrderInStatus",
3    "props": {
4        "eventName": "ResumeExchangeOrder",
5        "setting": "EXCHANGE_ORDER_NOTIFICATION_STATUS"
6    }
7}
ScheduleEventIfRMAExpirationIsSet rule

ScheduleEventIfRMAExpirationIsSet rule sends delayed event with name specified in eventName property to the same Return Order if returnAuthorisationKeyExpiry field of the Return Order is not empty and contains valid date value.

Context Entity: RETURN_ORDER

Rule properties:

  • eventName - name of the Event to be sent
1{
2    "name": "{{fluent.account.client_id}}.sefeature.ScheduleEventIfRMAExpirationIsSet",
3    "props": {
4        "eventName": "CancelExpiredReturnOrder"
5    }
6}
SendEventIfExchangeOrderExistedOrNot rule

SendEventIfExchangeOrderExistedOrNot rule sends delayed event with name specified in eventName property if Exchange Order exists or not according to the value in exchangeOrderExisted property. Delay is set in delay property.

Context Entity: RETURN_ORDER, RETURN_FULFILMENT

Rule properties:

  • eventName - name of the Event to be sent
  • delay - time delay for sending Event in seconds
  • exchangeOrderExisted - boolean value: TRUE - sends Event if Exchange Order exists, FALSE - sends Event if Exchange Order doesn't exist.
1{
2    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
3    "props": {
4        "eventName": "NotifyExchangeOrder",
5        "delay": 1,
6        "exchangeOrderExisted": "TRUE"
7    }
8}
UpdateTotalAmountForReturnOrder rule

UpdateTotalAmountForReturnOrder rule updates total amount and total tax amount of the current Return Order taking into account only ReturnFulfilments that are in status passed in status property. Also this rule takes into account that Return Order could be partially refunded by Exchange Order. Total amount of Return Order is updated correctly in case of partial refund.

Context Entity: RETURN_ORDER

Rule properties:

  • status - list of Fulfilment statuses
1{
2    "name": "{{fluent.account.client_id}}.sefeature.UpdateTotalAmountForReturnOrder",
3    "props": {
4        "status": [
5            "COMPLETE"
6        ]
7    }
8}
ApplyFulfilmentCostToReturnOrder rule

ApplyFulfilmentCostToReturnOrder rule updates the Return Order with the fulfilment cost included if all eligible items have been returned.

Context Entity: RETURN_ORDER

1{
2    "name": "{{fluent.account.client_id}}.sefeature.ApplyFulfilmentCostToReturnOrder",
3    "props": {}
4}

Step arrow right iconWorkflow changes

HD & CC Order Workflows changes

Several changes were made in both CC & HD Workflow in order to support new Return Order logic.

  • CopyReturnAttributesToOrderItems rule was inserted in AllArticlesAwaitingCollection ruleset in both HD & CC Workflows.
1{
2    "name": "AllArticlesAwaitingCollection",
3    "description": "Fulfilment State Change to AWAITING_COLLECTION",
4    "type": "FULFILMENT",
5    "eventType": "NORMAL",
6    "rules": [
7        {
8            "name": "{{fluent.account.client_id}}.core.SetState",
9            "props": {
10                "status": "AWAITING_COLLECTION"
11            }
12        },
13        {
14            "name": "{{fluent.account.client_id}}.sefeature.CopyReturnAttributesToOrderItems",
15            "props": {}
16        },
17        {
18            "name": "{{fluent.account.client_id}}.order.SendEventForOrder",
19            "props": {
20                "eventName": "FulfilmentAwaitingCollection"
21            }
22        }
23    ],
24    "triggers": [
25        {
26            "status": "FULFILLED"
27        },
28        {
29            "status": "PARTIALLY_FULFILLED"
30        },
31        {
32            "status": "AWAITING_ARRIVAL"
33        }
34    ],
35    "userActions": []
36}
1
2{
3    "name": "AllArticlesAwaitingCurbside",
4    "description": "Fulfilment State Change to AWAITING_CURBSIDE",
5    "type": "FULFILMENT",
6    "eventType": "NORMAL",
7    "rules": [
8        {
9            "name": "{{fluent.account.client_id}}.core.SetState",
10            "props": {
11                "status": "AWAITING_CURBSIDE"
12            }
13        },
14        {
15            "name": "{{fluent.account.client_id}}.sefeature.CopyReturnAttributesToOrderItems",
16            "props": {}
17        },
18        {
19            "name": "{{fluent.account.client_id}}.order.SendEventForOrder",
20            "props": {
21                "eventName": "FulfilmentAwaitingCurbside"
22            }
23        }
24    ],
25    "triggers": [
26        {
27            "status": "FULFILLED"
28        },
29        {
30            "status": "PARTIALLY_FULFILLED"
31        },
32        {
33            "status": "AWAITING_ARRIVAL"
34        }
35    ],
36    "userActions": []
37}
1{
2    "name": "AllArticlesAwaitingCollection",
3    "description": "Fulfilment State Change to COURIER_COLLECTION",
4    "type": "FULFILMENT",
5    "eventType": "NORMAL",
6    "rules": [
7        {
8            "name": "{{fluent.account.client_id}}.core.SetState",
9            "props": {
10                "status": "COURIER_COLLECTION"
11            }
12        },
13        {
14            "name": "{{fluent.account.client_id}}.sefeature.CopyReturnAttributesToOrderItems",
15            "props": {}
16        },
17        {
18            "name": "{{fluent.account.client_id}}.order.SendEventForOrder",
19            "props": {
20                "eventName": "FulfilmentAwaitingCollection"
21            }
22        }
23    ],
24    "triggers": [
25        {
26            "status": "FULFILLED"
27        },
28        {
29            "status": "PARTIALLY_FULFILLED"
30        }
31    ],
32    "userActions": []
33}
  • CalculateReturnDateLimitForOrderItems and CalculateReturnableQuantityForOrderItems rules were inserted in OrderComplete ruleset in both HD & CC Workflows.
1{
2    "name": "OrderComplete",
3    "description": "Order Complete",
4    "type": "ORDER",
5    "eventType": "NORMAL",
6    "rules": [
7        {
8            "name": "{{fluent.account.client_id}}.core.SetState",
9            "props": {
10                "status": "COMPLETE"
11            }
12        },
13        {
14            "name": "{{fluent.account.client_id}}.sefeature.CalculateReturnDateLimitForOrderItems",
15            "props": {}
16        },
17        {
18            "name": "{{fluent.account.client_id}}.sefeature.CalculateReturnableQuantityForOrderItems",
19            "props": {}
20        },
21        {
22            "name": "{{fluent.account.client_id}}.seorder.SendEventIfOrderHasAttribute",
23            "props": {
24                "eventName": "CompleteSubOrder",
25                "attributeName": "masterOrderRef"
26            }
27        }
28    ],
29    "triggers": [
30        {
31            "status": "AWAITING_COLLECTION"
32        },
33        {
34            "status": "BOOKED"
35        },
36        {
37            "status": "PICK_PACK"
38        },
39        {
40            "status": "CUSTOMER_ARRIVED"
41        },
42        {
43            "status": "AWAITING_PAYMENT"
44        },
45        {
46            "status": "AWAITING_TRANSACTION"
47        },
48        {
49            "status": "AWAITING_CURBSIDE"
50        }
51    ],
52    "userActions": []
53},
54
1{
2    "name": "OrderComplete",
3    "description": "Order Complete - ES rule, no subtype",
4    "type": "ORDER",
5    "eventType": "NORMAL",
6    "rules": [
7        {
8            "name": "{{fluent.account.client_id}}.core.SetState",
9            "props": {
10                "status": "COMPLETE"
11            }
12        },
13        {
14            "name": "{{fluent.account.client_id}}.sefeature.CalculateReturnDateLimitForOrderItems",
15            "props": {}
16        },
17        {
18            "name": "{{fluent.account.client_id}}.sefeature.CalculateReturnableQuantityForOrderItems",
19            "props": {}
20        },
21        {
22            "name": "{{fluent.account.client_id}}.secommon.SendEventForCustomerNotification",
23            "props": {
24                "customerNotificationType": "EMAIL",
25                "notificationSetting": "CUSTOMER_NOTIFICATIONS",
26                "eventName": "SendEmailNotificationForCompleteOrder"
27            }
28        },
29        {
30            "name": "{{fluent.account.client_id}}.secommon.SendEventForCustomerNotification",
31            "props": {
32                "customerNotificationType": "SMS",
33                "notificationSetting": "CUSTOMER_NOTIFICATIONS",
34                "eventName": "SendSmsNotificationForCompleteOrder"
35            }
36        },
37        {
38            "name": "{{fluent.account.client_id}}.seorder.SendEventIfOrderHasAttribute",
39            "props": {
40                "eventName": "CompleteSubOrder",
41                "attributeName": "masterOrderRef"
42            }
43        }
44    ],
45    "triggers": [
46        {
47            "status": "COURIER_COLLECTION"
48        },
49        {
50            "status": "BOOKED"
51        },
52        {
53            "status": "PICK_PACK"
54        },
55        {
56            "status": "COMPLETE"
57        },
58        {
59            "status": "DELIVERED"
60        },
61        {
62            "status": "AWAITING_PAYMENT"
63        },
64        {
65            "status": "AWAITING_TRANSACTION"
66        }
67    ],
68    "userActions": []
69}
  • ReturnOrderExtended ruleset was extended with new types of User Action attributes. RETURN_COMPLETE status was also added into triggers list of this ruleset.
1{
2    "name": "ReturnOrderExtended",
3    "description": "Validate if the item can be returned and create the return order",
4    "type": "ORDER",
5    "subtype": "CC",
6    "eventType": "NORMAL",
7    "rules": [
8        {
9            "name": "{{fluent.account.client_id}}.order.ValidateReturnQty",
10            "props": null
11        },
12        {
13            "name": "{{fluent.account.client_id}}.sefeature.CreateReturnOrderFromOrder",
14            "props": null
15        }
16    ],
17    "triggers": [
18        {
19            "status": "COMPLETE"
20        },
21        {
22            "status": "RETURN_CREATED"
23        },
24        {
25            "status": "RETURN_COMPLETE"
26        }
27    ],
28    "userActions": [
29        {
30            "context": [
31                {
32                    "label": "Submit Return",
33                    "type": "PRIMARY",
34                    "modules": [
35                        "adminconsole",
36                        "store",
37                        "servicepoint"
38                    ],
39                    "confirm": false
40                }
41            ],
42            "attributes": [
43                {
44                    "name": "returnItems",
45                    "label": "Items",
46                    "type": "returnItemsExtended",
47                    "source": "",
48                    "defaultValue": "",
49                    "mandatory": true
50                },
51                {
52                    "name": "exchangeItems",
53                    "label": "Exchange Items",
54                    "type": "exchangeItems",
55                    "source": "",
56                    "defaultValue": "",
57                    "mandatory": false
58                },
59                {
60                    "name": "pickupLocation",
61                    "label": "Pickup Location",
62                    "type": "pickupLocation",
63                    "source": "",
64                    "defaultValue": "",
65                    "mandatory": true
66                },
67                {
68                    "name": "destinationLocation",
69                    "label": "Destination Location",
70                    "type": "destinationLocation",
71                    "source": "",
72                    "defaultValue": "",
73                    "mandatory": true
74                },
75                {
76                    "name": "lodgedLocation",
77                    "label": "Lodged Location",
78                    "type": "emptyField",
79                    "source": "",
80                    "defaultValue": "",
81                    "mandatory": false
82                },
83                {
84                    "name": "type",
85                    "label": "Return Type",
86                    "type": "STRING",
87                    "source": "",
88                    "options": {
89                        "active": [
90                            {
91                                "name": "Default",
92                                "value": "DEFAULT"
93                            }
94                        ]
95                    },
96                    "defaultValue": "",
97                    "mandatory": false
98                }
99            ]
100        }
101    ]
102}
1{
2    "name": "ReturnOrderExtended",
3    "description": "This ruleset is triggered when an event has been sent to initiate a Return against an Order. ",
4    "type": "ORDER",
5    "subtype": "HD",
6    "eventType": "NORMAL",
7    "rules": [
8        {
9            "name": "{{fluent.account.client_id}}.order.ValidateReturnQty",
10            "props": null
11        },
12        {
13            "name": "{{fluent.account.client_id}}.sefeature.CreateReturnOrderFromOrder",
14            "props": null
15        }
16    ],
17    "triggers": [
18        {
19            "status": "COMPLETE"
20        },
21        {
22            "status": "DELIVERED"
23        },
24        {
25            "status": "RETURN_CREATED"
26        },
27        {
28            "status": "RETURN_COMPLETE"
29        }
30    ],
31    "userActions": [
32        {
33            "context": [
34                {
35                    "label": "Submit Return",
36                    "type": "PRIMARY",
37                    "modules": [
38                        "adminconsole",
39                        "store",
40                        "servicepoint"
41                    ],
42                    "confirm": false
43                }
44            ],
45            "attributes": [
46                {
47                    "name": "returnItems",
48                    "label": "Items",
49                    "type": "returnItemsExtended",
50                    "source": "",
51                    "defaultValue": "",
52                    "mandatory": true
53                },
54                {
55                    "name": "exchangeItems",
56                    "label": "Exchange Items",
57                    "type": "exchangeItems",
58                    "source": "",
59                    "defaultValue": "",
60                    "mandatory": false
61                },
62                {
63                    "name": "pickupLocation",
64                    "label": "Pickup Location",
65                    "type": "pickupLocation",
66                    "source": "",
67                    "defaultValue": "",
68                    "mandatory": true
69                },
70                {
71                    "name": "destinationLocation",
72                    "label": "Destination Location",
73                    "type": "destinationLocation",
74                    "source": "",
75                    "defaultValue": "",
76                    "mandatory": true
77                },
78                {
79                    "name": "lodgedLocation",
80                    "label": "Lodged Location",
81                    "type": "emptyField",
82                    "source": "",
83                    "defaultValue": "",
84                    "mandatory": false
85                },
86                {
87                    "name": "type",
88                    "label": "Return Type",
89                    "type": "STRING",
90                    "source": "",
91                    "options": {
92                        "active": [
93                            {
94                                "name": "Default",
95                                "value": "DEFAULT"
96                            }
97                        ]
98                    },
99                    "defaultValue": "",
100                    "mandatory": false
101                }
102            ]
103        }
104    ]
105}
  • ReturnOrderCreated ruleset was added. This ruleset sets the status of the Order to RETURN_CREATED. The ruleset is invoked from Return Order Workflow when Return Order is confirmed.
1{
2    "name": "ReturnOrderCreated",
3    "description": "Moves the Order to Return Created status",
4    "type": "ORDER",
5    "eventType": "NORMAL",
6    "rules": [
7        {
8            "name": "{{fluent.account.client_id}}.core.SetState",
9            "props": {
10                "status": "RETURN_CREATED"
11            }
12        }
13    ],
14    "triggers": [
15        {
16            "status": "COMPLETE"
17        },
18        {
19            "status": "RETURN_CREATED"
20        }
21    ],
22    "userActions": []
23}
  • List of triggers for UpdateReturnableQty ruleset in CC&HD Workflows was extended with two statuses: RETURN_COMPLETE and COMPLETE.
1{
2    "name": "UpdateReturnableQty",
3    "description": "This rule updates the returnableQty to the order items attributes",
4    "type": "ORDER",
5    "eventType": "NORMAL",
6    "rules": [
7        {
8            "name": "{{fluent.account.client_id}}.order.UpdateOrderItemAttribute",
9            "props": null
10        }
11    ],
12    "triggers": [
13        {
14            "status": "RETURN_CREATED"
15        },
16        {
17            "status": "RETURN_COMPLETE"
18        },
19        {
20            "status": "COMPLETE"
21        }
22    ],
23    "userActions": []
24}
  • ProcessExchangeOrder and ResumeExchangeOrder rulesets were added in order to support Exchange Order feature. ProcessExchangeOrder ruleset put current Order to EXCHANGE_HOLD status if it is Exchange Order. This ruleset should be invoked immediately after creation of the Order before main processing. ResumeExchangeOrder ruleset resumes processing of Exchange Order after it was put on hold. This ruleset is invoked from Return Order Workflow.
1{
2    "name": "ProcessExchangeOrder",
3    "description": "Process the Order if it is Exchange Order",
4    "type": "ORDER",
5    "eventType": "NORMAL",
6    "rules": [
7        {
8            "name": "{{fluent.account.client_id}}.core.SetState",
9            "props": {
10                "status": "EXCHANGE_HOLD"
11            }
12        }
13    ],
14    "triggers": [
15        {
16            "status": "CREATED"
17        },
18        {
19            "status": "ASSESSMENT"
20        }
21    ],
22    "userActions": []
23}
1{
2    "name": "ResumeExchangeOrder",
3    "type": "ORDER",
4    "eventType": "NORMAL",
5    "rules": [
6        {
7            "name": "{{fluent.account.client_id}}.core.SetState",
8            "props": {
9                "status": "ASSESSMENT"
10            }
11        },
12        {
13            "name": "{{fluent.account.client_id}}.core.ScheduleEvent",
14            "props": {
15                "delay": 1,
16                "eventName": "AssessPreOrder"
17            }
18        }
19    ],
20    "triggers": [
21        {
22            "status": "EXCHANGE_HOLD"
23        }
24    ],
25    "userActions": []
26}
  • ProcessExchangeOrder ruleset has to be executed from some other ruleset in HD & CC Workflows.
1{
2    "name": "ProcessOrder",
3    "description": "Checks that the Order is Exchange Order",
4    "type": "ORDER",
5    "subtype": "CC",
6    "eventType": "NORMAL",
7    "rules": [
8        {
9            "name": "{{fluent.account.client_id}}.seorder.SendEventIfOrderHasAttribute",
10            "props": {
11                "eventName": "ProcessExchangeOrder",
12                "attributeName": "RETURN_ORDER_REF"
13            }
14        },
15        {
16            "name": "{{fluent.account.client_id}}.seorder.SendEventIfOrderDoesNotHaveAttribute",
17            "props": {
18                "eventName": "AssessPreOrder",
19                "attributeName": "RETURN_ORDER_REF"
20            }
21        }
22    ],
23    "triggers": [
24        {
25            "status": "ASSESSMENT"
26        }
27    ],
28    "userActions": []
29}

Some ruleset have to be specified in ScheduleEvent rule in ResumeExchangeOrder ruleset. For instance, it could be OrderAssessment ruleset for HD Workflow and AssessPreOrder for CC Workflow.

Return Order Workflow changes
1{
2    "retailerId": "{{fluent.retailer.current.id}}",
3    "version": "1.0",
4    "entityType": "RETURN_ORDER",
5    "entitySubtype": "DEFAULT",
6    "description": "This workflow defines the end to end process for return orders.",
7    "name": "RETURN_ORDER::DEFAULT",
8    "rulesets": [
9        {
10            "name": "CREATE",
11            "description": "Create ReturnOrder",
12            "type": "RETURN_ORDER",
13            "subtype": "DEFAULT",
14            "eventType": "NORMAL",
15            "rules": [
16                {
17                    "name": "{{fluent.account.client_id}}.sefeature.AssignRmaToReturnOrder",
18                    "props": null
19                },
20                {
21                    "name": "{{fluent.account.client_id}}.sefeature.ValidateReturnOrderItems",
22                    "props": {
23                        "rejectReturnOrder": "RejectReturnOrder",
24                        "confirmReturnOrder": "ConfirmReturnOrder"
25                    }
26                }
27            ],
28            "triggers": [
29                {
30                    "status": "CREATED"
31                }
32            ],
33            "userActions": []
34        },
35        {
36            "name": "ConfirmReturnOrder",
37            "description": "Confirms ReturnOrder",
38            "type": "RETURN_ORDER",
39            "subtype": "DEFAULT",
40            "eventType": "NORMAL",
41            "rules": [
42                {
43                    "name": "FLUENTRETAIL.base.SendEventForReturnToOrder",
44                    "props": {
45                        "eventName": "ReturnOrderCreated"
46                    }
47                },
48                {
49                    "name": "{{fluent.account.client_id}}.sefeature.ScheduleEventIfRMAExpirationIsSet",
50                    "props": {
51                        "eventName": "CancelExpiredReturnOrder"
52                    }
53                },
54                {
55                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
56                    "props": {
57                        "eventName": "ProcessStandardReturnOrder",
58                        "delay": 1,
59                        "exchangeOrderExisted": "FALSE"
60                    }
61                },
62                {
63                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
64                    "props": {
65                        "eventName": "ProcessReturnOrderWithExchange",
66                        "delay": 1,
67                        "exchangeOrderExisted": "TRUE"
68                    }
69                }
70            ],
71            "triggers": [
72                {
73                    "status": "CREATED"
74                }
75            ],
76            "userActions": []
77        },
78        {
79            "name": "ProcessStandardReturnOrder",
80            "description": "Process Return Order if it does not have Exchange Order",
81            "type": "RETURN_ORDER",
82            "subtype": "DEFAULT",
83            "eventType": "NORMAL",
84            "rules": [
85                {
86                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
87                    "props": {
88                        "status": "IN_TRANSITION"
89                    }
90                },
91                {
92                    "name": "FLUENTRETAIL.base.SendEventToReturns",
93                    "props": {
94                        "eventName": "FulfilReturn"
95                    }
96                },
97                {
98                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
99                    "props": {
100                        "eventName": "NotifyExchangeOrder",
101                        "delay": 1,
102                        "exchangeOrderExisted": "TRUE"
103                    }
104                }
105            ],
106            "triggers": [
107                {
108                    "status": "CREATED"
109                }
110            ],
111            "userActions": []
112        },
113        {
114            "name": "ProcessReturnOrderWithExchange",
115            "description": "Process Return Order if it has Exchenge Order",
116            "type": "RETURN_ORDER",
117            "subtype": "DEFAULT",
118            "eventType": "NORMAL",
119            "rules": [
120                {
121                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfReturnOrderIsRMA",
122                    "props": {
123                        "delay": 1,
124                        "eventName": "ProcessRMAReturnOrderWithExchange"
125                    }
126                },
127                {
128                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfReturnOrderIsNotRMA",
129                    "props": {
130                        "delay": 1,
131                        "eventName": "ProcessDefaultReturnOrderWithExchange"
132                    }
133                }
134            ],
135            "triggers": [
136                {
137                    "status": "CREATED"
138                }
139            ],
140            "userActions": []
141        },
142        {
143            "name": "ProcessRMAReturnOrderWithExchange",
144            "description": "Process Return Order if it has Exchenge Order",
145            "type": "RETURN_ORDER",
146            "subtype": "DEFAULT",
147            "eventType": "NORMAL",
148            "rules": [
149                {
150                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
151                    "props": {
152                        "status": "BOOKED"
153                    }
154                },
155                {
156                    "name": "FLUENTRETAIL.base.SendEventToReturns",
157                    "props": {
158                        "eventName": "FulfilReturn"
159                    }
160                }
161            ],
162            "triggers": [
163                {
164                    "status": "CREATED"
165                }
166            ],
167            "userActions": []
168        },
169        {
170            "name": "ProcessDefaultReturnOrderWithExchange",
171            "description": "Process Return Order if it has Exchange Order",
172            "type": "RETURN_ORDER",
173            "subtype": "DEFAULT",
174            "eventType": "NORMAL",
175            "rules": [
176                {
177                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
178                    "props": {
179                        "status": "IN_TRANSITION"
180                    }
181                },
182                {
183                    "name": "FLUENTRETAIL.base.SendEventToReturns",
184                    "props": {
185                        "eventName": "FulfilReturn"
186                    }
187                },
188                {
189                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
190                    "props": {
191                        "eventName": "NotifyExchangeOrder",
192                        "delay": 1,
193                        "exchangeOrderExisted": "TRUE"
194                    }
195                }
196            ],
197            "triggers": [
198                {
199                    "status": "CREATED"
200                }
201            ],
202            "userActions": []
203        },
204        {
205            "name": "RejectReturnOrder",
206            "description": "Rejects ReturnOrder",
207            "type": "RETURN_ORDER",
208            "subtype": "DEFAULT",
209            "eventType": "NORMAL",
210            "rules": [
211                {
212                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
213                    "props": {
214                        "status": "REJECTED"
215                    }
216                }
217            ],
218            "triggers": [
219                {
220                    "status": "CREATED"
221                }
222            ],
223            "userActions": []
224        },
225        {
226            "name": "CREATE",
227            "description": "CREATE RETURN_FULFILMENT",
228            "type": "RETURN_FULFILMENT",
229            "subtype": "DEFAULT",
230            "eventType": "NORMAL",
231            "rules": [
232                {
233                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfReturnFulfilmentAttributeEqualsTo",
234                    "props": {
235                        "eventName": "CheckIfThereIsExchangeOrder",
236                        "attributeName": "RETURN_TYPE",
237                        "attributeValue": "RMA"
238                    }
239                },
240                {
241                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfReturnFulfilmentAttributeEqualsTo",
242                    "props": {
243                        "eventName": "CompleteReturnFulfilment",
244                        "attributeName": "RETURN_TYPE",
245                        "attributeValue": "DEFAULT"
246                    }
247                }
248            ],
249            "triggers": [
250                {
251                    "status": "CREATED"
252                }
253            ],
254            "userActions": []
255        },
256        {
257            "name": "CheckIfThereIsExchangeOrder",
258            "description": "Cheks if there is an Exchange Order for the current Return Order",
259            "type": "RETURN_FULFILMENT",
260            "subtype": "DEFAULT",
261            "eventType": "NORMAL",
262            "rules": [
263                {
264                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
265                    "props": {
266                        "eventName": "AwaitReceipt",
267                        "delay": 1,
268                        "exchangeOrderExisted": "FALSE"
269                    }
270                },
271                {
272                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
273                    "props": {
274                        "eventName": "AwaitShipment",
275                        "delay": 1,
276                        "exchangeOrderExisted": "TRUE"
277                    }
278                }
279            ],
280            "triggers": [
281                {
282                    "status": "CREATED"
283                }
284            ],
285            "userActions": []
286        },
287        {
288            "name": "AwaitReceipt",
289            "description": "Set Return Fulfilment to awaiting receipt",
290            "type": "RETURN_FULFILMENT",
291            "subtype": "DEFAULT",
292            "eventType": "NORMAL",
293            "rules": [
294                {
295                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
296                    "props": {
297                        "status": "AWAITING_RECEIPT"
298                    }
299                }
300            ],
301            "triggers": [
302                {
303                    "status": "CREATED"
304                }
305            ],
306            "userActions": []
307        },
308        {
309            "name": "AwaitShipment",
310            "description": "Set Return Fulfilment to awaiting shipment",
311            "type": "RETURN_FULFILMENT",
312            "subtype": "DEFAULT",
313            "eventType": "NORMAL",
314            "rules": [
315                {
316                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
317                    "props": {
318                        "status": "AWAITING_CUSTOMER_SHIPMENT"
319                    }
320                }
321            ],
322            "triggers": [
323                {
324                    "status": "CREATED"
325                }
326            ],
327            "userActions": []
328        },
329        {
330            "name": "CompleteReturnFulfilment",
331            "description": "Completes RETURN_FULFILMENT",
332            "type": "RETURN_FULFILMENT",
333            "subtype": "DEFAULT",
334            "eventType": "NORMAL",
335            "rules": [
336                {
337                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
338                    "props": {
339                        "status": "COMPLETE"
340                    }
341                },
342                {
343                    "name": "{{fluent.account.client_id}}.sefeature.SendEventToReturnOrderFromFulfilment",
344                    "props": {
345                        "delay": 1,
346                        "eventName": "NotifyReturnOrder"
347                    }
348                }
349            ],
350            "triggers": [
351                {
352                    "status": "CREATED"
353                },
354                {
355                    "status": "AWAITING_VERIFICATION"
356                }
357            ],
358            "userActions": []
359        },
360        {
361            "name": "FulfilReturn",
362            "description": "ReturnOrder",
363            "type": "RETURN_ORDER",
364            "eventType": "NORMAL",
365            "rules": [
366                {
367                    "name": "{{fluent.account.client_id}}.sefeature.CreateReturnFulfilments",
368                    "props": null
369                },
370                {
371                    "name": "FLUENTRETAIL.base.SendEventToUpdateOrderItemAttribute",
372                    "props": {
373                        "eventName": "UpdateReturnableQty"
374                    }
375                }
376            ],
377            "triggers": [
378                {
379                    "status": "BOOKED"
380                },
381                {
382                    "status": "CREATED"
383                },
384                {
385                    "status": "IN_TRANSITION"
386                }
387            ],
388            "userActions": []
389        },
390        {
391            "name": "FinalizeReturnOrderProcessing",
392            "description": "Checks if there is an Exchange Order for the current Return Order",
393            "type": "RETURN_ORDER",
394            "subtype": "DEFAULT",
395            "eventType": "NORMAL",
396            "rules": [
397                {
398                    "name": "{{fluent.account.client_id}}.sefeature.SendEventToUpdateInventoryQuantityReturnOrder",
399                    "props": {
400                        "eventName": "UpdateReturnOrderInventoryQty",
401                        "returnConditions": [
402                            "GOOD"
403                        ],
404                        "fulfilmentStatuses": [
405                            "COMPLETE"
406                        ],
407                        "inventoryCatalogueRef": "DEFAULT:{{fluent.retailer.current.id}}"
408                    }
409                },
410                {
411                    "name": "{{fluent.account.client_id}}.sefeature.UpdateTotalAmountForReturnOrder",
412                    "props": {
413                        "status": [
414                            "COMPLETE"
415                        ]
416                    }
417                },
418                {
419                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
420                    "props": {
421                        "eventName": "ProcessRefund",
422                        "delay": 1,
423                        "exchangeOrderExisted": "FALSE"
424                    }
425                },
426                {
427                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
428                    "props": {
429                        "eventName": "CompleteReturnOrderWithoutExchange",
430                        "delay": 1,
431                        "exchangeOrderExisted": "TRUE"
432                    }
433                }
434            ],
435            "triggers": [
436                {
437                    "status": "BOOKED"
438                },
439                {
440                    "status": "RECEIVED"
441                },
442                {
443                    "status": "IN_TRANSITION"
444                }
445            ],
446            "userActions": []
447        },
448        {
449            "name": "ProcessRefund",
450            "description": "ReturnOrder",
451            "type": "RETURN_ORDER",
452            "eventType": "NORMAL",
453            "rules": [
454                {
455                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
456                    "props": {
457                        "status": "PENDING_REFUND"
458                    }
459                },
460                {
461                    "name": "FLUENTRETAIL.base.SendScheduledEventGQL",
462                    "props": {
463                        "delay": 5,
464                        "eventName": "AssessFulfilmentCharges"
465                    }
466                }
467            ],
468            "triggers": [
469                {
470                    "status": "BOOKED"
471                },
472                {
473                    "status": "RECEIVED"
474                },
475                {
476                    "status": "IN_TRANSITION"
477                }
478            ],
479            "userActions": []
480        },
481        {
482            "name": "AssessFulfilmentCharges",
483            "description": "Assess Fulfilment Charges",
484            "type": "RETURN_ORDER",
485            "eventType": "NORMAL",
486            "rules": [
487                {
488                    "name": "{{fluent.account.client_id}}.sefeature.ApplyFulfilmentCostToReturnOrder",
489                    "props": {}
490                },
491                {
492                    "name": "FLUENTRETAIL.base.SendScheduledEventGQL",
493                    "props": {
494                        "delay": 1,
495                        "eventName": "CheckBillingAccount"
496                    }
497                }
498            ],
499            "triggers": [
500                {
501                    "status": "PENDING_REFUND"
502                }
503            ],
504            "userActions": []
505        },
506        {
507            "name": "CheckBillingAccount",
508            "description": "BillingAccount",
509            "type": "RETURN_ORDER",
510            "eventType": "NORMAL",
511            "rules": [
512                {
513                    "name": "{{fluent.account.client_id}}.order.VerifyBillingAccount",
514                    "props": {
515                        "BillingAccountExistsEventName": "ProcessBillingAccount",
516                        "NoBillingAccountExistsEventName": "NewBillingAccount"
517                    }
518                }
519            ],
520            "triggers": [
521                {
522                    "status": "PENDING_REFUND"
523                }
524            ],
525            "userActions": []
526        },
527        {
528            "name": "NewBillingAccount",
529            "description": "ReturnOrder",
530            "type": "RETURN_ORDER",
531            "eventType": "NORMAL",
532            "rules": [
533                {
534                    "name": "{{fluent.account.client_id}}.order.CreateBillingAccount",
535                    "props": {
536                        "eventName": "ProcessBillingAccount",
537                        "billingAccountType": "CUSTOMER"
538                    }
539                }
540            ],
541            "triggers": [],
542            "userActions": []
543        },
544        {
545            "name": "ProcessBillingAccount",
546            "description": "ReturnOrder",
547            "type": "RETURN_ORDER",
548            "eventType": "NORMAL",
549            "rules": [
550                {
551                    "name": "{{fluent.account.client_id}}.sefeature.CreateInvoiceForReturnOrder",
552                    "props": {
553                        "status": [
554                            "COMPLETE"
555                        ]
556                    }
557                },
558                {
559                    "name": "{{fluent.account.client_id}}.order.SendEventForReturnToBillingAccount",
560                    "props": {
561                        "eventName": "ProcessCreditForReturn"
562                    }
563                }
564            ],
565            "triggers": [
566                {
567                    "status": "PENDING_REFUND"
568                }
569            ],
570            "userActions": []
571        },
572        {
573            "name": "CompleteReturnOrderWithoutExchange",
574            "description": "Checks if there is an Remain Refund Amount attribute for the current Return Order",
575            "type": "RETURN_ORDER",
576            "subtype": "DEFAULT",
577            "eventType": "NORMAL",
578            "rules": [
579                {
580                    "name": "{{fluent.account.client_id}}.core.IfPropertyIsPresent",
581                    "props": {
582                        "eventName": "ProcessRefund",
583                        "jsonpath": "attributes.byName.REMAIN_REFUND_AMOUNT"
584                    }
585                },
586                {
587                    "name": "{{fluent.account.client_id}}.core.IfPropertyIsNotPresent",
588                    "props": {
589                        "eventName": "CompleteReturnOrderWithoutRefund",
590                        "jsonpath": "attributes.byName.REMAIN_REFUND_AMOUNT"
591                    }
592                }
593            ],
594            "triggers": [
595                {
596                    "status": "BOOKED"
597                },
598                {
599                    "status": "RECEIVED"
600                },
601                {
602                    "status": "IN_TRANSITION"
603                }
604            ],
605            "userActions": []
606        },
607        {
608            "name": "CompleteReturnOrderWithoutRefund",
609            "description": "ReturnOrder",
610            "type": "RETURN_ORDER",
611            "subtype": "DEFAULT",
612            "eventType": "NORMAL",
613            "rules": [
614                {
615                    "name": "FLUENTRETAIL.base.SendEventForReturnToOrder",
616                    "props": {
617                        "eventName": "OrderReturnComplete"
618                    }
619                },
620                {
621                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
622                    "props": {
623                        "status": "COMPLETE"
624                    }
625                }
626            ],
627            "triggers": [
628                {
629                    "status": "IN_TRANSITION"
630                },
631                {
632                    "status": "RECEIVED"
633                },
634                {
635                    "status": "BOOKED"
636                }
637            ],
638            "userActions": []
639        },
640        {
641            "name": "RefundComplete",
642            "description": "ReturnOrder",
643            "type": "RETURN_ORDER",
644            "subtype": "DEFAULT",
645            "eventType": "NORMAL",
646            "rules": [
647                {
648                    "name": "FLUENTRETAIL.base.SendEventForReturnToOrder",
649                    "props": {
650                        "eventName": "OrderReturnComplete"
651                    }
652                },
653                {
654                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
655                    "props": {
656                        "status": "COMPLETE"
657                    }
658                }
659            ],
660            "triggers": [
661                {
662                    "status": "PENDING_REFUND"
663                }
664            ],
665            "userActions": []
666        },
667        {
668            "name": "RefundRejected",
669            "description": "ReturnOrder",
670            "type": "RETURN_ORDER",
671            "subtype": "DEFAULT",
672            "eventType": "NORMAL",
673            "rules": [
674                {
675                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
676                    "props": {
677                        "status": "ESCALATED"
678                    }
679                }
680            ],
681            "triggers": [
682                {
683                    "status": "PENDING_REFUND"
684                }
685            ],
686            "userActions": []
687        },
688        {
689            "name": "CancelReturnOrderManually",
690            "description": "Cancels Return Order",
691            "type": "RETURN_ORDER",
692            "subtype": "DEFAULT",
693            "eventType": "NORMAL",
694            "rules": [
695                {
696                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
697                    "props": {
698                        "status": "CANCELLED"
699                    }
700                },
701                {
702                    "name": "{{fluent.account.client_id}}.sefeature.SendEventToAllReturnFulfilments",
703                    "props": {
704                        "eventName": "CancelReturnOrderFulfilment"
705                    }
706                }
707            ],
708            "triggers": [
709                {
710                    "status": "BOOKED"
711                },
712                {
713                    "status": "RECEIVED"
714                }
715            ],
716            "userActions": [
717                {
718                    "context": [
719                        {
720                            "label": "Cancel Return Order",
721                            "type": "PRIMARY",
722                            "modules": [
723                                "adminconsole",
724                                "servicepoint"
725                            ],
726                            "confirm": true
727                        }
728                    ],
729                    "attributes": []
730                }
731            ]
732        },
733        {
734            "name": "CancelReturnOrderFulfilment",
735            "description": "Cancels Return Order Fulfilment",
736            "type": "RETURN_FULFILMENT",
737            "subtype": "DEFAULT",
738            "eventType": "NORMAL",
739            "rules": [
740                {
741                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
742                    "props": {
743                        "status": "CANCELLED"
744                    }
745                }
746            ],
747            "triggers": [
748                {
749                    "status": "AWAITING_RECEIPT"
750                },
751                {
752                    "status": "AWAITING_VERIFICATION"
753                }
754            ],
755            "userActions": []
756        },
757        {
758            "name": "ProcessReturnFulfilmentShipment",
759            "description": "Processes Shipment of Return Fulfilment",
760            "type": "RETURN_FULFILMENT",
761            "subtype": "DEFAULT",
762            "eventType": "NORMAL",
763            "rules": [
764                {
765                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
766                    "props": {
767                        "status": "AWAITING_RECEIPT"
768                    }
769                },
770                {
771                    "name": "{{fluent.account.client_id}}.sefeature.SendEventToReturnOrderFromFulfilment",
772                    "props": {
773                        "delay": 1,
774                        "eventName": "NotifyReturnOrder"
775                    }
776                }
777            ],
778            "triggers": [
779                {
780                    "status": "AWAITING_CUSTOMER_SHIPMENT"
781                }
782            ],
783            "userActions": [
784                {
785                    "context": [
786                        {
787                            "label": "Mark as Shipped",
788                            "type": "PRIMARY",
789                            "modules": [
790                                "adminconsole",
791                                "servicepoint"
792                            ],
793                            "confirm": true
794                        }
795                    ],
796                    "attributes": []
797                }
798            ]
799        },
800        {
801            "name": "ProcessReturnFulfilmentReceipt",
802            "description": "Processes Receipt of Return Fulfilment",
803            "type": "RETURN_FULFILMENT",
804            "subtype": "DEFAULT",
805            "eventType": "NORMAL",
806            "rules": [
807                {
808                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
809                    "props": {
810                        "status": "AWAITING_VERIFICATION"
811                    }
812                },
813                {
814                    "name": "{{fluent.account.client_id}}.sefeature.SendEventToReturnOrderFromFulfilment",
815                    "props": {
816                        "delay": 1,
817                        "eventName": "NotifyReturnOrder"
818                    }
819                }
820            ],
821            "triggers": [
822                {
823                    "status": "AWAITING_RECEIPT"
824                }
825            ],
826            "userActions": [
827                {
828                    "context": [
829                        {
830                            "label": "Mark as Received",
831                            "type": "PRIMARY",
832                            "modules": [
833                                "adminconsole",
834                                "servicepoint"
835                            ],
836                            "confirm": true
837                        }
838                    ],
839                    "attributes": []
840                }
841            ]
842        },
843        {
844            "name": "ProcessReturnFulfilmentVerification",
845            "description": "Processes Verification of Return Fulfilment",
846            "type": "RETURN_FULFILMENT",
847            "subtype": "DEFAULT",
848            "eventType": "NORMAL",
849            "rules": [
850                {
851                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
852                    "props": {
853                        "status": "COMPLETE"
854                    }
855                },
856                {
857                    "name": "{{fluent.account.client_id}}.sefeature.SendEventToReturnOrderFromFulfilment",
858                    "props": {
859                        "delay": 1,
860                        "eventName": "NotifyReturnOrder"
861                    }
862                }
863            ],
864            "triggers": [
865                {
866                    "status": "AWAITING_VERIFICATION"
867                }
868            ],
869            "userActions": [
870                {
871                    "context": [
872                        {
873                            "label": "Mark as Verified",
874                            "type": "PRIMARY",
875                            "modules": [
876                                "adminconsole",
877                                "servicepoint"
878                            ],
879                            "confirm": true
880                        }
881                    ],
882                    "attributes": []
883                }
884            ]
885        },
886        {
887            "name": "ProcessReturnFulfilmentCancellation",
888            "description": "Processes Cancellation of Return Fulfilment",
889            "type": "RETURN_FULFILMENT",
890            "subtype": "DEFAULT",
891            "eventType": "NORMAL",
892            "rules": [
893                {
894                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
895                    "props": {
896                        "status": "CANCELLED"
897                    }
898                },
899                {
900                    "name": "{{fluent.account.client_id}}.sefeature.SendEventToReturnOrderFromFulfilment",
901                    "props": {
902                        "delay": 1,
903                        "eventName": "NotifyReturnOrder"
904                    }
905                }
906            ],
907            "triggers": [
908                {
909                    "status": "AWAITING_VERIFICATION"
910                }
911            ],
912            "userActions": [
913                {
914                    "context": [
915                        {
916                            "label": "Mark as Cancelled",
917                            "type": "SECONDARY",
918                            "modules": [
919                                "adminconsole",
920                                "servicepoint"
921                            ],
922                            "confirm": true
923                        }
924                    ],
925                    "attributes": []
926                }
927            ]
928        },
929        {
930            "name": "NotifyReturnOrder",
931            "description": "Notifies Return Order",
932            "type": "RETURN_ORDER",
933            "subtype": "DEFAULT",
934            "eventType": "NORMAL",
935            "rules": [
936                {
937                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfAnyReturnFulfilmentInStatuses",
938                    "props": {
939                        "status": [
940                            "AWAITING_RECEIPT"
941                        ],
942                        "eventName": "CheckIfReturnOrderIsShipped"
943                    }
944                },
945                {
946                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfAnyReturnFulfilmentInStatuses",
947                    "props": {
948                        "status": [
949                            "AWAITING_VERIFICATION"
950                        ],
951                        "eventName": "CheckIfReturnOrderIsReceived"
952                    }
953                },
954                {
955                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfAnyReturnFulfilmentInStatuses",
956                    "props": {
957                        "status": [
958                            "COMPLETE"
959                        ],
960                        "eventName": "CheckIfReturnOrderIsVerified"
961                    }
962                },
963                {
964                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfAllReturnFulfilmentsInStatuses",
965                    "props": {
966                        "status": [
967                            "CANCELLED"
968                        ],
969                        "eventName": "CancelReturnOrder"
970                    }
971                }
972            ],
973            "triggers": [
974                {
975                    "status": "BOOKED"
976                },
977                {
978                    "status": "RECEIVED"
979                },
980                {
981                    "status": "IN_TRANSITION"
982                }
983            ],
984            "userActions": []
985        },
986        {
987            "name": "CheckIfReturnOrderIsShipped",
988            "description": "Checks that Return Order is shipped",
989            "type": "RETURN_ORDER",
990            "subtype": "DEFAULT",
991            "eventType": "NORMAL",
992            "rules": [
993                {
994                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfAllReturnFulfilmentsInStatuses",
995                    "props": {
996                        "status": [
997                            "AWAITING_RECEIPT",
998                            "COMPLETE",
999                            "CANCELLED"
1000                        ],
1001                        "eventName": "ProcessReturnOrderShipment"
1002                    }
1003                }
1004            ],
1005            "triggers": [
1006                {
1007                    "status": "BOOKED"
1008                },
1009                {
1010                    "status": "IN_TRANSITION"
1011                }
1012            ],
1013            "userActions": []
1014        },
1015        {
1016            "name": "CheckIfReturnOrderIsReceived",
1017            "description": "Checks that Return Order is received",
1018            "type": "RETURN_ORDER",
1019            "subtype": "DEFAULT",
1020            "eventType": "NORMAL",
1021            "rules": [
1022                {
1023                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfAllReturnFulfilmentsInStatuses",
1024                    "props": {
1025                        "status": [
1026                            "AWAITING_VERIFICATION",
1027                            "COMPLETE",
1028                            "CANCELLED"
1029                        ],
1030                        "eventName": "ProcessReturnOrderReceiving"
1031                    }
1032                }
1033            ],
1034            "triggers": [
1035                {
1036                    "status": "BOOKED"
1037                },
1038                {
1039                    "status": "RECEIVED"
1040                },
1041                {
1042                    "status": "IN_TRANSITION"
1043                }
1044            ],
1045            "userActions": []
1046        },
1047        {
1048            "name": "CheckIfReturnOrderIsVerified",
1049            "description": "Checks that Return Order is verified",
1050            "type": "RETURN_ORDER",
1051            "subtype": "DEFAULT",
1052            "eventType": "NORMAL",
1053            "rules": [
1054                {
1055                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfAllReturnFulfilmentsInStatuses",
1056                    "props": {
1057                        "status": [
1058                            "COMPLETE",
1059                            "CANCELLED"
1060                        ],
1061                        "eventName": "FinalizeReturnOrderProcessing"
1062                    }
1063                }
1064            ],
1065            "triggers": [
1066                {
1067                    "status": "BOOKED"
1068                },
1069                {
1070                    "status": "RECEIVED"
1071                },
1072                {
1073                    "status": "IN_TRANSITION"
1074                }
1075            ],
1076            "userActions": []
1077        },
1078        {
1079            "name": "ProcessReturnOrderShipment",
1080            "description": "Processes Shipment of Return Order",
1081            "type": "RETURN_ORDER",
1082            "subtype": "DEFAULT",
1083            "eventType": "NORMAL",
1084            "rules": [
1085                {
1086                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
1087                    "props": {
1088                        "status": "IN_TRANSITION"
1089                    }
1090                },
1091                {
1092                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
1093                    "props": {
1094                        "eventName": "NotifyExchangeOrder",
1095                        "delay": 1,
1096                        "exchangeOrderExisted": "TRUE"
1097                    }
1098                }
1099            ],
1100            "triggers": [
1101                {
1102                    "status": "BOOKED"
1103                }
1104            ],
1105            "userActions": []
1106        },
1107        {
1108            "name": "ProcessReturnOrderReceiving",
1109            "description": "Processes Receiving of Return Order",
1110            "type": "RETURN_ORDER",
1111            "subtype": "DEFAULT",
1112            "eventType": "NORMAL",
1113            "rules": [
1114                {
1115                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
1116                    "props": {
1117                        "status": "RECEIVED"
1118                    }
1119                },
1120                {
1121                    "name": "{{fluent.account.client_id}}.sefeature.SendEventIfExchangeOrderExistedOrNot",
1122                    "props": {
1123                        "eventName": "NotifyExchangeOrder",
1124                        "delay": 1,
1125                        "exchangeOrderExisted": "TRUE"
1126                    }
1127                }
1128            ],
1129            "triggers": [
1130                {
1131                    "status": "IN_TRANSITION"
1132                }
1133            ],
1134            "userActions": []
1135        },
1136        {
1137            "name": "CancelReturnOrder",
1138            "description": "Cancels Return Order if all Fulfilments has been cancelled",
1139            "type": "RETURN_ORDER",
1140            "subtype": "DEFAULT",
1141            "eventType": "NORMAL",
1142            "rules": [
1143                {
1144                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
1145                    "props": {
1146                        "status": "CANCELLED"
1147                    }
1148                }
1149            ],
1150            "triggers": [
1151                {
1152                    "status": "BOOKED"
1153                },
1154                {
1155                    "status": "RECEIVED"
1156                },
1157                {
1158                    "status": "IN_TRANSITION"
1159                }
1160            ],
1161            "userActions": []
1162        },
1163        {
1164            "name": "CancelExpiredReturnOrder",
1165            "description": "Cancels Return Order if it is expired",
1166            "type": "RETURN_ORDER",
1167            "subtype": "DEFAULT",
1168            "eventType": "NORMAL",
1169            "rules": [
1170                {
1171                    "name": "{{fluent.account.client_id}}.commonv2.ChangeStateGQL",
1172                    "props": {
1173                        "status": "CANCELLED"
1174                    }
1175                },
1176                {
1177                    "name": "{{fluent.account.client_id}}.sefeature.SendEventToAllReturnFulfilments",
1178                    "props": {
1179                        "eventName": "CancelReturnOrderFulfilment"
1180                    }
1181                }
1182            ],
1183            "triggers": [
1184                {
1185                    "status": "BOOKED"
1186                },
1187                {
1188                    "status": "IN_TRANSITION"
1189                }
1190            ],
1191            "userActions": []
1192        },
1193        {
1194            "name": "NotifyExchangeOrder",
1195            "description": "Notifies Exchange Order",
1196            "type": "RETURN_ORDER",
1197            "subtype": "DEFAULT",
1198            "eventType": "NORMAL",
1199            "rules": [
1200                {
1201                    "name": "{{fluent.account.client_id}}.sefeature.SendEventToExchangeOrderIfReturnOrderInStatus",
1202                    "props": {
1203                        "eventName": "ResumeExchangeOrder",
1204                        "setting": "EXCHANGE_ORDER_NOTIFICATION_STATUS"
1205                    }
1206                }
1207            ],
1208            "triggers": [
1209                {
1210                    "status": "BOOKED"
1211                },
1212                {
1213                    "status": "IN_TRANSITION"
1214                },
1215                {
1216                    "status": "RECEIVED"
1217                }
1218            ],
1219            "userActions": []
1220        }
1221    ],
1222    "statuses": [
1223        {
1224            "name": "CREATED",
1225            "entityType": "RETURN_ORDER",
1226            "category": "BOOKING"
1227        },
1228        {
1229            "name": "COMPLETE",
1230            "entityType": "RETURN_FULFILMENT",
1231            "category": "DONE"
1232        },
1233        {
1234            "name": "BOOKED",
1235            "entityType": "RETURN_ORDER",
1236            "category": "BOOKING"
1237        },
1238        {
1239            "name": "IN_TRANSITION",
1240            "entityType": "RETURN_ORDER",
1241            "category": "BOOKING"
1242        },
1243        {
1244            "name": "RECEIVED",
1245            "entityType": "RETURN_ORDER",
1246            "category": "FULFILMENT"
1247        },
1248        {
1249            "name": "CANCELLED",
1250            "entityType": "RETURN_ORDER",
1251            "category": "DONE"
1252        },
1253        {
1254            "name": "ESCALATED",
1255            "entityType": "RETURN_ORDER",
1256            "category": "DELIVERY"
1257        },
1258        {
1259            "name": "COMPLETE",
1260            "entityType": "RETURN_ORDER",
1261            "category": "DONE"
1262        },
1263        {
1264            "name": "REJECTED",
1265            "entityType": "RETURN_ORDER",
1266            "category": "DONE"
1267        },
1268        {
1269            "name": "CREATED",
1270            "entityType": "RETURN_FULFILMENT",
1271            "category": "BOOKING"
1272        },
1273        {
1274            "name": "PENDING_REFUND",
1275            "entityType": "RETURN_ORDER",
1276            "category": "DELIVERY"
1277        },
1278        {
1279            "name": "IN_TRANSITION",
1280            "entityType": "ORDER",
1281            "category": "BOOKING"
1282        },
1283        {
1284            "name": "CREATED",
1285            "entityType": "ORDER",
1286            "category": ""
1287        },
1288        {
1289            "name": "BOOKED",
1290            "entityType": "ORDER",
1291            "category": ""
1292        },
1293        {
1294            "name": "",
1295            "entityType": "BILLING_ACCOUNT",
1296            "category": "BOOKING"
1297        },
1298        {
1299            "name": "",
1300            "entityType": "RETURN_ORDER",
1301            "category": "BOOKING"
1302        },
1303        {
1304            "name": "",
1305            "entityType": "ORDER",
1306            "category": "BOOKING"
1307        },
1308        {
1309            "name": "AWAITING_CUSTOMER_SHIPMENT",
1310            "entityType": "RETURN_FULFILMENT",
1311            "category": "BOOKING"
1312        },
1313        {
1314            "name": "AWAITING_RECEIPT",
1315            "entityType": "RETURN_FULFILMENT",
1316            "category": "FULFILMENT"
1317        },
1318        {
1319            "name": "AWAITING_VERIFICATION",
1320            "entityType": "RETURN_FULFILMENT",
1321            "category": "DELIVERY"
1322        },
1323        {
1324            "name": "CANCELLED",
1325            "entityType": "RETURN_FULFILMENT",
1326            "category": "DONE"
1327        },
1328        {
1329            "name": "",
1330            "entityType": "",
1331            "category": "DONE"
1332        }
1333    ],
1334    "settings": {}
1335}

Step arrow right iconNew Settings

There are several settings that existed in original implementation of Return Order feature.

  • RETURN_CONDITION setting contains list of possible conditions of retuned items. This setting is defined on RETAILER level. The value of the setting has to be in JSON format.
1[
2    {
3        "label": "Reusable",
4        "value": "GOOD"
5    },
6    {
7        "label": "Destroy",
8        "value": "BROKEN"
9    }
10]
  • RETURN_REASON setting contains list of possible reasons of item return. This setting is defined on RETAILER level. The value of the setting has to be in JSON format.
1[
2    {
3        "label": "Wrong Size",
4        "value": "WRONGSIZE"
5    },
6    {
7        "label": "Broken",
8        "value": "BROKEN"
9    }
10]
  • DEFAULT_RETURN_DESTINATION_LOCATION setting contains a default destination location for the returns. This setting is defined on RETAILER level. The value of the setting has to be a reference of location (text value). Default value: Primary Warehouse (for instance, DC_2_DEMO_GB).
  • RETURN_REJECTION_REASON setting contains a list of possible reasons of Return Order rejection. This setting is defined on RETAILER level. The value of the setting has to be in JSON format.
1[
2    {
3        "label": "Not returnable",
4        "value": "NOT_RETURNABLE"
5    },
6    {
7        "label": "Return expired",
8        "value": "RETURN_EXPIRED"
9    },
10    {
11        "label": "Wrong quantity",
12        "value": "WRONG_QUANTITY"
13    }
14]
  • EXCHANGE_ORDER_NOTIFICATION_STATUS setting contains name of Return Order status that is used for notifying corresponding Exchange Order. This setting is defined on RETAILER level. The value should be a STRING, the default value is IN_TRANSITION.

Step arrow right iconResult

As a result, we will have an enhanced UI for the Return with Exchange process.

No alt provided

And Workflow that support this process.

Except as otherwise stated in the Extend Knowledge Content site policy, the content on this page is licensed under the Creative Commons Attribution 4.0 Licence, and any code samples that appear on this page are licensed under the Apache 2.0 Licence, unless any code sample forms part of the Fluent Order Management Platform code. Neither of these licences apply to any content on any other page that can be reached via a link on this page unless otherwise specified on that other page. If you wish to use any of the Extend Knowledge Content, you must do so in compliance with the licenses referred to above and the Extend Knowledge Content site policy, including attribution in the manner set out on this page. 

Valery Kornilovich

Valery Kornilovich

Contributors:
Sergey Chebotarev