@things-factory/worksheet-base 8.0.0-beta.9 → 8.0.0

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 (288) 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/graphql/resolvers/worksheet/vas-candidates.d.ts +2 -0
  4. package/dist-server/tsconfig.tsbuildinfo +1 -1
  5. package/dist-server/utils/inventory-util.d.ts +2 -0
  6. package/package.json +17 -17
  7. package/server/constants/index.ts +5 -0
  8. package/server/constants/rule-type.ts +4 -0
  9. package/server/constants/target-type.ts +6 -0
  10. package/server/constants/template.ts +12 -0
  11. package/server/constants/transaction-type.ts +9 -0
  12. package/server/constants/worksheet.ts +38 -0
  13. package/server/controllers/ecommerce/ecommerce-controller.ts +209 -0
  14. package/server/controllers/ecommerce/index.ts +2 -0
  15. package/server/controllers/ecommerce/sellercraft-controller.ts +358 -0
  16. package/server/controllers/inbound/index.ts +4 -0
  17. package/server/controllers/inbound/putaway-returning-worksheet-controller.ts +450 -0
  18. package/server/controllers/inbound/putaway-worksheet-controller.ts +454 -0
  19. package/server/controllers/inbound/unloading-returning-worksheet-controller.ts +291 -0
  20. package/server/controllers/inbound/unloading-worksheet-controller.ts +1400 -0
  21. package/server/controllers/index.ts +21 -0
  22. package/server/controllers/inspect/cycle-count-worksheet-controller.ts +537 -0
  23. package/server/controllers/inspect/index.ts +1 -0
  24. package/server/controllers/outbound/index.ts +5 -0
  25. package/server/controllers/outbound/loading-worksheet-controller.ts +377 -0
  26. package/server/controllers/outbound/packing-worksheet-controller.ts +449 -0
  27. package/server/controllers/outbound/picking-worksheet-controller.ts +1769 -0
  28. package/server/controllers/outbound/returning-worksheet-controller.ts +254 -0
  29. package/server/controllers/outbound/sorting-worksheet-controller.ts +554 -0
  30. package/server/controllers/render-elccl-grn.ts +228 -0
  31. package/server/controllers/render-fm-grn.ts +287 -0
  32. package/server/controllers/render-grn.ts +285 -0
  33. package/server/controllers/render-invoices.ts +201 -0
  34. package/server/controllers/render-job-sheet.ts +208 -0
  35. package/server/controllers/render-kimeda-grn.ts +185 -0
  36. package/server/controllers/render-manifest.ts +76 -0
  37. package/server/controllers/render-manual-do.ts +227 -0
  38. package/server/controllers/render-orientage-do.ts +376 -0
  39. package/server/controllers/render-orientage-grn.ts +191 -0
  40. package/server/controllers/render-po.ts +182 -0
  41. package/server/controllers/render-ro-do.ts +404 -0
  42. package/server/controllers/render-seebuu-grn.ts +208 -0
  43. package/server/controllers/vas/index.ts +1 -0
  44. package/server/controllers/vas/vas-worksheet-controller.ts +848 -0
  45. package/server/controllers/worksheet-controller.ts +1267 -0
  46. package/server/entities/index.ts +8 -0
  47. package/server/entities/warehouse-bizplace-onhand-inventory.ts +148 -0
  48. package/server/entities/worksheet-detail.ts +106 -0
  49. package/server/entities/worksheet-movement.ts +34 -0
  50. package/server/entities/worksheet.ts +100 -0
  51. package/server/graphql/index.ts +7 -0
  52. package/server/graphql/resolvers/index.ts +8 -0
  53. package/server/graphql/resolvers/pallet/index.ts +7 -0
  54. package/server/graphql/resolvers/pallet/pallet-outbound.ts +92 -0
  55. package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +137 -0
  56. package/server/graphql/resolvers/worksheet/cancel-draft-release-order.ts +20 -0
  57. package/server/graphql/resolvers/worksheet/check-inventory-release.ts +37 -0
  58. package/server/graphql/resolvers/worksheet/check-stock-take-current-location.ts +63 -0
  59. package/server/graphql/resolvers/worksheet/confirm-cancellation-release-order.ts +213 -0
  60. package/server/graphql/resolvers/worksheet/create-worksheet.ts +21 -0
  61. package/server/graphql/resolvers/worksheet/cross-dock-picking.ts +173 -0
  62. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +211 -0
  63. package/server/graphql/resolvers/worksheet/cycle-count-worksheet.ts +79 -0
  64. package/server/graphql/resolvers/worksheet/delete-worksheet.ts +21 -0
  65. package/server/graphql/resolvers/worksheet/delivery-order-by-worksheet.ts +104 -0
  66. package/server/graphql/resolvers/worksheet/fetch-delivery-order-ro.ts +191 -0
  67. package/server/graphql/resolvers/worksheet/fetch-sellercraft-document.ts +69 -0
  68. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +36 -0
  69. package/server/graphql/resolvers/worksheet/find-release-orders-by-worksheet-no.ts +29 -0
  70. package/server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.ts +80 -0
  71. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +100 -0
  72. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-batch-picking-worksheet.ts +26 -0
  73. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-cycle-count-worksheet.ts +51 -0
  74. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-multiple-release-good-worksheet.ts +17 -0
  75. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-partial-putaway-return-worksheet.ts +69 -0
  76. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-partial-putaway-worksheet.ts +65 -0
  77. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-putaway-worksheet.ts +54 -0
  78. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts +114 -0
  79. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-return-order-worksheet.ts +45 -0
  80. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-vas-order-worksheet.ts +35 -0
  81. package/server/graphql/resolvers/worksheet/generate-worksheet/index.ts +23 -0
  82. package/server/graphql/resolvers/worksheet/having-vas.ts +45 -0
  83. package/server/graphql/resolvers/worksheet/index.ts +142 -0
  84. package/server/graphql/resolvers/worksheet/inspecting/activate-cycle-count.ts +24 -0
  85. package/server/graphql/resolvers/worksheet/inspecting/add-extra-pallet.ts +49 -0
  86. package/server/graphql/resolvers/worksheet/inspecting/check-missing-pallet.ts +18 -0
  87. package/server/graphql/resolvers/worksheet/inspecting/complete-inspection.ts +41 -0
  88. package/server/graphql/resolvers/worksheet/inspecting/index.ts +17 -0
  89. package/server/graphql/resolvers/worksheet/inspecting/inspecting.ts +30 -0
  90. package/server/graphql/resolvers/worksheet/inspecting/relocate-pallet.ts +46 -0
  91. package/server/graphql/resolvers/worksheet/inspecting/undo-inspection.ts +23 -0
  92. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +150 -0
  93. package/server/graphql/resolvers/worksheet/loaded-inventories.ts +40 -0
  94. package/server/graphql/resolvers/worksheet/loading/activate-loading.ts +73 -0
  95. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +165 -0
  96. package/server/graphql/resolvers/worksheet/loading/index.ts +11 -0
  97. package/server/graphql/resolvers/worksheet/loading/loading.ts +46 -0
  98. package/server/graphql/resolvers/worksheet/loading/undo-loading.ts +25 -0
  99. package/server/graphql/resolvers/worksheet/loading-worksheet.ts +150 -0
  100. package/server/graphql/resolvers/worksheet/not-tally-target-inventories.ts +34 -0
  101. package/server/graphql/resolvers/worksheet/packing/activate-packing.ts +69 -0
  102. package/server/graphql/resolvers/worksheet/packing/complete-packing.ts +102 -0
  103. package/server/graphql/resolvers/worksheet/packing/index.ts +13 -0
  104. package/server/graphql/resolvers/worksheet/packing/packing.ts +59 -0
  105. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +70 -0
  106. package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
  107. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +378 -0
  108. package/server/graphql/resolvers/worksheet/palletizing-pallets.ts +142 -0
  109. package/server/graphql/resolvers/worksheet/pending-cancellation-release-order.ts +234 -0
  110. package/server/graphql/resolvers/worksheet/picking/activate-batch-picking.ts +40 -0
  111. package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +98 -0
  112. package/server/graphql/resolvers/worksheet/picking/assign-picking-inventories.ts +50 -0
  113. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +44 -0
  114. package/server/graphql/resolvers/worksheet/picking/batch-picking.ts +32 -0
  115. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +137 -0
  116. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +282 -0
  117. package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +121 -0
  118. package/server/graphql/resolvers/worksheet/picking/index.ts +31 -0
  119. package/server/graphql/resolvers/worksheet/picking/my-picking-assignment-status.ts +35 -0
  120. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +96 -0
  121. package/server/graphql/resolvers/worksheet/picking/picking.ts +55 -0
  122. package/server/graphql/resolvers/worksheet/picking/scan-product-batch-picking.ts +52 -0
  123. package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +25 -0
  124. package/server/graphql/resolvers/worksheet/picking/seal-tote.ts +25 -0
  125. package/server/graphql/resolvers/worksheet/picking/undo-picking-assignment.ts +31 -0
  126. package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
  127. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +147 -0
  128. package/server/graphql/resolvers/worksheet/proceed-extra-products.ts +242 -0
  129. package/server/graphql/resolvers/worksheet/putaway/activate-putaway.ts +51 -0
  130. package/server/graphql/resolvers/worksheet/putaway/complete-putaway.ts +105 -0
  131. package/server/graphql/resolvers/worksheet/putaway/index.ts +11 -0
  132. package/server/graphql/resolvers/worksheet/putaway/putaway.ts +26 -0
  133. package/server/graphql/resolvers/worksheet/putaway/undo-putaway.ts +25 -0
  134. package/server/graphql/resolvers/worksheet/putaway-return/activate-putaway-return.ts +55 -0
  135. package/server/graphql/resolvers/worksheet/putaway-return/complete-putaway-return.ts +38 -0
  136. package/server/graphql/resolvers/worksheet/putaway-return/index.ts +11 -0
  137. package/server/graphql/resolvers/worksheet/putaway-return/putaway-return.ts +30 -0
  138. package/server/graphql/resolvers/worksheet/putaway-return/undo-putaway-return.ts +29 -0
  139. package/server/graphql/resolvers/worksheet/putaway-returning-worksheet.ts +83 -0
  140. package/server/graphql/resolvers/worksheet/putaway-worksheet.ts +82 -0
  141. package/server/graphql/resolvers/worksheet/recommend-putway-location.ts +133 -0
  142. package/server/graphql/resolvers/worksheet/reject-cancellation-release-order.ts +186 -0
  143. package/server/graphql/resolvers/worksheet/relocate-pallet.ts +67 -0
  144. package/server/graphql/resolvers/worksheet/replace-picking-pallets.ts +127 -0
  145. package/server/graphql/resolvers/worksheet/return-worksheet.ts +70 -0
  146. package/server/graphql/resolvers/worksheet/returning/activate-return.ts +24 -0
  147. package/server/graphql/resolvers/worksheet/returning/complete-return.ts +39 -0
  148. package/server/graphql/resolvers/worksheet/returning/index.ts +9 -0
  149. package/server/graphql/resolvers/worksheet/returning/returning.ts +26 -0
  150. package/server/graphql/resolvers/worksheet/sorting/activate-sorting.ts +25 -0
  151. package/server/graphql/resolvers/worksheet/sorting/complete-order-sorting.ts +40 -0
  152. package/server/graphql/resolvers/worksheet/sorting/complete-worksheet-sorting.ts +23 -0
  153. package/server/graphql/resolvers/worksheet/sorting/index.ts +13 -0
  154. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +31 -0
  155. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +32 -0
  156. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +87 -0
  157. package/server/graphql/resolvers/worksheet/transfer.ts +176 -0
  158. package/server/graphql/resolvers/worksheet/unloaded-inventories-by-reusable-pallet.ts +54 -0
  159. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +78 -0
  160. package/server/graphql/resolvers/worksheet/unloading/activate-unloading.ts +56 -0
  161. package/server/graphql/resolvers/worksheet/unloading/complete-product-scan-unload.ts +25 -0
  162. package/server/graphql/resolvers/worksheet/unloading/complete-unloading-partially.ts +25 -0
  163. package/server/graphql/resolvers/worksheet/unloading/complete-unloading.ts +76 -0
  164. package/server/graphql/resolvers/worksheet/unloading/index.ts +21 -0
  165. package/server/graphql/resolvers/worksheet/unloading/scan-product-unload.ts +26 -0
  166. package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
  167. package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
  168. package/server/graphql/resolvers/worksheet/unloading/undo-unloading.ts +25 -0
  169. package/server/graphql/resolvers/worksheet/unloading/unload.ts +26 -0
  170. package/server/graphql/resolvers/worksheet/unloading-return/activate-unloading-return.ts +28 -0
  171. package/server/graphql/resolvers/worksheet/unloading-return/complete-unload-return-partially.ts +29 -0
  172. package/server/graphql/resolvers/worksheet/unloading-return/complete-unload-returning.ts +91 -0
  173. package/server/graphql/resolvers/worksheet/unloading-return/index.ts +9 -0
  174. package/server/graphql/resolvers/worksheet/unloading-return-worksheet.ts +75 -0
  175. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +98 -0
  176. package/server/graphql/resolvers/worksheet/update-worksheet.ts +25 -0
  177. package/server/graphql/resolvers/worksheet/vas/activate-vas.ts +25 -0
  178. package/server/graphql/resolvers/worksheet/vas/assign-vas-inventories.ts +25 -0
  179. package/server/graphql/resolvers/worksheet/vas/complete-vas.ts +72 -0
  180. package/server/graphql/resolvers/worksheet/vas/execute-vas.ts +31 -0
  181. package/server/graphql/resolvers/worksheet/vas/index.ts +15 -0
  182. package/server/graphql/resolvers/worksheet/vas/undo-vas-inventory.ts +24 -0
  183. package/server/graphql/resolvers/worksheet/vas/undo-vas.ts +24 -0
  184. package/server/graphql/resolvers/worksheet/vas-candidates.ts +177 -0
  185. package/server/graphql/resolvers/worksheet/vas-inventories.ts +41 -0
  186. package/server/graphql/resolvers/worksheet/vas-transactions/common-utils.ts +1182 -0
  187. package/server/graphql/resolvers/worksheet/vas-transactions/index.ts +5 -0
  188. package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/index.ts +56 -0
  189. package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/relabeling.ts +20 -0
  190. package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/repackaging.ts +27 -0
  191. package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/repalletizing.ts +14 -0
  192. package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/unpacking.ts +14 -0
  193. package/server/graphql/resolvers/worksheet/vas-transactions/relabeling/check-relabelable.ts +96 -0
  194. package/server/graphql/resolvers/worksheet/vas-transactions/relabeling/complete-relabeling.ts +93 -0
  195. package/server/graphql/resolvers/worksheet/vas-transactions/relabeling/index.ts +4 -0
  196. package/server/graphql/resolvers/worksheet/vas-transactions/relabeling/relabeling.ts +105 -0
  197. package/server/graphql/resolvers/worksheet/vas-transactions/relabeling/undo-relabeling.ts +40 -0
  198. package/server/graphql/resolvers/worksheet/vas-transactions/repackaging/complete-repackaging.ts +236 -0
  199. package/server/graphql/resolvers/worksheet/vas-transactions/repackaging/index.ts +3 -0
  200. package/server/graphql/resolvers/worksheet/vas-transactions/repackaging/repackaging.ts +402 -0
  201. package/server/graphql/resolvers/worksheet/vas-transactions/repackaging/undo-repackaging.ts +166 -0
  202. package/server/graphql/resolvers/worksheet/vas-transactions/repalletizing/complete-repalletizing.ts +116 -0
  203. package/server/graphql/resolvers/worksheet/vas-transactions/repalletizing/index.ts +3 -0
  204. package/server/graphql/resolvers/worksheet/vas-transactions/repalletizing/repalletizing.ts +167 -0
  205. package/server/graphql/resolvers/worksheet/vas-transactions/repalletizing/undo-repalletizing.ts +74 -0
  206. package/server/graphql/resolvers/worksheet/vas-transactions/unpacking/complete-unpacking.ts +20 -0
  207. package/server/graphql/resolvers/worksheet/vas-transactions/unpacking/index.ts +2 -0
  208. package/server/graphql/resolvers/worksheet/vas-transactions/unpacking/unpacking.ts +164 -0
  209. package/server/graphql/resolvers/worksheet/vas-worksheet.ts +110 -0
  210. package/server/graphql/resolvers/worksheet/worksheet-by-order-no.ts +43 -0
  211. package/server/graphql/resolvers/worksheet/worksheet-with-pagination.ts +46 -0
  212. package/server/graphql/resolvers/worksheet/worksheet.ts +330 -0
  213. package/server/graphql/resolvers/worksheet/worksheets.ts +493 -0
  214. package/server/graphql/resolvers/worksheet-detail/check-progressing-pallet.ts +22 -0
  215. package/server/graphql/resolvers/worksheet-detail/create-worksheet-detail.ts +38 -0
  216. package/server/graphql/resolvers/worksheet-detail/delete-worksheet-detail.ts +18 -0
  217. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +206 -0
  218. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.ts +165 -0
  219. package/server/graphql/resolvers/worksheet-detail/generate-carton-id.ts +26 -0
  220. package/server/graphql/resolvers/worksheet-detail/generate-pallet-id.ts +94 -0
  221. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +259 -0
  222. package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +142 -0
  223. package/server/graphql/resolvers/worksheet-detail/index.ts +34 -0
  224. package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +165 -0
  225. package/server/graphql/resolvers/worksheet-detail/update-worksheet-detail.ts +39 -0
  226. package/server/graphql/resolvers/worksheet-detail/worksheet-detail.ts +19 -0
  227. package/server/graphql/resolvers/worksheet-detail/worksheet-details-by-product-group.ts +56 -0
  228. package/server/graphql/resolvers/worksheet-detail/worksheet-details.ts +21 -0
  229. package/server/graphql/resolvers/worksheet-movement/create-worksheet-movement.ts +17 -0
  230. package/server/graphql/resolvers/worksheet-movement/delete-worksheet-movement.ts +12 -0
  231. package/server/graphql/resolvers/worksheet-movement/index.ts +17 -0
  232. package/server/graphql/resolvers/worksheet-movement/update-worksheet-movement.ts +15 -0
  233. package/server/graphql/resolvers/worksheet-movement/worksheet-movement.ts +10 -0
  234. package/server/graphql/resolvers/worksheet-movement/worksheet-movements.ts +14 -0
  235. package/server/graphql/types/index.ts +15 -0
  236. package/server/graphql/types/pallet/index.ts +12 -0
  237. package/server/graphql/types/pallet/pallet.ts +7 -0
  238. package/server/graphql/types/worksheet/arrival-notice-worksheet.ts +8 -0
  239. package/server/graphql/types/worksheet/batch-pick-worksheet-info.ts +9 -0
  240. package/server/graphql/types/worksheet/contact-point-info.ts +12 -0
  241. package/server/graphql/types/worksheet/cycle-count-worksheet.ts +16 -0
  242. package/server/graphql/types/worksheet/delivery-info.ts +11 -0
  243. package/server/graphql/types/worksheet/delivery-order-info.ts +25 -0
  244. package/server/graphql/types/worksheet/delivery-order-ro.ts +15 -0
  245. package/server/graphql/types/worksheet/delivery-worksheet.ts +7 -0
  246. package/server/graphql/types/worksheet/executing-worksheet.ts +8 -0
  247. package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
  248. package/server/graphql/types/worksheet/goods-delivery-note.ts +8 -0
  249. package/server/graphql/types/worksheet/index.ts +750 -0
  250. package/server/graphql/types/worksheet/inventory-check-worksheet.ts +7 -0
  251. package/server/graphql/types/worksheet/loaded-worksheet-detail.ts +9 -0
  252. package/server/graphql/types/worksheet/multiple-release-good-worksheet.ts +8 -0
  253. package/server/graphql/types/worksheet/my-picking-assignment-status.ts +9 -0
  254. package/server/graphql/types/worksheet/new-worksheet.ts +10 -0
  255. package/server/graphql/types/worksheet/picking-assignment-status.ts +9 -0
  256. package/server/graphql/types/worksheet/product-approval.ts +11 -0
  257. package/server/graphql/types/worksheet/release-good-worksheet.ts +8 -0
  258. package/server/graphql/types/worksheet/return-order-worksheet.ts +8 -0
  259. package/server/graphql/types/worksheet/sellercraft-document.ts +8 -0
  260. package/server/graphql/types/worksheet/vas-order-worksheet.ts +7 -0
  261. package/server/graphql/types/worksheet/vas-worksheet.ts +8 -0
  262. package/server/graphql/types/worksheet/worksheet-detail-info.ts +68 -0
  263. package/server/graphql/types/worksheet/worksheet-info.ts +33 -0
  264. package/server/graphql/types/worksheet/worksheet-list.ts +8 -0
  265. package/server/graphql/types/worksheet/worksheet-patch.ts +19 -0
  266. package/server/graphql/types/worksheet/worksheet-with-pagination.ts +9 -0
  267. package/server/graphql/types/worksheet/worksheet.ts +34 -0
  268. package/server/graphql/types/worksheet-detail/index.ts +81 -0
  269. package/server/graphql/types/worksheet-detail/inventory-detail.ts +39 -0
  270. package/server/graphql/types/worksheet-detail/new-worksheet-detail.ts +20 -0
  271. package/server/graphql/types/worksheet-detail/pallet-info.ts +8 -0
  272. package/server/graphql/types/worksheet-detail/worksheet-detail-list.ts +8 -0
  273. package/server/graphql/types/worksheet-detail/worksheet-detail-patch.ts +28 -0
  274. package/server/graphql/types/worksheet-detail/worksheet-detail.ts +29 -0
  275. package/server/graphql/types/worksheet-movement/index.ts +30 -0
  276. package/server/graphql/types/worksheet-movement/new-worksheet-movement.ts +8 -0
  277. package/server/graphql/types/worksheet-movement/worksheet-movement-list.ts +8 -0
  278. package/server/graphql/types/worksheet-movement/worksheet-movement-patch.ts +8 -0
  279. package/server/graphql/types/worksheet-movement/worksheet-movement.ts +10 -0
  280. package/server/index.ts +14 -0
  281. package/server/middlewares/index.ts +3 -0
  282. package/server/migrations/index.ts +9 -0
  283. package/server/routes.ts +80 -0
  284. package/server/utils/datetime-util.ts +54 -0
  285. package/server/utils/index.ts +4 -0
  286. package/server/utils/inventory-util.ts +390 -0
  287. package/server/utils/worksheet-no-generator.ts +206 -0
  288. package/server/utils/worksheet-util.ts +85 -0
@@ -0,0 +1,1182 @@
1
+ import { EntityManager, Equal, In, IsNull, Not } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Bizplace } from '@things-factory/biz-base'
5
+ import {
6
+ ArrivalNotice,
7
+ ORDER_INVENTORY_STATUS,
8
+ ORDER_TYPES,
9
+ OrderInventory,
10
+ OrderNoGenerator,
11
+ OrderVas,
12
+ ReleaseGood
13
+ } from '@things-factory/sales-base'
14
+ import { Domain } from '@things-factory/shell'
15
+ import {
16
+ Inventory,
17
+ INVENTORY_STATUS,
18
+ INVENTORY_TRANSACTION_TYPE,
19
+ InventoryNoGenerator,
20
+ Location,
21
+ Pallet,
22
+ Warehouse
23
+ } from '@things-factory/warehouse-base'
24
+
25
+ import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
26
+ import { Worksheet, WorksheetDetail } from '../../../../entities'
27
+ import { generateInventoryHistory, WorksheetNoGenerator } from '../../../../utils'
28
+ import {
29
+ OperationGuideInterface,
30
+ PackingUnits,
31
+ PalletChangesInterface,
32
+ RefOrderType,
33
+ TemporaryPalletChangesInterface
34
+ } from './interfaces'
35
+
36
+ /**
37
+ * @description Find worksheet detail by name
38
+ * this function will include every relations with worksheet detail for processing VAS
39
+ *
40
+ * @param {EntityManager} trxMgr
41
+ * @param {Domain} domain
42
+ * @param {String} name
43
+ */
44
+ export async function getWorksheetDetailByName(
45
+ trxMgr: EntityManager,
46
+ domain: Domain,
47
+ name: string
48
+ ): Promise<WorksheetDetail> {
49
+ const worksheetDetail: WorksheetDetail = await trxMgr.getRepository(WorksheetDetail).findOne({
50
+ where: { domain: { id: domain.id }, name },
51
+ relations: [
52
+ 'bizplace',
53
+ 'targetVas',
54
+ 'targetVas.inventory',
55
+ 'targetVas.inventory.product',
56
+ 'targetVas.vas',
57
+ 'targetVas.arrivalNotice',
58
+ 'targetVas.releaseGood',
59
+ 'targetVas.shippingOrder',
60
+ 'targetVas.vasOrder',
61
+ 'targetVas.targetProduct',
62
+ 'worksheet'
63
+ ]
64
+ })
65
+ if (!worksheetDetail) throw new Error(`Couldn't find target worksheet detail`)
66
+ if (!worksheetDetail.targetVas)
67
+ throw new Error(`Couldn't find any related target vas, using current worksheet detail`)
68
+ return worksheetDetail
69
+ }
70
+
71
+ /**
72
+ * @description Update every related order vas to share same operationGuide data
73
+ *
74
+ * @param {EntityManager} trxMgr
75
+ * @param {Domain} domain
76
+ * @param {Bizplace} bizplace
77
+ * @param {WorksheetDetail} wsd
78
+ * @param {OrderVas} targetVas
79
+ * @param {OperationGuideInterface<T>} operationGuide
80
+ * @param {User} user
81
+ */
82
+ export async function updateRelatedOrderVas<T>(
83
+ trxMgr: EntityManager,
84
+ domain: Domain,
85
+ bizplace: Bizplace,
86
+ wsd: WorksheetDetail,
87
+ targetVas: OrderVas,
88
+ operationGuide: OperationGuideInterface<T>,
89
+ user: User
90
+ //@ts-ignore
91
+ ): Promise<OrderVas> {
92
+ const worksheet: Worksheet = wsd.worksheet
93
+ const relatedWSDs: WorksheetDetail[] = await trxMgr.getRepository(WorksheetDetail).find({
94
+ where: { domain: { id: domain.id }, bizplace: { id: bizplace.id }, worksheet: { id: worksheet.id } },
95
+ relations: ['targetVas', 'targetVas.vas']
96
+ })
97
+
98
+ const relatedOVs: OrderVas[] = relatedWSDs
99
+ .map((wsd: WorksheetDetail) => wsd.targetVas)
100
+ .filter((ov: OrderVas) => ov.set === targetVas.set && ov.vas.id === targetVas.vas.id)
101
+ .map((ov: OrderVas) => {
102
+ return {
103
+ ...ov,
104
+ operationGuide: JSON.stringify(operationGuide),
105
+ updater: user
106
+ }
107
+ })
108
+
109
+ await trxMgr.getRepository(OrderVas).save(relatedOVs)
110
+ }
111
+
112
+ /**
113
+ * @description Return current amount of pallet
114
+ * @param {PalletChangesInterface[]} palletChanges
115
+ * @param {String} palletId
116
+ */
117
+ export function getCurrentAmount(
118
+ palletChanges: PalletChangesInterface[],
119
+ palletId: string
120
+ ): { qty: number; uomValue: number } {
121
+ return palletChanges
122
+ .filter((pc: PalletChangesInterface) => pc.toPalletId === palletId)
123
+ .reduce(
124
+ (currentAmount: { qty: number; uomValue: number }, pc: PalletChangesInterface) => {
125
+ return {
126
+ qty: currentAmount.qty + pc.reducedQty,
127
+ uomValue: currentAmount.uomValue + pc.reducedUomValue
128
+ }
129
+ },
130
+ { qty: 0, uomValue: 0 }
131
+ )
132
+ }
133
+
134
+ /**
135
+ * @description Return reduced amount of pallet
136
+ * @param {PalletChangesInterface[]} palletChanges
137
+ * @param {String} palletId
138
+ */
139
+ export function getReducedAmount(
140
+ palletChanges: PalletChangesInterface[],
141
+ palletId: string
142
+ ): { reducedQty: number; reducedUomValue: number } {
143
+ return palletChanges
144
+ .filter((pc: PalletChangesInterface) => pc.fromPalletId === palletId)
145
+ .reduce(
146
+ (reducedAmount: { reducedQty: number; reducedUomValue: number }, pc: PalletChangesInterface) => {
147
+ return {
148
+ reducedQty: reducedAmount.reducedQty + pc.reducedQty || 0,
149
+ reducedUomValue: reducedAmount.reducedUomValue + pc.reducedUomValue || 0
150
+ }
151
+ },
152
+ { reducedQty: 0, reducedUomValue: 0 }
153
+ )
154
+ }
155
+
156
+ /**
157
+ * @description Get remain qty of inventory or order inventory (For release good case)
158
+ *
159
+ * @param {EntityManager} trxMgr
160
+ * @param {ArrivalNotice | ReleaseGood | VasOrder} refOrder
161
+ * @param {Domain} domain
162
+ * @param {Bizplace} bizplace
163
+ * @param {Inventory} originInv
164
+ * @param {RepackedInvInfo[]} repackedInvs
165
+ * @param {String} palletId
166
+ */
167
+ export async function getRemainInventoryAmount(
168
+ trxMgr: EntityManager,
169
+ refOrder: RefOrderType,
170
+ domain: Domain,
171
+ bizplace: Bizplace,
172
+ originInv: Inventory,
173
+ palletChanges: PalletChangesInterface[],
174
+ palletId: string
175
+ ): Promise<{ remainQty: number; remainUomValue: number }> {
176
+ let remainQty: number = 0
177
+ let remainUomValue: number = 0
178
+ const { reducedQty, reducedUomValue } = getReducedAmount(palletChanges, palletId)
179
+ if (refOrder instanceof ReleaseGood) {
180
+ // Find loading order inventory to figure out uomValue
181
+ const orderInv: OrderInventory = await trxMgr.getRepository(OrderInventory).findOne({
182
+ where: {
183
+ domain: { id: domain.id },
184
+ bizplace: { id: bizplace.id },
185
+ inventory: { id: originInv.id },
186
+ releaseGood: { id: refOrder.id },
187
+ type: ORDER_TYPES.RELEASE_OF_GOODS
188
+ }
189
+ })
190
+
191
+ remainQty = orderInv.releaseQty - reducedQty
192
+ remainUomValue = orderInv.releaseUomValue - reducedUomValue
193
+ } else {
194
+ remainQty = originInv.qty - reducedQty
195
+ remainUomValue = originInv.uomValue - reducedUomValue
196
+ }
197
+
198
+ if (remainQty <= 0 || remainUomValue <= 0) throw new Error(`There's no more remaining product on the pallet`)
199
+ return { remainQty, remainUomValue }
200
+ }
201
+
202
+ /** REMARK
203
+ * @farishelmi created temporary function @temporaryGetReducedAmount and
204
+ * @temporaryGetRemainInventoryAmount specifically for @Repackaging
205
+ * - because in repackaging we need to calculate based on unit qty of a product
206
+ * - eg: Carton of 12 Cokes repack into Boxes of 6 Cokes
207
+ * - this function should be merged with its origin once the logic in other vas is updated
208
+ * */
209
+
210
+ export function temporaryGetCurrentAmount(
211
+ palletChanges: TemporaryPalletChangesInterface[],
212
+ palletId: string,
213
+ packingUnit: string,
214
+ stdAmount: number
215
+ ): { qty: number; uomValue: number } {
216
+ return palletChanges
217
+ .filter((pc: TemporaryPalletChangesInterface) => pc.toPalletId === palletId)
218
+ .reduce(
219
+ (currentAmount: { qty: number; uomValue: number }, pc: TemporaryPalletChangesInterface) => {
220
+ if (packingUnit == PackingUnits.QTY) {
221
+ return {
222
+ qty: currentAmount.qty + pc.reducedUnitQty / stdAmount,
223
+ uomValue: currentAmount.uomValue + pc.reducedUomValue
224
+ }
225
+ } else if (packingUnit == PackingUnits.UOM) {
226
+ return {
227
+ qty: currentAmount.qty + pc.reducedQty,
228
+ uomValue: currentAmount.uomValue + pc.reducedUomValue
229
+ }
230
+ } else {
231
+ return { qty: 0, uomValue: 0 }
232
+ }
233
+ },
234
+ { qty: 0, uomValue: 0 }
235
+ )
236
+ }
237
+
238
+ /**
239
+ * @description need to consider unit amount because we have packingSize for each packingType
240
+ * @param palletChanges
241
+ * @param palletId
242
+ * @returns reducedUomValue: used for packingUnit == UOM
243
+ * @returns reducedUnitQty: used for packingUnit == QTY
244
+ */
245
+ export function temporaryGetReducedAmount(
246
+ palletChanges: TemporaryPalletChangesInterface[],
247
+ palletId: string
248
+ ): { reducedUomValue: number; reducedUnitQty: number } {
249
+ return palletChanges
250
+ .filter((pc: TemporaryPalletChangesInterface) => pc.fromPalletId === palletId)
251
+ .reduce(
252
+ (
253
+ reducedAmount: {
254
+ reducedUomValue: number
255
+ reducedUnitQty: number
256
+ },
257
+ pc: TemporaryPalletChangesInterface
258
+ ) => {
259
+ return {
260
+ reducedUomValue: reducedAmount.reducedUomValue + pc.reducedUomValue || 0,
261
+ reducedUnitQty: reducedAmount.reducedUnitQty + pc.reducedUnitQty || 0
262
+ }
263
+ },
264
+ { reducedUomValue: 0, reducedUnitQty: 0 }
265
+ )
266
+ }
267
+
268
+ export async function temporaryGetRemainInventoryAmount(
269
+ trxMgr: EntityManager,
270
+ refOrder: RefOrderType,
271
+ domain: Domain,
272
+ bizplace: Bizplace,
273
+ originInv: Inventory,
274
+ palletChanges: TemporaryPalletChangesInterface[],
275
+ palletId: string
276
+ ): Promise<{ remainUomValue: number; remainUnitQty: number }> {
277
+ let remainUomValue: number = 0
278
+ let remainUnitQty: number = 0
279
+
280
+ const packingSize: number = originInv.packingSize
281
+ const { reducedUomValue, reducedUnitQty } = temporaryGetReducedAmount(palletChanges, palletId)
282
+ if (refOrder instanceof ReleaseGood) {
283
+ // Find loading order inventory to figure out uomValue
284
+ const orderInv: OrderInventory = await trxMgr.getRepository(OrderInventory).findOne({
285
+ where: {
286
+ domain: { id: domain.id },
287
+ bizplace: { id: bizplace.id },
288
+ inventory: { id: originInv.id },
289
+ releaseGood: { id: refOrder.id },
290
+ type: ORDER_TYPES.RELEASE_OF_GOODS
291
+ }
292
+ })
293
+
294
+ remainUomValue = orderInv.releaseUomValue - reducedUomValue
295
+ remainUnitQty = orderInv.releaseQty * packingSize - reducedUnitQty
296
+ } else {
297
+ remainUomValue = originInv.uomValue - reducedUomValue
298
+ remainUnitQty = originInv.qty * packingSize - reducedUnitQty
299
+ }
300
+
301
+ if (remainUomValue <= 0 || remainUnitQty <= 0) throw new Error(`There's no more remaining product on the pallet`)
302
+ return { remainUomValue, remainUnitQty }
303
+ }
304
+
305
+ export async function updateOriginInventories(
306
+ trxMgr: EntityManager,
307
+ domain: Domain,
308
+ bizplace: Bizplace,
309
+ user: User,
310
+ refOrder: RefOrderType,
311
+ repackedFroms: Partial<TemporaryPalletChangesInterface[]>,
312
+ packingUnit: string,
313
+ transactionType: string
314
+ ): Promise<Inventory[]> {
315
+ const inventories: Inventory[] = []
316
+
317
+ for (let inv of repackedFroms) {
318
+ let foundInventory: Inventory = await trxMgr.getRepository(Inventory).findOne({
319
+ where: {
320
+ domain: { id: domain.id },
321
+ bizplace: { id: bizplace.id },
322
+ palletId: inv.fromPalletId,
323
+ status: Not(Equal(INVENTORY_STATUS.TERMINATED))
324
+ }
325
+ })
326
+
327
+ if (foundInventory) {
328
+ let repackedPkgQty: number = 0
329
+ let repackedPkgUomValue: number = 0
330
+
331
+ switch (packingUnit) {
332
+ case PackingUnits.QTY:
333
+ repackedPkgQty = inv.reducedUnitQty / inv.packingSize
334
+ repackedPkgUomValue = inv.reducedUomValue // it should be called reducedUomValue instead. sbb dh kira smua dgn packingsize
335
+ break
336
+
337
+ case PackingUnits.UOM:
338
+ // repackedPkgQty = inv.reducedQty / inv.packingSize
339
+ // repackedPkgUomValue = rf.reducedUomValue
340
+ break
341
+ }
342
+
343
+ foundInventory = await trxMgr.getRepository(Inventory).save({
344
+ ...foundInventory,
345
+ qty: repackedPkgQty,
346
+ uomValue: repackedPkgUomValue,
347
+ creator: user,
348
+ updater: user
349
+ })
350
+
351
+ await generateInventoryHistory(
352
+ foundInventory,
353
+ refOrder,
354
+ transactionType,
355
+ repackedPkgQty,
356
+ repackedPkgUomValue,
357
+ user,
358
+ trxMgr
359
+ )
360
+
361
+ inventories.push(foundInventory)
362
+ } else {
363
+ throw new Error(`${inv.fromPalletId} is not exist in inventory. Hence, qty cannot be updated.`)
364
+ }
365
+ }
366
+
367
+ return inventories
368
+ }
369
+
370
+ //// @farishelmi What is the difference between upsertInventory vs temporaryUpsertInventory? If it is repeated function, kindly remove one of them.
371
+ export async function temporaryUpsertInventory(
372
+ trxMgr: EntityManager,
373
+ domain: Domain,
374
+ bizplace: Bizplace,
375
+ user: User,
376
+ originInv: Inventory,
377
+ refOrder: RefOrderType,
378
+ palletId: string,
379
+ locationName: string,
380
+ packingType: string,
381
+ addedQty: number,
382
+ addedUomValue: number,
383
+ transactionType: string,
384
+ stdAmount?: number,
385
+ packingUnit?: string
386
+ ): Promise<Inventory> {
387
+ const location: Location = await trxMgr.getRepository(Location).findOne({
388
+ where: { domain: { id: domain.id }, name: locationName },
389
+ relations: ['warehouse']
390
+ })
391
+ if (!location) throw new Error(`Location is not found by (${locationName})`)
392
+ const warehouse: Warehouse = location.warehouse
393
+ const zone: string = location.zone
394
+
395
+ let inv: Inventory = await trxMgr.getRepository(Inventory).findOne({
396
+ where: {
397
+ domain: { id: domain.id },
398
+ bizplace: { id: bizplace.id },
399
+ palletId,
400
+ batchId: originInv.batchId,
401
+ product: { id: originInv.product.id },
402
+ packingType,
403
+ packingSize: stdAmount,
404
+ refOrderId: originInv.refOrderId,
405
+ status: Not(Equal(INVENTORY_STATUS.TERMINATED))
406
+ },
407
+ relations: ['product', 'refInventory']
408
+ })
409
+
410
+ // Create new inventory
411
+ if (!inv) {
412
+ let newInventory: Inventory = new Inventory()
413
+
414
+ inv = {
415
+ ...newInventory,
416
+ domain,
417
+ bizplace,
418
+ palletId,
419
+ name: InventoryNoGenerator.inventoryName(),
420
+ packingType,
421
+ qty: addedQty,
422
+ //@ts-ignore
423
+ weight: 0,
424
+ uomValue: addedUomValue,
425
+ lockedQty: 0,
426
+ lockedUomValue: 0,
427
+ packingSize: packingUnit == PackingUnits.QTY ? stdAmount : 1,
428
+ warehouse,
429
+ location,
430
+ zone,
431
+ creator: user,
432
+ updater: user
433
+ }
434
+
435
+ // Save changed inventory
436
+ inv = await trxMgr.getRepository(Inventory).save(inv)
437
+
438
+ // Check whether the pallet is resuable or not
439
+ const pallet: Pallet = await trxMgr.getRepository(Pallet).findOne({
440
+ where: { domain: { id: domain.id }, name: palletId, inventory: IsNull() }
441
+ })
442
+ // If it's exists => it's reusable pallet and need to update it's inventory field
443
+ if (pallet) {
444
+ pallet.inventory = inv
445
+ pallet.updater = user
446
+ await trxMgr.getRepository(Pallet).save(pallet)
447
+ }
448
+ } else {
449
+ // Update inventory
450
+ inv.qty += addedQty
451
+ inv.uomValue += addedUomValue
452
+ inv.warehouse = warehouse
453
+ inv.location = location
454
+ inv.zone = location.zone
455
+ inv.updater = user
456
+
457
+ // Save changed inventory
458
+ inv = await trxMgr.getRepository(Inventory).save(inv)
459
+ }
460
+
461
+ // Create inventory history
462
+ await generateInventoryHistory(inv, refOrder, transactionType, addedQty, addedUomValue, user, trxMgr)
463
+
464
+ return inv
465
+ }
466
+
467
+ //// @farishelmi What is the difference between deductProductAmount vs temporaryDeductProductAmount? If it is repeated function, kindly remove one of them.
468
+ export async function temporaryDeductProductAmount(
469
+ trxMgr: EntityManager,
470
+ domain: Domain,
471
+ bizplace: Bizplace,
472
+ user: User,
473
+ refOrder: RefOrderType,
474
+ originInv: Inventory,
475
+ reducedQty: number,
476
+ reducedUomValue: number,
477
+ transactionType: string,
478
+ originalQty?: number,
479
+ originalUomValue?: number,
480
+ currentUnitQty?: number,
481
+ currentUomValue?: number
482
+ ) {
483
+ if (refOrder instanceof ReleaseGood) {
484
+ const loadingWS: Worksheet = await trxMgr.getRepository(Worksheet).findOne({
485
+ where: {
486
+ domain: { id: domain.id },
487
+ bizplace: { id: bizplace.id },
488
+ releaseGood: refOrder,
489
+ type: WORKSHEET_TYPE.LOADING
490
+ },
491
+ relations: ['worksheetDetails', 'worksheetDetails.targetInventory', 'worksheetDetails.targetInventory.inventory']
492
+ })
493
+
494
+ if (!loadingWS)
495
+ throw new Error(
496
+ `Picking process is not finished yet. Please complete picking first before complete Repalletizing`
497
+ )
498
+
499
+ let orderInv: OrderInventory = loadingWS.worksheetDetails
500
+ .map((wsd: WorksheetDetail) => wsd.targetInventory)
501
+ .find((oi: OrderInventory) => oi.inventory.id === originInv.id)
502
+ if (!orderInv) {
503
+ throw new Error(`Failed to find order inventory (Pallet ID: ${originInv.palletId})`)
504
+ }
505
+
506
+ orderInv.releaseQty -= reducedQty
507
+ orderInv.releaseUomValue -= reducedUomValue
508
+ orderInv.updater = user
509
+
510
+ await trxMgr.getRepository(OrderInventory).save(orderInv)
511
+ } else {
512
+ // currentUnitQty > 0 only belongs to PackingUnits.QTY
513
+ if (currentUnitQty > 0) {
514
+ const unitUomValue: number = originInv.uomValue / originInv.qty
515
+
516
+ reducedQty = Math.floor((originalQty * originInv.packingSize - currentUnitQty) / originInv.packingSize)
517
+ reducedUomValue = unitUomValue * reducedQty
518
+
519
+ originInv.qty -= reducedQty
520
+ originInv.uomValue -= reducedUomValue
521
+ originInv.lockedQty -= originalQty
522
+ originInv.lockedUomValue -= originalUomValue
523
+ originInv.updater = user
524
+
525
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
526
+ await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
527
+
528
+ // minus 1 because remain unit qty only exist if the unitQty < 1
529
+ if (originInv.qty - 1 == 0) {
530
+ originInv.status = INVENTORY_STATUS.TERMINATED
531
+ originInv.qty = 0
532
+ originInv.uomValue = 0
533
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
534
+ await generateInventoryHistory(originInv, refOrder, transactionType, -1, -unitUomValue, user, trxMgr)
535
+
536
+ const newQty: number = currentUnitQty
537
+ const newUomValue: number = (unitUomValue / originInv.packingSize) * newQty
538
+
539
+ originInv.qty = newQty
540
+ originInv.uomValue = newUomValue
541
+ originInv.packingSize = 1
542
+ originInv.status = INVENTORY_STATUS.STORED
543
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
544
+ await generateInventoryHistory(originInv, refOrder, transactionType, newQty, newUomValue, user, trxMgr)
545
+ }
546
+
547
+ // currentUnitUomValue > 0 only belongs to PackingUnits.QTY
548
+ } else if (currentUomValue > 0) {
549
+ reducedUomValue = Math.round((originalUomValue - currentUomValue + Number.EPSILON) * 100) / 100
550
+
551
+ originInv.qty -= reducedQty
552
+ originInv.uomValue -= reducedUomValue
553
+ originInv.lockedQty -= originalQty
554
+ originInv.lockedUomValue -= originalUomValue
555
+ originInv.updater = user
556
+
557
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
558
+ await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
559
+ } else {
560
+ originInv.qty -= reducedQty
561
+ originInv.uomValue -= reducedUomValue
562
+ originInv.lockedQty -= originalQty
563
+ originInv.lockedUomValue -= originalUomValue
564
+ originInv.updater = user
565
+ originInv.status = originInv.qty > 0 ? INVENTORY_STATUS.STORED : INVENTORY_STATUS.TERMINATED
566
+
567
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
568
+ await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
569
+
570
+ if (originInv.qty <= 0 || originInv.uomValue <= 0) {
571
+ originInv.status = INVENTORY_STATUS.TERMINATED
572
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
573
+ await generateInventoryHistory(originInv, refOrder, INVENTORY_TRANSACTION_TYPE.TERMINATED, 0, 0, user, trxMgr)
574
+ }
575
+ }
576
+ }
577
+
578
+ return originInv
579
+ }
580
+
581
+ /**
582
+ * @description Assign inventory to targetVas
583
+ * When Vas order comes together with Arrival Notice or Release Good
584
+ * The vas worksheet is activated automatically by to complete unloading/picking worksheet.
585
+ * As a result user can't activate it manually, which means no assignment for every specific vas tasks.
586
+ * For this case inventory should be assigned while processing the VAS Order.
587
+ */
588
+ export async function assignInventory(
589
+ trxMgr: EntityManager,
590
+ domain: Domain,
591
+ bizplace: Bizplace,
592
+ user: User,
593
+ wsd: WorksheetDetail,
594
+ refOrder: ArrivalNotice | ReleaseGood,
595
+ targetVas: OrderVas,
596
+ palletId: string
597
+ ): Promise<OrderVas> {
598
+ let inventory: Inventory
599
+
600
+ if (refOrder instanceof ArrivalNotice) {
601
+ // Case 1. When the VAS Order comes with Arrival Notice
602
+ inventory = await trxMgr.getRepository(Inventory).findOne({
603
+ where: {
604
+ domain: { id: domain.id },
605
+ bizplace: { id: bizplace.id },
606
+ palletId,
607
+ status: In([INVENTORY_STATUS.UNLOADED, INVENTORY_STATUS.PUTTING_AWAY]),
608
+ refOrderId: refOrder.id
609
+ }
610
+ })
611
+ if (!inventory) throw new Error(`Counldn't find unloaded inventory by pallet ID: (${palletId})`)
612
+
613
+ // Check current inventory has enough qty of product to complete this target vas.
614
+ if (targetVas.qty > inventory.qty) {
615
+ // If it doesn't have enough, Need to create new worksheet detail and target vas without inventory assignment
616
+ // So the user can proceed it with another inventory
617
+ targetVas = await addNewVasTask(targetVas, inventory.qty, inventory.uomValue, domain, bizplace, user, trxMgr, wsd)
618
+ }
619
+ } else if (refOrder instanceof ReleaseGood) {
620
+ // Case 2. When the VAS Order comes with Release Good
621
+ // In this case, every available inventories are picked by picking worksheet.
622
+ // So target inventories should be found by relation with order inventory which has PICKED status
623
+ //@ts-ignore
624
+ let pickedOrdInv: OrderInventory = await trxMgr.getRepository(OrderInventory).find({
625
+ where: {
626
+ domain: { id: domain.id },
627
+ bizplace: { id: bizplace.id },
628
+ releaseGood: { id: refOrder.id },
629
+ status: ORDER_INVENTORY_STATUS.PICKED
630
+ },
631
+ relations: ['inventory']
632
+ })
633
+ //@ts-ignore
634
+ pickedOrdInv = pickedOrdInv.find((oi: OrderInventory) => oi.inventory.palletId === palletId)
635
+ inventory = pickedOrdInv?.inventory
636
+ if (!inventory) throw new Error(`Couldn't find picked inventory by pallet ID: ${palletId}`)
637
+
638
+ // Check current target inventory (picked inventory) has enough qty of product to complete this target vas.
639
+ // And available qty of products also restriced by picking. (Because customer requests do some vas for Release Order)
640
+ if (targetVas.qty > pickedOrdInv.releaseQty) {
641
+ // If it doesn't have enough, Need to create new worksheet detail and target vas without inventory assignment
642
+ // So the user can proceed it with another inventory
643
+ targetVas = await addNewVasTask(
644
+ targetVas,
645
+ pickedOrdInv.releaseQty,
646
+ pickedOrdInv.releaseUomValue,
647
+ domain,
648
+ bizplace,
649
+ user,
650
+ trxMgr,
651
+ wsd
652
+ )
653
+ }
654
+ } else {
655
+ //@ts-ignore
656
+ throw new Error(`Reference Order (${refOrder.name}) is not expected.`)
657
+ }
658
+
659
+ targetVas.inventory = inventory
660
+ targetVas.updater = user
661
+ return await trxMgr.getRepository(OrderVas).save(targetVas)
662
+ }
663
+
664
+ /**
665
+ * Dismiss assigne inventory when user click undo to remove
666
+ * proceed pallet for relabel, repack, repack
667
+ *
668
+ * @param {EntityManager} trxMgr
669
+ * @param {WorksheetDetail} wsd
670
+ * @param {OrderVas} targetVas
671
+ * @param {PalletChangesInterface[]} palletChanges
672
+ * @param {String} palletId
673
+ */
674
+ export async function dismissInventory(
675
+ trxMgr: EntityManager,
676
+ wsd: WorksheetDetail,
677
+ targetVas: OrderVas,
678
+ palletChanges: PalletChangesInterface[],
679
+ palletId: string
680
+ ) {
681
+ // If there's no more item assigned with current from pallet id
682
+ if (!palletChanges.find((rf: PalletChangesInterface) => rf.fromPalletId === palletId)) {
683
+ targetVas.inventory = null
684
+ const worksheet: Worksheet = await trxMgr.getRepository(Worksheet).findOne({
685
+ where: { id: wsd.worksheet.id },
686
+ relations: [
687
+ 'worksheetDetails',
688
+ 'worksheetDetails.targetVas',
689
+ 'worksheetDetails.targetVas.vas',
690
+ 'worksheetDetails.targetVas.inventory'
691
+ ]
692
+ })
693
+
694
+ const nonFinishedWSD: WorksheetDetail = worksheet.worksheetDetails.find(
695
+ (otherWSD: WorksheetDetail) =>
696
+ otherWSD.id !== wsd.id &&
697
+ otherWSD.targetVas.set === wsd.targetVas.set &&
698
+ otherWSD.targetVas.vas.id === wsd.targetVas.vas.id &&
699
+ otherWSD.status !== WORKSHEET_STATUS.DONE
700
+ )
701
+
702
+ if (nonFinishedWSD) {
703
+ // If there non finished same VAS, delete undo target record (worksheet detail & order vas)
704
+ // Add qty and uomValue for non finished vas task
705
+ await trxMgr.getRepository(WorksheetDetail).delete(wsd.id)
706
+ await trxMgr.getRepository(OrderVas).delete(targetVas.id)
707
+
708
+ nonFinishedWSD.targetVas.qty += targetVas.qty
709
+ nonFinishedWSD.targetVas.uomValue += targetVas.uomValue
710
+ await trxMgr.getRepository(OrderVas).save(nonFinishedWSD.targetVas)
711
+ } else {
712
+ // If there no non finished same VAS, dismiss inventory for the record
713
+ targetVas.inventory = null
714
+ await trxMgr.getRepository(OrderVas).save(wsd.targetVas)
715
+ }
716
+ }
717
+ }
718
+
719
+ /**
720
+ * @description Create nw VAS Worksheet Detail & Order Vas
721
+ * Without inventory assignment
722
+ */
723
+ export async function addNewVasTask(
724
+ targetVas: OrderVas,
725
+ currentOrderQty: number,
726
+ currentOrderUomValue: number,
727
+ domain: Domain,
728
+ bizplace: Bizplace,
729
+ user: User,
730
+ trxMgr: EntityManager,
731
+ wsd: WorksheetDetail
732
+ ): Promise<OrderVas> {
733
+ // Create new order vas & worksheet detail
734
+ const copiedTargetVas: OrderVas = Object.assign({}, targetVas)
735
+ //@ts-ignore
736
+ delete copiedTargetVas.id
737
+
738
+ let newTargetVas: OrderVas = {
739
+ ...copiedTargetVas,
740
+ domain,
741
+ bizplace,
742
+ name: OrderNoGenerator.orderVas(),
743
+ qty: targetVas.qty - currentOrderQty,
744
+ uomValue: targetVas.uomValue - currentOrderUomValue,
745
+ creator: user,
746
+ updater: user
747
+ }
748
+ newTargetVas = await trxMgr.getRepository(OrderVas).save(newTargetVas)
749
+
750
+ const copiedWSD: WorksheetDetail = Object.assign({}, wsd)
751
+ delete copiedWSD.id
752
+
753
+ const newWSD: WorksheetDetail = {
754
+ ...copiedWSD,
755
+ domain,
756
+ bizplace,
757
+ name: WorksheetNoGenerator.vasDetail(),
758
+ seq: wsd.seq++,
759
+ targetVas: newTargetVas,
760
+ creator: user,
761
+ updater: user
762
+ }
763
+ await trxMgr.getRepository(WorksheetDetail).save(newWSD)
764
+
765
+ targetVas.qty = currentOrderQty
766
+ targetVas.uomValue = currentOrderUomValue
767
+ return targetVas
768
+ }
769
+
770
+ export async function upsertInventory(
771
+ trxMgr: EntityManager,
772
+ domain: Domain,
773
+ bizplace: Bizplace,
774
+ user: User,
775
+ originInv: Inventory,
776
+ refOrder: RefOrderType,
777
+ palletId: string,
778
+ locationName: string,
779
+ packingType: string,
780
+ addedQty: number,
781
+ addedUomValue: number,
782
+ transactionType: string,
783
+ stdAmount?: number,
784
+ packingUnit?: string
785
+ ): Promise<Inventory> {
786
+ const location: Location = await trxMgr.getRepository(Location).findOne({
787
+ where: { domain: { id: domain.id }, name: locationName },
788
+ relations: ['warehouse']
789
+ })
790
+ if (!location) throw new Error(`Location is not found by (${locationName})`)
791
+ const warehouse: Warehouse = location.warehouse
792
+ const zone: string = location.zone
793
+
794
+ let inv: Inventory = await trxMgr.getRepository(Inventory).findOne({
795
+ where: {
796
+ domain: { id: domain.id },
797
+ bizplace: { id: bizplace.id },
798
+ palletId,
799
+ batchId: originInv.batchId,
800
+ product: { id: originInv.product.id },
801
+ packingType,
802
+ packingSize: stdAmount,
803
+ refOrderId: originInv.refOrderId,
804
+ status: Not(Equal(INVENTORY_STATUS.TERMINATED))
805
+ },
806
+ relations: ['product', 'refInventory']
807
+ })
808
+
809
+ // Create new inventory
810
+ if (!inv) {
811
+ const copiedInv: Inventory = Object.assign({}, originInv)
812
+ //@ts-ignore
813
+ delete copiedInv.id
814
+
815
+ inv = {
816
+ ...copiedInv,
817
+ domain,
818
+ bizplace,
819
+ palletId,
820
+ name: InventoryNoGenerator.inventoryName(),
821
+ packingType,
822
+ qty: addedQty,
823
+ //@ts-ignore
824
+ weight: 0,
825
+ uomValue: addedUomValue,
826
+ lockedQty: 0,
827
+ lockedUomValue: 0,
828
+ packingSize: packingUnit == PackingUnits.QTY ? stdAmount : 1,
829
+ warehouse,
830
+ location,
831
+ zone,
832
+ creator: user,
833
+ updater: user
834
+ }
835
+
836
+ // Save changed inventory
837
+ inv = await trxMgr.getRepository(Inventory).save(inv)
838
+
839
+ // Check whether the pallet is resuable or not
840
+ const pallet: Pallet = await trxMgr.getRepository(Pallet).findOne({
841
+ where: { domain: { id: domain.id }, name: palletId, inventory: IsNull() }
842
+ })
843
+ // If it's exists => it's reusable pallet and need to update it's inventory field
844
+ if (pallet) {
845
+ pallet.inventory = inv
846
+ pallet.updater = user
847
+ await trxMgr.getRepository(Pallet).save(pallet)
848
+ }
849
+ } else {
850
+ // Update inventory
851
+ inv.qty += addedQty
852
+ inv.uomValue += addedUomValue
853
+ inv.warehouse = warehouse
854
+ inv.location = location
855
+ inv.zone = location.zone
856
+ inv.updater = user
857
+
858
+ // Save changed inventory
859
+ inv = await trxMgr.getRepository(Inventory).save(inv)
860
+ }
861
+
862
+ // Create inventory history
863
+ await generateInventoryHistory(inv, refOrder, transactionType, addedQty, addedUomValue, user, trxMgr)
864
+
865
+ return inv
866
+ }
867
+
868
+ export async function deductProductAmount(
869
+ trxMgr: EntityManager,
870
+ domain: Domain,
871
+ bizplace: Bizplace,
872
+ user: User,
873
+ refOrder: RefOrderType,
874
+ originInv: Inventory,
875
+ reducedQty: number,
876
+ reducedUomValue: number,
877
+ transactionType: string,
878
+ originalQty?: number,
879
+ originalUomValue?: number,
880
+ currentUnitQty?: number,
881
+ currentUomValue?: number
882
+ ) {
883
+ if (refOrder instanceof ReleaseGood) {
884
+ const loadingWS: Worksheet = await trxMgr.getRepository(Worksheet).findOne({
885
+ where: {
886
+ domain: { id: domain.id },
887
+ bizplace: { id: bizplace.id },
888
+ releaseGood: { id: refOrder.id },
889
+ type: WORKSHEET_TYPE.LOADING
890
+ },
891
+ relations: ['worksheetDetails', 'worksheetDetails.targetInventory', 'worksheetDetails.targetInventory.inventory']
892
+ })
893
+
894
+ if (!loadingWS)
895
+ throw new Error(
896
+ `Picking process is not finished yet. Please complete picking first before complete Repalletizing`
897
+ )
898
+
899
+ const orderInv: OrderInventory = loadingWS.worksheetDetails
900
+ .map((wsd: WorksheetDetail) => wsd.targetInventory)
901
+ .find((oi: OrderInventory) => oi.inventory.id === originInv.id)
902
+ if (!orderInv) {
903
+ throw new Error(`Failed to find order inventory (Pallet ID: ${originInv.palletId})`)
904
+ }
905
+
906
+ orderInv.releaseQty -= reducedQty
907
+ orderInv.releaseUomValue -= reducedUomValue
908
+ orderInv.updater = user
909
+
910
+ await trxMgr.getRepository(OrderInventory).save(orderInv)
911
+ } else {
912
+ // currentUnitQty > 0 only belongs to PackingUnits.QTY
913
+ if (currentUnitQty > 0) {
914
+ const unitUomValue: number = originInv.uomValue / originInv.qty
915
+
916
+ reducedQty = Math.floor((originalQty * originInv.packingSize - currentUnitQty) / originInv.packingSize)
917
+ reducedUomValue = unitUomValue * reducedQty
918
+
919
+ originInv.qty -= reducedQty
920
+ originInv.uomValue -= reducedUomValue
921
+ originInv.lockedQty -= reducedQty
922
+ originInv.lockedUomValue -= reducedUomValue
923
+ originInv.updater = user
924
+
925
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
926
+ await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
927
+
928
+ // minus 1 because remain unit qty only exist if the unitQty < 1
929
+ if (originInv.qty - 1 == 0) {
930
+ originInv.status = INVENTORY_STATUS.TERMINATED
931
+ originInv.qty = 0
932
+ originInv.uomValue = 0
933
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
934
+ await generateInventoryHistory(originInv, refOrder, transactionType, -1, -unitUomValue, user, trxMgr)
935
+
936
+ const newQty: number = currentUnitQty
937
+ const newUomValue: number = (unitUomValue / originInv.packingSize) * newQty
938
+
939
+ originInv.qty = newQty
940
+ originInv.uomValue = newUomValue
941
+ originInv.packingSize = 1
942
+ originInv.status = INVENTORY_STATUS.STORED
943
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
944
+ await generateInventoryHistory(originInv, refOrder, transactionType, newQty, newUomValue, user, trxMgr)
945
+ }
946
+
947
+ // currentUnitUomValue > 0 only belongs to PackingUnits.UOM
948
+ } else if (currentUomValue > 0) {
949
+ reducedUomValue = Math.round((originalUomValue - currentUomValue + Number.EPSILON) * 100) / 100
950
+
951
+ originInv.qty -= reducedQty
952
+ originInv.uomValue -= reducedUomValue
953
+ originInv.lockedQty -= reducedQty
954
+ originInv.lockedUomValue -= reducedUomValue
955
+ originInv.updater = user
956
+
957
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
958
+ await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
959
+ } else {
960
+ originInv.qty -= reducedQty
961
+ originInv.uomValue -= reducedUomValue
962
+ originInv.lockedQty -= reducedQty
963
+ originInv.lockedUomValue -= reducedUomValue
964
+ originInv.updater = user
965
+ originInv.status = originInv.qty > 0 ? INVENTORY_STATUS.STORED : INVENTORY_STATUS.TERMINATED
966
+
967
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
968
+ await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
969
+
970
+ if (originInv.qty <= 0 || originInv.uomValue <= 0) {
971
+ originInv.status = INVENTORY_STATUS.TERMINATED
972
+ originInv = await trxMgr.getRepository(Inventory).save(originInv)
973
+ await generateInventoryHistory(originInv, refOrder, INVENTORY_TRANSACTION_TYPE.TERMINATED, 0, 0, user, trxMgr)
974
+ }
975
+ }
976
+ }
977
+
978
+ return originInv
979
+ }
980
+
981
+ export async function createPutawayWorksheet(
982
+ trxMgr: EntityManager,
983
+ domain: Domain,
984
+ bizplace: Bizplace,
985
+ user: User,
986
+ refOrder: ArrivalNotice,
987
+ originInv: Inventory,
988
+ changedInv: Inventory
989
+ ): Promise<void> {
990
+ const putawayWS: Worksheet = await trxMgr.getRepository(Worksheet).findOne({
991
+ where: {
992
+ domain: { id: domain.id },
993
+ bizplace: { id: bizplace.id },
994
+ arrivalNotice: { id: refOrder.id },
995
+ type: WORKSHEET_TYPE.PUTAWAY
996
+ },
997
+ relations: ['worksheetDetails', 'worksheetDetails.targetInventory', 'worksheetDetails.targetInventory.inventory']
998
+ })
999
+
1000
+ if (!putawayWS) {
1001
+ throw new Error(
1002
+ `Unloading process is not finished yet. Please complete unloading first before complete Repalletizing`
1003
+ )
1004
+ }
1005
+ const putawayWSDs: WorksheetDetail[] = putawayWS.worksheetDetails
1006
+
1007
+ const originalWSD: WorksheetDetail = putawayWSDs.find(
1008
+ (wsd: WorksheetDetail) => wsd.targetInventory.inventory.id === originInv.id
1009
+ )
1010
+ const originOrdInv: OrderInventory = originalWSD.targetInventory
1011
+ const sameTargetWSD: WorksheetDetail = putawayWSDs.find(
1012
+ (wsd: WorksheetDetail) => wsd.targetInventory.inventory.id === changedInv.id
1013
+ )
1014
+
1015
+ if (!sameTargetWSD) {
1016
+ // Create new order inventory
1017
+ const copiedOrdInv: OrderInventory = Object.assign({}, originOrdInv)
1018
+ //@ts-ignore
1019
+ delete copiedOrdInv.id
1020
+
1021
+ let newOrdInv: OrderInventory = {
1022
+ ...copiedOrdInv,
1023
+ domain,
1024
+ bizplace,
1025
+ name: OrderNoGenerator.orderInventory(),
1026
+ type: ORDER_TYPES.ARRIVAL_NOTICE,
1027
+ arrivalNotice: refOrder,
1028
+ inventory: changedInv,
1029
+ creator: user,
1030
+ updater: user
1031
+ }
1032
+ newOrdInv = await trxMgr.getRepository(OrderInventory).save(newOrdInv)
1033
+
1034
+ const copiedWSD: WorksheetDetail = Object.assign({}, originalWSD)
1035
+ delete copiedWSD.id
1036
+
1037
+ let newWSD: WorksheetDetail = {
1038
+ ...copiedWSD,
1039
+ domain,
1040
+ bizplace,
1041
+ worksheet: putawayWS,
1042
+ name: WorksheetNoGenerator.putawayDetail(),
1043
+ targetInventory: newOrdInv,
1044
+ type: WORKSHEET_TYPE.PUTAWAY,
1045
+ creator: user,
1046
+ updater: user
1047
+ }
1048
+ newWSD = await trxMgr.getRepository(WorksheetDetail).save(newWSD)
1049
+ }
1050
+
1051
+ // Update origin order inventory
1052
+ if (originInv.status === INVENTORY_STATUS.TERMINATED) {
1053
+ await trxMgr.getRepository(WorksheetDetail).delete(originalWSD.id)
1054
+
1055
+ originOrdInv.status = ORDER_INVENTORY_STATUS.DONE
1056
+ originOrdInv.updater = user
1057
+ await trxMgr.getRepository(OrderInventory).save(originOrdInv)
1058
+ }
1059
+ }
1060
+
1061
+ export async function createLoadingWorksheet(
1062
+ trxMgr: EntityManager,
1063
+ domain: Domain,
1064
+ bizplace: Bizplace,
1065
+ user: User,
1066
+ refOrder: ReleaseGood,
1067
+ originInv: OrderInventory,
1068
+ changedInv: Inventory
1069
+ ): Promise<void> {
1070
+ const changedQty: number = changedInv.qty
1071
+ const changedUomValue: number = changedInv.uomValue
1072
+ const loadingWS: Worksheet = await trxMgr.getRepository(Worksheet).findOne({
1073
+ where: {
1074
+ domain: { id: domain.id },
1075
+ bizplace: { id: bizplace.id },
1076
+ releaseGood: { id: refOrder.id },
1077
+ type: WORKSHEET_TYPE.LOADING
1078
+ },
1079
+ relations: ['worksheetDetails', 'worksheetDetails.targetInventory', 'worksheetDetails.targetInventory.inventory']
1080
+ })
1081
+
1082
+ if (!loadingWS) {
1083
+ throw new Error(`Picking process is not finished yet. Please complete picking first before complete Repalletizing`)
1084
+ }
1085
+
1086
+ const loadingWSDs: WorksheetDetail[] = loadingWS.worksheetDetails
1087
+
1088
+ const originalWSD: WorksheetDetail = loadingWSDs.find(
1089
+ (wsd: WorksheetDetail) => wsd.targetInventory.inventory.id === originInv.id
1090
+ )
1091
+ const originOrdInv: OrderInventory = originalWSD.targetInventory
1092
+ const sameTargetWSD: WorksheetDetail = loadingWSDs.find((wsd: WorksheetDetail) => {
1093
+ const targetOI: OrderInventory = wsd.targetInventory
1094
+ const targetInv: Inventory = targetOI.inventory
1095
+ const targetUnitUomValue: number = targetOI.releaseUomValue / targetOI.releaseQty
1096
+ const changeUnitUomValue: number = changedUomValue / changedQty
1097
+
1098
+ if (
1099
+ targetInv.palletId === changedInv.palletId &&
1100
+ targetInv.batchId === changedInv.batchId &&
1101
+ targetInv.packingType === changedInv.packingType &&
1102
+ targetUnitUomValue === changeUnitUomValue
1103
+ ) {
1104
+ return wsd
1105
+ }
1106
+ })
1107
+
1108
+ if (!sameTargetWSD) {
1109
+ // Create new order inventory
1110
+ const copiedOrderInv: OrderInventory = Object.assign({}, originOrdInv)
1111
+ //@ts-ignore
1112
+ delete copiedOrderInv.id
1113
+
1114
+ let newOrdInv: OrderInventory = await trxMgr.getRepository(OrderInventory).save({
1115
+ ...copiedOrderInv,
1116
+ domain,
1117
+ bizplace,
1118
+ releaseQty: changedQty,
1119
+ releaseUomValue: changedUomValue,
1120
+ name: OrderNoGenerator.orderInventory(),
1121
+ type: ORDER_TYPES.RELEASE_OF_GOODS,
1122
+ releaseGood: refOrder,
1123
+ inventory: changedInv,
1124
+ creator: user,
1125
+ updater: user
1126
+ })
1127
+ newOrdInv = await trxMgr.getRepository(OrderInventory).save(newOrdInv)
1128
+
1129
+ const copiedWSD: WorksheetDetail = Object.assign({}, originalWSD)
1130
+ delete copiedWSD.id
1131
+
1132
+ let newWSD: WorksheetDetail = {
1133
+ ...copiedWSD,
1134
+ domain,
1135
+ bizplace,
1136
+ worksheet: loadingWS,
1137
+ name: WorksheetNoGenerator.loadingDetail(),
1138
+ targetInventory: newOrdInv,
1139
+ type: WORKSHEET_TYPE.LOADING,
1140
+ creator: user,
1141
+ updater: user
1142
+ }
1143
+ await trxMgr.getRepository(WorksheetDetail).save(newWSD)
1144
+ } else {
1145
+ let sameTargetInv: OrderInventory = sameTargetWSD.targetInventory
1146
+ sameTargetInv.releaseQty += changedQty
1147
+ sameTargetInv.releaseUomValue += changedUomValue
1148
+ sameTargetInv.updater = user
1149
+ await trxMgr.getRepository(OrderInventory).save(sameTargetInv)
1150
+ }
1151
+
1152
+ // Update inventory to PICKED inventory
1153
+ changedInv = await trxMgr.getRepository(Inventory).save({
1154
+ ...changedInv,
1155
+ qty: changedInv.qty - changedQty,
1156
+ uomValue: changedInv.uomValue - changedUomValue,
1157
+ updater: user
1158
+ })
1159
+
1160
+ // Generate PICKING inventory history
1161
+ await generateInventoryHistory(
1162
+ changedInv,
1163
+ refOrder,
1164
+ INVENTORY_TRANSACTION_TYPE.PICKING,
1165
+ -changedQty,
1166
+ -changedUomValue,
1167
+ user,
1168
+ trxMgr
1169
+ )
1170
+
1171
+ // Generate TERMINATED inventory history
1172
+ await generateInventoryHistory(changedInv, refOrder, INVENTORY_TRANSACTION_TYPE.TERMINATED, 0, 0, user, trxMgr)
1173
+
1174
+ // Delete worksheet detail & order inventory
1175
+ // If order inventory doesn't have release qty any more
1176
+ if (originOrdInv.releaseQty <= 0) {
1177
+ await trxMgr.getRepository(WorksheetDetail).delete(originalWSD.id)
1178
+ originInv.status = ORDER_INVENTORY_STATUS.DONE
1179
+ originInv.updater = user
1180
+ await trxMgr.getRepository(OrderInventory).save(originInv)
1181
+ }
1182
+ }