@things-factory/worksheet-base 5.0.0-alpha.50 → 5.0.0-alpha.53

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 (142) hide show
  1. package/dist-server/controllers/ecommerce/sellercraft-controller.js +15 -7
  2. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  3. package/dist-server/controllers/inbound/putaway-worksheet-controller.js +22 -13
  4. package/dist-server/controllers/inbound/putaway-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +1 -1
  6. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/loading-worksheet-controller.js +47 -10
  8. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/outbound/picking-worksheet-controller.js +148 -7
  10. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +116 -20
  12. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/render-grn.js +35 -27
  14. package/dist-server/controllers/render-grn.js.map +1 -1
  15. package/dist-server/controllers/render-manifest.js +12 -5
  16. package/dist-server/controllers/render-manifest.js.map +1 -1
  17. package/dist-server/controllers/worksheet-controller.js +8 -1
  18. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  19. package/dist-server/entities/index.js +2 -1
  20. package/dist-server/entities/index.js.map +1 -1
  21. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js +174 -0
  22. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js.map +1 -0
  23. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js +14 -1
  24. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js.map +1 -1
  25. package/dist-server/graphql/resolvers/worksheet/cancel-draft-release-order.js +17 -0
  26. package/dist-server/graphql/resolvers/worksheet/cancel-draft-release-order.js.map +1 -0
  27. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +2 -1
  28. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
  29. package/dist-server/graphql/resolvers/worksheet/index.js +2 -1
  30. package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +40 -18
  32. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/loading/loading.js +3 -10
  34. package/dist-server/graphql/resolvers/worksheet/loading/loading.js.map +1 -1
  35. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +55 -21
  36. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +1 -0
  38. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  39. package/dist-server/graphql/resolvers/worksheet/palletizing-pallets.js +2 -5
  40. package/dist-server/graphql/resolvers/worksheet/palletizing-pallets.js.map +1 -1
  41. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  43. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +8 -6
  44. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  45. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  46. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  47. package/dist-server/graphql/resolvers/worksheet/picking/picking.js +4 -4
  48. package/dist-server/graphql/resolvers/worksheet/picking/picking.js.map +1 -1
  49. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js +4 -4
  50. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js.map +1 -1
  51. package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js +15 -0
  52. package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js.map +1 -0
  53. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +10 -1
  54. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  55. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js +36 -0
  56. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js.map +1 -1
  57. package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js +11 -6
  58. package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js.map +1 -1
  59. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  60. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  61. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  62. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  63. package/dist-server/graphql/resolvers/worksheet/unloading/complete-unloading.js +0 -21
  64. package/dist-server/graphql/resolvers/worksheet/unloading/complete-unloading.js.map +1 -1
  65. package/dist-server/graphql/resolvers/worksheet/worksheet.js +2 -0
  66. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  67. package/dist-server/graphql/resolvers/worksheet/worksheets.js +19 -4
  68. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  69. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +9 -3
  70. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  71. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js +19 -4
  72. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js.map +1 -1
  73. package/dist-server/graphql/resolvers/worksheet-detail/generate-pallet-id.js +24 -34
  74. package/dist-server/graphql/resolvers/worksheet-detail/generate-pallet-id.js.map +1 -1
  75. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +8 -1
  76. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  77. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js +10 -2
  78. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js.map +1 -1
  79. package/dist-server/graphql/resolvers/worksheet-movement/create-worksheet-movement.js +2 -5
  80. package/dist-server/graphql/resolvers/worksheet-movement/create-worksheet-movement.js.map +1 -1
  81. package/dist-server/graphql/types/worksheet/index.js +14 -0
  82. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  83. package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js +1 -0
  84. package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js.map +1 -1
  85. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +2 -0
  86. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  87. package/dist-server/graphql/types/worksheet/worksheet-info.js +2 -0
  88. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  89. package/dist-server/graphql/types/worksheet/worksheet.js +1 -0
  90. package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
  91. package/dist-server/graphql/types/worksheet-detail/inventory-detail.js +3 -0
  92. package/dist-server/graphql/types/worksheet-detail/inventory-detail.js.map +1 -1
  93. package/dist-server/utils/worksheet-no-generator.js +25 -28
  94. package/dist-server/utils/worksheet-no-generator.js.map +1 -1
  95. package/package.json +17 -17
  96. package/server/controllers/ecommerce/sellercraft-controller.ts +28 -7
  97. package/server/controllers/inbound/putaway-worksheet-controller.ts +27 -13
  98. package/server/controllers/inbound/unloading-worksheet-controller.ts +1 -1
  99. package/server/controllers/outbound/loading-worksheet-controller.ts +83 -17
  100. package/server/controllers/outbound/picking-worksheet-controller.ts +189 -9
  101. package/server/controllers/outbound/sorting-worksheet-controller.ts +167 -27
  102. package/server/controllers/render-grn.ts +46 -37
  103. package/server/controllers/render-manifest.ts +12 -5
  104. package/server/controllers/worksheet-controller.ts +14 -1
  105. package/server/entities/index.ts +2 -1
  106. package/server/entities/warehouse-bizplace-onhand-inventory.ts +147 -0
  107. package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +14 -0
  108. package/server/graphql/resolvers/worksheet/cancel-draft-release-order.ts +27 -0
  109. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +2 -1
  110. package/server/graphql/resolvers/worksheet/index.ts +3 -1
  111. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +44 -18
  112. package/server/graphql/resolvers/worksheet/loading/loading.ts +5 -12
  113. package/server/graphql/resolvers/worksheet/loading-worksheet.ts +66 -13
  114. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +1 -1
  115. package/server/graphql/resolvers/worksheet/palletizing-pallets.ts +2 -2
  116. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +1 -1
  117. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +13 -11
  118. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  119. package/server/graphql/resolvers/worksheet/picking/picking.ts +30 -4
  120. package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
  121. package/server/graphql/resolvers/worksheet/picking/seal-tote.ts +25 -0
  122. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +13 -2
  123. package/server/graphql/resolvers/worksheet/putaway/complete-putaway.ts +45 -2
  124. package/server/graphql/resolvers/worksheet/sorting/complete-order-sorting.ts +13 -9
  125. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  126. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  127. package/server/graphql/resolvers/worksheet/unloading/complete-unloading.ts +0 -25
  128. package/server/graphql/resolvers/worksheet/worksheet.ts +2 -0
  129. package/server/graphql/resolvers/worksheet/worksheets.ts +28 -4
  130. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +21 -3
  131. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.ts +39 -11
  132. package/server/graphql/resolvers/worksheet-detail/generate-pallet-id.ts +46 -49
  133. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +11 -1
  134. package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +18 -1
  135. package/server/graphql/resolvers/worksheet-movement/create-worksheet-movement.ts +2 -2
  136. package/server/graphql/types/worksheet/index.ts +14 -0
  137. package/server/graphql/types/worksheet/loaded-worksheet-detail.ts +1 -0
  138. package/server/graphql/types/worksheet/worksheet-detail-info.ts +2 -0
  139. package/server/graphql/types/worksheet/worksheet-info.ts +2 -0
  140. package/server/graphql/types/worksheet/worksheet.ts +1 -0
  141. package/server/graphql/types/worksheet-detail/inventory-detail.ts +3 -0
  142. package/server/utils/worksheet-no-generator.ts +25 -25
@@ -1,4 +1,4 @@
1
- import { Equal, Not } from 'typeorm'
1
+ import { Equal, Not, In } from 'typeorm'
2
2
 
3
3
  import { Bizplace } from '@things-factory/biz-base'
4
4
  import {
@@ -8,9 +8,11 @@ import {
8
8
  ORDER_TYPES,
9
9
  OrderInventory,
10
10
  OrderNoGenerator,
11
- ReleaseGood
11
+ ReleaseGood,
12
+ OrderToteItem,
13
+ OrderTote
12
14
  } from '@things-factory/sales-base'
13
- import { Inventory, INVENTORY_TRANSACTION_TYPE } from '@things-factory/warehouse-base'
15
+ import { Inventory, INVENTORY_TRANSACTION_TYPE, Tote, TOTE_STATUS } from '@things-factory/warehouse-base'
14
16
 
15
17
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
16
18
  import { Worksheet, WorksheetDetail } from '../../entities'
@@ -95,8 +97,8 @@ export class LoadingWorksheetController extends VasWorksheetController {
95
97
 
96
98
  async loading(
97
99
  releaseGoodNo: string,
98
- worksheetDetails: Partial<WorksheetDetail & { loadedQty: number }>[]
99
- ): Promise<void> {
100
+ worksheetDetails: Partial<WorksheetDetail & { loadedQty: number } & { toteName: string }>[]
101
+ ): Promise<any> {
100
102
  const releaseGood: ReleaseGood = await this.findRefOrder(
101
103
  ReleaseGood,
102
104
  { domain: this.domain, name: releaseGoodNo },
@@ -104,14 +106,14 @@ export class LoadingWorksheetController extends VasWorksheetController {
104
106
  )
105
107
  const bizplace: Bizplace = releaseGood.bizplace
106
108
 
107
- for (let worksheetDetail of worksheetDetails) {
108
- const loadedQty: number = worksheetDetail.loadedQty
109
- worksheetDetail = await this.findExecutableWorksheetDetailByName(worksheetDetail.name, WORKSHEET_TYPE.LOADING, [
110
- 'worksheet',
111
- 'targetInventory',
112
- 'targetInventory.inventory',
113
- 'targetInventory.product'
114
- ])
109
+ for (let i = 0; i < worksheetDetails.length; i++) {
110
+ const loadedQty: number = worksheetDetails[i].loadedQty
111
+ const toteName: string = worksheetDetails[i].toteName
112
+ let worksheetDetail = await this.findExecutableWorksheetDetailByName(
113
+ worksheetDetails[i].name,
114
+ WORKSHEET_TYPE.LOADING,
115
+ ['worksheet', 'targetInventory', 'targetInventory.inventory', 'targetInventory.product']
116
+ )
115
117
 
116
118
  const worksheet: Worksheet = worksheetDetail.worksheet
117
119
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
@@ -119,9 +121,9 @@ export class LoadingWorksheetController extends VasWorksheetController {
119
121
  let inventory: Inventory = targetInventory.inventory
120
122
 
121
123
  targetInventory.loadedAt = new Date()
122
- targetInventory.loadedByUser = this.user;
124
+ targetInventory.loadedByUser = this.user
123
125
 
124
- let loadedBy: string[] = targetInventory.loadedBy ? (targetInventory.loadedBy).split(',') : []
126
+ let loadedBy: string[] = targetInventory.loadedBy ? targetInventory.loadedBy.split(',') : []
125
127
  if (!loadedBy.find(x => x == this.user.name)) {
126
128
  loadedBy.push(this.user.name)
127
129
  targetInventory.loadedBy = loadedBy.join(',')
@@ -174,11 +176,56 @@ export class LoadingWorksheetController extends VasWorksheetController {
174
176
  newTargetInventory.updater = this.user
175
177
  newTargetInventory = await this.trxMgr.getRepository(OrderInventory).save(newTargetInventory)
176
178
 
177
- await this.createWorksheetDetails(worksheet, WORKSHEET_TYPE.LOADING, [newTargetInventory], {
178
- status: WORKSHEET_STATUS.EXECUTING
179
+ if (toteName) {
180
+ let foundOrderTote = await this.trxMgr
181
+ .getRepository(OrderTote)
182
+ .findOne({ where: { name: toteName, releaseGood } })
183
+
184
+ let foundOrderToteItems = await this.trxMgr
185
+ .getRepository(OrderToteItem)
186
+ .find({ where: { orderInventory: targetInventory.id } })
187
+
188
+ let foundOrderToteItemIds = foundOrderToteItems.map((itm: OrderToteItem) => itm.id)
189
+
190
+ await this.trxMgr
191
+ .getRepository(OrderToteItem)
192
+ .update({ id: In(foundOrderToteItemIds) }, { orderInventory: newTargetInventory })
193
+
194
+ let foundOrderToteItem: OrderToteItem = await this.trxMgr
195
+ .getRepository(OrderToteItem)
196
+ .findOne({ where: { orderInventory: newTargetInventory.id, orderTote: foundOrderTote, qty: loadedQty } })
197
+
198
+ await this.trxMgr
199
+ .getRepository(OrderToteItem)
200
+ .update({ id: foundOrderToteItem.id }, { orderInventory: targetInventory.id })
201
+ }
202
+
203
+ let newWorksheetDetail: any = await this.createWorksheetDetails(
204
+ worksheet,
205
+ WORKSHEET_TYPE.LOADING,
206
+ [newTargetInventory],
207
+ {
208
+ status: WORKSHEET_STATUS.EXECUTING
209
+ }
210
+ )
211
+
212
+ let worksheetDetailName = worksheetDetails[i].name
213
+ worksheetDetails = worksheetDetails.map(record => {
214
+ if (record.name == worksheetDetailName && !record?.targetInventory) {
215
+ return {
216
+ ...record,
217
+ name: newWorksheetDetail[0].name
218
+ }
219
+ } else {
220
+ return record
221
+ }
179
222
  })
223
+
224
+ worksheetDetails[i].name = worksheetDetailName
180
225
  }
181
226
 
227
+ worksheetDetails[i].targetInventory = targetInventory
228
+
182
229
  await generateInventoryHistory(
183
230
  inventory,
184
231
  releaseGood,
@@ -189,6 +236,8 @@ export class LoadingWorksheetController extends VasWorksheetController {
189
236
  this.trxMgr
190
237
  )
191
238
  }
239
+
240
+ return worksheetDetails
192
241
  }
193
242
 
194
243
  async undoLoading(deliveryOrder: Partial<DeliveryOrder>, palletIds: string[]): Promise<void> {
@@ -228,6 +277,10 @@ export class LoadingWorksheetController extends VasWorksheetController {
228
277
  }
229
278
  })
230
279
 
280
+ let undoOrderToteItem: OrderToteItem = await this.trxMgr
281
+ .getRepository(OrderToteItem)
282
+ .findOne({ where: { orderInventory: undoTargetOrderInventory } })
283
+
231
284
  if (prevTargetInventory) {
232
285
  // If there's prev target inventory
233
286
  // Merge qty and uomValue into prev target inventory
@@ -236,6 +289,13 @@ export class LoadingWorksheetController extends VasWorksheetController {
236
289
  prevTargetInventory.updater = this.user
237
290
  await this.updateOrderTargets([prevTargetInventory])
238
291
 
292
+ //Update order tote item if any
293
+ if (undoOrderToteItem) {
294
+ undoOrderToteItem.orderInventoryId = prevTargetInventory.id
295
+ undoOrderToteItem.orderInventory = prevTargetInventory
296
+ await this.trxMgr.getRepository(OrderToteItem).save(undoOrderToteItem)
297
+ }
298
+
239
299
  // Terminate undo target order inventory
240
300
  undoTargetOrderInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
241
301
  await this.updateOrderTargets([undoTargetOrderInventory])
@@ -282,6 +342,12 @@ export class LoadingWorksheetController extends VasWorksheetController {
282
342
  status: ORDER_STATUS.LOADING
283
343
  })
284
344
 
345
+ const orderToteIds = await (
346
+ await this.trxMgr.getRepository(OrderTote).find({ where: { releaseGood }, relations: ['tote'] })
347
+ ).map((record: OrderTote) => record?.toteId)
348
+
349
+ await this.trxMgr.getRepository(Tote).update({ id: In(orderToteIds) }, { status: TOTE_STATUS.DISPATCHED })
350
+
285
351
  const worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.LOADING, [
286
352
  'worksheetDetails',
287
353
  'worksheetDetails.targetInventory'
@@ -1,13 +1,18 @@
1
- import { Equal, In, Not } 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'
@@ -20,7 +25,9 @@ import {
20
25
  InventoryItem,
21
26
  InventoryNoGenerator,
22
27
  Location,
23
- LOCATION_TYPE
28
+ LOCATION_TYPE,
29
+ Tote,
30
+ TOTE_STATUS
24
31
  } from '@things-factory/warehouse-base'
25
32
 
26
33
  import { TASK_NUMBER_RULE_TYPE, TASK_NUMBER_SETTING_KEY, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
@@ -338,7 +345,8 @@ export class PickingWorksheetController extends VasWorksheetController {
338
345
  'worksheetDetails',
339
346
  'worksheetDetails.targetInventory',
340
347
  'worksheetDetails.targetInventory.inventory',
341
- 'worksheetDetails.targetInventory.product'
348
+ 'worksheetDetails.targetInventory.product',
349
+ 'worksheetDetails.targetInventory.orderProduct'
342
350
  ])
343
351
 
344
352
  const worksheetDetails: WorksheetDetail[] = await this.extractMatchedWorksheetDetails(
@@ -347,7 +355,7 @@ export class PickingWorksheetController extends VasWorksheetController {
347
355
  productId,
348
356
  packingType,
349
357
  packingSize,
350
- ['targetInventory', 'targetInventory.inventory']
358
+ ['targetInventory', 'targetInventory.inventory', 'targetInventory.orderProduct']
351
359
  )
352
360
 
353
361
  let worksheetDetailIds: string[] = []
@@ -364,6 +372,13 @@ export class PickingWorksheetController extends VasWorksheetController {
364
372
  inventory.lockedQty = inventory.lockedQty - targetInventory.releaseQty
365
373
  inventory.lockedUomValue = inventory.lockedUomValue - targetInventory.releaseUomValue
366
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
+ )
367
382
  }
368
383
 
369
384
  await this.trxMgr.getRepository(WorksheetDetail).delete(worksheetDetailIds)
@@ -388,7 +403,8 @@ export class PickingWorksheetController extends VasWorksheetController {
388
403
  productBarcode: string,
389
404
  cartonId: string,
390
405
  binLocation?: string,
391
- serialNumber?: string
406
+ serialNumber?: string,
407
+ toteNo?: string
392
408
  ): Promise<OrderInventory> {
393
409
  try {
394
410
  let worksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
@@ -401,6 +417,7 @@ export class PickingWorksheetController extends VasWorksheetController {
401
417
  'targetInventory.releaseGood',
402
418
  'targetInventory.inventory',
403
419
  'targetInventory.product',
420
+ 'targetInventory.orderProduct',
404
421
  'targetInventory.product.productDetails',
405
422
  'targetInventory.product.productDetails.product',
406
423
  'targetInventory.product.productDetails.childProductDetail'
@@ -409,8 +426,10 @@ export class PickingWorksheetController extends VasWorksheetController {
409
426
 
410
427
  const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
411
428
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
429
+ let targetProduct: OrderProduct = targetInventory.orderProduct
412
430
  const product: Product = targetInventory.product
413
431
  let inventory: Inventory = targetInventory.inventory
432
+ let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
414
433
 
415
434
  //validation to prevent duplicated picking
416
435
  let oiValidate: OrderInventory = await this.trxMgr.getRepository(OrderInventory).findOne({
@@ -512,6 +531,10 @@ export class PickingWorksheetController extends VasWorksheetController {
512
531
  }
513
532
  }
514
533
 
534
+ if (toteNo) {
535
+ await this.toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace)
536
+ }
537
+
515
538
  await this.updatePickingTransaction(releaseGood, targetInventory, worksheetDetail, inventory, pickedQty)
516
539
  } catch (error) {
517
540
  throw error
@@ -525,7 +548,8 @@ export class PickingWorksheetController extends VasWorksheetController {
525
548
  locationName: string,
526
549
  pickedQty: number,
527
550
  binLocation?: string,
528
- serialNumber?: string
551
+ serialNumber?: string,
552
+ toteNo?: string
529
553
  ): Promise<void> {
530
554
  try {
531
555
  let worksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
@@ -533,8 +557,10 @@ export class PickingWorksheetController extends VasWorksheetController {
533
557
  worksheetType,
534
558
  [
535
559
  'worksheet',
560
+ 'worksheet.bizplace',
536
561
  'targetInventory',
537
562
  'targetInventory.releaseGood',
563
+ 'targetInventory.orderProduct',
538
564
  'targetInventory.inventory',
539
565
  'targetInventory.inventory.location',
540
566
  'targetInventory.product'
@@ -545,6 +571,8 @@ export class PickingWorksheetController extends VasWorksheetController {
545
571
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
546
572
  const product: Product = targetInventory.product
547
573
  let inventory: Inventory = targetInventory.inventory
574
+ let targetProduct: OrderProduct = targetInventory.orderProduct
575
+ let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
548
576
 
549
577
  //validation to prevent duplicated picking
550
578
  let oiValidate: OrderInventory = await this.trxMgr.getRepository(OrderInventory).findOne({
@@ -649,6 +677,10 @@ export class PickingWorksheetController extends VasWorksheetController {
649
677
 
650
678
  targetInventory = await this.checkAndSetBinPicking(targetInventory, binLocation)
651
679
 
680
+ if (toteNo) {
681
+ await this.toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace)
682
+ }
683
+
652
684
  await this.updatePickingTransaction(releaseGood, targetInventory, worksheetDetail, inventory, pickedQty)
653
685
 
654
686
  const fromLocation: Location = targetInventory.inventory.location
@@ -947,6 +979,14 @@ export class PickingWorksheetController extends VasWorksheetController {
947
979
  status: ORDER_STATUS.PICKING
948
980
  })
949
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
+
950
990
  let worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.PICKING, [
951
991
  'worksheetDetails',
952
992
  'worksheetDetails.targetInventory'
@@ -1008,14 +1048,14 @@ export class PickingWorksheetController extends VasWorksheetController {
1008
1048
  worksheet.updater = this.user
1009
1049
  worksheet = await this.trxMgr.getRepository(Worksheet).save(worksheet)
1010
1050
 
1011
- const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
1051
+ const worksheetDetails: any = worksheet.worksheetDetails.filter(wsD => wsD.status != 'MISSING')
1012
1052
  worksheetDetails.forEach((wsd: WorksheetDetail) => {
1013
1053
  wsd.status = WORKSHEET_STATUS.DONE
1014
1054
  wsd.updater = this.user
1015
1055
  })
1016
1056
  await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetails)
1017
1057
 
1018
- const targetInventories: OrderInventory[] = worksheet.worksheetDetails.map((wsd: WorksheetDetail) => {
1058
+ const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => {
1019
1059
  let targetInventory: OrderInventory = wsd.targetInventory
1020
1060
  targetInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
1021
1061
  targetInventory.updater = this.user
@@ -1023,7 +1063,7 @@ export class PickingWorksheetController extends VasWorksheetController {
1023
1063
  })
1024
1064
  await this.updateOrderTargets(targetInventories)
1025
1065
 
1026
- const releaseGoods: ReleaseGood[] = worksheet.worksheetDetails.map((wsd: WorksheetDetail) => {
1066
+ const releaseGoods: ReleaseGood[] = worksheetDetails.map((wsd: WorksheetDetail) => {
1027
1067
  let releaseGood: ReleaseGood = wsd.targetInventory.releaseGood
1028
1068
 
1029
1069
  let orderStatus: string
@@ -1108,6 +1148,9 @@ export class PickingWorksheetController extends VasWorksheetController {
1108
1148
  }
1109
1149
 
1110
1150
  orderInventory.status = ORDER_INVENTORY_STATUS.PICKED
1151
+ orderInventory.pickedBy = this.user?.name
1152
+ orderInventory.pickedByUser = this.user
1153
+ orderInventory.pickedAt = new Date()
1111
1154
 
1112
1155
  inventory.qty -= orderInventory.releaseQty
1113
1156
  inventory.uomValue = Math.round((inventory.uomValue - orderInventory.releaseUomValue) * 100) / 100
@@ -1367,6 +1410,75 @@ export class PickingWorksheetController extends VasWorksheetController {
1367
1410
  } catch (e) {}
1368
1411
  }
1369
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
+
1370
1482
  async undoSerialNumberPicking(worksheetDetailName: string, inventoryItemId: string): Promise<void> {
1371
1483
  const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
1372
1484
  where: { name: worksheetDetailName, domain: this.domain, status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED)) },
@@ -1438,4 +1550,72 @@ export class PickingWorksheetController extends VasWorksheetController {
1438
1550
  targetInventory.updater = this.user
1439
1551
  await this.updateOrderTargets([targetInventory])
1440
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
+ }
1441
1621
  }