@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.
Files changed (87) hide show
  1. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +2 -0
  2. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/packing-worksheet-controller.js +166 -8
  4. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/picking-worksheet-controller.js +57 -32
  6. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/returning-worksheet-controller.js +7 -1
  8. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
  10. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/render-grn.js +27 -3
  12. package/dist-server/controllers/render-grn.js.map +1 -1
  13. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  14. package/dist-server/controllers/render-orientage-grn.js +1 -0
  15. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  16. package/dist-server/controllers/render-ro-do.js +65 -1
  17. package/dist-server/controllers/render-ro-do.js.map +1 -1
  18. package/dist-server/controllers/worksheet-controller.js +2 -1
  19. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  20. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
  21. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
  22. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
  23. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  24. package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
  25. package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
  26. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
  27. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  28. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
  29. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  30. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
  31. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
  32. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -133
  33. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  34. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
  35. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +4 -7
  37. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  39. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  40. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  41. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
  43. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
  45. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  46. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
  47. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  48. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
  49. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
  50. package/dist-server/graphql/types/worksheet/index.js +14 -4
  51. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  52. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +2 -0
  53. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  54. package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
  55. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  56. package/dist-server/utils/inventory-util.js +14 -25
  57. package/dist-server/utils/inventory-util.js.map +1 -1
  58. package/package.json +17 -17
  59. package/server/controllers/inbound/unloading-worksheet-controller.ts +2 -0
  60. package/server/controllers/outbound/packing-worksheet-controller.ts +217 -11
  61. package/server/controllers/outbound/picking-worksheet-controller.ts +66 -34
  62. package/server/controllers/outbound/returning-worksheet-controller.ts +7 -1
  63. package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
  64. package/server/controllers/render-grn.ts +39 -5
  65. package/server/controllers/render-orientage-do.ts +11 -11
  66. package/server/controllers/render-orientage-grn.ts +12 -11
  67. package/server/controllers/render-ro-do.ts +93 -8
  68. package/server/controllers/worksheet-controller.ts +2 -1
  69. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
  70. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
  71. package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
  72. package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
  73. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
  74. package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
  75. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +166 -144
  76. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
  77. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +5 -7
  78. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  79. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  80. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
  81. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
  82. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
  83. package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
  84. package/server/graphql/types/worksheet/index.ts +14 -4
  85. package/server/graphql/types/worksheet/worksheet-detail-info.ts +2 -0
  86. package/server/graphql/types/worksheet-detail/index.ts +0 -2
  87. 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 { Inventory, INVENTORY_TRANSACTION_TYPE } from '@things-factory/warehouse-base'
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
- targetInventory.packedQty = packedQty
97
- targetInventory.status = ORDER_INVENTORY_STATUS.PACKED
98
- await this.updateOrderTargets([targetInventory])
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
- await this.transactionInventory(inventory, releaseGood, 0, 0, INVENTORY_TRANSACTION_TYPE.PACKING)
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(worksheetDetailName: string, productBarcode: string): Promise<WorksheetDetail> {
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 ? (targetInventory.packedBy).split(',') : []
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(Equal(INVENTORY_STATUS.TERMINATED))
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.status !== INVENTORY_STATUS.STORED || foundSerialNumber.outboundOrderId) {
485
- throw new Error('Inventory Item is not available')
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.PICKED
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
- // if (totalInventoryItems >= inventory.qty) {
495
- // throw new Error('Insufficient inventory quantity to scan new serial number')
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.PICKED
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 /*&& !product?.isRequireSerialNumberScanningOutbound*/)
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
- foundSerialNumber.status !== INVENTORY_STATUS.STORED ||
582
- foundSerialNumber.outboundOrderId ||
583
- foundSerialNumber.inventory !== inventory
584
- /*to be changed for replacement && inventory.palletId == palletId*/
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.PICKED
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.PICKED
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 InventoryItems: InventoryItem = await this.trxMgr
956
+ let inventoryItems: InventoryItem = await this.trxMgr
955
957
  .getRepository(InventoryItem)
956
958
  .find({ where: { outboundOrderId: releaseGood.id } })
957
959
 
958
- if (InventoryItems.length > 0) {
959
- InventoryItems.forEach((itm: InventoryItem) => {
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(InventoryItems)
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 = INVENTORY_STATUS.PICKED
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 = INVENTORY_STATUS.PICKED
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 (targetInventory.releaseQty == targetInventory.pickedQty && targetInventory.status == INVENTORY_STATUS.PICKED) {
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 (removeInventoryItem.source == 'OUTBOUND') {
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([LOCATION_TYPE.SHELF, LOCATION_TYPE.BUFFER, LOCATION_TYPE.FLOOR, LOCATION_TYPE.BIN])
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
  })