@things-factory/worksheet-base 5.0.0-alpha.5 → 5.0.0-alpha.52

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