@things-factory/kpi 9.0.31 → 9.0.32

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 (324) hide show
  1. package/README.md +1 -2
  2. package/client/charts/kpi-boxplot-chart.ts +182 -42
  3. package/client/charts/kpi-radar-chart.ts +9 -9
  4. package/client/pages/kpi/kpi-list-page.ts +196 -32
  5. package/client/pages/kpi/kpi-overview.ts +9 -11
  6. package/client/pages/kpi/kpi-tree-page.ts +409 -0
  7. package/client/pages/kpi/kpi-view.ts +187 -0
  8. package/client/pages/kpi-dashboard/cards/kpi-level1-card.ts +1 -1
  9. package/client/pages/kpi-dashboard/cards/kpi-level2-comparison.ts +1 -1
  10. package/client/pages/kpi-dashboard/cards/kpi-level3-comparison.ts +1 -1
  11. package/client/pages/kpi-dashboard/components/kpi-left-panel.ts +198 -160
  12. package/client/pages/kpi-dashboard/components/kpi-map-panel.ts +133 -0
  13. package/client/pages/kpi-dashboard/components/kpi-region-popup.ts +3 -2
  14. package/client/pages/kpi-dashboard/kpi-dashboard-map.ts +4 -3
  15. package/client/pages/kpi-dashboard/kpi-dashboard.ts +28 -30
  16. package/client/pages/kpi-history/kpi-history-list-page.ts +11 -11
  17. package/client/pages/kpi-metric/kpi-metric-list-page.ts +10 -2
  18. package/client/pages/kpi-metric-value/kpi-metric-value-editor-page.ts +7 -7
  19. package/client/pages/kpi-metric-value/kpi-metric-value-importer.ts +2 -2
  20. package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +16 -8
  21. package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.ts +5 -5
  22. package/client/pages/kpi-statistic/kpi-statistic-editor-page.ts +1 -2
  23. package/client/pages/kpi-statistic/kpi-statistic-list-page.ts +10 -2
  24. package/client/pages/kpi-value/kpi-value-editor-page.ts +11 -7
  25. package/client/pages/kpi-value/kpi-value-list-page.ts +31 -7
  26. package/client/route.ts +2 -9
  27. package/design-entities.md +8 -12
  28. package/dist-client/charts/kpi-boxplot-chart.d.ts +2 -0
  29. package/dist-client/charts/kpi-boxplot-chart.js +168 -42
  30. package/dist-client/charts/kpi-boxplot-chart.js.map +1 -1
  31. package/dist-client/charts/kpi-radar-chart.js +9 -9
  32. package/dist-client/charts/kpi-radar-chart.js.map +1 -1
  33. package/dist-client/pages/kpi/kpi-list-page.d.ts +19 -3
  34. package/dist-client/pages/kpi/kpi-list-page.js +188 -32
  35. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
  36. package/dist-client/pages/kpi/kpi-overview.js +9 -11
  37. package/dist-client/pages/kpi/kpi-overview.js.map +1 -1
  38. package/dist-client/pages/kpi/kpi-tree-page.d.ts +59 -0
  39. package/dist-client/pages/kpi/kpi-tree-page.js +403 -0
  40. package/dist-client/pages/kpi/kpi-tree-page.js.map +1 -0
  41. package/dist-client/pages/kpi/kpi-view.d.ts +12 -0
  42. package/dist-client/pages/kpi/kpi-view.js +191 -0
  43. package/dist-client/pages/kpi/kpi-view.js.map +1 -0
  44. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +1 -1
  45. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -1
  46. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +1 -1
  47. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -1
  48. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +1 -1
  49. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -1
  50. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +3 -1
  51. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +197 -161
  52. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -1
  53. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +5 -0
  54. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +146 -0
  55. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -1
  56. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +3 -2
  57. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -1
  58. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +4 -3
  59. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -1
  60. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +28 -30
  61. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -1
  62. package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +6 -1
  63. package/dist-client/pages/kpi-history/kpi-history-list-page.js +11 -11
  64. package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -1
  65. package/dist-client/pages/kpi-metric/kpi-metric-list-page.d.ts +5 -0
  66. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +10 -2
  67. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
  68. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +1 -1
  69. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +8 -8
  70. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -1
  71. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +2 -2
  72. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -1
  73. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +5 -0
  74. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +16 -8
  75. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
  76. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +1 -1
  77. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +6 -6
  78. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -1
  79. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js +1 -2
  80. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js.map +1 -1
  81. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.d.ts +5 -0
  82. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js +10 -2
  83. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js.map +1 -1
  84. package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +2 -1
  85. package/dist-client/pages/kpi-value/kpi-value-editor-page.js +16 -8
  86. package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +1 -1
  87. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +5 -0
  88. package/dist-client/pages/kpi-value/kpi-value-list-page.js +31 -7
  89. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
  90. package/dist-client/route.d.ts +1 -1
  91. package/dist-client/route.js +2 -8
  92. package/dist-client/route.js.map +1 -1
  93. package/dist-client/tsconfig.tsbuildinfo +1 -1
  94. package/dist-server/controllers/kpi-metric-value-provider.d.ts +1 -1
  95. package/dist-server/controllers/kpi-metric-value-provider.js +4 -4
  96. package/dist-server/controllers/kpi-metric-value-provider.js.map +1 -1
  97. package/dist-server/controllers/kpi-value-provider.d.ts +1 -1
  98. package/dist-server/controllers/kpi-value-provider.js +3 -3
  99. package/dist-server/controllers/kpi-value-provider.js.map +1 -1
  100. package/dist-server/migrations/1752190849680-seed-kpi-metrics.d.ts +6 -0
  101. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js +101 -0
  102. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js.map +1 -0
  103. package/dist-server/migrations/1752190849681-seed-kpi.d.ts +5 -0
  104. package/dist-server/migrations/1752190849681-seed-kpi.js +315 -0
  105. package/dist-server/migrations/1752190849681-seed-kpi.js.map +1 -0
  106. package/dist-server/migrations/1752192090123-add-grades-to-kpi.d.ts +7 -0
  107. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js +51 -0
  108. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js.map +1 -0
  109. package/dist-server/migrations/1752192090124-add-kpi-statistics.d.ts +5 -0
  110. package/dist-server/migrations/1752192090124-add-kpi-statistics.js +710 -0
  111. package/dist-server/migrations/1752192090124-add-kpi-statistics.js.map +1 -0
  112. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.d.ts +6 -0
  113. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js +111 -0
  114. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js.map +1 -0
  115. package/dist-server/migrations/1752192090129-seed-kpi-values.d.ts +6 -0
  116. package/dist-server/migrations/1752192090129-seed-kpi-values.js +187 -0
  117. package/dist-server/migrations/1752192090129-seed-kpi-values.js.map +1 -0
  118. package/dist-server/migrations/grade-data/x11-performance-table.json +962 -0
  119. package/dist-server/migrations/grade-data/x12-performance-table.json +611 -0
  120. package/dist-server/migrations/grade-data/x14-performance-table.json +42 -0
  121. package/dist-server/migrations/grade-data/x21-performance-table.json +889 -0
  122. package/dist-server/migrations/grade-data/x22-performance-table.json +1064 -0
  123. package/dist-server/migrations/grade-data/x23-performance-table.json +42 -0
  124. package/dist-server/migrations/grade-data/x31-performance-table.json +644 -0
  125. package/dist-server/migrations/grade-data/x32-performance-table.json +993 -0
  126. package/dist-server/migrations/grade-data/x33-performance-table.json +195 -0
  127. package/dist-server/migrations/grade-data/x34-performance-table.json +12 -0
  128. package/dist-server/migrations/grade-data/x35-performance-table.json +42 -0
  129. package/dist-server/migrations/grade-data/x41-performance-table.json +825 -0
  130. package/dist-server/migrations/grade-data/x42-performance-table.json +786 -0
  131. package/dist-server/migrations/grade-data/x43-performance-table.json +12 -0
  132. package/dist-server/migrations/grade-data/x44-performance-table.json +42 -0
  133. package/dist-server/migrations/grade-data/x51-performance-table.json +924 -0
  134. package/dist-server/migrations/grade-data/x52-performance-table.json +42 -0
  135. package/dist-server/migrations/grade-data/x61-performance-table.json +261 -0
  136. package/dist-server/migrations/grade-data/x62-performance-table.json +42 -0
  137. package/dist-server/migrations/seed-data/kpi-metrics-seed.json +454 -0
  138. package/dist-server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
  139. package/dist-server/migrations/seed-data/kpi-values-seed.json +402 -0
  140. package/dist-server/migrations/seed-data/kpis-seed.json +488 -0
  141. package/dist-server/service/index.d.ts +3 -7
  142. package/dist-server/service/index.js +5 -12
  143. package/dist-server/service/index.js.map +1 -1
  144. package/dist-server/service/kpi/aggregate-kpi.js +30 -13
  145. package/dist-server/service/kpi/aggregate-kpi.js.map +1 -1
  146. package/dist-server/service/kpi/kpi-formula.service.d.ts +15 -0
  147. package/dist-server/service/kpi/kpi-formula.service.js +90 -0
  148. package/dist-server/service/kpi/kpi-formula.service.js.map +1 -1
  149. package/dist-server/service/kpi/kpi-history.d.ts +0 -3
  150. package/dist-server/service/kpi/kpi-history.js +0 -10
  151. package/dist-server/service/kpi/kpi-history.js.map +1 -1
  152. package/dist-server/service/kpi/kpi-mutation.d.ts +1 -1
  153. package/dist-server/service/kpi/kpi-mutation.js +57 -20
  154. package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
  155. package/dist-server/service/kpi/kpi-query.d.ts +7 -3
  156. package/dist-server/service/kpi/kpi-query.js +126 -10
  157. package/dist-server/service/kpi/kpi-query.js.map +1 -1
  158. package/dist-server/service/kpi/kpi-type.d.ts +4 -2
  159. package/dist-server/service/kpi/kpi-type.js +12 -4
  160. package/dist-server/service/kpi/kpi-type.js.map +1 -1
  161. package/dist-server/service/kpi/kpi.d.ts +4 -3
  162. package/dist-server/service/kpi/kpi.js +20 -8
  163. package/dist-server/service/kpi/kpi.js.map +1 -1
  164. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +46 -11
  165. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -1
  166. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +1 -1
  167. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +6 -6
  168. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
  169. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.d.ts +2 -2
  170. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js +4 -4
  171. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js.map +1 -1
  172. package/dist-server/service/kpi-metric-value/kpi-metric-value.d.ts +1 -1
  173. package/dist-server/service/kpi-metric-value/kpi-metric-value.js +3 -3
  174. package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -1
  175. package/dist-server/service/kpi-org-scope/index.d.ts +9 -0
  176. package/dist-server/service/kpi-org-scope/index.js +14 -0
  177. package/dist-server/service/kpi-org-scope/index.js.map +1 -0
  178. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.d.ts +8 -0
  179. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js +170 -0
  180. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js.map +1 -0
  181. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.d.ts +14 -0
  182. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js +152 -0
  183. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js.map +1 -0
  184. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.d.ts +26 -0
  185. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js +101 -0
  186. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js.map +1 -0
  187. package/dist-server/service/kpi-org-scope/kpi-org-scope.d.ts +26 -0
  188. package/dist-server/service/kpi-org-scope/kpi-org-scope.js +135 -0
  189. package/dist-server/service/kpi-org-scope/kpi-org-scope.js.map +1 -0
  190. package/dist-server/service/kpi-statistic/kpi-statistic.d.ts +1 -0
  191. package/dist-server/service/kpi-statistic/kpi-statistic.js +11 -0
  192. package/dist-server/service/kpi-statistic/kpi-statistic.js.map +1 -1
  193. package/dist-server/service/kpi-value/kpi-value-mutation.js +71 -7
  194. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
  195. package/dist-server/service/kpi-value/kpi-value-type.d.ts +4 -2
  196. package/dist-server/service/kpi-value/kpi-value-type.js +12 -4
  197. package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
  198. package/dist-server/service/kpi-value/kpi-value.d.ts +3 -1
  199. package/dist-server/service/kpi-value/kpi-value.js +11 -5
  200. package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
  201. package/dist-server/service/utils/value-date-util.d.ts +1 -0
  202. package/dist-server/service/utils/value-date-util.js +41 -0
  203. package/dist-server/service/utils/value-date-util.js.map +1 -1
  204. package/dist-server/tsconfig.json +10 -0
  205. package/dist-server/tsconfig.tsbuildinfo +1 -1
  206. package/package.json +7 -6
  207. package/server/@types/index.d.ts +11 -0
  208. package/server/controllers/kpi-metric-value-provider.ts +5 -5
  209. package/server/controllers/kpi-value-provider.ts +4 -4
  210. package/server/migrations/1752190849680-seed-kpi-metrics.ts +124 -0
  211. package/server/migrations/1752190849681-seed-kpi.ts +356 -0
  212. package/server/migrations/1752192090123-add-grades-to-kpi.ts +67 -0
  213. package/server/migrations/1752192090124-add-kpi-statistics.ts +719 -0
  214. package/server/migrations/1752192090128-seed-kpi-org-scope.ts +132 -0
  215. package/server/migrations/1752192090129-seed-kpi-values.ts +207 -0
  216. package/server/migrations/grade-data/x11-performance-table.json +962 -0
  217. package/server/migrations/grade-data/x12-performance-table.json +611 -0
  218. package/server/migrations/grade-data/x14-performance-table.json +42 -0
  219. package/server/migrations/grade-data/x21-performance-table.json +889 -0
  220. package/server/migrations/grade-data/x22-performance-table.json +1064 -0
  221. package/server/migrations/grade-data/x23-performance-table.json +42 -0
  222. package/server/migrations/grade-data/x31-performance-table.json +644 -0
  223. package/server/migrations/grade-data/x32-performance-table.json +993 -0
  224. package/server/migrations/grade-data/x33-performance-table.json +195 -0
  225. package/server/migrations/grade-data/x34-performance-table.json +12 -0
  226. package/server/migrations/grade-data/x35-performance-table.json +42 -0
  227. package/server/migrations/grade-data/x41-performance-table.json +825 -0
  228. package/server/migrations/grade-data/x42-performance-table.json +786 -0
  229. package/server/migrations/grade-data/x43-performance-table.json +12 -0
  230. package/server/migrations/grade-data/x44-performance-table.json +42 -0
  231. package/server/migrations/grade-data/x51-performance-table.json +924 -0
  232. package/server/migrations/grade-data/x52-performance-table.json +42 -0
  233. package/server/migrations/grade-data/x61-performance-table.json +261 -0
  234. package/server/migrations/grade-data/x62-performance-table.json +42 -0
  235. package/server/migrations/seed-data/kpi-metrics-seed.json +454 -0
  236. package/server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
  237. package/server/migrations/seed-data/kpi-values-seed.json +402 -0
  238. package/server/migrations/seed-data/kpis-seed.json +488 -0
  239. package/server/service/index.ts +5 -12
  240. package/server/service/kpi/aggregate-kpi.ts +31 -13
  241. package/server/service/kpi/kpi-formula.service.ts +101 -0
  242. package/server/service/kpi/kpi-history.ts +0 -8
  243. package/server/service/kpi/kpi-mutation.ts +59 -19
  244. package/server/service/kpi/kpi-query.ts +118 -8
  245. package/server/service/kpi/kpi-type.ts +10 -4
  246. package/server/service/kpi/kpi.ts +17 -7
  247. package/server/service/kpi-metric/aggregate-kpi-metric.ts +55 -11
  248. package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +6 -6
  249. package/server/service/kpi-metric-value/kpi-metric-value-type.ts +4 -4
  250. package/server/service/kpi-metric-value/kpi-metric-value.ts +3 -3
  251. package/server/service/kpi-org-scope/index.ts +11 -0
  252. package/server/service/kpi-org-scope/kpi-org-scope-mutation.ts +173 -0
  253. package/server/service/kpi-org-scope/kpi-org-scope-query.ts +127 -0
  254. package/server/service/kpi-org-scope/kpi-org-scope-type.ts +68 -0
  255. package/server/service/kpi-org-scope/kpi-org-scope.ts +123 -0
  256. package/server/service/kpi-statistic/kpi-statistic.ts +10 -0
  257. package/server/service/kpi-value/kpi-value-mutation.ts +73 -7
  258. package/server/service/kpi-value/kpi-value-type.ts +10 -4
  259. package/server/service/kpi-value/kpi-value.ts +10 -5
  260. package/server/service/utils/value-date-util.ts +47 -0
  261. package/server/types/global.d.ts +8 -0
  262. package/things-factory.config.js +1 -0
  263. package/translations/en.json +15 -3
  264. package/translations/ja.json +13 -3
  265. package/translations/ko.json +15 -3
  266. package/translations/ms.json +13 -3
  267. package/translations/zh.json +13 -3
  268. package/client/pages/kpi-category/kpi-category-importer.ts +0 -90
  269. package/client/pages/kpi-category/kpi-category-list-page.ts +0 -537
  270. package/client/pages/kpi-category/kpi-category-value-calculator.ts +0 -233
  271. package/client/pages/kpi-category-value/kpi-category-value-list-page.ts +0 -404
  272. package/dist-client/pages/kpi-category/kpi-category-importer.d.ts +0 -23
  273. package/dist-client/pages/kpi-category/kpi-category-importer.js +0 -92
  274. package/dist-client/pages/kpi-category/kpi-category-importer.js.map +0 -1
  275. package/dist-client/pages/kpi-category/kpi-category-list-page.d.ts +0 -74
  276. package/dist-client/pages/kpi-category/kpi-category-list-page.js +0 -517
  277. package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +0 -1
  278. package/dist-client/pages/kpi-category/kpi-category-value-calculator.d.ts +0 -13
  279. package/dist-client/pages/kpi-category/kpi-category-value-calculator.js +0 -256
  280. package/dist-client/pages/kpi-category/kpi-category-value-calculator.js.map +0 -1
  281. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.d.ts +0 -63
  282. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js +0 -393
  283. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js.map +0 -1
  284. package/dist-server/service/kpi-category/index.d.ts +0 -6
  285. package/dist-server/service/kpi-category/index.js +0 -10
  286. package/dist-server/service/kpi-category/index.js.map +0 -1
  287. package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +0 -9
  288. package/dist-server/service/kpi-category/kpi-category-mutation.js +0 -221
  289. package/dist-server/service/kpi-category/kpi-category-mutation.js.map +0 -1
  290. package/dist-server/service/kpi-category/kpi-category-query.d.ts +0 -18
  291. package/dist-server/service/kpi-category/kpi-category-query.js +0 -115
  292. package/dist-server/service/kpi-category/kpi-category-query.js.map +0 -1
  293. package/dist-server/service/kpi-category/kpi-category-type.d.ts +0 -24
  294. package/dist-server/service/kpi-category/kpi-category-type.js +0 -100
  295. package/dist-server/service/kpi-category/kpi-category-type.js.map +0 -1
  296. package/dist-server/service/kpi-category/kpi-category.d.ts +0 -22
  297. package/dist-server/service/kpi-category/kpi-category.js +0 -106
  298. package/dist-server/service/kpi-category/kpi-category.js.map +0 -1
  299. package/dist-server/service/kpi-category-value/index.d.ts +0 -6
  300. package/dist-server/service/kpi-category-value/index.js +0 -10
  301. package/dist-server/service/kpi-category-value/index.js.map +0 -1
  302. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.d.ts +0 -8
  303. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js +0 -102
  304. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js.map +0 -1
  305. package/dist-server/service/kpi-category-value/kpi-category-value-query.d.ts +0 -13
  306. package/dist-server/service/kpi-category-value/kpi-category-value-query.js +0 -91
  307. package/dist-server/service/kpi-category-value/kpi-category-value-query.js.map +0 -1
  308. package/dist-server/service/kpi-category-value/kpi-category-value-type.d.ts +0 -19
  309. package/dist-server/service/kpi-category-value/kpi-category-value-type.js +0 -73
  310. package/dist-server/service/kpi-category-value/kpi-category-value-type.js.map +0 -1
  311. package/dist-server/service/kpi-category-value/kpi-category-value.d.ts +0 -19
  312. package/dist-server/service/kpi-category-value/kpi-category-value.js +0 -91
  313. package/dist-server/service/kpi-category-value/kpi-category-value.js.map +0 -1
  314. package/helps/kpi/kpi-category.md +0 -160
  315. package/server/service/kpi-category/index.ts +0 -7
  316. package/server/service/kpi-category/kpi-category-mutation.ts +0 -217
  317. package/server/service/kpi-category/kpi-category-query.ts +0 -87
  318. package/server/service/kpi-category/kpi-category-type.ts +0 -73
  319. package/server/service/kpi-category/kpi-category.ts +0 -95
  320. package/server/service/kpi-category-value/index.ts +0 -7
  321. package/server/service/kpi-category-value/kpi-category-value-mutation.ts +0 -88
  322. package/server/service/kpi-category-value/kpi-category-value-query.ts +0 -62
  323. package/server/service/kpi-category-value/kpi-category-value-type.ts +0 -48
  324. package/server/service/kpi-category-value/kpi-category-value.ts +0 -79
@@ -6,7 +6,6 @@ const typeorm_1 = require("typeorm");
6
6
  const type_graphql_1 = require("type-graphql");
7
7
  const shell_1 = require("@things-factory/shell");
8
8
  const auth_base_1 = require("@things-factory/auth-base");
9
- const kpi_category_1 = require("../kpi-category/kpi-category");
10
9
  const env_1 = require("@things-factory/env");
11
10
  const shell_2 = require("@things-factory/shell");
12
11
  const ORMCONFIG = env_1.config.get('ormconfig', {});
@@ -97,15 +96,25 @@ tslib_1.__decorate([
97
96
  tslib_1.__metadata("design:type", String)
98
97
  ], Kpi.prototype, "description", void 0);
99
98
  tslib_1.__decorate([
100
- (0, typeorm_1.ManyToOne)(() => kpi_category_1.KpiCategory, { nullable: true }),
101
- (0, type_graphql_1.Field)(type => kpi_category_1.KpiCategory, { nullable: true, description: 'Category to which this KPI belongs.' }),
102
- tslib_1.__metadata("design:type", kpi_category_1.KpiCategory)
103
- ], Kpi.prototype, "category", void 0);
99
+ (0, typeorm_1.ManyToOne)(() => Kpi, { nullable: true }),
100
+ (0, type_graphql_1.Field)(type => Kpi, { nullable: true, description: 'Parent KPI in hierarchical structure.' }),
101
+ tslib_1.__metadata("design:type", Kpi)
102
+ ], Kpi.prototype, "parent", void 0);
104
103
  tslib_1.__decorate([
105
- (0, typeorm_1.RelationId)((kpi) => kpi.category),
106
- (0, type_graphql_1.Field)({ nullable: true, description: 'ID of the category for this KPI.' }),
104
+ (0, typeorm_1.RelationId)((kpi) => kpi.parent),
105
+ (0, type_graphql_1.Field)({ nullable: true, description: 'ID of the parent KPI.' }),
107
106
  tslib_1.__metadata("design:type", String)
108
- ], Kpi.prototype, "categoryId", void 0);
107
+ ], Kpi.prototype, "parentId", void 0);
108
+ tslib_1.__decorate([
109
+ (0, typeorm_1.OneToMany)(() => Kpi, kpi => kpi.parent),
110
+ (0, type_graphql_1.Field)(type => [Kpi], { nullable: true, description: 'Child KPIs in hierarchical structure.' }),
111
+ tslib_1.__metadata("design:type", Array)
112
+ ], Kpi.prototype, "children", void 0);
113
+ tslib_1.__decorate([
114
+ (0, typeorm_1.Column)({ nullable: false, default: true }),
115
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Indicates whether this KPI is a leaf node (has actual measured values).' }),
116
+ tslib_1.__metadata("design:type", Boolean)
117
+ ], Kpi.prototype, "isLeaf", void 0);
109
118
  tslib_1.__decorate([
110
119
  (0, typeorm_1.Column)({
111
120
  nullable: true,
@@ -249,6 +258,9 @@ exports.Kpi = Kpi = tslib_1.__decorate([
249
258
  where: '"deleted_at" IS NULL',
250
259
  unique: true
251
260
  }),
261
+ (0, typeorm_1.Index)('ix_kpi_hierarchy', (kpi) => [kpi.domain, kpi.parent], {
262
+ where: '"deleted_at" IS NULL'
263
+ }),
252
264
  (0, type_graphql_1.ObjectType)({
253
265
  description: 'KPI entity. Represents a key performance indicator with calculation formula, target, category, and other attributes.'
254
266
  })
@@ -1 +1 @@
1
- {"version":3,"file":"kpi.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n OneToMany,\n VersionColumn,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { KpiCategory } from '../kpi-category/kpi-category'\nimport { config } from '@things-factory/env'\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { KpiScores } from './kpi-grade.types'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\nexport enum KpiStatus {\n DRAFT = 'DRAFT',\n RELEASE = 'RELEASE',\n ARCHIVED = 'ARCHIVED'\n}\n\nexport enum KpiVizType {\n CARD = 'CARD',\n GAUGE = 'GAUGE',\n PROGRESS = 'PROGRESS',\n BAR = 'BAR',\n LINE = 'LINE',\n PIE = 'PIE',\n DONUT = 'DONUT',\n RADAR = 'RADAR',\n BULLET = 'BULLET',\n THERMOMETER = 'THERMOMETER',\n SPEEDOMETER = 'SPEEDOMETER',\n ICON = 'ICON',\n BADGE = 'BADGE',\n TEXT = 'TEXT',\n TABLE = 'TABLE'\n}\n\nexport enum KpiPeriodType {\n DAY = 'DAY',\n WEEK = 'WEEK',\n MONTH = 'MONTH',\n QUARTER = 'QUARTER',\n YEAR = 'YEAR',\n RANGE = 'RANGE',\n ALLTIME = 'ALLTIME'\n}\n\nregisterEnumType(KpiStatus, {\n name: 'KpiStatus',\n description: 'State enumeration of a KPI (DRAFT, RELEASED, ARCHIVED)'\n})\n\nregisterEnumType(KpiVizType, {\n name: 'KpiVizType',\n description: 'Visualization type for KPI display (CARD, GAUGE, PROGRESS, etc.)'\n})\n\nregisterEnumType(KpiPeriodType, {\n name: 'KpiPeriodType',\n description: 'Aggregation period type for KPI (DAY, WEEK, MONTH, QUARTER, RANGE, ALLTIME)'\n})\n\n@Entity()\n@Index('ix_kpi_0', (kpi: Kpi) => [kpi.domain, kpi.name], {\n where: '\"deleted_at\" IS NULL',\n unique: true\n})\n@ObjectType({\n description:\n 'KPI entity. Represents a key performance indicator with calculation formula, target, category, and other attributes.'\n})\nexport class Kpi {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier for this KPI.' })\n readonly id: string\n\n @VersionColumn()\n @Field({\n nullable: true,\n description:\n 'Version number of the KPI. Increments on each modification. When the KPI is released, a snapshot is saved in kpi-history and the status becomes RELEASED. Editing after release increases the version and sets status to DRAFT.'\n })\n version?: number = 1\n\n @ManyToOne(type => Domain)\n @Field({ nullable: true, description: 'Domain (tenant) to which this KPI belongs.' })\n domain?: Domain\n\n @RelationId((kpi: Kpi) => kpi.domain)\n @Field({ nullable: true, description: 'ID of the domain (tenant) for this KPI.' })\n domainId?: string\n\n @Column()\n @Field({ nullable: true, description: 'Name of the KPI.' })\n name?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Detailed description of the KPI.' })\n description?: string\n\n @ManyToOne(() => KpiCategory, { nullable: true })\n @Field(type => KpiCategory, { nullable: true, description: 'Category to which this KPI belongs.' })\n category?: KpiCategory\n\n @RelationId((kpi: Kpi) => kpi.category)\n @Field({ nullable: true, description: 'ID of the category for this KPI.' })\n categoryId?: string\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({\n nullable: true,\n description:\n 'Calculation formula for the KPI. Expressed as a string using metric codes and operators, e.g., \"defect_count / total_count * 100\".'\n })\n formula?: string\n\n @Column({ nullable: false, default: false })\n @Field({ nullable: true, description: 'Indicates whether this KPI is active and usable.' })\n active?: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' })\n state?: KpiStatus\n\n @Column({ nullable: true })\n @Field(type => KpiVizType, {\n nullable: true,\n description: 'Visualization type for this KPI (e.g., CARD, GAUGE, PROGRESS, BAR, LINE, etc.).'\n })\n vizType?: KpiVizType\n\n @Column({ type: 'json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, min/max values, etc.'\n })\n vizMeta?: any\n\n @Column({ nullable: true })\n @Field({\n nullable: true,\n description: 'Cron schedule string for periodic KPI value aggregation (e.g., \"0 0 * * *\" for daily).'\n })\n schedule?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Schedule ID for the KPI (used for scheduler registration).' })\n scheduleId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Timezone for the KPI schedule.' })\n timezone?: string\n\n @Column({ default: 'DAY' })\n @Field(type => KpiPeriodType, { description: 'Aggregation period type for this KPI.' })\n periodType: KpiPeriodType\n\n @Column({ type: 'float', nullable: true, default: 1 })\n @Field({ nullable: true, description: 'Weight for aggregation in parent category.' })\n weight?: number\n\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Performance index lookup table for complex transformations. @deprecated 향후 제거 예정. performanceFormula 사용 권장.'\n })\n grades?: KpiScores\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({\n nullable: true,\n description:\n 'Score calculation formula for this KPI. Converts KPI value to performance score (0-100). For complex mappings, use grades lookup table instead. Example: \"if(value >= 90, 100, if(value >= 80, 85, 70))\" or \"value * 0.8 + 20\"'\n })\n scoreFormula?: string\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was created.' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was last updated.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was deleted (soft delete).' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who created this KPI.' })\n creator?: User\n\n @RelationId((kpi: Kpi) => kpi.creator)\n @Field({ nullable: true, description: 'ID of the user who created this KPI.' })\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who last updated this KPI.' })\n updater?: User\n\n @RelationId((kpi: Kpi) => kpi.updater)\n @Field({ nullable: true, description: 'ID of the user who last updated this KPI.' })\n updaterId?: string\n\n @Field(type => String, { nullable: true, description: 'Thumbnail image or file path for this KPI.' })\n thumbnail?: string\n}\n"]}
1
+ {"version":3,"file":"kpi.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n OneToMany,\n VersionColumn,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { KpiScores } from './kpi-grade.types'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\nexport enum KpiStatus {\n DRAFT = 'DRAFT',\n RELEASE = 'RELEASE',\n ARCHIVED = 'ARCHIVED'\n}\n\nexport enum KpiVizType {\n CARD = 'CARD',\n GAUGE = 'GAUGE',\n PROGRESS = 'PROGRESS',\n BAR = 'BAR',\n LINE = 'LINE',\n PIE = 'PIE',\n DONUT = 'DONUT',\n RADAR = 'RADAR',\n BULLET = 'BULLET',\n THERMOMETER = 'THERMOMETER',\n SPEEDOMETER = 'SPEEDOMETER',\n ICON = 'ICON',\n BADGE = 'BADGE',\n TEXT = 'TEXT',\n TABLE = 'TABLE'\n}\n\nexport enum KpiPeriodType {\n DAY = 'DAY',\n WEEK = 'WEEK',\n MONTH = 'MONTH',\n QUARTER = 'QUARTER',\n YEAR = 'YEAR',\n RANGE = 'RANGE',\n ALLTIME = 'ALLTIME'\n}\n\nregisterEnumType(KpiStatus, {\n name: 'KpiStatus',\n description: 'State enumeration of a KPI (DRAFT, RELEASED, ARCHIVED)'\n})\n\nregisterEnumType(KpiVizType, {\n name: 'KpiVizType',\n description: 'Visualization type for KPI display (CARD, GAUGE, PROGRESS, etc.)'\n})\n\nregisterEnumType(KpiPeriodType, {\n name: 'KpiPeriodType',\n description: 'Aggregation period type for KPI (DAY, WEEK, MONTH, QUARTER, RANGE, ALLTIME)'\n})\n\n@Entity()\n@Index('ix_kpi_0', (kpi: Kpi) => [kpi.domain, kpi.name], {\n where: '\"deleted_at\" IS NULL',\n unique: true\n})\n@Index('ix_kpi_hierarchy', (kpi: Kpi) => [kpi.domain, kpi.parent], {\n where: '\"deleted_at\" IS NULL'\n})\n@ObjectType({\n description:\n 'KPI entity. Represents a key performance indicator with calculation formula, target, category, and other attributes.'\n})\nexport class Kpi {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier for this KPI.' })\n readonly id: string\n\n @VersionColumn()\n @Field({\n nullable: true,\n description:\n 'Version number of the KPI. Increments on each modification. When the KPI is released, a snapshot is saved in kpi-history and the status becomes RELEASED. Editing after release increases the version and sets status to DRAFT.'\n })\n version?: number = 1\n\n @ManyToOne(type => Domain)\n @Field({ nullable: true, description: 'Domain (tenant) to which this KPI belongs.' })\n domain?: Domain\n\n @RelationId((kpi: Kpi) => kpi.domain)\n @Field({ nullable: true, description: 'ID of the domain (tenant) for this KPI.' })\n domainId?: string\n\n @Column()\n @Field({ nullable: true, description: 'Name of the KPI.' })\n name?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Detailed description of the KPI.' })\n description?: string\n\n @ManyToOne(() => Kpi, { nullable: true })\n @Field(type => Kpi, { nullable: true, description: 'Parent KPI in hierarchical structure.' })\n parent?: Kpi\n\n @RelationId((kpi: Kpi) => kpi.parent)\n @Field({ nullable: true, description: 'ID of the parent KPI.' })\n parentId?: string\n\n @OneToMany(() => Kpi, kpi => kpi.parent)\n @Field(type => [Kpi], { nullable: true, description: 'Child KPIs in hierarchical structure.' })\n children?: Kpi[]\n\n @Column({ nullable: false, default: true })\n @Field({ nullable: true, description: 'Indicates whether this KPI is a leaf node (has actual measured values).' })\n isLeaf?: boolean\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({\n nullable: true,\n description:\n 'Calculation formula for the KPI. Expressed as a string using metric codes and operators, e.g., \"defect_count / total_count * 100\".'\n })\n formula?: string\n\n @Column({ nullable: false, default: false })\n @Field({ nullable: true, description: 'Indicates whether this KPI is active and usable.' })\n active?: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' })\n state?: KpiStatus\n\n @Column({ nullable: true })\n @Field(type => KpiVizType, {\n nullable: true,\n description: 'Visualization type for this KPI (e.g., CARD, GAUGE, PROGRESS, BAR, LINE, etc.).'\n })\n vizType?: KpiVizType\n\n @Column({ type: 'json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, min/max values, etc.'\n })\n vizMeta?: any\n\n @Column({ nullable: true })\n @Field({\n nullable: true,\n description: 'Cron schedule string for periodic KPI value aggregation (e.g., \"0 0 * * *\" for daily).'\n })\n schedule?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Schedule ID for the KPI (used for scheduler registration).' })\n scheduleId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Timezone for the KPI schedule.' })\n timezone?: string\n\n @Column({ default: 'DAY' })\n @Field(type => KpiPeriodType, { description: 'Aggregation period type for this KPI.' })\n periodType: KpiPeriodType\n\n @Column({ type: 'float', nullable: true, default: 1 })\n @Field({ nullable: true, description: 'Weight for aggregation in parent category.' })\n weight?: number\n\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Performance index lookup table for complex transformations. @deprecated 향후 제거 예정. performanceFormula 사용 권장.'\n })\n grades?: KpiScores\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({\n nullable: true,\n description:\n 'Score calculation formula for this KPI. Converts KPI value to performance score (0-100). For complex mappings, use grades lookup table instead. Example: \"if(value >= 90, 100, if(value >= 80, 85, 70))\" or \"value * 0.8 + 20\"'\n })\n scoreFormula?: string\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was created.' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was last updated.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was deleted (soft delete).' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who created this KPI.' })\n creator?: User\n\n @RelationId((kpi: Kpi) => kpi.creator)\n @Field({ nullable: true, description: 'ID of the user who created this KPI.' })\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who last updated this KPI.' })\n updater?: User\n\n @RelationId((kpi: Kpi) => kpi.updater)\n @Field({ nullable: true, description: 'ID of the user who last updated this KPI.' })\n updaterId?: string\n\n @Field(type => String, { nullable: true, description: 'Thumbnail image or file path for this KPI.' })\n thumbnail?: string\n}\n"]}
@@ -7,6 +7,7 @@ const finalize_data_collection_1 = require("@things-factory/dataset/dist-server/
7
7
  const kpi_metric_1 = require("./kpi-metric");
8
8
  const kpi_value_1 = require("../kpi-value/kpi-value");
9
9
  const kpi_1 = require("../kpi/kpi");
10
+ const kpi_org_scope_1 = require("../kpi-org-scope/kpi-org-scope");
10
11
  /**
11
12
  * KPI-Metric 집계/자동화 서비스 함수 (formula 지원, KPI Value 저장)
12
13
  * @param metricId KPI-Metric ID
@@ -40,7 +41,7 @@ async function aggregateKpiMetricValue(metricId, domainId, context) {
40
41
  date: summary.date,
41
42
  period: summary.period,
42
43
  value: summary.summary[metric.fieldName],
43
- group: {
44
+ org: {
44
45
  key01: summary.key01,
45
46
  key02: summary.key02,
46
47
  key03: summary.key03,
@@ -57,33 +58,67 @@ async function aggregateKpiMetricValue(metricId, domainId, context) {
57
58
  const kpi = await (0, shell_1.getRepository)(kpi_1.Kpi).findOne({ where: { name: metric.name, domain: { id: domainId } } });
58
59
  if (!kpi)
59
60
  throw new Error('KPI 정보 없음 (metric.name과 동일한 KPI name 기준, 실제 연동 구조에 맞게 보완 필요)');
60
- // KPI Value version, valueDate, group 등 매핑
61
+ // KPI Value version, valueDate, org 등 매핑
61
62
  const savedValues = [];
63
+ const kpiOrgScopeRepo = (0, shell_1.getRepository)(kpi_org_scope_1.KpiOrgScope, context.state?.tx);
64
+ const kpiValueRepo = (0, shell_1.getRepository)(kpi_value_1.KpiValue, context.state?.tx);
62
65
  for (const v of values) {
63
66
  const valueDate = v.date;
64
- const group = v.group;
67
+ const orgData = v.org;
65
68
  const version = kpi.version || 1;
66
69
  const value = v.value;
67
70
  if (value == null || isNaN(value))
68
71
  continue;
69
- // upsert(동일 KPI, valueDate, group, version) 기준으로 저장
70
- const repo = (0, shell_1.getRepository)(kpi_value_1.KpiValue, context.state?.tx);
71
- const existing = await repo.findOne({
72
- where: { kpi: { id: kpi.id }, valueDate, group, version, domain: { id: domainId } }
72
+ // KpiOrgScope 찾기 또는 생성
73
+ let kpiOrgScope = null;
74
+ // key들로 조합된 org 식별자 생성
75
+ const orgIdentifier = [orgData.key01, orgData.key02, orgData.key03, orgData.key04, orgData.key05].filter(Boolean).join('-') ||
76
+ 'unknown-org';
77
+ // 기존 KpiOrgScope 조회 (entityName 기준)
78
+ kpiOrgScope = await kpiOrgScopeRepo.findOne({
79
+ where: { entityName: orgIdentifier, domain: { id: domainId } }
73
80
  });
74
- let entity = existing || repo.create();
81
+ // 없으면 새로 생성
82
+ if (!kpiOrgScope) {
83
+ kpiOrgScope = await kpiOrgScopeRepo.save({
84
+ entityType: 'DataSummary', // DataSummary에서 온 데이터임을 표시
85
+ entityId: `datasummary-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
86
+ entityName: orgIdentifier,
87
+ org: orgIdentifier, // legacy field
88
+ scope01: orgData.key01,
89
+ scope02: orgData.key02,
90
+ scope03: orgData.key03,
91
+ scope04: orgData.key04,
92
+ scope05: orgData.key05,
93
+ domain: kpi.domain,
94
+ creator: context.state?.user,
95
+ updater: context.state?.user
96
+ });
97
+ }
98
+ // upsert KpiValue (동일 KPI, valueDate, kpiOrgScope, version 기준)
99
+ const existing = await kpiValueRepo.findOne({
100
+ where: {
101
+ kpi: { id: kpi.id },
102
+ valueDate,
103
+ kpiOrgScope: { id: kpiOrgScope.id },
104
+ version,
105
+ domain: { id: domainId }
106
+ }
107
+ });
108
+ let entity = existing || kpiValueRepo.create();
75
109
  entity.kpi = kpi;
76
110
  entity.kpiId = kpi.id;
77
111
  entity.version = version;
78
112
  entity.valueDate = valueDate;
79
113
  entity.value = value;
80
- entity.group = group;
114
+ entity.kpiOrgScope = kpiOrgScope;
115
+ entity.kpiOrgScopeId = kpiOrgScope.id;
81
116
  entity.inputType = kpi_value_1.KpiValueInputType.AUTO;
82
- entity.source = 'AUTO';
117
+ entity.source = 'AUTO-AGGREGATE';
83
118
  entity.domain = kpi.domain;
84
119
  entity.creator = context.state?.user;
85
120
  entity.updater = context.state?.user;
86
- entity = await repo.save(entity);
121
+ entity = await kpiValueRepo.save(entity);
87
122
  savedValues.push(entity);
88
123
  }
89
124
  return savedValues;
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate-kpi-metric.js","sourceRoot":"","sources":["../../../server/service/kpi-metric/aggregate-kpi-metric.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { DataSummary } from '@things-factory/dataset'\nimport { finalizeLatestDataCollection } from '@things-factory/dataset/dist-server/controllers/finalize-data-collection'\nimport { KpiMetric } from './kpi-metric'\nimport { KpiValue, KpiValueInputType } from '../kpi-value/kpi-value'\nimport { Kpi } from '../kpi/kpi'\nimport { KpiFormulaService } from '../kpi/kpi-formula.service'\n\n/**\n * KPI-Metric 집계/자동화 서비스 함수 (formula 지원, KPI Value 저장)\n * @param metricId KPI-Metric ID\n * @param domainId 도메인 ID\n * @param context ResolverContext (state에 domain, user, tx 등 포함)\n * @returns 저장된 KPI Value 배열\n */\nexport async function aggregateKpiMetricValue(metricId: string, domainId: string, context: ResolverContext) {\n const tx = context.state?.tx || getRepository(KpiMetric).manager\n\n // 1. metric 정보 조회\n const metric = await getRepository(KpiMetric).findOne({\n where: { id: metricId, domain: { id: domainId } }\n })\n if (!metric) throw new Error('Metric 정보 없음')\n if (!metric.active) throw new Error('비활성화된 Metric')\n\n // formula 분기 제거: metric은 항상 dataset 집계만 수행\n let values: any[] = []\n if (!metric.dataSetId || !metric.fieldName) throw new Error('Metric 매핑 정보 누락')\n await finalizeLatestDataCollection(metric.dataSetId, context)\n const summaries = await getRepository(DataSummary).find({\n where: { dataSet: { id: metric.dataSetId }, domain: { id: domainId } },\n order: { date: 'DESC', period: 'DESC' }\n })\n values = summaries\n .map(summary => {\n if (summary.summary && metric.fieldName in summary.summary) {\n return {\n date: summary.date,\n period: summary.period,\n value: summary.summary[metric.fieldName],\n group: {\n key01: summary.key01,\n key02: summary.key02,\n key03: summary.key03,\n key04: summary.key04,\n key05: summary.key05\n }\n }\n }\n return null\n })\n .filter(Boolean)\n\n // 5. KPI Value로 저장 (metric 단위, KPI 단위 formula는 후속)\n // metric이 속한 KPI 정보 조회 (여기서는 metric.name == kpi.name인 KPI를 임시로 매핑, 실제 연동 구조에 맞게 보완 필요)\n const kpi = await getRepository(Kpi).findOne({ where: { name: metric.name, domain: { id: domainId } } })\n if (!kpi) throw new Error('KPI 정보 없음 (metric.name과 동일한 KPI name 기준, 실제 연동 구조에 맞게 보완 필요)')\n\n // KPI Value version, valueDate, group 등 매핑\n const savedValues = []\n for (const v of values) {\n const valueDate = v.date\n const group = v.group\n const version = kpi.version || 1\n const value = v.value\n if (value == null || isNaN(value)) continue\n // upsert(동일 KPI, valueDate, group, version) 기준으로 저장\n const repo = getRepository(KpiValue, context.state?.tx)\n const existing = await repo.findOne({\n where: { kpi: { id: kpi.id }, valueDate, group, version, domain: { id: domainId } }\n })\n let entity = existing || repo.create()\n entity.kpi = kpi\n entity.kpiId = kpi.id\n entity.version = version\n entity.valueDate = valueDate\n entity.value = value\n entity.group = group\n entity.inputType = KpiValueInputType.AUTO\n entity.source = 'AUTO'\n entity.domain = kpi.domain\n entity.creator = context.state?.user\n entity.updater = context.state?.user\n entity = await repo.save(entity)\n savedValues.push(entity)\n }\n return savedValues\n}\n"]}
1
+ {"version":3,"file":"aggregate-kpi-metric.js","sourceRoot":"","sources":["../../../server/service/kpi-metric/aggregate-kpi-metric.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { DataSummary } from '@things-factory/dataset'\nimport { finalizeLatestDataCollection } from '@things-factory/dataset/dist-server/controllers/finalize-data-collection'\nimport { KpiMetric } from './kpi-metric'\nimport { KpiValue, KpiValueInputType } from '../kpi-value/kpi-value'\nimport { Kpi } from '../kpi/kpi'\nimport { KpiOrgScope } from '../kpi-org-scope/kpi-org-scope'\nimport { KpiFormulaService } from '../kpi/kpi-formula.service'\n\n/**\n * KPI-Metric 집계/자동화 서비스 함수 (formula 지원, KPI Value 저장)\n * @param metricId KPI-Metric ID\n * @param domainId 도메인 ID\n * @param context ResolverContext (state에 domain, user, tx 등 포함)\n * @returns 저장된 KPI Value 배열\n */\nexport async function aggregateKpiMetricValue(metricId: string, domainId: string, context: ResolverContext) {\n const tx = context.state?.tx || getRepository(KpiMetric).manager\n\n // 1. metric 정보 조회\n const metric = await getRepository(KpiMetric).findOne({\n where: { id: metricId, domain: { id: domainId } }\n })\n if (!metric) throw new Error('Metric 정보 없음')\n if (!metric.active) throw new Error('비활성화된 Metric')\n\n // formula 분기 제거: metric은 항상 dataset 집계만 수행\n let values: any[] = []\n if (!metric.dataSetId || !metric.fieldName) throw new Error('Metric 매핑 정보 누락')\n await finalizeLatestDataCollection(metric.dataSetId, context)\n const summaries = await getRepository(DataSummary).find({\n where: { dataSet: { id: metric.dataSetId }, domain: { id: domainId } },\n order: { date: 'DESC', period: 'DESC' }\n })\n values = summaries\n .map(summary => {\n if (summary.summary && metric.fieldName in summary.summary) {\n return {\n date: summary.date,\n period: summary.period,\n value: summary.summary[metric.fieldName],\n org: {\n key01: summary.key01,\n key02: summary.key02,\n key03: summary.key03,\n key04: summary.key04,\n key05: summary.key05\n }\n }\n }\n return null\n })\n .filter(Boolean)\n\n // 5. KPI Value로 저장 (metric 단위, KPI 단위 formula는 후속)\n // metric이 속한 KPI 정보 조회 (여기서는 metric.name == kpi.name인 KPI를 임시로 매핑, 실제 연동 구조에 맞게 보완 필요)\n const kpi = await getRepository(Kpi).findOne({ where: { name: metric.name, domain: { id: domainId } } })\n if (!kpi) throw new Error('KPI 정보 없음 (metric.name과 동일한 KPI name 기준, 실제 연동 구조에 맞게 보완 필요)')\n\n // KPI Value version, valueDate, org 등 매핑\n const savedValues = []\n const kpiOrgScopeRepo = getRepository(KpiOrgScope, context.state?.tx)\n const kpiValueRepo = getRepository(KpiValue, context.state?.tx)\n\n for (const v of values) {\n const valueDate = v.date\n const orgData = v.org\n const version = kpi.version || 1\n const value = v.value\n if (value == null || isNaN(value)) continue\n\n // KpiOrgScope 찾기 또는 생성\n let kpiOrgScope: KpiOrgScope | null = null\n\n // key들로 조합된 org 식별자 생성\n const orgIdentifier =\n [orgData.key01, orgData.key02, orgData.key03, orgData.key04, orgData.key05].filter(Boolean).join('-') ||\n 'unknown-org'\n\n // 기존 KpiOrgScope 조회 (entityName 기준)\n kpiOrgScope = await kpiOrgScopeRepo.findOne({\n where: { entityName: orgIdentifier, domain: { id: domainId } }\n })\n\n // 없으면 새로 생성\n if (!kpiOrgScope) {\n kpiOrgScope = await kpiOrgScopeRepo.save({\n entityType: 'DataSummary', // DataSummary에서 온 데이터임을 표시\n entityId: `datasummary-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n entityName: orgIdentifier,\n org: orgIdentifier, // legacy field\n scope01: orgData.key01,\n scope02: orgData.key02,\n scope03: orgData.key03,\n scope04: orgData.key04,\n scope05: orgData.key05,\n domain: kpi.domain,\n creator: context.state?.user,\n updater: context.state?.user\n })\n }\n\n // upsert KpiValue (동일 KPI, valueDate, kpiOrgScope, version 기준)\n const existing = await kpiValueRepo.findOne({\n where: {\n kpi: { id: kpi.id },\n valueDate,\n kpiOrgScope: { id: kpiOrgScope.id },\n version,\n domain: { id: domainId }\n }\n })\n\n let entity = existing || kpiValueRepo.create()\n entity.kpi = kpi\n entity.kpiId = kpi.id\n entity.version = version\n entity.valueDate = valueDate\n entity.value = value\n entity.kpiOrgScope = kpiOrgScope\n entity.kpiOrgScopeId = kpiOrgScope.id\n entity.inputType = KpiValueInputType.AUTO\n entity.source = 'AUTO-AGGREGATE'\n entity.domain = kpi.domain\n entity.creator = context.state?.user\n entity.updater = context.state?.user\n entity = await kpiValueRepo.save(entity)\n savedValues.push(entity)\n }\n return savedValues\n}\n"]}
@@ -2,7 +2,7 @@ import { KpiMetricValue } from './kpi-metric-value';
2
2
  import { NewKpiMetricValue, KpiMetricValuePatch } from './kpi-metric-value-type';
3
3
  export declare class KpiMetricValueMutation {
4
4
  createKpiMetricValue(metricValue: NewKpiMetricValue, context: ResolverContext): Promise<KpiMetricValue>;
5
- recordKpiMetricValue(metricName: string, value: number | null, meta: any, group: string | null, context: ResolverContext): Promise<KpiMetricValue>;
5
+ recordKpiMetricValue(metricName: string, value: number | null, meta: any, org: string | null, context: ResolverContext): Promise<KpiMetricValue>;
6
6
  updateKpiMetricValue(id: string, patch: KpiMetricValuePatch, context: ResolverContext): Promise<KpiMetricValue>;
7
7
  updateMultipleKpiMetricValue(patches: KpiMetricValuePatch[], context: ResolverContext): Promise<KpiMetricValue[]>;
8
8
  deleteKpiMetricValue(id: string, context: ResolverContext): Promise<boolean>;
@@ -38,7 +38,7 @@ let KpiMetricValueMutation = class KpiMetricValueMutation {
38
38
  valueDate,
39
39
  periodType,
40
40
  value: metricValue.value,
41
- group: metricValue.group,
41
+ org: metricValue.org,
42
42
  unit: metricValue.unit,
43
43
  meta: metricValue.meta,
44
44
  domain: domain,
@@ -47,7 +47,7 @@ let KpiMetricValueMutation = class KpiMetricValueMutation {
47
47
  };
48
48
  return await (0, shell_1.getRepository)(kpi_metric_value_1.KpiMetricValue, tx).save(entity);
49
49
  }
50
- async recordKpiMetricValue(metricName, value, meta, group, context) {
50
+ async recordKpiMetricValue(metricName, value, meta, org, context) {
51
51
  const { domain, user, tx } = context.state;
52
52
  const metric = await (0, shell_1.getRepository)(kpi_metric_1.KpiMetric).findOne({ where: { name: metricName, domain: { id: domain.id } } });
53
53
  if (!metric)
@@ -63,7 +63,7 @@ let KpiMetricValueMutation = class KpiMetricValueMutation {
63
63
  metric: { id: metric.id },
64
64
  valueDate,
65
65
  periodType,
66
- group,
66
+ org,
67
67
  domain: { id: domain.id }
68
68
  }
69
69
  });
@@ -80,7 +80,7 @@ let KpiMetricValueMutation = class KpiMetricValueMutation {
80
80
  meta,
81
81
  valueDate,
82
82
  periodType,
83
- group,
83
+ org,
84
84
  domain,
85
85
  creator: user,
86
86
  updater: user
@@ -192,11 +192,11 @@ tslib_1.__decorate([
192
192
  tslib_1.__decorate([
193
193
  (0, type_graphql_1.Directive)('@transaction'),
194
194
  (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
195
- (0, type_graphql_1.Mutation)(returns => kpi_metric_value_1.KpiMetricValue, { description: 'Record a metric value by metric name, value, meta, and group.' }),
195
+ (0, type_graphql_1.Mutation)(returns => kpi_metric_value_1.KpiMetricValue, { description: 'Record a metric value by metric name, value, meta, and org.' }),
196
196
  tslib_1.__param(0, (0, type_graphql_1.Arg)('metricName', { description: 'Metric code/name.' })),
197
197
  tslib_1.__param(1, (0, type_graphql_1.Arg)('value', type => type_graphql_2.Float, { nullable: true, description: 'Metric value (number).' })),
198
198
  tslib_1.__param(2, (0, type_graphql_1.Arg)('meta', type => shell_2.ScalarObject, { nullable: true, description: 'Extended or non-numeric information (JSON).' })),
199
- tslib_1.__param(3, (0, type_graphql_1.Arg)('group', { nullable: true, description: 'Group key for this value (organization, line, user, etc.)' })),
199
+ tslib_1.__param(3, (0, type_graphql_1.Arg)('org', { nullable: true, description: 'Organizational unit for this value (project, department, company, employee, etc.)' })),
200
200
  tslib_1.__param(4, (0, type_graphql_1.Ctx)()),
201
201
  tslib_1.__metadata("design:type", Function),
202
202
  tslib_1.__metadata("design:paramtypes", [String, Number, Object, String, Object]),
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-metric-value-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\nimport { Float } from 'type-graphql'\nimport { KpiPeriodType } from '../kpi/kpi'\n\nimport { KpiMetricValue } from './kpi-metric-value'\nimport { NewKpiMetricValue, KpiMetricValuePatch } from './kpi-metric-value-type'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\nimport { ScalarObject } from '@things-factory/shell'\nimport { getDefaultValueDate } from '../utils/value-date-util'\n\n@Resolver(KpiMetricValue)\nexport class KpiMetricValueMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'Create a new metric value with the provided details.' })\n async createKpiMetricValue(\n @Arg('metricValue', { description: 'Input object containing details for the new metric value.' })\n metricValue: NewKpiMetricValue,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n\n let metric = metricValue.metricId\n ? await getRepository(KpiMetric).findOne({ where: { id: metricValue.metricId } })\n : undefined\n\n // valueDate 자동 생성/보정 로직 추가\n let periodType = metricValue.periodType\n if (!periodType && metric) {\n periodType = metric.periodType\n }\n if (!periodType) {\n periodType = KpiPeriodType.DAY\n }\n // periodType을 string으로 변환 후 KpiPeriodType으로 강제 변환\n periodType = KpiPeriodType[String(periodType) as keyof typeof KpiPeriodType]\n let valueDate = metricValue.valueDate\n if (!valueDate || !isValueDateValidForPeriodType(valueDate, periodType)) {\n valueDate = getDefaultValueDate(periodType)\n }\n\n const entity: Partial<KpiMetricValue> = {\n metric,\n metricId: metricValue.metricId,\n valueDate,\n periodType,\n value: metricValue.value,\n group: metricValue.group,\n unit: metricValue.unit,\n meta: metricValue.meta,\n domain: domain,\n creator: user,\n updater: user\n }\n\n return await getRepository(KpiMetricValue, tx).save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'Record a metric value by metric name, value, meta, and group.' })\n async recordKpiMetricValue(\n @Arg('metricName', { description: 'Metric code/name.' }) metricName: string,\n @Arg('value', type => Float, { nullable: true, description: 'Metric value (number).' }) value: number | null,\n @Arg('meta', type => ScalarObject, { nullable: true, description: 'Extended or non-numeric information (JSON).' })\n meta: any,\n @Arg('group', { nullable: true, description: 'Group key for this value (organization, line, user, etc.)' })\n group: string | null,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n const metric = await getRepository(KpiMetric).findOne({ where: { name: metricName, domain: { id: domain.id } } })\n if (!metric) throw new Error(`Metric not found: ${metricName}`)\n const periodType = metric.periodType || KpiPeriodType.DAY\n const valueDate = getDefaultValueDate(periodType)\n if (value == null && meta == null) {\n throw new Error('Either value or meta must be provided.')\n }\n const repo = getRepository(KpiMetricValue, tx)\n let entity = await repo.findOne({\n where: {\n metric: { id: metric.id },\n valueDate,\n periodType,\n group,\n domain: { id: domain.id }\n }\n })\n if (entity) {\n entity.value = value\n entity.meta = meta\n entity.updater = user\n } else {\n entity = repo.create({\n metric,\n metricId: metric.id,\n value,\n meta,\n valueDate,\n periodType,\n group,\n domain,\n creator: user,\n updater: user\n })\n }\n return await repo.save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'To modify KpiMetricValue information' })\n async updateKpiMetricValue(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiMetricValuePatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiMetricValue, tx)\n const metricValue = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n let metric = patch.metricId\n ? await getRepository(KpiMetric).findOne({ where: { id: patch.metricId } })\n : metricValue.metric\n\n const entity: any = {\n ...metricValue,\n ...patch,\n metric,\n updater: user\n }\n\n return await repository.save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetricValue], { description: \"To modify multiple KpiMetricValues' information\" })\n async updateMultipleKpiMetricValue(\n @Arg('patches', type => [KpiMetricValuePatch]) patches: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag && patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag && patch.cuFlag.toUpperCase() === 'M')\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n if (!newRecord.metricId) {\n throw new Error('metricId is required for creating new metric value')\n }\n\n const metric = await getRepository(KpiMetric).findOne({\n where: { domain: { id: domain.id }, id: newRecord.metricId }\n })\n\n if (!metric) {\n throw new Error(`Metric not found: ${newRecord.metricId}`)\n }\n\n const result = await metricValueRepo.save({\n ...newRecord,\n metric,\n domain,\n creator: user,\n updater: user\n } as any)\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const metricValue = await metricValueRepo.findOneBy({ id: updateRecord.id })\n\n if (!updateRecord.metricId) {\n throw new Error('metricId is required for updating value')\n }\n\n const metric = await getRepository(KpiMetric).findOne({\n where: { domain: { id: domain.id }, id: updateRecord.metricId }\n })\n\n if (!metric) {\n throw new Error(`Metric not found: ${updateRecord.metricId}`)\n }\n\n const result = await metricValueRepo.save({\n ...metricValue,\n ...updateRecord,\n metric,\n updater: user\n } as any)\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete KpiMetricValue' })\n async deleteKpiMetricValue(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n await getRepository(KpiMetricValue, tx).delete({ domain: { id: domain.id }, id })\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiMetricValues' })\n async deleteKpiMetricValues(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n await getRepository(KpiMetricValue, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple KpiMetricValues' })\n async importKpiMetricValues(\n @Arg('metricValues', type => [KpiMetricValuePatch]) metricValues: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n await Promise.all(\n metricValues.map(async (metricValue: KpiMetricValuePatch) => {\n await getRepository(KpiMetricValue, tx).save({ domain, ...metricValue } as any)\n })\n )\n return true\n }\n}\n\n// valueDate와 periodType의 일치 여부를 검사하는 유틸리티 함수(임시, 아래에 추가)\nfunction isValueDateValidForPeriodType(valueDate: string, periodType: KpiPeriodType): boolean {\n if (!valueDate) return false\n switch (periodType) {\n case KpiPeriodType.DAY:\n return /^\\d{4}-\\d{2}-\\d{2}$/.test(valueDate)\n case KpiPeriodType.MONTH:\n return /^\\d{4}-\\d{2}$/.test(valueDate)\n case KpiPeriodType.QUARTER:\n return /^\\d{4}-Q[1-4]$/.test(valueDate)\n case KpiPeriodType.WEEK:\n return /^\\d{4}-W\\d{1,2}$/.test(valueDate)\n case KpiPeriodType.ALLTIME:\n return valueDate === 'ALLTIME'\n default:\n return true\n }\n}\n"]}
1
+ {"version":3,"file":"kpi-metric-value-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AACtE,qCAA4B;AAC5B,iDAAqD;AACrD,+CAAoC;AACpC,oCAA0C;AAE1C,yDAAmD;AACnD,mEAAgF;AAChF,yDAAoD;AACpD,iDAAoD;AACpD,8DAA8D;AAGvD,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAI3B,AAAN,KAAK,CAAC,oBAAoB,CAExB,WAA8B,EACvB,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,IAAI,MAAM,GAAG,WAAW,CAAC,QAAQ;YAC/B,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,sBAAS,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC;YACjF,CAAC,CAAC,SAAS,CAAA;QAEb,2BAA2B;QAC3B,IAAI,UAAU,GAAG,WAAW,CAAC,UAAU,CAAA;QACvC,IAAI,CAAC,UAAU,IAAI,MAAM,EAAE,CAAC;YAC1B,UAAU,GAAG,MAAM,CAAC,UAAU,CAAA;QAChC,CAAC;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,mBAAa,CAAC,GAAG,CAAA;QAChC,CAAC;QACD,kDAAkD;QAClD,UAAU,GAAG,mBAAa,CAAC,MAAM,CAAC,UAAU,CAA+B,CAAC,CAAA;QAC5E,IAAI,SAAS,GAAG,WAAW,CAAC,SAAS,CAAA;QACrC,IAAI,CAAC,SAAS,IAAI,CAAC,6BAA6B,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;YACxE,SAAS,GAAG,IAAA,qCAAmB,EAAC,UAAU,CAAC,CAAA;QAC7C,CAAC;QAED,MAAM,MAAM,GAA4B;YACtC,MAAM;YACN,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,SAAS;YACT,UAAU;YACV,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,GAAG,EAAE,WAAW,CAAC,GAAG;YACpB,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,CAAA;QAED,OAAO,MAAM,IAAA,qBAAa,EAAC,iCAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC7D,CAAC;IAKK,AAAN,KAAK,CAAC,oBAAoB,CACiC,UAAkB,EACa,KAAoB,EAE5G,IAAS,EAET,GAAkB,EACX,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,sBAAS,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACjH,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAA;QAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,mBAAa,CAAC,GAAG,CAAA;QACzD,MAAM,SAAS,GAAG,IAAA,qCAAmB,EAAC,UAAU,CAAC,CAAA;QACjD,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;QAC3D,CAAC;QACD,MAAM,IAAI,GAAG,IAAA,qBAAa,EAAC,iCAAc,EAAE,EAAE,CAAC,CAAA;QAC9C,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAC9B,KAAK,EAAE;gBACL,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;gBACzB,SAAS;gBACT,UAAU;gBACV,GAAG;gBACH,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;aAC1B;SACF,CAAC,CAAA;QACF,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;YACpB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAA;YAClB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBACnB,MAAM;gBACN,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,KAAK;gBACL,IAAI;gBACJ,SAAS;gBACT,UAAU;gBACV,GAAG;gBACH,MAAM;gBACN,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;aACd,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IAKK,AAAN,KAAK,CAAC,oBAAoB,CACb,EAAU,EACP,KAA0B,EACjC,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,iCAAc,EAAE,EAAE,CAAC,CAAA;QACpD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YAC3C,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;SACzC,CAAC,CAAA;QAEF,IAAI,MAAM,GAAG,KAAK,CAAC,QAAQ;YACzB,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,sBAAS,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC3E,CAAC,CAAC,WAAW,CAAC,MAAM,CAAA;QAEtB,MAAM,MAAM,GAAQ;YAClB,GAAG,WAAW;YACd,GAAG,KAAK;YACR,MAAM;YACN,OAAO,EAAE,IAAI;SACd,CAAA;QAED,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC;IAKK,AAAN,KAAK,CAAC,4BAA4B,CACe,OAA8B,EACtE,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAA;QACzG,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAA;QACzG,MAAM,eAAe,GAAG,IAAA,qBAAa,EAAC,iCAAc,EAAE,EAAE,CAAC,CAAA;QAEzD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;gBAEnC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;gBACvE,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,sBAAS,CAAC,CAAC,OAAO,CAAC;oBACpD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,QAAQ,EAAE;iBAC7D,CAAC,CAAA;gBAEF,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC5D,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC;oBACxC,GAAG,SAAS;oBACZ,MAAM;oBACN,MAAM;oBACN,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,IAAI;iBACP,CAAC,CAAA;gBACT,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;gBACtC,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAA;gBAE5E,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;oBAC3B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;gBAC5D,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,sBAAS,CAAC,CAAC,OAAO,CAAC;oBACpD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,QAAQ,EAAE;iBAChE,CAAC,CAAA;gBAEF,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC/D,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC;oBACxC,GAAG,WAAW;oBACd,GAAG,YAAY;oBACf,MAAM;oBACN,OAAO,EAAE,IAAI;iBACP,CAAC,CAAA;gBACT,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAKK,AAAN,KAAK,CAAC,oBAAoB,CAAY,EAAU,EAAS,OAAwB;QAC/E,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QACpC,MAAM,IAAA,qBAAa,EAAC,iCAAc,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACjF,OAAO,IAAI,CAAA;IACb,CAAC;IAKK,AAAN,KAAK,CAAC,qBAAqB,CACK,GAAa,EACpC,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QACpC,MAAM,IAAA,qBAAa,EAAC,iCAAc,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;YAC7C,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzB,EAAE,EAAE,IAAA,YAAE,EAAC,GAAG,CAAC;SACZ,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAKK,AAAN,KAAK,CAAC,qBAAqB,CAC2B,YAAmC,EAChF,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QACpC,MAAM,OAAO,CAAC,GAAG,CACf,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,WAAgC,EAAE,EAAE;YAC1D,MAAM,IAAA,qBAAa,EAAC,iCAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,WAAW,EAAS,CAAC,CAAA;QACjF,CAAC,CAAC,CACH,CAAA;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;AA7OY,wDAAsB;AAI3B;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,sGAAsG,CAAC;IACjH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,iCAAc,EAAE,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC;IAE1G,mBAAA,IAAA,kBAAG,EAAC,aAAa,EAAE,EAAE,WAAW,EAAE,2DAA2D,EAAE,CAAC,CAAA;IAEhG,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CADO,yCAAiB;;kEAuC/B;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,sGAAsG,CAAC;IACjH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,iCAAc,EAAE,EAAE,WAAW,EAAE,6DAA6D,EAAE,CAAC;IAEjH,mBAAA,IAAA,kBAAG,EAAC,YAAY,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC,CAAA;IACvD,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,oBAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC,CAAA;IACtF,mBAAA,IAAA,kBAAG,EAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAAC,CAAA;IAEjH,mBAAA,IAAA,kBAAG,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mFAAmF,EAAE,CAAC,CAAA;IAEhI,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;kEAuCP;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,sGAAsG,CAAC;IACjH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,iCAAc,EAAE,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;IAE1F,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IACT,mBAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IACZ,mBAAA,IAAA,kBAAG,GAAE,CAAA;;qDADe,2CAAmB;;kEAsBzC;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,sGAAsG,CAAC;IACjH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,iCAAc,CAAC,EAAE,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;IAEvG,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,2CAAmB,CAAC,CAAC,CAAA;IAC7C,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;0EAgEP;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,sGAAsG,CAAC;IACjH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC;IAC9C,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;kEAIvD;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,sGAAsG,CAAC;IACjH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC;IAEjF,mBAAA,IAAA,kBAAG,EAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;mEAQP;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,sGAAsG,CAAC;IACjH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC;IAEjF,mBAAA,IAAA,kBAAG,EAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,2CAAmB,CAAC,CAAC,CAAA;IAClD,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;mEASP;iCA5OU,sBAAsB;IADlC,IAAA,uBAAQ,EAAC,iCAAc,CAAC;GACZ,sBAAsB,CA6OlC;AAED,yDAAyD;AACzD,SAAS,6BAA6B,CAAC,SAAiB,EAAE,UAAyB;IACjF,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAA;IAC5B,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,mBAAa,CAAC,GAAG;YACpB,OAAO,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC9C,KAAK,mBAAa,CAAC,KAAK;YACtB,OAAO,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACxC,KAAK,mBAAa,CAAC,OAAO;YACxB,OAAO,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACzC,KAAK,mBAAa,CAAC,IAAI;YACrB,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3C,KAAK,mBAAa,CAAC,OAAO;YACxB,OAAO,SAAS,KAAK,SAAS,CAAA;QAChC;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\nimport { Float } from 'type-graphql'\nimport { KpiPeriodType } from '../kpi/kpi'\n\nimport { KpiMetricValue } from './kpi-metric-value'\nimport { NewKpiMetricValue, KpiMetricValuePatch } from './kpi-metric-value-type'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\nimport { ScalarObject } from '@things-factory/shell'\nimport { getDefaultValueDate } from '../utils/value-date-util'\n\n@Resolver(KpiMetricValue)\nexport class KpiMetricValueMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'Create a new metric value with the provided details.' })\n async createKpiMetricValue(\n @Arg('metricValue', { description: 'Input object containing details for the new metric value.' })\n metricValue: NewKpiMetricValue,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n\n let metric = metricValue.metricId\n ? await getRepository(KpiMetric).findOne({ where: { id: metricValue.metricId } })\n : undefined\n\n // valueDate 자동 생성/보정 로직 추가\n let periodType = metricValue.periodType\n if (!periodType && metric) {\n periodType = metric.periodType\n }\n if (!periodType) {\n periodType = KpiPeriodType.DAY\n }\n // periodType을 string으로 변환 후 KpiPeriodType으로 강제 변환\n periodType = KpiPeriodType[String(periodType) as keyof typeof KpiPeriodType]\n let valueDate = metricValue.valueDate\n if (!valueDate || !isValueDateValidForPeriodType(valueDate, periodType)) {\n valueDate = getDefaultValueDate(periodType)\n }\n\n const entity: Partial<KpiMetricValue> = {\n metric,\n metricId: metricValue.metricId,\n valueDate,\n periodType,\n value: metricValue.value,\n org: metricValue.org,\n unit: metricValue.unit,\n meta: metricValue.meta,\n domain: domain,\n creator: user,\n updater: user\n }\n\n return await getRepository(KpiMetricValue, tx).save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'Record a metric value by metric name, value, meta, and org.' })\n async recordKpiMetricValue(\n @Arg('metricName', { description: 'Metric code/name.' }) metricName: string,\n @Arg('value', type => Float, { nullable: true, description: 'Metric value (number).' }) value: number | null,\n @Arg('meta', type => ScalarObject, { nullable: true, description: 'Extended or non-numeric information (JSON).' })\n meta: any,\n @Arg('org', { nullable: true, description: 'Organizational unit for this value (project, department, company, employee, etc.)' })\n org: string | null,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n const metric = await getRepository(KpiMetric).findOne({ where: { name: metricName, domain: { id: domain.id } } })\n if (!metric) throw new Error(`Metric not found: ${metricName}`)\n const periodType = metric.periodType || KpiPeriodType.DAY\n const valueDate = getDefaultValueDate(periodType)\n if (value == null && meta == null) {\n throw new Error('Either value or meta must be provided.')\n }\n const repo = getRepository(KpiMetricValue, tx)\n let entity = await repo.findOne({\n where: {\n metric: { id: metric.id },\n valueDate,\n periodType,\n org,\n domain: { id: domain.id }\n }\n })\n if (entity) {\n entity.value = value\n entity.meta = meta\n entity.updater = user\n } else {\n entity = repo.create({\n metric,\n metricId: metric.id,\n value,\n meta,\n valueDate,\n periodType,\n org,\n domain,\n creator: user,\n updater: user\n })\n }\n return await repo.save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'To modify KpiMetricValue information' })\n async updateKpiMetricValue(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiMetricValuePatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiMetricValue, tx)\n const metricValue = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n let metric = patch.metricId\n ? await getRepository(KpiMetric).findOne({ where: { id: patch.metricId } })\n : metricValue.metric\n\n const entity: any = {\n ...metricValue,\n ...patch,\n metric,\n updater: user\n }\n\n return await repository.save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetricValue], { description: \"To modify multiple KpiMetricValues' information\" })\n async updateMultipleKpiMetricValue(\n @Arg('patches', type => [KpiMetricValuePatch]) patches: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag && patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag && patch.cuFlag.toUpperCase() === 'M')\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n if (!newRecord.metricId) {\n throw new Error('metricId is required for creating new metric value')\n }\n\n const metric = await getRepository(KpiMetric).findOne({\n where: { domain: { id: domain.id }, id: newRecord.metricId }\n })\n\n if (!metric) {\n throw new Error(`Metric not found: ${newRecord.metricId}`)\n }\n\n const result = await metricValueRepo.save({\n ...newRecord,\n metric,\n domain,\n creator: user,\n updater: user\n } as any)\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const metricValue = await metricValueRepo.findOneBy({ id: updateRecord.id })\n\n if (!updateRecord.metricId) {\n throw new Error('metricId is required for updating value')\n }\n\n const metric = await getRepository(KpiMetric).findOne({\n where: { domain: { id: domain.id }, id: updateRecord.metricId }\n })\n\n if (!metric) {\n throw new Error(`Metric not found: ${updateRecord.metricId}`)\n }\n\n const result = await metricValueRepo.save({\n ...metricValue,\n ...updateRecord,\n metric,\n updater: user\n } as any)\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete KpiMetricValue' })\n async deleteKpiMetricValue(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n await getRepository(KpiMetricValue, tx).delete({ domain: { id: domain.id }, id })\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiMetricValues' })\n async deleteKpiMetricValues(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n await getRepository(KpiMetricValue, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple KpiMetricValues' })\n async importKpiMetricValues(\n @Arg('metricValues', type => [KpiMetricValuePatch]) metricValues: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n await Promise.all(\n metricValues.map(async (metricValue: KpiMetricValuePatch) => {\n await getRepository(KpiMetricValue, tx).save({ domain, ...metricValue } as any)\n })\n )\n return true\n }\n}\n\n// valueDate와 periodType의 일치 여부를 검사하는 유틸리티 함수(임시, 아래에 추가)\nfunction isValueDateValidForPeriodType(valueDate: string, periodType: KpiPeriodType): boolean {\n if (!valueDate) return false\n switch (periodType) {\n case KpiPeriodType.DAY:\n return /^\\d{4}-\\d{2}-\\d{2}$/.test(valueDate)\n case KpiPeriodType.MONTH:\n return /^\\d{4}-\\d{2}$/.test(valueDate)\n case KpiPeriodType.QUARTER:\n return /^\\d{4}-Q[1-4]$/.test(valueDate)\n case KpiPeriodType.WEEK:\n return /^\\d{4}-W\\d{1,2}$/.test(valueDate)\n case KpiPeriodType.ALLTIME:\n return valueDate === 'ALLTIME'\n default:\n return true\n }\n}\n"]}
@@ -7,7 +7,7 @@ export declare class NewKpiMetricValue {
7
7
  value: number;
8
8
  unit?: string;
9
9
  meta?: any;
10
- group?: string;
10
+ org?: string;
11
11
  }
12
12
  export declare class KpiMetricValuePatch {
13
13
  id?: string;
@@ -17,7 +17,7 @@ export declare class KpiMetricValuePatch {
17
17
  value?: number;
18
18
  unit?: string;
19
19
  meta?: any;
20
- group?: string;
20
+ org?: string;
21
21
  cuFlag?: string;
22
22
  }
23
23
  export declare class KpiMetricValueList {
@@ -37,9 +37,9 @@ tslib_1.__decorate([
37
37
  tslib_1.__metadata("design:type", Object)
38
38
  ], NewKpiMetricValue.prototype, "meta", void 0);
39
39
  tslib_1.__decorate([
40
- (0, type_graphql_1.Field)({ nullable: true, description: 'Group key for this value (organization, line, user, etc.)' }),
40
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Organizational unit for this value (project, department, company, employee, etc.)' }),
41
41
  tslib_1.__metadata("design:type", String)
42
- ], NewKpiMetricValue.prototype, "group", void 0);
42
+ ], NewKpiMetricValue.prototype, "org", void 0);
43
43
  exports.NewKpiMetricValue = NewKpiMetricValue = tslib_1.__decorate([
44
44
  (0, type_graphql_1.InputType)({
45
45
  description: 'Input type for creating a new metric value. Used in mutations to provide metric value details.'
@@ -83,9 +83,9 @@ tslib_1.__decorate([
83
83
  tslib_1.__metadata("design:type", Object)
84
84
  ], KpiMetricValuePatch.prototype, "meta", void 0);
85
85
  tslib_1.__decorate([
86
- (0, type_graphql_1.Field)({ nullable: true, description: 'Group key for this value (organization, line, user, etc.)' }),
86
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Organizational unit for this value (project, department, company, employee, etc.)' }),
87
87
  tslib_1.__metadata("design:type", String)
88
- ], KpiMetricValuePatch.prototype, "group", void 0);
88
+ ], KpiMetricValuePatch.prototype, "org", void 0);
89
89
  tslib_1.__decorate([
90
90
  (0, type_graphql_1.Field)({ nullable: true, description: 'Custom flag for update operations (internal use).' }),
91
91
  tslib_1.__metadata("design:type", String)
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-metric-value-type.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-type.ts"],"names":[],"mappings":"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","sourcesContent":["import { ObjectType, Field, ID, Float, InputType, Int } from 'type-graphql'\nimport { ScalarObject } from '@things-factory/shell'\nimport { KpiMetricValue } from './kpi-metric-value'\nimport { KpiPeriodType } from '../kpi/kpi'\n\n@InputType({\n description: 'Input type for creating a new metric value. Used in mutations to provide metric value details.'\n})\nexport class NewKpiMetricValue {\n @Field(type => ID, { description: 'ID of the metric to which this value belongs.' })\n metricId: string\n\n @Field({ description: 'Date or period for which this metric value is recorded (e.g., day, month, quarter, range).' })\n valueDate: string\n\n @Field(type => KpiPeriodType, { description: 'Aggregation period type for this metric value.' })\n periodType: KpiPeriodType\n\n @Field(type => Float, { description: 'The value for this metric and period.' })\n value: number\n\n @Field({ nullable: true, description: 'Unit of measurement for this metric value.' })\n unit?: string\n\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Extended or non-numeric information related to this metric value, stored as JSON. Can include status, comments, or other metadata.'\n })\n meta?: any\n\n @Field({ nullable: true, description: 'Group key for this value (organization, line, user, etc.)' })\n group?: string\n}\n\n@InputType({\n description: 'Input type for updating an existing metric value. Used in mutations to patch metric value details.'\n})\nexport class KpiMetricValuePatch {\n @Field(type => ID, { nullable: true, description: 'ID of the metric value to update.' })\n id?: string\n\n @Field(type => ID, { nullable: true, description: 'ID of the metric to which this value belongs.' })\n metricId?: string\n\n @Field({\n nullable: true,\n description: 'Date or period for which this metric value is recorded (e.g., day, month, quarter, range).'\n })\n valueDate?: string\n\n @Field(type => KpiPeriodType, { nullable: true, description: 'Aggregation period type for this metric value.' })\n periodType?: KpiPeriodType\n\n @Field(type => Float, { nullable: true, description: 'The value for this metric and period.' })\n value?: number\n\n @Field({ nullable: true, description: 'Unit of measurement for this metric value.' })\n unit?: string\n\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Extended or non-numeric information related to this metric value, stored as JSON. Can include status, comments, or other metadata.'\n })\n meta?: any\n\n @Field({ nullable: true, description: 'Group key for this value (organization, line, user, etc.)' })\n group?: string\n\n @Field({ nullable: true, description: 'Custom flag for update operations (internal use).' })\n cuFlag?: string\n}\n\n@ObjectType()\nexport class KpiMetricValueList {\n @Field(type => [KpiMetricValue])\n items: KpiMetricValue[]\n\n @Field(type => Int)\n total: number\n}\n"]}
1
+ {"version":3,"file":"kpi-metric-value-type.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-type.ts"],"names":[],"mappings":"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","sourcesContent":["import { ObjectType, Field, ID, Float, InputType, Int } from 'type-graphql'\nimport { ScalarObject } from '@things-factory/shell'\nimport { KpiMetricValue } from './kpi-metric-value'\nimport { KpiPeriodType } from '../kpi/kpi'\n\n@InputType({\n description: 'Input type for creating a new metric value. Used in mutations to provide metric value details.'\n})\nexport class NewKpiMetricValue {\n @Field(type => ID, { description: 'ID of the metric to which this value belongs.' })\n metricId: string\n\n @Field({ description: 'Date or period for which this metric value is recorded (e.g., day, month, quarter, range).' })\n valueDate: string\n\n @Field(type => KpiPeriodType, { description: 'Aggregation period type for this metric value.' })\n periodType: KpiPeriodType\n\n @Field(type => Float, { description: 'The value for this metric and period.' })\n value: number\n\n @Field({ nullable: true, description: 'Unit of measurement for this metric value.' })\n unit?: string\n\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Extended or non-numeric information related to this metric value, stored as JSON. Can include status, comments, or other metadata.'\n })\n meta?: any\n\n @Field({ nullable: true, description: 'Organizational unit for this value (project, department, company, employee, etc.)' })\n org?: string\n}\n\n@InputType({\n description: 'Input type for updating an existing metric value. Used in mutations to patch metric value details.'\n})\nexport class KpiMetricValuePatch {\n @Field(type => ID, { nullable: true, description: 'ID of the metric value to update.' })\n id?: string\n\n @Field(type => ID, { nullable: true, description: 'ID of the metric to which this value belongs.' })\n metricId?: string\n\n @Field({\n nullable: true,\n description: 'Date or period for which this metric value is recorded (e.g., day, month, quarter, range).'\n })\n valueDate?: string\n\n @Field(type => KpiPeriodType, { nullable: true, description: 'Aggregation period type for this metric value.' })\n periodType?: KpiPeriodType\n\n @Field(type => Float, { nullable: true, description: 'The value for this metric and period.' })\n value?: number\n\n @Field({ nullable: true, description: 'Unit of measurement for this metric value.' })\n unit?: string\n\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Extended or non-numeric information related to this metric value, stored as JSON. Can include status, comments, or other metadata.'\n })\n meta?: any\n\n @Field({ nullable: true, description: 'Organizational unit for this value (project, department, company, employee, etc.)' })\n org?: string\n\n @Field({ nullable: true, description: 'Custom flag for update operations (internal use).' })\n cuFlag?: string\n}\n\n@ObjectType()\nexport class KpiMetricValueList {\n @Field(type => [KpiMetricValue])\n items: KpiMetricValue[]\n\n @Field(type => Int)\n total: number\n}\n"]}
@@ -12,7 +12,7 @@ export declare class KpiMetricValue {
12
12
  unit?: string;
13
13
  valueDate: string;
14
14
  periodType: KpiPeriodType;
15
- group?: string;
15
+ org?: string;
16
16
  meta?: any;
17
17
  createdAt?: Date;
18
18
  updatedAt?: Date;
@@ -61,9 +61,9 @@ tslib_1.__decorate([
61
61
  ], KpiMetricValue.prototype, "periodType", void 0);
62
62
  tslib_1.__decorate([
63
63
  (0, typeorm_1.Column)({ default: '' }),
64
- (0, type_graphql_1.Field)({ nullable: true, description: 'Group key for this value (organization, line, user, etc.)' }),
64
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Organizational unit for this value (project, department, company, employee, etc.)' }),
65
65
  tslib_1.__metadata("design:type", String)
66
- ], KpiMetricValue.prototype, "group", void 0);
66
+ ], KpiMetricValue.prototype, "org", void 0);
67
67
  tslib_1.__decorate([
68
68
  (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
69
69
  (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true }),
@@ -101,7 +101,7 @@ tslib_1.__decorate([
101
101
  ], KpiMetricValue.prototype, "updaterId", void 0);
102
102
  exports.KpiMetricValue = KpiMetricValue = tslib_1.__decorate([
103
103
  (0, typeorm_1.Entity)(),
104
- (0, typeorm_1.Index)('ix_kpi_metric_value_latest', ['domain', 'metric', 'valueDate', 'group'], { unique: true }),
104
+ (0, typeorm_1.Index)('ix_kpi_metric_value_latest', ['domain', 'metric', 'valueDate', 'org'], { unique: true }),
105
105
  (0, type_graphql_1.ObjectType)({ description: 'Current value for each KPI metric (can be used for both state and history).' })
106
106
  ], KpiMetricValue);
107
107
  //# sourceMappingURL=kpi-metric-value.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-metric-value.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n ManyToOne,\n Index,\n JoinColumn,\n CreateDateColumn,\n UpdateDateColumn,\n RelationId\n} from 'typeorm'\nimport { ObjectType, Field, ID, Float } from 'type-graphql'\nimport { Domain, ScalarObject } from '@things-factory/shell'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\nimport { KpiPeriodType } from '../kpi/kpi'\nimport { User } from '@things-factory/auth-base'\n\n@Entity()\n@Index('ix_kpi_metric_value_latest', ['domain', 'metric', 'valueDate', 'group'], { unique: true })\n@ObjectType({ description: 'Current value for each KPI metric (can be used for both state and history).' })\nexport class KpiMetricValue {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n id: string\n\n @ManyToOne(() => Domain)\n @Field(type => Domain, { nullable: true })\n domain?: Domain\n\n @RelationId((entity: KpiMetricValue) => entity.domain)\n @Field({ nullable: true })\n domainId?: string\n\n @ManyToOne(() => KpiMetric, { nullable: false, onDelete: 'CASCADE' })\n @JoinColumn({ name: 'metricId' })\n @Field(type => KpiMetric)\n metric: KpiMetric\n\n @RelationId((entity: KpiMetricValue) => entity.metric)\n @Field()\n metricId: string\n\n @Column('float')\n @Field(type => Float)\n value: number\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n unit?: string\n\n @Column()\n @Field({\n description:\n 'Date or period for which this metric value is recorded (e.g., day: YYYY-MM-DD, month: YYYY-MM, range: YYYY-MM-DD~YYYY-MM-DD).'\n })\n valueDate: string\n\n @Column({ default: 'DAY' })\n @Field(type => KpiPeriodType)\n periodType: KpiPeriodType\n\n @Column({ default: '' })\n @Field({ nullable: true, description: 'Group key for this value (organization, line, user, etc.)' })\n group?: string\n\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true })\n meta?: any\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(() => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((entity: KpiMetricValue) => entity.creator)\n @Field({ nullable: true })\n creatorId?: string\n\n @ManyToOne(() => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((entity: KpiMetricValue) => entity.updater)\n @Field({ nullable: true })\n updaterId?: string\n}\n"]}
1
+ {"version":3,"file":"kpi-metric-value.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n ManyToOne,\n Index,\n JoinColumn,\n CreateDateColumn,\n UpdateDateColumn,\n RelationId\n} from 'typeorm'\nimport { ObjectType, Field, ID, Float } from 'type-graphql'\nimport { Domain, ScalarObject } from '@things-factory/shell'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\nimport { KpiPeriodType } from '../kpi/kpi'\nimport { User } from '@things-factory/auth-base'\n\n@Entity()\n@Index('ix_kpi_metric_value_latest', ['domain', 'metric', 'valueDate', 'org'], { unique: true })\n@ObjectType({ description: 'Current value for each KPI metric (can be used for both state and history).' })\nexport class KpiMetricValue {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n id: string\n\n @ManyToOne(() => Domain)\n @Field(type => Domain, { nullable: true })\n domain?: Domain\n\n @RelationId((entity: KpiMetricValue) => entity.domain)\n @Field({ nullable: true })\n domainId?: string\n\n @ManyToOne(() => KpiMetric, { nullable: false, onDelete: 'CASCADE' })\n @JoinColumn({ name: 'metricId' })\n @Field(type => KpiMetric)\n metric: KpiMetric\n\n @RelationId((entity: KpiMetricValue) => entity.metric)\n @Field()\n metricId: string\n\n @Column('float')\n @Field(type => Float)\n value: number\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n unit?: string\n\n @Column()\n @Field({\n description:\n 'Date or period for which this metric value is recorded (e.g., day: YYYY-MM-DD, month: YYYY-MM, range: YYYY-MM-DD~YYYY-MM-DD).'\n })\n valueDate: string\n\n @Column({ default: 'DAY' })\n @Field(type => KpiPeriodType)\n periodType: KpiPeriodType\n\n @Column({ default: '' })\n @Field({ nullable: true, description: 'Organizational unit for this value (project, department, company, employee, etc.)' })\n org?: string\n\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true })\n meta?: any\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(() => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((entity: KpiMetricValue) => entity.creator)\n @Field({ nullable: true })\n creatorId?: string\n\n @ManyToOne(() => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((entity: KpiMetricValue) => entity.updater)\n @Field({ nullable: true })\n updaterId?: string\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export * from './kpi-org-scope';
2
+ export * from './kpi-org-scope-type';
3
+ export * from './kpi-org-scope-query';
4
+ export * from './kpi-org-scope-mutation';
5
+ import { KpiOrgScope } from './kpi-org-scope';
6
+ import { KpiOrgScopeQuery } from './kpi-org-scope-query';
7
+ import { KpiOrgScopeMutation } from './kpi-org-scope-mutation';
8
+ export declare const entities: (typeof KpiOrgScope)[];
9
+ export declare const resolvers: (typeof KpiOrgScopeQuery | typeof KpiOrgScopeMutation)[];
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const tslib_1 = require("tslib");
5
+ tslib_1.__exportStar(require("./kpi-org-scope"), exports);
6
+ tslib_1.__exportStar(require("./kpi-org-scope-type"), exports);
7
+ tslib_1.__exportStar(require("./kpi-org-scope-query"), exports);
8
+ tslib_1.__exportStar(require("./kpi-org-scope-mutation"), exports);
9
+ const kpi_org_scope_1 = require("./kpi-org-scope");
10
+ const kpi_org_scope_query_1 = require("./kpi-org-scope-query");
11
+ const kpi_org_scope_mutation_1 = require("./kpi-org-scope-mutation");
12
+ exports.entities = [kpi_org_scope_1.KpiOrgScope];
13
+ exports.resolvers = [kpi_org_scope_query_1.KpiOrgScopeQuery, kpi_org_scope_mutation_1.KpiOrgScopeMutation];
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/kpi-org-scope/index.ts"],"names":[],"mappings":";;;;AAAA,0DAA+B;AAC/B,+DAAoC;AACpC,gEAAqC;AACrC,mEAAwC;AAExC,mDAA6C;AAC7C,+DAAwD;AACxD,qEAA8D;AAEjD,QAAA,QAAQ,GAAG,CAAC,2BAAW,CAAC,CAAA;AACxB,QAAA,SAAS,GAAG,CAAC,sCAAgB,EAAE,4CAAmB,CAAC,CAAA","sourcesContent":["export * from './kpi-org-scope'\nexport * from './kpi-org-scope-type'\nexport * from './kpi-org-scope-query'\nexport * from './kpi-org-scope-mutation'\n\nimport { KpiOrgScope } from './kpi-org-scope'\nimport { KpiOrgScopeQuery } from './kpi-org-scope-query'\nimport { KpiOrgScopeMutation } from './kpi-org-scope-mutation'\n\nexport const entities = [KpiOrgScope]\nexport const resolvers = [KpiOrgScopeQuery, KpiOrgScopeMutation]"]}
@@ -0,0 +1,8 @@
1
+ import { KpiOrgScope } from './kpi-org-scope';
2
+ import { NewKpiOrgScope, KpiOrgScopePatch } from './kpi-org-scope-type';
3
+ export declare class KpiOrgScopeMutation {
4
+ createKpiOrgScope(kpiOrgScope: NewKpiOrgScope, context: ResolverContext): Promise<KpiOrgScope>;
5
+ updateMultipleKpiOrgScope(patches: KpiOrgScopePatch[], context: ResolverContext): Promise<KpiOrgScope[]>;
6
+ deleteKpiOrgScopes(ids: string[], context: ResolverContext): Promise<boolean>;
7
+ bulkUpsertKpiOrgScopes(orgScopes: NewKpiOrgScope[], context: ResolverContext): Promise<KpiOrgScope[]>;
8
+ }