@things-factory/worksheet-base 4.3.137 → 4.3.139

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 (70) hide show
  1. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +59 -73
  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 +5 -4
  6. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/packing-worksheet-controller.js +23 -23
  8. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/outbound/picking-worksheet-controller.js +157 -120
  10. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +14 -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 +7 -7
  16. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  17. package/dist-server/entities/index.js +3 -2
  18. package/dist-server/entities/index.js.map +1 -1
  19. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js +29 -62
  20. package/dist-server/entities/warehouse-bizplace-onhand-inventory.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/find-sorting-release-orders-by-task-no.js +2 -2
  28. package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js.map +1 -1
  29. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +2 -1
  30. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +4 -1
  32. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +3 -2
  34. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  35. package/dist-server/graphql/resolvers/worksheet/transfer.js +9 -9
  36. package/dist-server/graphql/resolvers/worksheet/transfer.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  39. package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js +17 -17
  40. package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js.map +1 -1
  41. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js +4 -4
  42. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js.map +1 -1
  43. package/dist-server/graphql/types/worksheet-detail/index.js +1 -0
  44. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  45. package/dist-server/utils/inventory-util.js +1 -98
  46. package/dist-server/utils/inventory-util.js.map +1 -1
  47. package/package.json +16 -16
  48. package/server/controllers/inbound/unloading-worksheet-controller.ts +74 -86
  49. package/server/controllers/inspect/cycle-count-worksheet-controller.ts +2 -4
  50. package/server/controllers/outbound/loading-worksheet-controller.ts +13 -3
  51. package/server/controllers/outbound/packing-worksheet-controller.ts +32 -37
  52. package/server/controllers/outbound/picking-worksheet-controller.ts +186 -150
  53. package/server/controllers/outbound/sorting-worksheet-controller.ts +14 -21
  54. package/server/controllers/vas/vas-worksheet-controller.ts +2 -2
  55. package/server/controllers/worksheet-controller.ts +15 -10
  56. package/server/entities/index.ts +2 -2
  57. package/server/entities/warehouse-bizplace-onhand-inventory.ts +29 -63
  58. package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +6 -0
  59. package/server/graphql/resolvers/worksheet/confirm-cancellation-release-order.ts +1 -2
  60. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +2 -2
  61. package/server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.ts +2 -2
  62. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +3 -1
  63. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +4 -2
  64. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +3 -2
  65. package/server/graphql/resolvers/worksheet/transfer.ts +18 -16
  66. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +1 -1
  67. package/server/graphql/resolvers/worksheet/vas-transactions/common-utils.ts +3 -2
  68. package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +4 -1
  69. package/server/graphql/types/worksheet-detail/index.ts +1 -0
  70. package/server/utils/inventory-util.ts +1 -126
@@ -18,6 +18,7 @@ const product_base_1 = require("@things-factory/product-base");
18
18
  const sales_base_1 = require("@things-factory/sales-base");
19
19
  const setting_base_1 = require("@things-factory/setting-base");
20
20
  const warehouse_base_1 = require("@things-factory/warehouse-base");
21
+ const env_1 = require("@things-factory/env");
21
22
  const constants_1 = require("../../constants");
22
23
  const entities_1 = require("../../entities");
23
24
  const utils_1 = require("../../utils");
@@ -287,7 +288,7 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
287
288
  }, { status: sales_base_1.ORDER_INVENTORY_STATUS.PENDING_SPLIT, updater: this.user, updatedAt: new Date() });
288
289
  }
289
290
  async scanProductPicking(worksheetDetailName, worksheetType, productBarcode, cartonId, binLocation, serialNumber, toteNo, pickedQty = 1) {
290
- var _a, _b, _c, _d, _e;
291
+ var _a;
291
292
  try {
292
293
  //find existing worksheet detail
293
294
  let worksheetDetail = await this.trxMgr
@@ -300,7 +301,8 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
300
301
  .innerJoinAndSelect('oi.inventory', 'inv')
301
302
  .leftJoinAndSelect('oi.orderProduct', 'op')
302
303
  .innerJoinAndSelect('oi.product', 'prd')
303
- .leftJoinAndSelect('prd.productDetails', 'pd', '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')
304
+ .innerJoinAndSelect('oi.productDetail', 'pd')
305
+ .innerJoinAndSelect('pd.productBarcodes', 'pb')
304
306
  .where('wd.name = :name', { name: worksheetDetailName })
305
307
  .andWhere('wd.domain_id = :domainId', { domainId: this.domain.id })
306
308
  .andWhere('wd.type = :type', { type: worksheetType })
@@ -308,29 +310,54 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
308
310
  .andWhere('inv.carton_id = :cartonId', { cartonId: cartonId })
309
311
  .getOne();
310
312
  //validation to check matching worksheet detail based on name
311
- if (!worksheetDetail || !worksheetDetail.targetInventory)
313
+ if (!worksheetDetail)
312
314
  throw new Error(this.ERROR_MSG.FIND.NO_RESULT(worksheetDetailName));
315
+ const releaseGood = worksheetDetail.targetInventory.releaseGood;
316
+ let targetInventory = worksheetDetail.targetInventory;
317
+ let targetProduct = targetInventory.orderProduct;
318
+ const product = targetInventory.product;
319
+ const matchProductBarcode = await this.trxMgr.getRepository(product_base_1.ProductBarcode).findOne({
320
+ where: { gtin: productBarcode },
321
+ relations: ['productDetail']
322
+ });
323
+ const productDetail = targetInventory.productDetail;
324
+ const productBarcodes = productDetail.productBarcodes;
325
+ let inventory = targetInventory.inventory;
326
+ let bizplace = worksheetDetail.worksheet.bizplace;
327
+ let pickedUomValue = pickedQty * productDetail.uomValue;
328
+ let matchingProduct;
313
329
  //validation to prevent duplicated picking
314
- if (((_a = worksheetDetail === null || worksheetDetail === void 0 ? void 0 : worksheetDetail.targetInventory) === null || _a === void 0 ? void 0 : _a.status) != sales_base_1.ORDER_INVENTORY_STATUS.PICKING)
330
+ if ((targetInventory === null || targetInventory === void 0 ? void 0 : targetInventory.status) != sales_base_1.ORDER_INVENTORY_STATUS.PICKING)
315
331
  throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `is done`));
316
- let matchingProduct = await this.getDirectQty(Object.assign(Object.assign({}, (_c = (_b = worksheetDetail === null || worksheetDetail === void 0 ? void 0 : worksheetDetail.targetInventory) === null || _b === void 0 ? void 0 : _b.product) === null || _c === void 0 ? void 0 : _c.productDetails[0]), { product: (_d = worksheetDetail === null || worksheetDetail === void 0 ? void 0 : worksheetDetail.targetInventory) === null || _d === void 0 ? void 0 : _d.product }), productBarcode, pickedQty);
332
+ if (!productBarcodes.find(itm => itm.gtin == productBarcode) && (product === null || product === void 0 ? void 0 : product.isRequireSerialNumberScanningOutbound)) {
333
+ throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode));
334
+ }
335
+ matchingProduct = await this.getDirectQty(Object.assign(Object.assign({}, productDetail), { product: targetInventory === null || targetInventory === void 0 ? void 0 : targetInventory.product }), productBarcode, pickedQty);
317
336
  //validate matching product details based on scanned barcode
318
337
  if (!matchingProduct)
319
338
  throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode));
320
339
  pickedQty = matchingProduct.qty;
321
- let pickedUomValue = matchingProduct.uomValue;
340
+ pickedUomValue = matchingProduct.uomValue;
322
341
  //validation to prevent over release
323
342
  if (!(worksheetDetail === null || worksheetDetail === void 0 ? void 0 : worksheetDetail.targetInventory) ||
324
343
  (worksheetDetail === null || worksheetDetail === void 0 ? void 0 : worksheetDetail.targetInventory.inventory.qty) < 1 ||
325
- pickedQty + (((_e = worksheetDetail.targetInventory) === null || _e === void 0 ? void 0 : _e.pickedQty) || 0) > worksheetDetail.targetInventory.releaseQty)
344
+ pickedQty + (((_a = worksheetDetail.targetInventory) === null || _a === void 0 ? void 0 : _a.pickedQty) || 0) > worksheetDetail.targetInventory.releaseQty)
326
345
  throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`));
327
- const releaseGood = worksheetDetail.targetInventory.releaseGood;
328
- let targetInventory = worksheetDetail.targetInventory;
329
- let targetProduct = targetInventory.orderProduct;
330
- let inventory = targetInventory.inventory;
331
- let bizplace = worksheetDetail.worksheet.bizplace;
332
- const product = targetInventory.product;
333
346
  targetInventory = await this.checkAndSetBinPicking(targetInventory, binLocation);
347
+ // // search for matching product barcode
348
+ // const productDetails: ProductDetail[] = product?.productDetails.filter(detail => !detail.deletedAt)
349
+ // // scannedProductDetail can be child or gtin
350
+ // const scannedProductDetail: ProductDetail = productDetails.find(detail => detail.gtin == productBarcode)
351
+ // if (!scannedProductDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
352
+ // // case for scanning parent packing type, packing size
353
+ // // when scannedProductDetail id is not the same as productDetail id, then it's not child gtin, proceed to get child qty
354
+ // if (scannedProductDetail.id !== productDetail.id && !product?.isRequireSerialNumberScanningOutbound) {
355
+ // let childQty = await this.getChildQty(productDetails, productBarcode, productDetail, scannedProductDetail)
356
+ // pickedQty *= childQty
357
+ // }
358
+ // if (pickedQty + targetInventory.pickedQty > releaseQty) {
359
+ // throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
360
+ // }
334
361
  // for required outbound serial number scanning
335
362
  if (product === null || product === void 0 ? void 0 : product.isRequireSerialNumberScanningOutbound) {
336
363
  if (!serialNumber || serialNumber == '') {
@@ -371,6 +398,7 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
371
398
  inventoryItem.outboundOrderId = releaseGood.id;
372
399
  inventoryItem.source = warehouse_base_1.INVENTORY_ITEM_SOURCE.OUTBOUND;
373
400
  inventoryItem.product = product;
401
+ inventoryItem.productDetail = productDetail;
374
402
  inventoryItem.inventory = inventory;
375
403
  inventoryItem.domain = this.domain;
376
404
  await this.trxMgr.getRepository(warehouse_base_1.InventoryItem).save(inventoryItem);
@@ -440,7 +468,7 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
440
468
  .then(dt => {
441
469
  return dt.raw[0].qty;
442
470
  });
443
- await (0, utils_1.generateInventoryHistory)(inventory, releaseGood, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.PICKING, -releaseQty, -releaseUomValue, this.user, tx);
471
+ await (0, warehouse_base_1.generateInventoryHistory)(inventory, releaseGood, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.PICKING, -releaseQty, -releaseUomValue, this.user, tx);
444
472
  let inventoryItems = await tx
445
473
  .getRepository(warehouse_base_1.InventoryItem)
446
474
  .find({ where: { outboundOrderId: releaseGood.id } });
@@ -459,7 +487,7 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
459
487
  .set({ status: warehouse_base_1.INVENTORY_STATUS.TERMINATED })
460
488
  .where('id = :id', { id: targetInventory.inventory.id })
461
489
  .execute();
462
- await (0, utils_1.generateInventoryHistory)(inventory, releaseGood, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.TERMINATED, 0, 0, this.user, tx);
490
+ await (0, warehouse_base_1.generateInventoryHistory)(inventory, releaseGood, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.TERMINATED, 0, 0, this.user, tx);
463
491
  }
464
492
  });
465
493
  }
@@ -487,11 +515,13 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
487
515
  'targetInventory.orderProduct',
488
516
  'targetInventory.inventory',
489
517
  'targetInventory.inventory.location',
490
- 'targetInventory.product'
518
+ 'targetInventory.product',
519
+ 'targetInventory.productDetail'
491
520
  ]);
492
521
  const releaseGood = worksheetDetail.targetInventory.releaseGood;
493
522
  let targetInventory = worksheetDetail.targetInventory;
494
523
  const product = targetInventory.product;
524
+ const productDetail = targetInventory.productDetail;
495
525
  let inventory = targetInventory.inventory;
496
526
  let targetProduct = targetInventory.orderProduct;
497
527
  let bizplace = worksheetDetail.worksheet.bizplace;
@@ -517,12 +547,12 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
517
547
  }
518
548
  });
519
549
  let foundSerialNumber = await this.trxMgr.getRepository(warehouse_base_1.InventoryItem).findOne({
520
- where: { domain: this.domain, serialNumber: serialNumber, product },
521
- relations: ['product', 'inventory']
550
+ where: { domain: this.domain, serialNumber: serialNumber, productDetail },
551
+ relations: ['product', 'productDetail', 'inventory']
522
552
  });
523
553
  let scannedPalletIdInventory = await this.trxMgr
524
554
  .getRepository(warehouse_base_1.Inventory)
525
- .findOne({ where: { domain: this.domain, palletId }, relations: ['product'] });
555
+ .findOne({ where: { domain: this.domain, palletId }, relations: ['productDetail'] });
526
556
  if (foundSerialNumber) {
527
557
  if (foundSerialNumber.outboundOrderId) {
528
558
  let releaseGood = await this.trxMgr
@@ -546,6 +576,7 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
546
576
  inventoryItem.source = warehouse_base_1.INVENTORY_ITEM_SOURCE.OUTBOUND;
547
577
  inventoryItem.outboundOrderId = releaseGood.id;
548
578
  inventoryItem.product = product;
579
+ inventoryItem.productDetail = productDetail;
549
580
  inventoryItem.inventory = scannedPalletIdInventory;
550
581
  inventoryItem.domain = this.domain;
551
582
  foundSerialNumber = await this.trxMgr.getRepository(warehouse_base_1.InventoryItem).save(inventoryItem);
@@ -563,10 +594,9 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
563
594
  await this.serialNumberReplacementForExistingOrderInv(existingOrderInv, targetInventory, worksheetDetail, foundSerialNumber);
564
595
  }
565
596
  else if (scannedPalletIdInventory.batchId == inventory.batchId &&
566
- scannedPalletIdInventory.product.id == product.id &&
567
- scannedPalletIdInventory.product.packingType == product.packingType) {
597
+ scannedPalletIdInventory.productDetail.id == productDetail.id) {
568
598
  //if replacement order inventory does not exist
569
- await this.serialNumberReplacement(targetInventory, scannedPalletIdInventory, releaseGood, product, worksheetDetail, foundSerialNumber);
599
+ await this.serialNumberReplacement(targetInventory, scannedPalletIdInventory, releaseGood, product, productDetail, worksheetDetail, foundSerialNumber);
570
600
  }
571
601
  else {
572
602
  throw new Error(this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('Pallet ID', palletId, inventory.palletId));
@@ -682,105 +712,107 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
682
712
  await this.trxMgr.getRepository(entities_1.WorksheetDetail).save(worksheetDetails);
683
713
  }
684
714
  async scanProductBatchPicking(taskNo, worksheetType, cartonId, productBarcode, inventory, binLocationName, pickingQty) {
685
- const worksheet = await this.trxMgr.getRepository(entities_1.Worksheet).findOne({
686
- where: { domain: this.domain, taskNo, type: worksheetType, status: constants_1.WORKSHEET_STATUS.EXECUTING },
687
- relations: [
688
- 'worksheetDetails',
689
- 'worksheetDetails.targetInventory',
690
- 'worksheetDetails.targetInventory.releaseGood',
691
- 'worksheetDetails.targetInventory.inventory',
692
- 'worksheetDetails.targetInventory.inventory.location',
693
- 'worksheetDetails.targetInventory.product',
694
- 'worksheetDetails.targetInventory.product.productDetails',
695
- 'worksheetDetails.targetInventory.product.productDetails.childProductDetail'
696
- ]
697
- });
698
- const worksheetDetails = worksheet.worksheetDetails;
699
- const product = worksheetDetails
700
- .map((wsd) => wsd.targetInventory.product)
701
- .find((product) => product.id === inventory.product.id);
702
- const batchId = inventory.batchId;
703
- const packingType = inventory.packingType;
704
- const packingSize = inventory.packingSize;
705
- let pickedQty = pickingQty ? pickingQty : 1;
706
- const targetInventories = worksheetDetails
707
- .map((wsd) => wsd.targetInventory)
708
- .filter((targetInventory) => targetInventory.batchId === batchId &&
709
- targetInventory.packingType === packingType &&
710
- targetInventory.inventory.cartonId === cartonId &&
711
- targetInventory.product.id === product.id);
712
- // search for matching product barcode
713
- const productDetails = product === null || product === void 0 ? void 0 : product.productDetails.filter(detail => !detail.deletedAt);
714
- const isMatchingBarcode = productDetails.map(detail => detail.gtin).includes(productBarcode);
715
- if (!isMatchingBarcode)
716
- throw new Error(this.ERROR_MSG.FIND.NO_RESULT(`GTIN (${productBarcode})`));
717
- // case for scanning parent packing type, packing size
718
- const foundProductDetail = productDetails.find((detail) => detail.gtin === productBarcode && detail.packingType === packingType && detail.packingSize == packingSize);
719
- if (!foundProductDetail) {
720
- const roProductDetail = productDetails.find((parentDetail) => parentDetail.packingType === packingType && parentDetail.packingSize == packingSize);
721
- if (!roProductDetail)
722
- throw new Error(this.ERROR_MSG.FIND.NO_RESULT(`Packing Type ( ${packingType}) or Packing Size (${packingSize})`));
723
- let childQty = await this.getChildQty(productDetails, productBarcode, roProductDetail);
724
- pickedQty *= childQty;
725
- }
726
- const sumOfReleaseQty = targetInventories
727
- .map((oi) => oi.releaseQty)
728
- .reduce((a, b) => a + b, 0);
729
- const sumOfPickedQty = targetInventories.map((oi) => oi.pickedQty).reduce((a, b) => a + b, 0) + pickedQty;
730
- if (sumOfPickedQty > sumOfReleaseQty)
731
- throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `quantity can't exceed limitation`));
732
- for (var i = 0; i < targetInventories.length; i++) {
733
- let targetInventory = targetInventories[i];
734
- let inventory = targetInventory.inventory;
735
- const targetReleaseQty = targetInventory.releaseQty;
736
- const targetPickedQty = targetInventory.pickedQty;
737
- const releaseGood = targetInventory.releaseGood;
738
- if (pickedQty <= 0)
739
- break;
740
- if (targetInventory.status === sales_base_1.ORDER_INVENTORY_STATUS.PICKING &&
741
- targetReleaseQty > targetPickedQty &&
742
- pickedQty > 0) {
743
- let remainingAssignedQty = pickedQty - (targetReleaseQty - targetPickedQty); // -1, 0, 1
744
- const gapQtyRemaining = targetReleaseQty - targetPickedQty; // > 0
745
- if (binLocationName && !(targetInventory === null || targetInventory === void 0 ? void 0 : targetInventory.binLocation)) {
746
- const binLocation = await this.trxMgr.getRepository(warehouse_base_1.Location).findOne({
747
- where: { domain: this.domain, name: binLocationName, type: warehouse_base_1.LOCATION_TYPE.BIN }
748
- });
749
- if (!binLocation)
750
- throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `invalid bin location id`));
751
- targetInventory.binLocation = binLocation;
752
- }
753
- // pickedQty = 1, gap = 5 || pickedQty = 12, gap = 5 || pickedQty = 5, gap = 5
754
- targetInventory.pickedQty += pickedQty > gapQtyRemaining ? gapQtyRemaining : pickedQty;
755
- remainingAssignedQty = remainingAssignedQty < 0 ? 0 : remainingAssignedQty;
756
- if (targetInventory.pickedQty == targetReleaseQty) {
757
- const leftQty = inventory.qty - targetInventory.releaseQty;
758
- if (leftQty < 0) {
759
- throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `quantity can't exceed limitation`));
715
+ try {
716
+ console.time(`scanProductBatchPicking:${taskNo}`);
717
+ const worksheet = await this.trxMgr
718
+ .getRepository(entities_1.Worksheet)
719
+ .createQueryBuilder('worksheet')
720
+ .innerJoinAndSelect('worksheet.worksheetDetails', 'worksheetDetails')
721
+ .innerJoinAndSelect('worksheetDetails.targetInventory', 'targetInventory')
722
+ .innerJoinAndSelect('targetInventory.product', 'product')
723
+ .leftJoinAndSelect('targetInventory.productDetail', 'productDetail')
724
+ .leftJoinAndSelect('targetInventory.inventory', 'inventory')
725
+ .leftJoinAndSelect('inventory.location', 'location')
726
+ .leftJoinAndSelect('targetInventory.releaseGood', 'releaseGood')
727
+ .where('worksheet.domain_id = :domainId', { domainId: this.domain.id })
728
+ .andWhere('worksheet.task_no = :taskNo', { taskNo })
729
+ .andWhere('worksheet.type = :type', { type: worksheetType })
730
+ .andWhere('worksheet.status = :status', { status: constants_1.WORKSHEET_STATUS.EXECUTING })
731
+ .getOne();
732
+ const worksheetDetails = worksheet.worksheetDetails;
733
+ const productDetail = worksheetDetails
734
+ .map(wsd => wsd.targetInventory.productDetail)
735
+ .find(productDetail => productDetail.id === inventory.productDetail.id);
736
+ const product = productDetail.product;
737
+ const batchId = inventory.batchId;
738
+ let pickedQty = pickingQty ? pickingQty : 1;
739
+ let matchingProduct;
740
+ const targetInventories = worksheetDetails
741
+ .map((wsd) => wsd.targetInventory)
742
+ .filter((targetInventory) => targetInventory.batchId === batchId &&
743
+ targetInventory.inventory.cartonId === cartonId &&
744
+ targetInventory.productDetail.id === productDetail.id);
745
+ matchingProduct = await this.getDirectQty(Object.assign(Object.assign({}, productDetail), { product }), productBarcode, pickedQty);
746
+ //validate matching product details based on scanned barcode
747
+ if (!matchingProduct)
748
+ throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode));
749
+ pickedQty = matchingProduct.qty;
750
+ const sumOfReleaseQty = targetInventories
751
+ .map((oi) => oi.releaseQty)
752
+ .reduce((a, b) => a + b, 0);
753
+ const sumOfPickedQty = targetInventories.map((oi) => oi.pickedQty).reduce((a, b) => a + b, 0) + pickedQty;
754
+ if (sumOfPickedQty > sumOfReleaseQty)
755
+ throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `quantity can't exceed limitation`));
756
+ for (var i = 0; i < targetInventories.length; i++) {
757
+ let targetInventory = targetInventories[i];
758
+ let inventory = targetInventory.inventory;
759
+ const targetReleaseQty = targetInventory.releaseQty;
760
+ const targetPickedQty = targetInventory.pickedQty;
761
+ const releaseGood = targetInventory.releaseGood;
762
+ if (pickedQty <= 0)
763
+ break;
764
+ if (targetInventory.status === sales_base_1.ORDER_INVENTORY_STATUS.PICKING &&
765
+ targetReleaseQty > targetPickedQty &&
766
+ pickedQty > 0) {
767
+ let remainingAssignedQty = pickedQty - (targetReleaseQty - targetPickedQty); // -1, 0, 1
768
+ const gapQtyRemaining = targetReleaseQty - targetPickedQty; // > 0
769
+ if (binLocationName && !(targetInventory === null || targetInventory === void 0 ? void 0 : targetInventory.binLocation)) {
770
+ const binLocation = await this.trxMgr.getRepository(warehouse_base_1.Location).findOne({
771
+ where: { domain: this.domain, name: binLocationName, type: warehouse_base_1.LOCATION_TYPE.BIN }
772
+ });
773
+ if (!binLocation)
774
+ throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `invalid bin location id`));
775
+ targetInventory.binLocation = binLocation;
760
776
  }
761
- targetInventory.status = sales_base_1.ORDER_INVENTORY_STATUS.PICKED;
762
- await this.updateOrderTargets([targetInventory]);
763
- inventory.qty -= targetInventory.releaseQty;
764
- inventory.uomValue = Math.round((inventory.uomValue - targetInventory.releaseUomValue) * 100) / 100;
765
- inventory.lockedQty = inventory.lockedQty - targetInventory.releaseQty;
766
- inventory.lockedUomValue =
767
- Math.round((inventory.lockedUomValue - targetInventory.releaseUomValue) * 100) / 100;
768
- await this.transactionInventory(inventory, releaseGood, -targetInventory.releaseQty, -targetInventory.releaseUomValue, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.PICKING);
769
- if (leftQty === 0) {
770
- inventory.status = warehouse_base_1.INVENTORY_STATUS.TERMINATED;
771
- await this.transactionInventory(inventory, releaseGood, 0, 0, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.TERMINATED);
777
+ // pickedQty = 1, gap = 5 || pickedQty = 12, gap = 5 || pickedQty = 5, gap = 5
778
+ targetInventory.pickedQty += pickedQty > gapQtyRemaining ? gapQtyRemaining : pickedQty;
779
+ remainingAssignedQty = remainingAssignedQty < 0 ? 0 : remainingAssignedQty;
780
+ if (targetInventory.pickedQty == targetReleaseQty) {
781
+ const leftQty = inventory.qty - targetInventory.releaseQty;
782
+ if (leftQty < 0) {
783
+ throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `quantity can't exceed limitation`));
784
+ }
785
+ targetInventory.status = sales_base_1.ORDER_INVENTORY_STATUS.PICKED;
786
+ await this.updateOrderTargets([targetInventory]);
787
+ inventory.qty -= targetInventory.releaseQty;
788
+ inventory.uomValue = Math.round((inventory.uomValue - targetInventory.releaseUomValue) * 100) / 100;
789
+ inventory.lockedQty = inventory.lockedQty - targetInventory.releaseQty;
790
+ inventory.lockedUomValue =
791
+ Math.round((inventory.lockedUomValue - targetInventory.releaseUomValue) * 100) / 100;
792
+ await this.transactionInventory(inventory, releaseGood, -targetInventory.releaseQty, -targetInventory.releaseUomValue, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.PICKING);
793
+ if (leftQty === 0) {
794
+ inventory.status = warehouse_base_1.INVENTORY_STATUS.TERMINATED;
795
+ await this.transactionInventory(inventory, releaseGood, 0, 0, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.TERMINATED);
796
+ }
797
+ let worksheetDetail = worksheetDetails.find((wsd) => wsd.targetInventory.id === targetInventory.id);
798
+ worksheetDetail.status = constants_1.WORKSHEET_STATUS.DONE;
799
+ worksheetDetail.updater = this.user;
800
+ await this.trxMgr.getRepository(entities_1.WorksheetDetail).save(worksheetDetail);
772
801
  }
773
- let worksheetDetail = worksheetDetails.find((wsd) => wsd.targetInventory.id === targetInventory.id);
774
- worksheetDetail.status = constants_1.WORKSHEET_STATUS.DONE;
775
- worksheetDetail.updater = this.user;
776
- await this.trxMgr.getRepository(entities_1.WorksheetDetail).save(worksheetDetail);
777
- }
778
- else {
779
- await this.updateOrderTargets([targetInventory]);
802
+ else {
803
+ await this.updateOrderTargets([targetInventory]);
804
+ }
805
+ pickedQty = pickedQty - (targetReleaseQty - targetPickedQty);
780
806
  }
781
- pickedQty = pickedQty - (targetReleaseQty - targetPickedQty);
782
807
  }
783
808
  }
809
+ catch (error) {
810
+ env_1.logger.error(`picking-worksheet-controller[scanProductBatchPicking]: ${error}`);
811
+ throw new Error(error);
812
+ }
813
+ finally {
814
+ console.timeEnd(`scanProductBatchPicking:${taskNo}`);
815
+ }
784
816
  }
785
817
  async completePicking(releaseGoodNo) {
786
818
  let releaseGood = await this.findRefOrder(sales_base_1.ReleaseGood, {
@@ -1004,9 +1036,11 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
1004
1036
  await this.trxMgr.getRepository(sales_base_1.OrderInventory).delete(targetInventory.id);
1005
1037
  }
1006
1038
  }
1007
- catch (e) { }
1039
+ catch (e) {
1040
+ env_1.logger.error(`picking-worksheet-controller[serialNumberReplacementForExistingOrderInv]: ${e}`);
1041
+ }
1008
1042
  }
1009
- async serialNumberReplacement(targetInventory, scannedPalletIdInventory, releaseGood, product, worksheetDetail, foundSerialNumber) {
1043
+ async serialNumberReplacement(targetInventory, scannedPalletIdInventory, releaseGood, product, productDetail, worksheetDetail, foundSerialNumber) {
1010
1044
  try {
1011
1045
  //1. create new inventory, new order inventory, update old inventory, old order inventory quantity
1012
1046
  let newInventory = await this.trxMgr
@@ -1050,7 +1084,8 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
1050
1084
  var { id } = _a, targetInventory = __rest(_a, ["id"]);
1051
1085
  return targetInventory;
1052
1086
  })(targetInventory);
1053
- let newOrderInventory = await this.trxMgr.getRepository(sales_base_1.OrderInventory).save(Object.assign(Object.assign({}, newTargetInventory), { domain: this.domain, name: sales_base_1.OrderNoGenerator.orderInventory(), releaseGood, releaseQty: newOrderInventoryReleaseQty, releaseUomValue: newOrderInventoryReleaseUomValue, pickedQty: 1, product, inventory: scannedPalletIdInventory, creator: this.user, updater: this.user }));
1087
+ let newOrderInventory = await this.trxMgr.getRepository(sales_base_1.OrderInventory).save(Object.assign(Object.assign({}, newTargetInventory), { domain: this.domain, name: sales_base_1.OrderNoGenerator.orderInventory(), releaseGood, releaseQty: newOrderInventoryReleaseQty, releaseUomValue: newOrderInventoryReleaseUomValue, pickedQty: 1, product,
1088
+ productDetail, inventory: scannedPalletIdInventory, creator: this.user, updater: this.user }));
1054
1089
  oldInventory = await this.trxMgr.getRepository(warehouse_base_1.Inventory).save(Object.assign(Object.assign({}, oldInventory), { updater: this.user }));
1055
1090
  foundSerialNumber = await this.trxMgr
1056
1091
  .getRepository(warehouse_base_1.InventoryItem)
@@ -1079,7 +1114,9 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
1079
1114
  await this.trxMgr.getRepository(sales_base_1.OrderInventory).delete(targetInventory.id);
1080
1115
  }
1081
1116
  }
1082
- catch (e) { }
1117
+ catch (e) {
1118
+ env_1.logger.error(`picking-worksheet-controller[serialNumberReplacement]: ${e}`);
1119
+ }
1083
1120
  }
1084
1121
  async toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace) {
1085
1122
  //1. find tote