@things-factory/worksheet-base 5.0.0-alpha.26 → 5.0.0-alpha.29
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/controllers/inbound/unloading-worksheet-controller.js +2 -0
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +166 -8
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +57 -32
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/returning-worksheet-controller.js +7 -1
- package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-grn.js +27 -3
- package/dist-server/controllers/render-grn.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-ro-do.js +65 -1
- package/dist-server/controllers/render-ro-do.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +2 -1
- package/dist-server/controllers/worksheet-controller.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/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/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 +152 -133
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.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/picking-assignment-status-by-user.js +4 -7
- package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.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-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
- 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-picking-worksheet-details.js +4 -2
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.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 +14 -4
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +2 -0
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.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/utils/inventory-util.js +14 -25
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +17 -17
- package/server/controllers/inbound/unloading-worksheet-controller.ts +2 -0
- package/server/controllers/outbound/packing-worksheet-controller.ts +217 -11
- package/server/controllers/outbound/picking-worksheet-controller.ts +66 -34
- package/server/controllers/outbound/returning-worksheet-controller.ts +7 -1
- package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
- package/server/controllers/render-grn.ts +39 -5
- package/server/controllers/render-orientage-do.ts +11 -11
- package/server/controllers/render-orientage-grn.ts +12 -11
- package/server/controllers/render-ro-do.ts +93 -8
- package/server/controllers/worksheet-controller.ts +2 -1
- package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
- 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 +166 -144
- package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
- package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +5 -7
- package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
- package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
- package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
- package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
- package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
- package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
- package/server/graphql/types/worksheet/index.ts +14 -4
- package/server/graphql/types/worksheet/worksheet-detail-info.ts +2 -0
- package/server/graphql/types/worksheet-detail/index.ts +0 -2
- package/server/utils/inventory-util.ts +15 -23
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
import { Equal, Not } from 'typeorm'
|
|
2
|
+
|
|
1
3
|
import { Product, ProductDetail } from '@things-factory/product-base'
|
|
2
4
|
import { ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
3
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
Inventory,
|
|
7
|
+
INVENTORY_ITEM_SOURCE,
|
|
8
|
+
INVENTORY_STATUS,
|
|
9
|
+
INVENTORY_TRANSACTION_TYPE,
|
|
10
|
+
InventoryItem,
|
|
11
|
+
InventoryNoGenerator
|
|
12
|
+
} from '@things-factory/warehouse-base'
|
|
4
13
|
|
|
5
14
|
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
|
|
6
15
|
import { Worksheet, WorksheetDetail } from '../../entities'
|
|
@@ -70,7 +79,7 @@ export class PackingWorksheetController extends VasWorksheetController {
|
|
|
70
79
|
return worksheet
|
|
71
80
|
}
|
|
72
81
|
|
|
73
|
-
async packing(worksheetDetailName: string, packedQty: number): Promise<WorksheetDetail> {
|
|
82
|
+
async packing(worksheetDetailName: string, packedQty: number, serialNumber: string): Promise<WorksheetDetail> {
|
|
74
83
|
let worksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
|
|
75
84
|
worksheetDetailName,
|
|
76
85
|
WORKSHEET_TYPE.PACKING,
|
|
@@ -81,11 +90,13 @@ export class PackingWorksheetController extends VasWorksheetController {
|
|
|
81
90
|
'targetInventory',
|
|
82
91
|
'targetInventory.releaseGood',
|
|
83
92
|
'targetInventory.inventory',
|
|
84
|
-
'targetInventory.inventory.location'
|
|
93
|
+
'targetInventory.inventory.location',
|
|
94
|
+
'targetInventory.product'
|
|
85
95
|
]
|
|
86
96
|
)
|
|
87
97
|
const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
|
|
88
98
|
let targetInventory: OrderInventory = worksheetDetail.targetInventory
|
|
99
|
+
const product: Product = targetInventory.product
|
|
89
100
|
let inventory: Inventory = targetInventory.inventory
|
|
90
101
|
const pickedQty: number = targetInventory.releaseQty
|
|
91
102
|
|
|
@@ -93,19 +104,81 @@ export class PackingWorksheetController extends VasWorksheetController {
|
|
|
93
104
|
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('pack', `packed quantity can't exceed release qty`))
|
|
94
105
|
}
|
|
95
106
|
|
|
96
|
-
|
|
97
|
-
targetInventory
|
|
98
|
-
|
|
107
|
+
// Serial Number scanning for batch picking
|
|
108
|
+
if (targetInventory?.refWorksheetId) {
|
|
109
|
+
if (product?.isRequireSerialNumberScanningOutbound) {
|
|
110
|
+
if (!serialNumber || serialNumber == '') {
|
|
111
|
+
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('packing', `require serial number`))
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let foundSerialNumber: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
|
|
115
|
+
where: { domain: this.domain, serialNumber: serialNumber, product },
|
|
116
|
+
relations: ['product', 'inventory']
|
|
117
|
+
})
|
|
99
118
|
|
|
100
|
-
|
|
119
|
+
if (foundSerialNumber) {
|
|
120
|
+
if (foundSerialNumber.outboundOrderId) {
|
|
121
|
+
let releaseGood: ReleaseGood = await this.trxMgr
|
|
122
|
+
.getRepository(ReleaseGood)
|
|
123
|
+
.findOne({ where: { id: foundSerialNumber.outboundOrderId } })
|
|
124
|
+
throw new Error(`Inventory Item is already picked/packed in ${releaseGood.name}`)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
foundSerialNumber.status = INVENTORY_STATUS.PACKING
|
|
128
|
+
foundSerialNumber.updater = this.user
|
|
129
|
+
foundSerialNumber.outboundOrderId = releaseGood.id
|
|
130
|
+
|
|
131
|
+
await this.trxMgr.getRepository(InventoryItem).save(foundSerialNumber)
|
|
132
|
+
} else {
|
|
133
|
+
let inventoryItem: InventoryItem = new InventoryItem()
|
|
134
|
+
inventoryItem.name = InventoryNoGenerator.inventoryItemName()
|
|
135
|
+
inventoryItem.serialNumber = serialNumber
|
|
136
|
+
inventoryItem.status = INVENTORY_STATUS.PACKING
|
|
137
|
+
inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
|
|
138
|
+
inventoryItem.outboundOrderId = releaseGood.id
|
|
139
|
+
inventoryItem.product = product
|
|
140
|
+
inventoryItem.inventory = inventory
|
|
141
|
+
inventoryItem.domain = this.domain
|
|
142
|
+
|
|
143
|
+
foundSerialNumber = await this.trxMgr.getRepository(InventoryItem).save(inventoryItem)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
targetInventory.packedQty = Boolean(targetInventory.packedQty) ? targetInventory.packedQty + packedQty : packedQty
|
|
149
|
+
if (targetInventory.packedQty == targetInventory.releaseQty) {
|
|
150
|
+
targetInventory.status = ORDER_INVENTORY_STATUS.PACKED
|
|
151
|
+
|
|
152
|
+
let inventoryItems: InventoryItem = await this.trxMgr
|
|
153
|
+
.getRepository(InventoryItem)
|
|
154
|
+
.find({ where: { outboundOrderId: releaseGood.id } })
|
|
155
|
+
|
|
156
|
+
if (inventoryItems.length > 0) {
|
|
157
|
+
inventoryItems.forEach((itm: InventoryItem) => {
|
|
158
|
+
itm.status = INVENTORY_STATUS.PACKED
|
|
159
|
+
itm.updater = this.user
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
await this.transactionInventory(inventory, releaseGood, 0, 0, INVENTORY_TRANSACTION_TYPE.PACKING)
|
|
166
|
+
|
|
167
|
+
worksheetDetail.status = WORKSHEET_STATUS.DONE
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
await this.updateOrderTargets([targetInventory])
|
|
101
171
|
|
|
102
|
-
worksheetDetail.status = WORKSHEET_STATUS.DONE
|
|
103
172
|
worksheetDetail.updater = this.user
|
|
104
173
|
worksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetail)
|
|
105
174
|
return worksheetDetail
|
|
106
175
|
}
|
|
107
176
|
|
|
108
|
-
async scanProductPacking(
|
|
177
|
+
async scanProductPacking(
|
|
178
|
+
worksheetDetailName: string,
|
|
179
|
+
productBarcode: string,
|
|
180
|
+
serialNumber?: string
|
|
181
|
+
): Promise<WorksheetDetail> {
|
|
109
182
|
let worksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
|
|
110
183
|
worksheetDetailName,
|
|
111
184
|
WORKSHEET_TYPE.PACKING,
|
|
@@ -139,15 +212,59 @@ export class PackingWorksheetController extends VasWorksheetController {
|
|
|
139
212
|
)
|
|
140
213
|
if (!productDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
|
|
141
214
|
|
|
215
|
+
// Serial Number scanning for batch picking
|
|
216
|
+
if (targetInventory?.refWorksheetId) {
|
|
217
|
+
if (product?.isRequireSerialNumberScanningOutbound) {
|
|
218
|
+
if (!serialNumber || serialNumber == '') {
|
|
219
|
+
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('packing', `require serial number`))
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
let foundSerialNumber: InventoryItem = await this.trxMgr
|
|
223
|
+
.getRepository(InventoryItem)
|
|
224
|
+
.findOne({ where: { domain: this.domain, serialNumber: serialNumber, product } })
|
|
225
|
+
|
|
226
|
+
if (foundSerialNumber) {
|
|
227
|
+
if (foundSerialNumber.inventoryId !== inventory.id) {
|
|
228
|
+
throw new Error('Serial Number scanned is in another inventory')
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (foundSerialNumber.outboundOrderId) {
|
|
232
|
+
let releaseGood: ReleaseGood = await this.trxMgr
|
|
233
|
+
.getRepository(ReleaseGood)
|
|
234
|
+
.findOne({ where: { id: foundSerialNumber.outboundOrderId } })
|
|
235
|
+
throw new Error(`Inventory Item is already picked/packed in ${releaseGood.name}`)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
foundSerialNumber.status = INVENTORY_STATUS.PACKING
|
|
239
|
+
foundSerialNumber.updater = this.user
|
|
240
|
+
foundSerialNumber.outboundOrderId = releaseGood.id
|
|
241
|
+
|
|
242
|
+
await this.trxMgr.getRepository(InventoryItem).save(foundSerialNumber)
|
|
243
|
+
} else {
|
|
244
|
+
let inventoryItem: InventoryItem = new InventoryItem()
|
|
245
|
+
inventoryItem.name = InventoryNoGenerator.inventoryItemName()
|
|
246
|
+
inventoryItem.serialNumber = serialNumber
|
|
247
|
+
inventoryItem.status = INVENTORY_STATUS.PACKING
|
|
248
|
+
inventoryItem.outboundOrderId = releaseGood.id
|
|
249
|
+
inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
|
|
250
|
+
inventoryItem.product = product
|
|
251
|
+
inventoryItem.inventory = inventory
|
|
252
|
+
inventoryItem.domain = this.domain
|
|
253
|
+
|
|
254
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItem)
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
142
259
|
targetInventory.packedQty = Boolean(targetInventory?.packedQty) ? targetInventory.packedQty + packedQty : packedQty
|
|
143
260
|
if (targetInventory.packedQty > pickedQty) {
|
|
144
261
|
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('pack', `packed quantity can't exceed release qty`))
|
|
145
262
|
}
|
|
146
263
|
|
|
147
264
|
targetInventory.packedAt = new Date()
|
|
148
|
-
targetInventory.packedByUser = this.user
|
|
265
|
+
targetInventory.packedByUser = this.user
|
|
149
266
|
|
|
150
|
-
let packedBy: string[] = targetInventory.packedBy ?
|
|
267
|
+
let packedBy: string[] = targetInventory.packedBy ? targetInventory.packedBy.split(',') : []
|
|
151
268
|
if (!packedBy.find(x => x == this.user.name)) {
|
|
152
269
|
packedBy.push(this.user.name)
|
|
153
270
|
targetInventory.packedBy = packedBy.join(',')
|
|
@@ -161,6 +278,19 @@ export class PackingWorksheetController extends VasWorksheetController {
|
|
|
161
278
|
worksheetDetail.status = WORKSHEET_STATUS.DONE
|
|
162
279
|
worksheetDetail.updater = this.user
|
|
163
280
|
await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetail)
|
|
281
|
+
|
|
282
|
+
let inventoryItems: InventoryItem = await this.trxMgr
|
|
283
|
+
.getRepository(InventoryItem)
|
|
284
|
+
.find({ where: { outboundOrderId: releaseGood.id } })
|
|
285
|
+
|
|
286
|
+
if (inventoryItems.length > 0) {
|
|
287
|
+
inventoryItems.forEach((itm: InventoryItem) => {
|
|
288
|
+
itm.status = INVENTORY_STATUS.PACKED
|
|
289
|
+
itm.updater = this.user
|
|
290
|
+
})
|
|
291
|
+
|
|
292
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
|
|
293
|
+
}
|
|
164
294
|
} else {
|
|
165
295
|
await this.trxMgr.getRepository(OrderInventory).save(targetInventory)
|
|
166
296
|
}
|
|
@@ -181,10 +311,86 @@ export class PackingWorksheetController extends VasWorksheetController {
|
|
|
181
311
|
])
|
|
182
312
|
this.checkRecordValidity(worksheet, { status: WORKSHEET_STATUS.EXECUTING })
|
|
183
313
|
|
|
314
|
+
let inventoryItems: InventoryItem = await this.trxMgr
|
|
315
|
+
.getRepository(InventoryItem)
|
|
316
|
+
.find({ where: { outboundOrderId: releaseGood.id } })
|
|
317
|
+
|
|
318
|
+
if (inventoryItems.length > 0) {
|
|
319
|
+
inventoryItems.forEach((itm: InventoryItem) => {
|
|
320
|
+
itm.status = INVENTORY_STATUS.TERMINATED
|
|
321
|
+
itm.updater = this.user
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
|
|
325
|
+
}
|
|
326
|
+
|
|
184
327
|
let orderStatus: string
|
|
185
328
|
if (releaseGood?.courierOption) orderStatus = ORDER_STATUS.DONE
|
|
186
329
|
else orderStatus = ORDER_STATUS.LOADING
|
|
187
330
|
|
|
188
331
|
return await this.completeWorksheet(worksheet, orderStatus)
|
|
189
332
|
}
|
|
333
|
+
|
|
334
|
+
async undoSerialNumberPacking(worksheetDetailName: string, inventoryItemId: string): Promise<void> {
|
|
335
|
+
const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
|
|
336
|
+
where: { name: worksheetDetailName, domain: this.domain, status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED)) },
|
|
337
|
+
relations: [
|
|
338
|
+
'worksheet',
|
|
339
|
+
'worksheet.releaseGood',
|
|
340
|
+
'targetInventory',
|
|
341
|
+
'targetInventory.product',
|
|
342
|
+
'targetInventory.inventory'
|
|
343
|
+
]
|
|
344
|
+
})
|
|
345
|
+
|
|
346
|
+
let targetInventory: OrderInventory = worksheetDetail.targetInventory
|
|
347
|
+
let releaseGood: ReleaseGood = worksheetDetail.worksheet.releaseGood
|
|
348
|
+
|
|
349
|
+
if (
|
|
350
|
+
targetInventory.releaseQty == targetInventory.packedQty &&
|
|
351
|
+
targetInventory.status == ORDER_INVENTORY_STATUS.PACKED
|
|
352
|
+
) {
|
|
353
|
+
targetInventory.status = INVENTORY_STATUS.PACKING
|
|
354
|
+
|
|
355
|
+
await this.trxMgr
|
|
356
|
+
.getRepository(WorksheetDetail)
|
|
357
|
+
.update({ id: worksheetDetail.id }, { status: WORKSHEET_STATUS.EXECUTING })
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
let inventoryItems: InventoryItem = await this.trxMgr
|
|
361
|
+
.getRepository(InventoryItem)
|
|
362
|
+
.find({ where: { outboundOrderId: releaseGood.id } })
|
|
363
|
+
|
|
364
|
+
let removeInventoryItem: InventoryItem = await this.trxMgr
|
|
365
|
+
.getRepository(InventoryItem)
|
|
366
|
+
.findOne({ where: { id: inventoryItemId } })
|
|
367
|
+
|
|
368
|
+
if (inventoryItems.length > 0) {
|
|
369
|
+
inventoryItems.forEach((itm: InventoryItem) => {
|
|
370
|
+
itm.status = INVENTORY_STATUS.PACKING
|
|
371
|
+
itm.updater = this.user
|
|
372
|
+
})
|
|
373
|
+
|
|
374
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
if (removeInventoryItem.source == INVENTORY_ITEM_SOURCE.OUTBOUND) {
|
|
378
|
+
await this.trxMgr.getRepository(InventoryItem).delete(removeInventoryItem.id)
|
|
379
|
+
} else {
|
|
380
|
+
await this.trxMgr.getRepository(InventoryItem).update(
|
|
381
|
+
{
|
|
382
|
+
id: inventoryItemId
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
status: INVENTORY_STATUS.STORED,
|
|
386
|
+
outboundOrderId: null,
|
|
387
|
+
updater: this.user
|
|
388
|
+
}
|
|
389
|
+
)
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
targetInventory.packedQty--
|
|
393
|
+
targetInventory.updater = this.user
|
|
394
|
+
await this.updateOrderTargets([targetInventory])
|
|
395
|
+
}
|
|
190
396
|
}
|
|
@@ -453,7 +453,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
453
453
|
)
|
|
454
454
|
|
|
455
455
|
pickedQty = await this.getChildQty(productDetails, productBarcode, roProductDetail)
|
|
456
|
-
if (pickedQty > releaseQty) {
|
|
456
|
+
if (pickedQty + targetInventory.pickedQty > releaseQty) {
|
|
457
457
|
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
|
|
458
458
|
}
|
|
459
459
|
} else if (!foundProductDetail) {
|
|
@@ -468,7 +468,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
468
468
|
let totalInventoryItems = await this.trxMgr.getRepository(InventoryItem).count({
|
|
469
469
|
where: {
|
|
470
470
|
inventory,
|
|
471
|
-
status: Not(
|
|
471
|
+
status: Not(In([INVENTORY_STATUS.TERMINATED, INVENTORY_STATUS.PICKED]))
|
|
472
472
|
}
|
|
473
473
|
})
|
|
474
474
|
|
|
@@ -481,24 +481,27 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
481
481
|
throw new Error('Serial Number scanned is in another inventory')
|
|
482
482
|
}
|
|
483
483
|
|
|
484
|
-
if (foundSerialNumber.
|
|
485
|
-
|
|
484
|
+
if (foundSerialNumber.outboundOrderId) {
|
|
485
|
+
let releaseGood: ReleaseGood = await this.trxMgr
|
|
486
|
+
.getRepository(ReleaseGood)
|
|
487
|
+
.findOne({ where: { id: foundSerialNumber.outboundOrderId } })
|
|
488
|
+
throw new Error(`Inventory Item is already picked in ${releaseGood.name}`)
|
|
486
489
|
}
|
|
487
490
|
|
|
488
|
-
foundSerialNumber.status = INVENTORY_STATUS.
|
|
491
|
+
foundSerialNumber.status = INVENTORY_STATUS.PICKING
|
|
489
492
|
foundSerialNumber.updater = this.user
|
|
490
493
|
foundSerialNumber.outboundOrderId = releaseGood.id
|
|
491
494
|
|
|
492
495
|
await this.trxMgr.getRepository(InventoryItem).save(foundSerialNumber)
|
|
493
496
|
} else {
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
+
if (totalInventoryItems >= inventory.qty) {
|
|
498
|
+
throw new Error('Insufficient inventory quantity to scan new serial number')
|
|
499
|
+
}
|
|
497
500
|
|
|
498
501
|
let inventoryItem: InventoryItem = new InventoryItem()
|
|
499
502
|
inventoryItem.name = InventoryNoGenerator.inventoryItemName()
|
|
500
503
|
inventoryItem.serialNumber = serialNumber
|
|
501
|
-
inventoryItem.status = INVENTORY_STATUS.
|
|
504
|
+
inventoryItem.status = INVENTORY_STATUS.PICKING
|
|
502
505
|
inventoryItem.outboundOrderId = releaseGood.id
|
|
503
506
|
inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
|
|
504
507
|
inventoryItem.product = product
|
|
@@ -552,8 +555,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
552
555
|
//validation to prevent over release
|
|
553
556
|
if (inventory.qty <= 0) throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
|
|
554
557
|
|
|
555
|
-
if (inventory.palletId !== palletId
|
|
556
|
-
//to be changed
|
|
558
|
+
if (inventory.palletId !== palletId && !product?.isRequireSerialNumberScanningOutbound)
|
|
557
559
|
throw new Error(this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('Pallet ID', palletId, inventory.palletId))
|
|
558
560
|
|
|
559
561
|
if (product?.isRequireSerialNumberScanningOutbound) {
|
|
@@ -563,7 +565,8 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
563
565
|
|
|
564
566
|
let totalInventoryItems = await this.trxMgr.getRepository(InventoryItem).count({
|
|
565
567
|
where: {
|
|
566
|
-
inventory
|
|
568
|
+
inventory,
|
|
569
|
+
status: Not(In([INVENTORY_STATUS.TERMINATED, INVENTORY_STATUS.PICKED]))
|
|
567
570
|
}
|
|
568
571
|
})
|
|
569
572
|
|
|
@@ -577,16 +580,14 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
577
580
|
.findOne({ where: { domain: this.domain, palletId }, relations: ['product'] })
|
|
578
581
|
|
|
579
582
|
if (foundSerialNumber) {
|
|
580
|
-
if (
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
) {
|
|
586
|
-
throw new Error('Inventory Item is not available')
|
|
583
|
+
if (foundSerialNumber.outboundOrderId) {
|
|
584
|
+
let releaseGood: ReleaseGood = await this.trxMgr
|
|
585
|
+
.getRepository(ReleaseGood)
|
|
586
|
+
.findOne({ where: { id: foundSerialNumber.outboundOrderId } })
|
|
587
|
+
throw new Error(`Inventory Item is already picked in ${releaseGood.name}`)
|
|
587
588
|
}
|
|
588
589
|
|
|
589
|
-
foundSerialNumber.status = INVENTORY_STATUS.
|
|
590
|
+
foundSerialNumber.status = INVENTORY_STATUS.PICKING
|
|
590
591
|
foundSerialNumber.updater = this.user
|
|
591
592
|
foundSerialNumber.outboundOrderId = releaseGood.id
|
|
592
593
|
|
|
@@ -599,13 +600,14 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
599
600
|
let inventoryItem: InventoryItem = new InventoryItem()
|
|
600
601
|
inventoryItem.name = InventoryNoGenerator.inventoryItemName()
|
|
601
602
|
inventoryItem.serialNumber = serialNumber
|
|
602
|
-
inventoryItem.status = INVENTORY_STATUS.
|
|
603
|
+
inventoryItem.status = INVENTORY_STATUS.PICKING
|
|
604
|
+
inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
|
|
603
605
|
inventoryItem.outboundOrderId = releaseGood.id
|
|
604
606
|
inventoryItem.product = product
|
|
605
607
|
inventoryItem.inventory = scannedPalletIdInventory
|
|
606
608
|
inventoryItem.domain = this.domain
|
|
607
609
|
|
|
608
|
-
await this.trxMgr.getRepository(InventoryItem).save(inventoryItem)
|
|
610
|
+
foundSerialNumber = await this.trxMgr.getRepository(InventoryItem).save(inventoryItem)
|
|
609
611
|
}
|
|
610
612
|
|
|
611
613
|
if (inventory.palletId !== palletId) {
|
|
@@ -645,10 +647,10 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
645
647
|
}
|
|
646
648
|
}
|
|
647
649
|
|
|
648
|
-
await this.updatePickingTransaction(releaseGood, targetInventory, worksheetDetail, inventory, pickedQty)
|
|
649
|
-
|
|
650
650
|
targetInventory = await this.checkAndSetBinPicking(targetInventory, binLocation)
|
|
651
651
|
|
|
652
|
+
await this.updatePickingTransaction(releaseGood, targetInventory, worksheetDetail, inventory, pickedQty)
|
|
653
|
+
|
|
652
654
|
const fromLocation: Location = targetInventory.inventory.location
|
|
653
655
|
if (locationName) {
|
|
654
656
|
const toLocation: Location = await this.trxMgr.getRepository(Location).findOne({
|
|
@@ -951,12 +953,12 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
951
953
|
])
|
|
952
954
|
await this.checkRecordValidity(worksheet, { status: WORKSHEET_STATUS.EXECUTING })
|
|
953
955
|
|
|
954
|
-
let
|
|
956
|
+
let inventoryItems: InventoryItem = await this.trxMgr
|
|
955
957
|
.getRepository(InventoryItem)
|
|
956
958
|
.find({ where: { outboundOrderId: releaseGood.id } })
|
|
957
959
|
|
|
958
|
-
if (
|
|
959
|
-
|
|
960
|
+
if (inventoryItems.length > 0) {
|
|
961
|
+
inventoryItems.forEach((itm: InventoryItem) => {
|
|
960
962
|
itm.status = INVENTORY_STATUS.TERMINATED
|
|
961
963
|
itm.updater = this.user
|
|
962
964
|
})
|
|
@@ -970,7 +972,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
970
972
|
// this.transactionInventory(itm, releaseGood, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
|
|
971
973
|
// })
|
|
972
974
|
|
|
973
|
-
await this.trxMgr.getRepository(InventoryItem).save(
|
|
975
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
|
|
974
976
|
}
|
|
975
977
|
|
|
976
978
|
let orderStatus: string
|
|
@@ -1123,6 +1125,19 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1123
1125
|
worksheetDetail.updater = this.user
|
|
1124
1126
|
await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetail)
|
|
1125
1127
|
|
|
1128
|
+
let inventoryItems: InventoryItem = await this.trxMgr
|
|
1129
|
+
.getRepository(InventoryItem)
|
|
1130
|
+
.find({ where: { outboundOrderId: releaseGood.id } })
|
|
1131
|
+
|
|
1132
|
+
if (inventoryItems.length > 0) {
|
|
1133
|
+
inventoryItems.forEach((itm: InventoryItem) => {
|
|
1134
|
+
itm.status = INVENTORY_STATUS.PICKED
|
|
1135
|
+
itm.updater = this.user
|
|
1136
|
+
})
|
|
1137
|
+
|
|
1138
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1126
1141
|
if (leftQty === 0) {
|
|
1127
1142
|
inventory.status = INVENTORY_STATUS.TERMINATED
|
|
1128
1143
|
await this.transactionInventory(inventory, releaseGood, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
|
|
@@ -1177,7 +1192,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1177
1192
|
newOrderInventory.releaseQty * (targetInventory.releaseUomValue / targetInventory.releaseQty)
|
|
1178
1193
|
|
|
1179
1194
|
oldOrderInventory.releaseQty = targetInventory.pickedQty
|
|
1180
|
-
oldOrderInventory.status =
|
|
1195
|
+
oldOrderInventory.status = ORDER_INVENTORY_STATUS.PICKED
|
|
1181
1196
|
oldOrderInventory.releaseUomValue =
|
|
1182
1197
|
(targetInventory.releaseUomValue / targetInventory.releaseQty) * oldOrderInventory.releaseQty
|
|
1183
1198
|
|
|
@@ -1231,8 +1246,8 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1231
1246
|
}
|
|
1232
1247
|
)
|
|
1233
1248
|
} else {
|
|
1234
|
-
await this.trxMgr.getRepository(OrderInventory).delete(targetInventory.id)
|
|
1235
1249
|
await this.trxMgr.getRepository(WorksheetDetail).delete(worksheetDetail.ild)
|
|
1250
|
+
await this.trxMgr.getRepository(OrderInventory).delete(targetInventory.id)
|
|
1236
1251
|
}
|
|
1237
1252
|
} catch (e) {}
|
|
1238
1253
|
}
|
|
@@ -1281,7 +1296,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1281
1296
|
newOrderInventoryReleaseQty * (targetInventory.releaseUomValue / targetInventory.releaseQty)
|
|
1282
1297
|
|
|
1283
1298
|
oldOrderInventory.releaseQty = targetInventory.pickedQty
|
|
1284
|
-
oldOrderInventory.status =
|
|
1299
|
+
oldOrderInventory.status = ORDER_INVENTORY_STATUS.PICKED
|
|
1285
1300
|
oldOrderInventory.releaseUomValue =
|
|
1286
1301
|
(targetInventory.releaseUomValue / targetInventory.releaseQty) * oldOrderInventory.releaseQty
|
|
1287
1302
|
|
|
@@ -1346,8 +1361,8 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1346
1361
|
}
|
|
1347
1362
|
)
|
|
1348
1363
|
} else {
|
|
1349
|
-
await this.trxMgr.getRepository(OrderInventory).delete(targetInventory.id)
|
|
1350
1364
|
await this.trxMgr.getRepository(WorksheetDetail).delete(worksheetDetail.id)
|
|
1365
|
+
await this.trxMgr.getRepository(OrderInventory).delete(targetInventory.id)
|
|
1351
1366
|
}
|
|
1352
1367
|
} catch (e) {}
|
|
1353
1368
|
}
|
|
@@ -1365,8 +1380,12 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1365
1380
|
})
|
|
1366
1381
|
|
|
1367
1382
|
let targetInventory: OrderInventory = worksheetDetail.targetInventory
|
|
1383
|
+
let releaseGood: ReleaseGood = worksheetDetail.worksheet.releaseGood
|
|
1368
1384
|
|
|
1369
|
-
if (
|
|
1385
|
+
if (
|
|
1386
|
+
targetInventory.releaseQty == targetInventory.pickedQty &&
|
|
1387
|
+
targetInventory.status == ORDER_INVENTORY_STATUS.PICKED
|
|
1388
|
+
) {
|
|
1370
1389
|
targetInventory.status = INVENTORY_STATUS.PICKING
|
|
1371
1390
|
|
|
1372
1391
|
await this.trxMgr
|
|
@@ -1383,11 +1402,24 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1383
1402
|
await this.trxMgr.getRepository(Inventory).save(targetInventory.inventory)
|
|
1384
1403
|
}
|
|
1385
1404
|
|
|
1405
|
+
let InventoryItems: InventoryItem = await this.trxMgr
|
|
1406
|
+
.getRepository(InventoryItem)
|
|
1407
|
+
.find({ where: { outboundOrderId: releaseGood.id } })
|
|
1408
|
+
|
|
1386
1409
|
let removeInventoryItem: InventoryItem = await this.trxMgr
|
|
1387
1410
|
.getRepository(InventoryItem)
|
|
1388
1411
|
.findOne({ where: { id: inventoryItemId } })
|
|
1389
1412
|
|
|
1390
|
-
if (
|
|
1413
|
+
if (InventoryItems.length > 0) {
|
|
1414
|
+
InventoryItems.forEach((itm: InventoryItem) => {
|
|
1415
|
+
itm.status = INVENTORY_STATUS.PICKING
|
|
1416
|
+
itm.updater = this.user
|
|
1417
|
+
})
|
|
1418
|
+
|
|
1419
|
+
await this.trxMgr.getRepository(InventoryItem).save(InventoryItems)
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
if (removeInventoryItem.source == INVENTORY_ITEM_SOURCE.OUTBOUND) {
|
|
1391
1423
|
await this.trxMgr.getRepository(InventoryItem).delete(removeInventoryItem.id)
|
|
1392
1424
|
} else {
|
|
1393
1425
|
await this.trxMgr.getRepository(InventoryItem).update(
|
|
@@ -167,7 +167,13 @@ export class ReturningWorksheetController extends VasWorksheetController {
|
|
|
167
167
|
where: {
|
|
168
168
|
domain: this.domain,
|
|
169
169
|
name: toLocationName,
|
|
170
|
-
type: In([
|
|
170
|
+
type: In([
|
|
171
|
+
LOCATION_TYPE.SHELF,
|
|
172
|
+
LOCATION_TYPE.BUFFER,
|
|
173
|
+
LOCATION_TYPE.FLOOR,
|
|
174
|
+
LOCATION_TYPE.BIN,
|
|
175
|
+
LOCATION_TYPE.QUARANTINE
|
|
176
|
+
])
|
|
171
177
|
},
|
|
172
178
|
relations: ['warehouse']
|
|
173
179
|
})
|