@things-factory/worksheet-base 4.2.12 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist-server/controllers/outbound/loading-worksheet-controller.js +47 -10
  2. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/picking-worksheet-controller.js +142 -5
  4. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +116 -20
  6. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  7. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js +14 -1
  8. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js.map +1 -1
  9. package/dist-server/graphql/resolvers/worksheet/loading/loading.js +3 -10
  10. package/dist-server/graphql/resolvers/worksheet/loading/loading.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +55 -21
  12. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +1 -0
  14. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +1 -1
  16. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  17. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +8 -6
  18. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  19. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  20. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  21. package/dist-server/graphql/resolvers/worksheet/picking/picking.js +4 -4
  22. package/dist-server/graphql/resolvers/worksheet/picking/picking.js.map +1 -1
  23. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js +4 -4
  24. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js.map +1 -1
  25. package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js +15 -0
  26. package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js.map +1 -0
  27. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +10 -1
  28. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  29. package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js +11 -6
  30. package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  32. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  34. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  35. package/dist-server/graphql/resolvers/worksheet/worksheet.js +2 -0
  36. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet/worksheets.js +17 -2
  38. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  39. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +5 -3
  40. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  41. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js +15 -4
  42. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js.map +1 -1
  43. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -1
  44. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  45. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js +6 -2
  46. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js.map +1 -1
  47. package/dist-server/graphql/types/worksheet/index.js +10 -0
  48. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  49. package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js +1 -0
  50. package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js.map +1 -1
  51. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +2 -0
  52. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  53. package/dist-server/graphql/types/worksheet/worksheet-info.js +2 -0
  54. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  55. package/dist-server/graphql/types/worksheet/worksheet.js +1 -0
  56. package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
  57. package/package.json +17 -17
  58. package/server/controllers/outbound/loading-worksheet-controller.ts +83 -17
  59. package/server/controllers/outbound/picking-worksheet-controller.ts +178 -7
  60. package/server/controllers/outbound/sorting-worksheet-controller.ts +167 -27
  61. package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +14 -0
  62. package/server/graphql/resolvers/worksheet/loading/loading.ts +5 -12
  63. package/server/graphql/resolvers/worksheet/loading-worksheet.ts +66 -13
  64. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +1 -1
  65. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +1 -1
  66. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +13 -11
  67. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  68. package/server/graphql/resolvers/worksheet/picking/picking.ts +30 -4
  69. package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
  70. package/server/graphql/resolvers/worksheet/picking/seal-tote.ts +25 -0
  71. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +13 -2
  72. package/server/graphql/resolvers/worksheet/sorting/complete-order-sorting.ts +13 -9
  73. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  74. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  75. package/server/graphql/resolvers/worksheet/worksheet.ts +2 -0
  76. package/server/graphql/resolvers/worksheet/worksheets.ts +26 -2
  77. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +12 -3
  78. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.ts +22 -7
  79. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +6 -2
  80. package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +7 -1
  81. package/server/graphql/types/worksheet/index.ts +10 -0
  82. package/server/graphql/types/worksheet/loaded-worksheet-detail.ts +1 -0
  83. package/server/graphql/types/worksheet/worksheet-detail-info.ts +2 -0
  84. package/server/graphql/types/worksheet/worksheet-info.ts +2 -0
  85. package/server/graphql/types/worksheet/worksheet.ts +1 -0
@@ -1,4 +1,4 @@
1
- import { Equal, Not } from 'typeorm'
1
+ import { Equal, Not, In } from 'typeorm'
2
2
 
3
3
  import { Bizplace } from '@things-factory/biz-base'
4
4
  import {
@@ -8,9 +8,11 @@ import {
8
8
  ORDER_TYPES,
9
9
  OrderInventory,
10
10
  OrderNoGenerator,
11
- ReleaseGood
11
+ ReleaseGood,
12
+ OrderToteItem,
13
+ OrderTote
12
14
  } from '@things-factory/sales-base'
13
- import { Inventory, INVENTORY_TRANSACTION_TYPE } from '@things-factory/warehouse-base'
15
+ import { Inventory, INVENTORY_TRANSACTION_TYPE, Tote, TOTE_STATUS } from '@things-factory/warehouse-base'
14
16
 
15
17
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
16
18
  import { Worksheet, WorksheetDetail } from '../../entities'
@@ -95,8 +97,8 @@ export class LoadingWorksheetController extends VasWorksheetController {
95
97
 
96
98
  async loading(
97
99
  releaseGoodNo: string,
98
- worksheetDetails: Partial<WorksheetDetail & { loadedQty: number }>[]
99
- ): Promise<void> {
100
+ worksheetDetails: Partial<WorksheetDetail & { loadedQty: number } & { toteName: string }>[]
101
+ ): Promise<any> {
100
102
  const releaseGood: ReleaseGood = await this.findRefOrder(
101
103
  ReleaseGood,
102
104
  { domain: this.domain, name: releaseGoodNo },
@@ -104,14 +106,14 @@ export class LoadingWorksheetController extends VasWorksheetController {
104
106
  )
105
107
  const bizplace: Bizplace = releaseGood.bizplace
106
108
 
107
- for (let worksheetDetail of worksheetDetails) {
108
- const loadedQty: number = worksheetDetail.loadedQty
109
- worksheetDetail = await this.findExecutableWorksheetDetailByName(worksheetDetail.name, WORKSHEET_TYPE.LOADING, [
110
- 'worksheet',
111
- 'targetInventory',
112
- 'targetInventory.inventory',
113
- 'targetInventory.product'
114
- ])
109
+ for (let i = 0; i < worksheetDetails.length; i++) {
110
+ const loadedQty: number = worksheetDetails[i].loadedQty
111
+ const toteName: string = worksheetDetails[i].toteName
112
+ let worksheetDetail = await this.findExecutableWorksheetDetailByName(
113
+ worksheetDetails[i].name,
114
+ WORKSHEET_TYPE.LOADING,
115
+ ['worksheet', 'targetInventory', 'targetInventory.inventory', 'targetInventory.product']
116
+ )
115
117
 
116
118
  const worksheet: Worksheet = worksheetDetail.worksheet
117
119
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
@@ -119,9 +121,9 @@ export class LoadingWorksheetController extends VasWorksheetController {
119
121
  let inventory: Inventory = targetInventory.inventory
120
122
 
121
123
  targetInventory.loadedAt = new Date()
122
- targetInventory.loadedByUser = this.user;
124
+ targetInventory.loadedByUser = this.user
123
125
 
124
- let loadedBy: string[] = targetInventory.loadedBy ? (targetInventory.loadedBy).split(',') : []
126
+ let loadedBy: string[] = targetInventory.loadedBy ? targetInventory.loadedBy.split(',') : []
125
127
  if (!loadedBy.find(x => x == this.user.name)) {
126
128
  loadedBy.push(this.user.name)
127
129
  targetInventory.loadedBy = loadedBy.join(',')
@@ -174,11 +176,56 @@ export class LoadingWorksheetController extends VasWorksheetController {
174
176
  newTargetInventory.updater = this.user
175
177
  newTargetInventory = await this.trxMgr.getRepository(OrderInventory).save(newTargetInventory)
176
178
 
177
- await this.createWorksheetDetails(worksheet, WORKSHEET_TYPE.LOADING, [newTargetInventory], {
178
- status: WORKSHEET_STATUS.EXECUTING
179
+ if (toteName) {
180
+ let foundOrderTote = await this.trxMgr
181
+ .getRepository(OrderTote)
182
+ .findOne({ where: { name: toteName, releaseGood } })
183
+
184
+ let foundOrderToteItems = await this.trxMgr
185
+ .getRepository(OrderToteItem)
186
+ .find({ where: { orderInventory: targetInventory.id } })
187
+
188
+ let foundOrderToteItemIds = foundOrderToteItems.map((itm: OrderToteItem) => itm.id)
189
+
190
+ await this.trxMgr
191
+ .getRepository(OrderToteItem)
192
+ .update({ id: In(foundOrderToteItemIds) }, { orderInventory: newTargetInventory })
193
+
194
+ let foundOrderToteItem: OrderToteItem = await this.trxMgr
195
+ .getRepository(OrderToteItem)
196
+ .findOne({ where: { orderInventory: newTargetInventory.id, orderTote: foundOrderTote, qty: loadedQty } })
197
+
198
+ await this.trxMgr
199
+ .getRepository(OrderToteItem)
200
+ .update({ id: foundOrderToteItem.id }, { orderInventory: targetInventory.id })
201
+ }
202
+
203
+ let newWorksheetDetail: any = await this.createWorksheetDetails(
204
+ worksheet,
205
+ WORKSHEET_TYPE.LOADING,
206
+ [newTargetInventory],
207
+ {
208
+ status: WORKSHEET_STATUS.EXECUTING
209
+ }
210
+ )
211
+
212
+ let worksheetDetailName = worksheetDetails[i].name
213
+ worksheetDetails = worksheetDetails.map(record => {
214
+ if (record.name == worksheetDetailName && !record?.targetInventory) {
215
+ return {
216
+ ...record,
217
+ name: newWorksheetDetail[0].name
218
+ }
219
+ } else {
220
+ return record
221
+ }
179
222
  })
223
+
224
+ worksheetDetails[i].name = worksheetDetailName
180
225
  }
181
226
 
227
+ worksheetDetails[i].targetInventory = targetInventory
228
+
182
229
  await generateInventoryHistory(
183
230
  inventory,
184
231
  releaseGood,
@@ -189,6 +236,8 @@ export class LoadingWorksheetController extends VasWorksheetController {
189
236
  this.trxMgr
190
237
  )
191
238
  }
239
+
240
+ return worksheetDetails
192
241
  }
193
242
 
194
243
  async undoLoading(deliveryOrder: Partial<DeliveryOrder>, palletIds: string[]): Promise<void> {
@@ -228,6 +277,10 @@ export class LoadingWorksheetController extends VasWorksheetController {
228
277
  }
229
278
  })
230
279
 
280
+ let undoOrderToteItem: OrderToteItem = await this.trxMgr
281
+ .getRepository(OrderToteItem)
282
+ .findOne({ where: { orderInventory: undoTargetOrderInventory } })
283
+
231
284
  if (prevTargetInventory) {
232
285
  // If there's prev target inventory
233
286
  // Merge qty and uomValue into prev target inventory
@@ -236,6 +289,13 @@ export class LoadingWorksheetController extends VasWorksheetController {
236
289
  prevTargetInventory.updater = this.user
237
290
  await this.updateOrderTargets([prevTargetInventory])
238
291
 
292
+ //Update order tote item if any
293
+ if (undoOrderToteItem) {
294
+ undoOrderToteItem.orderInventoryId = prevTargetInventory.id
295
+ undoOrderToteItem.orderInventory = prevTargetInventory
296
+ await this.trxMgr.getRepository(OrderToteItem).save(undoOrderToteItem)
297
+ }
298
+
239
299
  // Terminate undo target order inventory
240
300
  undoTargetOrderInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
241
301
  await this.updateOrderTargets([undoTargetOrderInventory])
@@ -282,6 +342,12 @@ export class LoadingWorksheetController extends VasWorksheetController {
282
342
  status: ORDER_STATUS.LOADING
283
343
  })
284
344
 
345
+ const orderToteIds = await (
346
+ await this.trxMgr.getRepository(OrderTote).find({ where: { releaseGood }, relations: ['tote'] })
347
+ ).map((record: OrderTote) => record?.toteId)
348
+
349
+ await this.trxMgr.getRepository(Tote).update({ id: In(orderToteIds) }, { status: TOTE_STATUS.DISPATCHED })
350
+
285
351
  const worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.LOADING, [
286
352
  'worksheetDetails',
287
353
  'worksheetDetails.targetInventory'
@@ -1,4 +1,4 @@
1
- import { Equal, In, Not } from 'typeorm'
1
+ import { Equal, In, IsNull, Not } from 'typeorm'
2
2
 
3
3
  import { Bizplace } from '@things-factory/biz-base'
4
4
  import { generateId } from '@things-factory/id-rule-base'
@@ -8,6 +8,10 @@ import {
8
8
  ORDER_STATUS,
9
9
  OrderInventory,
10
10
  OrderNoGenerator,
11
+ OrderProduct,
12
+ OrderTote,
13
+ OrderToteItem,
14
+ OrderToteSeal,
11
15
  OrderVas,
12
16
  ReleaseGood
13
17
  } from '@things-factory/sales-base'
@@ -20,7 +24,9 @@ import {
20
24
  InventoryItem,
21
25
  InventoryNoGenerator,
22
26
  Location,
23
- LOCATION_TYPE
27
+ LOCATION_TYPE,
28
+ Tote,
29
+ TOTE_STATUS
24
30
  } from '@things-factory/warehouse-base'
25
31
 
26
32
  import { TASK_NUMBER_RULE_TYPE, TASK_NUMBER_SETTING_KEY, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
@@ -388,7 +394,8 @@ export class PickingWorksheetController extends VasWorksheetController {
388
394
  productBarcode: string,
389
395
  cartonId: string,
390
396
  binLocation?: string,
391
- serialNumber?: string
397
+ serialNumber?: string,
398
+ toteNo?: string
392
399
  ): Promise<OrderInventory> {
393
400
  try {
394
401
  let worksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
@@ -401,6 +408,7 @@ export class PickingWorksheetController extends VasWorksheetController {
401
408
  'targetInventory.releaseGood',
402
409
  'targetInventory.inventory',
403
410
  'targetInventory.product',
411
+ 'targetInventory.orderProduct',
404
412
  'targetInventory.product.productDetails',
405
413
  'targetInventory.product.productDetails.product',
406
414
  'targetInventory.product.productDetails.childProductDetail'
@@ -409,8 +417,10 @@ export class PickingWorksheetController extends VasWorksheetController {
409
417
 
410
418
  const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
411
419
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
420
+ let targetProduct: OrderProduct = targetInventory.orderProduct
412
421
  const product: Product = targetInventory.product
413
422
  let inventory: Inventory = targetInventory.inventory
423
+ let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
414
424
 
415
425
  //validation to prevent duplicated picking
416
426
  let oiValidate: OrderInventory = await this.trxMgr.getRepository(OrderInventory).findOne({
@@ -512,6 +522,10 @@ export class PickingWorksheetController extends VasWorksheetController {
512
522
  }
513
523
  }
514
524
 
525
+ if (toteNo) {
526
+ await this.toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace)
527
+ }
528
+
515
529
  await this.updatePickingTransaction(releaseGood, targetInventory, worksheetDetail, inventory, pickedQty)
516
530
  } catch (error) {
517
531
  throw error
@@ -525,7 +539,8 @@ export class PickingWorksheetController extends VasWorksheetController {
525
539
  locationName: string,
526
540
  pickedQty: number,
527
541
  binLocation?: string,
528
- serialNumber?: string
542
+ serialNumber?: string,
543
+ toteNo?: string
529
544
  ): Promise<void> {
530
545
  try {
531
546
  let worksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
@@ -533,8 +548,10 @@ export class PickingWorksheetController extends VasWorksheetController {
533
548
  worksheetType,
534
549
  [
535
550
  'worksheet',
551
+ 'worksheet.bizplace',
536
552
  'targetInventory',
537
553
  'targetInventory.releaseGood',
554
+ 'targetInventory.orderProduct',
538
555
  'targetInventory.inventory',
539
556
  'targetInventory.inventory.location',
540
557
  'targetInventory.product'
@@ -545,6 +562,8 @@ export class PickingWorksheetController extends VasWorksheetController {
545
562
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
546
563
  const product: Product = targetInventory.product
547
564
  let inventory: Inventory = targetInventory.inventory
565
+ let targetProduct: OrderProduct = targetInventory.orderProduct
566
+ let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
548
567
 
549
568
  //validation to prevent duplicated picking
550
569
  let oiValidate: OrderInventory = await this.trxMgr.getRepository(OrderInventory).findOne({
@@ -649,6 +668,10 @@ export class PickingWorksheetController extends VasWorksheetController {
649
668
 
650
669
  targetInventory = await this.checkAndSetBinPicking(targetInventory, binLocation)
651
670
 
671
+ if (toteNo) {
672
+ await this.toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace)
673
+ }
674
+
652
675
  await this.updatePickingTransaction(releaseGood, targetInventory, worksheetDetail, inventory, pickedQty)
653
676
 
654
677
  const fromLocation: Location = targetInventory.inventory.location
@@ -947,6 +970,14 @@ export class PickingWorksheetController extends VasWorksheetController {
947
970
  status: ORDER_STATUS.PICKING
948
971
  })
949
972
 
973
+ const foundNotSealedOrderTote = await this.trxMgr
974
+ .getRepository(OrderTote)
975
+ .findOne({ where: { releaseGood, closedDate: IsNull() } })
976
+
977
+ if (foundNotSealedOrderTote) {
978
+ throw new Error('Please seal the tote(s) before completing')
979
+ }
980
+
950
981
  let worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.PICKING, [
951
982
  'worksheetDetails',
952
983
  'worksheetDetails.targetInventory'
@@ -1008,14 +1039,14 @@ export class PickingWorksheetController extends VasWorksheetController {
1008
1039
  worksheet.updater = this.user
1009
1040
  worksheet = await this.trxMgr.getRepository(Worksheet).save(worksheet)
1010
1041
 
1011
- const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
1042
+ const worksheetDetails: any = worksheet.worksheetDetails.filter(wsD => wsD.status != 'MISSING')
1012
1043
  worksheetDetails.forEach((wsd: WorksheetDetail) => {
1013
1044
  wsd.status = WORKSHEET_STATUS.DONE
1014
1045
  wsd.updater = this.user
1015
1046
  })
1016
1047
  await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetails)
1017
1048
 
1018
- const targetInventories: OrderInventory[] = worksheet.worksheetDetails.map((wsd: WorksheetDetail) => {
1049
+ const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => {
1019
1050
  let targetInventory: OrderInventory = wsd.targetInventory
1020
1051
  targetInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
1021
1052
  targetInventory.updater = this.user
@@ -1023,7 +1054,7 @@ export class PickingWorksheetController extends VasWorksheetController {
1023
1054
  })
1024
1055
  await this.updateOrderTargets(targetInventories)
1025
1056
 
1026
- const releaseGoods: ReleaseGood[] = worksheet.worksheetDetails.map((wsd: WorksheetDetail) => {
1057
+ const releaseGoods: ReleaseGood[] = worksheetDetails.map((wsd: WorksheetDetail) => {
1027
1058
  let releaseGood: ReleaseGood = wsd.targetInventory.releaseGood
1028
1059
 
1029
1060
  let orderStatus: string
@@ -1108,6 +1139,9 @@ export class PickingWorksheetController extends VasWorksheetController {
1108
1139
  }
1109
1140
 
1110
1141
  orderInventory.status = ORDER_INVENTORY_STATUS.PICKED
1142
+ orderInventory.pickedBy = this.user?.name
1143
+ orderInventory.pickedByUser = this.user
1144
+ orderInventory.pickedAt = new Date()
1111
1145
 
1112
1146
  inventory.qty -= orderInventory.releaseQty
1113
1147
  inventory.uomValue = Math.round((inventory.uomValue - orderInventory.releaseUomValue) * 100) / 100
@@ -1367,6 +1401,75 @@ export class PickingWorksheetController extends VasWorksheetController {
1367
1401
  } catch (e) {}
1368
1402
  }
1369
1403
 
1404
+ private async toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace) {
1405
+ //1. find tote
1406
+ let foundTote: Tote = await this.trxMgr
1407
+ .getRepository(Tote)
1408
+ .findOne({ where: { bizplace, name: toteNo, deletedAt: IsNull() } })
1409
+
1410
+ if (foundTote?.status == TOTE_STATUS.DAMAGED || foundTote?.status == TOTE_STATUS.DISPATCHED) {
1411
+ foundTote = null
1412
+ }
1413
+
1414
+ //2. find order tote
1415
+ let foundOrderTote: OrderTote = await this.trxMgr
1416
+ .getRepository(OrderTote)
1417
+ .findOne({ where: { domain: this.domain, name: toteNo, releaseGood } })
1418
+
1419
+ //if order tote not found the create one, if tote not found means it's tote box
1420
+ //create order tote item
1421
+ if (!foundOrderTote) {
1422
+ const orderTote = await this.trxMgr.getRepository(OrderTote).save({
1423
+ name: toteNo,
1424
+ domain: this.domain,
1425
+ releaseGood,
1426
+ tote: foundTote ? foundTote : null,
1427
+ updater: this.user
1428
+ })
1429
+
1430
+ const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
1431
+ domain: this.domain,
1432
+ name: OrderNoGenerator.orderToteItem(),
1433
+ orderProduct: targetProduct,
1434
+ orderInventory: targetInventory,
1435
+ orderTote,
1436
+ qty: pickedQty,
1437
+ updater: this.user
1438
+ })
1439
+ } else {
1440
+ if (foundOrderTote.closedDate) {
1441
+ throw new Error('Tote has been sealed, please try another tote!')
1442
+ }
1443
+
1444
+ //if found order tote then check if order tote item exist
1445
+ const foundOrderToteItem: OrderToteItem = await this.trxMgr.getRepository(OrderToteItem).findOne({
1446
+ domain: this.domain,
1447
+ orderProduct: targetProduct,
1448
+ orderInventory: targetInventory,
1449
+ orderTote: foundOrderTote
1450
+ })
1451
+
1452
+ //if not order tote item doesnt exist then create one
1453
+ if (!foundOrderToteItem) {
1454
+ const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
1455
+ domain: this.domain,
1456
+ name: OrderNoGenerator.orderToteItem(),
1457
+ orderProduct: targetProduct,
1458
+ orderInventory: targetInventory,
1459
+ orderTote: foundOrderTote,
1460
+ qty: pickedQty,
1461
+ updater: this.user
1462
+ })
1463
+ } else {
1464
+ //if found order tote item found then add the quantity
1465
+ const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
1466
+ ...foundOrderToteItem,
1467
+ qty: foundOrderToteItem.qty + pickedQty
1468
+ })
1469
+ }
1470
+ }
1471
+ }
1472
+
1370
1473
  async undoSerialNumberPicking(worksheetDetailName: string, inventoryItemId: string): Promise<void> {
1371
1474
  const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
1372
1475
  where: { name: worksheetDetailName, domain: this.domain, status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED)) },
@@ -1438,4 +1541,72 @@ export class PickingWorksheetController extends VasWorksheetController {
1438
1541
  targetInventory.updater = this.user
1439
1542
  await this.updateOrderTargets([targetInventory])
1440
1543
  }
1544
+
1545
+ async sealTote(sealNo: string, toteNo: string, orderNo: string): Promise<void> {
1546
+ const checkDuplicateSeal = await this.trxMgr.getRepository(OrderToteSeal).findOne({
1547
+ where: {
1548
+ name: sealNo
1549
+ }
1550
+ })
1551
+
1552
+ if (checkDuplicateSeal) {
1553
+ throw new Error('Seal has been scanned before')
1554
+ }
1555
+
1556
+ const releaseGood: ReleaseGood = await this.trxMgr
1557
+ .getRepository(ReleaseGood)
1558
+ .findOne({ where: { domain: this.domain, name: orderNo }, relations: ['bizplace', 'bizplace.domain'] })
1559
+
1560
+ let sealNoSetting: Setting = await this.trxMgr.getRepository(Setting).findOne({
1561
+ where: {
1562
+ domain: releaseGood.bizplace.domain,
1563
+ name: 'minimum-seal-number'
1564
+ }
1565
+ })
1566
+
1567
+ if (!sealNoSetting) {
1568
+ sealNoSetting = await this.trxMgr.getRepository(Setting).findOne({
1569
+ where: {
1570
+ domain: this.domain,
1571
+ name: 'minimum-seal-number'
1572
+ }
1573
+ })
1574
+ }
1575
+
1576
+ const foundOrderTote: OrderTote = await this.trxMgr
1577
+ .getRepository(OrderTote)
1578
+ .findOne({ where: { domain: this.domain, name: toteNo, releaseGood } })
1579
+
1580
+ if (!foundOrderTote) {
1581
+ throw new Error('Tote not scanned under this order')
1582
+ }
1583
+
1584
+ let totalOrderToteItems = await this.trxMgr.getRepository(OrderToteItem).count({
1585
+ where: {
1586
+ orderTote: foundOrderTote
1587
+ }
1588
+ })
1589
+
1590
+ if (totalOrderToteItems < 1) {
1591
+ throw new Error('Tote carton is empty')
1592
+ }
1593
+
1594
+ const newToteOrderSeal: OrderToteSeal = await this.trxMgr.getRepository(OrderToteSeal).save({
1595
+ domain: this.domain,
1596
+ name: sealNo,
1597
+ orderTote: foundOrderTote,
1598
+ updater: this.user
1599
+ })
1600
+
1601
+ const totalSeal = await this.trxMgr.getRepository(OrderToteSeal).count({
1602
+ orderTote: foundOrderTote
1603
+ })
1604
+
1605
+ if (totalSeal >= parseInt(sealNoSetting?.value || 0)) {
1606
+ await this.trxMgr.getRepository(OrderTote).save({
1607
+ ...foundOrderTote,
1608
+ closedDate: new Date()
1609
+ })
1610
+ }
1611
+ }
1441
1612
  }