Changed on:
13 Dec 2023
This article explains the logic that triggers the creation of a wave. Commonly, waves are created based on the fulfillment expiry time. Alternatively, the logic can be based on specific attributes of identified items (e.g. bulk items). Making this change can help facilitate a more efficient picking process according to the store layout.
User actions can be created throughout the wave process to reinforce specific business procedures. For example, we can ensure that in-store staff confirms the completion of the picking phase by using a confirmation dialogue box.
Domain Area: | The Location workflow provides the capability to alter the pick and pack process to best suit business needs. |
---|
The base location workflow provides the following features:
Create Wave based on the expiry time of the fulfilments. Add fulfilments to a wave, which will expire the soonest so that orders can be fulfilled in ascending order of their expiry time, and serve the online customers on a first in best-dressed principle.
Allocate picked items to fulfilments based on the expiry time of fulfilments. Allocate items to those fulfilments in a wave, which will expire the soonest so that orders can be fulfilled in ascending order of their expiry time, and serve the online customers on a first in best-dressed principle.
Pack stage is complete - Create Articles, consignment and book Couriers.
Create articles and consignment in the Fluent System for Home Delivery Orders and Click and Collect orders, that need to be transferred to a Collection Point from another fulfilling store, so that couriers can be booked and orders can be shipped to customers and collection points.
Couriers are Booked, wave process is Complete.
Complete each wave after it has been processed successfully so that the completed waves and their corresponding fulfilments can be updated.
Given a location has been created and is in the status ACTIVE
Source Entity | Source/Source EventName | To EventName | To Entity | Type |
LOCATION | Location Workflow/ CREATE | EventAPI/ CREATE | LOCATION | Event API |
1{
2 "name": "CREATE",
3 "description": "A location has been created. Activate the location.",
4 "type": "LOCATION",
5 "eventType": "NORMAL",
6 "rules": [
7 {
8 "name": "FLUENTRETAIL.base.ChangeState",
9 "props": {
10 "status": "ACTIVE"
11 }
12 }
13 ],
14 "triggers": [
15 {
16 "status": "CREATED"
17 }
18 ],
19 "userActions": []
20}
Language: json
Name: Location Sample
Description:
Create Location and Set status=ACTIVE
Create a wave for the Active location.
Source Entity | Source/Source EventName | To EventName | To Entity | Type |
LOCATION | Servicepoint User Action/Location Workflow/ WaveCreate | Fluent Order Workflow | FULFILLMENT | User Action/Event API/WaveCreate |
1{
2 "id": "1",
3 "name": "WaveCreate",
4 "accountId": "ACME",
5 "retailerId": "1",
6 "entityId": "123",
7 "entityRef": "F_123",
8 "entityType": "FULFILMENT",
9 "entitySubtype": "CC_PFS",
10 "entityStatus": "AWAITING_WAVE",
11 "type": "NORMAL",
12 "attributes": {
13 "rootEntityRef": "O_123",
14 "rootEntityType": "ORDER",
15 "rootEntityId": "123"
16 }
17}
Language: json
Name: WaveCreate Sample
Description:
CreateWave sample with status="AWAITING_WAVE"
items Confirmed in a wave/ Wave is in pack status in ServicePoint
Source Entity | Source/Source EventName | To EventName | To Entity | Type |
WAVE | Location Workflow/ServicePoint/ PickConfirm | OrderApp / CC Workflow/ WavePack | FULFILLMENT | User Action Event / EventAPI |
1{
2"name": "WavePack",
3"accountId": "ACME",
4"retailerId": "1",
5"entityId": "123",
6"entityRef": "F_123",
7"entityType": "FULFILMENT",
8"entitySubtype": "CC_PFS",
9"entityStatus": "ASSIGNED",
10"type": "NORMAL",
11"attributes": {
12 "rootEntityRef": "O_123",
13 "fulfilmentItems": [
14 {
15 "fulfilmentItemRef": "FI_1",
16 "orderItemId": "1",
17 "orderItemRef": "OI_1",
18 "skuRef": "PRD_1",
19 "requestedQty": 1,
20 "rejectedQty": 0,
21 "availableQty": 1
22 }
23 ],
24 "pickedItems": [
25 {
26 "skuRef": "PRD_1",//skuRef
27 "barcode": 123456,
28 "availableQty": 1
29 }
30 ],
31 "rootEntityType": "ORDER",
32 "rootEntityId": "123",
33 "barCodes": {}
34}
Language: json
Name: PickConfirm/ WavePack Sample
Description:
PickConfirm/ WavePack sample with status=ASSIGNED
Wave Dispatch started after the wave is picked and packed.
Source Entity | Source/Source EventName | To EventName | To Entity | Type |
WAVE | Location Workflow / WaveDispatch | OrderApp / WaveDispatchInitiated | User Action Event / EventAPI |
1{
2 "name": "WaveDispatchInitiated",
3 "accountId": "ACME",
4 "retailerId": "1",
5 "entityId": "123",
6 "entityRef": "F_123",
7 "entityType": "FULFILMENT",
8 "entitySubtype": "CC_PFS",
9 "entityStatus": "FULFILLED",
10 "type": "NORMAL",
11 "attributes": {
12 "rootEntityRef": "O_123",
13 "rootEntityType": "ORDER",
14 "rootEntityId": "123"
15 }
16}
Language: json
Name: WaveDispatch
Description:
WaveDispatch sample with status=FULFILLED
Complete the wave.
Source Entity | Source/Source EventName | To EventName | To Entity | Type |
WAVE | Location Workflow / Servicepoint/WaveComplete | Location Workflow / WaveComplete | WAVE | User Action Event / EventAPI |
1{
2 "name": "WaveComplete",
3 "accountId":"ACME",
4 "retailerId": "1",
5 "context": {
6 "entityType": "WAVE",
7 "entityId": "1",
8 "entityRef": "1",
9 "rootEntityType": "LOCATION",
10 "rootEntityId": "4",
11 "rootEntityRef": "LOC_4"
12 },
13 "attributes": []
14}
Language: json
Name: WaveComplete/ DownloadLabels
Description:
WaveComplete and Download Labels sample
The article arrives in store and is awaiting Collection by Customer
Source Entity | Source/Source EventName | To EventName | To Entity | Type |
ARTICLE | Servicepoint/ UserAction MarkAsArrived | Order Workflow/ArticleArrived | ARTICLE | EventAPI/ User action |
1"userActions": [
2 {
3 "eventName": "ARTICLE_ARRIVED",
4 "context": [
5 {
6 "label": "MARK AS ARRIVED",
7 "type": "PRIMARY",
8 "modules": [
9 "servicepoint"
10 ],
11 "confirm": false
12 }
13 ],
14 "attributes": []
15 }
16]
Language: json
Name: MarkAsArrived/ ArticleArrived
Description:
MarkAsArrived/ ArticleArrived sample with Article status
The article is canceled due to non-collection at the collection point, after a time frame set by the retailer.
Source Entity | Source/Source EventName | To EventName | To Entity | Type |
ARTICLE | Servicepoint/ UserAction Cancel | Order Workflow/CancelUncollectedArticle | ARTICLE | EventAPI |
1{
2 "retailerId": "<RETAILER_ID>",
3 "version": "1.0",
4 "entityType": "LOCATION",
5 "entitySubtype": "STORE",
6 "description": "Default Wave Workflow",
7 "versionComment": "Initial version",
8 "name": "LOCATION::STORE",
9 "rulesets": [
10 {
11 "name": "CREATE",
12 "description": "A location has been created. Activate the location.",
13 "type": "LOCATION",
14 "eventType": "NORMAL",
15 "rules": [
16 {
17 "name": "FLUENTRETAIL.base.ChangeState",
18 "props": {
19 "status": "ACTIVE"
20 }
21 }
22 ],
23 "triggers": [
24 {
25 "status": "CREATED"
26 }
27 ],
28 "userActions": []
29 },
30 {
31 "name": "WaveCreate",
32 "description": "Create a wave for the location",
33 "type": "LOCATION",
34 "eventType": "NORMAL",
35 "rules": [
36 {
37 "name": "<ACCOUNT_ID>.v2.CreateWaveByFulfilmentExpiry",
38 "props": {
39 "expireIn": 0,
40 "statuses": [
41 "AWAITING_WAVE"
42 ]
43 }
44 }
45 ],
46 "triggers": [
47 {
48 "status": "ACTIVE"
49 }
50 ],
51 "userActions": [
52 {
53 "context": [
54 {
55 "label": "Create Wave",
56 "type": "PRIMARY",
57 "modules": [
58 "servicepoint"
59 ],
60 "confirm": false
61 }
62 ],
63 "attributes": [
64 {
65 "name": "userName",
66 "label": "Username",
67 "type": "STRING",
68 "source": "loggedInUsername",
69 "mandatory": true
70 },
71 {
72 "name": "maxCount",
73 "label": "Order count",
74 "type": "INTEGER",
75 "source": "Settings.maxFulfillmentCountsForWave",
76 "mandatory": true
77 }
78 ]
79 }
80 ]
81 },
82 {
83 "name": "PickConfirm",
84 "description": "Wave has been created.",
85 "type": "WAVE",
86 "eventType": "NORMAL",
87 "rules": [
88 {
89 "name": "<ACCOUNT_ID>.gi.AllocatePickedItemsByFulfilmentExpiry",
90 "props": {
91 "eventName": "WavePack",
92 "excludedStatuses": [
93 "EXPIRED"
94 ]
95 }
96 },
97 {
98 "name": "FLUENTRETAIL.base.ChangeState",
99 "props": {
100 "status": "PACK"
101 }
102 }
103 ],
104 "triggers": [
105 {
106 "status": "PICK"
107 }
108 ],
109 "userActions": [
110 {
111 "context": [
112 {
113 "label": "Confirm pick",
114 "type": "PRIMARY",
115 "modules": [
116 "servicepoint"
117 ],
118 "confirm": true
119 }
120 ],
121 "attributes": [
122 {
123 "name": "pickedItems",
124 "label": "Picked Items",
125 "type": "STRING",
126 "source": "",
127 "defaultValue": "",
128 "mandatory": false
129 }
130 ]
131 }
132 ]
133 },
134 {
135 "name": "WaveDispatch",
136 "description": "Pack stage is complete. Now booking couriers.",
137 "type": "WAVE",
138 "eventType": "NORMAL",
139 "rules": [
140 {
141 "name": "FLUENTRETAIL.base.ChangeState",
142 "props": {
143 "status": "DISPATCH"
144 }
145 },
146 {
147 "name": "<ACCOUNT_ID>.v2.SendEventWithAttributesForAllFulfilments",
148 "props": {
149 "eventName": "WaveDispatchInitiated"
150 }
151 }
152 ],
153 "triggers": [
154 {
155 "status": "PACK"
156 }
157 ],
158 "userActions": []
159 },
160 {
161 "name": "CREATE",
162 "type": "WAVE",
163 "eventType": "NORMAL",
164 "rules": [
165 {
166 "name": "FLUENTRETAIL.base.ChangeState",
167 "props": {
168 "status": "PICK"
169 }
170 },
171 {
172 "name": "FLUENTRETAIL.base.SendEventForAllFulfilments",
173 "props": {
174 "eventName": "WaveCreate"
175 }
176 }
177 ],
178 "triggers": [
179 {
180 "status": "CREATED"
181 }
182 ],
183 "userActions": []
184 },
185 {
186 "name": "WaveComplete",
187 "description": "Completes the wave",
188 "type": "WAVE",
189 "eventType": "NORMAL",
190 "rules": [
191 {
192 "name": "FLUENTRETAIL.base.ChangeState",
193 "props": {
194 "status": "COMPLETE"
195 }
196 }
197 ],
198 "triggers": [
199 {
200 "status": "DISPATCH"
201 }
202 ],
203 "userActions": []
204 }
205 ],
206 "statuses": [
207 {
208 "name": "CREATED",
209 "entityType": "WAVE",
210 "category": "FULFILMENT"
211 },
212 {
213 "name": "ACTIVE",
214 "entityType": "CARRIER",
215 "category": "CARRIER"
216 },
217 {
218 "name": "",
219 "entityType": "FULFILMENT",
220 "category": "FULFILMENT"
221 },
222 {
223 "name": "PACK",
224 "entityType": "WAVE",
225 "category": "FULFILMENT"
226 },
227 {
228 "name": "ACTIVE",
229 "entityType": "LOCATION",
230 "category": "BOOKING"
231 },
232 {
233 "name": "PICK",
234 "entityType": "WAVE",
235 "category": "BOOKING"
236 },
237 {
238 "name": "DISPATCH",
239 "entityType": "WAVE",
240 "category": "DELIVERY"
241 },
242 {
243 "name": "CREATED",
244 "entityType": "LOCATION",
245 "category": "BOOKING"
246 },
247 {
248 "name": "COMPLETE",
249 "entityType": "WAVE",
250 "category": "DONE"
251 }
252 ]
253}
Language: json
Name: Location Store Workflow
Description:
Location Store workflow:
Set of rulesets, triggers and actions in the Location workflow.
This workflow is part of an alpha release and is not yet covered under the platform SLAs.
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.