Fluent Commerce Logo
Docs
Sign In

Enable Returns Functionality

How-to Guide

Author:

Fluent Commerce staff

Changed on:

13 Dec 2023

Key Points

  • Return Order

Steps

Step arrow right iconOverview

To enable Returns functionality in ServicePoint the following configuration is required:

Step arrow right icon1) Setup the following Settings via GraphQL

1mutation CreateSetting($retailerId:Int!) {
2  returnOrchestrated: createSetting(input: {
3        name: "RETURN_ORCHESTRATED",
4        valueType: "BOOLEAN",
5        value: "TRUE",
6        context: "RETAILER",
7        contextId: $retailerId}) {
8    id
9    name
10  }
11  defaultReturnDestinationLocation: createSetting(input: {
12        name: "DEFAULT_RETURN_DESTINATION_LOCATION",
13        valueType: "STRING",
14        value: "{{rejectLocation}}",//needs to be set to the corresponding default return location
15        context: "RETAILER",
16        contextId: $retailerId}) {
17    id
18    name
19  }
20  returnOrderType: createSetting(input: {
21        name: "RETURN_ORDER_TYPE",
22        valueType: "STRING",
23        value: "DEFAULT",
24        context: "RETAILER",
25        contextId: $retailerId}) {
26    id
27    name
28  }
29  returnOrchestratedAccount: createSetting(input: {
30        name: "RETURN_ORCHESTRATED",
31        valueType: "BOOLEAN",
32        value: "TRUE",
33        context: "ACCOUNT",
34        contextId: 0}) {
35    id
36    name
37  }
38}

Language: graphqlschema

Name: Settings (GQL)

Description:

[Warning: empty required content area]



Step arrow right icon2) Setup the following Settings via REST

1{{fluentApiHost}}/api/v4.1/settings/retailer/{{retailer_id}}/RETURN_REASON
2
3

Language: java

Name: a) RETURN_REASON ENDPOINT

Description:

[Warning: empty required content area]
1{
2  ``"setting"``: {
3    ``"key"``: ``"RETURN_REASON"``,
4    ``"type"``: ``"JSON"``,
5    ``"value"``: [
6      ``{
7        ``"label"``: ``"Wrong Size"``,
8        ``"value"``: ``"WRONGSIZE"
9      ``},
10      ``{
11        ``"label"``: ``"Broken"``,
12        ``"value"``: ``"BROKEN"
13      ``}
14    ``]
15  ``}
16}

Language: java

Name: a) RETURN_REASON PAYLOAD

Description:

[Warning: empty required content area]
1{{fluentApiHost}}/api/v4.1/settings/retailer/{{retailer_id}}/RETURN_CONDITION

Language: java

Name: b) RETURN_CONDITION ENDPOINT

Description:

[Warning: empty required content area]
1{
2  ``"setting"``: {
3    ``"key"``: ``"RETURN_CONDITION"``,
4    ``"type"``: ``"JSON"``,
5    ``"value"``: [
6      ``{
7        ``"label"``: ``"Reusable"``,
8        ``"value"``: ``"GOOD"
9      ``},
10      ``{
11        ``"label"``: ``"Destroy"``,
12        ``"value"``: ``"BROKEN"
13      ``}
14    ``]
15  ``}
16}

Language: java

Name: b) RETURN_CONDITION PAYLOAD

Description:

[Warning: empty required content area]


Step arrow right icon3) Create & Assign the Instore Return Role

1mutation {
2 ``createRole(input: {name: ``"INSTORE_RETURNS"``,
3  ``permissions: [
4    ``{name: ``"ORDER_VIEW"``},
5    ``{name: ``"CUSTOMER_VIEW"``},
6    ``{name: ``"RETURN_VIEW"``},
7    ``{name: ``"ORDERITEM_VIEW"``},
8    ``{name: ``"PRODUCT_VIEW"``},
9    ``{name: ``"VARIANTPRODUCT_VIEW"``},
10    ``{name: ``"STANDARDPRODUCT_VIEW"``},
11    ``{name: ``"GROUPPRODUCT_VIEW"``},
12    ``{name: ``"CATEGORY_VIEW"``}
13  ``]
14 ``}) {
15  ``name
16  ``permissions {
17   ``name
18  ``}
19 ``}
20}

Language: graphqlschema

Name: a) Role Creation - INSTORE_RETURNS Role Creation

Description:

[Warning: empty required content area]
1mutation updateUser(
2 ``$locationUserId:ID!
3 ``$retailerId:ID!
4){
5 ``updateUser(input:{
6  ``id:$locationUserId
7  ``roles:[
8   ``{
9    ``role:{
10      ``name:``"INSTORE_RETURNS"
11    ``}
12    ``contexts:[
13      ``{
14        ``contextId:$retailerId
15        ``contextType:``"RETAILER"
16      ``},
17      ``{
18        ``contextId:$locationUserId,
19        ``contextType:``"AGENT"
20      ``}
21    ``]
22   ``}
23  ``]
24 ``}){
25   ``id
26 ``}
27}

Language: graphqlschema

Name: b) Role Assignment

Description:

[Warning: empty required content area]


Step arrow right icon4) Workflows

For Returns there is some cross workflow communication occurring between the Order workflow and the Return Order workflow.

a) Order workflow The Order workflow requires 2 new rulesets (if not already present):

1{
2  "name": "ReturnOrder",
3  "description": "ReturnOrder",
4  "type": "ORDER",
5  "subtype": "CC",
6  "eventType": "NORMAL",
7  "rules": [
8    {
9      "name": "FLUENTRETAIL.base.ValidateReturnQty",
10      "props": null
11    },
12    {
13      "name": "FLUENTRETAIL.base.CreateReturnOrderFromOrder",
14      "props": null
15    },
16    {
17      "name": "FLUENTRETAIL.base.ChangeStateGQL",
18      "props": {
19        "status": "RETURN_CREATED"
20      }
21    }
22  ],
23  "triggers": [
24    {
25      "status": "BOOKED"
26    },
27    {
28      "status": "PICK_PACK"
29    },
30    {
31      "status": "COMPLETE"
32    },
33    {
34      "status": "RETURN_CREATED"
35    }
36  ],
37  "userActions": [
38    {
39      "context": [
40        {
41          "label": "Return",
42          "type": "PRIMARY",
43          "modules": [
44            "adminconsole"
45          ],
46          "confirm": false
47        }
48      ],
49      "attributes": [
50        {
51          "name": "returnItems",
52          "label": "Items",
53          "type": "RETURN_ITEMS",
54          "source": "",
55          "defaultValue": "",
56          "mandatory": false
57        },
58        {
59          "name": "pickupLocation",
60          "label": "Pickup Location",
61          "type": "ADDRESS",
62          "source": "",
63          "defaultValue": "",
64          "mandatory": false
65        },
66        {
67          "name": "lodgedLocation",
68          "label": "Lodged Location",
69          "type": "STRING",
70          "source": "",
71          "defaultValue": "",
72          "mandatory": false
73        },
74        {
75          "name": "type",
76          "label": "Return Type",
77          "type": "STRING",
78          "source": "",
79          "options": {
80            "active": [
81              {
82                "name": "Default",
83                "value": "DEFAULT"
84              }
85            ]
86          },
87          "defaultValue": "",
88          "mandatory": false
89        }
90      ]
91    }
92  ]
93}

Language: json

Name: Return Order

Description:

[Warning: empty required content area]
1{
2 ``"name"``: ``"UpdateReturnableQty"``,
3 ``"description"``: ``"UpdateReturnableQty"``,
4 ``"type"``: ``"ORDER"``,
5 ``"eventType"``: ``"NORMAL"``,
6 ``"rules"``: [
7  ``{
8   ``"name"``: ``"FLUENTRETAIL.base.UpdateOrderItemAttribute"``,
9   ``"props"``: ``null
10  ``}
11 ``],
12 ``"triggers"``: [
13  ``{
14   ``"status"``: ``"RETURN_CREATED"
15  ``}
16 ``],
17 ``"userActions"``: []
18}

Language: java

Name: UpdateReturnableQty

Description:

[Warning: empty required content area]

b) Return Order workflow (sample)

1{
2 ``"retailerId"``: ``"{{retailer_id}}"``,
3 ``"version"``: ``"1.0"``,
4 ``"entityType"``: ``"RETURN_ORDER"``,
5 ``"entitySubtype"``: ``"DEFAULT"``,
6 ``"description"``: ``"Basic workflow template"``,
7 ``"versionComment"``: ``"First version"``,
8 ``"name"``: ``"RETURN_ORDER::DEFAULT"``,
9 ``"rulesets"``: [
10  ``{
11   ``"name"``: ``"CREATE"``,
12   ``"description"``: ``"Create ReturnOrder"``,
13   ``"type"``: ``"RETURN_ORDER"``,
14   ``"subtype"``: ``"DEFAULT"``,
15   ``"eventType"``: ``"NORMAL"``,
16   ``"rules"``: [
17    ``{
18     ``"name"``: ``"FLUENTRETAIL.base.ChangeStateGQL"``,
19     ``"props"``: {
20      ``"status"``: ``"BOOKED"
21     ``}
22    ``},
23    ``{
24     ``"name"``: ``"FLUENTRETAIL.base.SendEventToReturns"``,
25     ``"props"``: {
26      ``"eventName"``: ``"FulfilReturn"
27     ``}
28    ``}
29   ``],
30   ``"triggers"``: [
31    ``{
32     ``"status"``: ``"CREATED"
33    ``}
34   ``],
35   ``"userActions"``: []
36  ``},
37  ``{
38   ``"name"``: ``"FulfilReturn"``,
39   ``"description"``: ``"ReturnOrder"``,
40   ``"type"``: ``"RETURN_ORDER"``,
41   ``"eventType"``: ``"NORMAL"``,
42   ``"rules"``: [
43    ``{
44     ``"name"``: ``"FLUENTRETAIL.base.CreateReturnFulfilment"``,
45     ``"props"``: ``null
46    ``},
47    ``{
48     ``"name"``: ``"FLUENTRETAIL.base.ChangeStateGQL"``,
49     ``"props"``: {
50      ``"status"``: ``"RETURNED"
51     ``}
52    ``},
53    ``{
54     ``"name"``: ``"FLUENTRETAIL.base.SendEventToUpdateOrderItemAttribute"``,
55     ``"props"``: {
56      ``"eventName"``: ``"UpdateReturnableQty"
57     ``}
58    ``}
59   ``],
60   ``"triggers"``: [
61    ``{
62     ``"status"``: ``"BOOKED"
63    ``},
64    ``{
65     ``"status"``: ``"CREATED"
66    ``}

Language: java

Name: Example

Description:

[Warning: empty required content area]
Fluent Commerce staff

Fluent Commerce staff

Copyright © 2024 Fluent Retail Pty Ltd (trading as Fluent Commerce). All rights reserved. No materials on this docs.fluentcommerce.com site may be used in any way and/or for any purpose without prior written authorisation from Fluent Commerce. Current customers and partners shall use these materials strictly in accordance with the terms and conditions of their written agreements with Fluent Commerce or its affiliates.

Fluent Logo