@things-factory/worksheet-base 5.0.0-alpha.5 → 5.0.0-alpha.52
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.
- package/dist-server/constants/template.js +1 -0
- package/dist-server/constants/template.js.map +1 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js +24 -10
- package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
- package/dist-server/controllers/inbound/putaway-worksheet-controller.js +22 -13
- package/dist-server/controllers/inbound/putaway-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js +309 -4
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/index.js +2 -0
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/controllers/outbound/loading-worksheet-controller.js +56 -9
- package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +172 -7
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +500 -18
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/returning-worksheet-controller.js +11 -1
- package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js +215 -12
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-fm-grn.js +229 -0
- package/dist-server/controllers/render-fm-grn.js.map +1 -0
- package/dist-server/controllers/render-grn.js +77 -45
- package/dist-server/controllers/render-grn.js.map +1 -1
- package/dist-server/controllers/render-invoices.js +103 -65
- package/dist-server/controllers/render-invoices.js.map +1 -1
- package/dist-server/controllers/render-manifest.js +12 -5
- package/dist-server/controllers/render-manifest.js.map +1 -1
- package/dist-server/controllers/render-orientage-do.js.map +1 -1
- package/dist-server/controllers/render-orientage-grn.js +1 -0
- package/dist-server/controllers/render-orientage-grn.js.map +1 -1
- package/dist-server/controllers/render-po.js +147 -0
- package/dist-server/controllers/render-po.js.map +1 -0
- package/dist-server/controllers/render-ro-do.js +65 -1
- package/dist-server/controllers/render-ro-do.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +23 -1
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/entities/index.js +2 -1
- package/dist-server/entities/index.js.map +1 -1
- package/dist-server/entities/warehouse-bizplace-onhand-inventory.js +174 -0
- package/dist-server/entities/warehouse-bizplace-onhand-inventory.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js +14 -1
- package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/cancel-draft-release-order.js +17 -0
- package/dist-server/graphql/resolvers/worksheet/cancel-draft-release-order.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +12 -4
- package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
- package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js +27 -23
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +48 -2
- package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading/loading.js +3 -10
- package/dist-server/graphql/resolvers/worksheet/loading/loading.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +55 -21
- package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +153 -132
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/palletizing-pallets.js +2 -5
- package/dist-server/graphql/resolvers/worksheet/palletizing-pallets.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +14 -25
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +49 -58
- package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/picking.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/picking/picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +10 -1
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js +36 -0
- package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js +11 -6
- package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
- package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/complete-unloading.js +0 -21
- package/dist-server/graphql/resolvers/worksheet/unloading/complete-unloading.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/worksheet.js +2 -0
- package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/worksheets.js +45 -5
- package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +13 -8
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js +19 -4
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-pallet-id.js +24 -34
- package/dist-server/graphql/resolvers/worksheet-detail/generate-pallet-id.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +12 -3
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js +10 -2
- package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-movement/create-worksheet-movement.js +2 -5
- package/dist-server/graphql/resolvers/worksheet-movement/create-worksheet-movement.js.map +1 -1
- package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
- package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
- package/dist-server/graphql/types/worksheet/index.js +52 -11
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js +1 -0
- package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js.map +1 -1
- package/dist-server/graphql/types/worksheet/picking-assignment-status.js +2 -2
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +8 -3
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-info.js +3 -0
- package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-patch.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet-patch.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
- package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
- package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet-detail/inventory-detail.js +5 -2
- package/dist-server/graphql/types/worksheet-detail/inventory-detail.js.map +1 -1
- package/dist-server/graphql/types/worksheet-detail/worksheet-detail-patch.js +1 -1
- package/dist-server/index.js +5 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/routes.js +12 -0
- package/dist-server/routes.js.map +1 -1
- package/dist-server/utils/inventory-util.js +14 -25
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/dist-server/utils/worksheet-no-generator.js +25 -28
- package/dist-server/utils/worksheet-no-generator.js.map +1 -1
- package/package.json +17 -17
- package/server/constants/template.ts +1 -0
- package/server/controllers/ecommerce/sellercraft-controller.ts +38 -10
- package/server/controllers/inbound/putaway-worksheet-controller.ts +27 -13
- package/server/controllers/inbound/unloading-worksheet-controller.ts +376 -8
- package/server/controllers/index.ts +3 -0
- package/server/controllers/outbound/loading-worksheet-controller.ts +94 -15
- package/server/controllers/outbound/packing-worksheet-controller.ts +224 -9
- package/server/controllers/outbound/picking-worksheet-controller.ts +653 -24
- package/server/controllers/outbound/returning-worksheet-controller.ts +12 -1
- package/server/controllers/outbound/sorting-worksheet-controller.ts +303 -18
- package/server/controllers/render-fm-grn.ts +266 -0
- package/server/controllers/render-grn.ts +95 -52
- package/server/controllers/render-invoices.ts +119 -72
- package/server/controllers/render-manifest.ts +12 -5
- package/server/controllers/render-orientage-do.ts +11 -11
- package/server/controllers/render-orientage-grn.ts +12 -11
- package/server/controllers/render-po.ts +170 -0
- package/server/controllers/render-ro-do.ts +93 -8
- package/server/controllers/worksheet-controller.ts +32 -3
- package/server/entities/index.ts +2 -1
- package/server/entities/warehouse-bizplace-onhand-inventory.ts +147 -0
- package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +14 -0
- package/server/graphql/resolvers/worksheet/cancel-draft-release-order.ts +27 -0
- package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +15 -5
- package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +35 -25
- package/server/graphql/resolvers/worksheet/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
- package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +67 -8
- package/server/graphql/resolvers/worksheet/loading/loading.ts +5 -12
- package/server/graphql/resolvers/worksheet/loading-worksheet.ts +66 -13
- package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
- package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
- package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +167 -145
- package/server/graphql/resolvers/worksheet/palletizing-pallets.ts +2 -2
- package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
- package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +1 -1
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +18 -31
- package/server/graphql/resolvers/worksheet/picking/index.ts +5 -1
- package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +62 -61
- package/server/graphql/resolvers/worksheet/picking/picking.ts +30 -4
- package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
- package/server/graphql/resolvers/worksheet/picking/seal-tote.ts +25 -0
- package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
- package/server/graphql/resolvers/worksheet/picking-worksheet.ts +13 -2
- package/server/graphql/resolvers/worksheet/putaway/complete-putaway.ts +45 -2
- package/server/graphql/resolvers/worksheet/sorting/complete-order-sorting.ts +13 -9
- package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +6 -4
- package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +6 -4
- package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
- package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
- package/server/graphql/resolvers/worksheet/unloading/complete-unloading.ts +0 -25
- package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
- package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
- package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
- package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
- package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
- package/server/graphql/resolvers/worksheet/worksheet.ts +2 -0
- package/server/graphql/resolvers/worksheet/worksheets.ts +64 -5
- package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +30 -14
- package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.ts +39 -11
- package/server/graphql/resolvers/worksheet-detail/generate-pallet-id.ts +46 -49
- package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +15 -3
- package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +18 -1
- package/server/graphql/resolvers/worksheet-movement/create-worksheet-movement.ts +2 -2
- package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
- package/server/graphql/types/worksheet/index.ts +52 -11
- package/server/graphql/types/worksheet/loaded-worksheet-detail.ts +1 -0
- package/server/graphql/types/worksheet/picking-assignment-status.ts +2 -2
- package/server/graphql/types/worksheet/worksheet-detail-info.ts +8 -3
- package/server/graphql/types/worksheet/worksheet-info.ts +3 -0
- package/server/graphql/types/worksheet/worksheet-patch.ts +1 -0
- package/server/graphql/types/worksheet/worksheet.ts +1 -0
- package/server/graphql/types/worksheet-detail/index.ts +0 -2
- package/server/graphql/types/worksheet-detail/inventory-detail.ts +5 -2
- package/server/graphql/types/worksheet-detail/worksheet-detail-patch.ts +1 -1
- package/server/index.ts +5 -0
- package/server/routes.ts +17 -0
- package/server/utils/inventory-util.ts +15 -23
- package/server/utils/worksheet-no-generator.ts +25 -25
|
@@ -1,23 +1,33 @@
|
|
|
1
|
-
import { In } from 'typeorm'
|
|
1
|
+
import { Equal, In, IsNull, Not } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { Bizplace } from '@things-factory/biz-base'
|
|
4
4
|
import { generateId } from '@things-factory/id-rule-base'
|
|
5
5
|
import { Product, ProductDetail } from '@things-factory/product-base'
|
|
6
6
|
import {
|
|
7
7
|
ORDER_INVENTORY_STATUS,
|
|
8
|
+
ORDER_PRODUCT_STATUS,
|
|
8
9
|
ORDER_STATUS,
|
|
9
10
|
OrderInventory,
|
|
10
11
|
OrderNoGenerator,
|
|
12
|
+
OrderProduct,
|
|
13
|
+
OrderTote,
|
|
14
|
+
OrderToteItem,
|
|
15
|
+
OrderToteSeal,
|
|
11
16
|
OrderVas,
|
|
12
17
|
ReleaseGood
|
|
13
18
|
} from '@things-factory/sales-base'
|
|
14
19
|
import { Setting } from '@things-factory/setting-base'
|
|
15
20
|
import {
|
|
16
21
|
Inventory,
|
|
22
|
+
INVENTORY_ITEM_SOURCE,
|
|
17
23
|
INVENTORY_STATUS,
|
|
18
24
|
INVENTORY_TRANSACTION_TYPE,
|
|
25
|
+
InventoryItem,
|
|
26
|
+
InventoryNoGenerator,
|
|
19
27
|
Location,
|
|
20
|
-
LOCATION_TYPE
|
|
28
|
+
LOCATION_TYPE,
|
|
29
|
+
Tote,
|
|
30
|
+
TOTE_STATUS
|
|
21
31
|
} from '@things-factory/warehouse-base'
|
|
22
32
|
|
|
23
33
|
import { TASK_NUMBER_RULE_TYPE, TASK_NUMBER_SETTING_KEY, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
|
|
@@ -335,7 +345,8 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
335
345
|
'worksheetDetails',
|
|
336
346
|
'worksheetDetails.targetInventory',
|
|
337
347
|
'worksheetDetails.targetInventory.inventory',
|
|
338
|
-
'worksheetDetails.targetInventory.product'
|
|
348
|
+
'worksheetDetails.targetInventory.product',
|
|
349
|
+
'worksheetDetails.targetInventory.orderProduct'
|
|
339
350
|
])
|
|
340
351
|
|
|
341
352
|
const worksheetDetails: WorksheetDetail[] = await this.extractMatchedWorksheetDetails(
|
|
@@ -344,7 +355,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
344
355
|
productId,
|
|
345
356
|
packingType,
|
|
346
357
|
packingSize,
|
|
347
|
-
['targetInventory', 'targetInventory.inventory']
|
|
358
|
+
['targetInventory', 'targetInventory.inventory', 'targetInventory.orderProduct']
|
|
348
359
|
)
|
|
349
360
|
|
|
350
361
|
let worksheetDetailIds: string[] = []
|
|
@@ -361,6 +372,13 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
361
372
|
inventory.lockedQty = inventory.lockedQty - targetInventory.releaseQty
|
|
362
373
|
inventory.lockedUomValue = inventory.lockedUomValue - targetInventory.releaseUomValue
|
|
363
374
|
await this.updateInventory(inventory)
|
|
375
|
+
|
|
376
|
+
await this.trxMgr
|
|
377
|
+
.getRepository(OrderProduct)
|
|
378
|
+
.update(
|
|
379
|
+
{ id: targetInventory.orderProduct.id },
|
|
380
|
+
{ status: ORDER_PRODUCT_STATUS.PENDING_ASSIGN, updater: this.user }
|
|
381
|
+
)
|
|
364
382
|
}
|
|
365
383
|
|
|
366
384
|
await this.trxMgr.getRepository(WorksheetDetail).delete(worksheetDetailIds)
|
|
@@ -385,7 +403,8 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
385
403
|
productBarcode: string,
|
|
386
404
|
cartonId: string,
|
|
387
405
|
binLocation?: string,
|
|
388
|
-
serialNumber?: string
|
|
406
|
+
serialNumber?: string,
|
|
407
|
+
toteNo?: string
|
|
389
408
|
): Promise<OrderInventory> {
|
|
390
409
|
try {
|
|
391
410
|
let worksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
|
|
@@ -398,6 +417,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
398
417
|
'targetInventory.releaseGood',
|
|
399
418
|
'targetInventory.inventory',
|
|
400
419
|
'targetInventory.product',
|
|
420
|
+
'targetInventory.orderProduct',
|
|
401
421
|
'targetInventory.product.productDetails',
|
|
402
422
|
'targetInventory.product.productDetails.product',
|
|
403
423
|
'targetInventory.product.productDetails.childProductDetail'
|
|
@@ -406,8 +426,10 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
406
426
|
|
|
407
427
|
const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
|
|
408
428
|
let targetInventory: OrderInventory = worksheetDetail.targetInventory
|
|
429
|
+
let targetProduct: OrderProduct = targetInventory.orderProduct
|
|
409
430
|
const product: Product = targetInventory.product
|
|
410
431
|
let inventory: Inventory = targetInventory.inventory
|
|
432
|
+
let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
|
|
411
433
|
|
|
412
434
|
//validation to prevent duplicated picking
|
|
413
435
|
let oiValidate: OrderInventory = await this.trxMgr.getRepository(OrderInventory).findOne({
|
|
@@ -443,29 +465,76 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
443
465
|
detail.product?.id === product.id
|
|
444
466
|
)
|
|
445
467
|
|
|
446
|
-
if (!foundProductDetail) {
|
|
468
|
+
if (!foundProductDetail && !product?.isRequireSerialNumberScanningOutbound) {
|
|
447
469
|
const roProductDetail: ProductDetail = productDetails.find(
|
|
448
470
|
(parentDetail: ProductDetail) =>
|
|
449
471
|
parentDetail.packingType === packingType && parentDetail.packingSize == packingSize
|
|
450
472
|
)
|
|
451
473
|
|
|
452
474
|
pickedQty = await this.getChildQty(productDetails, productBarcode, roProductDetail)
|
|
453
|
-
if (pickedQty > releaseQty) {
|
|
475
|
+
if (pickedQty + targetInventory.pickedQty > releaseQty) {
|
|
454
476
|
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
|
|
455
477
|
}
|
|
478
|
+
} else if (!foundProductDetail) {
|
|
479
|
+
throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
|
|
456
480
|
}
|
|
457
481
|
|
|
458
|
-
if (product?.
|
|
459
|
-
if (!serialNumber || serialNumber == '')
|
|
482
|
+
if (product?.isRequireSerialNumberScanningOutbound) {
|
|
483
|
+
if (!serialNumber || serialNumber == '') {
|
|
460
484
|
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `require serial number`))
|
|
485
|
+
}
|
|
461
486
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
487
|
+
let totalInventoryItems = await this.trxMgr.getRepository(InventoryItem).count({
|
|
488
|
+
where: {
|
|
489
|
+
inventory,
|
|
490
|
+
status: Not(In([INVENTORY_STATUS.TERMINATED, INVENTORY_STATUS.PICKED]))
|
|
491
|
+
}
|
|
492
|
+
})
|
|
493
|
+
|
|
494
|
+
let foundSerialNumber: InventoryItem = await this.trxMgr
|
|
495
|
+
.getRepository(InventoryItem)
|
|
496
|
+
.findOne({ where: { domain: this.domain, serialNumber: serialNumber, product } })
|
|
497
|
+
|
|
498
|
+
if (foundSerialNumber) {
|
|
499
|
+
if (foundSerialNumber.inventoryId !== inventory.id) {
|
|
500
|
+
throw new Error('Serial Number scanned is in another inventory')
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
if (foundSerialNumber.outboundOrderId) {
|
|
504
|
+
let releaseGood: ReleaseGood = await this.trxMgr
|
|
505
|
+
.getRepository(ReleaseGood)
|
|
506
|
+
.findOne({ where: { id: foundSerialNumber.outboundOrderId } })
|
|
507
|
+
throw new Error(`Inventory Item is already picked in ${releaseGood.name}`)
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
foundSerialNumber.status = INVENTORY_STATUS.PICKING
|
|
511
|
+
foundSerialNumber.updater = this.user
|
|
512
|
+
foundSerialNumber.outboundOrderId = releaseGood.id
|
|
513
|
+
|
|
514
|
+
await this.trxMgr.getRepository(InventoryItem).save(foundSerialNumber)
|
|
515
|
+
} else {
|
|
516
|
+
if (totalInventoryItems >= inventory.qty) {
|
|
517
|
+
throw new Error('Insufficient inventory quantity to scan new serial number')
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
let inventoryItem: InventoryItem = new InventoryItem()
|
|
521
|
+
inventoryItem.name = InventoryNoGenerator.inventoryItemName()
|
|
522
|
+
inventoryItem.serialNumber = serialNumber
|
|
523
|
+
inventoryItem.status = INVENTORY_STATUS.PICKING
|
|
524
|
+
inventoryItem.outboundOrderId = releaseGood.id
|
|
525
|
+
inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
|
|
526
|
+
inventoryItem.product = product
|
|
527
|
+
inventoryItem.inventory = inventory
|
|
528
|
+
inventoryItem.domain = this.domain
|
|
529
|
+
|
|
530
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItem)
|
|
466
531
|
}
|
|
467
532
|
}
|
|
468
533
|
|
|
534
|
+
if (toteNo) {
|
|
535
|
+
await this.toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace)
|
|
536
|
+
}
|
|
537
|
+
|
|
469
538
|
await this.updatePickingTransaction(releaseGood, targetInventory, worksheetDetail, inventory, pickedQty)
|
|
470
539
|
} catch (error) {
|
|
471
540
|
throw error
|
|
@@ -479,7 +548,8 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
479
548
|
locationName: string,
|
|
480
549
|
pickedQty: number,
|
|
481
550
|
binLocation?: string,
|
|
482
|
-
serialNumber?: string
|
|
551
|
+
serialNumber?: string,
|
|
552
|
+
toteNo?: string
|
|
483
553
|
): Promise<void> {
|
|
484
554
|
try {
|
|
485
555
|
let worksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
|
|
@@ -487,8 +557,10 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
487
557
|
worksheetType,
|
|
488
558
|
[
|
|
489
559
|
'worksheet',
|
|
560
|
+
'worksheet.bizplace',
|
|
490
561
|
'targetInventory',
|
|
491
562
|
'targetInventory.releaseGood',
|
|
563
|
+
'targetInventory.orderProduct',
|
|
492
564
|
'targetInventory.inventory',
|
|
493
565
|
'targetInventory.inventory.location',
|
|
494
566
|
'targetInventory.product'
|
|
@@ -499,6 +571,8 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
499
571
|
let targetInventory: OrderInventory = worksheetDetail.targetInventory
|
|
500
572
|
const product: Product = targetInventory.product
|
|
501
573
|
let inventory: Inventory = targetInventory.inventory
|
|
574
|
+
let targetProduct: OrderProduct = targetInventory.orderProduct
|
|
575
|
+
let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
|
|
502
576
|
|
|
503
577
|
//validation to prevent duplicated picking
|
|
504
578
|
let oiValidate: OrderInventory = await this.trxMgr.getRepository(OrderInventory).findOne({
|
|
@@ -509,22 +583,104 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
509
583
|
//validation to prevent over release
|
|
510
584
|
if (inventory.qty <= 0) throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
|
|
511
585
|
|
|
512
|
-
if (inventory.palletId !== palletId)
|
|
586
|
+
if (inventory.palletId !== palletId && !product?.isRequireSerialNumberScanningOutbound)
|
|
513
587
|
throw new Error(this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('Pallet ID', palletId, inventory.palletId))
|
|
514
588
|
|
|
515
|
-
if (product?.
|
|
516
|
-
if (!serialNumber || serialNumber == '')
|
|
589
|
+
if (product?.isRequireSerialNumberScanningOutbound) {
|
|
590
|
+
if (!serialNumber || serialNumber == '') {
|
|
517
591
|
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `require serial number`))
|
|
592
|
+
}
|
|
518
593
|
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
594
|
+
let totalInventoryItems = await this.trxMgr.getRepository(InventoryItem).count({
|
|
595
|
+
where: {
|
|
596
|
+
inventory,
|
|
597
|
+
status: Not(In([INVENTORY_STATUS.TERMINATED, INVENTORY_STATUS.PICKED]))
|
|
598
|
+
}
|
|
599
|
+
})
|
|
600
|
+
|
|
601
|
+
let foundSerialNumber: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
|
|
602
|
+
where: { domain: this.domain, serialNumber: serialNumber, product },
|
|
603
|
+
relations: ['product', 'inventory']
|
|
604
|
+
})
|
|
605
|
+
|
|
606
|
+
let scannedPalletIdInventory: Inventory = await this.trxMgr
|
|
607
|
+
.getRepository(Inventory)
|
|
608
|
+
.findOne({ where: { domain: this.domain, palletId }, relations: ['product'] })
|
|
609
|
+
|
|
610
|
+
if (foundSerialNumber) {
|
|
611
|
+
if (foundSerialNumber.outboundOrderId) {
|
|
612
|
+
let releaseGood: ReleaseGood = await this.trxMgr
|
|
613
|
+
.getRepository(ReleaseGood)
|
|
614
|
+
.findOne({ where: { id: foundSerialNumber.outboundOrderId } })
|
|
615
|
+
throw new Error(`Inventory Item is already picked in ${releaseGood.name}`)
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
foundSerialNumber.status = INVENTORY_STATUS.PICKING
|
|
619
|
+
foundSerialNumber.updater = this.user
|
|
620
|
+
foundSerialNumber.outboundOrderId = releaseGood.id
|
|
621
|
+
|
|
622
|
+
await this.trxMgr.getRepository(InventoryItem).save(foundSerialNumber)
|
|
623
|
+
} else {
|
|
624
|
+
if (totalInventoryItems >= inventory.qty) {
|
|
625
|
+
throw new Error('Insufficient inventory quantity to scan new serial number')
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
let inventoryItem: InventoryItem = new InventoryItem()
|
|
629
|
+
inventoryItem.name = InventoryNoGenerator.inventoryItemName()
|
|
630
|
+
inventoryItem.serialNumber = serialNumber
|
|
631
|
+
inventoryItem.status = INVENTORY_STATUS.PICKING
|
|
632
|
+
inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
|
|
633
|
+
inventoryItem.outboundOrderId = releaseGood.id
|
|
634
|
+
inventoryItem.product = product
|
|
635
|
+
inventoryItem.inventory = scannedPalletIdInventory
|
|
636
|
+
inventoryItem.domain = this.domain
|
|
637
|
+
|
|
638
|
+
foundSerialNumber = await this.trxMgr.getRepository(InventoryItem).save(inventoryItem)
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
if (inventory.palletId !== palletId) {
|
|
642
|
+
let existingOrderInv = await this.trxMgr.getRepository(OrderInventory).findOne({
|
|
643
|
+
where: {
|
|
644
|
+
domain: this.domain,
|
|
645
|
+
inventory: scannedPalletIdInventory,
|
|
646
|
+
releaseGood: releaseGood
|
|
647
|
+
}
|
|
648
|
+
})
|
|
649
|
+
|
|
650
|
+
if (existingOrderInv) {
|
|
651
|
+
//if replacement order inventory already existed in worksheet detail
|
|
652
|
+
await this.serialNumberReplacementForExistingOrderInv(
|
|
653
|
+
existingOrderInv,
|
|
654
|
+
targetInventory,
|
|
655
|
+
worksheetDetail,
|
|
656
|
+
foundSerialNumber
|
|
657
|
+
)
|
|
658
|
+
} else if (
|
|
659
|
+
scannedPalletIdInventory.batchId == inventory.batchId &&
|
|
660
|
+
scannedPalletIdInventory.product.id == product.id &&
|
|
661
|
+
scannedPalletIdInventory.product.packingType == product.packingType
|
|
662
|
+
) {
|
|
663
|
+
//if replacement order inventory does not exist
|
|
664
|
+
await this.serialNumberReplacement(
|
|
665
|
+
targetInventory,
|
|
666
|
+
scannedPalletIdInventory,
|
|
667
|
+
releaseGood,
|
|
668
|
+
product,
|
|
669
|
+
worksheetDetail,
|
|
670
|
+
foundSerialNumber
|
|
671
|
+
)
|
|
672
|
+
} else {
|
|
673
|
+
throw new Error(this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('Pallet ID', palletId, inventory.palletId))
|
|
674
|
+
}
|
|
523
675
|
}
|
|
524
676
|
}
|
|
525
677
|
|
|
526
678
|
targetInventory = await this.checkAndSetBinPicking(targetInventory, binLocation)
|
|
527
679
|
|
|
680
|
+
if (toteNo) {
|
|
681
|
+
await this.toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace)
|
|
682
|
+
}
|
|
683
|
+
|
|
528
684
|
await this.updatePickingTransaction(releaseGood, targetInventory, worksheetDetail, inventory, pickedQty)
|
|
529
685
|
|
|
530
686
|
const fromLocation: Location = targetInventory.inventory.location
|
|
@@ -823,12 +979,42 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
823
979
|
status: ORDER_STATUS.PICKING
|
|
824
980
|
})
|
|
825
981
|
|
|
982
|
+
const foundNotSealedOrderTote = await this.trxMgr
|
|
983
|
+
.getRepository(OrderTote)
|
|
984
|
+
.findOne({ where: { releaseGood, closedDate: IsNull() } })
|
|
985
|
+
|
|
986
|
+
if (foundNotSealedOrderTote) {
|
|
987
|
+
throw new Error('Please seal the tote(s) before completing')
|
|
988
|
+
}
|
|
989
|
+
|
|
826
990
|
let worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.PICKING, [
|
|
827
991
|
'worksheetDetails',
|
|
828
992
|
'worksheetDetails.targetInventory'
|
|
829
993
|
])
|
|
830
994
|
await this.checkRecordValidity(worksheet, { status: WORKSHEET_STATUS.EXECUTING })
|
|
831
995
|
|
|
996
|
+
let inventoryItems: InventoryItem = await this.trxMgr
|
|
997
|
+
.getRepository(InventoryItem)
|
|
998
|
+
.find({ where: { outboundOrderId: releaseGood.id } })
|
|
999
|
+
|
|
1000
|
+
if (inventoryItems.length > 0) {
|
|
1001
|
+
inventoryItems.forEach((itm: InventoryItem) => {
|
|
1002
|
+
itm.status = INVENTORY_STATUS.TERMINATED
|
|
1003
|
+
itm.updater = this.user
|
|
1004
|
+
})
|
|
1005
|
+
|
|
1006
|
+
// let inventoryLists = InventoryItems.filter(
|
|
1007
|
+
// (value, index, self) => index === self.findIndex(itm => itm.inventory.id === value.inventory.id)
|
|
1008
|
+
// )
|
|
1009
|
+
|
|
1010
|
+
// inventoryLists.forEach((itm: Inventory) => {
|
|
1011
|
+
// if (itm.inventory.qty - itm.releaseQty == 0)
|
|
1012
|
+
// this.transactionInventory(itm, releaseGood, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
|
|
1013
|
+
// })
|
|
1014
|
+
|
|
1015
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
|
|
1016
|
+
}
|
|
1017
|
+
|
|
832
1018
|
let orderStatus: string
|
|
833
1019
|
if (releaseGood?.packingOption) {
|
|
834
1020
|
orderStatus = ORDER_STATUS.READY_TO_PACK
|
|
@@ -862,14 +1048,14 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
862
1048
|
worksheet.updater = this.user
|
|
863
1049
|
worksheet = await this.trxMgr.getRepository(Worksheet).save(worksheet)
|
|
864
1050
|
|
|
865
|
-
const worksheetDetails:
|
|
1051
|
+
const worksheetDetails: any = worksheet.worksheetDetails.filter(wsD => wsD.status != 'MISSING')
|
|
866
1052
|
worksheetDetails.forEach((wsd: WorksheetDetail) => {
|
|
867
1053
|
wsd.status = WORKSHEET_STATUS.DONE
|
|
868
1054
|
wsd.updater = this.user
|
|
869
1055
|
})
|
|
870
1056
|
await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetails)
|
|
871
1057
|
|
|
872
|
-
const targetInventories: OrderInventory[] =
|
|
1058
|
+
const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => {
|
|
873
1059
|
let targetInventory: OrderInventory = wsd.targetInventory
|
|
874
1060
|
targetInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
|
|
875
1061
|
targetInventory.updater = this.user
|
|
@@ -877,7 +1063,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
877
1063
|
})
|
|
878
1064
|
await this.updateOrderTargets(targetInventories)
|
|
879
1065
|
|
|
880
|
-
const releaseGoods: ReleaseGood[] =
|
|
1066
|
+
const releaseGoods: ReleaseGood[] = worksheetDetails.map((wsd: WorksheetDetail) => {
|
|
881
1067
|
let releaseGood: ReleaseGood = wsd.targetInventory.releaseGood
|
|
882
1068
|
|
|
883
1069
|
let orderStatus: string
|
|
@@ -962,6 +1148,9 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
962
1148
|
}
|
|
963
1149
|
|
|
964
1150
|
orderInventory.status = ORDER_INVENTORY_STATUS.PICKED
|
|
1151
|
+
orderInventory.pickedBy = this.user?.name
|
|
1152
|
+
orderInventory.pickedByUser = this.user
|
|
1153
|
+
orderInventory.pickedAt = new Date()
|
|
965
1154
|
|
|
966
1155
|
inventory.qty -= orderInventory.releaseQty
|
|
967
1156
|
inventory.uomValue = Math.round((inventory.uomValue - orderInventory.releaseUomValue) * 100) / 100
|
|
@@ -979,6 +1168,19 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
979
1168
|
worksheetDetail.updater = this.user
|
|
980
1169
|
await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetail)
|
|
981
1170
|
|
|
1171
|
+
let inventoryItems: InventoryItem = await this.trxMgr
|
|
1172
|
+
.getRepository(InventoryItem)
|
|
1173
|
+
.find({ where: { outboundOrderId: releaseGood.id } })
|
|
1174
|
+
|
|
1175
|
+
if (inventoryItems.length > 0) {
|
|
1176
|
+
inventoryItems.forEach((itm: InventoryItem) => {
|
|
1177
|
+
itm.status = INVENTORY_STATUS.PICKED
|
|
1178
|
+
itm.updater = this.user
|
|
1179
|
+
})
|
|
1180
|
+
|
|
1181
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
|
|
1182
|
+
}
|
|
1183
|
+
|
|
982
1184
|
if (leftQty === 0) {
|
|
983
1185
|
inventory.status = INVENTORY_STATUS.TERMINATED
|
|
984
1186
|
await this.transactionInventory(inventory, releaseGood, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
|
|
@@ -989,4 +1191,431 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
989
1191
|
|
|
990
1192
|
return orderInventory
|
|
991
1193
|
}
|
|
1194
|
+
|
|
1195
|
+
private async serialNumberReplacementForExistingOrderInv(
|
|
1196
|
+
existingOrderInv,
|
|
1197
|
+
targetInventory,
|
|
1198
|
+
worksheetDetail,
|
|
1199
|
+
foundSerialNumber
|
|
1200
|
+
) {
|
|
1201
|
+
try {
|
|
1202
|
+
//1. update replacement inventory, order inventory, old inventory, old order inventory quantity
|
|
1203
|
+
let newInventory: Inventory = await this.trxMgr
|
|
1204
|
+
.getRepository(Inventory)
|
|
1205
|
+
.findOne({ where: { domain: this.domain, id: existingOrderInv?.inventoryId } })
|
|
1206
|
+
|
|
1207
|
+
let newOrderInventory: OrderInventory = await this.trxMgr
|
|
1208
|
+
.getRepository(OrderInventory)
|
|
1209
|
+
.findOne({ where: { domain: this.domain, id: existingOrderInv?.id } })
|
|
1210
|
+
|
|
1211
|
+
let oldInventory: Inventory = await this.trxMgr
|
|
1212
|
+
.getRepository(Inventory)
|
|
1213
|
+
.findOne({ where: { domain: this.domain, id: targetInventory?.inventory.id } })
|
|
1214
|
+
|
|
1215
|
+
let oldOrderInventory: OrderInventory = await this.trxMgr
|
|
1216
|
+
.getRepository(OrderInventory)
|
|
1217
|
+
.findOne({ where: { domain: this.domain, id: targetInventory?.id } })
|
|
1218
|
+
|
|
1219
|
+
//if replacement inventory quantity insufficient
|
|
1220
|
+
if (newInventory.qty - newInventory.lockedQty < targetInventory.releaseQty - targetInventory.pickedQty) {
|
|
1221
|
+
newOrderInventory.releaseQty += newInventory.qty - newInventory.lockedQty
|
|
1222
|
+
newOrderInventory.releaseUomValue += newInventory.uomValue - newInventory.lockedUomValue
|
|
1223
|
+
|
|
1224
|
+
oldOrderInventory.releaseQty -= newOrderInventory.releaseQty
|
|
1225
|
+
oldOrderInventory.releaseUomValue -= newOrderInventory.releaseUomValue
|
|
1226
|
+
|
|
1227
|
+
oldInventory.lockedQty -= newOrderInventory.releaseQty
|
|
1228
|
+
oldInventory.lockedUomValue -= newOrderInventory.releaseUomValue
|
|
1229
|
+
|
|
1230
|
+
newInventory.lockedQty = newInventory.qty
|
|
1231
|
+
newInventory.lockedUomValue = newInventory.uomValue
|
|
1232
|
+
} else {
|
|
1233
|
+
newOrderInventory.releaseQty += targetInventory.releaseQty - targetInventory.pickedQty
|
|
1234
|
+
newOrderInventory.releaseUomValue +=
|
|
1235
|
+
newOrderInventory.releaseQty * (targetInventory.releaseUomValue / targetInventory.releaseQty)
|
|
1236
|
+
|
|
1237
|
+
oldOrderInventory.releaseQty = targetInventory.pickedQty
|
|
1238
|
+
oldOrderInventory.status = ORDER_INVENTORY_STATUS.PICKED
|
|
1239
|
+
oldOrderInventory.releaseUomValue =
|
|
1240
|
+
(targetInventory.releaseUomValue / targetInventory.releaseQty) * oldOrderInventory.releaseQty
|
|
1241
|
+
|
|
1242
|
+
oldInventory.lockedQty -= targetInventory.releaseQty - targetInventory.pickedQty
|
|
1243
|
+
oldInventory.lockedUomValue =
|
|
1244
|
+
oldInventory.lockedQty * (targetInventory.releaseUomValue / targetInventory.releaseQty)
|
|
1245
|
+
|
|
1246
|
+
newInventory.lockedQty = newInventory.lockedQty + (targetInventory.releaseQty - targetInventory.pickedQty)
|
|
1247
|
+
newInventory.lockedUomValue =
|
|
1248
|
+
(targetInventory.releaseUomValue / targetInventory.releaseQty) * newInventory.lockedQty
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
newInventory = await this.trxMgr.getRepository(Inventory).save({ ...newInventory, updater: this.user })
|
|
1252
|
+
|
|
1253
|
+
newOrderInventory = await this.trxMgr.getRepository(OrderInventory).save({
|
|
1254
|
+
...newOrderInventory,
|
|
1255
|
+
status: INVENTORY_STATUS.PICKING,
|
|
1256
|
+
pickedQty: existingOrderInv.pickedQty++,
|
|
1257
|
+
updater: this.user
|
|
1258
|
+
})
|
|
1259
|
+
|
|
1260
|
+
oldInventory = await this.trxMgr.getRepository(Inventory).save({ ...oldInventory, updater: this.user })
|
|
1261
|
+
|
|
1262
|
+
foundSerialNumber = await this.trxMgr
|
|
1263
|
+
.getRepository(InventoryItem)
|
|
1264
|
+
.save({ ...foundSerialNumber, inventory: newInventory })
|
|
1265
|
+
|
|
1266
|
+
//2. update replacement worksheet detail
|
|
1267
|
+
await this.trxMgr.getRepository(WorksheetDetail).update(
|
|
1268
|
+
{
|
|
1269
|
+
targetInventory: existingOrderInv
|
|
1270
|
+
},
|
|
1271
|
+
{
|
|
1272
|
+
status: WORKSHEET_STATUS.EXECUTING,
|
|
1273
|
+
updater: this.user
|
|
1274
|
+
}
|
|
1275
|
+
)
|
|
1276
|
+
|
|
1277
|
+
if (oldOrderInventory.releaseQty !== 0) {
|
|
1278
|
+
oldOrderInventory = await this.trxMgr
|
|
1279
|
+
.getRepository(OrderInventory)
|
|
1280
|
+
.save({ ...oldOrderInventory, updater: this.user })
|
|
1281
|
+
|
|
1282
|
+
await this.trxMgr.getRepository(WorksheetDetail).update(
|
|
1283
|
+
{
|
|
1284
|
+
name: worksheetDetail.name
|
|
1285
|
+
},
|
|
1286
|
+
{
|
|
1287
|
+
status: WORKSHEET_STATUS.DONE,
|
|
1288
|
+
updater: this.user
|
|
1289
|
+
}
|
|
1290
|
+
)
|
|
1291
|
+
} else {
|
|
1292
|
+
await this.trxMgr.getRepository(WorksheetDetail).delete(worksheetDetail.ild)
|
|
1293
|
+
await this.trxMgr.getRepository(OrderInventory).delete(targetInventory.id)
|
|
1294
|
+
}
|
|
1295
|
+
} catch (e) {}
|
|
1296
|
+
}
|
|
1297
|
+
|
|
1298
|
+
private async serialNumberReplacement(
|
|
1299
|
+
targetInventory,
|
|
1300
|
+
scannedPalletIdInventory,
|
|
1301
|
+
releaseGood,
|
|
1302
|
+
product,
|
|
1303
|
+
worksheetDetail,
|
|
1304
|
+
foundSerialNumber
|
|
1305
|
+
) {
|
|
1306
|
+
try {
|
|
1307
|
+
//1. create new inventory, new order inventory, update old inventory, old order inventory quantity
|
|
1308
|
+
let newInventory: Inventory = await this.trxMgr
|
|
1309
|
+
.getRepository(Inventory)
|
|
1310
|
+
.findOne({ where: { id: scannedPalletIdInventory?.id } })
|
|
1311
|
+
|
|
1312
|
+
let oldInventory: Inventory = await this.trxMgr
|
|
1313
|
+
.getRepository(Inventory)
|
|
1314
|
+
.findOne({ where: { domain: this.domain, id: targetInventory?.inventory.id } })
|
|
1315
|
+
|
|
1316
|
+
let oldOrderInventory: OrderInventory = await this.trxMgr
|
|
1317
|
+
.getRepository(OrderInventory)
|
|
1318
|
+
.findOne({ where: { domain: this.domain, id: targetInventory?.id } })
|
|
1319
|
+
|
|
1320
|
+
let newOrderInventoryReleaseQty = 0
|
|
1321
|
+
let newOrderInventoryReleaseUomValue = 0
|
|
1322
|
+
|
|
1323
|
+
//if replacement inventory quantity insufficient
|
|
1324
|
+
if (newInventory.qty - newInventory.lockedQty < targetInventory.releaseQty - targetInventory.pickedQty) {
|
|
1325
|
+
newOrderInventoryReleaseQty = newInventory.qty - newInventory.lockedQty
|
|
1326
|
+
newOrderInventoryReleaseUomValue = newInventory.uomValue - newInventory.lockedUomValue
|
|
1327
|
+
|
|
1328
|
+
oldOrderInventory.releaseQty -= newOrderInventoryReleaseQty
|
|
1329
|
+
oldOrderInventory.releaseUomValue -= newOrderInventoryReleaseUomValue
|
|
1330
|
+
|
|
1331
|
+
oldInventory.lockedQty -= newOrderInventoryReleaseQty
|
|
1332
|
+
oldInventory.lockedUomValue -= newOrderInventoryReleaseUomValue
|
|
1333
|
+
|
|
1334
|
+
newInventory.lockedQty = newInventory.qty
|
|
1335
|
+
newInventory.lockedUomValue = newInventory.uomValue
|
|
1336
|
+
} else {
|
|
1337
|
+
newOrderInventoryReleaseQty = targetInventory.releaseQty - targetInventory.pickedQty
|
|
1338
|
+
newOrderInventoryReleaseUomValue =
|
|
1339
|
+
newOrderInventoryReleaseQty * (targetInventory.releaseUomValue / targetInventory.releaseQty)
|
|
1340
|
+
|
|
1341
|
+
oldOrderInventory.releaseQty = targetInventory.pickedQty
|
|
1342
|
+
oldOrderInventory.status = ORDER_INVENTORY_STATUS.PICKED
|
|
1343
|
+
oldOrderInventory.releaseUomValue =
|
|
1344
|
+
(targetInventory.releaseUomValue / targetInventory.releaseQty) * oldOrderInventory.releaseQty
|
|
1345
|
+
|
|
1346
|
+
oldInventory.lockedQty -= newOrderInventoryReleaseQty
|
|
1347
|
+
oldInventory.lockedUomValue -= newOrderInventoryReleaseUomValue
|
|
1348
|
+
|
|
1349
|
+
newInventory.lockedQty = newInventory.lockedQty + (targetInventory.releaseQty - targetInventory.pickedQty)
|
|
1350
|
+
newInventory.lockedUomValue =
|
|
1351
|
+
(targetInventory.releaseUomValue / targetInventory.releaseQty) * newInventory.lockedQty
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
newInventory = await this.trxMgr.getRepository(Inventory).save({ ...newInventory, updater: this.user })
|
|
1355
|
+
|
|
1356
|
+
let newTargetInventory = (({ id, ...targetInventory }) => targetInventory)(targetInventory)
|
|
1357
|
+
|
|
1358
|
+
let newOrderInventory = await this.trxMgr.getRepository(OrderInventory).save({
|
|
1359
|
+
...newTargetInventory,
|
|
1360
|
+
domain: this.domain,
|
|
1361
|
+
name: OrderNoGenerator.orderInventory(),
|
|
1362
|
+
releaseGood,
|
|
1363
|
+
releaseQty: newOrderInventoryReleaseQty,
|
|
1364
|
+
releaseUomValue: newOrderInventoryReleaseUomValue,
|
|
1365
|
+
pickedQty: 1,
|
|
1366
|
+
product,
|
|
1367
|
+
inventory: scannedPalletIdInventory,
|
|
1368
|
+
creator: this.user,
|
|
1369
|
+
updater: this.user
|
|
1370
|
+
})
|
|
1371
|
+
|
|
1372
|
+
oldInventory = await this.trxMgr.getRepository(Inventory).save({ ...oldInventory, updater: this.user })
|
|
1373
|
+
|
|
1374
|
+
foundSerialNumber = await this.trxMgr
|
|
1375
|
+
.getRepository(InventoryItem)
|
|
1376
|
+
.save({ ...foundSerialNumber, inventory: newInventory })
|
|
1377
|
+
|
|
1378
|
+
//3. create new worksheet detail
|
|
1379
|
+
let NewWorksheetDetail = (({ id, ...worksheetDetail }) => worksheetDetail)(worksheetDetail)
|
|
1380
|
+
await this.trxMgr.getRepository(WorksheetDetail).save({
|
|
1381
|
+
...NewWorksheetDetail,
|
|
1382
|
+
domain: this.domain,
|
|
1383
|
+
name: WorksheetNoGenerator.pickingDetail(),
|
|
1384
|
+
targetInventory: newOrderInventory,
|
|
1385
|
+
status: WORKSHEET_STATUS.EXECUTING,
|
|
1386
|
+
creator: this.user,
|
|
1387
|
+
updater: this.user
|
|
1388
|
+
})
|
|
1389
|
+
|
|
1390
|
+
//if old order inventory release quantity is 0 then delete
|
|
1391
|
+
if (oldOrderInventory.releaseQty !== 0) {
|
|
1392
|
+
oldOrderInventory = await this.trxMgr
|
|
1393
|
+
.getRepository(OrderInventory)
|
|
1394
|
+
.save({ ...oldOrderInventory, updater: this.user })
|
|
1395
|
+
|
|
1396
|
+
//4. update old worksheet detail
|
|
1397
|
+
worksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).update(
|
|
1398
|
+
{
|
|
1399
|
+
name: worksheetDetail.name
|
|
1400
|
+
},
|
|
1401
|
+
{
|
|
1402
|
+
status: WORKSHEET_STATUS.DONE,
|
|
1403
|
+
updater: this.user
|
|
1404
|
+
}
|
|
1405
|
+
)
|
|
1406
|
+
} else {
|
|
1407
|
+
await this.trxMgr.getRepository(WorksheetDetail).delete(worksheetDetail.id)
|
|
1408
|
+
await this.trxMgr.getRepository(OrderInventory).delete(targetInventory.id)
|
|
1409
|
+
}
|
|
1410
|
+
} catch (e) {}
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
private async toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace) {
|
|
1414
|
+
//1. find tote
|
|
1415
|
+
let foundTote: Tote = await this.trxMgr
|
|
1416
|
+
.getRepository(Tote)
|
|
1417
|
+
.findOne({ where: { bizplace, name: toteNo, deletedAt: IsNull() } })
|
|
1418
|
+
|
|
1419
|
+
if (foundTote?.status == TOTE_STATUS.DAMAGED || foundTote?.status == TOTE_STATUS.DISPATCHED) {
|
|
1420
|
+
foundTote = null
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1423
|
+
//2. find order tote
|
|
1424
|
+
let foundOrderTote: OrderTote = await this.trxMgr
|
|
1425
|
+
.getRepository(OrderTote)
|
|
1426
|
+
.findOne({ where: { domain: this.domain, name: toteNo, releaseGood } })
|
|
1427
|
+
|
|
1428
|
+
//if order tote not found the create one, if tote not found means it's tote box
|
|
1429
|
+
//create order tote item
|
|
1430
|
+
if (!foundOrderTote) {
|
|
1431
|
+
const orderTote = await this.trxMgr.getRepository(OrderTote).save({
|
|
1432
|
+
name: toteNo,
|
|
1433
|
+
domain: this.domain,
|
|
1434
|
+
releaseGood,
|
|
1435
|
+
tote: foundTote ? foundTote : null,
|
|
1436
|
+
updater: this.user
|
|
1437
|
+
})
|
|
1438
|
+
|
|
1439
|
+
const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
|
|
1440
|
+
domain: this.domain,
|
|
1441
|
+
name: OrderNoGenerator.orderToteItem(),
|
|
1442
|
+
orderProduct: targetProduct,
|
|
1443
|
+
orderInventory: targetInventory,
|
|
1444
|
+
orderTote,
|
|
1445
|
+
qty: pickedQty,
|
|
1446
|
+
updater: this.user
|
|
1447
|
+
})
|
|
1448
|
+
} else {
|
|
1449
|
+
if (foundOrderTote.closedDate) {
|
|
1450
|
+
throw new Error('Tote has been sealed, please try another tote!')
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1453
|
+
//if found order tote then check if order tote item exist
|
|
1454
|
+
const foundOrderToteItem: OrderToteItem = await this.trxMgr.getRepository(OrderToteItem).findOne({
|
|
1455
|
+
domain: this.domain,
|
|
1456
|
+
orderProduct: targetProduct,
|
|
1457
|
+
orderInventory: targetInventory,
|
|
1458
|
+
orderTote: foundOrderTote
|
|
1459
|
+
})
|
|
1460
|
+
|
|
1461
|
+
//if not order tote item doesnt exist then create one
|
|
1462
|
+
if (!foundOrderToteItem) {
|
|
1463
|
+
const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
|
|
1464
|
+
domain: this.domain,
|
|
1465
|
+
name: OrderNoGenerator.orderToteItem(),
|
|
1466
|
+
orderProduct: targetProduct,
|
|
1467
|
+
orderInventory: targetInventory,
|
|
1468
|
+
orderTote: foundOrderTote,
|
|
1469
|
+
qty: pickedQty,
|
|
1470
|
+
updater: this.user
|
|
1471
|
+
})
|
|
1472
|
+
} else {
|
|
1473
|
+
//if found order tote item found then add the quantity
|
|
1474
|
+
const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
|
|
1475
|
+
...foundOrderToteItem,
|
|
1476
|
+
qty: foundOrderToteItem.qty + pickedQty
|
|
1477
|
+
})
|
|
1478
|
+
}
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
|
|
1482
|
+
async undoSerialNumberPicking(worksheetDetailName: string, inventoryItemId: string): Promise<void> {
|
|
1483
|
+
const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
|
|
1484
|
+
where: { name: worksheetDetailName, domain: this.domain, status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED)) },
|
|
1485
|
+
relations: [
|
|
1486
|
+
'worksheet',
|
|
1487
|
+
'worksheet.releaseGood',
|
|
1488
|
+
'targetInventory',
|
|
1489
|
+
'targetInventory.product',
|
|
1490
|
+
'targetInventory.inventory'
|
|
1491
|
+
]
|
|
1492
|
+
})
|
|
1493
|
+
|
|
1494
|
+
let targetInventory: OrderInventory = worksheetDetail.targetInventory
|
|
1495
|
+
let releaseGood: ReleaseGood = worksheetDetail.worksheet.releaseGood
|
|
1496
|
+
|
|
1497
|
+
if (
|
|
1498
|
+
targetInventory.releaseQty == targetInventory.pickedQty &&
|
|
1499
|
+
targetInventory.status == ORDER_INVENTORY_STATUS.PICKED
|
|
1500
|
+
) {
|
|
1501
|
+
targetInventory.status = INVENTORY_STATUS.PICKING
|
|
1502
|
+
|
|
1503
|
+
await this.trxMgr
|
|
1504
|
+
.getRepository(WorksheetDetail)
|
|
1505
|
+
.update({ id: worksheetDetail.id }, { status: WORKSHEET_STATUS.EXECUTING })
|
|
1506
|
+
|
|
1507
|
+
targetInventory.inventory.qty += targetInventory.releaseQty
|
|
1508
|
+
targetInventory.inventory.uomValue =
|
|
1509
|
+
Math.round((targetInventory.inventory.uomValue + targetInventory.releaseUomValue) * 100) / 100
|
|
1510
|
+
targetInventory.inventory.lockedQty = targetInventory.inventory.lockedQty + targetInventory.releaseQty
|
|
1511
|
+
targetInventory.inventory.lockedUomValue =
|
|
1512
|
+
Math.round((targetInventory.inventory.lockedUomValue + targetInventory.releaseUomValue) * 100) / 100
|
|
1513
|
+
|
|
1514
|
+
await this.trxMgr.getRepository(Inventory).save(targetInventory.inventory)
|
|
1515
|
+
}
|
|
1516
|
+
|
|
1517
|
+
let InventoryItems: InventoryItem = await this.trxMgr
|
|
1518
|
+
.getRepository(InventoryItem)
|
|
1519
|
+
.find({ where: { outboundOrderId: releaseGood.id } })
|
|
1520
|
+
|
|
1521
|
+
let removeInventoryItem: InventoryItem = await this.trxMgr
|
|
1522
|
+
.getRepository(InventoryItem)
|
|
1523
|
+
.findOne({ where: { id: inventoryItemId } })
|
|
1524
|
+
|
|
1525
|
+
if (InventoryItems.length > 0) {
|
|
1526
|
+
InventoryItems.forEach((itm: InventoryItem) => {
|
|
1527
|
+
itm.status = INVENTORY_STATUS.PICKING
|
|
1528
|
+
itm.updater = this.user
|
|
1529
|
+
})
|
|
1530
|
+
|
|
1531
|
+
await this.trxMgr.getRepository(InventoryItem).save(InventoryItems)
|
|
1532
|
+
}
|
|
1533
|
+
|
|
1534
|
+
if (removeInventoryItem.source == INVENTORY_ITEM_SOURCE.OUTBOUND) {
|
|
1535
|
+
await this.trxMgr.getRepository(InventoryItem).delete(removeInventoryItem.id)
|
|
1536
|
+
} else {
|
|
1537
|
+
await this.trxMgr.getRepository(InventoryItem).update(
|
|
1538
|
+
{
|
|
1539
|
+
id: inventoryItemId
|
|
1540
|
+
},
|
|
1541
|
+
{
|
|
1542
|
+
status: INVENTORY_STATUS.STORED,
|
|
1543
|
+
outboundOrderId: null,
|
|
1544
|
+
updater: this.user
|
|
1545
|
+
}
|
|
1546
|
+
)
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
targetInventory.pickedQty--
|
|
1550
|
+
targetInventory.updater = this.user
|
|
1551
|
+
await this.updateOrderTargets([targetInventory])
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
async sealTote(sealNo: string, toteNo: string, orderNo: string): Promise<void> {
|
|
1555
|
+
const checkDuplicateSeal = await this.trxMgr.getRepository(OrderToteSeal).findOne({
|
|
1556
|
+
where: {
|
|
1557
|
+
name: sealNo
|
|
1558
|
+
}
|
|
1559
|
+
})
|
|
1560
|
+
|
|
1561
|
+
if (checkDuplicateSeal) {
|
|
1562
|
+
throw new Error('Seal has been scanned before')
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
const releaseGood: ReleaseGood = await this.trxMgr
|
|
1566
|
+
.getRepository(ReleaseGood)
|
|
1567
|
+
.findOne({ where: { domain: this.domain, name: orderNo }, relations: ['bizplace', 'bizplace.domain'] })
|
|
1568
|
+
|
|
1569
|
+
let sealNoSetting: Setting = await this.trxMgr.getRepository(Setting).findOne({
|
|
1570
|
+
where: {
|
|
1571
|
+
domain: releaseGood.bizplace.domain,
|
|
1572
|
+
name: 'minimum-seal-number'
|
|
1573
|
+
}
|
|
1574
|
+
})
|
|
1575
|
+
|
|
1576
|
+
if (!sealNoSetting) {
|
|
1577
|
+
sealNoSetting = await this.trxMgr.getRepository(Setting).findOne({
|
|
1578
|
+
where: {
|
|
1579
|
+
domain: this.domain,
|
|
1580
|
+
name: 'minimum-seal-number'
|
|
1581
|
+
}
|
|
1582
|
+
})
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
const foundOrderTote: OrderTote = await this.trxMgr
|
|
1586
|
+
.getRepository(OrderTote)
|
|
1587
|
+
.findOne({ where: { domain: this.domain, name: toteNo, releaseGood } })
|
|
1588
|
+
|
|
1589
|
+
if (!foundOrderTote) {
|
|
1590
|
+
throw new Error('Tote not scanned under this order')
|
|
1591
|
+
}
|
|
1592
|
+
|
|
1593
|
+
let totalOrderToteItems = await this.trxMgr.getRepository(OrderToteItem).count({
|
|
1594
|
+
where: {
|
|
1595
|
+
orderTote: foundOrderTote
|
|
1596
|
+
}
|
|
1597
|
+
})
|
|
1598
|
+
|
|
1599
|
+
if (totalOrderToteItems < 1) {
|
|
1600
|
+
throw new Error('Tote carton is empty')
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
const newToteOrderSeal: OrderToteSeal = await this.trxMgr.getRepository(OrderToteSeal).save({
|
|
1604
|
+
domain: this.domain,
|
|
1605
|
+
name: sealNo,
|
|
1606
|
+
orderTote: foundOrderTote,
|
|
1607
|
+
updater: this.user
|
|
1608
|
+
})
|
|
1609
|
+
|
|
1610
|
+
const totalSeal = await this.trxMgr.getRepository(OrderToteSeal).count({
|
|
1611
|
+
orderTote: foundOrderTote
|
|
1612
|
+
})
|
|
1613
|
+
|
|
1614
|
+
if (totalSeal >= parseInt(sealNoSetting?.value || 0)) {
|
|
1615
|
+
await this.trxMgr.getRepository(OrderTote).save({
|
|
1616
|
+
...foundOrderTote,
|
|
1617
|
+
closedDate: new Date()
|
|
1618
|
+
})
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
992
1621
|
}
|