@things-factory/worksheet-base 4.3.0-alpha.1 → 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 (133) hide show
  1. package/dist-server/constants/index.js +1 -5
  2. package/dist-server/constants/index.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/index.js +1 -5
  4. package/dist-server/controllers/ecommerce/index.js.map +1 -1
  5. package/dist-server/controllers/inbound/index.js +1 -5
  6. package/dist-server/controllers/inbound/index.js.map +1 -1
  7. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +9 -3
  8. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/index.js +2 -5
  10. package/dist-server/controllers/index.js.map +1 -1
  11. package/dist-server/controllers/inspect/index.js +1 -5
  12. package/dist-server/controllers/inspect/index.js.map +1 -1
  13. package/dist-server/controllers/outbound/index.js +1 -5
  14. package/dist-server/controllers/outbound/index.js.map +1 -1
  15. package/dist-server/controllers/outbound/loading-worksheet-controller.js +47 -10
  16. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  17. package/dist-server/controllers/outbound/picking-worksheet-controller.js +142 -5
  18. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  19. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +116 -20
  20. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  21. package/dist-server/controllers/render-fm-grn.js +229 -0
  22. package/dist-server/controllers/render-fm-grn.js.map +1 -0
  23. package/dist-server/controllers/render-grn.js +18 -18
  24. package/dist-server/controllers/vas/index.js +1 -5
  25. package/dist-server/controllers/vas/index.js.map +1 -1
  26. package/dist-server/graphql/index.js +1 -5
  27. package/dist-server/graphql/index.js.map +1 -1
  28. package/dist-server/graphql/resolvers/index.js +1 -5
  29. package/dist-server/graphql/resolvers/index.js.map +1 -1
  30. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js +14 -1
  31. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js.map +1 -1
  32. package/dist-server/graphql/resolvers/worksheet/loading/loading.js +3 -10
  33. package/dist-server/graphql/resolvers/worksheet/loading/loading.js.map +1 -1
  34. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +55 -21
  35. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +1 -0
  37. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +1 -1
  39. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  40. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +8 -6
  41. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  43. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet/picking/picking.js +4 -4
  45. package/dist-server/graphql/resolvers/worksheet/picking/picking.js.map +1 -1
  46. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js +4 -4
  47. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js.map +1 -1
  48. package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js +15 -0
  49. package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js.map +1 -0
  50. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +10 -1
  51. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  52. package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js +11 -6
  53. package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js.map +1 -1
  54. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  55. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  56. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  57. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  58. package/dist-server/graphql/resolvers/worksheet/vas-transactions/index.js +1 -5
  59. package/dist-server/graphql/resolvers/worksheet/vas-transactions/index.js.map +1 -1
  60. package/dist-server/graphql/resolvers/worksheet/vas-transactions/interfaces/index.js +1 -5
  61. package/dist-server/graphql/resolvers/worksheet/vas-transactions/interfaces/index.js.map +1 -1
  62. package/dist-server/graphql/resolvers/worksheet/vas-transactions/relabeling/index.js +1 -5
  63. package/dist-server/graphql/resolvers/worksheet/vas-transactions/relabeling/index.js.map +1 -1
  64. package/dist-server/graphql/resolvers/worksheet/vas-transactions/repackaging/index.js +1 -5
  65. package/dist-server/graphql/resolvers/worksheet/vas-transactions/repackaging/index.js.map +1 -1
  66. package/dist-server/graphql/resolvers/worksheet/vas-transactions/repalletizing/index.js +1 -5
  67. package/dist-server/graphql/resolvers/worksheet/vas-transactions/repalletizing/index.js.map +1 -1
  68. package/dist-server/graphql/resolvers/worksheet/vas-transactions/unpacking/index.js +1 -5
  69. package/dist-server/graphql/resolvers/worksheet/vas-transactions/unpacking/index.js.map +1 -1
  70. package/dist-server/graphql/resolvers/worksheet/worksheet.js +2 -0
  71. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  72. package/dist-server/graphql/resolvers/worksheet/worksheets.js +17 -2
  73. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  74. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +5 -3
  75. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  76. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js +15 -4
  77. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js.map +1 -1
  78. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -1
  79. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  80. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js +6 -2
  81. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js.map +1 -1
  82. package/dist-server/graphql/types/index.js +1 -5
  83. package/dist-server/graphql/types/index.js.map +1 -1
  84. package/dist-server/graphql/types/worksheet/index.js +10 -0
  85. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  86. package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js +1 -0
  87. package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js.map +1 -1
  88. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +2 -0
  89. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  90. package/dist-server/graphql/types/worksheet/worksheet-info.js +2 -0
  91. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  92. package/dist-server/graphql/types/worksheet/worksheet.js +1 -0
  93. package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
  94. package/dist-server/index.js +1 -5
  95. package/dist-server/index.js.map +1 -1
  96. package/dist-server/routes.js +4 -0
  97. package/dist-server/routes.js.map +1 -1
  98. package/dist-server/utils/index.js +1 -5
  99. package/dist-server/utils/index.js.map +1 -1
  100. package/package.json +17 -17
  101. package/server/controllers/inbound/unloading-worksheet-controller.ts +14 -3
  102. package/server/controllers/index.ts +1 -0
  103. package/server/controllers/outbound/loading-worksheet-controller.ts +83 -17
  104. package/server/controllers/outbound/picking-worksheet-controller.ts +178 -7
  105. package/server/controllers/outbound/sorting-worksheet-controller.ts +167 -27
  106. package/server/controllers/render-fm-grn.ts +266 -0
  107. package/server/controllers/render-grn.ts +18 -18
  108. package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +14 -0
  109. package/server/graphql/resolvers/worksheet/loading/loading.ts +5 -12
  110. package/server/graphql/resolvers/worksheet/loading-worksheet.ts +66 -13
  111. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +1 -1
  112. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +1 -1
  113. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +13 -11
  114. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  115. package/server/graphql/resolvers/worksheet/picking/picking.ts +30 -4
  116. package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
  117. package/server/graphql/resolvers/worksheet/picking/seal-tote.ts +25 -0
  118. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +13 -2
  119. package/server/graphql/resolvers/worksheet/sorting/complete-order-sorting.ts +13 -9
  120. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  121. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  122. package/server/graphql/resolvers/worksheet/worksheet.ts +2 -0
  123. package/server/graphql/resolvers/worksheet/worksheets.ts +26 -2
  124. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +12 -3
  125. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.ts +22 -7
  126. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +6 -2
  127. package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +7 -1
  128. package/server/graphql/types/worksheet/index.ts +10 -0
  129. package/server/graphql/types/worksheet/loaded-worksheet-detail.ts +1 -0
  130. package/server/graphql/types/worksheet/worksheet-detail-info.ts +2 -0
  131. package/server/graphql/types/worksheet/worksheet-info.ts +2 -0
  132. package/server/graphql/types/worksheet/worksheet.ts +1 -0
  133. package/server/routes.ts +5 -0
@@ -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
  }
@@ -1,3 +1,5 @@
1
+ import { IsNull, In } from 'typeorm'
2
+
1
3
  import { VasWorksheetController } from '../vas/vas-worksheet-controller'
2
4
  import { Product, ProductDetail } from '@things-factory/product-base'
3
5
  import {
@@ -6,11 +8,22 @@ import {
6
8
  InventoryItem,
7
9
  INVENTORY_STATUS,
8
10
  InventoryNoGenerator,
9
- INVENTORY_ITEM_SOURCE
11
+ INVENTORY_ITEM_SOURCE,
12
+ Tote,
13
+ TOTE_STATUS
10
14
  } from '@things-factory/warehouse-base'
11
- import { ReleaseGood, OrderInventory, ORDER_INVENTORY_STATUS, ORDER_STATUS } from '@things-factory/sales-base'
15
+ import {
16
+ ReleaseGood,
17
+ OrderInventory,
18
+ ORDER_INVENTORY_STATUS,
19
+ ORDER_STATUS,
20
+ OrderTote,
21
+ OrderToteItem,
22
+ OrderNoGenerator
23
+ } from '@things-factory/sales-base'
12
24
  import { Worksheet, WorksheetDetail } from '../../entities'
13
25
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
26
+ import { temporaryGetRemainInventoryAmount } from 'server/graphql/resolvers/worksheet/vas-transactions/common-utils'
14
27
 
15
28
  export class SortingWorksheetController extends VasWorksheetController {
16
29
  async generateSortingWorksheet(
@@ -62,7 +75,8 @@ export class SortingWorksheetController extends VasWorksheetController {
62
75
  taskNo: string,
63
76
  releaseGoodNo: string,
64
77
  productBarcode: string,
65
- serialNumber: string
78
+ serialNumber: string,
79
+ toteNo: string
66
80
  ): Promise<void> {
67
81
  const worksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
68
82
  where: {
@@ -75,6 +89,8 @@ export class SortingWorksheetController extends VasWorksheetController {
75
89
  'worksheetDetails',
76
90
  'worksheetDetails.targetInventory',
77
91
  'worksheetDetails.targetInventory.product',
92
+ 'worksheetDetails.targetInventory.orderProduct',
93
+ 'worksheetDetails.targetInventory.bizplace',
78
94
  'worksheetDetails.targetInventory.inventory',
79
95
  'worksheetDetails.targetInventory.inventory.product',
80
96
  'worksheetDetails.targetInventory.inventory.product.productDetails',
@@ -204,6 +220,17 @@ export class SortingWorksheetController extends VasWorksheetController {
204
220
  } else {
205
221
  await this.updateOrderTargets([matchingOI])
206
222
  }
223
+
224
+ if (toteNo) {
225
+ await this.toteScanning(
226
+ toteNo,
227
+ matchingOI.orderProduct,
228
+ matchingOI,
229
+ 1,
230
+ releaseGood,
231
+ matchingOI.bizplace
232
+ )
233
+ }
207
234
  }
208
235
  })
209
236
  )
@@ -216,7 +243,8 @@ export class SortingWorksheetController extends VasWorksheetController {
216
243
  releaseGoodNo: string,
217
244
  productId: string,
218
245
  sortingQty: number,
219
- serialNumber: string
246
+ serialNumber: string,
247
+ toteNo: string
220
248
  ): Promise<void> {
221
249
  const worksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
222
250
  where: {
@@ -229,6 +257,8 @@ export class SortingWorksheetController extends VasWorksheetController {
229
257
  'worksheetDetails',
230
258
  'worksheetDetails.targetInventory',
231
259
  'worksheetDetails.targetInventory.product',
260
+ 'worksheetDetails.targetInventory.orderProduct',
261
+ 'worksheetDetails.targetInventory.bizplace',
232
262
  'worksheetDetails.targetInventory.inventory',
233
263
  'worksheetDetails.targetInventory.inventory.product',
234
264
  'worksheetDetails.targetInventory.inventory.product.productDetails',
@@ -294,6 +324,17 @@ export class SortingWorksheetController extends VasWorksheetController {
294
324
  }
295
325
  }
296
326
 
327
+ if (toteNo) {
328
+ await this.toteScanning(
329
+ toteNo,
330
+ matchingOI.orderProduct,
331
+ matchingOI,
332
+ sortingQty,
333
+ releaseGood,
334
+ matchingOI.bizplace
335
+ )
336
+ }
337
+
297
338
  if (releaseQty != matchingOI?.sortedQty && sortingQty != 0) {
298
339
  if (product?.isRequireSerialNumberScanningOutbound) {
299
340
  matchingOI.sortedQty += sortingQty
@@ -338,34 +379,50 @@ export class SortingWorksheetController extends VasWorksheetController {
338
379
  }
339
380
 
340
381
  async completeOrderSorting(releaseGoodNo: string): Promise<ReleaseGood> {
341
- let releaseGood: ReleaseGood = await this.findRefOrder(
342
- ReleaseGood,
343
- {
344
- domain: this.domain,
345
- name: releaseGoodNo,
346
- status: ORDER_STATUS.SORTING
347
- },
348
- ['bizplace', 'orderInventories']
349
- )
382
+ try {
383
+ let releaseGood: ReleaseGood = await this.findRefOrder(
384
+ ReleaseGood,
385
+ {
386
+ domain: this.domain,
387
+ name: releaseGoodNo,
388
+ status: ORDER_STATUS.SORTING
389
+ },
390
+ ['bizplace', 'orderInventories']
391
+ )
350
392
 
351
- releaseGood.status = ORDER_STATUS.READY_TO_LOAD
352
- releaseGood.updater = this.user
353
- await this.trxMgr.getRepository(ReleaseGood).save(releaseGood)
393
+ if (!releaseGood) {
394
+ throw new Error('Order is already sorted')
395
+ }
354
396
 
355
- let inventoryItems: InventoryItem = await this.trxMgr
356
- .getRepository(InventoryItem)
357
- .find({ where: { outboundOrderId: releaseGood.id } })
397
+ const foundNotSealedOrderTote = await this.trxMgr
398
+ .getRepository(OrderTote)
399
+ .findOne({ where: { releaseGood, closedDate: IsNull() } })
358
400
 
359
- if (inventoryItems.length > 0) {
360
- inventoryItems.forEach((itm: InventoryItem) => {
361
- itm.status = INVENTORY_STATUS.TERMINATED
362
- itm.updater = this.user
363
- })
401
+ if (foundNotSealedOrderTote) {
402
+ throw new Error('Please seal the tote(s) before proceeding')
403
+ }
364
404
 
365
- await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
366
- }
405
+ releaseGood.status = ORDER_STATUS.READY_TO_LOAD
406
+ releaseGood.updater = this.user
407
+ await this.trxMgr.getRepository(ReleaseGood).save(releaseGood)
408
+
409
+ let inventoryItems: InventoryItem = await this.trxMgr
410
+ .getRepository(InventoryItem)
411
+ .find({ where: { outboundOrderId: releaseGood.id } })
412
+
413
+ if (inventoryItems.length > 0) {
414
+ inventoryItems.forEach((itm: InventoryItem) => {
415
+ itm.status = INVENTORY_STATUS.TERMINATED
416
+ itm.updater = this.user
417
+ })
418
+
419
+ await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
420
+ }
367
421
 
368
- return releaseGood
422
+ return releaseGood
423
+ } catch (e) {
424
+ throw e
425
+ }
369
426
  }
370
427
 
371
428
  async completeWorksheetSorting(taskNo: string): Promise<Worksheet> {
@@ -383,6 +440,16 @@ export class SortingWorksheetController extends VasWorksheetController {
383
440
  ]
384
441
  })
385
442
 
443
+ let releaseGoodIds = worksheet.worksheetDetails.map(itm => itm.targetInventory.releaseGood.id)
444
+
445
+ const foundNotSealedOrderTote = await this.trxMgr
446
+ .getRepository(OrderTote)
447
+ .findOne({ where: { releaseGood: In(releaseGoodIds), closedDate: IsNull() } })
448
+
449
+ if (foundNotSealedOrderTote) {
450
+ throw new Error('Please seal the tote(s) before proceeding')
451
+ }
452
+
386
453
  this.checkRecordValidity(worksheet, { status: WORKSHEET_STATUS.EXECUTING })
387
454
 
388
455
  const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
@@ -398,4 +465,77 @@ export class SortingWorksheetController extends VasWorksheetController {
398
465
 
399
466
  return worksheet
400
467
  }
468
+
469
+ private async toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace) {
470
+ //1. find tote
471
+ let foundTote: Tote = await this.trxMgr
472
+ .getRepository(Tote)
473
+ .findOne({ where: { bizplace, name: toteNo, deletedAt: IsNull() } })
474
+
475
+ if (foundTote?.status == TOTE_STATUS.DAMAGED) {
476
+ throw new Error('Tote is damaged')
477
+ }
478
+
479
+ if (foundTote?.status == TOTE_STATUS.DISPATCHED) {
480
+ throw new Error('Tote is dispatched')
481
+ }
482
+
483
+ //2. find order tote
484
+ let foundOrderTote: OrderTote = await this.trxMgr
485
+ .getRepository(OrderTote)
486
+ .findOne({ where: { domain: this.domain, name: toteNo, releaseGood } })
487
+
488
+ //if order tote not found the create one, if tote not found means it's tote box
489
+ //create order tote item
490
+ if (!foundOrderTote) {
491
+ const orderTote = await this.trxMgr.getRepository(OrderTote).save({
492
+ name: toteNo,
493
+ domain: this.domain,
494
+ releaseGood,
495
+ tote: foundTote ? foundTote : null,
496
+ updater: this.user
497
+ })
498
+
499
+ const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
500
+ domain: this.domain,
501
+ name: OrderNoGenerator.orderToteItem(),
502
+ orderProduct: targetProduct,
503
+ orderInventory: targetInventory,
504
+ orderTote,
505
+ qty: pickedQty,
506
+ updater: this.user
507
+ })
508
+ } else {
509
+ if (foundOrderTote.closedDate) {
510
+ throw new Error('Tote has been sealed, please try another tote!')
511
+ }
512
+
513
+ //if found order tote then check if order tote item exist
514
+ const foundOrderToteItem: OrderToteItem = await this.trxMgr.getRepository(OrderToteItem).findOne({
515
+ domain: this.domain,
516
+ orderProduct: targetProduct,
517
+ orderInventory: targetInventory,
518
+ orderTote: foundOrderTote
519
+ })
520
+
521
+ //if not order tote item doesnt exist then create one
522
+ if (!foundOrderToteItem) {
523
+ const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
524
+ domain: this.domain,
525
+ name: OrderNoGenerator.orderToteItem(),
526
+ orderProduct: targetProduct,
527
+ orderInventory: targetInventory,
528
+ orderTote: foundOrderTote,
529
+ qty: pickedQty,
530
+ updater: this.user
531
+ })
532
+ } else {
533
+ //if found order tote item found then add the quantity
534
+ const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
535
+ ...foundOrderToteItem,
536
+ qty: foundOrderToteItem.qty + pickedQty
537
+ })
538
+ }
539
+ }
540
+ }
401
541
  }