@things-factory/sales-base 5.0.13 → 6.0.0-alpha.1

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 (330) hide show
  1. package/dist-server/constants/order.js +4 -1
  2. package/dist-server/constants/order.js.map +1 -1
  3. package/dist-server/constants/release-good.js +5 -1
  4. package/dist-server/constants/release-good.js.map +1 -1
  5. package/dist-server/controllers/ecommerce/ecommerce-controller.js +1 -1
  6. package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
  7. package/dist-server/controllers/ecommerce/sellercraft-controller.js +102 -94
  8. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  9. package/dist-server/controllers/order-controller.js +7 -5
  10. package/dist-server/controllers/order-controller.js.map +1 -1
  11. package/dist-server/service/arrival-notice/arrival-notice-mutation.js +152 -65
  12. package/dist-server/service/arrival-notice/arrival-notice-mutation.js.map +1 -1
  13. package/dist-server/service/arrival-notice/arrival-notice-query.js +15 -16
  14. package/dist-server/service/arrival-notice/arrival-notice-query.js.map +1 -1
  15. package/dist-server/service/arrival-notice/arrival-notice-types.js +1 -2
  16. package/dist-server/service/arrival-notice/arrival-notice-types.js.map +1 -1
  17. package/dist-server/service/arrival-notice/arrival-notice.js +7 -7
  18. package/dist-server/service/arrival-notice/arrival-notice.js.map +1 -1
  19. package/dist-server/service/claim/claim-mutation.js +15 -14
  20. package/dist-server/service/claim/claim-mutation.js.map +1 -1
  21. package/dist-server/service/claim/claim-query.js +8 -10
  22. package/dist-server/service/claim/claim-query.js.map +1 -1
  23. package/dist-server/service/claim/claim.js +7 -7
  24. package/dist-server/service/claim/claim.js.map +1 -1
  25. package/dist-server/service/claim-detail/claim-detail-mutation.js +9 -8
  26. package/dist-server/service/claim-detail/claim-detail-mutation.js.map +1 -1
  27. package/dist-server/service/claim-detail/claim-detail-query.js +9 -10
  28. package/dist-server/service/claim-detail/claim-detail-query.js.map +1 -1
  29. package/dist-server/service/claim-detail/claim-detail.js +3 -4
  30. package/dist-server/service/claim-detail/claim-detail.js.map +1 -1
  31. package/dist-server/service/claim-order/claim-order-mutation.js +9 -8
  32. package/dist-server/service/claim-order/claim-order-mutation.js.map +1 -1
  33. package/dist-server/service/claim-order/claim-order-query.js +9 -10
  34. package/dist-server/service/claim-order/claim-order-query.js.map +1 -1
  35. package/dist-server/service/claim-order/claim-order.js +3 -4
  36. package/dist-server/service/claim-order/claim-order.js.map +1 -1
  37. package/dist-server/service/collection-order/collection-order-mutation.js +15 -14
  38. package/dist-server/service/collection-order/collection-order-mutation.js.map +1 -1
  39. package/dist-server/service/collection-order/collection-order-query.js +14 -14
  40. package/dist-server/service/collection-order/collection-order-query.js.map +1 -1
  41. package/dist-server/service/collection-order/collection-order-types.js +4 -5
  42. package/dist-server/service/collection-order/collection-order-types.js.map +1 -1
  43. package/dist-server/service/collection-order/collection-order.js +7 -7
  44. package/dist-server/service/collection-order/collection-order.js.map +1 -1
  45. package/dist-server/service/delivery-order/delivery-order-mutation.js +138 -51
  46. package/dist-server/service/delivery-order/delivery-order-mutation.js.map +1 -1
  47. package/dist-server/service/delivery-order/delivery-order-query.js +51 -38
  48. package/dist-server/service/delivery-order/delivery-order-query.js.map +1 -1
  49. package/dist-server/service/delivery-order/delivery-order-types.js +22 -3
  50. package/dist-server/service/delivery-order/delivery-order-types.js.map +1 -1
  51. package/dist-server/service/delivery-order/delivery-order.js +92 -7
  52. package/dist-server/service/delivery-order/delivery-order.js.map +1 -1
  53. package/dist-server/service/draft-release-good/draft-release-good-mutation.js +157 -143
  54. package/dist-server/service/draft-release-good/draft-release-good-mutation.js.map +1 -1
  55. package/dist-server/service/draft-release-good/draft-release-good-query.js +54 -24
  56. package/dist-server/service/draft-release-good/draft-release-good-query.js.map +1 -1
  57. package/dist-server/service/draft-release-good/draft-release-good-type.js +3 -4
  58. package/dist-server/service/draft-release-good/draft-release-good-type.js.map +1 -1
  59. package/dist-server/service/draft-release-good/draft-release-good.js +11 -6
  60. package/dist-server/service/draft-release-good/draft-release-good.js.map +1 -1
  61. package/dist-server/service/goods-receival-note/goods-receival-note-mutation.js +12 -11
  62. package/dist-server/service/goods-receival-note/goods-receival-note-mutation.js.map +1 -1
  63. package/dist-server/service/goods-receival-note/goods-receival-note-query.js +104 -12
  64. package/dist-server/service/goods-receival-note/goods-receival-note-query.js.map +1 -1
  65. package/dist-server/service/goods-receival-note/goods-receival-note-types.js +67 -4
  66. package/dist-server/service/goods-receival-note/goods-receival-note-types.js.map +1 -1
  67. package/dist-server/service/goods-receival-note/goods-receival-note.js +46 -5
  68. package/dist-server/service/goods-receival-note/goods-receival-note.js.map +1 -1
  69. package/dist-server/service/inventory-check/inventory-check-mutation.js +6 -6
  70. package/dist-server/service/inventory-check/inventory-check-mutation.js.map +1 -1
  71. package/dist-server/service/inventory-check/inventory-check-query.js +8 -10
  72. package/dist-server/service/inventory-check/inventory-check-query.js.map +1 -1
  73. package/dist-server/service/inventory-check/inventory-check.js +5 -5
  74. package/dist-server/service/inventory-check/inventory-check.js.map +1 -1
  75. package/dist-server/service/invoice/invoice-mutation.js +5 -5
  76. package/dist-server/service/invoice/invoice-mutation.js.map +1 -1
  77. package/dist-server/service/invoice/invoice-query.js +7 -9
  78. package/dist-server/service/invoice/invoice-query.js.map +1 -1
  79. package/dist-server/service/invoice/invoice-types.js +2 -3
  80. package/dist-server/service/invoice/invoice-types.js.map +1 -1
  81. package/dist-server/service/invoice/invoice.js +3 -4
  82. package/dist-server/service/invoice/invoice.js.map +1 -1
  83. package/dist-server/service/invoice-product/invoice-product-mutation.js +1 -1
  84. package/dist-server/service/invoice-product/invoice-product-mutation.js.map +1 -1
  85. package/dist-server/service/invoice-product/invoice-product-query.js +7 -9
  86. package/dist-server/service/invoice-product/invoice-product-query.js.map +1 -1
  87. package/dist-server/service/invoice-product/invoice-product.js +5 -5
  88. package/dist-server/service/invoice-product/invoice-product.js.map +1 -1
  89. package/dist-server/service/job-sheet/job-sheet-mutation.js +5 -5
  90. package/dist-server/service/job-sheet/job-sheet-mutation.js.map +1 -1
  91. package/dist-server/service/job-sheet/job-sheet-query.js +6 -8
  92. package/dist-server/service/job-sheet/job-sheet-query.js.map +1 -1
  93. package/dist-server/service/job-sheet/job-sheet.js +5 -5
  94. package/dist-server/service/job-sheet/job-sheet.js.map +1 -1
  95. package/dist-server/service/manifest/manifest-mutation.js +84 -4
  96. package/dist-server/service/manifest/manifest-mutation.js.map +1 -1
  97. package/dist-server/service/manifest/manifest-query.js +52 -19
  98. package/dist-server/service/manifest/manifest-query.js.map +1 -1
  99. package/dist-server/service/manifest/manifest-type.js +8 -0
  100. package/dist-server/service/manifest/manifest-type.js.map +1 -1
  101. package/dist-server/service/manifest/manifest.js +8 -4
  102. package/dist-server/service/manifest/manifest.js.map +1 -1
  103. package/dist-server/service/order-inventory/order-inventory-mutation.js +3 -3
  104. package/dist-server/service/order-inventory/order-inventory-mutation.js.map +1 -1
  105. package/dist-server/service/order-inventory/order-inventory-query.js +202 -221
  106. package/dist-server/service/order-inventory/order-inventory-query.js.map +1 -1
  107. package/dist-server/service/order-inventory/order-inventory-types.js +15 -15
  108. package/dist-server/service/order-inventory/order-inventory-types.js.map +1 -1
  109. package/dist-server/service/order-inventory/order-inventory.js +45 -15
  110. package/dist-server/service/order-inventory/order-inventory.js.map +1 -1
  111. package/dist-server/service/order-product/order-product-mutation.js +2 -2
  112. package/dist-server/service/order-product/order-product-mutation.js.map +1 -1
  113. package/dist-server/service/order-product/order-product-query.js +44 -14
  114. package/dist-server/service/order-product/order-product-query.js.map +1 -1
  115. package/dist-server/service/order-product/order-product-types.js +18 -19
  116. package/dist-server/service/order-product/order-product-types.js.map +1 -1
  117. package/dist-server/service/order-product/order-product.js +14 -11
  118. package/dist-server/service/order-product/order-product.js.map +1 -1
  119. package/dist-server/service/order-tote/order-tote-mutation.js +2 -2
  120. package/dist-server/service/order-tote/order-tote-mutation.js.map +1 -1
  121. package/dist-server/service/order-tote/order-tote-query.js +13 -14
  122. package/dist-server/service/order-tote/order-tote-query.js.map +1 -1
  123. package/dist-server/service/order-tote/order-tote-types.js +4 -5
  124. package/dist-server/service/order-tote/order-tote-types.js.map +1 -1
  125. package/dist-server/service/order-tote/order-tote.js +6 -5
  126. package/dist-server/service/order-tote/order-tote.js.map +1 -1
  127. package/dist-server/service/order-tote-item/order-tote-item-mutation.js +2 -2
  128. package/dist-server/service/order-tote-item/order-tote-item-mutation.js.map +1 -1
  129. package/dist-server/service/order-tote-item/order-tote-item-query.js +7 -9
  130. package/dist-server/service/order-tote-item/order-tote-item-query.js.map +1 -1
  131. package/dist-server/service/order-tote-item/order-tote-item-types.js +5 -6
  132. package/dist-server/service/order-tote-item/order-tote-item-types.js.map +1 -1
  133. package/dist-server/service/order-tote-item/order-tote-item.js +2 -3
  134. package/dist-server/service/order-tote-item/order-tote-item.js.map +1 -1
  135. package/dist-server/service/order-tote-seal/order-tote-seal-mutation.js +2 -2
  136. package/dist-server/service/order-tote-seal/order-tote-seal-mutation.js.map +1 -1
  137. package/dist-server/service/order-tote-seal/order-tote-seal-query.js +8 -10
  138. package/dist-server/service/order-tote-seal/order-tote-seal-query.js.map +1 -1
  139. package/dist-server/service/order-tote-seal/order-tote-seal-types.js +2 -3
  140. package/dist-server/service/order-tote-seal/order-tote-seal-types.js.map +1 -1
  141. package/dist-server/service/order-tote-seal/order-tote-seal.js +2 -3
  142. package/dist-server/service/order-tote-seal/order-tote-seal.js.map +1 -1
  143. package/dist-server/service/order-vas/order-vas-mutation.js +1 -1
  144. package/dist-server/service/order-vas/order-vas-mutation.js.map +1 -1
  145. package/dist-server/service/order-vas/order-vas-query.js +8 -10
  146. package/dist-server/service/order-vas/order-vas-query.js.map +1 -1
  147. package/dist-server/service/order-vas/order-vas-types.js +16 -17
  148. package/dist-server/service/order-vas/order-vas-types.js.map +1 -1
  149. package/dist-server/service/order-vas/order-vas.js +7 -7
  150. package/dist-server/service/order-vas/order-vas.js.map +1 -1
  151. package/dist-server/service/others/other-query.js +48 -30
  152. package/dist-server/service/others/other-query.js.map +1 -1
  153. package/dist-server/service/purchase-order/purchase-order-mutation.js +36 -34
  154. package/dist-server/service/purchase-order/purchase-order-mutation.js.map +1 -1
  155. package/dist-server/service/purchase-order/purchase-order-query.js +11 -12
  156. package/dist-server/service/purchase-order/purchase-order-query.js.map +1 -1
  157. package/dist-server/service/purchase-order/purchase-order-types.js +8 -9
  158. package/dist-server/service/purchase-order/purchase-order-types.js.map +1 -1
  159. package/dist-server/service/purchase-order/purchase-order.js +8 -8
  160. package/dist-server/service/purchase-order/purchase-order.js.map +1 -1
  161. package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.js +1 -1
  162. package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.js.map +1 -1
  163. package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge-query.js +9 -10
  164. package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge-query.js.map +1 -1
  165. package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge.js +3 -4
  166. package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge.js.map +1 -1
  167. package/dist-server/service/release-good/release-good-mutation.js +182 -94
  168. package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
  169. package/dist-server/service/release-good/release-good-query.js +251 -172
  170. package/dist-server/service/release-good/release-good-query.js.map +1 -1
  171. package/dist-server/service/release-good/release-good-types.js +181 -9
  172. package/dist-server/service/release-good/release-good-types.js.map +1 -1
  173. package/dist-server/service/release-good/release-good.js +64 -13
  174. package/dist-server/service/release-good/release-good.js.map +1 -1
  175. package/dist-server/service/retail-replenishment-order/retail-replenishment-order-mutation.js +19 -14
  176. package/dist-server/service/retail-replenishment-order/retail-replenishment-order-mutation.js.map +1 -1
  177. package/dist-server/service/retail-replenishment-order/retail-replenishment-order-query.js +8 -10
  178. package/dist-server/service/retail-replenishment-order/retail-replenishment-order-query.js.map +1 -1
  179. package/dist-server/service/retail-replenishment-order/retail-replenishment-order-types.js +6 -7
  180. package/dist-server/service/retail-replenishment-order/retail-replenishment-order-types.js.map +1 -1
  181. package/dist-server/service/retail-replenishment-order/retail-replenishment-order.js +5 -5
  182. package/dist-server/service/retail-replenishment-order/retail-replenishment-order.js.map +1 -1
  183. package/dist-server/service/return-order/return-order-mutation.js +38 -27
  184. package/dist-server/service/return-order/return-order-mutation.js.map +1 -1
  185. package/dist-server/service/return-order/return-order-query.js +14 -16
  186. package/dist-server/service/return-order/return-order-query.js.map +1 -1
  187. package/dist-server/service/return-order/return-order-types.js +9 -9
  188. package/dist-server/service/return-order/return-order-types.js.map +1 -1
  189. package/dist-server/service/return-order/return-order.js +6 -6
  190. package/dist-server/service/return-order/return-order.js.map +1 -1
  191. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-mutation.js +17 -13
  192. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-mutation.js.map +1 -1
  193. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-query.js +13 -14
  194. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-query.js.map +1 -1
  195. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-type.js +9 -9
  196. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-type.js.map +1 -1
  197. package/dist-server/service/reverse-kitting-order/reverse-kitting-order.js +8 -8
  198. package/dist-server/service/reverse-kitting-order/reverse-kitting-order.js.map +1 -1
  199. package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.js +4 -4
  200. package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.js.map +1 -1
  201. package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.js +7 -9
  202. package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.js.map +1 -1
  203. package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-type.js +4 -5
  204. package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-type.js.map +1 -1
  205. package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory.js +7 -7
  206. package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory.js.map +1 -1
  207. package/dist-server/service/shipping-order/shipping-order-mutation.js +2 -2
  208. package/dist-server/service/shipping-order/shipping-order-mutation.js.map +1 -1
  209. package/dist-server/service/shipping-order/shipping-order-query.js +9 -10
  210. package/dist-server/service/shipping-order/shipping-order-query.js.map +1 -1
  211. package/dist-server/service/shipping-order/shipping-order-types.js +21 -1
  212. package/dist-server/service/shipping-order/shipping-order-types.js.map +1 -1
  213. package/dist-server/service/shipping-order/shipping-order.js +27 -7
  214. package/dist-server/service/shipping-order/shipping-order.js.map +1 -1
  215. package/dist-server/service/transfer-order/transfer-order-mutation.js +19 -14
  216. package/dist-server/service/transfer-order/transfer-order-mutation.js.map +1 -1
  217. package/dist-server/service/transfer-order/transfer-order-query.js +8 -10
  218. package/dist-server/service/transfer-order/transfer-order-query.js.map +1 -1
  219. package/dist-server/service/transfer-order/transfer-order-types.js +1 -2
  220. package/dist-server/service/transfer-order/transfer-order-types.js.map +1 -1
  221. package/dist-server/service/transfer-order/transfer-order.js +5 -5
  222. package/dist-server/service/transfer-order/transfer-order.js.map +1 -1
  223. package/dist-server/service/vas/vas-mutation.js +2 -2
  224. package/dist-server/service/vas/vas-mutation.js.map +1 -1
  225. package/dist-server/service/vas/vas-query.js +8 -10
  226. package/dist-server/service/vas/vas-query.js.map +1 -1
  227. package/dist-server/service/vas/vas.js +3 -4
  228. package/dist-server/service/vas/vas.js.map +1 -1
  229. package/dist-server/service/vas-order/vas-order-mutation.js +20 -15
  230. package/dist-server/service/vas-order/vas-order-mutation.js.map +1 -1
  231. package/dist-server/service/vas-order/vas-order-query.js +11 -12
  232. package/dist-server/service/vas-order/vas-order-query.js.map +1 -1
  233. package/dist-server/service/vas-order/vas-order.js +5 -5
  234. package/dist-server/service/vas-order/vas-order.js.map +1 -1
  235. package/dist-server/tsconfig.tsbuildinfo +1 -1
  236. package/dist-server/utils/datetime-util.js +49 -0
  237. package/dist-server/utils/datetime-util.js.map +1 -0
  238. package/dist-server/utils/index.js +1 -0
  239. package/dist-server/utils/index.js.map +1 -1
  240. package/dist-server/utils/inventory-util.js +89 -29
  241. package/dist-server/utils/inventory-util.js.map +1 -1
  242. package/package.json +13 -13
  243. package/server/constants/order.ts +4 -1
  244. package/server/constants/release-good.ts +6 -3
  245. package/server/controllers/ecommerce/ecommerce-controller.ts +1 -1
  246. package/server/controllers/ecommerce/sellercraft-controller.ts +124 -107
  247. package/server/controllers/order-controller.ts +7 -5
  248. package/server/service/arrival-notice/arrival-notice-mutation.ts +204 -91
  249. package/server/service/arrival-notice/arrival-notice-query.ts +17 -17
  250. package/server/service/claim/claim-mutation.ts +20 -14
  251. package/server/service/claim/claim-query.ts +10 -9
  252. package/server/service/claim-detail/claim-detail-mutation.ts +16 -10
  253. package/server/service/claim-detail/claim-detail-query.ts +13 -8
  254. package/server/service/claim-order/claim-order-mutation.ts +16 -10
  255. package/server/service/claim-order/claim-order-query.ts +10 -8
  256. package/server/service/collection-order/collection-order-mutation.ts +31 -32
  257. package/server/service/collection-order/collection-order-query.ts +18 -15
  258. package/server/service/delivery-order/delivery-order-mutation.ts +206 -73
  259. package/server/service/delivery-order/delivery-order-query.ts +90 -53
  260. package/server/service/delivery-order/delivery-order-types.ts +15 -0
  261. package/server/service/delivery-order/delivery-order.ts +68 -0
  262. package/server/service/draft-release-good/draft-release-good-mutation.ts +208 -183
  263. package/server/service/draft-release-good/draft-release-good-query.ts +81 -44
  264. package/server/service/draft-release-good/draft-release-good.ts +7 -3
  265. package/server/service/goods-receival-note/goods-receival-note-mutation.ts +23 -18
  266. package/server/service/goods-receival-note/goods-receival-note-query.ts +126 -15
  267. package/server/service/goods-receival-note/goods-receival-note-types.ts +48 -0
  268. package/server/service/goods-receival-note/goods-receival-note.ts +32 -0
  269. package/server/service/inventory-check/inventory-check-mutation.ts +24 -19
  270. package/server/service/inventory-check/inventory-check-query.ts +10 -9
  271. package/server/service/invoice/invoice-mutation.ts +14 -11
  272. package/server/service/invoice/invoice-query.ts +8 -9
  273. package/server/service/invoice-product/invoice-product-mutation.ts +4 -4
  274. package/server/service/invoice-product/invoice-product-query.ts +8 -9
  275. package/server/service/job-sheet/job-sheet-mutation.ts +12 -10
  276. package/server/service/job-sheet/job-sheet-query.ts +16 -11
  277. package/server/service/manifest/manifest-mutation.ts +93 -8
  278. package/server/service/manifest/manifest-query.ts +73 -23
  279. package/server/service/manifest/manifest-type.ts +6 -0
  280. package/server/service/manifest/manifest.ts +6 -2
  281. package/server/service/order-inventory/order-inventory-mutation.ts +13 -12
  282. package/server/service/order-inventory/order-inventory-query.ts +226 -253
  283. package/server/service/order-inventory/order-inventory.ts +26 -2
  284. package/server/service/order-product/order-product-mutation.ts +11 -10
  285. package/server/service/order-product/order-product-query.ts +55 -18
  286. package/server/service/order-product/order-product.ts +7 -0
  287. package/server/service/order-tote/order-tote-mutation.ts +10 -9
  288. package/server/service/order-tote/order-tote-query.ts +13 -15
  289. package/server/service/order-tote/order-tote.ts +13 -2
  290. package/server/service/order-tote-item/order-tote-item-mutation.ts +10 -9
  291. package/server/service/order-tote-item/order-tote-item-query.ts +12 -18
  292. package/server/service/order-tote-seal/order-tote-seal-mutation.ts +10 -9
  293. package/server/service/order-tote-seal/order-tote-seal-query.ts +10 -11
  294. package/server/service/order-vas/order-vas-mutation.ts +4 -5
  295. package/server/service/order-vas/order-vas-query.ts +10 -9
  296. package/server/service/others/other-query.ts +76 -54
  297. package/server/service/purchase-order/purchase-order-mutation.ts +46 -46
  298. package/server/service/purchase-order/purchase-order-query.ts +13 -11
  299. package/server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.ts +7 -7
  300. package/server/service/purchase-order-other-charge/purchase-order-other-charge-query.ts +14 -9
  301. package/server/service/release-good/release-good-mutation.ts +297 -134
  302. package/server/service/release-good/release-good-query.ts +268 -186
  303. package/server/service/release-good/release-good-types.ts +132 -4
  304. package/server/service/release-good/release-good.ts +55 -24
  305. package/server/service/retail-replenishment-order/retail-replenishment-order-mutation.ts +35 -29
  306. package/server/service/retail-replenishment-order/retail-replenishment-order-query.ts +13 -9
  307. package/server/service/retail-replenishment-order/retail-replenishment-order-types.ts +7 -5
  308. package/server/service/return-order/return-order-mutation.ts +82 -54
  309. package/server/service/return-order/return-order-query.ts +21 -19
  310. package/server/service/reverse-kitting-order/reverse-kitting-order-mutation.ts +38 -23
  311. package/server/service/reverse-kitting-order/reverse-kitting-order-query.ts +19 -16
  312. package/server/service/reverse-kitting-order/reverse-kitting-order.ts +2 -2
  313. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.ts +9 -9
  314. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.ts +7 -8
  315. package/server/service/shipping-order/shipping-order-mutation.ts +11 -11
  316. package/server/service/shipping-order/shipping-order-query.ts +13 -11
  317. package/server/service/shipping-order/shipping-order-types.ts +16 -1
  318. package/server/service/shipping-order/shipping-order.ts +18 -2
  319. package/server/service/transfer-order/transfer-order-mutation.ts +34 -25
  320. package/server/service/transfer-order/transfer-order-query.ts +11 -10
  321. package/server/service/vas/vas-mutation.ts +13 -15
  322. package/server/service/vas/vas-query.ts +12 -10
  323. package/server/service/vas-order/vas-order-mutation.ts +38 -28
  324. package/server/service/vas-order/vas-order-query.ts +15 -13
  325. package/server/utils/datetime-util.ts +54 -0
  326. package/server/utils/index.ts +1 -0
  327. package/server/utils/inventory-util.ts +128 -34
  328. package/translations/en.json +4 -0
  329. package/translations/ko.json +6 -2
  330. package/translations/ms.json +5 -1
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DateTimeConverter = exports.DateGenerator = void 0;
4
+ class DateGenerator {
5
+ static generateDate() {
6
+ const today = new Date();
7
+ const year = today.getFullYear();
8
+ const month = today.getMonth();
9
+ const day = today.getDate();
10
+ const yy = String(year).substr(String(year).length - 2);
11
+ const mm = String(month + 1).padStart(2, '0');
12
+ const dd = String(day).padStart(2, '0');
13
+ return yy + mm + dd;
14
+ }
15
+ }
16
+ exports.DateGenerator = DateGenerator;
17
+ class DateTimeConverter {
18
+ static date(dateTime) {
19
+ let unloadDate = '';
20
+ if (dateTime) {
21
+ const unloadDateTime = new Date(dateTime);
22
+ var year = unloadDateTime.getFullYear();
23
+ var month = (1 + unloadDateTime.getMonth()).toString();
24
+ month = month.length > 1 ? month : '0' + month;
25
+ var day = unloadDateTime.getDate().toString();
26
+ day = day.length > 1 ? day : '0' + day;
27
+ unloadDate = day + '-' + month + '-' + year;
28
+ }
29
+ return unloadDate;
30
+ }
31
+ static datetime(dateTime, timezone) {
32
+ let unloadDate = '';
33
+ if (dateTime) {
34
+ const datetime = Number(dateTime);
35
+ const timezoneOffset = timezone * 60000;
36
+ const newUnloadDate = new Date(datetime - timezoneOffset).toISOString().slice(0, -1);
37
+ var dateTimeParts = newUnloadDate.split('T');
38
+ //handle date parts
39
+ var dateParts = dateTimeParts[0].split('-');
40
+ var newDate = DateTimeConverter.date(dateParts);
41
+ //handle time part
42
+ var timeParts = dateTimeParts[1].slice(0, -7);
43
+ unloadDate = newDate + ' ' + timeParts;
44
+ }
45
+ return unloadDate;
46
+ }
47
+ }
48
+ exports.DateTimeConverter = DateTimeConverter;
49
+ //# sourceMappingURL=datetime-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datetime-util.js","sourceRoot":"","sources":["../../server/utils/datetime-util.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;IACxB,MAAM,CAAC,YAAY;QACjB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAA;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;QAE3B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAEvC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IACrB,CAAC;CACF;AAbD,sCAaC;AAED,MAAa,iBAAiB;IAC5B,MAAM,CAAC,IAAI,CAAC,QAAQ;QAClB,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,QAAQ,EAAE;YACZ,MAAM,cAAc,GAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC/C,IAAI,IAAI,GAAG,cAAc,CAAC,WAAW,EAAE,CAAA;YAEvC,IAAI,KAAK,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;YACtD,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAA;YAE9C,IAAI,GAAG,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAA;YAC7C,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAA;YAEtC,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,CAAA;SAC5C;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ;QAChC,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,QAAQ,EAAE;YACZ,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;YACjC,MAAM,cAAc,GAAG,QAAQ,GAAG,KAAK,CAAA;YACvC,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAEpF,IAAI,aAAa,GAAQ,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAEjD,mBAAmB;YACnB,IAAI,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC3C,IAAI,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAE/C,kBAAkB;YAClB,IAAI,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAE7C,UAAU,GAAG,OAAO,GAAG,GAAG,GAAG,SAAS,CAAA;SACvC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;CACF;AAtCD,8CAsCC","sourcesContent":["export class DateGenerator {\n static generateDate() {\n const today = new Date()\n const year = today.getFullYear()\n const month = today.getMonth()\n const day = today.getDate()\n\n const yy = String(year).substr(String(year).length - 2)\n const mm = String(month + 1).padStart(2, '0')\n const dd = String(day).padStart(2, '0')\n\n return yy + mm + dd\n }\n}\n\nexport class DateTimeConverter {\n static date(dateTime) {\n let unloadDate = ''\n if (dateTime) {\n const unloadDateTime: Date = new Date(dateTime)\n var year = unloadDateTime.getFullYear()\n\n var month = (1 + unloadDateTime.getMonth()).toString()\n month = month.length > 1 ? month : '0' + month\n\n var day = unloadDateTime.getDate().toString()\n day = day.length > 1 ? day : '0' + day\n\n unloadDate = day + '-' + month + '-' + year\n }\n return unloadDate\n }\n\n static datetime(dateTime, timezone) {\n let unloadDate = ''\n if (dateTime) {\n const datetime = Number(dateTime)\n const timezoneOffset = timezone * 60000\n const newUnloadDate = new Date(datetime - timezoneOffset).toISOString().slice(0, -1)\n\n var dateTimeParts: any = newUnloadDate.split('T')\n\n //handle date parts\n var dateParts = dateTimeParts[0].split('-')\n var newDate = DateTimeConverter.date(dateParts)\n\n //handle time part\n var timeParts = dateTimeParts[1].slice(0, -7)\n\n unloadDate = newDate + ' ' + timeParts\n }\n return unloadDate\n }\n}\n"]}
@@ -3,4 +3,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./order-no-generator"), exports);
5
5
  tslib_1.__exportStar(require("./inventory-util"), exports);
6
+ tslib_1.__exportStar(require("./datetime-util"), exports);
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/utils/index.ts"],"names":[],"mappings":";;;AAAA,+DAAoC;AACpC,2DAAgC","sourcesContent":["export * from './order-no-generator'\nexport * from './inventory-util'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/utils/index.ts"],"names":[],"mappings":";;;AAAA,+DAAoC;AACpC,2DAAgC;AAChC,0DAA+B","sourcesContent":["export * from './order-no-generator'\nexport * from './inventory-util'\nexport * from './datetime-util'\n"]}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports._composeTargetInventories = exports.switchLocationStatus = exports.InventoryUtil = void 0;
4
4
  const typeorm_1 = require("typeorm");
5
5
  const product_base_1 = require("@things-factory/product-base");
6
+ const shell_1 = require("@things-factory/shell");
6
7
  const warehouse_base_1 = require("@things-factory/warehouse-base");
7
8
  const constants_1 = require("../constants");
8
9
  const errors_1 = require("../errors");
@@ -179,6 +180,7 @@ exports.InventoryUtil = {
179
180
  let filters = params.filters;
180
181
  const { domain } = context.state;
181
182
  const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle } = await getConditions(bizplaces, filters, trxMgr);
183
+ const _groupType = filters.find(res => res.name == 'groupType');
182
184
  let queryStrings = `
183
185
  CREATE TEMP TABLE temp_inventory_product_group AS (
184
186
  SELECT * FROM (
@@ -275,17 +277,35 @@ exports.InventoryUtil = {
275
277
  ${whereClause}
276
278
  )
277
279
  `;
280
+ let filterGroupTypeQuery;
281
+ if (_groupType) {
282
+ if (_groupType.value === 'SINGLE') {
283
+ filterGroupTypeQuery = `where "groupType"= 'SINGLE' `;
284
+ }
285
+ else {
286
+ filterGroupTypeQuery = `where "groupType"= 'BUNDLE' `;
287
+ }
288
+ }
289
+ let sortingArr = params.sortings || [];
290
+ let sortedBy = [];
291
+ if (sortingArr.length > 0) {
292
+ sortingArr.forEach(element => {
293
+ if (element.desc) {
294
+ sortedBy.push(`"${element.name}" DESC `);
295
+ }
296
+ else {
297
+ sortedBy.push(`"${element.name}" `);
298
+ }
299
+ });
300
+ }
278
301
  await trxMgr.query(queryStrings, [domain.id]);
279
- const [{ total }] = await trxMgr.query(`select count(*) as total from temp_inventory_product_group`);
302
+ const [{ total }] = await trxMgr.query(`select count(*) as total from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''}`);
280
303
  let items = [];
281
304
  if (params === null || params === void 0 ? void 0 : params.pagination) {
282
- items = await trxMgr.query(`select * from temp_inventory_product_group OFFSET $1 LIMIT $2`, [
283
- (params.pagination.page - 1) * params.pagination.limit,
284
- params.pagination.limit
285
- ]);
305
+ items = await trxMgr.query(`select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''} OFFSET $1 LIMIT $2`, [(params.pagination.page - 1) * params.pagination.limit, params.pagination.limit]);
286
306
  }
287
307
  else {
288
- items = await trxMgr.query(`select * from temp_inventory_product_group`);
308
+ items = await trxMgr.query(`select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''}`);
289
309
  }
290
310
  await trxMgr.query(`drop table temp_inventory_product_group`);
291
311
  return { items, total };
@@ -440,8 +460,8 @@ exports.InventoryUtil = {
440
460
  });
441
461
  },
442
462
  async checkPalletDuplication(palletId, warehouseDomain, trxMgr) {
443
- const duplicatedPalletCnt = await trxMgr.getRepository(warehouse_base_1.Inventory).count({
444
- domain: warehouseDomain,
463
+ const duplicatedPalletCnt = await trxMgr.getRepository(warehouse_base_1.Inventory).countBy({
464
+ domain: { id: warehouseDomain.id },
445
465
  palletId,
446
466
  status: (0, typeorm_1.Not)((0, typeorm_1.Equal)(warehouse_base_1.INVENTORY_STATUS.TERMINATED))
447
467
  });
@@ -449,7 +469,7 @@ exports.InventoryUtil = {
449
469
  throw new Error(palletId + ` exists`);
450
470
  const duplicatedReusablePalletCnt = await trxMgr.getRepository(warehouse_base_1.Pallet).count({
451
471
  where: {
452
- domain: warehouseDomain,
472
+ domain: { id: warehouseDomain.id },
453
473
  name: palletId
454
474
  }
455
475
  });
@@ -467,7 +487,7 @@ exports.InventoryUtil = {
467
487
  * @param trxMgr
468
488
  * @returns orderInventories
469
489
  */
470
- async autoAssignInventoryForRelease(product, orderInventory, packingType, locationSortingRules = [], customerBizplace, domain, trxMgr) {
490
+ async autoAssignInventoryForRelease(product, orderInventory, packingType, locationSortingRules = [], customerBizplace, domain, trxMgr, batchId) {
471
491
  let qb = trxMgr.getRepository(warehouse_base_1.Inventory).createQueryBuilder('iv');
472
492
  qb.leftJoinAndSelect('iv.location', 'loc')
473
493
  .andWhere('"iv"."domain_id" = :domainId')
@@ -485,15 +505,49 @@ exports.InventoryUtil = {
485
505
  status: warehouse_base_1.INVENTORY_STATUS.STORED,
486
506
  locationTypes: [warehouse_base_1.LOCATION_TYPE.QUARANTINE, warehouse_base_1.LOCATION_TYPE.RESERVE]
487
507
  });
488
- if (locationSortingRules === null || locationSortingRules === void 0 ? void 0 : locationSortingRules.length) {
489
- locationSortingRules.forEach((rule, idx) => {
490
- idx === 0
491
- ? qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
492
- : qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC');
493
- });
508
+ if (batchId) {
509
+ qb.andWhere('"iv"."batch_id" = :batchId', { batchId: batchId });
494
510
  }
495
- else {
496
- qb.addOrderBy('"iv"."created_at"', 'ASC');
511
+ let locationSorting = function (qb, locationSortingRules) {
512
+ if (locationSortingRules === null || locationSortingRules === void 0 ? void 0 : locationSortingRules.length) {
513
+ locationSortingRules.forEach((rule, idx) => {
514
+ idx === 0
515
+ ? qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
516
+ : qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC');
517
+ });
518
+ }
519
+ else {
520
+ qb.addOrderBy('"loc"."name"', 'ASC');
521
+ qb.addOrderBy('"iv"."created_at"', 'ASC');
522
+ }
523
+ return qb;
524
+ };
525
+ switch (product === null || product === void 0 ? void 0 : product.pickingStrategy) {
526
+ case 'FIFO':
527
+ qb.addOrderBy('"iv"."created_at"', 'ASC');
528
+ qb = locationSorting(qb, locationSortingRules);
529
+ break;
530
+ case 'LIFO':
531
+ qb.addOrderBy('"iv"."created_at"', 'DESC');
532
+ qb = locationSorting(qb, locationSortingRules);
533
+ break;
534
+ case 'FEFO':
535
+ qb.addOrderBy('"iv"."expiration_date"', 'ASC');
536
+ qb.addOrderBy('"iv"."created_at"', 'ASC');
537
+ qb = locationSorting(qb, locationSortingRules);
538
+ break;
539
+ case 'FMFO':
540
+ qb.addOrderBy('"iv"."manufacture_date"', 'ASC');
541
+ qb.addOrderBy('"iv"."created_at"', 'ASC');
542
+ qb = locationSorting(qb, locationSortingRules);
543
+ break;
544
+ case 'LOCATION':
545
+ qb = locationSorting(qb, locationSortingRules);
546
+ break;
547
+ default:
548
+ qb.addOrderBy('"iv"."created_at"', 'ASC');
549
+ qb = locationSorting(qb, locationSortingRules);
550
+ break;
497
551
  }
498
552
  let inventories = await qb.getMany();
499
553
  if (!(inventories === null || inventories === void 0 ? void 0 : inventories.length))
@@ -566,6 +620,8 @@ async function getConditions(bizplaces, filters, trxMgr, hasRemainingQty = true)
566
620
  case 'productBrand':
567
621
  whereClause += `AND LOWER("productBrand") LIKE '${value.toLowerCase()}'`;
568
622
  break;
623
+ case 'productSKU':
624
+ whereClause += `AND LOWER("productSKU") LIKE '${value.toLowerCase()}'`;
569
625
  case 'productName':
570
626
  const products = await trxMgr.getRepository(product_base_1.Product).find({
571
627
  select: ['id'],
@@ -690,8 +746,8 @@ async function updateInventory(inventory, trxMgr) {
690
746
  }
691
747
  async function generateInventoryHistory(inventory, refOrder, transactionType, qty, uomValue, user, trxMgr) {
692
748
  var _a, _b, _c;
693
- const invHistoryRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.InventoryHistory)) || (0, typeorm_1.getRepository)(warehouse_base_1.InventoryHistory);
694
- const invRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Inventory)) || (0, typeorm_1.getRepository)(warehouse_base_1.Inventory);
749
+ const invHistoryRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.InventoryHistory)) || (0, shell_1.getRepository)(warehouse_base_1.InventoryHistory);
750
+ const invRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Inventory)) || (0, shell_1.getRepository)(warehouse_base_1.Inventory);
695
751
  if (!(inventory === null || inventory === void 0 ? void 0 : inventory.id))
696
752
  throw new Error(`Can't find out ID of inventory.`);
697
753
  if (!(refOrder === null || refOrder === void 0 ? void 0 : refOrder.id) || !refOrder.name)
@@ -708,12 +764,15 @@ async function generateInventoryHistory(inventory, refOrder, transactionType, qt
708
764
  }
709
765
  const domain = inventory.domain;
710
766
  const location = inventory.location;
711
- const seq = await invHistoryRepo.count({ domain: inventory.domain, palletId: inventory.palletId });
767
+ const seq = await invHistoryRepo.countBy({
768
+ domain: { id: inventory.domain.id },
769
+ palletId: inventory.palletId
770
+ });
712
771
  let openingQty = 0;
713
772
  let openingUomValue = 0;
714
773
  if (seq) {
715
- const lastInvHistory = await invHistoryRepo.findOne({
716
- domain: inventory.domain,
774
+ const lastInvHistory = await invHistoryRepo.findOneBy({
775
+ domain: { id: inventory.domain.id },
717
776
  palletId: inventory.palletId,
718
777
  seq: seq - 1
719
778
  });
@@ -767,12 +826,12 @@ async function generateInventoryHistory(inventory, refOrder, transactionType, qt
767
826
  * @param trxMgr
768
827
  */
769
828
  async function switchLocationStatus(domain, location, updater, trxMgr) {
770
- const invRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Inventory)) || (0, typeorm_1.getRepository)(warehouse_base_1.Inventory);
771
- const locationRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Location)) || (0, typeorm_1.getRepository)(warehouse_base_1.Location);
772
- const allocatedItemsCnt = await invRepo.count({
773
- domain,
829
+ const invRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Inventory)) || (0, shell_1.getRepository)(warehouse_base_1.Inventory);
830
+ const locationRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Location)) || (0, shell_1.getRepository)(warehouse_base_1.Location);
831
+ const allocatedItemsCnt = await invRepo.countBy({
832
+ domain: { id: domain.id },
774
833
  status: warehouse_base_1.INVENTORY_STATUS.STORED,
775
- location
834
+ location: { id: location.id }
776
835
  });
777
836
  if (!allocatedItemsCnt && location.status !== warehouse_base_1.LOCATION_STATUS.EMPTY) {
778
837
  location = await locationRepo.save(Object.assign(Object.assign({}, location), { status: warehouse_base_1.LOCATION_STATUS.EMPTY, updater }));
@@ -796,7 +855,7 @@ function _composeTargetInventories(product, record, inventories) {
796
855
  let idx = 0;
797
856
  while (compReleaseQty < record.releaseQty) {
798
857
  const inventory = inventories[idx];
799
- const { packingType, packingSize, batchId, uom } = inventory;
858
+ const { packingType, packingSize, batchId, batchIdRef, uom } = inventory;
800
859
  let orderInventory = new service_1.OrderInventory();
801
860
  if (inventory.remainQty > leftReleaseQty) {
802
861
  const uomValuePerQty = Math.round((inventory.remainUomValue / inventory.remainQty) * 100) / 100;
@@ -815,6 +874,7 @@ function _composeTargetInventories(product, record, inventories) {
815
874
  packingType,
816
875
  packingSize,
817
876
  batchId,
877
+ batchIdRef,
818
878
  uom,
819
879
  product, type: constants_1.ORDER_TYPES.RELEASE_OF_GOODS }));
820
880
  idx++;
@@ -1 +1 @@
1
- {"version":3,"file":"inventory-util.js","sourceRoot":"","sources":["../../server/utils/inventory-util.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, Equal, getRepository, In, Not, Raw, Repository, SelectQueryBuilder } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Bizplace } from '@things-factory/biz-base'\nimport { Product, ProductBundle } from '@things-factory/product-base'\nimport { Domain, ListParam } from '@things-factory/shell'\nimport {\n Inventory,\n INVENTORY_STATUS,\n InventoryHistory,\n InventoryNoGenerator,\n Location,\n LOCATION_STATUS,\n LOCATION_TYPE,\n Pallet\n} from '@things-factory/warehouse-base'\n\nimport { ORDER_TYPES } from '../constants'\nimport { ValidationError } from '../errors'\nimport {\n ArrivalNotice,\n DeliveryOrder,\n InventoryCheck,\n OrderInventory,\n ReleaseGood,\n ReturnOrder,\n ReverseKittingOrder,\n VasOrder\n} from '../service'\n\nexport type ReferenceOrderType =\n | ArrivalNotice\n | ReleaseGood\n | VasOrder\n | InventoryCheck\n | DeliveryOrder\n | ReturnOrder\n | ReverseKittingOrder\n\nexport const InventoryUtil = {\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceProductInventory(bizplaces: Bizplace[], params: ListParam, context: any, trxMgr: EntityManager) {\n try {\n let filters = params.filters\n\n const { domain }: { domain: Domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle, productDetailWhereClause } =\n await getConditions(bizplaces, filters, trxMgr, false)\n\n let productFilter = filters.find(itm => itm.name == 'productName')\n let inventoryBizplaceFilter = filters.find(itm => itm.name == 'bizplaceId')\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group ON COMMIT DROP AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n pd.packing_type AS \"packingType\",\n pd.packing_size AS \"packingSize\",\n pd.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n COALESCE(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)),0) AS \"remainQty\",\n COALESCE(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)),0) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', pd.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\"\n FROM products p\n INNER join product_details pd on pd.product_id = p.id\n LEFT JOIN (\n SELECT i.* FROM inventories i \n INNER JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n AND i.domain_id = $1 AND i.status = 'STORED'\n ${inventoryBizplaceFilter ? `AND i.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n ) i ON i.product_id = pd.product_id\n AND i.packing_type = pd.packing_type \n and i.packing_size = pd.packing_size \n and i.uom = pd.uom \n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories, '${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE p.bizplace_id IN (${bizplaceIds})\n ${productDetailWhereClause}\n ${\n productFilter\n ? `AND (\n lower(p.sku) ilike '${productFilter.value}'\n OR lower(p.name) ilike '${productFilter.value}'\n OR lower(p.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY\n p.id,\n pd.packing_type,\n pd.packing_size,\n pd.uom\n UNION \n SELECT packing_type, packing_size,'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", '-' AS \"productBrand\", id AS \"productId\",\n COALESCE(MIN(FLOOR(pbs.\"availableQty\")),0) AS \"remainQty\", \n COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0) AS \"remainUomValue\", \n CONCAT(COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0),' UNIT') AS \"remainUomValueWithUom\", \n 'BUNDLE' AS \"groupType\"\n FROM product_bundles pb\n LEFT JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1 AND i2.status = 'STORED'\n INNER JOIN locations l2 ON i2.location_id = l2.id \n LEFT JOIN oi ON oi.product_id = i2.product_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${inventoryBizplaceFilter ? `AND i2.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n GROUP BY \n pbs.product_id, \n pbs.product_bundle_id\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n AND pb.bizplace_id IN (${bizplaceIds}) \n ${\n productFilter\n ? `AND (\n lower(pb.sku) ilike '${productFilter.value}'\n OR lower(pb.name) ilike '${productFilter.value}'\n OR lower(pb.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY \n pb.packing_type, \n pb.packing_size, \n pb.name, \n pb.sku, \n pb.id\n )\n AS inv_prod_grp \n ${whereClause}\n order by \"productSKU\", \"productName\"\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group`)\n }\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceInventoryProductGroup(bizplaces: Bizplace[], params: ListParam, context: any, trxMgr: EntityManager) {\n try {\n let filters = params.filters\n const { domain }: { domain: Domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle } = await getConditions(\n bizplaces,\n filters,\n trxMgr\n )\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n round(cast(SUM(oi.release_qty) as numeric), 3) AS release_qty,\n round(cast(SUM(oi.release_uom_value) as numeric), 3) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.batch_id AS \"batchId\",\n i.batch_id_ref AS \"batchIdRef\",\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n ROUND(cast(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)) as numeric), 3) AS \"remainQty\",\n ROUND(cast(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)) as numeric), 3) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\"\n FROM\n inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories,'${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${productWhereClause}\n GROUP BY\n i.batch_id,\n i.batch_id_ref,\n p.id,\n i.packing_type,\n i.packing_size,\n i.uom\n UNION \n SELECT 'BUNDLE' AS \"batchId\", null as \"batchIdRef\", packing_type, packing_size,'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", 'brand' AS \"productBrand\", id AS \"productId\",\n MIN(FLOOR(pbs.\"availableQty\")) AS \"remainQty\", \n MIN(FLOOR(pbs.\"availableUomValue\")) AS \"remainUomValue\", \n CONCAT(MIN(FLOOR(pbs.\"availableUomValue\")),' UNIT') AS \"remainUomValueWithUom\", \n 'BUNDLE' AS \"groupType\"\n FROM product_bundles pb\n INNER JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1\n AND i2.bizplace_id IN (${bizplaceIds})\n AND i2.status = 'STORED'\n LEFT JOIN oi ON oi.product_id = i2.product_id\n GROUP BY pbs.product_id, pbs.product_bundle_id\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n GROUP BY pb.packing_type, pb.packing_size, pb.name, pb.sku, pb.id\n )\n AS inv_prod_grp\n ${whereClause}\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group`)\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n async inventoryProductGroupOpenAPI(bizplaces: Bizplace[], params: ListParam, context: any, trxMgr: EntityManager) {\n try {\n let filters = params.filters\n const { domain }: { domain: Domain } = context.state\n\n const { apiWhereClause } = await getConditions(bizplaces, filters, trxMgr)\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group_open_api AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) AS \"remainQty\",\n SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) AS \"remainUomValue\",\n SUM(COALESCE(i.qty, 0)) AS \"totalQty\",\n SUM(COALESCE(i.uom_value, 0)) AS \"totalUomValue\",\n SUM(COALESCE(i.locked_qty, 0)) + MAX(COALESCE(oi.release_qty, 0)) AS \"totalLockedQty\",\n SUM(COALESCE(i.locked_uom_value, 0)) + MAX(COALESCE(oi.release_uom_value, 0)) AS \"totalLockedUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\"\n FROM inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${apiWhereClause}\n GROUP BY\n p.id,\n i.packing_type,\n i.packing_size,\n i.uom\n )\n AS inv_prod_grp\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group_open_api`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api`)\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group_open_api`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Validate warehouse partners product quantity\n * @param {Object} warehouseDomain -\n * @param {Object} partnerBizplace - {id}\n * @param {Object} orderInventories - [{id, qty}]\n * @param {Object} context\n * @param {Object} trxMgr\n */\n async validateWarehousePartnersProductsQuantity(\n warehouseDomain: Domain,\n partnerBizplace: Bizplace,\n orderInventories: OrderInventory[],\n context: any,\n trxMgr?: EntityManager\n ): Promise<Inventory> {\n let json_oi = JSON.stringify(\n orderInventories.map(x => {\n return {\n product_id: x.product.id,\n batch_id: x.batchId,\n packing_type: x.packingType,\n release_qty: x.releaseQty,\n uom: x.uom\n }\n })\n )\n\n let resultQb = await trxMgr.query(\n `\n select joi.product_id as \"productId\", joi.batch_id as \"batchId\", joi.packing_type as \"packingType\", joi.uom as \"uom\", joi.release_qty as \"releaseQty\",\n ROUND(cast(sum(i.qty - coalesce(i.locked_qty,0)) - coalesce(\n (\n select sum(oi.release_qty) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableQty\",\n ROUND(cast(sum(i.uom_value - coalesce(i.locked_uom_value ,0)) - coalesce(\n (\n select sum(oi.release_uom_value) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableUomValue\"\n from json_populate_recordset(NULL::order_inventories,'${json_oi}') joi\n left join inventories i on joi.product_id = i.product_id \n and joi.batch_id = i.batch_id\n and joi.packing_type = i.packing_type and i.status ='STORED'\n and joi.uom = i.uom\n and i.domain_id = $1\n and i.bizplace_id = $2\n group by joi.product_id, joi.batch_id, joi.packing_type, joi.release_qty, joi.uom\n `,\n [warehouseDomain.id, partnerBizplace.id]\n )\n\n resultQb.forEach(itm => {\n if (itm.releaseQty > itm.availableQty) {\n throw new ValidationError({\n ...ValidationError.ERROR_CODES.RELEASE_QTY_OVER_LIMIT,\n detail: { data: JSON.stringify(resultQb) }\n })\n }\n })\n },\n\n async checkPalletDuplication(palletId: string, warehouseDomain: Domain, trxMgr: EntityManager): Promise<void> {\n const duplicatedPalletCnt: number = await trxMgr.getRepository(Inventory).count({\n domain: warehouseDomain,\n palletId,\n status: Not(Equal(INVENTORY_STATUS.TERMINATED))\n })\n\n if (duplicatedPalletCnt) throw new Error(palletId + ` exists`)\n\n const duplicatedReusablePalletCnt: number = await trxMgr.getRepository(Pallet).count({\n where: {\n domain: warehouseDomain,\n name: palletId\n }\n })\n\n if (duplicatedReusablePalletCnt) throw new Error(palletId + ` exists`)\n },\n\n /**\n * To pre-assign inventories automatically for orderInventories in Release Goods\n * @param product\n * @param orderInventory\n * @param packingType\n * @param locationSortingRules\n * @param customerBizplace\n * @param domain\n * @param trxMgr\n * @returns orderInventories\n */\n async autoAssignInventoryForRelease(\n product: Product,\n orderInventory: OrderInventory,\n packingType: string,\n locationSortingRules: any = [],\n customerBizplace: Bizplace,\n domain: Domain,\n trxMgr: EntityManager\n ): Promise<OrderInventory[]> {\n let qb: SelectQueryBuilder<Inventory> = trxMgr.getRepository(Inventory).createQueryBuilder('iv')\n qb.leftJoinAndSelect('iv.location', 'loc')\n .andWhere('\"iv\".\"domain_id\" = :domainId')\n .andWhere('\"iv\".\"bizplace_id\" = :bizplaceId')\n .andWhere('\"iv\".\"packing_type\" = :packingType')\n .andWhere('\"iv\".\"product_id\" = :productId')\n .andWhere('\"iv\".\"status\" = :status')\n .andWhere('\"iv\".\"qty\" - COALESCE(\"iv\".\"locked_qty\", 0) > 0')\n .andWhere('\"loc\".\"type\" NOT IN (:...locationTypes)')\n .setParameters({\n domainId: domain.id,\n bizplaceId: customerBizplace.id,\n packingType: packingType,\n productId: product.id,\n status: INVENTORY_STATUS.STORED,\n locationTypes: [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]\n })\n\n if (locationSortingRules?.length) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n idx === 0\n ? qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n : qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n } else {\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n }\n\n let inventories: Inventory[] = await qb.getMany()\n if (!inventories?.length) throw new Error(`no inventories found for ${product.sku}`)\n\n inventories = inventories.map(inventory => {\n return {\n ...inventory,\n remainQty: inventory.qty - (inventory?.lockedQty || 0),\n remainUomValue: inventory.uomValue - (inventory?.lockedUomValue || 0)\n }\n })\n\n return _composeTargetInventories(product, orderInventory, inventories)\n },\n\n /**\n * @summary Do transaction on inventory record\n * @description It will update inventory after set a temp (domain, updater)\n * and then generate inventory history based on current changes\n */\n async transactionInventory(\n inventory: Partial<Inventory>,\n referenceOrder: ReferenceOrderType,\n changedQty: number,\n changedWeight: number,\n transactionType: string,\n user: User,\n trxMgr: EntityManager\n ): Promise<Inventory> {\n if (inventory.id) {\n inventory = await updateInventory(inventory, trxMgr)\n } else {\n inventory = await createInventory(inventory, trxMgr)\n }\n\n await generateInventoryHistory(inventory, referenceOrder, transactionType, changedQty, changedWeight, user, trxMgr)\n\n return inventory\n }\n}\n\ninterface Conditions {\n bizplaceIds: string\n productWhereClause: string\n bundleWhereClause: string\n whereClause: string\n batchBundle: string\n apiWhereClause: string\n productDetailWhereClause: string\n}\n\nasync function getConditions(\n bizplaces: Bizplace[],\n filters: [{ name: string; operator: string; value: any }],\n trxMgr: EntityManager,\n hasRemainingQty: Boolean = true\n): Promise<Conditions> {\n let bizplaceIds = bizplaces.map((bizplace: Bizplace) => `'${bizplace.id}'`).join()\n\n let productWhereClause = `\n AND i.status = 'STORED'\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let apiWhereClause = `\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let bundleWhereClause = `\n WHERE pb.status = 'ACTIVATED'\n `\n\n let whereClause = hasRemainingQty ? ` WHERE \"remainQty\" > 0` : ` WHERE 1 = 1`\n\n let productDetailWhereClause = ``\n\n let batchBundle: string\n if (filters?.length) {\n await Promise.all(\n filters.map(async (filter: { name: string; operator: string; value: any }) => {\n const name = filter.name\n const operator = filter.operator.toLowerCase()\n let value = filter.value\n\n switch (name) {\n case 'productId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'productBundleId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'batchId':\n whereClause += `AND LOWER(\"batchId\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'batchIdRef':\n whereClause += `AND LOWER(\"batchIdRef\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productBrand':\n whereClause += `AND LOWER(\"productBrand\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productName':\n const products: Product[] = await trxMgr.getRepository(Product).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productIds: string = products\n .map((product: Product) => product.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productIds.length) {\n productWhereClause += `AND i.product_id IN (${productIds})`\n } else {\n productWhereClause += `AND i.product_id ISNULL`\n }\n\n // filter product bundle as product info\n const productBundles: ProductBundle[] = await trxMgr.getRepository(ProductBundle).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productBundleIds: string = productBundles\n .map((bundle: ProductBundle) => bundle.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productBundleIds.length) {\n bundleWhereClause += `AND pb.id IN (${productBundleIds})`\n } else {\n bundleWhereClause += `AND pb.id ISNULL`\n }\n break\n\n case 'packingType':\n whereClause += `AND LOWER(\"packingType\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'showBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'bundle'`\n break\n\n case 'hideBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'single'`\n break\n\n case 'batch_product':\n productWhereClause += `\n AND (i.batch_id, p.id, i.packing_type, i.packing_size) ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(\n (v: { batchId: string; productId: string; packingType: string; packingSize: string }) =>\n `('${v.batchId}', '${v.productId}', '${v.packingType}', '${v.packingSize}')`\n )\n .join()})\n `\n break\n\n case 'batch_bundle':\n bundleWhereClause += `\n ${bundleWhereClause == '' ? 'WHERE' : 'AND'} pb.id ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map((v: { productId: string }) => `('${v.productId}')`)\n .join()})\n `\n break\n\n case 'product':\n productDetailWhereClause += `\n AND (pd.product_id, pd.packing_type, pd.packing_size, pd.uom) ${\n operator === 'in' ? 'IN' : 'NOT IN'\n } (${value\n .map(\n (v: { productId: string; packingType: string; packingSize: string; uom: string }) =>\n `('${v.productId}', '${v.packingType}', '${v.packingSize}', '${v.uom}')`\n )\n .join()})\n `\n break\n }\n })\n )\n\n batchBundle = JSON.stringify(\n filters\n .find(filter => filter.name === 'batch_bundle')\n ?.value.map(itm => {\n return {\n product_id: itm.productId,\n release_qty: itm?.releaseQty || 0,\n release_uom_value: itm?.releaseUomValue || 0\n }\n }) || []\n )\n }\n\n return {\n bizplaceIds,\n productWhereClause,\n apiWhereClause,\n bundleWhereClause,\n whereClause,\n batchBundle,\n productDetailWhereClause\n }\n}\n\nasync function createInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Inventory | Inventory[]> {\n return await trxMgr.getRepository(Inventory).save(inventory)\n}\n\n/**\n * @summary Update inventory record\n * @description It will update inventory after set a stamp (domain, updater)\n * The special point of this function is that this changes won't generate inventory history\n * If you want to generate inventory history automatically you would better to use transactionInventory function\n */\nasync function updateInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Inventory | Inventory[]> {\n if (!inventory.id) throw new Error(`Target doesn't have ID`)\n return await trxMgr.getRepository(Inventory).save(inventory)\n}\n\nasync function generateInventoryHistory(\n inventory: Inventory,\n refOrder: any,\n transactionType: string,\n qty: number,\n uomValue: number,\n user: User,\n trxMgr?: EntityManager\n): Promise<InventoryHistory> {\n const invHistoryRepo: Repository<InventoryHistory> =\n trxMgr?.getRepository(InventoryHistory) || getRepository(InventoryHistory)\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n\n if (!inventory?.id) throw new Error(`Can't find out ID of inventory.`)\n if (!refOrder?.id || !refOrder.name) throw new Error(`Can't find out ID or Name of Reference Order`)\n if (\n !inventory?.domain ||\n !inventory?.bizplace ||\n !inventory?.product?.id ||\n !inventory?.warehouse?.id ||\n !inventory?.location?.id\n ) {\n inventory = await invRepo.findOne({\n where: { id: inventory.id },\n relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']\n })\n }\n\n const domain: Domain = inventory.domain\n const location: Location = inventory.location\n\n const seq: number = await invHistoryRepo.count({ domain: inventory.domain, palletId: inventory.palletId })\n let openingQty: number = 0\n let openingUomValue: number = 0\n\n if (seq) {\n const lastInvHistory: InventoryHistory = await invHistoryRepo.findOne({\n domain: inventory.domain,\n palletId: inventory.palletId,\n seq: seq - 1\n })\n openingQty = lastInvHistory.openingQty + lastInvHistory.qty\n openingUomValue = lastInvHistory.openingUomValue + lastInvHistory.uomValue\n }\n\n let inventoryHistory: InventoryHistory = new InventoryHistory()\n inventoryHistory.name = InventoryNoGenerator.inventoryHistoryName()\n inventoryHistory.description = inventory.description\n inventoryHistory.seq = seq\n inventoryHistory.palletId = inventory.palletId\n inventoryHistory.cartonId = inventory.cartonId\n inventoryHistory.batchId = inventory.batchId\n inventoryHistory.batchIdRef = inventory.batchIdRef\n inventoryHistory.status = inventory.status\n inventoryHistory.transactionType = transactionType\n inventoryHistory.refOrderId = refOrder?.id || null\n inventoryHistory.orderNo = refOrder?.name || null\n inventoryHistory.orderRefNo = refOrder?.refNo || null\n inventoryHistory.inventory = inventory\n inventoryHistory.product = inventory.product\n inventoryHistory.reusablePallet = inventory.reusablePallet\n inventoryHistory.zone = inventory.zone\n inventoryHistory.warehouse = inventory.warehouse\n inventoryHistory.location = inventory.location\n inventoryHistory.expirationDate = inventory.expirationDate\n inventoryHistory.packingType = inventory.packingType\n inventoryHistory.packingSize = inventory.packingSize\n inventoryHistory.uom = inventory.uom\n inventoryHistory.qty = qty\n inventoryHistory.openingQty = openingQty\n inventoryHistory.uomValue = uomValue\n inventoryHistory.openingUomValue = openingUomValue\n inventoryHistory.unitCost = inventory.unitCost\n inventoryHistory.domain = inventory.domain\n inventoryHistory.bizplace = inventory.bizplace\n inventoryHistory.creator = user\n inventoryHistory.updater = user\n\n inventoryHistory = await invHistoryRepo.save(inventoryHistory)\n\n if (inventory.lastSeq !== seq) {\n await invRepo.save({\n ...inventory,\n lastSeq: inventoryHistory.seq,\n updater: user\n })\n }\n\n await switchLocationStatus(domain, location, user, trxMgr)\n return inventoryHistory\n}\n\n/**\n * @description: Check location emptiness and update status of location\n * @param domain\n * @param location\n * @param updater\n * @param trxMgr\n */\nexport async function switchLocationStatus(\n domain: Domain,\n location: Location,\n updater: User,\n trxMgr?: EntityManager\n): Promise<Location> {\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n const locationRepo: Repository<Location> = trxMgr?.getRepository(Location) || getRepository(Location)\n const allocatedItemsCnt: number = await invRepo.count({\n domain,\n status: INVENTORY_STATUS.STORED,\n location\n })\n\n if (!allocatedItemsCnt && location.status !== LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.EMPTY,\n updater\n })\n } else if (allocatedItemsCnt && location.status === LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.OCCUPIED,\n updater\n })\n }\n\n return location\n}\n\nexport function _composeTargetInventories(product: Product, record: any, inventories: Inventory[]): OrderInventory[] {\n let leftReleaseQty: number = record.releaseQty\n let leftReleaseUomValue: number = record.releaseUomValue\n let compReleaseQty: number = 0\n let compReleaseUomValue: number = 0\n let totalInventoryQty: number = inventories.reduce((total, inventory) => total + inventory.remainQty, 0)\n\n if (totalInventoryQty < record.releaseQty) {\n throw new Error(`invalid release qty for ${product?.sku}`)\n }\n\n let orderInventories: Partial<OrderInventory[]> = []\n let idx = 0\n while (compReleaseQty < record.releaseQty) {\n const inventory = inventories[idx]\n const {\n packingType,\n packingSize,\n batchId,\n uom\n }: { packingType: string; packingSize: number; batchId: string; uom: string } = inventory\n\n let orderInventory: OrderInventory = new OrderInventory()\n\n if (inventory.remainQty > leftReleaseQty) {\n const uomValuePerQty: number = Math.round((inventory.remainUomValue / inventory.remainQty) * 100) / 100\n\n compReleaseQty += leftReleaseQty\n compReleaseUomValue += leftReleaseUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: leftReleaseQty,\n releaseUomValue: Math.round(leftReleaseQty * uomValuePerQty * 100) / 100\n }\n } else {\n compReleaseQty += inventory.remainQty\n compReleaseUomValue += inventory.remainUomValue\n leftReleaseQty -= inventory.remainQty\n leftReleaseUomValue -= inventory.remainUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: inventory.remainQty,\n releaseUomValue: inventory.remainUomValue\n }\n }\n\n orderInventories.push({\n ...orderInventory,\n inventory,\n packingType,\n packingSize,\n batchId,\n uom,\n product,\n type: ORDER_TYPES.RELEASE_OF_GOODS\n })\n\n idx++\n }\n\n return orderInventories\n}\n"]}
1
+ {"version":3,"file":"inventory-util.js","sourceRoot":"","sources":["../../server/utils/inventory-util.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, Equal, In, Not, Raw, Repository, SelectQueryBuilder } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Bizplace } from '@things-factory/biz-base'\nimport { Product, ProductBundle } from '@things-factory/product-base'\nimport { Domain, Filter, getRepository, ListParam } from '@things-factory/shell'\nimport {\n Inventory,\n INVENTORY_STATUS,\n InventoryHistory,\n InventoryNoGenerator,\n Location,\n LOCATION_STATUS,\n LOCATION_TYPE,\n Pallet\n} from '@things-factory/warehouse-base'\n\nimport { ORDER_TYPES } from '../constants'\nimport { ValidationError } from '../errors'\nimport {\n ArrivalNotice,\n DeliveryOrder,\n InventoryCheck,\n OrderInventory,\n ReleaseGood,\n ReturnOrder,\n ReverseKittingOrder,\n VasOrder\n} from '../service'\n\nexport type ReferenceOrderType =\n | ArrivalNotice\n | ReleaseGood\n | VasOrder\n | InventoryCheck\n | DeliveryOrder\n | ReturnOrder\n | ReverseKittingOrder\n\nexport const InventoryUtil = {\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceProductInventory(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n\n const { domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle, productDetailWhereClause } =\n await getConditions(bizplaces, filters, trxMgr, false)\n\n let productFilter = filters.find(itm => itm.name == 'productName')\n let inventoryBizplaceFilter = filters.find(itm => itm.name == 'bizplaceId')\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group ON COMMIT DROP AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n pd.packing_type AS \"packingType\",\n pd.packing_size AS \"packingSize\",\n pd.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n COALESCE(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)),0) AS \"remainQty\",\n COALESCE(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)),0) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', pd.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\"\n FROM products p\n INNER join product_details pd on pd.product_id = p.id\n LEFT JOIN (\n SELECT i.* FROM inventories i \n INNER JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n AND i.domain_id = $1 AND i.status = 'STORED'\n ${inventoryBizplaceFilter ? `AND i.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n ) i ON i.product_id = pd.product_id\n AND i.packing_type = pd.packing_type \n and i.packing_size = pd.packing_size \n and i.uom = pd.uom \n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories, '${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE p.bizplace_id IN (${bizplaceIds})\n ${productDetailWhereClause}\n ${\n productFilter\n ? `AND (\n lower(p.sku) ilike '${productFilter.value}'\n OR lower(p.name) ilike '${productFilter.value}'\n OR lower(p.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY\n p.id,\n pd.packing_type,\n pd.packing_size,\n pd.uom\n UNION \n SELECT packing_type, packing_size,'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", '-' AS \"productBrand\", id AS \"productId\",\n COALESCE(MIN(FLOOR(pbs.\"availableQty\")),0) AS \"remainQty\", \n COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0) AS \"remainUomValue\", \n CONCAT(COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0),' UNIT') AS \"remainUomValueWithUom\", \n 'BUNDLE' AS \"groupType\"\n FROM product_bundles pb\n LEFT JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1 AND i2.status = 'STORED'\n INNER JOIN locations l2 ON i2.location_id = l2.id \n LEFT JOIN oi ON oi.product_id = i2.product_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${inventoryBizplaceFilter ? `AND i2.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n GROUP BY \n pbs.product_id, \n pbs.product_bundle_id\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n AND pb.bizplace_id IN (${bizplaceIds}) \n ${\n productFilter\n ? `AND (\n lower(pb.sku) ilike '${productFilter.value}'\n OR lower(pb.name) ilike '${productFilter.value}'\n OR lower(pb.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY \n pb.packing_type, \n pb.packing_size, \n pb.name, \n pb.sku, \n pb.id\n )\n AS inv_prod_grp \n ${whereClause}\n order by \"productSKU\", \"productName\"\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group`)\n }\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceInventoryProductGroup(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n const { domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle } = await getConditions(\n bizplaces,\n filters,\n trxMgr\n )\n\n const _groupType = filters.find(res => res.name == 'groupType')\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n round(cast(SUM(oi.release_qty) as numeric), 3) AS release_qty,\n round(cast(SUM(oi.release_uom_value) as numeric), 3) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.batch_id AS \"batchId\",\n i.batch_id_ref AS \"batchIdRef\",\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n ROUND(cast(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)) as numeric), 3) AS \"remainQty\",\n ROUND(cast(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)) as numeric), 3) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\"\n FROM\n inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories,'${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${productWhereClause}\n GROUP BY\n i.batch_id,\n i.batch_id_ref,\n p.id,\n i.packing_type,\n i.packing_size,\n i.uom\n UNION \n SELECT 'BUNDLE' AS \"batchId\", null as \"batchIdRef\", packing_type, packing_size,'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", 'brand' AS \"productBrand\", id AS \"productId\",\n MIN(FLOOR(pbs.\"availableQty\")) AS \"remainQty\", \n MIN(FLOOR(pbs.\"availableUomValue\")) AS \"remainUomValue\", \n CONCAT(MIN(FLOOR(pbs.\"availableUomValue\")),' UNIT') AS \"remainUomValueWithUom\", \n 'BUNDLE' AS \"groupType\"\n FROM product_bundles pb\n INNER JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1\n AND i2.bizplace_id IN (${bizplaceIds})\n AND i2.status = 'STORED'\n LEFT JOIN oi ON oi.product_id = i2.product_id\n GROUP BY pbs.product_id, pbs.product_bundle_id\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n GROUP BY pb.packing_type, pb.packing_size, pb.name, pb.sku, pb.id\n )\n AS inv_prod_grp\n ${whereClause}\n )\n `\n\n let filterGroupTypeQuery\n\n if (_groupType) {\n if (_groupType.value === 'SINGLE') {\n filterGroupTypeQuery = `where \"groupType\"= 'SINGLE' `\n } else {\n filterGroupTypeQuery = `where \"groupType\"= 'BUNDLE' `\n }\n }\n\n let sortingArr = params.sortings || []\n\n let sortedBy = []\n\n if (sortingArr.length > 0) {\n sortingArr.forEach(element => {\n if (element.desc) {\n sortedBy.push(`\"${element.name}\" DESC `)\n } else {\n sortedBy.push(`\"${element.name}\" `)\n }\n })\n }\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(\n `select count(*) as total from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''}`\n )\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(\n `select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${\n sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''\n } OFFSET $1 LIMIT $2`,\n [(params.pagination.page - 1) * params.pagination.limit, params.pagination.limit]\n )\n } else {\n items = await trxMgr.query(\n `select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${\n sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''\n }`\n )\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n async inventoryProductGroupOpenAPI(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n const { domain } = context.state\n\n const { apiWhereClause } = await getConditions(bizplaces, filters, trxMgr)\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group_open_api AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) AS \"remainQty\",\n SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) AS \"remainUomValue\",\n SUM(COALESCE(i.qty, 0)) AS \"totalQty\",\n SUM(COALESCE(i.uom_value, 0)) AS \"totalUomValue\",\n SUM(COALESCE(i.locked_qty, 0)) + MAX(COALESCE(oi.release_qty, 0)) AS \"totalLockedQty\",\n SUM(COALESCE(i.locked_uom_value, 0)) + MAX(COALESCE(oi.release_uom_value, 0)) AS \"totalLockedUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\"\n FROM inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${apiWhereClause}\n GROUP BY\n p.id,\n i.packing_type,\n i.packing_size,\n i.uom\n )\n AS inv_prod_grp\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group_open_api`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api`)\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group_open_api`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Validate warehouse partners product quantity\n * @param {Object} warehouseDomain -\n * @param {Object} partnerBizplace - {id}\n * @param {Object} orderInventories - [{id, qty}]\n * @param {Object} context\n * @param {Object} trxMgr\n */\n async validateWarehousePartnersProductsQuantity(\n warehouseDomain: Domain,\n partnerBizplace: Bizplace,\n orderInventories: OrderInventory[],\n context: any,\n trxMgr?: EntityManager\n ): Promise<Inventory> {\n let json_oi = JSON.stringify(\n orderInventories.map(x => {\n return {\n product_id: x.product.id,\n batch_id: x.batchId,\n packing_type: x.packingType,\n release_qty: x.releaseQty,\n uom: x.uom\n }\n })\n )\n\n let resultQb = await trxMgr.query(\n `\n select joi.product_id as \"productId\", joi.batch_id as \"batchId\", joi.packing_type as \"packingType\", joi.uom as \"uom\", joi.release_qty as \"releaseQty\",\n ROUND(cast(sum(i.qty - coalesce(i.locked_qty,0)) - coalesce(\n (\n select sum(oi.release_qty) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableQty\",\n ROUND(cast(sum(i.uom_value - coalesce(i.locked_uom_value ,0)) - coalesce(\n (\n select sum(oi.release_uom_value) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableUomValue\"\n from json_populate_recordset(NULL::order_inventories,'${json_oi}') joi\n left join inventories i on joi.product_id = i.product_id \n and joi.batch_id = i.batch_id\n and joi.packing_type = i.packing_type and i.status ='STORED'\n and joi.uom = i.uom\n and i.domain_id = $1\n and i.bizplace_id = $2\n group by joi.product_id, joi.batch_id, joi.packing_type, joi.release_qty, joi.uom\n `,\n [warehouseDomain.id, partnerBizplace.id]\n )\n\n resultQb.forEach(itm => {\n if (itm.releaseQty > itm.availableQty) {\n throw new ValidationError({\n ...ValidationError.ERROR_CODES.RELEASE_QTY_OVER_LIMIT,\n detail: { data: JSON.stringify(resultQb) }\n })\n }\n })\n },\n\n async checkPalletDuplication(palletId: string, warehouseDomain: Domain, trxMgr: EntityManager): Promise<void> {\n const duplicatedPalletCnt: number = await trxMgr.getRepository(Inventory).countBy({\n domain: { id: warehouseDomain.id },\n palletId,\n status: Not(Equal(INVENTORY_STATUS.TERMINATED))\n })\n\n if (duplicatedPalletCnt) throw new Error(palletId + ` exists`)\n\n const duplicatedReusablePalletCnt: number = await trxMgr.getRepository(Pallet).count({\n where: {\n domain: { id: warehouseDomain.id },\n name: palletId\n }\n })\n\n if (duplicatedReusablePalletCnt) throw new Error(palletId + ` exists`)\n },\n\n /**\n * To pre-assign inventories automatically for orderInventories in Release Goods\n * @param product\n * @param orderInventory\n * @param packingType\n * @param locationSortingRules\n * @param customerBizplace\n * @param domain\n * @param trxMgr\n * @returns orderInventories\n */\n async autoAssignInventoryForRelease(\n product: Product,\n orderInventory: OrderInventory,\n packingType: string,\n locationSortingRules: any = [],\n customerBizplace: Bizplace,\n domain: Domain,\n trxMgr: EntityManager,\n batchId?: string\n ): Promise<OrderInventory[]> {\n let qb: SelectQueryBuilder<Inventory> = trxMgr.getRepository(Inventory).createQueryBuilder('iv')\n qb.leftJoinAndSelect('iv.location', 'loc')\n .andWhere('\"iv\".\"domain_id\" = :domainId')\n .andWhere('\"iv\".\"bizplace_id\" = :bizplaceId')\n .andWhere('\"iv\".\"packing_type\" = :packingType')\n .andWhere('\"iv\".\"product_id\" = :productId')\n .andWhere('\"iv\".\"status\" = :status')\n .andWhere('\"iv\".\"qty\" - COALESCE(\"iv\".\"locked_qty\", 0) > 0')\n .andWhere('\"loc\".\"type\" NOT IN (:...locationTypes)')\n .setParameters({\n domainId: domain.id,\n bizplaceId: customerBizplace.id,\n packingType: packingType,\n productId: product.id,\n status: INVENTORY_STATUS.STORED,\n locationTypes: [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]\n })\n\n if (batchId) {\n qb.andWhere('\"iv\".\"batch_id\" = :batchId', { batchId: batchId })\n }\n\n let locationSorting = function (qb: SelectQueryBuilder<Inventory>, locationSortingRules) {\n if (locationSortingRules?.length) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n idx === 0\n ? qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n : qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n } else {\n qb.addOrderBy('\"loc\".\"name\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n }\n return qb\n }\n\n switch (product?.pickingStrategy) {\n case 'FIFO':\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'LIFO':\n qb.addOrderBy('\"iv\".\"created_at\"', 'DESC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'FEFO':\n qb.addOrderBy('\"iv\".\"expiration_date\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'FMFO':\n qb.addOrderBy('\"iv\".\"manufacture_date\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'LOCATION':\n qb = locationSorting(qb, locationSortingRules)\n break\n default:\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n }\n\n let inventories: Inventory[] = await qb.getMany()\n if (!inventories?.length) throw new Error(`no inventories found for ${product.sku}`)\n\n inventories = inventories.map(inventory => {\n return {\n ...inventory,\n remainQty: inventory.qty - (inventory?.lockedQty || 0),\n remainUomValue: inventory.uomValue - (inventory?.lockedUomValue || 0)\n }\n })\n\n return _composeTargetInventories(product, orderInventory, inventories)\n },\n\n /**\n * @summary Do transaction on inventory record\n * @description It will update inventory after set a temp (domain, updater)\n * and then generate inventory history based on current changes\n */\n async transactionInventory(\n inventory: Partial<Inventory>,\n referenceOrder: ReferenceOrderType,\n changedQty: number,\n changedWeight: number,\n transactionType: string,\n user: User,\n trxMgr: EntityManager\n ): Promise<Inventory> {\n if (inventory.id) {\n inventory = await updateInventory(inventory, trxMgr)\n } else {\n inventory = await createInventory(inventory, trxMgr)\n }\n\n await generateInventoryHistory(inventory, referenceOrder, transactionType, changedQty, changedWeight, user, trxMgr)\n\n return inventory\n }\n}\n\ninterface Conditions {\n bizplaceIds: string\n productWhereClause: string\n bundleWhereClause: string\n whereClause: string\n batchBundle: string\n apiWhereClause: string\n productDetailWhereClause: string\n}\n\nasync function getConditions(\n bizplaces: Bizplace[],\n filters: Filter[],\n trxMgr: EntityManager,\n hasRemainingQty: Boolean = true\n): Promise<Conditions> {\n let bizplaceIds = bizplaces.map((bizplace: Bizplace) => `'${bizplace.id}'`).join()\n\n let productWhereClause = `\n AND i.status = 'STORED'\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let apiWhereClause = `\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let bundleWhereClause = `\n WHERE pb.status = 'ACTIVATED'\n `\n\n let whereClause = hasRemainingQty ? ` WHERE \"remainQty\" > 0` : ` WHERE 1 = 1`\n\n let productDetailWhereClause = ``\n\n let batchBundle: string\n if (filters?.length) {\n await Promise.all(\n filters.map(async (filter: { name: string; operator: string; value: any }) => {\n const name = filter.name\n const operator = filter.operator.toLowerCase()\n let value = filter.value\n\n switch (name) {\n case 'productId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'productBundleId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'batchId':\n whereClause += `AND LOWER(\"batchId\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'batchIdRef':\n whereClause += `AND LOWER(\"batchIdRef\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productBrand':\n whereClause += `AND LOWER(\"productBrand\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productSKU':\n whereClause += `AND LOWER(\"productSKU\") LIKE '${value.toLowerCase()}'`\n\n case 'productName':\n const products: Product[] = await trxMgr.getRepository(Product).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productIds: string = products\n .map((product: Product) => product.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productIds.length) {\n productWhereClause += `AND i.product_id IN (${productIds})`\n } else {\n productWhereClause += `AND i.product_id ISNULL`\n }\n\n // filter product bundle as product info\n const productBundles: ProductBundle[] = await trxMgr.getRepository(ProductBundle).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productBundleIds: string = productBundles\n .map((bundle: ProductBundle) => bundle.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productBundleIds.length) {\n bundleWhereClause += `AND pb.id IN (${productBundleIds})`\n } else {\n bundleWhereClause += `AND pb.id ISNULL`\n }\n break\n\n case 'packingType':\n whereClause += `AND LOWER(\"packingType\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'showBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'bundle'`\n break\n\n case 'hideBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'single'`\n break\n\n case 'batch_product':\n productWhereClause += `\n AND (i.batch_id, p.id, i.packing_type, i.packing_size) ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(\n (v: { batchId: string; productId: string; packingType: string; packingSize: string }) =>\n `('${v.batchId}', '${v.productId}', '${v.packingType}', '${v.packingSize}')`\n )\n .join()})\n `\n break\n\n case 'batch_bundle':\n bundleWhereClause += `\n ${bundleWhereClause == '' ? 'WHERE' : 'AND'} pb.id ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map((v: { productId: string }) => `('${v.productId}')`)\n .join()})\n `\n break\n\n case 'product':\n productDetailWhereClause += `\n AND (pd.product_id, pd.packing_type, pd.packing_size, pd.uom) ${\n operator === 'in' ? 'IN' : 'NOT IN'\n } (${value\n .map(\n (v: { productId: string; packingType: string; packingSize: string; uom: string }) =>\n `('${v.productId}', '${v.packingType}', '${v.packingSize}', '${v.uom}')`\n )\n .join()})\n `\n break\n }\n })\n )\n\n batchBundle = JSON.stringify(\n filters\n .find(filter => filter.name === 'batch_bundle')\n ?.value.map(itm => {\n return {\n product_id: itm.productId,\n release_qty: itm?.releaseQty || 0,\n release_uom_value: itm?.releaseUomValue || 0\n }\n }) || []\n )\n }\n\n return {\n bizplaceIds,\n productWhereClause,\n apiWhereClause,\n bundleWhereClause,\n whereClause,\n batchBundle,\n productDetailWhereClause\n }\n}\n\nasync function createInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Inventory | Inventory[]> {\n return await trxMgr.getRepository(Inventory).save(inventory)\n}\n\n/**\n * @summary Update inventory record\n * @description It will update inventory after set a stamp (domain, updater)\n * The special point of this function is that this changes won't generate inventory history\n * If you want to generate inventory history automatically you would better to use transactionInventory function\n */\nasync function updateInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Inventory | Inventory[]> {\n if (!inventory.id) throw new Error(`Target doesn't have ID`)\n return await trxMgr.getRepository(Inventory).save(inventory)\n}\n\nasync function generateInventoryHistory(\n inventory: Inventory,\n refOrder: any,\n transactionType: string,\n qty: number,\n uomValue: number,\n user: User,\n trxMgr?: EntityManager\n): Promise<InventoryHistory> {\n const invHistoryRepo: Repository<InventoryHistory> =\n trxMgr?.getRepository(InventoryHistory) || getRepository(InventoryHistory)\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n\n if (!inventory?.id) throw new Error(`Can't find out ID of inventory.`)\n if (!refOrder?.id || !refOrder.name) throw new Error(`Can't find out ID or Name of Reference Order`)\n if (\n !inventory?.domain ||\n !inventory?.bizplace ||\n !inventory?.product?.id ||\n !inventory?.warehouse?.id ||\n !inventory?.location?.id\n ) {\n inventory = await invRepo.findOne({\n where: { id: inventory.id },\n relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']\n })\n }\n\n const domain: Domain = inventory.domain\n const location: Location = inventory.location\n\n const seq: number = await invHistoryRepo.countBy({\n domain: { id: inventory.domain.id },\n palletId: inventory.palletId\n })\n let openingQty: number = 0\n let openingUomValue: number = 0\n\n if (seq) {\n const lastInvHistory: InventoryHistory = await invHistoryRepo.findOneBy({\n domain: { id: inventory.domain.id },\n palletId: inventory.palletId,\n seq: seq - 1\n })\n openingQty = lastInvHistory.openingQty + lastInvHistory.qty\n openingUomValue = lastInvHistory.openingUomValue + lastInvHistory.uomValue\n }\n\n let inventoryHistory: InventoryHistory = new InventoryHistory()\n inventoryHistory.name = InventoryNoGenerator.inventoryHistoryName()\n inventoryHistory.description = inventory.description\n inventoryHistory.seq = seq\n inventoryHistory.palletId = inventory.palletId\n inventoryHistory.cartonId = inventory.cartonId\n inventoryHistory.batchId = inventory.batchId\n inventoryHistory.batchIdRef = inventory.batchIdRef\n inventoryHistory.status = inventory.status\n inventoryHistory.transactionType = transactionType\n inventoryHistory.refOrderId = refOrder?.id || null\n inventoryHistory.orderNo = refOrder?.name || null\n inventoryHistory.orderRefNo = refOrder?.refNo || null\n inventoryHistory.inventory = inventory\n inventoryHistory.product = inventory.product\n inventoryHistory.reusablePallet = inventory.reusablePallet\n inventoryHistory.zone = inventory.zone\n inventoryHistory.warehouse = inventory.warehouse\n inventoryHistory.location = inventory.location\n inventoryHistory.expirationDate = inventory.expirationDate\n inventoryHistory.packingType = inventory.packingType\n inventoryHistory.packingSize = inventory.packingSize\n inventoryHistory.uom = inventory.uom\n inventoryHistory.qty = qty\n inventoryHistory.openingQty = openingQty\n inventoryHistory.uomValue = uomValue\n inventoryHistory.openingUomValue = openingUomValue\n inventoryHistory.unitCost = inventory.unitCost\n inventoryHistory.domain = inventory.domain\n inventoryHistory.bizplace = inventory.bizplace\n inventoryHistory.creator = user\n inventoryHistory.updater = user\n\n inventoryHistory = await invHistoryRepo.save(inventoryHistory)\n\n if (inventory.lastSeq !== seq) {\n await invRepo.save({\n ...inventory,\n lastSeq: inventoryHistory.seq,\n updater: user\n })\n }\n\n await switchLocationStatus(domain, location, user, trxMgr)\n return inventoryHistory\n}\n\n/**\n * @description: Check location emptiness and update status of location\n * @param domain\n * @param location\n * @param updater\n * @param trxMgr\n */\nexport async function switchLocationStatus(\n domain: Domain,\n location: Location,\n updater: User,\n trxMgr?: EntityManager\n): Promise<Location> {\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n const locationRepo: Repository<Location> = trxMgr?.getRepository(Location) || getRepository(Location)\n const allocatedItemsCnt: number = await invRepo.countBy({\n domain: { id: domain.id },\n status: INVENTORY_STATUS.STORED,\n location: { id: location.id }\n })\n\n if (!allocatedItemsCnt && location.status !== LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.EMPTY,\n updater\n })\n } else if (allocatedItemsCnt && location.status === LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.OCCUPIED,\n updater\n })\n }\n\n return location\n}\n\nexport function _composeTargetInventories(product: Product, record: any, inventories: Inventory[]): OrderInventory[] {\n let leftReleaseQty: number = record.releaseQty\n let leftReleaseUomValue: number = record.releaseUomValue\n let compReleaseQty: number = 0\n let compReleaseUomValue: number = 0\n let totalInventoryQty: number = inventories.reduce((total, inventory) => total + inventory.remainQty, 0)\n\n if (totalInventoryQty < record.releaseQty) {\n throw new Error(`invalid release qty for ${product?.sku}`)\n }\n\n let orderInventories: Partial<OrderInventory[]> = []\n let idx = 0\n while (compReleaseQty < record.releaseQty) {\n const inventory = inventories[idx]\n const {\n packingType,\n packingSize,\n batchId,\n batchIdRef,\n uom\n }: { packingType: string; packingSize: number; batchId: string; batchIdRef: string; uom: string } = inventory\n\n let orderInventory: OrderInventory = new OrderInventory()\n\n if (inventory.remainQty > leftReleaseQty) {\n const uomValuePerQty: number = Math.round((inventory.remainUomValue / inventory.remainQty) * 100) / 100\n\n compReleaseQty += leftReleaseQty\n compReleaseUomValue += leftReleaseUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: leftReleaseQty,\n releaseUomValue: Math.round(leftReleaseQty * uomValuePerQty * 100) / 100\n }\n } else {\n compReleaseQty += inventory.remainQty\n compReleaseUomValue += inventory.remainUomValue\n leftReleaseQty -= inventory.remainQty\n leftReleaseUomValue -= inventory.remainUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: inventory.remainQty,\n releaseUomValue: inventory.remainUomValue\n }\n }\n\n orderInventories.push({\n ...orderInventory,\n inventory,\n packingType,\n packingSize,\n batchId,\n batchIdRef,\n uom,\n product,\n type: ORDER_TYPES.RELEASE_OF_GOODS\n })\n\n idx++\n }\n\n return orderInventories\n}\n"]}