Enable Return Order with Exchange in Fluent OMS
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.

Prerequisites
Steps
Use Case
A use case for a return with exchange is when a customer receives a defective product and wants to exchange it for a functional one without incurring additional costs.
Solution Approach
As a solution we need to modify workflows to support Return with or without RMA.
Add new custom rules so support changes in .
Modify existed UI component to support better visualization and add ability to initiate Exchange .
Challenges / Limitations
Current solution does not provide some side functionality that needs to be implemented based on the client specific 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)
Rules changes
CreateReturnOrderFromOrder rule
CreateReturnOrderFromOrder creates a new Return according to attributes. It also creates Exchange if Exchange Items list is not empty.
Context Entity:
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 copies values of RETURN_TYPE and RETURN_PERIOD attributes from Variant or Standard Product to Items of the . This should be used when a Fulfilment of the goes into Awaiting Collection (CC ) or Courier Collection (HD ) status.
Context Entity: FULFILMENT
1{
2 "name": "{{fluent.account.client_id}}.sefeature.CopyReturnAttributesToOrderItems",
3 "props": {}
4}
CalculateReturnableQuantityForOrderItems rule
CalculateReturnableQuantityForOrderItems calculates returnable quantity for each Items in the current and saves this value in returnableQty of the Item. This takes into that Item could be partially or fully substituted. Substituted quantity is stored in substituteQuantity of Item.
Context Entity:
1content missing :)
CalculateReturnDateLimitForOrderItems rule
CalculateReturnDateLimitForOrderItems calculates return date limit for each Items in the current and saves this value in RETURN_DATE_LIMIT of the Item. If the Item is not returnable date limit is not calculated. RETURN_PERIOD of 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:
1{
2 "name": "{{fluent.account.client_id}}.sefeature.CalculateReturnDateLimitForOrderItems",
3 "props": {}
4}
AssignRmaToReturnOrder rule
AssignRmaToReturnOrder creates RMA key and calculates RMA Key Expiration Date. These values is stored in returnAuthorisationKey and returnAuthorisationKeyExpiry fields of the current Return respectively.
Context Entity: RETURN_ORDER
1{
2 "name": "{{fluent.account.client_id}}.sefeature.AssignRmaToReturnOrder",
3 "props": null
4}
ValidateReturnOrderItems rule
ValidateReturnOrderItems validates all Return Items of a newly created Return . 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 confirmation is invocated (name of this is passed in confirmReturnOrder property of the ).
If any checks for any Item fails return rejection is invocated (name of this is passed in rejectReturnOrder property of the ). Rejection reasons are saved in RETURN_REJECTION_REASONS of the Return .
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 creates Return Fulfilments for the current Return . All 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 of the Return Fulfilment.
Context Entity: RETURN_ORDER
1{
2 "name": "{{fluent.account.client_id}}.sefeature.CreateReturnFulfilments",
3 "props": null
4}
SendEventIfAllReturnFulfilmentsInStatuses rule
SendEventIfAllReturnFulfilmentsInStatuses checks that all Return Fulfilments of the current Return are in statuses listed on status property of the . If check passes an is executed. name is passed in eventName property of the .
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 checks that any of Return Fulfilments of the current Return is in status listed on status property of the . If check passes an is executed. name is passed in eventName property of the .
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 checks if Return Fulfilment with name passed in attributeName property exists and equal to the value passed in attributeValue property. If the check is successful 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 checks if the current Return contains RMA Return Items. If there is 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 checks if the current Return contains RMA Return Items. If there is NOT 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 checks if the current Return contains Exchange . The with name passed in eventName is invoked according a value passed in exchangeOrderExisted property. The is sent if the value is TRUE and Exchange exists or the value is FALSE and Exchange 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 sends with name specified in eventName property to all Return Fulfilments of the current Return .
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 sends with name specified in eventName property to Return () 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 sends with name specified in eventName property to Catalogue with reference specified in inventoryCatalogueRef property. List of the items that should be updated is passed in items of the . 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 sends with name specified in eventName property to an Exchange if it exists for the current Return and the Return 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 sends delayed with name specified in eventName property to the same Return if returnAuthorisationKeyExpiry field of the Return 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 sends delayed with name specified in eventName property if Exchange 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 updates total amount and total tax amount of the current Return taking into only ReturnFulfilments that are in status passed in status property. Also this takes into that Return could be partially refunded by Exchange . Total amount of Return 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 updates the Return 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}
Workflow changes
HD & CC Order Workflows changes
Several changes were made in both CC & HD in to support new Return 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 have to be specified in ScheduleEvent in ResumeExchangeOrder . For instance, it could be OrderAssessment for HD and AssessPreOrder for CC .
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}
New Settings
There are several settings that existed in original implementation of Return 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.
Result
As a result, we will have an enhanced UI for the Return with Exchange .

And that support this .