@things-factory/worksheet-base 5.0.0-alpha.4 → 5.0.0-alpha.40

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 (160) hide show
  1. package/dist-server/constants/template.js +1 -0
  2. package/dist-server/constants/template.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +9 -3
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +309 -4
  6. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/index.js +2 -0
  8. package/dist-server/controllers/index.js.map +1 -1
  9. package/dist-server/controllers/outbound/loading-worksheet-controller.js +10 -0
  10. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/packing-worksheet-controller.js +172 -7
  12. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/outbound/picking-worksheet-controller.js +352 -11
  14. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  15. package/dist-server/controllers/outbound/returning-worksheet-controller.js +11 -1
  16. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  17. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
  18. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  19. package/dist-server/controllers/render-fm-grn.js +229 -0
  20. package/dist-server/controllers/render-fm-grn.js.map +1 -0
  21. package/dist-server/controllers/render-grn.js +45 -21
  22. package/dist-server/controllers/render-grn.js.map +1 -1
  23. package/dist-server/controllers/render-invoices.js +103 -65
  24. package/dist-server/controllers/render-invoices.js.map +1 -1
  25. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  26. package/dist-server/controllers/render-orientage-grn.js +1 -0
  27. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  28. package/dist-server/controllers/render-po.js +147 -0
  29. package/dist-server/controllers/render-po.js.map +1 -0
  30. package/dist-server/controllers/render-ro-do.js +65 -1
  31. package/dist-server/controllers/render-ro-do.js.map +1 -1
  32. package/dist-server/controllers/worksheet-controller.js +15 -0
  33. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  34. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +10 -3
  35. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
  37. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js +27 -23
  39. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js.map +1 -1
  40. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
  41. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +26 -2
  43. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
  45. package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
  46. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
  47. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  48. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
  49. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  50. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
  51. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
  52. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -132
  53. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  54. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
  55. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  56. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +6 -19
  57. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  58. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  59. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  60. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +49 -58
  61. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  62. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
  63. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
  64. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  65. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  66. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  67. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  68. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
  69. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
  70. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
  71. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  72. package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
  73. package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
  74. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
  75. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
  76. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
  77. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
  78. package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
  79. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
  80. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
  81. package/dist-server/graphql/resolvers/worksheet/worksheets.js +18 -0
  82. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  83. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
  84. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  85. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
  86. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  87. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
  88. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
  89. package/dist-server/graphql/types/worksheet/index.js +33 -6
  90. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  91. package/dist-server/graphql/types/worksheet/picking-assignment-status.js +2 -2
  92. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +3 -0
  93. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  94. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  95. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  96. package/dist-server/graphql/types/worksheet/worksheet-patch.js +1 -0
  97. package/dist-server/graphql/types/worksheet/worksheet-patch.js.map +1 -1
  98. package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
  99. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  100. package/dist-server/index.js +5 -0
  101. package/dist-server/index.js.map +1 -1
  102. package/dist-server/routes.js +12 -0
  103. package/dist-server/routes.js.map +1 -1
  104. package/dist-server/utils/inventory-util.js +14 -25
  105. package/dist-server/utils/inventory-util.js.map +1 -1
  106. package/package.json +17 -17
  107. package/server/constants/template.ts +1 -0
  108. package/server/controllers/ecommerce/sellercraft-controller.ts +10 -3
  109. package/server/controllers/inbound/unloading-worksheet-controller.ts +376 -8
  110. package/server/controllers/index.ts +3 -0
  111. package/server/controllers/outbound/loading-worksheet-controller.ts +13 -0
  112. package/server/controllers/outbound/packing-worksheet-controller.ts +224 -9
  113. package/server/controllers/outbound/picking-worksheet-controller.ts +465 -16
  114. package/server/controllers/outbound/returning-worksheet-controller.ts +12 -1
  115. package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
  116. package/server/controllers/render-fm-grn.ts +266 -0
  117. package/server/controllers/render-grn.ts +57 -23
  118. package/server/controllers/render-invoices.ts +119 -72
  119. package/server/controllers/render-orientage-do.ts +11 -11
  120. package/server/controllers/render-orientage-grn.ts +12 -11
  121. package/server/controllers/render-po.ts +170 -0
  122. package/server/controllers/render-ro-do.ts +93 -8
  123. package/server/controllers/worksheet-controller.ts +18 -2
  124. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +13 -4
  125. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
  126. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +35 -25
  127. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
  128. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +41 -8
  129. package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
  130. package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
  131. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
  132. package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
  133. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +167 -145
  134. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
  135. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +5 -20
  136. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  137. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +62 -61
  138. package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
  139. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  140. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  141. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
  142. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
  143. package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
  144. package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
  145. package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
  146. package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
  147. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
  148. package/server/graphql/resolvers/worksheet/worksheets.ts +26 -0
  149. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
  150. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
  151. package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
  152. package/server/graphql/types/worksheet/index.ts +33 -6
  153. package/server/graphql/types/worksheet/picking-assignment-status.ts +2 -2
  154. package/server/graphql/types/worksheet/worksheet-detail-info.ts +3 -0
  155. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  156. package/server/graphql/types/worksheet/worksheet-patch.ts +1 -0
  157. package/server/graphql/types/worksheet-detail/index.ts +0 -2
  158. package/server/index.ts +5 -0
  159. package/server/routes.ts +17 -0
  160. package/server/utils/inventory-util.ts +15 -23
@@ -1,4 +1,4 @@
1
- import { In } from 'typeorm'
1
+ import { Equal, In, Not } from 'typeorm'
2
2
 
3
3
  import { Bizplace } from '@things-factory/biz-base'
4
4
  import { generateId } from '@things-factory/id-rule-base'
@@ -14,8 +14,11 @@ import {
14
14
  import { Setting } from '@things-factory/setting-base'
15
15
  import {
16
16
  Inventory,
17
+ INVENTORY_ITEM_SOURCE,
17
18
  INVENTORY_STATUS,
18
19
  INVENTORY_TRANSACTION_TYPE,
20
+ InventoryItem,
21
+ InventoryNoGenerator,
19
22
  Location,
20
23
  LOCATION_TYPE
21
24
  } from '@things-factory/warehouse-base'
@@ -443,26 +446,69 @@ export class PickingWorksheetController extends VasWorksheetController {
443
446
  detail.product?.id === product.id
444
447
  )
445
448
 
446
- if (!foundProductDetail) {
449
+ if (!foundProductDetail && !product?.isRequireSerialNumberScanningOutbound) {
447
450
  const roProductDetail: ProductDetail = productDetails.find(
448
451
  (parentDetail: ProductDetail) =>
449
452
  parentDetail.packingType === packingType && parentDetail.packingSize == packingSize
450
453
  )
451
454
 
452
455
  pickedQty = await this.getChildQty(productDetails, productBarcode, roProductDetail)
453
- if (pickedQty > releaseQty) {
456
+ if (pickedQty + targetInventory.pickedQty > releaseQty) {
454
457
  throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
455
458
  }
459
+ } else if (!foundProductDetail) {
460
+ throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
456
461
  }
457
462
 
458
- if (product?.isRequireSerialNumberScanning) {
459
- if (!serialNumber || serialNumber == '')
463
+ if (product?.isRequireSerialNumberScanningOutbound) {
464
+ if (!serialNumber || serialNumber == '') {
460
465
  throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `require serial number`))
466
+ }
461
467
 
462
- if (serialNumber) {
463
- targetInventory.serialNumber = JSON.stringify(
464
- targetInventory.serialNumber ? [...JSON.parse(targetInventory.serialNumber), serialNumber] : [serialNumber]
465
- )
468
+ let totalInventoryItems = await this.trxMgr.getRepository(InventoryItem).count({
469
+ where: {
470
+ inventory,
471
+ status: Not(In([INVENTORY_STATUS.TERMINATED, INVENTORY_STATUS.PICKED]))
472
+ }
473
+ })
474
+
475
+ let foundSerialNumber: InventoryItem = await this.trxMgr
476
+ .getRepository(InventoryItem)
477
+ .findOne({ where: { domain: this.domain, serialNumber: serialNumber, product } })
478
+
479
+ if (foundSerialNumber) {
480
+ if (foundSerialNumber.inventoryId !== inventory.id) {
481
+ throw new Error('Serial Number scanned is in another inventory')
482
+ }
483
+
484
+ if (foundSerialNumber.outboundOrderId) {
485
+ let releaseGood: ReleaseGood = await this.trxMgr
486
+ .getRepository(ReleaseGood)
487
+ .findOne({ where: { id: foundSerialNumber.outboundOrderId } })
488
+ throw new Error(`Inventory Item is already picked in ${releaseGood.name}`)
489
+ }
490
+
491
+ foundSerialNumber.status = INVENTORY_STATUS.PICKING
492
+ foundSerialNumber.updater = this.user
493
+ foundSerialNumber.outboundOrderId = releaseGood.id
494
+
495
+ await this.trxMgr.getRepository(InventoryItem).save(foundSerialNumber)
496
+ } else {
497
+ if (totalInventoryItems >= inventory.qty) {
498
+ throw new Error('Insufficient inventory quantity to scan new serial number')
499
+ }
500
+
501
+ let inventoryItem: InventoryItem = new InventoryItem()
502
+ inventoryItem.name = InventoryNoGenerator.inventoryItemName()
503
+ inventoryItem.serialNumber = serialNumber
504
+ inventoryItem.status = INVENTORY_STATUS.PICKING
505
+ inventoryItem.outboundOrderId = releaseGood.id
506
+ inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
507
+ inventoryItem.product = product
508
+ inventoryItem.inventory = inventory
509
+ inventoryItem.domain = this.domain
510
+
511
+ await this.trxMgr.getRepository(InventoryItem).save(inventoryItem)
466
512
  }
467
513
  }
468
514
 
@@ -509,17 +555,95 @@ export class PickingWorksheetController extends VasWorksheetController {
509
555
  //validation to prevent over release
510
556
  if (inventory.qty <= 0) throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
511
557
 
512
- if (inventory.palletId !== palletId)
558
+ if (inventory.palletId !== palletId && !product?.isRequireSerialNumberScanningOutbound)
513
559
  throw new Error(this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('Pallet ID', palletId, inventory.palletId))
514
560
 
515
- if (product?.isRequireSerialNumberScanning) {
516
- if (!serialNumber || serialNumber == '')
561
+ if (product?.isRequireSerialNumberScanningOutbound) {
562
+ if (!serialNumber || serialNumber == '') {
517
563
  throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `require serial number`))
564
+ }
518
565
 
519
- if (serialNumber) {
520
- targetInventory.serialNumber = JSON.stringify(
521
- targetInventory.serialNumber ? [...JSON.parse(targetInventory.serialNumber), serialNumber] : [serialNumber]
522
- )
566
+ let totalInventoryItems = await this.trxMgr.getRepository(InventoryItem).count({
567
+ where: {
568
+ inventory,
569
+ status: Not(In([INVENTORY_STATUS.TERMINATED, INVENTORY_STATUS.PICKED]))
570
+ }
571
+ })
572
+
573
+ let foundSerialNumber: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
574
+ where: { domain: this.domain, serialNumber: serialNumber, product },
575
+ relations: ['product', 'inventory']
576
+ })
577
+
578
+ let scannedPalletIdInventory: Inventory = await this.trxMgr
579
+ .getRepository(Inventory)
580
+ .findOne({ where: { domain: this.domain, palletId }, relations: ['product'] })
581
+
582
+ if (foundSerialNumber) {
583
+ if (foundSerialNumber.outboundOrderId) {
584
+ let releaseGood: ReleaseGood = await this.trxMgr
585
+ .getRepository(ReleaseGood)
586
+ .findOne({ where: { id: foundSerialNumber.outboundOrderId } })
587
+ throw new Error(`Inventory Item is already picked in ${releaseGood.name}`)
588
+ }
589
+
590
+ foundSerialNumber.status = INVENTORY_STATUS.PICKING
591
+ foundSerialNumber.updater = this.user
592
+ foundSerialNumber.outboundOrderId = releaseGood.id
593
+
594
+ await this.trxMgr.getRepository(InventoryItem).save(foundSerialNumber)
595
+ } else {
596
+ if (totalInventoryItems >= inventory.qty) {
597
+ throw new Error('Insufficient inventory quantity to scan new serial number')
598
+ }
599
+
600
+ let inventoryItem: InventoryItem = new InventoryItem()
601
+ inventoryItem.name = InventoryNoGenerator.inventoryItemName()
602
+ inventoryItem.serialNumber = serialNumber
603
+ inventoryItem.status = INVENTORY_STATUS.PICKING
604
+ inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
605
+ inventoryItem.outboundOrderId = releaseGood.id
606
+ inventoryItem.product = product
607
+ inventoryItem.inventory = scannedPalletIdInventory
608
+ inventoryItem.domain = this.domain
609
+
610
+ foundSerialNumber = await this.trxMgr.getRepository(InventoryItem).save(inventoryItem)
611
+ }
612
+
613
+ if (inventory.palletId !== palletId) {
614
+ let existingOrderInv = await this.trxMgr.getRepository(OrderInventory).findOne({
615
+ where: {
616
+ domain: this.domain,
617
+ inventory: scannedPalletIdInventory,
618
+ releaseGood: releaseGood
619
+ }
620
+ })
621
+
622
+ if (existingOrderInv) {
623
+ //if replacement order inventory already existed in worksheet detail
624
+ await this.serialNumberReplacementForExistingOrderInv(
625
+ existingOrderInv,
626
+ targetInventory,
627
+ worksheetDetail,
628
+ foundSerialNumber
629
+ )
630
+ } else if (
631
+ scannedPalletIdInventory.batchId == inventory.batchId &&
632
+ scannedPalletIdInventory.product.id == product.id &&
633
+ scannedPalletIdInventory.product.packingType == product.packingType
634
+ ) {
635
+ //if replacement order inventory does not exist
636
+ await this.serialNumberReplacement(
637
+ targetInventory,
638
+ scannedPalletIdInventory,
639
+ releaseGood,
640
+ product,
641
+ worksheetDetail,
642
+ foundSerialNumber
643
+ )
644
+ } else {
645
+ throw new Error(this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('Pallet ID', palletId, inventory.palletId))
646
+ }
523
647
  }
524
648
  }
525
649
 
@@ -829,6 +953,28 @@ export class PickingWorksheetController extends VasWorksheetController {
829
953
  ])
830
954
  await this.checkRecordValidity(worksheet, { status: WORKSHEET_STATUS.EXECUTING })
831
955
 
956
+ let inventoryItems: InventoryItem = await this.trxMgr
957
+ .getRepository(InventoryItem)
958
+ .find({ where: { outboundOrderId: releaseGood.id } })
959
+
960
+ if (inventoryItems.length > 0) {
961
+ inventoryItems.forEach((itm: InventoryItem) => {
962
+ itm.status = INVENTORY_STATUS.TERMINATED
963
+ itm.updater = this.user
964
+ })
965
+
966
+ // let inventoryLists = InventoryItems.filter(
967
+ // (value, index, self) => index === self.findIndex(itm => itm.inventory.id === value.inventory.id)
968
+ // )
969
+
970
+ // inventoryLists.forEach((itm: Inventory) => {
971
+ // if (itm.inventory.qty - itm.releaseQty == 0)
972
+ // this.transactionInventory(itm, releaseGood, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
973
+ // })
974
+
975
+ await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
976
+ }
977
+
832
978
  let orderStatus: string
833
979
  if (releaseGood?.packingOption) {
834
980
  orderStatus = ORDER_STATUS.READY_TO_PACK
@@ -979,6 +1125,19 @@ export class PickingWorksheetController extends VasWorksheetController {
979
1125
  worksheetDetail.updater = this.user
980
1126
  await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetail)
981
1127
 
1128
+ let inventoryItems: InventoryItem = await this.trxMgr
1129
+ .getRepository(InventoryItem)
1130
+ .find({ where: { outboundOrderId: releaseGood.id } })
1131
+
1132
+ if (inventoryItems.length > 0) {
1133
+ inventoryItems.forEach((itm: InventoryItem) => {
1134
+ itm.status = INVENTORY_STATUS.PICKED
1135
+ itm.updater = this.user
1136
+ })
1137
+
1138
+ await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
1139
+ }
1140
+
982
1141
  if (leftQty === 0) {
983
1142
  inventory.status = INVENTORY_STATUS.TERMINATED
984
1143
  await this.transactionInventory(inventory, releaseGood, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
@@ -989,4 +1148,294 @@ export class PickingWorksheetController extends VasWorksheetController {
989
1148
 
990
1149
  return orderInventory
991
1150
  }
1151
+
1152
+ private async serialNumberReplacementForExistingOrderInv(
1153
+ existingOrderInv,
1154
+ targetInventory,
1155
+ worksheetDetail,
1156
+ foundSerialNumber
1157
+ ) {
1158
+ try {
1159
+ //1. update replacement inventory, order inventory, old inventory, old order inventory quantity
1160
+ let newInventory: Inventory = await this.trxMgr
1161
+ .getRepository(Inventory)
1162
+ .findOne({ where: { domain: this.domain, id: existingOrderInv?.inventoryId } })
1163
+
1164
+ let newOrderInventory: OrderInventory = await this.trxMgr
1165
+ .getRepository(OrderInventory)
1166
+ .findOne({ where: { domain: this.domain, id: existingOrderInv?.id } })
1167
+
1168
+ let oldInventory: Inventory = await this.trxMgr
1169
+ .getRepository(Inventory)
1170
+ .findOne({ where: { domain: this.domain, id: targetInventory?.inventory.id } })
1171
+
1172
+ let oldOrderInventory: OrderInventory = await this.trxMgr
1173
+ .getRepository(OrderInventory)
1174
+ .findOne({ where: { domain: this.domain, id: targetInventory?.id } })
1175
+
1176
+ //if replacement inventory quantity insufficient
1177
+ if (newInventory.qty - newInventory.lockedQty < targetInventory.releaseQty - targetInventory.pickedQty) {
1178
+ newOrderInventory.releaseQty += newInventory.qty - newInventory.lockedQty
1179
+ newOrderInventory.releaseUomValue += newInventory.uomValue - newInventory.lockedUomValue
1180
+
1181
+ oldOrderInventory.releaseQty -= newOrderInventory.releaseQty
1182
+ oldOrderInventory.releaseUomValue -= newOrderInventory.releaseUomValue
1183
+
1184
+ oldInventory.lockedQty -= newOrderInventory.releaseQty
1185
+ oldInventory.lockedUomValue -= newOrderInventory.releaseUomValue
1186
+
1187
+ newInventory.lockedQty = newInventory.qty
1188
+ newInventory.lockedUomValue = newInventory.uomValue
1189
+ } else {
1190
+ newOrderInventory.releaseQty += targetInventory.releaseQty - targetInventory.pickedQty
1191
+ newOrderInventory.releaseUomValue +=
1192
+ newOrderInventory.releaseQty * (targetInventory.releaseUomValue / targetInventory.releaseQty)
1193
+
1194
+ oldOrderInventory.releaseQty = targetInventory.pickedQty
1195
+ oldOrderInventory.status = ORDER_INVENTORY_STATUS.PICKED
1196
+ oldOrderInventory.releaseUomValue =
1197
+ (targetInventory.releaseUomValue / targetInventory.releaseQty) * oldOrderInventory.releaseQty
1198
+
1199
+ oldInventory.lockedQty -= targetInventory.releaseQty - targetInventory.pickedQty
1200
+ oldInventory.lockedUomValue =
1201
+ oldInventory.lockedQty * (targetInventory.releaseUomValue / targetInventory.releaseQty)
1202
+
1203
+ newInventory.lockedQty = newInventory.lockedQty + (targetInventory.releaseQty - targetInventory.pickedQty)
1204
+ newInventory.lockedUomValue =
1205
+ (targetInventory.releaseUomValue / targetInventory.releaseQty) * newInventory.lockedQty
1206
+ }
1207
+
1208
+ newInventory = await this.trxMgr.getRepository(Inventory).save({ ...newInventory, updater: this.user })
1209
+
1210
+ newOrderInventory = await this.trxMgr.getRepository(OrderInventory).save({
1211
+ ...newOrderInventory,
1212
+ status: INVENTORY_STATUS.PICKING,
1213
+ pickedQty: existingOrderInv.pickedQty++,
1214
+ updater: this.user
1215
+ })
1216
+
1217
+ oldInventory = await this.trxMgr.getRepository(Inventory).save({ ...oldInventory, updater: this.user })
1218
+
1219
+ foundSerialNumber = await this.trxMgr
1220
+ .getRepository(InventoryItem)
1221
+ .save({ ...foundSerialNumber, inventory: newInventory })
1222
+
1223
+ //2. update replacement worksheet detail
1224
+ await this.trxMgr.getRepository(WorksheetDetail).update(
1225
+ {
1226
+ targetInventory: existingOrderInv
1227
+ },
1228
+ {
1229
+ status: WORKSHEET_STATUS.EXECUTING,
1230
+ updater: this.user
1231
+ }
1232
+ )
1233
+
1234
+ if (oldOrderInventory.releaseQty !== 0) {
1235
+ oldOrderInventory = await this.trxMgr
1236
+ .getRepository(OrderInventory)
1237
+ .save({ ...oldOrderInventory, updater: this.user })
1238
+
1239
+ await this.trxMgr.getRepository(WorksheetDetail).update(
1240
+ {
1241
+ name: worksheetDetail.name
1242
+ },
1243
+ {
1244
+ status: WORKSHEET_STATUS.DONE,
1245
+ updater: this.user
1246
+ }
1247
+ )
1248
+ } else {
1249
+ await this.trxMgr.getRepository(WorksheetDetail).delete(worksheetDetail.ild)
1250
+ await this.trxMgr.getRepository(OrderInventory).delete(targetInventory.id)
1251
+ }
1252
+ } catch (e) {}
1253
+ }
1254
+
1255
+ private async serialNumberReplacement(
1256
+ targetInventory,
1257
+ scannedPalletIdInventory,
1258
+ releaseGood,
1259
+ product,
1260
+ worksheetDetail,
1261
+ foundSerialNumber
1262
+ ) {
1263
+ try {
1264
+ //1. create new inventory, new order inventory, update old inventory, old order inventory quantity
1265
+ let newInventory: Inventory = await this.trxMgr
1266
+ .getRepository(Inventory)
1267
+ .findOne({ where: { id: scannedPalletIdInventory?.id } })
1268
+
1269
+ let oldInventory: Inventory = await this.trxMgr
1270
+ .getRepository(Inventory)
1271
+ .findOne({ where: { domain: this.domain, id: targetInventory?.inventory.id } })
1272
+
1273
+ let oldOrderInventory: OrderInventory = await this.trxMgr
1274
+ .getRepository(OrderInventory)
1275
+ .findOne({ where: { domain: this.domain, id: targetInventory?.id } })
1276
+
1277
+ let newOrderInventoryReleaseQty = 0
1278
+ let newOrderInventoryReleaseUomValue = 0
1279
+
1280
+ //if replacement inventory quantity insufficient
1281
+ if (newInventory.qty - newInventory.lockedQty < targetInventory.releaseQty - targetInventory.pickedQty) {
1282
+ newOrderInventoryReleaseQty = newInventory.qty - newInventory.lockedQty
1283
+ newOrderInventoryReleaseUomValue = newInventory.uomValue - newInventory.lockedUomValue
1284
+
1285
+ oldOrderInventory.releaseQty -= newOrderInventoryReleaseQty
1286
+ oldOrderInventory.releaseUomValue -= newOrderInventoryReleaseUomValue
1287
+
1288
+ oldInventory.lockedQty -= newOrderInventoryReleaseQty
1289
+ oldInventory.lockedUomValue -= newOrderInventoryReleaseUomValue
1290
+
1291
+ newInventory.lockedQty = newInventory.qty
1292
+ newInventory.lockedUomValue = newInventory.uomValue
1293
+ } else {
1294
+ newOrderInventoryReleaseQty = targetInventory.releaseQty - targetInventory.pickedQty
1295
+ newOrderInventoryReleaseUomValue =
1296
+ newOrderInventoryReleaseQty * (targetInventory.releaseUomValue / targetInventory.releaseQty)
1297
+
1298
+ oldOrderInventory.releaseQty = targetInventory.pickedQty
1299
+ oldOrderInventory.status = ORDER_INVENTORY_STATUS.PICKED
1300
+ oldOrderInventory.releaseUomValue =
1301
+ (targetInventory.releaseUomValue / targetInventory.releaseQty) * oldOrderInventory.releaseQty
1302
+
1303
+ oldInventory.lockedQty -= newOrderInventoryReleaseQty
1304
+ oldInventory.lockedUomValue -= newOrderInventoryReleaseUomValue
1305
+
1306
+ newInventory.lockedQty = newInventory.lockedQty + (targetInventory.releaseQty - targetInventory.pickedQty)
1307
+ newInventory.lockedUomValue =
1308
+ (targetInventory.releaseUomValue / targetInventory.releaseQty) * newInventory.lockedQty
1309
+ }
1310
+
1311
+ newInventory = await this.trxMgr.getRepository(Inventory).save({ ...newInventory, updater: this.user })
1312
+
1313
+ let newTargetInventory = (({ id, ...targetInventory }) => targetInventory)(targetInventory)
1314
+
1315
+ let newOrderInventory = await this.trxMgr.getRepository(OrderInventory).save({
1316
+ ...newTargetInventory,
1317
+ domain: this.domain,
1318
+ name: OrderNoGenerator.orderInventory(),
1319
+ releaseGood,
1320
+ releaseQty: newOrderInventoryReleaseQty,
1321
+ releaseUomValue: newOrderInventoryReleaseUomValue,
1322
+ pickedQty: 1,
1323
+ product,
1324
+ inventory: scannedPalletIdInventory,
1325
+ creator: this.user,
1326
+ updater: this.user
1327
+ })
1328
+
1329
+ oldInventory = await this.trxMgr.getRepository(Inventory).save({ ...oldInventory, updater: this.user })
1330
+
1331
+ foundSerialNumber = await this.trxMgr
1332
+ .getRepository(InventoryItem)
1333
+ .save({ ...foundSerialNumber, inventory: newInventory })
1334
+
1335
+ //3. create new worksheet detail
1336
+ let NewWorksheetDetail = (({ id, ...worksheetDetail }) => worksheetDetail)(worksheetDetail)
1337
+ await this.trxMgr.getRepository(WorksheetDetail).save({
1338
+ ...NewWorksheetDetail,
1339
+ domain: this.domain,
1340
+ name: WorksheetNoGenerator.pickingDetail(),
1341
+ targetInventory: newOrderInventory,
1342
+ status: WORKSHEET_STATUS.EXECUTING,
1343
+ creator: this.user,
1344
+ updater: this.user
1345
+ })
1346
+
1347
+ //if old order inventory release quantity is 0 then delete
1348
+ if (oldOrderInventory.releaseQty !== 0) {
1349
+ oldOrderInventory = await this.trxMgr
1350
+ .getRepository(OrderInventory)
1351
+ .save({ ...oldOrderInventory, updater: this.user })
1352
+
1353
+ //4. update old worksheet detail
1354
+ worksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).update(
1355
+ {
1356
+ name: worksheetDetail.name
1357
+ },
1358
+ {
1359
+ status: WORKSHEET_STATUS.DONE,
1360
+ updater: this.user
1361
+ }
1362
+ )
1363
+ } else {
1364
+ await this.trxMgr.getRepository(WorksheetDetail).delete(worksheetDetail.id)
1365
+ await this.trxMgr.getRepository(OrderInventory).delete(targetInventory.id)
1366
+ }
1367
+ } catch (e) {}
1368
+ }
1369
+
1370
+ async undoSerialNumberPicking(worksheetDetailName: string, inventoryItemId: string): Promise<void> {
1371
+ const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
1372
+ where: { name: worksheetDetailName, domain: this.domain, status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED)) },
1373
+ relations: [
1374
+ 'worksheet',
1375
+ 'worksheet.releaseGood',
1376
+ 'targetInventory',
1377
+ 'targetInventory.product',
1378
+ 'targetInventory.inventory'
1379
+ ]
1380
+ })
1381
+
1382
+ let targetInventory: OrderInventory = worksheetDetail.targetInventory
1383
+ let releaseGood: ReleaseGood = worksheetDetail.worksheet.releaseGood
1384
+
1385
+ if (
1386
+ targetInventory.releaseQty == targetInventory.pickedQty &&
1387
+ targetInventory.status == ORDER_INVENTORY_STATUS.PICKED
1388
+ ) {
1389
+ targetInventory.status = INVENTORY_STATUS.PICKING
1390
+
1391
+ await this.trxMgr
1392
+ .getRepository(WorksheetDetail)
1393
+ .update({ id: worksheetDetail.id }, { status: WORKSHEET_STATUS.EXECUTING })
1394
+
1395
+ targetInventory.inventory.qty += targetInventory.releaseQty
1396
+ targetInventory.inventory.uomValue =
1397
+ Math.round((targetInventory.inventory.uomValue + targetInventory.releaseUomValue) * 100) / 100
1398
+ targetInventory.inventory.lockedQty = targetInventory.inventory.lockedQty + targetInventory.releaseQty
1399
+ targetInventory.inventory.lockedUomValue =
1400
+ Math.round((targetInventory.inventory.lockedUomValue + targetInventory.releaseUomValue) * 100) / 100
1401
+
1402
+ await this.trxMgr.getRepository(Inventory).save(targetInventory.inventory)
1403
+ }
1404
+
1405
+ let InventoryItems: InventoryItem = await this.trxMgr
1406
+ .getRepository(InventoryItem)
1407
+ .find({ where: { outboundOrderId: releaseGood.id } })
1408
+
1409
+ let removeInventoryItem: InventoryItem = await this.trxMgr
1410
+ .getRepository(InventoryItem)
1411
+ .findOne({ where: { id: inventoryItemId } })
1412
+
1413
+ if (InventoryItems.length > 0) {
1414
+ InventoryItems.forEach((itm: InventoryItem) => {
1415
+ itm.status = INVENTORY_STATUS.PICKING
1416
+ itm.updater = this.user
1417
+ })
1418
+
1419
+ await this.trxMgr.getRepository(InventoryItem).save(InventoryItems)
1420
+ }
1421
+
1422
+ if (removeInventoryItem.source == INVENTORY_ITEM_SOURCE.OUTBOUND) {
1423
+ await this.trxMgr.getRepository(InventoryItem).delete(removeInventoryItem.id)
1424
+ } else {
1425
+ await this.trxMgr.getRepository(InventoryItem).update(
1426
+ {
1427
+ id: inventoryItemId
1428
+ },
1429
+ {
1430
+ status: INVENTORY_STATUS.STORED,
1431
+ outboundOrderId: null,
1432
+ updater: this.user
1433
+ }
1434
+ )
1435
+ }
1436
+
1437
+ targetInventory.pickedQty--
1438
+ targetInventory.updater = this.user
1439
+ await this.updateOrderTargets([targetInventory])
1440
+ }
992
1441
  }
@@ -124,6 +124,9 @@ export class ReturningWorksheetController extends VasWorksheetController {
124
124
  // update status of order inventory
125
125
  targetInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
126
126
  targetInventory.updater = this.user
127
+ targetInventory.returnToLocationQty = targetInventory.releaseQty
128
+ targetInventory.returnToLocationUomValue = targetInventory.releaseUomValue
129
+
127
130
  await this.updateOrderTargets([targetInventory])
128
131
 
129
132
  // update status of worksheet detail (EXECUTING => DONE)
@@ -164,7 +167,13 @@ export class ReturningWorksheetController extends VasWorksheetController {
164
167
  where: {
165
168
  domain: this.domain,
166
169
  name: toLocationName,
167
- type: In([LOCATION_TYPE.SHELF, LOCATION_TYPE.BUFFER, LOCATION_TYPE.FLOOR, LOCATION_TYPE.BIN])
170
+ type: In([
171
+ LOCATION_TYPE.SHELF,
172
+ LOCATION_TYPE.BUFFER,
173
+ LOCATION_TYPE.FLOOR,
174
+ LOCATION_TYPE.BIN,
175
+ LOCATION_TYPE.QUARANTINE
176
+ ])
168
177
  },
169
178
  relations: ['warehouse']
170
179
  })
@@ -189,6 +198,8 @@ export class ReturningWorksheetController extends VasWorksheetController {
189
198
 
190
199
  targetInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
191
200
  targetInventory.updater = this.user
201
+ targetInventory.returnToLocationQty = targetInventory.releaseQty
202
+ targetInventory.returnToLocationUomValue = targetInventory.releaseUomValue
192
203
  await this.updateOrderTargets([targetInventory])
193
204
 
194
205
  worksheetDetail.status = WORKSHEET_STATUS.DONE