@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,285 @@
1
+ import FormData from 'form-data'
2
+ import _ from 'lodash'
3
+ import fetch from 'node-fetch'
4
+ import { IsNull, Not } from 'typeorm'
5
+
6
+ import { Attachment, STORAGE } from '@things-factory/attachment-base'
7
+ import { Partner } from '@things-factory/auth-base'
8
+ import { Bizplace, ContactPoint } from '@things-factory/biz-base'
9
+ import { config } from '@things-factory/env'
10
+ import { ArrivalNotice, GoodsReceivalNote, ORDER_STATUS, OrderProduct } from '@things-factory/sales-base'
11
+ import { Domain, getRepository } from '@things-factory/shell'
12
+ import { InventoryItem, ReducedInventoryHistory } from '@things-factory/warehouse-base'
13
+
14
+ import { TEMPLATE_TYPE, WORKSHEET_TYPE } from '../constants'
15
+ import { Worksheet } from '../entities'
16
+ import { DateTimeConverter } from '../utils/datetime-util'
17
+
18
+ const REPORT_API_URL = config.get('reportApiUrl', 'http://localhost:8888/rest/report/show_html')
19
+
20
+ export async function renderGRN({ grnNo, timezoneOffSet }, context: ResolverContext) {
21
+ // 1. find domain
22
+ const domain: Domain = await getRepository(Domain).findOne({
23
+ where: { id: context.state.domain.id }
24
+ })
25
+
26
+ // 2. find grn
27
+ const foundGRN: GoodsReceivalNote = await getRepository(GoodsReceivalNote).findOne({
28
+ where: { domain: { id: domain.id }, name: grnNo },
29
+ relations: ['domain', 'bizplace', 'bizplace.domain', 'bizplace.company', 'arrivalNotice']
30
+ })
31
+
32
+ // 3. find GAN
33
+ const foundGAN: ArrivalNotice = foundGRN.arrivalNotice
34
+ const ownRefNo = foundGAN.refNo
35
+
36
+ const foundInventoryItem: InventoryItem[] = await getRepository(InventoryItem).query(
37
+ `select row_number() over (partition by p.sku) as "seq",p.sku,p.brand_sku, ii.serial_number from inventory_items ii left join products p on ii.product_id = p.id where inbound_order_id = '${foundGAN.id}' group by p.sku,ii.serial_number,p.brand_sku`
38
+ )
39
+
40
+ // 4. find customer bizplace
41
+ const partnerBiz: Bizplace = foundGRN.bizplace
42
+
43
+ const partnerDomain: Partner = await getRepository(Partner).findOne({
44
+ where: { partnerDomain: { id: partnerBiz.domain.id }, domain: { id: domain.id } },
45
+ relations: ['domain']
46
+ })
47
+
48
+ const domainOwner: Domain = partnerDomain.domain
49
+ const domainBizplace: Bizplace = await getRepository(Bizplace).findOne({
50
+ where: { domain: { id: domainOwner.id } },
51
+ relations: ['company']
52
+ })
53
+
54
+ const qbReducedInventory = getRepository(ReducedInventoryHistory)
55
+ .createQueryBuilder('ivh')
56
+ .select('product_id', 'productId')
57
+ .addSelect('batch_id', 'batchId')
58
+ .addSelect('reusable_pallet_id', 'reusablePalletId')
59
+ .addSelect('packing_type', 'packingType')
60
+ .addSelect('sum(qty)', 'qty')
61
+ .addSelect('sum(uom_value)', 'uomValue')
62
+ .addSelect('uom', 'uom')
63
+ .addSelect('count(distinct pallet_id)', 'pallet')
64
+ .addSelect(`string_agg(distinct expiration_date::varchar,', ' order by expiration_date::varchar)`, 'expiryDate')
65
+ .addSelect(`string_agg(distinct pallet_id::varchar,', ' order by pallet_id::varchar)`, 'palletId')
66
+ .where('ivh.domain_id = :domainId', { domainId: domain.id })
67
+ .andWhere('ivh.ref_order_id = :refOrderId', { refOrderId: foundGAN.id })
68
+ .andWhere(`ivh.transaction_type = 'UNLOADING'`)
69
+ .groupBy('reusable_pallet_id')
70
+ .addGroupBy('product_id')
71
+ .addGroupBy('batch_id')
72
+ .addGroupBy('packing_type')
73
+ .addGroupBy('uom')
74
+ .addGroupBy('expiration_date')
75
+ .getRawMany()
76
+
77
+ // 5. find domain contact point
78
+ const foundCP: ContactPoint = await getRepository(ContactPoint).findOne({
79
+ where: { domain: { id: domain.id }, bizplace: { id: domainBizplace.id } }
80
+ })
81
+
82
+ // 5. find domain contact point
83
+ const foundPartnerCP: ContactPoint = await getRepository(ContactPoint).findOne({
84
+ where: { domain: { id: domain.id }, bizplace: { id: partnerBiz.id } }
85
+ })
86
+
87
+ // 6. find unloading worksheet
88
+ const foundWS: Worksheet = await getRepository(Worksheet).findOne({
89
+ where: {
90
+ domain: { id: domain.id },
91
+ arrivalNotice: { id: foundGAN.id },
92
+ type: WORKSHEET_TYPE.UNLOADING,
93
+ status: ORDER_STATUS.DONE
94
+ },
95
+ relations: ['worksheetDetails', 'updater']
96
+ })
97
+
98
+ // find putaway worksheet
99
+ const foundPutawayWS: Worksheet = await getRepository(Worksheet).findOne({
100
+ where: {
101
+ domain: { id: domain.id },
102
+ arrivalNotice: { id: foundGAN.id },
103
+ type: WORKSHEET_TYPE.PUTAWAY,
104
+ status: ORDER_STATUS.DONE
105
+ },
106
+ relations: ['worksheetDetails', 'updater']
107
+ })
108
+
109
+ const targetProducts: OrderProduct[] = await getRepository(OrderProduct).find({
110
+ where: {
111
+ domain: { id: domain.id },
112
+ arrivalNotice: { id: foundGAN.id },
113
+ actualPalletQty: Not(IsNull()),
114
+ actualPackQty: Not(IsNull())
115
+ },
116
+ relations: ['product']
117
+ })
118
+
119
+ // 7. find grn template based on category
120
+ const foundTemplate: Attachment = await getRepository(Attachment).findOne({
121
+ where: { domain: { id: domain.id }, category: TEMPLATE_TYPE.GRN_TEMPLATE }
122
+ })
123
+
124
+ // 8. find grn logo
125
+ const foundLogo: Attachment = await getRepository(Attachment).findOne({
126
+ where: {
127
+ domain: { id: domain.id },
128
+ category: TEMPLATE_TYPE.LOGO
129
+ }
130
+ })
131
+
132
+ // 9. find signature
133
+ const foundSignature: Attachment = await getRepository(Attachment).findOne({
134
+ where: {
135
+ domain: { id: domain.id },
136
+ category: TEMPLATE_TYPE.SIGNATURE
137
+ }
138
+ })
139
+
140
+ const foundCop: Attachment = await getRepository(Attachment).findOne({
141
+ where: {
142
+ domain: { id: domain.id },
143
+ category: TEMPLATE_TYPE.COP
144
+ }
145
+ })
146
+
147
+ const inboundInventories: any[] = await qbReducedInventory
148
+
149
+ const template = await STORAGE.readFile(foundTemplate.path, 'utf-8')
150
+
151
+ let logo = null
152
+ if (foundLogo?.path) {
153
+ logo = 'data:' + foundLogo.mimetype + ';base64,' + (await STORAGE.readFile(foundLogo.path, 'base64'))
154
+ }
155
+
156
+ let signature = null
157
+ if (foundSignature?.path) {
158
+ signature = 'data:' + foundSignature.mimetype + ';base64,' + (await STORAGE.readFile(foundSignature.path, 'base64'))
159
+ }
160
+
161
+ let cop = null
162
+ if (foundCop?.path) {
163
+ cop = 'data:' + foundSignature.mimetype + ';base64,' + (await STORAGE.readFile(foundCop.path, 'base64'))
164
+ }
165
+
166
+ //@ts-ignore
167
+ const filterInventoryItem = _.groupBy(foundInventoryItem, i => i.sku)
168
+
169
+ const tempIndexArr = []
170
+
171
+ const tempTotalQuantity = []
172
+
173
+ Object.keys(filterInventoryItem).forEach(k => {
174
+ const tempIndex = foundInventoryItem.findIndex(i => {
175
+ //@ts-ignore
176
+ return i.sku == k
177
+ })
178
+
179
+ tempIndexArr.push(tempIndex)
180
+ })
181
+
182
+ Object.values(filterInventoryItem).forEach(k => {
183
+ const tempQuantity = k.length
184
+
185
+ tempTotalQuantity.push(tempQuantity)
186
+ })
187
+
188
+ tempIndexArr.forEach((t, index) => {
189
+ //@ts-ignore
190
+ if (t >= 0) foundInventoryItem[t].totalQuantity = tempTotalQuantity[index]
191
+ })
192
+
193
+ const data = {
194
+ logo_url: logo,
195
+ sign_url: signature,
196
+ cop_url: cop,
197
+ customer_biz: partnerBiz.name,
198
+ customer_address: partnerBiz.address,
199
+ company_domain: domainBizplace.company.name,
200
+ company_phone: foundCP.phone,
201
+ company_email: foundCP.email,
202
+ company_brn: domainBizplace.company.brn,
203
+ company_address: domainBizplace.company.address,
204
+ warehouse_address: foundCP.address,
205
+ warehouse_address2: foundCP.address2,
206
+ warehouse_postcode: foundCP.postCode,
207
+ warehouse_city: foundCP.city,
208
+ warehouse_state: foundCP.state,
209
+ warehouse_phone: foundCP.phone,
210
+ warehouse_fax: foundCP.fax,
211
+ warehouse_email: foundCP.email,
212
+ order_no: foundGRN.name,
213
+ gan_no: foundGAN.name,
214
+ gan_accepted_at: foundGAN.acceptedAt ? DateTimeConverter.datetime(foundGAN.acceptedAt, timezoneOffSet) : '',
215
+ unload_date: DateTimeConverter.date(foundWS.endedAt),
216
+ ref_no: ownRefNo ? `${foundGAN.name} / ${foundGAN.refNo}` : `${foundGAN.name}`,
217
+ ref_no_only: ownRefNo ? ` ${foundGAN.refNo}` : '',
218
+ ref_no1: foundGAN.refNo2 ? `${foundGAN.refNo2}` : '',
219
+ ref_no2: foundGAN.refNo3 ? `${foundGAN.refNo3}` : '',
220
+ received_date: DateTimeConverter.date(foundWS.endedAt),
221
+ truck_no: foundGAN.truckNo || '',
222
+ container_no: foundGAN.containerNo || '',
223
+ container_size: foundGAN.containerSize || '',
224
+ delivery_order_no: foundGAN.deliveryOrderNo ? foundGAN.deliveryOrderNo : '',
225
+ account_no: foundPartnerCP ? foundPartnerCP.accountNo : '',
226
+ unloaded_by: foundWS ? foundWS.updater.name : '',
227
+ putaway_by: foundPutawayWS ? foundPutawayWS.updater.name : '',
228
+ product_list: targetProducts
229
+ .reduce((acc, item) => {
230
+ acc.push(
231
+ ...inboundInventories
232
+ .filter(
233
+ ih =>
234
+ ih.productId == item.product.id &&
235
+ ih.batchId == item.batchId &&
236
+ ih.packingType == item.packingType &&
237
+ ih.uom == item.uom
238
+ )
239
+ .map(unloadInvHistory => {
240
+ return {
241
+ product_sku: `${item.product.sku}`,
242
+ product_brand_sku: `${item.product.brandSku}`,
243
+ product_name: `${item.product.name}(${item.product.description})`,
244
+ product_desc: item.product.description,
245
+ product_nameOnly: item.product.name,
246
+ product_type: item.packingType,
247
+ product_size: item.packingSize,
248
+ product_batch: item.batchId,
249
+ batch_id_ref: item?.batchIdRef ? item.batchIdRef : '',
250
+ pallet_qty: item.actualPalletQty,
251
+ product_qty: unloadInvHistory.qty || item.actualPackQty,
252
+ product_unit_uom_value: `${Math.round(item.uomValue * 100) / 100}`,
253
+ product_total_uom_value: `${
254
+ Math.round((unloadInvHistory.uomValue || item.uomValue * item.actualPackQty) * 100) / 100
255
+ }`,
256
+ product_uom: `${unloadInvHistory.uom || item.uom}`,
257
+ product_gross_weight: item.product.grossWeight || null,
258
+ unit_price: item.unitPrice || null,
259
+ expiry_date:
260
+ unloadInvHistory.expiryDate && unloadInvHistory.expiryDate != ''
261
+ ? new Date(unloadInvHistory.expiryDate).toISOString().split('T')[0]
262
+ : '',
263
+ manufacture_date: item.manufactureDate,
264
+ reusable_pallet_id: unloadInvHistory.reusablePalletId || '',
265
+ remark: (item.remark ? item.remark : '') + (item.issue ? ' [Issue]: ' + item.issue : '')
266
+ }
267
+ })
268
+ )
269
+ return acc
270
+ }, [])
271
+ .map((item, idx) => ({ list_no: idx + 1, ...item })),
272
+ serialNumber: foundInventoryItem
273
+ }
274
+
275
+ const formData = new FormData()
276
+ formData.append('template', template)
277
+ formData.append('jsonString', JSON.stringify(data))
278
+
279
+ const response = await fetch(REPORT_API_URL, {
280
+ method: 'POST',
281
+ body: formData
282
+ })
283
+
284
+ return await response.text()
285
+ }
@@ -0,0 +1,201 @@
1
+ import FormData from 'form-data'
2
+ import fetch from 'node-fetch'
3
+ import { SelectQueryBuilder } from 'typeorm'
4
+
5
+ import { Attachment, STORAGE } from '@things-factory/attachment-base'
6
+ import { Bizplace } from '@things-factory/biz-base'
7
+ import { config } from '@things-factory/env'
8
+ import { InvoiceProduct, ReleaseGood } from '@things-factory/sales-base'
9
+ import { Domain, getRepository } from '@things-factory/shell'
10
+
11
+ import { TEMPLATE_TYPE } from '../constants'
12
+ import { DateTimeConverter } from '../utils/datetime-util'
13
+
14
+ const REPORT_API_URL = config.get('reportApiUrl', 'http://localhost:8888/rest/report/show_html')
15
+
16
+ export async function renderInvoices({ req, timezoneOffSet }, context: ResolverContext) {
17
+ try {
18
+ const domain: Domain = await getRepository(Domain).findOne({
19
+ where: { id: context.state.domain.id }
20
+ })
21
+
22
+ let result = await Promise.all(
23
+ req.roIds.map(async roId => {
24
+ try {
25
+ const qb: SelectQueryBuilder<ReleaseGood> = await getRepository(ReleaseGood)
26
+ .createQueryBuilder('rg')
27
+ .innerJoinAndSelect('rg.domain', 'domain')
28
+ .innerJoinAndSelect('rg.bizplace', 'bizplace')
29
+ .innerJoinAndSelect('bizplace.domain', 'bizplace_domain')
30
+ .innerJoinAndSelect('bizplace.company', 'company')
31
+ .innerJoinAndSelect('company.domain', 'company_domain')
32
+ .innerJoinAndSelect('invoices', 'iv', 'rg.ref_no = iv.ref_no_1')
33
+ .leftJoinAndSelect('marketplace_orders', 'mo', 'rg.id = mo.release_order_id::uuid')
34
+ .leftJoinAndSelect('marketplace_order_shippings', 'mos', 'rg.id = mos.release_order_id::uuid')
35
+ .leftJoinAndSelect('mo.fulfillmentCenter', 'fc')
36
+ .where('rg.id = :roId')
37
+ .andWhere('rg.domain = :domainId')
38
+ .setParameters({ roId, domainId: domain.id })
39
+
40
+ let record: any = await qb.getRawOne()
41
+
42
+ if (record) {
43
+ const partnerBiz: Partial<Bizplace> = {
44
+ id: record.bizplace_id,
45
+ name: record.bizplace_name,
46
+ address: record.bizplace_address
47
+ }
48
+
49
+ const partnerCompanyDomain: Partial<Domain> = {
50
+ id: record.company_domain_id,
51
+ name: record.company_domain_name
52
+ }
53
+
54
+ const foundTemplate: Attachment = await getRepository(Attachment).findOne({
55
+ where: { domain: { id: partnerCompanyDomain.id }, category: TEMPLATE_TYPE.INVOICE_TEMPLATE }
56
+ })
57
+
58
+ const template = await STORAGE.readFile(foundTemplate.path, 'utf-8')
59
+
60
+ let fullBillingAddress = [
61
+ record.iv_billing_address_1,
62
+ record.iv_billing_address_2,
63
+ record.iv_billing_address_3,
64
+ record.iv_billing_address_4,
65
+ record.iv_billing_address_5
66
+ ]
67
+
68
+ let fullDeliveryAddress = [
69
+ record.iv_delivery_address_1,
70
+ record.iv_delivery_address_2,
71
+ record.iv_delivery_address_3,
72
+ record.iv_delivery_address_4,
73
+ record.iv_delivery_address_5
74
+ ]
75
+
76
+ const qb: SelectQueryBuilder<InvoiceProduct> = await getRepository(InvoiceProduct)
77
+ .createQueryBuilder('ip')
78
+ .innerJoin('invoices', 'iv', 'iv.id = ip.invoice_id')
79
+ .leftJoin('release_goods', 'rg', 'rg.ref_no = iv.ref_no_1')
80
+ .where('rg.id = :roId')
81
+ .andWhere('rg.domain = :domainId')
82
+ .setParameters({ roId, domainId: domain.id })
83
+
84
+ let items: any[] = await qb.getRawMany()
85
+
86
+ const product_list = items.map((item, idx) => {
87
+ return {
88
+ list_no: idx + 1,
89
+ product_sku: item.ip_sku,
90
+ product_name: item.ip_name,
91
+ product_desc: item.ip_description,
92
+ product_qty: item.ip_qty,
93
+ product_other_charges: item.ip_other_charges,
94
+ product_paid_price: getRoundedValue(item.ip_paid_price || item.ip_unit_price),
95
+ product_unit_price: getRoundedValue(item.ip_unit_price),
96
+ product_total_paid_price: getRoundedValue(
97
+ (item.ip_paid_price || item.ip_unit_price) * parseInt(item.ip_qty || 0)
98
+ ),
99
+ product_total_unit_price: getRoundedValue(item.ip_unit_price * parseInt(item.ip_qty || 0)),
100
+ original_price: getRoundedValue(parseFloat(item.ip_unit_price || 0)),
101
+ product_discount: getRoundedValue(parseFloat(item.ip_discount || 0)),
102
+ shipping_fee_paid_by_customer: getRoundedValue(parseFloat(item.ip_shipping_fee_paid_by_customer || 0))
103
+ }
104
+ })
105
+
106
+ const sumProductTotalPaidPrice: number = product_list.reduce(
107
+ (total, item) => total + item.product_total_paid_price,
108
+ 0
109
+ )
110
+
111
+ let date = DateTimeConverter.date(new Date((record.iv_issued_on || record.iv_created_at) - timezoneOffSet))
112
+ const data = {
113
+ order_no: record.rg_name,
114
+ ref_no: record.rg_ref_no,
115
+ from: record.iv_from,
116
+ customer_address: partnerBiz.address,
117
+ store_name: record.iv_from,
118
+ bill_to: record.iv_bill_to,
119
+ bill_to_phone: record.iv_bill_to_phone,
120
+ billing_address_1: record.iv_billing_address_1,
121
+ billing_address_2: record.iv_billing_address_2,
122
+ billing_address_3: record.iv_billing_address_3,
123
+ billing_address_4: record.iv_billing_address_4,
124
+ billing_address_5: record.iv_billing_address_5,
125
+ billing_postcode: record.iv_billing_postcode,
126
+ billing_city: record.iv_billing_city,
127
+ billing_state: record.iv_billing_state,
128
+ billing_country: record.iv_billing_country,
129
+ full_billing_address: fullBillingAddress
130
+ .reduce((acc, itm) => {
131
+ if (itm && itm.trim() != '') {
132
+ acc.push(itm)
133
+ }
134
+
135
+ return acc
136
+ }, [])
137
+ .join(' '),
138
+ delivery_date: date,
139
+ deliver_to: record.iv_deliver_to,
140
+ deliver_to_phone: record.iv_deliver_to_phone,
141
+ delivery_address_1: record.iv_delivery_address_1,
142
+ delivery_address_2: record.iv_delivery_address_2,
143
+ delivery_address_3: record.iv_delivery_address_3,
144
+ delivery_address_4: record.iv_delivery_address_4,
145
+ delivery_address_5: record.iv_delivery_address_5,
146
+ delivery_postcode: record.iv_delivery_postcode,
147
+ delivery_city: record.iv_delivery_city,
148
+ delivery_state: record.iv_delivery_state,
149
+ delivery_country: record.iv_delivery_country,
150
+ full_delivery_address: fullDeliveryAddress
151
+ .reduce((acc, itm) => {
152
+ if (itm && itm.trim() != '') {
153
+ acc.push(itm)
154
+ }
155
+
156
+ return acc
157
+ }, [])
158
+ .join(' '),
159
+ fulfillment_center: record.fc_name,
160
+ voucher_amount: getRoundedValue(parseFloat(record.mo_voucher_amount || 0)),
161
+ actual_shipping_fee: getRoundedValue(parseFloat(record.mos_actual_shipping_fee || 0)),
162
+ sub_total: sumProductTotalPaidPrice,
163
+ grand_total: getRoundedValue(
164
+ sumProductTotalPaidPrice -
165
+ parseFloat(record.mo_voucher_amount || 0) +
166
+ parseFloat(record.mos_actual_shipping_fee || 0)
167
+ ),
168
+ product_list
169
+ }
170
+
171
+ const formData = new FormData()
172
+ formData.append('template', template)
173
+ formData.append('jsonString', JSON.stringify(data))
174
+
175
+ const response = await fetch(REPORT_API_URL, {
176
+ method: 'POST',
177
+ body: formData
178
+ })
179
+
180
+ return await response.text()
181
+ }
182
+ return null
183
+ } catch (ex) {
184
+ return null
185
+ }
186
+ })
187
+ )
188
+
189
+ if (result.filter(x => x != null).length <= 0) {
190
+ throw Error('No invoice found!')
191
+ }
192
+
193
+ return result.join()
194
+ } catch (ex) {
195
+ throw ex
196
+ }
197
+ }
198
+
199
+ function getRoundedValue(value = 0) {
200
+ return Math.round((value + Number.EPSILON) * 100) / 100
201
+ }
@@ -0,0 +1,208 @@
1
+ import FormData from 'form-data'
2
+ import fetch from 'node-fetch'
3
+ import { EntityManager, getManager, IsNull, Not } from 'typeorm'
4
+
5
+ import { Attachment, STORAGE } from '@things-factory/attachment-base'
6
+ import { Partner } from '@things-factory/auth-base'
7
+ import { Bizplace } from '@things-factory/biz-base'
8
+ import { config } from '@things-factory/env'
9
+ import { Product } from '@things-factory/product-base'
10
+ import { ArrivalNotice, JobSheet, OrderProduct } from '@things-factory/sales-base'
11
+ import { Domain, getRepository } from '@things-factory/shell'
12
+
13
+ import { TEMPLATE_TYPE, WORKSHEET_TYPE } from '../constants'
14
+ import { Worksheet } from '../entities'
15
+ import { DateTimeConverter } from '../utils/datetime-util'
16
+
17
+ const REPORT_API_URL = config.get('reportApiUrl', 'http://localhost:8888/rest/report/show_html')
18
+
19
+ export async function renderJobSheet({ ganNo, timezoneOffSet }, context) {
20
+ const domain: Domain = await getRepository(Domain).findOne({
21
+ where: { id: context.state.domain.id }
22
+ }) //.. find domain
23
+
24
+ // find GAN
25
+ const foundGAN: ArrivalNotice = await getRepository(ArrivalNotice).findOne({
26
+ where: { domain: { id: domain.id }, name: ganNo },
27
+ relations: ['bizplace', 'bizplace.company', 'bizplace.domain']
28
+ })
29
+
30
+ // find job sheet
31
+ const foundJS: JobSheet = await getRepository(JobSheet).findOne({
32
+ //@ts-ignore
33
+ where: { domain: { id: domain.id }, bizplace: { id: foundGAN.bizplace }, arrivalNoticeRefNo: foundGAN.name }
34
+ })
35
+
36
+ // customer bizplace
37
+ const partnerBiz: Bizplace = foundGAN.bizplace
38
+
39
+ const partnerDomain: Partner = await getRepository(Partner).findOne({
40
+ where: { partnerDomain: { id: partnerBiz.domain.id } },
41
+ relations: ['domain']
42
+ })
43
+
44
+ const domainOwner: Domain = partnerDomain.domain
45
+ const domainBizplace: Bizplace = await getRepository(Bizplace).findOne({
46
+ where: { domain: { id: domainOwner.id } },
47
+ relations: ['company']
48
+ })
49
+
50
+ const foundTemplate: Attachment = await getRepository(Attachment).findOne({
51
+ where: { domain: { id: domain.id }, category: TEMPLATE_TYPE.JOB_TEMPLATE }
52
+ })
53
+
54
+ const foundLogo: Attachment = await getRepository(Attachment).findOne({
55
+ where: {
56
+ domain: { id: domain.id },
57
+ category: TEMPLATE_TYPE.LOGO
58
+ }
59
+ })
60
+
61
+ const template = await STORAGE.readFile(foundTemplate.path, 'utf-8')
62
+ let logo = null
63
+ if (foundLogo?.path) {
64
+ logo = 'data:' + foundLogo.mimetype + ';base64,' + (await STORAGE.readFile(foundLogo.path, 'base64'))
65
+ }
66
+
67
+ // find unloading worksheet for getting unloading time
68
+ const foundWS: Worksheet = await getRepository(Worksheet).findOne({
69
+ where: { domain: { id: domain.id }, arrivalNotice: { id: foundGAN.id }, type: WORKSHEET_TYPE.UNLOADING },
70
+ relations: ['updater']
71
+ })
72
+
73
+ // find list of unloaded product
74
+ const targetProducts: OrderProduct[] = await getRepository(OrderProduct).find({
75
+ where: { domain: { id: domain.id }, arrivalNotice: { id: foundGAN.id }, actualPalletQty: Not(IsNull()) },
76
+ relations: ['product']
77
+ })
78
+
79
+ const products: Product[] = targetProducts.map((op: OrderProduct) => op.product)
80
+ const prodType: any[] = products.map(prod => prod.type)
81
+
82
+ return await getManager().transaction(async (trxMgr: EntityManager) => {
83
+ await trxMgr.query(
84
+ `
85
+ create temp table temp_invHistory on commit drop as (
86
+ select i2.id as inventory_id, i2.pallet_id, i2.product_id, i2.packing_type, i2.batch_id,
87
+ ih.id as inventory_history_id, ih.seq, ih.status, ih.transaction_type, ih.qty, ih.opening_qty, ih.uom_value, ih.opening_uom_value,
88
+ ih.created_at
89
+ from (
90
+ select i2.* from inventories i2
91
+ inner join order_inventories oi on oi.inventory_id = i2.id
92
+ where oi.arrival_notice_id = $1
93
+ ) i2
94
+ inner join reduced_inventory_histories ih on ih.pallet_id = i2.pallet_id and ih.domain_id = i2.domain_id
95
+ )
96
+ `,
97
+ [foundGAN.id]
98
+ )
99
+
100
+ const invItems: any[] = await trxMgr.query(
101
+ `
102
+ SELECT rn,
103
+ inv_id,
104
+ case when rn = 1 then "packingType" else null end as "packingType",
105
+ case when rn = 1 then "createdAt" else null end as "createdAt",
106
+ case when rn = 1 then "productName" else null end as "productName",
107
+ case when rn = 1 then "unloadedQty" else null end as "unloadedQty",
108
+ case when rn = 1 then "outboundAt" else null end as "outboundAt",
109
+ "doName",
110
+ case when rn = 1 then "palletId" else null end as "palletId",
111
+ qty,
112
+ case when rn = 1 then "ownTransport" else null end as "ownTransport",
113
+ case when rn = 1 then "vasName" else null end as "vasName"
114
+ from
115
+ (
116
+ SELECT
117
+ row_number() over(partition by pallet_id order by inv.pallet_id, product.name asc) as rn,
118
+ inv.id AS "inv_id", inv.packing_type AS "packingType", inv.created_at AS "createdAt", product.name AS "productName",
119
+ (
120
+ select distinct on(pallet_id) COALESCE(qty, 0) AS unloadedQty from temp_invHistory invh
121
+ where invh.status = 'UNLOADED' and invh.inventory_id = inv.id
122
+ order by pallet_id, seq asc
123
+ ) AS "unloadedQty",
124
+ (
125
+ select distinct on(pallet_id) COALESCE(created_at, null) AS outboundAt from temp_invHistory invh
126
+ where invh.status = 'TERMINATED' and invh.inventory_id = inv.id
127
+ order by pallet_id, seq desc
128
+ ) AS "outboundAt",
129
+ STRING_AGG (case when do2.name is not null then (CONCAT(do2.delivery_date, ' (', orderInv.release_qty, ') ', do2.name, ', ', case when do2.own_collection = true then 'TPT N' else 'TPT Y' end )) else null end, ', ') AS "doName",
130
+ case when plt.name is not null then (CONCAT(inv.pallet_id, ' (', plt.name, ')')) else inv.pallet_id end AS "palletId",
131
+ SUM(orderInv.release_qty) as "qty",
132
+ do2.own_collection AS "ownTransport",
133
+ STRING_AGG (vas.name, ', ') AS "vasName"
134
+ FROM inventories inv
135
+ LEFT JOIN order_inventories orderInv ON orderInv.inventory_id = inv.id AND orderInv.release_good_id is not null and orderInv.status <> 'CANCELLED' AND orderinv.picked_qty > 0
136
+ LEFT JOIN order_vass orderVass ON orderVass.inventory_id = inv.id
137
+ LEFT JOIN vass vas ON vas.id = orderVass.vas_id
138
+ LEFT JOIN pallets plt on plt.id = inv.reusable_pallet_id
139
+ LEFT JOIN delivery_orders do2 ON do2.id = orderInv.delivery_order_id
140
+ LEFT JOIN products product ON product.id=inv.product_id
141
+ inner join order_inventories oi on oi.inventory_id = inv.id
142
+ where oi.arrival_notice_id = $1
143
+ AND inv.domain_id = $2
144
+ GROUP BY inv.id, product.name, do2.own_collection, plt.name
145
+ ORDER BY inv.pallet_id, product.name asc
146
+ ) foo
147
+ `,
148
+ [foundGAN.id, domain.id]
149
+ )
150
+
151
+ const sumPackQty = targetProducts.map((op: OrderProduct) => op.actualPackQty).reduce((a, b) => a + b, 0)
152
+
153
+ let sumPalletQty = 0
154
+ if (foundJS?.sumPalletQty) {
155
+ sumPalletQty = foundJS.sumPalletQty
156
+ }
157
+ let index = 0
158
+ const data = {
159
+ logo_url: logo,
160
+ customer_biz: partnerBiz.company.name,
161
+ company_domain: domainBizplace.company.name,
162
+ company_brn: domainBizplace.company.brn,
163
+ company_address: domainBizplace.company.address,
164
+ //@ts-ignore
165
+ container_no: foundJS?.containerNo ? foundJS.containerNo : foundJS.deliveryOrderNo,
166
+ container_size: foundJS ? foundJS.containerSize : null,
167
+ eta: foundGAN?.ata ? DateTimeConverter.datetime(foundGAN.ata, timezoneOffSet) : null,
168
+ ata: foundGAN?.ata ? DateTimeConverter.date(foundGAN.ata) : null,
169
+ unloading_date: foundWS?.startedAt ? DateTimeConverter.date(foundWS.startedAt) : '',
170
+ mt_date: foundJS?.containerMtDate ? DateTimeConverter.date(foundJS.containerMtDate) : '',
171
+ advise_mt_date: foundJS.adviseMtDate ? DateTimeConverter.datetime(foundJS.adviseMtDate, timezoneOffSet) : '',
172
+ loose_item: foundGAN.looseItem ? 'N' : 'Y',
173
+ no_of_pallet:
174
+ (sumPalletQty > 1 ? `${sumPalletQty} PALLETS` : `${sumPalletQty} PALLET`) +
175
+ `, ` +
176
+ (sumPackQty ? `${sumPackQty} CTN` : 0),
177
+ commodity: prodType.filter((a, b) => prodType.indexOf(a) === b).join(', '),
178
+ created_on: DateTimeConverter.date(foundJS.createdAt),
179
+ job_no: foundJS ? foundJS.name : null,
180
+ ref_no: foundGAN.name,
181
+ product_list: invItems.map(item => {
182
+ index = item.rn == 1 ? index + 1 : index
183
+ return {
184
+ idx: item.rn == 1 ? index : '',
185
+ pallet_id: item.palletId,
186
+ product_name: item.productName,
187
+ product_type: item.packingType,
188
+ in_pallet: DateTimeConverter.date(item.createdAt),
189
+ out_pallet: item?.outboundAt ? DateTimeConverter.date(item.outboundAt) : null,
190
+ do_list: item.doName,
191
+ product_qty: item.unloadedQty,
192
+ remark: foundGAN.looseItem ? 'STRETCH FILM' : null
193
+ }
194
+ })
195
+ }
196
+ const formData = new FormData()
197
+
198
+ formData.append('template', template)
199
+ formData.append('jsonString', JSON.stringify(data))
200
+
201
+ const response = await fetch(REPORT_API_URL, {
202
+ method: 'POST',
203
+ body: formData
204
+ })
205
+
206
+ return await response.text()
207
+ })
208
+ }