@things-factory/worksheet-base 4.3.81 → 4.3.82

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