@things-factory/worksheet-base 4.3.80-alpha.1 → 4.3.81

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 (94) hide show
  1. package/dist-server/controllers/ecommerce/sellercraft-controller.js +3 -0
  2. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  3. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +49 -49
  4. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/inspect/cycle-count-worksheet-controller.js +4 -2
  6. package/dist-server/controllers/inspect/cycle-count-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/loading-worksheet-controller.js +4 -10
  8. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/outbound/packing-worksheet-controller.js +20 -22
  10. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/picking-worksheet-controller.js +39 -34
  12. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +14 -12
  14. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  15. package/dist-server/controllers/vas/vas-worksheet-controller.js +2 -1
  16. package/dist-server/controllers/vas/vas-worksheet-controller.js.map +1 -1
  17. package/dist-server/controllers/worksheet-controller.js +3 -2
  18. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  19. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js +0 -6
  20. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js.map +1 -1
  21. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js +2 -1
  22. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js.map +1 -1
  23. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +6 -6
  24. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
  25. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +1 -2
  26. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  27. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +28 -67
  28. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  29. package/dist-server/graphql/resolvers/worksheet/packing/activate-packing.js +8 -23
  30. package/dist-server/graphql/resolvers/worksheet/packing/activate-packing.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js +7 -30
  32. package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +8 -23
  34. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  35. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +8 -25
  36. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +12 -59
  38. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  39. package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js +25 -51
  40. package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js.map +1 -1
  41. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +2 -2
  42. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  43. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +118 -262
  44. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  45. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +2 -3
  46. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  47. package/dist-server/graphql/resolvers/worksheet/proceed-extra-products.js +4 -6
  48. package/dist-server/graphql/resolvers/worksheet/proceed-extra-products.js.map +1 -1
  49. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js +14 -39
  50. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js.map +1 -1
  51. package/dist-server/graphql/resolvers/worksheet/transfer.js +9 -9
  52. package/dist-server/graphql/resolvers/worksheet/transfer.js.map +1 -1
  53. package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js +17 -17
  54. package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js.map +1 -1
  55. package/dist-server/graphql/resolvers/worksheet/worksheet.js +6 -4
  56. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  57. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js +4 -4
  58. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js.map +1 -1
  59. package/dist-server/graphql/types/worksheet-detail/index.js +0 -1
  60. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  61. package/dist-server/utils/inventory-util.js +98 -1
  62. package/dist-server/utils/inventory-util.js.map +1 -1
  63. package/package.json +17 -17
  64. package/server/controllers/ecommerce/sellercraft-controller.ts +3 -0
  65. package/server/controllers/inbound/unloading-worksheet-controller.ts +70 -49
  66. package/server/controllers/inspect/cycle-count-worksheet-controller.ts +4 -2
  67. package/server/controllers/outbound/loading-worksheet-controller.ts +3 -9
  68. package/server/controllers/outbound/packing-worksheet-controller.ts +31 -23
  69. package/server/controllers/outbound/picking-worksheet-controller.ts +51 -34
  70. package/server/controllers/outbound/sorting-worksheet-controller.ts +12 -12
  71. package/server/controllers/vas/vas-worksheet-controller.ts +2 -2
  72. package/server/controllers/worksheet-controller.ts +6 -4
  73. package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +0 -6
  74. package/server/graphql/resolvers/worksheet/confirm-cancellation-release-order.ts +2 -1
  75. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +2 -2
  76. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +1 -3
  77. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +33 -77
  78. package/server/graphql/resolvers/worksheet/packing/activate-packing.ts +9 -26
  79. package/server/graphql/resolvers/worksheet/packing/complete-packing.ts +9 -34
  80. package/server/graphql/resolvers/worksheet/packing/packing.ts +9 -26
  81. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -28
  82. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +13 -68
  83. package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +30 -60
  84. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +2 -2
  85. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +130 -288
  86. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +2 -3
  87. package/server/graphql/resolvers/worksheet/proceed-extra-products.ts +4 -5
  88. package/server/graphql/resolvers/worksheet/putaway/complete-putaway.ts +15 -45
  89. package/server/graphql/resolvers/worksheet/transfer.ts +16 -18
  90. package/server/graphql/resolvers/worksheet/vas-transactions/common-utils.ts +2 -3
  91. package/server/graphql/resolvers/worksheet/worksheet.ts +15 -13
  92. package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +1 -4
  93. package/server/graphql/types/worksheet-detail/index.ts +0 -1
  94. package/server/utils/inventory-util.ts +126 -1
@@ -93,15 +93,13 @@ export class PackingWorksheetController extends VasWorksheetController {
93
93
  'targetInventory.releaseGood',
94
94
  'targetInventory.inventory',
95
95
  'targetInventory.inventory.location',
96
- 'targetInventory.product',
97
- 'targetInventory.productDetail'
96
+ 'targetInventory.product'
98
97
  ]
99
98
  )
100
- let targetInventory: OrderInventory = worksheetDetail.targetInventory
101
- let inventory: Inventory = targetInventory.inventory
102
99
  const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
100
+ let targetInventory: OrderInventory = worksheetDetail.targetInventory
103
101
  const product: Product = targetInventory.product
104
- const productDetail: ProductDetail = targetInventory.productDetail
102
+ let inventory: Inventory = targetInventory.inventory
105
103
  const pickedQty: number = targetInventory.releaseQty
106
104
 
107
105
  if (packedQty > pickedQty) {
@@ -116,7 +114,8 @@ export class PackingWorksheetController extends VasWorksheetController {
116
114
  }
117
115
 
118
116
  let foundSerialNumber: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
119
- where: { domain: this.domain, serialNumber: serialNumber, productDetail }
117
+ where: { domain: this.domain, serialNumber: serialNumber, product },
118
+ relations: ['product', 'inventory']
120
119
  })
121
120
 
122
121
  if (foundSerialNumber) {
@@ -140,7 +139,6 @@ export class PackingWorksheetController extends VasWorksheetController {
140
139
  inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
141
140
  inventoryItem.outboundOrderId = releaseGood.id
142
141
  inventoryItem.product = product
143
- inventoryItem.productDetail = productDetail
144
142
  inventoryItem.inventory = inventory
145
143
  inventoryItem.domain = this.domain
146
144
 
@@ -196,28 +194,39 @@ export class PackingWorksheetController extends VasWorksheetController {
196
194
  'targetInventory.inventory.product',
197
195
  'targetInventory.inventory.product.productDetails',
198
196
  'targetInventory.inventory.product.productDetails.childProductDetail',
199
- 'targetInventory.inventory.location',
200
- 'targetInventory.productDetail'
197
+ 'targetInventory.inventory.location'
201
198
  ]
202
199
  )
200
+ const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
201
+ const product: Product = worksheetDetail.targetInventory.inventory.product
202
+ const filterProductDetails: ProductDetail[] = product?.productDetails.filter(detail => !detail.deletedAt)
203
203
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
204
204
  let inventory: Inventory = targetInventory.inventory
205
205
  let packedQty: number = 1
206
206
  let pickedQty: number = targetInventory.releaseQty
207
- const releaseGood: ReleaseGood = targetInventory.releaseGood
208
- const product: Product = targetInventory.inventory.product
209
- const productDetail: ProductDetail = targetInventory.productDetail
210
207
 
211
208
  // search for matching product barcode
212
- const filterProductDetails: ProductDetail[] = product?.productDetails.filter(detail => !detail.deletedAt)
213
- const scannedProductDetail: ProductDetail = filterProductDetails.find(detail => detail.gtin == productBarcode)
214
- if (!scannedProductDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
215
-
216
- // case for scanning parent packing type, packing size
217
- // when scannedProductDetail id is not the same as productDetail id, then it's not child gtin, proceed to get child qty
218
- if (scannedProductDetail.id !== productDetail.id && !product?.isRequireSerialNumberScanningOutbound) {
219
- let childQty = await this.getChildQty(filterProductDetails, productBarcode, productDetail, scannedProductDetail)
220
- pickedQty *= childQty
209
+ const productDetail: ProductDetail = product?.productDetails
210
+ .filter(detail => !detail.deletedAt)
211
+ .find(
212
+ detail =>
213
+ detail.gtin === productBarcode &&
214
+ detail.packingType === inventory.packingType &&
215
+ detail.packingSize === inventory.packingSize
216
+ )
217
+
218
+ if (!productDetail && !product?.isRequireSerialNumberScanningOutbound) {
219
+ let roProductDetail: ProductDetail = product?.productDetails.find(
220
+ (parentDetail: ProductDetail) =>
221
+ parentDetail.packingType === inventory.packingType && parentDetail.packingSize == inventory.packingSize
222
+ )
223
+
224
+ roProductDetail.product = product
225
+
226
+ let childQty = await this.getChildQty(filterProductDetails, productBarcode, roProductDetail)
227
+ packedQty *= childQty
228
+ } else if (!productDetail) {
229
+ throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
221
230
  }
222
231
 
223
232
  if (packedQty + targetInventory.packedQty > pickedQty) {
@@ -233,7 +242,7 @@ export class PackingWorksheetController extends VasWorksheetController {
233
242
 
234
243
  let foundSerialNumber: InventoryItem = await this.trxMgr
235
244
  .getRepository(InventoryItem)
236
- .findOne({ where: { domain: this.domain, serialNumber: serialNumber, productDetail } })
245
+ .findOne({ where: { domain: this.domain, serialNumber: serialNumber, product } })
237
246
 
238
247
  if (foundSerialNumber) {
239
248
  if (foundSerialNumber.inventoryId !== inventory.id) {
@@ -260,7 +269,6 @@ export class PackingWorksheetController extends VasWorksheetController {
260
269
  inventoryItem.outboundOrderId = releaseGood.id
261
270
  inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
262
271
  inventoryItem.product = product
263
- inventoryItem.productDetail = productDetail
264
272
  inventoryItem.inventory = inventory
265
273
  inventoryItem.domain = this.domain
266
274
 
@@ -261,7 +261,7 @@ export class PickingWorksheetController extends VasWorksheetController {
261
261
  })
262
262
 
263
263
  let releaseGoods: ReleaseGood[] = pickingOrderInventory.map((oi: OrderInventory) => oi.releaseGood)
264
-
264
+
265
265
  if (releaseGoods?.length) {
266
266
  releaseGoods = releaseGoods.map((rg: ReleaseGood) => {
267
267
  return {
@@ -435,8 +435,7 @@ export class PickingWorksheetController extends VasWorksheetController {
435
435
  'targetInventory.orderProduct',
436
436
  'targetInventory.product.productDetails',
437
437
  'targetInventory.product.productDetails.product',
438
- 'targetInventory.product.productDetails.childProductDetail',
439
- 'targetInventory.productDetail'
438
+ 'targetInventory.product.productDetails.childProductDetail'
440
439
  ]
441
440
  )
442
441
 
@@ -444,7 +443,6 @@ export class PickingWorksheetController extends VasWorksheetController {
444
443
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
445
444
  let targetProduct: OrderProduct = targetInventory.orderProduct
446
445
  const product: Product = targetInventory.product
447
- const productDetail: ProductDetail = targetInventory.productDetail
448
446
  let inventory: Inventory = targetInventory.inventory
449
447
  let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
450
448
 
@@ -460,6 +458,9 @@ export class PickingWorksheetController extends VasWorksheetController {
460
458
  if (inventory.cartonId !== cartonId)
461
459
  throw new Error(this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('Carton ID', cartonId, inventory.cartonId))
462
460
 
461
+ const packingType: string = inventory.packingType
462
+ const packingSize: number = inventory.packingSize
463
+
463
464
  let pickedQty: number = pickingQty ? pickingQty : 1
464
465
  const releaseQty: number = targetInventory.releaseQty
465
466
 
@@ -467,15 +468,28 @@ export class PickingWorksheetController extends VasWorksheetController {
467
468
 
468
469
  // search for matching product barcode
469
470
  const productDetails: ProductDetail[] = product?.productDetails.filter(detail => !detail.deletedAt)
470
- // scannedProductDetail can be child or gtin
471
- const scannedProductDetail: ProductDetail = productDetails.find(detail => detail.gtin == productBarcode)
472
- if (!scannedProductDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
471
+ const isMatchingBarcode: boolean = productDetails.map(detail => detail.gtin).includes(productBarcode)
472
+ if (!isMatchingBarcode) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
473
473
 
474
474
  // case for scanning parent packing type, packing size
475
- // when scannedProductDetail id is not the same as productDetail id, then it's not child gtin, proceed to get child qty
476
- if (scannedProductDetail.id !== productDetail.id && !product?.isRequireSerialNumberScanningOutbound) {
477
- let childQty = await this.getChildQty(productDetails, productBarcode, productDetail, scannedProductDetail)
475
+ const foundProductDetail: ProductDetail = productDetails.find(
476
+ (detail: ProductDetail) =>
477
+ detail.gtin === productBarcode &&
478
+ detail.packingType === packingType &&
479
+ detail.packingSize == packingSize &&
480
+ detail.product?.id === product.id
481
+ )
482
+
483
+ if (!foundProductDetail && !product?.isRequireSerialNumberScanningOutbound) {
484
+ const roProductDetail: ProductDetail = productDetails.find(
485
+ (parentDetail: ProductDetail) =>
486
+ parentDetail.packingType === packingType && parentDetail.packingSize == packingSize
487
+ )
488
+
489
+ let childQty = await this.getChildQty(productDetails, productBarcode, roProductDetail)
478
490
  pickedQty *= childQty
491
+ } else if (!foundProductDetail) {
492
+ throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
479
493
  }
480
494
 
481
495
  if (pickedQty + targetInventory.pickedQty > releaseQty) {
@@ -527,7 +541,6 @@ export class PickingWorksheetController extends VasWorksheetController {
527
541
  inventoryItem.outboundOrderId = releaseGood.id
528
542
  inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
529
543
  inventoryItem.product = product
530
- inventoryItem.productDetail = productDetail
531
544
  inventoryItem.inventory = inventory
532
545
  inventoryItem.domain = this.domain
533
546
 
@@ -567,15 +580,13 @@ export class PickingWorksheetController extends VasWorksheetController {
567
580
  'targetInventory.orderProduct',
568
581
  'targetInventory.inventory',
569
582
  'targetInventory.inventory.location',
570
- 'targetInventory.product',
571
- 'targetInventory.productDetail'
583
+ 'targetInventory.product'
572
584
  ]
573
585
  )
574
586
 
575
587
  const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
576
588
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
577
589
  const product: Product = targetInventory.product
578
- const productDetail: ProductDetail = targetInventory.productDetail
579
590
  let inventory: Inventory = targetInventory.inventory
580
591
  let targetProduct: OrderProduct = targetInventory.orderProduct
581
592
  let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
@@ -605,13 +616,13 @@ export class PickingWorksheetController extends VasWorksheetController {
605
616
  })
606
617
 
607
618
  let foundSerialNumber: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
608
- where: { domain: this.domain, serialNumber: serialNumber, productDetail },
609
- relations: ['product', 'productDetail', 'inventory']
619
+ where: { domain: this.domain, serialNumber: serialNumber, product },
620
+ relations: ['product', 'inventory']
610
621
  })
611
622
 
612
623
  let scannedPalletIdInventory: Inventory = await this.trxMgr
613
624
  .getRepository(Inventory)
614
- .findOne({ where: { domain: this.domain, palletId }, relations: ['productDetail'] })
625
+ .findOne({ where: { domain: this.domain, palletId }, relations: ['product'] })
615
626
 
616
627
  if (foundSerialNumber) {
617
628
  if (foundSerialNumber.outboundOrderId) {
@@ -638,7 +649,6 @@ export class PickingWorksheetController extends VasWorksheetController {
638
649
  inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
639
650
  inventoryItem.outboundOrderId = releaseGood.id
640
651
  inventoryItem.product = product
641
- inventoryItem.productDetail = productDetail
642
652
  inventoryItem.inventory = scannedPalletIdInventory
643
653
  inventoryItem.domain = this.domain
644
654
 
@@ -664,7 +674,8 @@ export class PickingWorksheetController extends VasWorksheetController {
664
674
  )
665
675
  } else if (
666
676
  scannedPalletIdInventory.batchId == inventory.batchId &&
667
- scannedPalletIdInventory.productDetail.id == productDetail.id
677
+ scannedPalletIdInventory.product.id == product.id &&
678
+ scannedPalletIdInventory.product.packingType == product.packingType
668
679
  ) {
669
680
  //if replacement order inventory does not exist
670
681
  await this.serialNumberReplacement(
@@ -672,7 +683,6 @@ export class PickingWorksheetController extends VasWorksheetController {
672
683
  scannedPalletIdInventory,
673
684
  releaseGood,
674
685
  product,
675
- productDetail,
676
686
  worksheetDetail,
677
687
  foundSerialNumber
678
688
  )
@@ -848,19 +858,16 @@ export class PickingWorksheetController extends VasWorksheetController {
848
858
  'worksheetDetails.targetInventory.releaseGood',
849
859
  'worksheetDetails.targetInventory.inventory',
850
860
  'worksheetDetails.targetInventory.inventory.location',
851
- 'worksheetDetails.targetInventory.productDetail',
852
- 'worksheetDetails.targetInventory.productDetail.product',
861
+ 'worksheetDetails.targetInventory.product',
853
862
  'worksheetDetails.targetInventory.product.productDetails',
854
863
  'worksheetDetails.targetInventory.product.productDetails.childProductDetail'
855
864
  ]
856
865
  })
857
866
 
858
867
  const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
859
- const productDetail: ProductDetail = worksheetDetails
868
+ const product: Product = worksheetDetails
860
869
  .map((wsd: WorksheetDetail) => wsd.targetInventory.product)
861
- .find((productDetail: ProductDetail) => productDetail.id === inventory.productDetail.id)
862
-
863
- const product: Product = productDetail.product
870
+ .find((product: Product) => product.id === inventory.product.id)
864
871
 
865
872
  const batchId: string = inventory.batchId
866
873
  const packingType: string = inventory.packingType
@@ -879,14 +886,26 @@ export class PickingWorksheetController extends VasWorksheetController {
879
886
 
880
887
  // search for matching product barcode
881
888
  const productDetails: ProductDetail[] = product?.productDetails.filter(detail => !detail.deletedAt)
882
- // scannedProductDetail can be child or gtin
883
- const scannedProductDetail: ProductDetail = productDetails.find(detail => detail.gtin == productBarcode)
884
- if (!scannedProductDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
889
+ const isMatchingBarcode: boolean = productDetails.map(detail => detail.gtin).includes(productBarcode)
890
+ if (!isMatchingBarcode) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(`GTIN (${productBarcode})`))
885
891
 
886
892
  // case for scanning parent packing type, packing size
887
- // when scannedProductDetail id is not the same as productDetail id, then it's not child gtin, proceed to get child qty
888
- if (scannedProductDetail.id !== productDetail.id) {
889
- let childQty = await this.getChildQty(productDetails, productBarcode, productDetail, scannedProductDetail)
893
+ const foundProductDetail: ProductDetail = productDetails.find(
894
+ (detail: ProductDetail) =>
895
+ detail.gtin === productBarcode && detail.packingType === packingType && detail.packingSize == packingSize
896
+ )
897
+
898
+ if (!foundProductDetail) {
899
+ const roProductDetail: ProductDetail = productDetails.find(
900
+ (parentDetail: ProductDetail) =>
901
+ parentDetail.packingType === packingType && parentDetail.packingSize == packingSize
902
+ )
903
+ if (!roProductDetail)
904
+ throw new Error(
905
+ this.ERROR_MSG.FIND.NO_RESULT(`Packing Type ( ${packingType}) or Packing Size (${packingSize})`)
906
+ )
907
+
908
+ let childQty = await this.getChildQty(productDetails, productBarcode, roProductDetail)
890
909
  pickedQty *= childQty
891
910
  }
892
911
 
@@ -1281,7 +1300,6 @@ export class PickingWorksheetController extends VasWorksheetController {
1281
1300
  scannedPalletIdInventory,
1282
1301
  releaseGood,
1283
1302
  product,
1284
- productDetail,
1285
1303
  worksheetDetail,
1286
1304
  foundSerialNumber
1287
1305
  ) {
@@ -1346,7 +1364,6 @@ export class PickingWorksheetController extends VasWorksheetController {
1346
1364
  releaseUomValue: newOrderInventoryReleaseUomValue,
1347
1365
  pickedQty: 1,
1348
1366
  product,
1349
- productDetail,
1350
1367
  inventory: scannedPalletIdInventory,
1351
1368
  creator: this.user,
1352
1369
  updater: this.user
@@ -95,8 +95,7 @@ export class SortingWorksheetController extends VasWorksheetController {
95
95
  'worksheetDetails.targetInventory.inventory.product',
96
96
  'worksheetDetails.targetInventory.inventory.product.productDetails',
97
97
  'worksheetDetails.targetInventory.inventory.product.productDetails.product',
98
- 'worksheetDetails.targetInventory.releaseGood',
99
- 'worksheetDetails.targetInventory.productDetail'
98
+ 'worksheetDetails.targetInventory.releaseGood'
100
99
  ]
101
100
  })
102
101
 
@@ -119,12 +118,17 @@ export class SortingWorksheetController extends VasWorksheetController {
119
118
  const matchingProductDetail: ProductDetail = productDetails.find(
120
119
  (productDetail: ProductDetail) => productDetail.gtin === productBarcode
121
120
  )
122
- if (!matchingProductDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
121
+ if (!matchingProductDetail) throw new Error('Unable to find product barcode.')
123
122
  const packingType: string = matchingProductDetail.packingType
124
123
  const packingSize: number = matchingProductDetail.packingSize
124
+ if (!matchingProductDetail)
125
+ throw new Error(this.ERROR_MSG.PRODUCT.BARCODE_NOT_EXIST(productBarcode, packingType, packingSize))
125
126
 
126
127
  let matchingOIs: OrderInventory[] = orderInventories.filter(
127
- (oi: OrderInventory) => oi.productDetail.id === matchingProductDetail.id
128
+ (oi: OrderInventory) =>
129
+ oi.packingType === packingType &&
130
+ oi.packingSize === packingSize &&
131
+ oi.product?.id === matchingProductDetail.product?.id
128
132
  )
129
133
 
130
134
  let sortedQty: number = 1
@@ -138,7 +142,6 @@ export class SortingWorksheetController extends VasWorksheetController {
138
142
  const inventory: Inventory = matchingOI.inventory
139
143
  const releaseGood: ReleaseGood = matchingOI.releaseGood
140
144
  const product: Product = inventory.product
141
- const productDetail: ProductDetail = matchingOI.productDetail
142
145
 
143
146
  if (releaseQty != matchingOI?.sortedQty && sortedQty == 1) {
144
147
  // Serial Number scanning for batch picking
@@ -150,7 +153,7 @@ export class SortingWorksheetController extends VasWorksheetController {
150
153
 
151
154
  let foundSerialNumber: InventoryItem = await this.trxMgr
152
155
  .getRepository(InventoryItem)
153
- .findOne({ where: { domain: this.domain, serialNumber: serialNumber, productDetail } })
156
+ .findOne({ where: { domain: this.domain, serialNumber: serialNumber, product } })
154
157
 
155
158
  if (foundSerialNumber) {
156
159
  if (foundSerialNumber.inventoryId !== inventory.id) {
@@ -177,7 +180,6 @@ export class SortingWorksheetController extends VasWorksheetController {
177
180
  inventoryItem.outboundOrderId = releaseGood.id
178
181
  inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
179
182
  inventoryItem.product = product
180
- inventoryItem.productDetail = productDetail
181
183
  inventoryItem.inventory = inventory
182
184
  inventoryItem.domain = this.domain
183
185
 
@@ -261,8 +263,7 @@ export class SortingWorksheetController extends VasWorksheetController {
261
263
  'worksheetDetails.targetInventory.inventory.product',
262
264
  'worksheetDetails.targetInventory.inventory.product.productDetails',
263
265
  'worksheetDetails.targetInventory.inventory.product.productDetails.product',
264
- 'worksheetDetails.targetInventory.releaseGood',
265
- 'worksheetDetails.targetInventory.productDetail'
266
+ 'worksheetDetails.targetInventory.releaseGood'
266
267
  ]
267
268
  })
268
269
 
@@ -282,7 +283,6 @@ export class SortingWorksheetController extends VasWorksheetController {
282
283
  const inventory: Inventory = matchingOI.inventory
283
284
  const releaseGood: ReleaseGood = matchingOI.releaseGood
284
285
  const product: Product = matchingOI.inventory.product
285
- const productDetail: ProductDetail = matchingOI.productDetail
286
286
  const packingType: string = matchingOI.packingType
287
287
  const packingSize: number = matchingOI.packingSize
288
288
 
@@ -292,7 +292,8 @@ export class SortingWorksheetController extends VasWorksheetController {
292
292
  }
293
293
 
294
294
  let foundSerialNumber: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
295
- where: { domain: this.domain, serialNumber: serialNumber, productDetail }
295
+ where: { domain: this.domain, serialNumber: serialNumber, product },
296
+ relations: ['product', 'inventory']
296
297
  })
297
298
 
298
299
  if (foundSerialNumber) {
@@ -316,7 +317,6 @@ export class SortingWorksheetController extends VasWorksheetController {
316
317
  inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
317
318
  inventoryItem.outboundOrderId = releaseGood.id
318
319
  inventoryItem.product = product
319
- inventoryItem.productDetail = productDetail
320
320
  inventoryItem.inventory = inventory
321
321
  inventoryItem.domain = this.domain
322
322
 
@@ -22,8 +22,7 @@ import {
22
22
  InventoryNoGenerator,
23
23
  Location,
24
24
  LOCATION_TYPE,
25
- Warehouse,
26
- generateInventoryHistory
25
+ Warehouse
27
26
  } from '@things-factory/warehouse-base'
28
27
 
29
28
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
@@ -37,6 +36,7 @@ import {
37
36
  RefOrderType
38
37
  } from '../../graphql/resolvers/worksheet/vas-transactions'
39
38
  import { PackingUnits } from '../../graphql/resolvers/worksheet/vas-transactions/interfaces/repackaging'
39
+ import { generateInventoryHistory } from '../../utils'
40
40
  import { ReferenceOrderType, WorksheetController } from '../worksheet-controller'
41
41
 
42
42
  type CompleteTransactionType = (trxMgr: EntityManager, orderVas: OrderVas, user: User) => Promise<void>
@@ -19,11 +19,11 @@ import {
19
19
  VasOrder
20
20
  } from '@things-factory/sales-base'
21
21
  import { Domain } from '@things-factory/shell'
22
- import { Inventory, INVENTORY_STATUS, InventoryItem, Pallet, generateInventoryHistory } from '@things-factory/warehouse-base'
22
+ import { Inventory, INVENTORY_STATUS, InventoryItem, Pallet } from '@things-factory/warehouse-base'
23
23
 
24
24
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../constants'
25
25
  import { Worksheet, WorksheetDetail } from '../entities'
26
- import { WorksheetNoGenerator } from '../utils'
26
+ import { generateInventoryHistory, WorksheetNoGenerator } from '../utils'
27
27
 
28
28
  export type ReferenceOrderType = ArrivalNotice | ReleaseGood | VasOrder | InventoryCheck | DeliveryOrder | ReturnOrder
29
29
  export type OrderTargetTypes = OrderProduct | OrderInventory | OrderVas
@@ -1007,9 +1007,11 @@ export class WorksheetController {
1007
1007
  async getChildQty(
1008
1008
  productDetails: ProductDetail[],
1009
1009
  productBarcode: string,
1010
- orderProductDetail: ProductDetail,
1011
- scannedProductDetail: ProductDetail
1010
+ orderProductDetail: ProductDetail
1012
1011
  ): Promise<number> {
1012
+ const scannedProductDetail: ProductDetail = productDetails.find(
1013
+ (productDetail: ProductDetail) => productDetail.gtin === productBarcode
1014
+ )
1013
1015
  let hasChildRelation: boolean = Boolean(scannedProductDetail?.childProductDetail)
1014
1016
  let hasMatchingChild: boolean
1015
1017
  let childQty: number
@@ -32,7 +32,6 @@ export const batchPickingWorksheetResolver = {
32
32
  .addSelect('"PROD".name', 'productName')
33
33
  .addSelect('"PROD".sku', 'productSku')
34
34
  .addSelect('"PROD".description', 'productDescription')
35
- .addSelect('"PROD_DET".id', 'productDetailId')
36
35
  .addSelect('"INV".qty', 'qty')
37
36
  .addSelect('"INV".packing_type', 'packingType')
38
37
  .addSelect('"INV".packing_size', 'packingSize')
@@ -48,7 +47,6 @@ export const batchPickingWorksheetResolver = {
48
47
  .leftJoin('WSD.targetInventory', 'T_INV')
49
48
  .leftJoin('T_INV.inventory', 'INV')
50
49
  .leftJoin('T_INV.product', 'PROD')
51
- .leftJoin('T_INV.productDetail', 'PROD_DET')
52
50
  .leftJoin('T_INV.binLocation', 'BIN_LOC')
53
51
  .leftJoin('INV.location', 'LOC')
54
52
  .where('"WSD"."worksheet_id" = :worksheetId', { worksheetId: worksheet.id })
@@ -66,7 +64,6 @@ export const batchPickingWorksheetResolver = {
66
64
  .addGroupBy('"PROD".name')
67
65
  .addGroupBy('"PROD".sku')
68
66
  .addGroupBy('"PROD".description')
69
- .addGroupBy('"PROD_DET".id')
70
67
  .addGroupBy('"T_INV".batch_id')
71
68
  .addGroupBy('"T_INV".packing_type')
72
69
  .addGroupBy('BIN_LOC.name')
@@ -129,9 +126,6 @@ export const batchPickingWorksheetResolver = {
129
126
  name: item?.productName,
130
127
  description: item?.productDescription,
131
128
  sku: item?.productSku
132
- },
133
- productDetail: {
134
- id: item?.productDetailId
135
129
  }
136
130
  }
137
131
  }
@@ -11,9 +11,10 @@ import {
11
11
  ReleaseGood
12
12
  } from '@things-factory/sales-base'
13
13
  import { Domain } from '@things-factory/shell'
14
- import { Inventory, INVENTORY_STATUS, INVENTORY_TRANSACTION_TYPE, Location, generateInventoryHistory } from '@things-factory/warehouse-base'
14
+ import { Inventory, INVENTORY_STATUS, INVENTORY_TRANSACTION_TYPE, Location } from '@things-factory/warehouse-base'
15
15
 
16
16
  import { Worksheet, WorksheetDetail } from '../../../entities'
17
+ import { generateInventoryHistory } from '../../../utils'
17
18
 
18
19
  export const confirmCancellationReleaseOrder = {
19
20
  async confirmCancellationReleaseOrder(_: any, { name }, context: any) {
@@ -4,12 +4,12 @@ import { User } from '@things-factory/auth-base'
4
4
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
5
5
  import { InventoryCheck, ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory } from '@things-factory/sales-base'
6
6
  import { Domain } from '@things-factory/shell'
7
- import { Inventory, INVENTORY_STATUS, INVENTORY_TRANSACTION_TYPE, Location, generateInventoryHistory } from '@things-factory/warehouse-base'
7
+ import { Inventory, INVENTORY_STATUS, INVENTORY_TRANSACTION_TYPE, Location } from '@things-factory/warehouse-base'
8
8
 
9
9
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
10
10
  import { SellercraftController } from '../../../controllers'
11
11
  import { Worksheet, WorksheetDetail } from '../../../entities'
12
- import { switchLocationStatus } from '../../../utils'
12
+ import { generateInventoryHistory, switchLocationStatus } from '../../../utils'
13
13
 
14
14
  export const cycleCountAdjustmentResolver = {
15
15
  async cycleCountAdjustment(_: any, { cycleCountNo }, context: any) {
@@ -40,7 +40,6 @@ export const inventoriesByPalletResolver = {
40
40
  qb.leftJoinAndSelect('iv.domain', 'domain')
41
41
  .leftJoinAndSelect('iv.bizplace', 'bizplace')
42
42
  .leftJoinAndSelect('iv.product', 'product')
43
- .leftJoinAndSelect('iv.productDetail', 'productDetail')
44
43
  .leftJoinAndSelect('iv.warehouse', 'warehouse')
45
44
  .leftJoinAndSelect('iv.location', 'location')
46
45
  .leftJoinAndSelect('iv.creator', 'creator')
@@ -135,8 +134,7 @@ export const inventoriesByPalletResolver = {
135
134
  productName: item.product.name,
136
135
  productSKU: item.product.sku,
137
136
  productBrand: item.product.brand,
138
- productId: item.product.id,
139
- productDetailId: item.productDetail.id
137
+ productId: item.product.id
140
138
  }
141
139
  })
142
140
  )