@things-factory/worksheet-base 4.3.113-alpha.0 → 4.3.118

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 (90) hide show
  1. package/dist-server/controllers/ecommerce/ecommerce-controller.js +26 -12
  2. package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
  3. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +73 -58
  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 +24 -33
  10. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/picking-worksheet-controller.js +48 -78
  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/render-orientage-do.js +1 -1
  16. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  17. package/dist-server/controllers/render-orientage-grn.js +1 -1
  18. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  19. package/dist-server/controllers/vas/vas-worksheet-controller.js +2 -1
  20. package/dist-server/controllers/vas/vas-worksheet-controller.js.map +1 -1
  21. package/dist-server/controllers/worksheet-controller.js +9 -7
  22. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  23. package/dist-server/entities/index.js +2 -3
  24. package/dist-server/entities/index.js.map +1 -1
  25. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js +62 -29
  26. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js.map +1 -1
  27. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js +0 -6
  28. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js.map +1 -1
  29. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js +39 -1
  30. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +6 -6
  32. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/cycle-count-worksheet.js +2 -1
  34. package/dist-server/graphql/resolvers/worksheet/cycle-count-worksheet.js.map +1 -1
  35. package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +1 -2
  37. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +1 -4
  39. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  40. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +3 -3
  41. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +51 -1
  43. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +2 -3
  45. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  46. package/dist-server/graphql/resolvers/worksheet/transfer.js +9 -9
  47. package/dist-server/graphql/resolvers/worksheet/transfer.js.map +1 -1
  48. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +1 -1
  49. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  50. package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js +17 -17
  51. package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js.map +1 -1
  52. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js +4 -4
  53. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js.map +1 -1
  54. package/dist-server/graphql/types/worksheet/index.js +1 -1
  55. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  56. package/dist-server/graphql/types/worksheet-detail/index.js +0 -1
  57. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  58. package/dist-server/utils/inventory-util.js +98 -1
  59. package/dist-server/utils/inventory-util.js.map +1 -1
  60. package/package.json +18 -17
  61. package/server/controllers/ecommerce/ecommerce-controller.ts +25 -11
  62. package/server/controllers/inbound/unloading-worksheet-controller.ts +86 -72
  63. package/server/controllers/inspect/cycle-count-worksheet-controller.ts +4 -2
  64. package/server/controllers/outbound/loading-worksheet-controller.ts +3 -9
  65. package/server/controllers/outbound/packing-worksheet-controller.ts +36 -41
  66. package/server/controllers/outbound/picking-worksheet-controller.ts +66 -98
  67. package/server/controllers/outbound/sorting-worksheet-controller.ts +12 -12
  68. package/server/controllers/render-orientage-do.ts +1 -1
  69. package/server/controllers/render-orientage-grn.ts +12 -12
  70. package/server/controllers/vas/vas-worksheet-controller.ts +2 -2
  71. package/server/controllers/worksheet-controller.ts +12 -15
  72. package/server/entities/index.ts +2 -2
  73. package/server/entities/warehouse-bizplace-onhand-inventory.ts +63 -29
  74. package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +0 -6
  75. package/server/graphql/resolvers/worksheet/confirm-cancellation-release-order.ts +43 -1
  76. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +2 -2
  77. package/server/graphql/resolvers/worksheet/cycle-count-worksheet.ts +1 -0
  78. package/server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.ts +62 -62
  79. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +1 -3
  80. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +2 -4
  81. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +3 -3
  82. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +57 -1
  83. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +2 -3
  84. package/server/graphql/resolvers/worksheet/transfer.ts +16 -18
  85. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +1 -1
  86. package/server/graphql/resolvers/worksheet/vas-transactions/common-utils.ts +2 -3
  87. package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +1 -4
  88. package/server/graphql/types/worksheet/index.ts +2 -2
  89. package/server/graphql/types/worksheet-detail/index.ts +0 -1
  90. package/server/utils/inventory-util.ts +126 -1
@@ -103,14 +103,16 @@ export class CycleCountWorksheetController extends WorksheetController {
103
103
  let keyval = {
104
104
  batchId: 'batch_id',
105
105
  batchIdRef: 'batch_id_ref',
106
- productDetailId: 'product_detail_id'
106
+ packingType: 'packing_type',
107
+ packingSize: 'packing_size',
108
+ productId: 'product_id'
107
109
  }
108
110
 
109
111
  qb.andWhere(
110
112
  new Brackets(qb => {
111
113
  orderInventory.forEach((itm, idx) => {
112
114
  // sample itm value
113
- // batchId: 'WO00019730', batchIdRef: null, productDetailId: '1d679587-c713-42d6-bd0a-74e587e39cc7'
115
+ // batchId: 'WO00019730', batchIdRef: null, packingType: 'CARBOY', packingSize: 1, productId: '1d679587-c713-42d6-bd0a-74e587e39cc7'
114
116
  qb.orWhere(
115
117
  new Brackets(qb2 => {
116
118
  let first = true
@@ -12,10 +12,11 @@ import {
12
12
  OrderToteItem,
13
13
  OrderTote
14
14
  } from '@things-factory/sales-base'
15
- import { Inventory, INVENTORY_TRANSACTION_TYPE, Tote, TOTE_STATUS, generateInventoryHistory } from '@things-factory/warehouse-base'
15
+ import { Inventory, INVENTORY_TRANSACTION_TYPE, Tote, TOTE_STATUS } from '@things-factory/warehouse-base'
16
16
 
17
17
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
18
18
  import { Worksheet, WorksheetDetail } from '../../entities'
19
+ import { generateInventoryHistory } from '../../utils'
19
20
  import { VasWorksheetController } from '../vas/vas-worksheet-controller'
20
21
 
21
22
  export class LoadingWorksheetController extends VasWorksheetController {
@@ -111,13 +112,7 @@ export class LoadingWorksheetController extends VasWorksheetController {
111
112
  let worksheetDetail = await this.findExecutableWorksheetDetailByName(
112
113
  worksheetDetails[i].name,
113
114
  WORKSHEET_TYPE.LOADING,
114
- [
115
- 'worksheet',
116
- 'targetInventory',
117
- 'targetInventory.inventory',
118
- 'targetInventory.product',
119
- 'targetInventory.productDetail'
120
- ]
115
+ ['worksheet', 'targetInventory', 'targetInventory.inventory', 'targetInventory.product']
121
116
  )
122
117
 
123
118
  const worksheet: Worksheet = worksheetDetail.worksheet
@@ -175,7 +170,6 @@ export class LoadingWorksheetController extends VasWorksheetController {
175
170
  newTargetInventory.releaseQty = remainQty
176
171
  newTargetInventory.releaseUomValue = remainUomValue
177
172
  newTargetInventory.product = targetInventory.product
178
- newTargetInventory.productDetail = targetInventory.productDetail
179
173
  newTargetInventory.packingType = targetInventory.packingType
180
174
  newTargetInventory.batchId = targetInventory.batchId
181
175
  newTargetInventory.creator = this.user
@@ -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
 
@@ -187,48 +185,46 @@ export class PackingWorksheetController extends VasWorksheetController {
187
185
  .innerJoinAndSelect('oi.releaseGood', 'rg')
188
186
  .innerJoinAndSelect('oi.inventory', 'inv')
189
187
  .leftJoinAndSelect('oi.orderProduct', 'op')
190
- .innerJoinAndSelect('oi.product', 'prd')
191
- .innerJoinAndSelect('oi.productDetail', 'pd')
188
+ .innerJoinAndSelect('inv.product', 'prd')
189
+ .leftJoinAndSelect(
190
+ 'prd.productDetails',
191
+ 'pd',
192
+ 'pd.product_id = oi.product_id AND pd.deleted_at is null AND pd.packing_type = oi.packing_type AND pd.packing_size = oi.packing_size AND pd.uom = oi.uom'
193
+ )
192
194
  .where('wd.id = :id', { id: worksheetDetailName })
195
+ .andWhere('wd.type = :type', { type: WORKSHEET_TYPE.PACKING })
193
196
  .getOne()
194
197
 
198
+ const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
199
+ const product: Product = worksheetDetail.targetInventory.inventory.product
200
+ const filterProductDetails: ProductDetail[] = product?.productDetails.filter(detail => !detail.deletedAt)
195
201
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
196
202
  let inventory: Inventory = targetInventory.inventory
197
203
  let packedQty: number = 1
198
204
  let pickedQty: number = targetInventory.releaseQty
199
- const releaseGood: ReleaseGood = targetInventory.releaseGood
200
- const product: Product = targetInventory.inventory.product
201
- const productDetail: ProductDetail = targetInventory.productDetail
202
- let matchingProduct
203
-
204
- // // search for matching product barcode
205
- // const filterProductDetails: ProductDetail[] = product?.productDetails.filter(detail => !detail.deletedAt)
206
- // const scannedProductDetail: ProductDetail = filterProductDetails.find(detail => detail.gtin == productBarcode)
207
- // if (!scannedProductDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
208
-
209
- // // case for scanning parent packing type, packing size
210
- // // when scannedProductDetail id is not the same as productDetail id, then it's not child gtin, proceed to get child qty
211
- // if (scannedProductDetail.id !== productDetail.id && !product?.isRequireSerialNumberScanningOutbound) {
212
- // let childQty = await this.getChildQty(filterProductDetails, productBarcode, productDetail, scannedProductDetail)
213
- // packedQty *= childQty
214
- // }
215
-
216
- if (productBarcode !== productDetail.gtin) {
217
- if (product?.isRequireSerialNumberScanningOutbound) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
218
-
219
- matchingProduct = await this.getDirectQty(
220
- {
221
- ...productDetail,
222
- product: targetInventory?.product
223
- },
224
- productBarcode,
225
- packedQty
205
+
206
+ // search for matching product barcode
207
+ const productDetail: ProductDetail = product?.productDetails
208
+ .filter(detail => !detail.deletedAt)
209
+ .find(
210
+ detail =>
211
+ detail.gtin === productBarcode &&
212
+ detail.packingType === inventory.packingType &&
213
+ detail.packingSize === inventory.packingSize
214
+ )
215
+
216
+ if (!productDetail && !product?.isRequireSerialNumberScanningOutbound) {
217
+ let roProductDetail: ProductDetail = product?.productDetails.find(
218
+ (parentDetail: ProductDetail) =>
219
+ parentDetail.packingType === inventory.packingType && parentDetail.packingSize == inventory.packingSize
226
220
  )
227
221
 
228
- //validate matching product details based on scanned barcode
229
- if (!matchingProduct) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
222
+ roProductDetail.product = product
230
223
 
231
- packedQty = matchingProduct.qty
224
+ let childQty = await this.getChildQty(filterProductDetails, productBarcode, roProductDetail)
225
+ packedQty *= childQty
226
+ } else if (!productDetail) {
227
+ throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
232
228
  }
233
229
 
234
230
  if (packedQty + targetInventory.packedQty > pickedQty) {
@@ -244,7 +240,7 @@ export class PackingWorksheetController extends VasWorksheetController {
244
240
 
245
241
  let foundSerialNumber: InventoryItem = await this.trxMgr
246
242
  .getRepository(InventoryItem)
247
- .findOne({ where: { domain: this.domain, serialNumber: serialNumber, productDetail } })
243
+ .findOne({ where: { domain: this.domain, serialNumber: serialNumber, product } })
248
244
 
249
245
  if (foundSerialNumber) {
250
246
  if (foundSerialNumber.inventoryId !== inventory.id) {
@@ -271,7 +267,6 @@ export class PackingWorksheetController extends VasWorksheetController {
271
267
  inventoryItem.outboundOrderId = releaseGood.id
272
268
  inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
273
269
  inventoryItem.product = product
274
- inventoryItem.productDetail = productDetail
275
270
  inventoryItem.inventory = inventory
276
271
  inventoryItem.domain = this.domain
277
272
 
@@ -28,13 +28,12 @@ import {
28
28
  Location,
29
29
  LOCATION_TYPE,
30
30
  Tote,
31
- TOTE_STATUS,
32
- generateInventoryHistory
31
+ TOTE_STATUS
33
32
  } from '@things-factory/warehouse-base'
34
33
 
35
34
  import { TASK_NUMBER_RULE_TYPE, TASK_NUMBER_SETTING_KEY, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
36
35
  import { Worksheet, WorksheetDetail } from '../../entities'
37
- import { WorksheetNoGenerator } from '../../utils'
36
+ import { generateInventoryHistory, WorksheetNoGenerator } from '../../utils'
38
37
  import { VasWorksheetController } from '../vas/vas-worksheet-controller'
39
38
 
40
39
  export class PickingWorksheetController extends VasWorksheetController {
@@ -214,7 +213,7 @@ export class PickingWorksheetController extends VasWorksheetController {
214
213
  if (vasWorksheet) {
215
214
  await this.activateVAS(vasWorksheet.name, vasWorksheet.worksheetDetails)
216
215
  }
217
- } catch (e) {}
216
+ } catch (e) { }
218
217
 
219
218
  const pendingSplitOIs: OrderInventory[] = await this.trxMgr.getRepository(OrderInventory).find({
220
219
  where: { domain: this.domain, releaseGood, status: ORDER_INVENTORY_STATUS.PENDING_SPLIT }
@@ -431,7 +430,11 @@ export class PickingWorksheetController extends VasWorksheetController {
431
430
  .innerJoinAndSelect('oi.inventory', 'inv')
432
431
  .leftJoinAndSelect('oi.orderProduct', 'op')
433
432
  .innerJoinAndSelect('oi.product', 'prd')
434
- .innerJoinAndSelect('oi.productDetail', 'pd')
433
+ .leftJoinAndSelect(
434
+ 'prd.productDetails',
435
+ 'pd',
436
+ 'pd.product_id = oi.product_id AND pd.deleted_at is null AND pd.packing_type = oi.packing_type AND pd.packing_size = oi.packing_size AND pd.uom = oi.uom'
437
+ )
435
438
  .where('wd.name = :name', { name: worksheetDetailName })
436
439
  .andWhere('wd.domain_id = :domainId', { domainId: this.domain.id })
437
440
  .andWhere('wd.type = :type', { type: worksheetType })
@@ -440,41 +443,27 @@ export class PickingWorksheetController extends VasWorksheetController {
440
443
  .getOne()
441
444
 
442
445
  //validation to check matching worksheet detail based on name
443
- if (!worksheetDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(worksheetDetailName))
444
-
445
- const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
446
- let targetInventory: OrderInventory = worksheetDetail.targetInventory
447
- let targetProduct: OrderProduct = targetInventory.orderProduct
448
- const product: Product = targetInventory.product
449
- const productDetail: ProductDetail = targetInventory.productDetail
450
- let inventory: Inventory = targetInventory.inventory
451
- let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
452
- let pickedUomValue = pickedQty * productDetail.uomValue
453
- let matchingProduct
446
+ if (!worksheetDetail || !worksheetDetail.targetInventory)
447
+ throw new Error(this.ERROR_MSG.FIND.NO_RESULT(worksheetDetailName))
454
448
 
455
449
  //validation to prevent duplicated picking
456
- if (targetInventory?.status != ORDER_INVENTORY_STATUS.PICKING)
450
+ if (worksheetDetail?.targetInventory?.status != ORDER_INVENTORY_STATUS.PICKING)
457
451
  throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `is done`))
458
452
 
459
- if (productBarcode !== productDetail.gtin) {
460
- if (product?.isRequireSerialNumberScanningOutbound)
461
- throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
462
-
463
- matchingProduct = await this.getDirectQty(
464
- {
465
- ...productDetail,
466
- product: targetInventory?.product
467
- },
468
- productBarcode,
469
- pickedQty
470
- )
453
+ let matchingProduct = await this.getDirectQty(
454
+ {
455
+ ...worksheetDetail?.targetInventory?.product?.productDetails[0],
456
+ product: worksheetDetail?.targetInventory?.product
457
+ },
458
+ productBarcode,
459
+ pickedQty
460
+ )
471
461
 
472
- //validate matching product details based on scanned barcode
473
- if (!matchingProduct) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
462
+ //validate matching product details based on scanned barcode
463
+ if (!matchingProduct) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
474
464
 
475
- pickedQty = matchingProduct.qty
476
- pickedUomValue = matchingProduct.uomValue
477
- }
465
+ pickedQty = matchingProduct.qty
466
+ let pickedUomValue = matchingProduct.uomValue
478
467
 
479
468
  //validation to prevent over release
480
469
  if (
@@ -484,24 +473,15 @@ export class PickingWorksheetController extends VasWorksheetController {
484
473
  )
485
474
  throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
486
475
 
487
- targetInventory = await this.checkAndSetBinPicking(targetInventory, binLocation)
488
-
489
- // // search for matching product barcode
490
- // const productDetails: ProductDetail[] = product?.productDetails.filter(detail => !detail.deletedAt)
491
- // // scannedProductDetail can be child or gtin
492
- // const scannedProductDetail: ProductDetail = productDetails.find(detail => detail.gtin == productBarcode)
493
- // if (!scannedProductDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
476
+ const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
494
477
 
495
- // // case for scanning parent packing type, packing size
496
- // // when scannedProductDetail id is not the same as productDetail id, then it's not child gtin, proceed to get child qty
497
- // if (scannedProductDetail.id !== productDetail.id && !product?.isRequireSerialNumberScanningOutbound) {
498
- // let childQty = await this.getChildQty(productDetails, productBarcode, productDetail, scannedProductDetail)
499
- // pickedQty *= childQty
500
- // }
478
+ let targetInventory: OrderInventory = worksheetDetail.targetInventory
479
+ let targetProduct: OrderProduct = targetInventory.orderProduct
480
+ let inventory: Inventory = targetInventory.inventory
481
+ let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
482
+ const product: Product = targetInventory.product
501
483
 
502
- // if (pickedQty + targetInventory.pickedQty > releaseQty) {
503
- // throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
504
- // }
484
+ targetInventory = await this.checkAndSetBinPicking(targetInventory, binLocation)
505
485
 
506
486
  // for required outbound serial number scanning
507
487
  if (product?.isRequireSerialNumberScanningOutbound) {
@@ -549,7 +529,6 @@ export class PickingWorksheetController extends VasWorksheetController {
549
529
  inventoryItem.outboundOrderId = releaseGood.id
550
530
  inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
551
531
  inventoryItem.product = product
552
- inventoryItem.productDetail = productDetail
553
532
  inventoryItem.inventory = inventory
554
533
  inventoryItem.domain = this.domain
555
534
 
@@ -715,15 +694,13 @@ export class PickingWorksheetController extends VasWorksheetController {
715
694
  'targetInventory.orderProduct',
716
695
  'targetInventory.inventory',
717
696
  'targetInventory.inventory.location',
718
- 'targetInventory.product',
719
- 'targetInventory.productDetail'
697
+ 'targetInventory.product'
720
698
  ]
721
699
  )
722
700
 
723
701
  const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
724
702
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
725
703
  const product: Product = targetInventory.product
726
- const productDetail: ProductDetail = targetInventory.productDetail
727
704
  let inventory: Inventory = targetInventory.inventory
728
705
  let targetProduct: OrderProduct = targetInventory.orderProduct
729
706
  let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
@@ -753,13 +730,13 @@ export class PickingWorksheetController extends VasWorksheetController {
753
730
  })
754
731
 
755
732
  let foundSerialNumber: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
756
- where: { domain: this.domain, serialNumber: serialNumber, productDetail },
757
- relations: ['product', 'productDetail', 'inventory']
733
+ where: { domain: this.domain, serialNumber: serialNumber, product },
734
+ relations: ['product', 'inventory']
758
735
  })
759
736
 
760
737
  let scannedPalletIdInventory: Inventory = await this.trxMgr
761
738
  .getRepository(Inventory)
762
- .findOne({ where: { domain: this.domain, palletId }, relations: ['productDetail'] })
739
+ .findOne({ where: { domain: this.domain, palletId }, relations: ['product'] })
763
740
 
764
741
  if (foundSerialNumber) {
765
742
  if (foundSerialNumber.outboundOrderId) {
@@ -786,7 +763,6 @@ export class PickingWorksheetController extends VasWorksheetController {
786
763
  inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
787
764
  inventoryItem.outboundOrderId = releaseGood.id
788
765
  inventoryItem.product = product
789
- inventoryItem.productDetail = productDetail
790
766
  inventoryItem.inventory = scannedPalletIdInventory
791
767
  inventoryItem.domain = this.domain
792
768
 
@@ -812,7 +788,8 @@ export class PickingWorksheetController extends VasWorksheetController {
812
788
  )
813
789
  } else if (
814
790
  scannedPalletIdInventory.batchId == inventory.batchId &&
815
- scannedPalletIdInventory.productDetail.id == productDetail.id
791
+ scannedPalletIdInventory.product.id == product.id &&
792
+ scannedPalletIdInventory.product.packingType == product.packingType
816
793
  ) {
817
794
  //if replacement order inventory does not exist
818
795
  await this.serialNumberReplacement(
@@ -820,7 +797,6 @@ export class PickingWorksheetController extends VasWorksheetController {
820
797
  scannedPalletIdInventory,
821
798
  releaseGood,
822
799
  product,
823
- productDetail,
824
800
  worksheetDetail,
825
801
  foundSerialNumber
826
802
  )
@@ -996,8 +972,6 @@ export class PickingWorksheetController extends VasWorksheetController {
996
972
  'worksheetDetails.targetInventory.releaseGood',
997
973
  'worksheetDetails.targetInventory.inventory',
998
974
  'worksheetDetails.targetInventory.inventory.location',
999
- 'worksheetDetails.targetInventory.productDetail',
1000
- 'worksheetDetails.targetInventory.productDetail.product',
1001
975
  'worksheetDetails.targetInventory.product',
1002
976
  'worksheetDetails.targetInventory.product.productDetails',
1003
977
  'worksheetDetails.targetInventory.product.productDetails.childProductDetail'
@@ -1005,53 +979,49 @@ export class PickingWorksheetController extends VasWorksheetController {
1005
979
  })
1006
980
 
1007
981
  const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
1008
- const productDetail: ProductDetail = worksheetDetails
1009
- .map(wsd => wsd.targetInventory.productDetail)
1010
- .find(productDetail => productDetail.id === inventory.productDetail.id)
1011
-
1012
- const product: Product = productDetail.product
982
+ const product: Product = worksheetDetails
983
+ .map((wsd: WorksheetDetail) => wsd.targetInventory.product)
984
+ .find((product: Product) => product.id === inventory.product.id)
1013
985
 
1014
986
  const batchId: string = inventory.batchId
987
+ const packingType: string = inventory.packingType
988
+ const packingSize: number = inventory.packingSize
1015
989
  let pickedQty: number = pickingQty ? pickingQty : 1
1016
- let matchingProduct
1017
990
 
1018
991
  const targetInventories: OrderInventory[] = worksheetDetails
1019
992
  .map((wsd: WorksheetDetail) => wsd.targetInventory)
1020
993
  .filter(
1021
994
  (targetInventory: OrderInventory) =>
1022
995
  targetInventory.batchId === batchId &&
996
+ targetInventory.packingType === packingType &&
1023
997
  targetInventory.inventory.cartonId === cartonId &&
1024
- targetInventory.productDetail.id === productDetail.id
1025
- )
1026
-
1027
- if (productBarcode !== productDetail.gtin) {
1028
- matchingProduct = await this.getDirectQty(
1029
- {
1030
- ...productDetail,
1031
- product
1032
- },
1033
- productBarcode,
1034
- pickedQty
998
+ targetInventory.product.id === product.id
1035
999
  )
1036
1000
 
1037
- //validate matching product details based on scanned barcode
1038
- if (!matchingProduct) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
1001
+ // search for matching product barcode
1002
+ const productDetails: ProductDetail[] = product?.productDetails.filter(detail => !detail.deletedAt)
1003
+ const isMatchingBarcode: boolean = productDetails.map(detail => detail.gtin).includes(productBarcode)
1004
+ if (!isMatchingBarcode) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(`GTIN (${productBarcode})`))
1039
1005
 
1040
- pickedQty = matchingProduct.qty
1041
- }
1006
+ // case for scanning parent packing type, packing size
1007
+ const foundProductDetail: ProductDetail = productDetails.find(
1008
+ (detail: ProductDetail) =>
1009
+ detail.gtin === productBarcode && detail.packingType === packingType && detail.packingSize == packingSize
1010
+ )
1042
1011
 
1043
- // // search for matching product barcode
1044
- // const productDetails: ProductDetail[] = product?.productDetails.filter(detail => !detail.deletedAt)
1045
- // // scannedProductDetail can be child or gtin
1046
- // const scannedProductDetail: ProductDetail = productDetails.find(detail => detail.gtin == productBarcode)
1047
- // if (!scannedProductDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
1012
+ if (!foundProductDetail) {
1013
+ const roProductDetail: ProductDetail = productDetails.find(
1014
+ (parentDetail: ProductDetail) =>
1015
+ parentDetail.packingType === packingType && parentDetail.packingSize == packingSize
1016
+ )
1017
+ if (!roProductDetail)
1018
+ throw new Error(
1019
+ this.ERROR_MSG.FIND.NO_RESULT(`Packing Type ( ${packingType}) or Packing Size (${packingSize})`)
1020
+ )
1048
1021
 
1049
- // // case for scanning parent packing type, packing size
1050
- // // when scannedProductDetail id is not the same as productDetail id, then it's not child gtin, proceed to get child qty
1051
- // if (scannedProductDetail.id !== productDetail.id) {
1052
- // let childQty = await this.getChildQty(productDetails, productBarcode, productDetail, scannedProductDetail)
1053
- // pickedQty *= childQty
1054
- // }
1022
+ let childQty = await this.getChildQty(productDetails, productBarcode, roProductDetail)
1023
+ pickedQty *= childQty
1024
+ }
1055
1025
 
1056
1026
  const sumOfReleaseQty: number = targetInventories
1057
1027
  .map((oi: OrderInventory) => oi.releaseQty)
@@ -1436,7 +1406,7 @@ export class PickingWorksheetController extends VasWorksheetController {
1436
1406
  await this.trxMgr.getRepository(WorksheetDetail).delete(worksheetDetail.ild)
1437
1407
  await this.trxMgr.getRepository(OrderInventory).delete(targetInventory.id)
1438
1408
  }
1439
- } catch (e) {}
1409
+ } catch (e) { }
1440
1410
  }
1441
1411
 
1442
1412
  private async serialNumberReplacement(
@@ -1444,7 +1414,6 @@ export class PickingWorksheetController extends VasWorksheetController {
1444
1414
  scannedPalletIdInventory,
1445
1415
  releaseGood,
1446
1416
  product,
1447
- productDetail,
1448
1417
  worksheetDetail,
1449
1418
  foundSerialNumber
1450
1419
  ) {
@@ -1509,7 +1478,6 @@ export class PickingWorksheetController extends VasWorksheetController {
1509
1478
  releaseUomValue: newOrderInventoryReleaseUomValue,
1510
1479
  pickedQty: 1,
1511
1480
  product,
1512
- productDetail,
1513
1481
  inventory: scannedPalletIdInventory,
1514
1482
  creator: this.user,
1515
1483
  updater: this.user
@@ -1553,7 +1521,7 @@ export class PickingWorksheetController extends VasWorksheetController {
1553
1521
  await this.trxMgr.getRepository(WorksheetDetail).delete(worksheetDetail.id)
1554
1522
  await this.trxMgr.getRepository(OrderInventory).delete(targetInventory.id)
1555
1523
  }
1556
- } catch (e) {}
1524
+ } catch (e) { }
1557
1525
  }
1558
1526
 
1559
1527
  private async toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace) {
@@ -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
 
@@ -51,7 +51,7 @@ export async function renderOrientageDO({ doNo }, context: any) {
51
51
  const ownRefNo3 = foundRO.refNo3
52
52
 
53
53
  const partnerDomain: Partner = await getRepository(Partner).findOne({
54
- where: { partnerDomain: partnerBiz.domain },
54
+ where: { domain, partnerDomain: partnerBiz.domain },
55
55
  relations: ['domain']
56
56
  })
57
57