@things-factory/worksheet-base 8.0.0-beta.8 → 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,848 @@
1
+ import { EntityManager, Equal, In, Not } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Bizplace } from '@things-factory/biz-base'
5
+ import { Product } from '@things-factory/product-base'
6
+ import {
7
+ ArrivalNotice,
8
+ ORDER_STATUS,
9
+ ORDER_TYPES,
10
+ ORDER_VAS_STATUS,
11
+ OrderNoGenerator,
12
+ OrderVas,
13
+ ReleaseGood,
14
+ VAS,
15
+ VasOrder
16
+ } from '@things-factory/sales-base'
17
+ import {
18
+ Inventory,
19
+ INVENTORY_STATUS,
20
+ INVENTORY_TRANSACTION_TYPE,
21
+ InventoryHistory,
22
+ InventoryNoGenerator,
23
+ Location,
24
+ LOCATION_TYPE
25
+ } from '@things-factory/warehouse-base'
26
+
27
+ import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
28
+ import { Worksheet, WorksheetDetail } from '../../entities'
29
+ import {
30
+ completeRelabeling,
31
+ completeRepackaging,
32
+ completeRepalletizing,
33
+ completeUnpacking,
34
+ FeaturedInventoryInterface,
35
+ RefOrderType
36
+ } from '../../graphql/resolvers/worksheet/vas-transactions'
37
+ import { PackingUnits } from '../../graphql/resolvers/worksheet/vas-transactions/interfaces/repackaging'
38
+ import { generateInventoryHistory } from '../../utils'
39
+ import { ReferenceOrderType, WorksheetController } from '../worksheet-controller'
40
+
41
+ type CompleteTransactionType = (trxMgr: EntityManager, orderVas: OrderVas, user: User) => Promise<void>
42
+
43
+ export class VasWorksheetController extends WorksheetController {
44
+ private readonly COMPLETE_TRX_MAP: Record<string, CompleteTransactionType> = {
45
+ 'vas-repalletizing': completeRepalletizing,
46
+ 'vas-repack': completeRepackaging,
47
+ 'vas-repack-relabel': completeRepackaging,
48
+ 'vas-relabel': completeRelabeling,
49
+ 'vas-unpack': completeUnpacking
50
+ }
51
+
52
+ async generateVasWorksheet(referenceOrder: ReferenceOrderType): Promise<Worksheet> {
53
+ let orderStatus = referenceOrder.status
54
+ let orderVASs: OrderVas[]
55
+
56
+ if (referenceOrder instanceof ArrivalNotice) {
57
+ //@ts-ignore
58
+ const arrivalNotice: ArrivalNotice = await this.findRefOrder(ArrivalNotice, referenceOrder, ['orderVass'])
59
+ orderVASs = arrivalNotice.orderVass
60
+ } else if (referenceOrder instanceof ReleaseGood) {
61
+ //@ts-ignore
62
+ const releaseGood: ReleaseGood = await this.findRefOrder(ReleaseGood, referenceOrder, ['orderVass'])
63
+ orderVASs = releaseGood.orderVass
64
+ } else {
65
+ //@ts-ignore
66
+ const vasOrder: VasOrder = await this.findRefOrder(VasOrder, referenceOrder, ['orderVass'])
67
+ orderVASs = vasOrder.orderVass
68
+ orderStatus = ORDER_STATUS.READY_TO_EXECUTE
69
+ }
70
+
71
+ return await this.generateWorksheet(
72
+ WORKSHEET_TYPE.VAS,
73
+ referenceOrder,
74
+ orderVASs,
75
+ orderStatus,
76
+ ORDER_VAS_STATUS.READY_TO_PROCESS
77
+ )
78
+ }
79
+
80
+ async assignInventories(worksheetDetailIds: string[], inventories: Partial<Inventory>): Promise<void> {
81
+ const worksheetDetails: WorksheetDetail[] = await this.trxMgr.getRepository(WorksheetDetail).find({
82
+ where: { id: In(worksheetDetailIds) },
83
+ relations: [
84
+ 'bizplace',
85
+ 'worksheet',
86
+ 'targetVas',
87
+ 'targetVas.arrivalNotice',
88
+ 'targetVas.releaseGood',
89
+ 'targetVas.shippingOrder',
90
+ 'targetVas.vasOrder',
91
+ 'targetVas.vas',
92
+ 'targetVas.targetProduct'
93
+ ]
94
+ })
95
+
96
+ let seq: number = 0
97
+
98
+ for (let worksheetDetail of worksheetDetails) {
99
+ const bizplace: Bizplace = worksheetDetail.bizplace
100
+ const worksheet: Worksheet = worksheetDetail.worksheet
101
+ const targetVas: OrderVas = worksheetDetail.targetVas
102
+
103
+ let newWorksheetDetail: Partial<WorksheetDetail> = Object.assign({}, worksheetDetail)
104
+ delete newWorksheetDetail.id
105
+
106
+ // get accumulated inventories qty
107
+ //@ts-ignore
108
+ const accInventoriesQty: number = inventories.reduce((acc, inv) => {
109
+ return acc + inv.qty
110
+ }, 0)
111
+
112
+ let operationGuide = JSON.parse(targetVas.operationGuide)
113
+ let vasOperationGuide = targetVas.vas?.operationGuide
114
+
115
+ if (vasOperationGuide === 'vas-repack' || vasOperationGuide === 'vas-repack-relabel') {
116
+ const mainInventory: Inventory = inventories[0]
117
+ const featuredInvs: FeaturedInventoryInterface[] = []
118
+ const foundInvs: Inventory[] = await this.trxMgr
119
+ .getRepository(Inventory)
120
+ //@ts-ignore
121
+ .findByIds(inventories.filter(inv => inv.id !== mainInventory.id).map(inv => inv.id))
122
+
123
+ /* Update lockedQty of featuredInvs */
124
+ for (let inventory of foundInvs) {
125
+ //@ts-ignore
126
+ const transferQty: number = inventories.find(inv => inv.id === inventory.id).qty
127
+ const transferUomValue: number = Math.round((inventory.uomValue / inventory.qty) * transferQty * 100) / 100
128
+
129
+ inventory.lockedQty += transferQty
130
+ inventory.lockedUomValue += transferUomValue
131
+
132
+ await this.trxMgr.getRepository(Inventory).save(inventory)
133
+
134
+ let featuredInv: FeaturedInventoryInterface = {
135
+ palletId: inventory.palletId,
136
+ originalQty: transferQty,
137
+ originalUomValue: transferUomValue,
138
+ packingSize: inventory.packingSize,
139
+ uomValuePerQty: inventory.uomValue / (inventory.qty * inventory.packingSize)
140
+ }
141
+
142
+ switch (operationGuide.data?.packingUnit) {
143
+ case PackingUnits.QTY:
144
+ featuredInv.currentUnitQty = transferQty * inventory.packingSize
145
+ break
146
+
147
+ case PackingUnits.UOM:
148
+ featuredInv.currentUomValue = transferUomValue
149
+ break
150
+ }
151
+
152
+ featuredInvs.push(featuredInv)
153
+ }
154
+
155
+ /* assign featuredInvs inside operationGuide.data */
156
+ operationGuide.data = {
157
+ ...operationGuide.data,
158
+ featuredInvs
159
+ }
160
+
161
+ /* assign main inventory as the only inventories */
162
+ //@ts-ignore
163
+ inventories = [mainInventory]
164
+ }
165
+
166
+ //@ts-ignore
167
+ for (let inventory of inventories) {
168
+ let newTargetVas: OrderVas = new OrderVas()
169
+
170
+ const foundInventory: Inventory = await this.trxMgr.getRepository(Inventory).findOne(inventory.id)
171
+ if (!foundInventory) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(inventory.id))
172
+
173
+ // assigned inventory qty that was passed from client side
174
+ const assignedQty = inventory.qty
175
+ const unitUomValue: number = foundInventory.uomValue / foundInventory.qty
176
+
177
+ // update unpack qty for unpacking vas
178
+ if (vasOperationGuide === 'vas-unpack') {
179
+ operationGuide.data.unpackQty = Math.round(operationGuide.data.unpackQty / accInventoriesQty) * assignedQty
180
+ }
181
+
182
+ if (vasOperationGuide === 'vas-repack' || vasOperationGuide === 'vas-repack-relabel') {
183
+ switch (operationGuide.data?.packingUnit) {
184
+ case PackingUnits.UOM:
185
+ newTargetVas.qty = 1
186
+ newTargetVas.uomValue = targetVas.uomValue
187
+ break
188
+
189
+ default:
190
+ newTargetVas.qty = accInventoriesQty
191
+ newTargetVas.uomValue = accInventoriesQty * unitUomValue
192
+ }
193
+ } else {
194
+ newTargetVas.qty = assignedQty
195
+ newTargetVas.uomValue = assignedQty * unitUomValue
196
+ }
197
+
198
+ newTargetVas.set = targetVas.set
199
+ newTargetVas.targetType = targetVas.targetType
200
+ newTargetVas.targetBatchId = targetVas.targetBatchId
201
+ newTargetVas.packingType = targetVas.packingType
202
+ newTargetVas.operationGuide = operationGuide ? JSON.stringify(operationGuide) : null
203
+ newTargetVas.type = targetVas.type
204
+ newTargetVas.remark = targetVas.remark
205
+ newTargetVas.status = targetVas.status
206
+ newTargetVas.targetProduct = targetVas.targetProduct
207
+ newTargetVas.vasOrder = targetVas.vasOrder
208
+ newTargetVas.vas = targetVas.vas
209
+ newTargetVas.domain = this.domain
210
+ newTargetVas.name = OrderNoGenerator.orderVas()
211
+ newTargetVas.inventory = foundInventory
212
+ newTargetVas.bizplace = bizplace
213
+ newTargetVas.creator = this.user
214
+ newTargetVas.updater = this.user
215
+ newTargetVas = await this.trxMgr.getRepository(OrderVas).save(newTargetVas)
216
+
217
+ await this.createWorksheetDetails(worksheet, WORKSHEET_TYPE.VAS, [newTargetVas])
218
+ seq++
219
+
220
+ // update inventory locked qty & uom value
221
+ const currentLockedQty: number = foundInventory.lockedQty || 0
222
+ const currentLockedUomValue: number = foundInventory.lockedUomValue || 0
223
+
224
+ await this.trxMgr.getRepository(Inventory).save({
225
+ ...foundInventory,
226
+ lockedQty: inventory.qty + currentLockedQty,
227
+ lockedUomValue: inventory.qty * unitUomValue + currentLockedUomValue,
228
+ updater: this.user
229
+ })
230
+ }
231
+
232
+ await this.trxMgr.getRepository(WorksheetDetail).delete(worksheetDetail.id)
233
+ await this.trxMgr.getRepository(OrderVas).delete(targetVas.id)
234
+ }
235
+ }
236
+
237
+ async activateVAS(worksheetNo: string, vasWorksheetDetails: Partial<WorksheetDetail>[]): Promise<Worksheet> {
238
+ const worksheet: Worksheet = await this.findActivatableWorksheet(worksheetNo, WORKSHEET_TYPE.VAS, [
239
+ 'vasOrder',
240
+ 'worksheetDetails',
241
+ 'worksheetDetails.targetVas'
242
+ ])
243
+
244
+ const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
245
+ const targetVass: OrderVas[] = worksheetDetails.map((wsd: WorksheetDetail) => {
246
+ let targetVas: OrderVas = wsd.targetVas
247
+ targetVas.status = ORDER_VAS_STATUS.PROCESSING
248
+ targetVas.updater = this.user
249
+ return targetVas
250
+ })
251
+
252
+ // Update VAS Order if it's pure VAS Order (status: READY_TO_PROCESS => PROCESSING)
253
+ let vasOrder: VasOrder = worksheet.vasOrder
254
+ if (vasOrder?.id) {
255
+ vasOrder.status = ORDER_STATUS.PROCESSING
256
+ vasOrder.updater = this.user
257
+
258
+ await this.updateRefOrder(vasOrder)
259
+ }
260
+
261
+ await this.updateOrderTargets(targetVass)
262
+ return await this.activateWorksheet(worksheet, worksheetDetails, vasWorksheetDetails)
263
+ }
264
+
265
+ async unpackingWithPallet(
266
+ worksheetDetailName: string,
267
+ childProduct: Partial<Product>,
268
+ unpackQty: number,
269
+ unpackUomValue: number,
270
+ palletId: string,
271
+ locationName: string,
272
+ refOrder: RefOrderType
273
+ ): Promise<void> {
274
+ await this.checkPalletDuplication(palletId)
275
+
276
+ const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
277
+ where: {
278
+ name: worksheetDetailName,
279
+ type: WORKSHEET_TYPE.VAS,
280
+ status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED))
281
+ },
282
+ relations: ['bizplace', 'worksheet', 'worksheet.vasOrder', 'targetVas', 'targetVas.inventory']
283
+ })
284
+ if (!worksheetDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(worksheetDetailName))
285
+
286
+ const targetVas: OrderVas = worksheetDetail.targetVas
287
+ const bizplace: Bizplace = worksheetDetail.bizplace
288
+
289
+ const location: Location = await this.trxMgr.getRepository(Location).findOne({
290
+ where: {
291
+ domain: { id: this.domain.id },
292
+ name: locationName,
293
+ type: In([LOCATION_TYPE.SHELF, LOCATION_TYPE.BUFFER, LOCATION_TYPE.FLOOR])
294
+ },
295
+ relations: ['warehouse']
296
+ })
297
+ if (!location) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(locationName))
298
+
299
+ const warehouse = location.warehouse
300
+ const zone: string = location.zone
301
+
302
+ // create new unpacked inventory
303
+ let newInventory: Partial<Inventory> = new Inventory()
304
+ newInventory.bizplace = bizplace
305
+ newInventory.name = InventoryNoGenerator.inventoryName()
306
+ newInventory.palletId = palletId
307
+ newInventory.batchId = worksheetDetail.targetVas.targetBatchId
308
+ //@ts-ignore
309
+ newInventory.product = childProduct
310
+ newInventory.packingType = childProduct.packingType
311
+ newInventory.uom = childProduct.primaryUnit
312
+ newInventory.remark = null
313
+ newInventory.qty = unpackQty
314
+ newInventory.uomValue = unpackUomValue * unpackQty
315
+ newInventory.refOrderId = refOrder.id
316
+ newInventory.warehouse = warehouse
317
+ newInventory.location = location
318
+ newInventory.zone = zone
319
+ newInventory.orderVasId = targetVas.id
320
+ newInventory.status = INVENTORY_STATUS.STORED
321
+
322
+ newInventory = await this.transactionInventory(
323
+ newInventory,
324
+ //@ts-ignore
325
+ refOrder,
326
+ newInventory.qty,
327
+ newInventory.uomValue,
328
+ INVENTORY_TRANSACTION_TYPE.UNPACKING
329
+ )
330
+
331
+ // find inventory history that might exist due to undo unpacking process
332
+ const existInventoryHistories: InventoryHistory[] = await this.trxMgr.getRepository(InventoryHistory).find({
333
+ where: {
334
+ domain: { id: this.domain.id },
335
+ inventory: null,
336
+ palletId
337
+ },
338
+ relations: ['domain', 'inventory']
339
+ })
340
+
341
+ // if found any, update the inventory id
342
+ if (existInventoryHistories.length) {
343
+ existInventoryHistories.forEach(async (invHistory: InventoryHistory) => {
344
+ await this.trxMgr.getRepository(InventoryHistory).save({
345
+ ...invHistory,
346
+ inventory: newInventory
347
+ })
348
+ })
349
+
350
+ newInventory = await this.trxMgr.getRepository(Inventory).save({
351
+ ...newInventory,
352
+ lastSeq: Math.max(...existInventoryHistories.map(invHist => invHist.seq)) + 1
353
+ })
354
+ }
355
+
356
+ // add picking and terminated for unpacking in RO
357
+ if (refOrder instanceof ReleaseGood) {
358
+ newInventory.qty = 0
359
+ newInventory.uomValue = 0
360
+ newInventory = await this.transactionInventory(
361
+ newInventory,
362
+ refOrder,
363
+ -newInventory.qty,
364
+ -newInventory.uomValue,
365
+ INVENTORY_TRANSACTION_TYPE.PICKING
366
+ )
367
+
368
+ newInventory.status = INVENTORY_STATUS.TERMINATED
369
+ await this.transactionInventory(newInventory, refOrder, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
370
+ }
371
+
372
+ // update actual qty and actual uom value of order_vass
373
+ let actualQty: number = 0
374
+ let actualUomValue: number = 0
375
+
376
+ actualQty = Number(targetVas.actualQty) + Number(unpackQty)
377
+ actualUomValue = Number(targetVas.actualUomValue) + Number(unpackUomValue)
378
+
379
+ let newTargetVas: OrderVas = Object.assign({}, targetVas)
380
+ newTargetVas.actualQty = actualQty
381
+ newTargetVas.actualUomValue = actualUomValue
382
+
383
+ await this.trxMgr.getRepository(Inventory).save(newInventory)
384
+ await this.trxMgr.getRepository(OrderVas).save(newTargetVas)
385
+ }
386
+
387
+ async executeVAS(worksheetDetail: Partial<WorksheetDetail>, palletId?: string): Promise<void> {
388
+ const worksheetDetailName = worksheetDetail.name
389
+ let foundWorksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
390
+ worksheetDetailName,
391
+ WORKSHEET_TYPE.VAS,
392
+ [
393
+ 'bizplace',
394
+ 'worksheet',
395
+ 'worksheet.arrivalNotice',
396
+ 'worksheet.releaseGood',
397
+ 'targetVas',
398
+ 'targetVas.vas',
399
+ 'targetVas.arrivalNotice',
400
+ 'targetVas.releaseGood',
401
+ 'targetVas.vasOrder',
402
+ 'targetVas.targetProduct',
403
+ 'targetVas.inventory'
404
+ ]
405
+ )
406
+ const bizplace: Bizplace = foundWorksheetDetail.bizplace
407
+ const worksheet: Worksheet = foundWorksheetDetail.worksheet
408
+
409
+ if (palletId) {
410
+ const inventory: Inventory = await this.checkPalletAcceptable(palletId, worksheet, foundWorksheetDetail)
411
+
412
+ let targetVas: OrderVas = foundWorksheetDetail.targetVas
413
+ const totalTargetQty: number = targetVas.qty
414
+ // inventory assigment
415
+ targetVas.inventory = inventory
416
+ // 현재 작업 대상 target vas의 수량을 inventory의 수량 만큼 감소 시킴
417
+ targetVas.qty = inventory.qty
418
+ targetVas = await this.trxMgr.getRepository(OrderVas).save(targetVas)
419
+ // 남은 수량이 있다면 새로운 worksheet detail과 target vas를 생성
420
+
421
+ const remainQty: number = totalTargetQty - inventory.qty
422
+ if (remainQty > 0) {
423
+ let newTargetVas: Partial<OrderVas> = Object.assign({}, targetVas)
424
+ //@ts-ignore
425
+ delete newTargetVas.id
426
+ newTargetVas.domain = this.domain
427
+ newTargetVas.bizplace = bizplace
428
+ newTargetVas.name = OrderNoGenerator.orderVas()
429
+ newTargetVas.qty = remainQty
430
+ newTargetVas.creator = this.user
431
+ newTargetVas.updater = this.user
432
+ newTargetVas = await this.trxMgr.getRepository(OrderVas).save(newTargetVas)
433
+
434
+ // Create new worksheet detail
435
+ //@ts-ignore
436
+ await this.createWorksheetDetails(worksheet, WORKSHEET_TYPE.VAS, [newTargetVas], {
437
+ status: foundWorksheetDetail.status
438
+ })
439
+ }
440
+ }
441
+
442
+ //@ts-ignore
443
+ const targetVas: VasOrder = foundWorksheetDetail.targetVas
444
+ if (!targetVas) throw new Error(`VAS doesn't exists`)
445
+
446
+ const inventory: Inventory = foundWorksheetDetail.targetVas.inventory
447
+
448
+ // reset lockedQty if there's inventory found
449
+ if (
450
+ inventory &&
451
+ //@ts-ignore
452
+ inventory.lockedQty >= targetVas.qty &&
453
+ //@ts-ignore
454
+ targetVas.vas.operationGuide &&
455
+ //@ts-ignore
456
+ targetVas.vas.operationGuide !== 'vas-repack' &&
457
+ //@ts-ignore
458
+ targetVas.vas.operationGuide !== 'vas-repack-relabel'
459
+ ) {
460
+ await this.trxMgr.getRepository(Inventory).save({
461
+ ...inventory,
462
+ //@ts-ignore
463
+ lockedQty: inventory.lockedQty - targetVas.qty,
464
+ //@ts-ignore
465
+ lockedUomValue: inventory.lockedUomValue - targetVas.uomValue
466
+ })
467
+ }
468
+
469
+ // 1. update status of worksheetDetail (EXECUTING => DONE)
470
+ foundWorksheetDetail = Object.assign(foundWorksheetDetail, worksheetDetail)
471
+ foundWorksheetDetail.status = WORKSHEET_STATUS.DONE
472
+ foundWorksheetDetail.updater = this.user
473
+ await this.trxMgr.getRepository(WorksheetDetail).save(foundWorksheetDetail)
474
+
475
+ // 2. update vas
476
+ targetVas.status = ORDER_VAS_STATUS.COMPLETED
477
+ targetVas.updater = this.user
478
+ //@ts-ignore
479
+ await this.updateOrderTargets([targetVas])
480
+ }
481
+
482
+ async undoVAS(worksheetDetail: Partial<WorksheetDetail>): Promise<void> {
483
+ const worksheetDetailName: string = worksheetDetail.name
484
+ worksheetDetail = await this.findWorksheetDetailByName(worksheetDetailName, [
485
+ 'worksheet',
486
+ 'targetVas',
487
+ 'targetVas.vas',
488
+ 'targetVas.vasOrder',
489
+ 'targetVas.inventory'
490
+ ])
491
+ this.checkRecordValidity(worksheetDetail, { status: WORKSHEET_STATUS.DONE, type: WORKSHEET_TYPE.VAS })
492
+
493
+ let targetVas: OrderVas = worksheetDetail.targetVas
494
+ const inventory: Inventory = targetVas.inventory
495
+
496
+ // update lockedQty if there's inventory found
497
+ if (inventory) {
498
+ await this.trxMgr.getRepository(Inventory).save({
499
+ ...inventory,
500
+ lockedQty: inventory.lockedQty + targetVas.qty,
501
+ lockedUomValue: inventory.lockedUomValue + targetVas.uomValue
502
+ })
503
+ }
504
+
505
+ targetVas.status = ORDER_VAS_STATUS.PROCESSING
506
+ targetVas.updater = this.user
507
+ await this.updateOrderTargets([targetVas])
508
+
509
+ worksheetDetail.status = WORKSHEET_STATUS.EXECUTING
510
+ worksheetDetail.issue = ''
511
+ worksheetDetail.updater = this.user
512
+ await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetail)
513
+ }
514
+
515
+ async undoVasInventory(worksheetDetailName: string, palletId: string): Promise<void> {
516
+ const worksheetDetail = await this.findWorksheetDetailByName(worksheetDetailName, [
517
+ 'domain',
518
+ 'bizplace',
519
+ 'worksheet',
520
+ 'targetVas',
521
+ 'targetVas.vas',
522
+ 'targetVas.vasOrder',
523
+ 'targetVas.inventory'
524
+ ])
525
+ const bizplace: Bizplace = worksheetDetail.bizplace
526
+ const targetVas: OrderVas = worksheetDetail.targetVas
527
+ const { arrivalNotice, releaseGood, vasOrder } = targetVas
528
+ const refOrder: RefOrderType = arrivalNotice || releaseGood || vasOrder
529
+
530
+ let vasInventory: Inventory = await this.trxMgr.getRepository(Inventory).findOne({
531
+ where: {
532
+ domain: { id: this.domain.id },
533
+ bizplace: { id: bizplace.id },
534
+ orderVasId: targetVas.id,
535
+ palletId
536
+ }
537
+ })
538
+
539
+ let newTargetVas: OrderVas = new OrderVas()
540
+ //@ts-ignore
541
+ newTargetVas.id = targetVas.id
542
+ newTargetVas.name = targetVas.name
543
+ newTargetVas.description = targetVas.description
544
+ newTargetVas.set = targetVas.set
545
+ newTargetVas.targetType = targetVas.targetType
546
+ newTargetVas.targetBatchId = targetVas.targetBatchId
547
+ newTargetVas.packingType = targetVas.packingType
548
+ newTargetVas.operationGuide = targetVas.operationGuide
549
+ newTargetVas.type = targetVas.type
550
+ newTargetVas.remark = targetVas.remark
551
+ newTargetVas.status = targetVas.status
552
+ newTargetVas.targetProduct = targetVas.targetProduct
553
+ newTargetVas.vasOrder = targetVas.vasOrder
554
+ newTargetVas.vas = targetVas.vas
555
+ newTargetVas.domain = this.domain
556
+ newTargetVas.name = targetVas.name
557
+ newTargetVas.qty = targetVas.qty
558
+ newTargetVas.uomValue = targetVas.uomValue
559
+ newTargetVas.inventory = targetVas.inventory
560
+ newTargetVas.bizplace = bizplace
561
+ newTargetVas.creator = this.user
562
+ newTargetVas.updater = this.user
563
+ newTargetVas.actualQty = targetVas.actualQty - vasInventory.qty
564
+ newTargetVas.actualUomValue =
565
+ targetVas.actualUomValue - Math.round((vasInventory.uomValue / vasInventory.qty) * 100) / 100
566
+
567
+ vasInventory.lastSeq++
568
+ vasInventory.status = INVENTORY_STATUS.DELETED
569
+ vasInventory = await this.transactionInventory(
570
+ vasInventory,
571
+ refOrder,
572
+ -vasInventory.qty,
573
+ -vasInventory.uomValue,
574
+ INVENTORY_TRANSACTION_TYPE.UNDO_UNPACKING
575
+ )
576
+ // vasInventory.qty = 0
577
+ // vasInventory.weight = 0
578
+ // vasInventory.uomValue = 0
579
+ // vasInventory.updater = this.user
580
+
581
+ await this.updateOrderTargets([newTargetVas])
582
+
583
+ await this.trxMgr.getRepository(InventoryHistory).update({ inventory: vasInventory }, { inventory: null })
584
+ await this.trxMgr.getRepository(Inventory).delete({ id: vasInventory.id })
585
+ }
586
+
587
+ private async checkPalletAcceptable(
588
+ palletId: string,
589
+ worksheet: Worksheet,
590
+ worksheetDetail: WorksheetDetail
591
+ ): Promise<Inventory> {
592
+ // inventory가 존재해야함
593
+ const inventory: Inventory = await this.trxMgr.getRepository(Inventory).findOne({
594
+ where: { domain: { id: this.domain.id }, palletId },
595
+ relations: ['product']
596
+ })
597
+ if (!inventory) throw new Error(`Can't find inventory by pallet ID (${palletId})`)
598
+
599
+ // 현재 작업 set에서 하나라도 모두 완료된 유형의 VAS가 존재할 경우
600
+ // 해당 VAS를 처리한 pallet 리스트에 한하여 작업을 수행 해야함 (동일한 SET는 동일한 군집의 Pallet을 대상으로 처리되어야 하기 때문에)
601
+ worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
602
+ where: { id: worksheet.id },
603
+ relations: [
604
+ 'worksheetDetails',
605
+ 'worksheetDetails.targetVas',
606
+ 'worksheetDetails.targetVas.inventory',
607
+ 'worksheetDetails.targetVas.vas'
608
+ ]
609
+ })
610
+
611
+ const vasIds: string[] = worksheet.worksheetDetails
612
+ .filter((wsd: WorksheetDetail) => wsd.targetVas.set === worksheetDetail.targetVas.set)
613
+ .map((wsd: WorksheetDetail) => wsd.targetVas.vas.id)
614
+
615
+ let completedCnt: { [key: string]: number } = {}
616
+ vasIds.forEach((vasId: string) => (completedCnt[vasId] = 0))
617
+ worksheet.worksheetDetails.forEach((wsd: WorksheetDetail) => {
618
+ if (wsd.status !== WORKSHEET_STATUS.DONE) {
619
+ completedCnt[wsd.targetVas.vas.id]++
620
+ }
621
+ })
622
+ let finishedVasId: string
623
+ for (let vasId in completedCnt) {
624
+ if (completedCnt[vasId] === 0) {
625
+ finishedVasId = vasId
626
+ break
627
+ }
628
+ }
629
+
630
+ if (finishedVasId) {
631
+ const availPalletIds: string[] = worksheet.worksheetDetails
632
+ .filter((wsd: WorksheetDetail) => wsd.targetVas.vas.id === finishedVasId)
633
+ .map((wsd: WorksheetDetail) => wsd.targetVas.inventory.palletId)
634
+
635
+ if (availPalletIds.indexOf(inventory.palletId) >= 0) {
636
+ return inventory
637
+ } else {
638
+ throw new Error(
639
+ this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('execute VAS', `${palletId} is not suitable for doing this VAS`)
640
+ )
641
+ }
642
+ }
643
+
644
+ // refOrder에 따라 적절한 상태를 가지고 있어야함
645
+ // Arrival Notice = 'PARTIALLY_UNLOADED or PUTTING_AWAY
646
+ const refOrder: ArrivalNotice | ReleaseGood = worksheet.arrivalNotice || worksheet.releaseGood
647
+ if (refOrder instanceof ArrivalNotice) {
648
+ const acceptableStatus = [INVENTORY_STATUS.PARTIALLY_UNLOADED, INVENTORY_STATUS.PUTTING_AWAY]
649
+ if (acceptableStatus.indexOf(inventory.status) < 0)
650
+ throw new Error(`The pallet doesn't have right status for doing VAS`)
651
+ } else if (refOrder instanceof ReleaseGood) {
652
+ throw new Error('TODO: Status check for Release Good')
653
+ }
654
+
655
+ // target vas의 조건에 충족해야 함 (targetBatchId, targetProduct)
656
+ const { targetBatchId, targetProduct } = worksheetDetail.targetVas
657
+ if (targetBatchId && targetBatchId !== inventory.batchId) {
658
+ throw new Error(`The pallet (${inventory.palletId}) doesn't have correct batch ID (${targetBatchId})`)
659
+ }
660
+
661
+ if (targetProduct?.id && targetProduct.id !== inventory.product.id) {
662
+ throw new Error(`The pallet (${inventory.palletId}) doesn't have correct product (${targetProduct.name})`)
663
+ }
664
+
665
+ // reference order와 관계되어 있는 inventory여야 함
666
+ if (refOrder instanceof ArrivalNotice) {
667
+ if (inventory.refOrderId !== refOrder.id)
668
+ throw new Error(`The pallet ${inventory.palletId} is not related with GAN (${refOrder.name})`)
669
+ }
670
+
671
+ // 다른 vas order set에 포함되어 있지 않아야함
672
+ const relatedInvs: Inventory[] = worksheet.worksheetDetails
673
+ .filter(
674
+ (
675
+ wsd: WorksheetDetail // 현재 작업대상이 아니고 현재 작업 대상과 같은 세트가 아니고 인벤토리 값이 있는
676
+ ) =>
677
+ wsd.id !== worksheetDetail.id &&
678
+ wsd.targetVas.set !== worksheetDetail.targetVas.set &&
679
+ wsd.targetVas.inventory
680
+ )
681
+ .map((wsd: WorksheetDetail) => wsd.targetVas.inventory)
682
+
683
+ if (relatedInvs.find((relInv: Inventory) => relInv.palletId === inventory.palletId)) {
684
+ throw new Error(`The pallet (${inventory.palletId}) is already assigned for another VAS SET`)
685
+ }
686
+
687
+ // 현재 작업유형에 동이한 pallet으로 처리된 이력이 없어야함
688
+ const completedWSD: WorksheetDetail[] = worksheet.worksheetDetails.filter(
689
+ (wsd: WorksheetDetail) =>
690
+ wsd.status === WORKSHEET_STATUS.DONE &&
691
+ wsd.targetVas.set === worksheetDetail.targetVas.set &&
692
+ wsd.targetVas.vas.id === worksheetDetail.targetVas.vas.id
693
+ )
694
+
695
+ if (completedWSD.find((wsd: WorksheetDetail) => wsd.targetVas.inventory.palletId === palletId)) {
696
+ throw new Error(
697
+ this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('execute VAS', `VAS is finished for pallet (${palletId}) already`)
698
+ )
699
+ }
700
+
701
+ return inventory
702
+ }
703
+
704
+ async completeVAS(orderNo: string, orderType: string, vasWorksheetDetails: WorksheetDetail[]): Promise<Worksheet> {
705
+ //@ts-ignore
706
+ const ENTITY_MAP: { [key: string]: ArrivalNotice | ReleaseGood | VasOrder } = {
707
+ [ORDER_TYPES.ARRIVAL_NOTICE]: ArrivalNotice,
708
+ [ORDER_TYPES.RELEASE_OF_GOODS]: ReleaseGood,
709
+ [ORDER_TYPES.VAS_ORDER]: VasOrder
710
+ }
711
+ //@ts-ignore
712
+ let refOrder: ReferenceOrderType = await this.findRefOrder(ENTITY_MAP[orderType], {
713
+ domain: this.domain,
714
+ name: orderNo
715
+ })
716
+ let worksheet: Worksheet = await this.findWorksheetByRefOrder(refOrder, WORKSHEET_TYPE.VAS, [
717
+ 'worksheetDetails',
718
+ 'worksheetDetails.targetVas',
719
+ 'worksheetDetails.targetVas.vas',
720
+ 'worksheetDetails.targetVas.inventory'
721
+ ])
722
+
723
+ const isPureVAS: boolean = refOrder instanceof VasOrder
724
+ if (isPureVAS) {
725
+ refOrder.status = ORDER_STATUS.DONE
726
+ await this.updateRefOrder(refOrder)
727
+ }
728
+
729
+ // Do complete operation transactions if there it is
730
+ let foundWorksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
731
+ let targetVASs: OrderVas[] = foundWorksheetDetails.map((wsd: WorksheetDetail) => wsd.targetVas)
732
+
733
+ // assign issues brought from execute VAS page to foundWorksheetDetails
734
+ foundWorksheetDetails = foundWorksheetDetails.map(worksheetDetail => {
735
+ return {
736
+ ...worksheetDetail,
737
+ issue: vasWorksheetDetails.find(wsd => wsd.name === worksheetDetail.name).issue || null
738
+ }
739
+ })
740
+
741
+ // reduce parent inventory qty if same parent is selected
742
+ targetVASs = targetVASs.reduce((acc, curr) => {
743
+ if (curr.inventory) {
744
+ for (let i = 0; i < acc.length; i++) {
745
+ if (acc[i].inventory?.id === curr.inventory?.id) {
746
+ curr.inventory.qty -= acc[i].qty
747
+ curr.inventory.uomValue -= acc[i].uomValue
748
+ curr.inventory.lockedQty -= acc[i].qty
749
+ curr.inventory.lockedUomValue -= acc[i].uomValue
750
+ }
751
+ }
752
+ }
753
+
754
+ acc.push(curr)
755
+
756
+ return acc
757
+ }, [])
758
+
759
+ for (const targetVas of targetVASs) {
760
+ const { issue }: { issue: string } = foundWorksheetDetails.find(
761
+ (wsd: WorksheetDetail) => wsd.targetVas.id === targetVas.id
762
+ )
763
+
764
+ // if (targetVas.operationGuide && (!issue || (targetVas.vas.name.toUpperCase() == VAS.REPACKAGING && issue))) {
765
+ // await this.doOperationTransaction(targetVas)
766
+ // } /*else if (targetVas.operationGuide && targetVas.vas.name.toUpperCase() === VAS.REPACKAGING && issue) {
767
+ // await this.doOperationTransaction(targetVas)
768
+ // }*/
769
+
770
+ if (targetVas.operationGuide && !issue) {
771
+ await this.doOperationTransaction(targetVas)
772
+ }
773
+
774
+ if (targetVas.vas.name.toUpperCase() === VAS.UNPACKING && !(refOrder instanceof ArrivalNotice)) {
775
+ // Update qty and uom value of parent inventory (only applies for pure vas and RO)
776
+ const parentInventory: Inventory = targetVas.inventory
777
+ let newParentInventory: Partial<Inventory> = Object.assign({}, parentInventory)
778
+ newParentInventory.qty = parentInventory.qty - targetVas.qty
779
+ newParentInventory.uomValue = Math.round((parentInventory.uomValue - targetVas.uomValue) * 100) / 100
780
+ newParentInventory.lockedQty = parentInventory.lockedQty - targetVas.qty
781
+ newParentInventory.lockedUomValue =
782
+ Math.round((parentInventory.lockedUomValue - targetVas.uomValue) * 100) / 100
783
+
784
+ // update qty and uomValue for VasOrder
785
+ // if refOrder is from ReleaseGood, no need to update because this trxn is consider similar to LOADING trxn
786
+ if (refOrder instanceof VasOrder) {
787
+ await this.transactionInventory(
788
+ newParentInventory,
789
+ refOrder,
790
+ -targetVas.qty,
791
+ -targetVas.uomValue,
792
+ INVENTORY_TRANSACTION_TYPE.UNPACKED
793
+ )
794
+ } else if (refOrder instanceof ReleaseGood) {
795
+ await generateInventoryHistory(
796
+ //@ts-ignore
797
+ newParentInventory,
798
+ refOrder,
799
+ INVENTORY_TRANSACTION_TYPE.UNPACKED,
800
+ 0,
801
+ 0,
802
+ this.user,
803
+ this.trxMgr
804
+ )
805
+ }
806
+
807
+ // add TERMINATED status if inventory qty = 0
808
+ if (newParentInventory.qty === 0) {
809
+ newParentInventory.status = INVENTORY_STATUS.TERMINATED
810
+ await this.transactionInventory(newParentInventory, refOrder, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
811
+ }
812
+ }
813
+ }
814
+
815
+ // update worksheet details if there is any issue found from the list
816
+ if (foundWorksheetDetails.some((wsd: Partial<WorksheetDetail>) => wsd.issue)) {
817
+ const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
818
+ foundWorksheetDetails = this.renewWorksheetDetails(worksheetDetails, foundWorksheetDetails, 'name', {
819
+ updater: this.user
820
+ })
821
+
822
+ const worksheetDetailsWithIssue: WorksheetDetail[] = foundWorksheetDetails.filter(
823
+ (wsd: WorksheetDetail) => wsd.issue
824
+ ) as WorksheetDetail[]
825
+
826
+ if (worksheetDetailsWithIssue.length) {
827
+ await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetailsWithIssue)
828
+ }
829
+ }
830
+
831
+ let orderStatus: string =
832
+ refOrder instanceof ArrivalNotice
833
+ ? ORDER_STATUS.READY_TO_UNLOAD
834
+ : refOrder instanceof ReleaseGood
835
+ ? ORDER_STATUS.LOADING
836
+ : ORDER_STATUS.DONE
837
+
838
+ worksheet = await this.completeWorksheet(worksheet, orderStatus)
839
+ return worksheet
840
+ }
841
+
842
+ async doOperationTransaction(targetVas: OrderVas): Promise<void> {
843
+ const operationGuide: string = targetVas.vas?.operationGuide
844
+ if (operationGuide) {
845
+ await this.COMPLETE_TRX_MAP[operationGuide](this.trxMgr, targetVas, this.user)
846
+ }
847
+ }
848
+ }