@things-factory/kpi 1.0.0-alpha.5 → 9.0.9

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 (309) hide show
  1. package/README.md +74 -0
  2. package/client/pages/kpi/kpi-list-page.ts +97 -47
  3. package/client/pages/kpi/kpi-overview-sample.ts +260 -0
  4. package/client/pages/kpi/kpi-overview.ts +271 -0
  5. package/client/pages/kpi-category/kpi-category-list-page.ts +39 -50
  6. package/client/pages/kpi-dashboard/kpi-alert-panel.ts +114 -0
  7. package/client/pages/kpi-dashboard/kpi-dashboard.ts +285 -0
  8. package/client/pages/kpi-dashboard/kpi-grade-visualization.ts +75 -0
  9. package/client/pages/kpi-dashboard/kpi-history-viewer.ts +58 -0
  10. package/client/pages/kpi-dashboard/kpi-list-summary.ts +100 -0
  11. package/client/pages/kpi-dashboard/kpi-performance-summary.ts +124 -0
  12. package/client/pages/kpi-dashboard/kpi-value-entry.ts +78 -0
  13. package/client/pages/kpi-grade/kpi-grade-list-page.ts +58 -68
  14. package/client/pages/kpi-history/kpi-history-list-page.ts +146 -0
  15. package/client/pages/kpi-metric/kpi-metric-list-page.ts +67 -63
  16. package/client/pages/kpi-value/kpi-value-list-page.ts +73 -72
  17. package/client/pages/kpi-value/kpi-value-manual-entry-form.ts +168 -0
  18. package/client/pages/kpi-value/kpi-value-manual-entry-page.ts +173 -0
  19. package/client/route.ts +35 -0
  20. package/dist-client/pages/kpi/kpi-importer.js +16 -17
  21. package/dist-client/pages/kpi/kpi-importer.js.map +1 -1
  22. package/dist-client/pages/kpi/kpi-list-page.js +128 -68
  23. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
  24. package/dist-client/pages/kpi/kpi-overview-sample.d.ts +36 -0
  25. package/dist-client/pages/kpi/kpi-overview-sample.js +264 -0
  26. package/dist-client/pages/kpi/kpi-overview-sample.js.map +1 -0
  27. package/dist-client/pages/kpi/kpi-overview.d.ts +14 -0
  28. package/dist-client/pages/kpi/kpi-overview.js +290 -0
  29. package/dist-client/pages/kpi/kpi-overview.js.map +1 -0
  30. package/dist-client/pages/kpi-category/kpi-category-importer.js +16 -17
  31. package/dist-client/pages/kpi-category/kpi-category-importer.js.map +1 -1
  32. package/dist-client/pages/kpi-category/kpi-category-list-page.js +70 -71
  33. package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +1 -1
  34. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
  35. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +128 -0
  36. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
  37. package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +24 -0
  38. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +305 -0
  39. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -0
  40. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +12 -0
  41. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +82 -0
  42. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +1 -0
  43. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +11 -0
  44. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +65 -0
  45. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +1 -0
  46. package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +13 -0
  47. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +115 -0
  48. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +1 -0
  49. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +15 -0
  50. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +139 -0
  51. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -0
  52. package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +7 -0
  53. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +86 -0
  54. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +1 -0
  55. package/dist-client/pages/kpi-grade/kpi-grade-importer.js +16 -17
  56. package/dist-client/pages/kpi-grade/kpi-grade-importer.js.map +1 -1
  57. package/dist-client/pages/kpi-grade/kpi-grade-list-page.js +89 -89
  58. package/dist-client/pages/kpi-grade/kpi-grade-list-page.js.map +1 -1
  59. package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +16 -0
  60. package/dist-client/pages/kpi-history/kpi-history-list-page.js +155 -0
  61. package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -0
  62. package/dist-client/pages/kpi-metric/kpi-metric-importer.js +16 -17
  63. package/dist-client/pages/kpi-metric/kpi-metric-importer.js.map +1 -1
  64. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +98 -84
  65. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
  66. package/dist-client/pages/kpi-value/kpi-value-importer.js +16 -17
  67. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +1 -1
  68. package/dist-client/pages/kpi-value/kpi-value-list-page.js +104 -93
  69. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
  70. package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.d.ts +14 -0
  71. package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.js +201 -0
  72. package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.js.map +1 -0
  73. package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.d.ts +41 -0
  74. package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.js +180 -0
  75. package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.js.map +1 -0
  76. package/dist-client/route.d.ts +1 -1
  77. package/dist-client/route.js +27 -0
  78. package/dist-client/route.js.map +1 -1
  79. package/dist-client/tsconfig.tsbuildinfo +1 -1
  80. package/dist-server/index.d.ts +2 -1
  81. package/dist-server/index.js +2 -1
  82. package/dist-server/index.js.map +1 -1
  83. package/dist-server/migrations/1752188906708-SeedKpiCategory.d.ts +5 -0
  84. package/dist-server/migrations/1752188906708-SeedKpiCategory.js +56 -0
  85. package/dist-server/migrations/1752188906708-SeedKpiCategory.js.map +1 -0
  86. package/dist-server/migrations/1752190849681-SeedKpi.d.ts +5 -0
  87. package/dist-server/migrations/1752190849681-SeedKpi.js +107 -0
  88. package/dist-server/migrations/1752190849681-SeedKpi.js.map +1 -0
  89. package/dist-server/migrations/1752191090459-SeedKpiGrade.d.ts +5 -0
  90. package/dist-server/migrations/1752191090459-SeedKpiGrade.js +271 -0
  91. package/dist-server/migrations/1752191090459-SeedKpiGrade.js.map +1 -0
  92. package/dist-server/migrations/index.d.ts +1 -0
  93. package/dist-server/migrations/index.js +12 -0
  94. package/dist-server/migrations/index.js.map +1 -0
  95. package/dist-server/routes.d.ts +1 -0
  96. package/dist-server/routes.js +48 -0
  97. package/dist-server/routes.js.map +1 -1
  98. package/dist-server/service/index.d.ts +3 -4
  99. package/dist-server/service/index.js +4 -6
  100. package/dist-server/service/index.js.map +1 -1
  101. package/dist-server/service/kpi/aggregate-kpi.d.ts +8 -0
  102. package/dist-server/service/kpi/aggregate-kpi.js +88 -0
  103. package/dist-server/service/kpi/aggregate-kpi.js.map +1 -0
  104. package/dist-server/service/kpi/event-subscriber.d.ts +2 -0
  105. package/dist-server/service/kpi/event-subscriber.js +10 -0
  106. package/dist-server/service/kpi/event-subscriber.js.map +1 -1
  107. package/dist-server/service/kpi/index.d.ts +2 -1
  108. package/dist-server/service/kpi/kpi-formula.service.d.ts +24 -0
  109. package/dist-server/service/kpi/kpi-formula.service.js +64 -0
  110. package/dist-server/service/kpi/kpi-formula.service.js.map +1 -0
  111. package/dist-server/service/kpi/kpi-history.d.ts +6 -2
  112. package/dist-server/service/kpi/kpi-history.js +29 -11
  113. package/dist-server/service/kpi/kpi-history.js.map +1 -1
  114. package/dist-server/service/kpi/kpi-mutation.d.ts +2 -0
  115. package/dist-server/service/kpi/kpi-mutation.js +215 -10
  116. package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
  117. package/dist-server/service/kpi/kpi-query.d.ts +10 -0
  118. package/dist-server/service/kpi/kpi-query.js +87 -3
  119. package/dist-server/service/kpi/kpi-query.js.map +1 -1
  120. package/dist-server/service/kpi/kpi-type.d.ts +14 -3
  121. package/dist-server/service/kpi/kpi-type.js +81 -18
  122. package/dist-server/service/kpi/kpi-type.js.map +1 -1
  123. package/dist-server/service/kpi/kpi.d.ts +14 -3
  124. package/dist-server/service/kpi/kpi.js +96 -19
  125. package/dist-server/service/kpi/kpi.js.map +1 -1
  126. package/dist-server/service/kpi-alert/index.d.ts +2 -0
  127. package/dist-server/service/kpi-alert/index.js +6 -0
  128. package/dist-server/service/kpi-alert/index.js.map +1 -0
  129. package/dist-server/service/kpi-alert/kpi-alert-query.d.ts +4 -0
  130. package/dist-server/service/kpi-alert/kpi-alert-query.js +71 -0
  131. package/dist-server/service/kpi-alert/kpi-alert-query.js.map +1 -0
  132. package/dist-server/service/kpi-alert/kpi-alert-type.d.ts +8 -0
  133. package/dist-server/service/kpi-alert/kpi-alert-type.js +33 -0
  134. package/dist-server/service/kpi-alert/kpi-alert-type.js.map +1 -0
  135. package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +1 -1
  136. package/dist-server/service/kpi-category/kpi-category-mutation.js +36 -10
  137. package/dist-server/service/kpi-category/kpi-category-mutation.js.map +1 -1
  138. package/dist-server/service/kpi-category/kpi-category-query.d.ts +2 -0
  139. package/dist-server/service/kpi-category/kpi-category-query.js +18 -2
  140. package/dist-server/service/kpi-category/kpi-category-query.js.map +1 -1
  141. package/dist-server/service/kpi-category/kpi-category-type.d.ts +3 -5
  142. package/dist-server/service/kpi-category/kpi-category-type.js +16 -20
  143. package/dist-server/service/kpi-category/kpi-category-type.js.map +1 -1
  144. package/dist-server/service/kpi-category/kpi-category.d.ts +7 -9
  145. package/dist-server/service/kpi-category/kpi-category.js +40 -38
  146. package/dist-server/service/kpi-category/kpi-category.js.map +1 -1
  147. package/dist-server/service/kpi-grade/index.d.ts +1 -2
  148. package/dist-server/service/kpi-grade/index.js +2 -4
  149. package/dist-server/service/kpi-grade/index.js.map +1 -1
  150. package/dist-server/service/kpi-grade/kpi-grade-mutation.d.ts +1 -1
  151. package/dist-server/service/kpi-grade/kpi-grade-mutation.js +33 -10
  152. package/dist-server/service/kpi-grade/kpi-grade-mutation.js.map +1 -1
  153. package/dist-server/service/kpi-grade/kpi-grade-query.js +2 -2
  154. package/dist-server/service/kpi-grade/kpi-grade-query.js.map +1 -1
  155. package/dist-server/service/kpi-grade/kpi-grade-type.d.ts +13 -4
  156. package/dist-server/service/kpi-grade/kpi-grade-type.js +54 -18
  157. package/dist-server/service/kpi-grade/kpi-grade-type.js.map +1 -1
  158. package/dist-server/service/kpi-grade/kpi-grade.d.ts +8 -8
  159. package/dist-server/service/kpi-grade/kpi-grade.js +48 -40
  160. package/dist-server/service/kpi-grade/kpi-grade.js.map +1 -1
  161. package/dist-server/service/kpi-metric/aggregate-kpi-metric.d.ts +8 -0
  162. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +134 -0
  163. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -0
  164. package/dist-server/service/kpi-metric/index.d.ts +1 -2
  165. package/dist-server/service/kpi-metric/index.js +2 -4
  166. package/dist-server/service/kpi-metric/index.js.map +1 -1
  167. package/dist-server/service/kpi-metric/kpi-metric-mutation.d.ts +1 -1
  168. package/dist-server/service/kpi-metric/kpi-metric-mutation.js +139 -13
  169. package/dist-server/service/kpi-metric/kpi-metric-mutation.js.map +1 -1
  170. package/dist-server/service/kpi-metric/kpi-metric-query.js +3 -3
  171. package/dist-server/service/kpi-metric/kpi-metric-query.js.map +1 -1
  172. package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +17 -4
  173. package/dist-server/service/kpi-metric/kpi-metric-type.js +69 -11
  174. package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -1
  175. package/dist-server/service/kpi-metric/kpi-metric.d.ts +11 -8
  176. package/dist-server/service/kpi-metric/kpi-metric.js +62 -37
  177. package/dist-server/service/kpi-metric/kpi-metric.js.map +1 -1
  178. package/dist-server/service/kpi-value/kpi-value-mutation.js +66 -11
  179. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
  180. package/dist-server/service/kpi-value/kpi-value-query.d.ts +2 -0
  181. package/dist-server/service/kpi-value/kpi-value-query.js +15 -2
  182. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
  183. package/dist-server/service/kpi-value/kpi-value-type.d.ts +19 -10
  184. package/dist-server/service/kpi-value/kpi-value-type.js +87 -24
  185. package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
  186. package/dist-server/service/kpi-value/kpi-value.d.ts +15 -9
  187. package/dist-server/service/kpi-value/kpi-value.js +86 -32
  188. package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
  189. package/dist-server/tsconfig.tsbuildinfo +1 -1
  190. package/implement-plan/01-entity-type-resolver.md +57 -0
  191. package/implement-plan/02-dataset-integration.md +35 -0
  192. package/implement-plan/03-kpivalue-automation.md +34 -0
  193. package/implement-plan/04-version-history.md +33 -0
  194. package/implement-plan/05-grade-visualization.md +33 -0
  195. package/implement-plan/06-graphql-frontend.md +30 -0
  196. package/implement-plan/07-test-docs.md +35 -0
  197. package/implement-plan/TODO.md +41 -0
  198. package/package.json +18 -6
  199. package/server/index.ts +2 -1
  200. package/server/migrations/1752188906708-SeedKpiCategory.ts +61 -0
  201. package/server/migrations/1752190849681-SeedKpi.ts +112 -0
  202. package/server/migrations/1752191090459-SeedKpiGrade.ts +270 -0
  203. package/server/migrations/index.ts +9 -0
  204. package/server/routes.ts +55 -0
  205. package/server/service/index.ts +4 -6
  206. package/server/service/kpi/aggregate-kpi.ts +82 -0
  207. package/server/service/kpi/event-subscriber.ts +12 -0
  208. package/server/service/kpi/kpi-formula.service.ts +63 -0
  209. package/server/service/kpi/kpi-history.ts +29 -21
  210. package/server/service/kpi/kpi-mutation.ts +194 -12
  211. package/server/service/kpi/kpi-query.ts +57 -2
  212. package/server/service/kpi/kpi-type.ts +72 -19
  213. package/server/service/kpi/kpi.ts +96 -20
  214. package/server/service/kpi-alert/index.ts +3 -0
  215. package/server/service/kpi-alert/kpi-alert-query.ts +59 -0
  216. package/server/service/kpi-alert/kpi-alert-type.ts +20 -0
  217. package/server/service/kpi-category/kpi-category-mutation.ts +17 -4
  218. package/server/service/kpi-category/kpi-category-query.ts +20 -3
  219. package/server/service/kpi-category/kpi-category-type.ts +17 -19
  220. package/server/service/kpi-category/kpi-category.ts +39 -37
  221. package/server/service/kpi-grade/index.ts +2 -4
  222. package/server/service/kpi-grade/kpi-grade-mutation.ts +13 -4
  223. package/server/service/kpi-grade/kpi-grade-query.ts +5 -2
  224. package/server/service/kpi-grade/kpi-grade-type.ts +46 -19
  225. package/server/service/kpi-grade/kpi-grade.ts +44 -38
  226. package/server/service/kpi-metric/aggregate-kpi-metric.ts +128 -0
  227. package/server/service/kpi-metric/index.ts +2 -4
  228. package/server/service/kpi-metric/kpi-metric-mutation.ts +123 -7
  229. package/server/service/kpi-metric/kpi-metric-query.ts +9 -3
  230. package/server/service/kpi-metric/kpi-metric-type.ts +56 -13
  231. package/server/service/kpi-metric/kpi-metric.ts +55 -35
  232. package/server/service/kpi-value/kpi-value-mutation.ts +52 -14
  233. package/server/service/kpi-value/kpi-value-query.ts +12 -2
  234. package/server/service/kpi-value/kpi-value-type.ts +80 -25
  235. package/server/service/kpi-value/kpi-value.ts +81 -29
  236. package/things-factory.config.js +12 -4
  237. package/translations/en.json +12 -1
  238. package/translations/ja.json +12 -1
  239. package/translations/ko.json +12 -1
  240. package/translations/ms.json +12 -1
  241. package/translations/zh.json +12 -1
  242. package/client/pages/kpe-metric/kpe-metric-importer.ts +0 -90
  243. package/client/pages/kpe-metric/kpe-metric-list-page.ts +0 -398
  244. package/client/pages/kpi-formula/kpi-formula-importer.ts +0 -90
  245. package/client/pages/kpi-formula/kpi-formula-list-page.ts +0 -398
  246. package/client/pages/metric/metric-importer.ts +0 -90
  247. package/client/pages/metric/metric-list-page.ts +0 -398
  248. package/dist-client/pages/kpe-metric/kpe-metric-importer.d.ts +0 -23
  249. package/dist-client/pages/kpe-metric/kpe-metric-importer.js +0 -93
  250. package/dist-client/pages/kpe-metric/kpe-metric-importer.js.map +0 -1
  251. package/dist-client/pages/kpe-metric/kpe-metric-list-page.d.ts +0 -66
  252. package/dist-client/pages/kpe-metric/kpe-metric-list-page.js +0 -370
  253. package/dist-client/pages/kpe-metric/kpe-metric-list-page.js.map +0 -1
  254. package/dist-client/pages/kpi-formula/kpi-formula-importer.d.ts +0 -23
  255. package/dist-client/pages/kpi-formula/kpi-formula-importer.js +0 -93
  256. package/dist-client/pages/kpi-formula/kpi-formula-importer.js.map +0 -1
  257. package/dist-client/pages/kpi-formula/kpi-formula-list-page.d.ts +0 -66
  258. package/dist-client/pages/kpi-formula/kpi-formula-list-page.js +0 -370
  259. package/dist-client/pages/kpi-formula/kpi-formula-list-page.js.map +0 -1
  260. package/dist-client/pages/metric/metric-importer.d.ts +0 -23
  261. package/dist-client/pages/metric/metric-importer.js +0 -93
  262. package/dist-client/pages/metric/metric-importer.js.map +0 -1
  263. package/dist-client/pages/metric/metric-list-page.d.ts +0 -66
  264. package/dist-client/pages/metric/metric-list-page.js +0 -370
  265. package/dist-client/pages/metric/metric-list-page.js.map +0 -1
  266. package/dist-server/service/kpi-formula/event-subscriber.d.ts +0 -7
  267. package/dist-server/service/kpi-formula/event-subscriber.js +0 -21
  268. package/dist-server/service/kpi-formula/event-subscriber.js.map +0 -1
  269. package/dist-server/service/kpi-formula/index.d.ts +0 -7
  270. package/dist-server/service/kpi-formula/index.js +0 -12
  271. package/dist-server/service/kpi-formula/index.js.map +0 -1
  272. package/dist-server/service/kpi-formula/kpi-formula-history.d.ts +0 -25
  273. package/dist-server/service/kpi-formula/kpi-formula-history.js +0 -128
  274. package/dist-server/service/kpi-formula/kpi-formula-history.js.map +0 -1
  275. package/dist-server/service/kpi-formula/kpi-formula-mutation.d.ts +0 -10
  276. package/dist-server/service/kpi-formula/kpi-formula-mutation.js +0 -128
  277. package/dist-server/service/kpi-formula/kpi-formula-mutation.js.map +0 -1
  278. package/dist-server/service/kpi-formula/kpi-formula-query.d.ts +0 -11
  279. package/dist-server/service/kpi-formula/kpi-formula-query.js +0 -79
  280. package/dist-server/service/kpi-formula/kpi-formula-query.js.map +0 -1
  281. package/dist-server/service/kpi-formula/kpi-formula-type.d.ts +0 -20
  282. package/dist-server/service/kpi-formula/kpi-formula-type.js +0 -77
  283. package/dist-server/service/kpi-formula/kpi-formula-type.js.map +0 -1
  284. package/dist-server/service/kpi-formula/kpi-formula.d.ts +0 -24
  285. package/dist-server/service/kpi-formula/kpi-formula.js +0 -109
  286. package/dist-server/service/kpi-formula/kpi-formula.js.map +0 -1
  287. package/dist-server/service/kpi-grade/event-subscriber.d.ts +0 -7
  288. package/dist-server/service/kpi-grade/event-subscriber.js +0 -21
  289. package/dist-server/service/kpi-grade/event-subscriber.js.map +0 -1
  290. package/dist-server/service/kpi-grade/kpi-grade-history.d.ts +0 -25
  291. package/dist-server/service/kpi-grade/kpi-grade-history.js +0 -128
  292. package/dist-server/service/kpi-grade/kpi-grade-history.js.map +0 -1
  293. package/dist-server/service/kpi-metric/event-subscriber.d.ts +0 -7
  294. package/dist-server/service/kpi-metric/event-subscriber.js +0 -21
  295. package/dist-server/service/kpi-metric/event-subscriber.js.map +0 -1
  296. package/dist-server/service/kpi-metric/kpi-metric-history.d.ts +0 -25
  297. package/dist-server/service/kpi-metric/kpi-metric-history.js +0 -128
  298. package/dist-server/service/kpi-metric/kpi-metric-history.js.map +0 -1
  299. package/server/service/kpi-formula/event-subscriber.ts +0 -17
  300. package/server/service/kpi-formula/index.ts +0 -9
  301. package/server/service/kpi-formula/kpi-formula-history.ts +0 -116
  302. package/server/service/kpi-formula/kpi-formula-mutation.ts +0 -137
  303. package/server/service/kpi-formula/kpi-formula-query.ts +0 -48
  304. package/server/service/kpi-formula/kpi-formula-type.ts +0 -55
  305. package/server/service/kpi-formula/kpi-formula.ts +0 -95
  306. package/server/service/kpi-grade/event-subscriber.ts +0 -17
  307. package/server/service/kpi-grade/kpi-grade-history.ts +0 -116
  308. package/server/service/kpi-metric/event-subscriber.ts +0 -17
  309. package/server/service/kpi-metric/kpi-metric-history.ts +0 -116
@@ -1,7 +1,5 @@
1
1
  export * from './kpi/kpi';
2
2
  export * from './kpi/kpi-type';
3
- export * from './kpi-formula/kpi-formula';
4
- export * from './kpi-formula/kpi-formula-type';
5
3
  export * from './kpi-category/kpi-category';
6
4
  export * from './kpi-category/kpi-category-type';
7
5
  export * from './kpi-grade/kpi-grade';
@@ -10,7 +8,8 @@ export * from './kpi-value/kpi-value';
10
8
  export * from './kpi-value/kpi-value-type';
11
9
  export * from './kpi-metric/kpi-metric';
12
10
  export * from './kpi-metric/kpi-metric-type';
13
- export declare const entities: (typeof import("./kpi/kpi").Kpi | typeof import("./kpi-formula/kpi-formula").KpiFormula | typeof import("./kpi-category/kpi-category").KpiCategory | typeof import("./kpi-grade/kpi-grade").KpiGrade | typeof import("./kpi-value/kpi-value").KpiValue | typeof import("./kpi-metric/kpi-metric").KpiMetric)[];
11
+ export * from './kpi-alert';
12
+ export declare const entities: (typeof import("./kpi-category/kpi-category").KpiCategory | typeof import("./kpi/kpi").Kpi | typeof import("./kpi-grade/kpi-grade").KpiGrade | typeof import("./kpi-value/kpi-value").KpiValue | typeof import("./kpi-metric/kpi-metric").KpiMetric | typeof import("./kpi/kpi-history").KpiHistory)[];
14
13
  export declare const schema: {
15
- resolverClasses: (typeof import("./kpi/kpi-query").KpiQuery | typeof import("./kpi/kpi-mutation").KpiMutation | typeof import("./kpi-formula/kpi-formula-query").KpiFormulaQuery | typeof import("./kpi-formula/kpi-formula-mutation").KpiFormulaMutation | typeof import("./kpi-category/kpi-category-query").KpiCategoryQuery | typeof import("./kpi-category/kpi-category-mutation").KpiCategoryMutation | typeof import("./kpi-grade/kpi-grade-query").KpiGradeQuery | typeof import("./kpi-grade/kpi-grade-mutation").KpiGradeMutation | typeof import("./kpi-value/kpi-value-query").KpiValueQuery | typeof import("./kpi-value/kpi-value-mutation").KpiValueMutation | typeof import("./kpi-metric/kpi-metric-query").KpiMetricQuery | typeof import("./kpi-metric/kpi-metric-mutation").KpiMetricMutation)[];
14
+ resolverClasses: (typeof import("./kpi-alert/kpi-alert-query").KpiAlertQuery | typeof import("./kpi/kpi-query").KpiQuery | typeof import("./kpi/kpi-mutation").KpiMutation | typeof import("./kpi-category/kpi-category-query").KpiCategoryQuery | typeof import("./kpi-category/kpi-category-mutation").KpiCategoryMutation | typeof import("./kpi-grade/kpi-grade-query").KpiGradeQuery | typeof import("./kpi-grade/kpi-grade-mutation").KpiGradeMutation | typeof import("./kpi-value/kpi-value-query").KpiValueQuery | typeof import("./kpi-value/kpi-value-mutation").KpiValueMutation | typeof import("./kpi-metric/kpi-metric-query").KpiMetricQuery | typeof import("./kpi-metric/kpi-metric-mutation").KpiMetricMutation)[];
16
15
  };
@@ -5,8 +5,6 @@ const tslib_1 = require("tslib");
5
5
  /* EXPORT ENTITY TYPES */
6
6
  tslib_1.__exportStar(require("./kpi/kpi"), exports);
7
7
  tslib_1.__exportStar(require("./kpi/kpi-type"), exports);
8
- tslib_1.__exportStar(require("./kpi-formula/kpi-formula"), exports);
9
- tslib_1.__exportStar(require("./kpi-formula/kpi-formula-type"), exports);
10
8
  tslib_1.__exportStar(require("./kpi-category/kpi-category"), exports);
11
9
  tslib_1.__exportStar(require("./kpi-category/kpi-category-type"), exports);
12
10
  tslib_1.__exportStar(require("./kpi-grade/kpi-grade"), exports);
@@ -15,17 +13,17 @@ tslib_1.__exportStar(require("./kpi-value/kpi-value"), exports);
15
13
  tslib_1.__exportStar(require("./kpi-value/kpi-value-type"), exports);
16
14
  tslib_1.__exportStar(require("./kpi-metric/kpi-metric"), exports);
17
15
  tslib_1.__exportStar(require("./kpi-metric/kpi-metric-type"), exports);
16
+ tslib_1.__exportStar(require("./kpi-alert"), exports);
18
17
  /* IMPORT ENTITIES AND RESOLVERS */
19
18
  const kpi_1 = require("./kpi");
20
- const kpi_formula_1 = require("./kpi-formula");
21
19
  const kpi_category_1 = require("./kpi-category");
22
20
  const kpi_grade_1 = require("./kpi-grade");
23
21
  const kpi_value_1 = require("./kpi-value");
24
22
  const kpi_metric_1 = require("./kpi-metric");
23
+ const kpi_alert_1 = require("./kpi-alert");
25
24
  exports.entities = [
26
25
  /* ENTITIES */
27
26
  ...kpi_1.entities,
28
- ...kpi_formula_1.entities,
29
27
  ...kpi_category_1.entities,
30
28
  ...kpi_grade_1.entities,
31
29
  ...kpi_value_1.entities,
@@ -35,11 +33,11 @@ exports.schema = {
35
33
  resolverClasses: [
36
34
  /* RESOLVER CLASSES */
37
35
  ...kpi_1.resolvers,
38
- ...kpi_formula_1.resolvers,
39
36
  ...kpi_category_1.resolvers,
40
37
  ...kpi_grade_1.resolvers,
41
38
  ...kpi_value_1.resolvers,
42
- ...kpi_metric_1.resolvers
39
+ ...kpi_metric_1.resolvers,
40
+ ...kpi_alert_1.resolvers
43
41
  ]
44
42
  };
45
43
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,oDAAyB;AACzB,yDAA8B;AAC9B,oEAAyC;AACzC,yEAA8C;AAC9C,sEAA2C;AAC3C,2EAAgD;AAChD,gEAAqC;AACrC,qEAA0C;AAC1C,gEAAqC;AACrC,qEAA0C;AAC1C,kEAAuC;AACvC,uEAA4C;AAE5C,mCAAmC;AACnC,+BAA0E;AAC1E,+CAAgG;AAChG,iDAAmG;AACnG,2CAA0F;AAC1F,2CAA0F;AAC1F,6CAA6F;AAEhF,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,cAAW;IACd,GAAG,sBAAkB;IACrB,GAAG,uBAAmB;IACtB,GAAG,oBAAgB;IACnB,GAAG,oBAAgB;IACnB,GAAG,qBAAiB;CACrB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,eAAY;QACf,GAAG,uBAAmB;QACtB,GAAG,wBAAoB;QACvB,GAAG,qBAAiB;QACpB,GAAG,qBAAiB;QACpB,GAAG,sBAAkB;KACtB;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './kpi/kpi'\nexport * from './kpi/kpi-type'\nexport * from './kpi-formula/kpi-formula'\nexport * from './kpi-formula/kpi-formula-type'\nexport * from './kpi-category/kpi-category'\nexport * from './kpi-category/kpi-category-type'\nexport * from './kpi-grade/kpi-grade'\nexport * from './kpi-grade/kpi-grade-type'\nexport * from './kpi-value/kpi-value'\nexport * from './kpi-value/kpi-value-type'\nexport * from './kpi-metric/kpi-metric'\nexport * from './kpi-metric/kpi-metric-type'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { entities as KpiEntities, resolvers as KpiResolvers } from './kpi'\nimport { entities as KpiFormulaEntities, resolvers as KpiFormulaResolvers } from './kpi-formula'\nimport { entities as KpiCategoryEntities, resolvers as KpiCategoryResolvers } from './kpi-category'\nimport { entities as KpiGradeEntities, resolvers as KpiGradeResolvers } from './kpi-grade'\nimport { entities as KpiValueEntities, resolvers as KpiValueResolvers } from './kpi-value'\nimport { entities as KpiMetricEntities, resolvers as KpiMetricResolvers } from './kpi-metric'\n\nexport const entities = [\n /* ENTITIES */\n ...KpiEntities,\n ...KpiFormulaEntities,\n ...KpiCategoryEntities,\n ...KpiGradeEntities,\n ...KpiValueEntities,\n ...KpiMetricEntities\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...KpiResolvers,\n ...KpiFormulaResolvers,\n ...KpiCategoryResolvers,\n ...KpiGradeResolvers,\n ...KpiValueResolvers,\n ...KpiMetricResolvers\n ]\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,oDAAyB;AACzB,yDAA8B;AAC9B,sEAA2C;AAC3C,2EAAgD;AAChD,gEAAqC;AACrC,qEAA0C;AAC1C,gEAAqC;AACrC,qEAA0C;AAC1C,kEAAuC;AACvC,uEAA4C;AAC5C,sDAA2B;AAE3B,mCAAmC;AACnC,+BAA0E;AAC1E,iDAAmG;AACnG,2CAA0F;AAC1F,2CAA0F;AAC1F,6CAA6F;AAC7F,2CAA4D;AAE/C,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,cAAW;IACd,GAAG,uBAAmB;IACtB,GAAG,oBAAgB;IACnB,GAAG,oBAAgB;IACnB,GAAG,qBAAiB;CACrB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,eAAY;QACf,GAAG,wBAAoB;QACvB,GAAG,qBAAiB;QACpB,GAAG,qBAAiB;QACpB,GAAG,sBAAkB;QACrB,GAAG,qBAAiB;KACrB;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './kpi/kpi'\nexport * from './kpi/kpi-type'\nexport * from './kpi-category/kpi-category'\nexport * from './kpi-category/kpi-category-type'\nexport * from './kpi-grade/kpi-grade'\nexport * from './kpi-grade/kpi-grade-type'\nexport * from './kpi-value/kpi-value'\nexport * from './kpi-value/kpi-value-type'\nexport * from './kpi-metric/kpi-metric'\nexport * from './kpi-metric/kpi-metric-type'\nexport * from './kpi-alert'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { entities as KpiEntities, resolvers as KpiResolvers } from './kpi'\nimport { entities as KpiCategoryEntities, resolvers as KpiCategoryResolvers } from './kpi-category'\nimport { entities as KpiGradeEntities, resolvers as KpiGradeResolvers } from './kpi-grade'\nimport { entities as KpiValueEntities, resolvers as KpiValueResolvers } from './kpi-value'\nimport { entities as KpiMetricEntities, resolvers as KpiMetricResolvers } from './kpi-metric'\nimport { resolvers as KpiAlertResolvers } from './kpi-alert'\n\nexport const entities = [\n /* ENTITIES */\n ...KpiEntities,\n ...KpiCategoryEntities,\n ...KpiGradeEntities,\n ...KpiValueEntities,\n ...KpiMetricEntities\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...KpiResolvers,\n ...KpiCategoryResolvers,\n ...KpiGradeResolvers,\n ...KpiValueResolvers,\n ...KpiMetricResolvers,\n ...KpiAlertResolvers\n ]\n}\n"]}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * KPI 단위 집계/산식 자동화 함수
3
+ * @param kpiId KPI ID
4
+ * @param domainId 도메인 ID
5
+ * @param context ResolverContext
6
+ * @returns 저장된 KPI Value 배열
7
+ */
8
+ export declare function aggregateKpiValue(kpiId: string, domainId: string, context: ResolverContext): Promise<any[]>;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.aggregateKpiValue = aggregateKpiValue;
4
+ const shell_1 = require("@things-factory/shell");
5
+ const kpi_1 = require("./kpi");
6
+ const kpi_metric_1 = require("../kpi-metric/kpi-metric");
7
+ const kpi_value_1 = require("../kpi-value/kpi-value");
8
+ const kpi_formula_service_1 = require("./kpi-formula.service");
9
+ const aggregate_kpi_metric_1 = require("../kpi-metric/aggregate-kpi-metric");
10
+ /**
11
+ * KPI 단위 집계/산식 자동화 함수
12
+ * @param kpiId KPI ID
13
+ * @param domainId 도메인 ID
14
+ * @param context ResolverContext
15
+ * @returns 저장된 KPI Value 배열
16
+ */
17
+ async function aggregateKpiValue(kpiId, domainId, context) {
18
+ const tx = context.state?.tx || (0, shell_1.getRepository)(kpi_1.Kpi).manager;
19
+ // 1. KPI 정보 조회
20
+ const kpi = await (0, shell_1.getRepository)(kpi_1.Kpi).findOne({ where: { id: kpiId, domain: { id: domainId } } });
21
+ if (!kpi)
22
+ throw new Error('KPI 정보 없음');
23
+ if (!kpi.active)
24
+ throw new Error('비활성화된 KPI');
25
+ if (!kpi.formula)
26
+ throw new Error('KPI formula 없음');
27
+ // 2. formula 파싱 및 metric code별 값 집계
28
+ const formulaService = new kpi_formula_service_1.KpiFormulaService();
29
+ const metricCodes = formulaService.extractMetricCodes(kpi.formula);
30
+ const codeValueMap = {};
31
+ for (const code of metricCodes) {
32
+ // code로 metric 찾기
33
+ const metric = await (0, shell_1.getRepository)(kpi_metric_1.KpiMetric).findOne({ where: { name: code, domain: { id: domainId } } });
34
+ if (!metric)
35
+ throw new Error(`KPI formula metric '${code}' not found`);
36
+ codeValueMap[code] = await (0, aggregate_kpi_metric_1.aggregateKpiMetricValue)(metric.id, domainId, context);
37
+ }
38
+ // group/date/period별로 값 매핑(가장 최근 기준, group key 조합)
39
+ const groupKey = v => [v.date, v.period, v.group?.key01, v.group?.key02, v.group?.key03, v.group?.key04, v.group?.key05].join('|');
40
+ const groupMap = {};
41
+ for (const code of metricCodes) {
42
+ for (const v of codeValueMap[code]) {
43
+ const key = groupKey(v);
44
+ groupMap[key] = groupMap[key] || { ...v, _values: {} };
45
+ groupMap[key]._values[code] = v.value;
46
+ }
47
+ }
48
+ // formula 계산 (js eval)
49
+ const savedValues = [];
50
+ for (const key in groupMap) {
51
+ const ctx = groupMap[key]._values;
52
+ let value = null;
53
+ try {
54
+ value = Function(...Object.keys(ctx), `return (${kpi.formula})`)(...Object.values(ctx));
55
+ }
56
+ catch (e) {
57
+ value = null;
58
+ }
59
+ const valueDate = groupMap[key].date;
60
+ const groupId = groupMap[key].group?.key01;
61
+ const groupType = groupMap[key].group?.key02;
62
+ const version = kpi.version || 1;
63
+ if (value == null || isNaN(value))
64
+ continue;
65
+ // upsert(동일 KPI, valueDate, groupId, groupType, version) 기준으로 저장
66
+ const repo = (0, shell_1.getRepository)(kpi_value_1.KpiValue, context.state?.tx);
67
+ const existing = await repo.findOne({
68
+ where: { kpi: { id: kpi.id }, valueDate, groupId, groupType, version, domain: { id: domainId } }
69
+ });
70
+ let entity = existing || repo.create();
71
+ entity.kpi = kpi;
72
+ entity.kpiId = kpi.id;
73
+ entity.version = version;
74
+ entity.valueDate = valueDate;
75
+ entity.value = value;
76
+ entity.groupId = groupId;
77
+ entity.groupType = groupType;
78
+ entity.inputType = kpi_value_1.KpiValueInputType.AUTO;
79
+ entity.source = 'AUTO';
80
+ entity.domain = kpi.domain;
81
+ entity.creator = context.state?.user;
82
+ entity.updater = context.state?.user;
83
+ entity = await repo.save(entity);
84
+ savedValues.push(entity);
85
+ }
86
+ return savedValues;
87
+ }
88
+ //# sourceMappingURL=aggregate-kpi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate-kpi.js","sourceRoot":"","sources":["../../../server/service/kpi/aggregate-kpi.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { Kpi } from './kpi'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\nimport { KpiValue, KpiValueInputType } from '../kpi-value/kpi-value'\nimport { KpiFormulaService } from './kpi-formula.service'\nimport { aggregateKpiMetricValue } from '../kpi-metric/aggregate-kpi-metric'\n\n/**\n * KPI 단위 집계/산식 자동화 함수\n * @param kpiId KPI ID\n * @param domainId 도메인 ID\n * @param context ResolverContext\n * @returns 저장된 KPI Value 배열\n */\nexport async function aggregateKpiValue(kpiId: string, domainId: string, context: ResolverContext) {\n const tx = context.state?.tx || getRepository(Kpi).manager\n\n // 1. KPI 정보 조회\n const kpi = await getRepository(Kpi).findOne({ where: { id: kpiId, domain: { id: domainId } } })\n if (!kpi) throw new Error('KPI 정보 없음')\n if (!kpi.active) throw new Error('비활성화된 KPI')\n if (!kpi.formula) throw new Error('KPI formula 없음')\n\n // 2. formula 파싱 및 metric code별 값 집계\n const formulaService = new KpiFormulaService()\n const metricCodes = formulaService.extractMetricCodes(kpi.formula)\n const codeValueMap: Record<string, any[]> = {}\n for (const code of metricCodes) {\n // code로 metric 찾기\n const metric = await getRepository(KpiMetric).findOne({ where: { name: code, domain: { id: domainId } } })\n if (!metric) throw new Error(`KPI formula metric '${code}' not found`)\n codeValueMap[code] = await aggregateKpiMetricValue(metric.id, domainId, context)\n }\n // group/date/period별로 값 매핑(가장 최근 기준, group key 조합)\n const groupKey = v =>\n [v.date, v.period, v.group?.key01, v.group?.key02, v.group?.key03, v.group?.key04, v.group?.key05].join('|')\n const groupMap: Record<string, any> = {}\n for (const code of metricCodes) {\n for (const v of codeValueMap[code]) {\n const key = groupKey(v)\n groupMap[key] = groupMap[key] || { ...v, _values: {} }\n groupMap[key]._values[code] = v.value\n }\n }\n // formula 계산 (js eval)\n const savedValues = []\n for (const key in groupMap) {\n const ctx = groupMap[key]._values\n let value = null\n try {\n value = Function(...Object.keys(ctx), `return (${kpi.formula})`)(...Object.values(ctx))\n } catch (e) {\n value = null\n }\n const valueDate = groupMap[key].date\n const groupId = groupMap[key].group?.key01\n const groupType = groupMap[key].group?.key02\n const version = kpi.version || 1\n if (value == null || isNaN(value)) continue\n // upsert(동일 KPI, valueDate, groupId, groupType, version) 기준으로 저장\n const repo = getRepository(KpiValue, context.state?.tx)\n const existing = await repo.findOne({\n where: { kpi: { id: kpi.id }, valueDate, groupId, groupType, 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.groupId = groupId\n entity.groupType = groupType\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"]}
@@ -4,4 +4,6 @@ import { KpiHistory } from './kpi-history';
4
4
  export declare class KpiHistoryEntitySubscriber extends HistoryEntitySubscriber<Kpi, KpiHistory> {
5
5
  get entity(): typeof Kpi;
6
6
  get historyEntity(): typeof KpiHistory;
7
+ afterInsert(event: any): Promise<void>;
8
+ afterUpdate(event: any): Promise<void>;
7
9
  }
@@ -13,6 +13,16 @@ let KpiHistoryEntitySubscriber = class KpiHistoryEntitySubscriber extends typeor
13
13
  get historyEntity() {
14
14
  return kpi_history_1.KpiHistory;
15
15
  }
16
+ async afterInsert(event) {
17
+ if (event.entity.state == 'RELEASE') {
18
+ await super.afterInsert(event);
19
+ }
20
+ }
21
+ async afterUpdate(event) {
22
+ if (event.entity.state == 'RELEASE') {
23
+ await super.afterUpdate(event);
24
+ }
25
+ }
16
26
  };
17
27
  exports.KpiHistoryEntitySubscriber = KpiHistoryEntitySubscriber;
18
28
  exports.KpiHistoryEntitySubscriber = KpiHistoryEntitySubscriber = tslib_1.__decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"event-subscriber.js","sourceRoot":"","sources":["../../../server/service/kpi/event-subscriber.ts"],"names":[],"mappings":";;;;AAAA,qCAAyC;AAEzC,8DAAkE;AAElE,+BAA2B;AAC3B,+CAA0C;AAGnC,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,yCAAwC;IACtF,IAAW,MAAM;QACf,OAAO,SAAG,CAAA;IACZ,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,wBAAU,CAAA;IACnB,CAAC;CACF,CAAA;AARY,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,yBAAe,GAAE;GACL,0BAA0B,CAQtC","sourcesContent":["import { EventSubscriber } from 'typeorm'\n\nimport { HistoryEntitySubscriber } from '@operato/typeorm-history'\n\nimport { Kpi } from './kpi'\nimport { KpiHistory } from './kpi-history'\n\n@EventSubscriber()\nexport class KpiHistoryEntitySubscriber extends HistoryEntitySubscriber<Kpi, KpiHistory> {\n public get entity() {\n return Kpi\n }\n\n public get historyEntity() {\n return KpiHistory\n }\n}\n"]}
1
+ {"version":3,"file":"event-subscriber.js","sourceRoot":"","sources":["../../../server/service/kpi/event-subscriber.ts"],"names":[],"mappings":";;;;AAAA,qCAAyC;AAEzC,8DAAkE;AAElE,+BAA2B;AAC3B,+CAA0C;AAGnC,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,yCAAwC;IACtF,IAAW,MAAM;QACf,OAAO,SAAG,CAAA;IACZ,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,wBAAU,CAAA;IACnB,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAK;QAC5B,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC;YACpC,MAAM,KAAK,CAAC,WAAW,CAAC,KAAY,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAK;QAC5B,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC;YACpC,MAAM,KAAK,CAAC,WAAW,CAAC,KAAY,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;CACF,CAAA;AApBY,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,yBAAe,GAAE;GACL,0BAA0B,CAoBtC","sourcesContent":["import { EventSubscriber } from 'typeorm'\n\nimport { HistoryEntitySubscriber } from '@operato/typeorm-history'\n\nimport { Kpi } from './kpi'\nimport { KpiHistory } from './kpi-history'\n\n@EventSubscriber()\nexport class KpiHistoryEntitySubscriber extends HistoryEntitySubscriber<Kpi, KpiHistory> {\n public get entity() {\n return Kpi\n }\n\n public get historyEntity() {\n return KpiHistory\n }\n\n public async afterInsert(event): Promise<void> {\n if (event.entity.state == 'RELEASE') {\n await super.afterInsert(event as any)\n }\n }\n\n public async afterUpdate(event): Promise<void> {\n if (event.entity.state == 'RELEASE') {\n await super.afterUpdate(event as any)\n }\n }\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  import { Kpi } from './kpi';
2
+ import { KpiHistory } from './kpi-history';
2
3
  import { KpiHistoryEntitySubscriber } from './event-subscriber';
3
4
  import { KpiQuery } from './kpi-query';
4
5
  import { KpiMutation } from './kpi-mutation';
5
- export declare const entities: (typeof Kpi)[];
6
+ export declare const entities: (typeof Kpi | typeof KpiHistory)[];
6
7
  export declare const resolvers: (typeof KpiQuery | typeof KpiMutation)[];
7
8
  export declare const subscribers: (typeof KpiHistoryEntitySubscriber)[];
@@ -0,0 +1,24 @@
1
+ /**
2
+ * KPI formula 파싱/검증/매핑 유효성 검사 서비스
3
+ * - formula에서 Metric 코드(변수명) 추출
4
+ * - 각 Metric의 존재/매핑 유효성 검사
5
+ * - 구문 오류, 미정의 Metric, 매핑 오류 등 에러 리포팅
6
+ */
7
+ export declare class KpiFormulaService {
8
+ /**
9
+ * formula 문자열에서 Metric 코드(변수명) 추출
10
+ * @param formula KPI formula (예: 'defect_count / total_count * 100')
11
+ * @returns string[] 추출된 Metric 코드 리스트
12
+ */
13
+ extractMetricCodes(formula: string): string[];
14
+ /**
15
+ * formula 내 Metric 코드의 존재/매핑 유효성 검사 + 순환참조 검출
16
+ * @param formula KPI formula
17
+ * @param visited 순환참조 검출용 Set (재귀 호출 시 사용)
18
+ * @returns { valid: boolean, errors: string[] }
19
+ */
20
+ validateFormula(formula: string, visited?: Set<string>): Promise<{
21
+ valid: boolean;
22
+ errors: string[];
23
+ }>;
24
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KpiFormulaService = void 0;
4
+ const shell_1 = require("@things-factory/shell");
5
+ const kpi_metric_1 = require("../kpi-metric/kpi-metric");
6
+ /**
7
+ * KPI formula 파싱/검증/매핑 유효성 검사 서비스
8
+ * - formula에서 Metric 코드(변수명) 추출
9
+ * - 각 Metric의 존재/매핑 유효성 검사
10
+ * - 구문 오류, 미정의 Metric, 매핑 오류 등 에러 리포팅
11
+ */
12
+ class KpiFormulaService {
13
+ /**
14
+ * formula 문자열에서 Metric 코드(변수명) 추출
15
+ * @param formula KPI formula (예: 'defect_count / total_count * 100')
16
+ * @returns string[] 추출된 Metric 코드 리스트
17
+ */
18
+ extractMetricCodes(formula) {
19
+ // 변수명: 알파벳/언더스코어로 시작, 숫자/알파벳/언더스코어 포함
20
+ const regex = /[a-zA-Z_][a-zA-Z0-9_]*/g;
21
+ // 숫자/예약어/연산자 제외(후처리 필요)
22
+ const reserved = new Set(['if', 'else', 'return', 'true', 'false']);
23
+ return Array.from(new Set((formula.match(regex) || []).filter(code => isNaN(Number(code)) && !reserved.has(code))));
24
+ }
25
+ /**
26
+ * formula 내 Metric 코드의 존재/매핑 유효성 검사 + 순환참조 검출
27
+ * @param formula KPI formula
28
+ * @param visited 순환참조 검출용 Set (재귀 호출 시 사용)
29
+ * @returns { valid: boolean, errors: string[] }
30
+ */
31
+ async validateFormula(formula, visited = new Set()) {
32
+ const errors = [];
33
+ const metricCodes = this.extractMetricCodes(formula);
34
+ const metricRepo = (0, shell_1.getRepository)(kpi_metric_1.KpiMetric);
35
+ for (const code of metricCodes) {
36
+ if (visited.has(code)) {
37
+ errors.push(`순환참조 감지: ${Array.from(visited).join(' → ')} → ${code}`);
38
+ continue;
39
+ }
40
+ visited.add(code);
41
+ const metric = await metricRepo.findOne({ where: { name: code } });
42
+ if (!metric) {
43
+ errors.push(`Metric '${code}' is not defined.`);
44
+ visited.delete(code);
45
+ continue;
46
+ }
47
+ if (!metric.dataSetId || !metric.fieldName) {
48
+ errors.push(`Metric '${code}' is not mapped to a dataset field.`);
49
+ }
50
+ // metric이 formula를 가지고 있다면 재귀적으로 순환참조 검증
51
+ if (metric.formula) {
52
+ const subResult = await this.validateFormula(metric.formula, new Set(visited));
53
+ if (!subResult.valid)
54
+ errors.push(...subResult.errors);
55
+ }
56
+ visited.delete(code);
57
+ }
58
+ // (선택) formula 구문 오류, 괄호 불일치 등 추가 검사 가능
59
+ // ...
60
+ return { valid: errors.length === 0, errors };
61
+ }
62
+ }
63
+ exports.KpiFormulaService = KpiFormulaService;
64
+ //# sourceMappingURL=kpi-formula.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kpi-formula.service.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-formula.service.ts"],"names":[],"mappings":";;;AAAA,iDAAqD;AACrD,yDAAoD;AAEpD;;;;;GAKG;AACH,MAAa,iBAAiB;IAC5B;;;;OAIG;IACH,kBAAkB,CAAC,OAAe;QAChC,sCAAsC;QACtC,MAAM,KAAK,GAAG,yBAAyB,CAAA;QACvC,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QACnE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACrH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CACnB,OAAe,EACf,UAAuB,IAAI,GAAG,EAAE;QAEhC,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;QACpD,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,sBAAS,CAAC,CAAA;QAC3C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;gBACpE,SAAQ;YACV,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACjB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;YAClE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,mBAAmB,CAAC,CAAA;gBAC/C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACpB,SAAQ;YACV,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,qCAAqC,CAAC,CAAA;YACnE,CAAC;YACD,yCAAyC;YACzC,IAAK,MAAc,CAAC,OAAO,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAE,MAAc,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;gBACvF,IAAI,CAAC,SAAS,CAAC,KAAK;oBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;YACxD,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;QACD,wCAAwC;QACxC,MAAM;QACN,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/C,CAAC;CACF;AArDD,8CAqDC","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\n\n/**\n * KPI formula 파싱/검증/매핑 유효성 검사 서비스\n * - formula에서 Metric 코드(변수명) 추출\n * - 각 Metric의 존재/매핑 유효성 검사\n * - 구문 오류, 미정의 Metric, 매핑 오류 등 에러 리포팅\n */\nexport class KpiFormulaService {\n /**\n * formula 문자열에서 Metric 코드(변수명) 추출\n * @param formula KPI formula (예: 'defect_count / total_count * 100')\n * @returns string[] 추출된 Metric 코드 리스트\n */\n extractMetricCodes(formula: string): string[] {\n // 변수명: 알파벳/언더스코어로 시작, 숫자/알파벳/언더스코어 포함\n const regex = /[a-zA-Z_][a-zA-Z0-9_]*/g\n // 숫자/예약어/연산자 제외(후처리 필요)\n const reserved = new Set(['if', 'else', 'return', 'true', 'false'])\n return Array.from(new Set((formula.match(regex) || []).filter(code => isNaN(Number(code)) && !reserved.has(code))))\n }\n\n /**\n * formula 내 Metric 코드의 존재/매핑 유효성 검사 + 순환참조 검출\n * @param formula KPI formula\n * @param visited 순환참조 검출용 Set (재귀 호출 시 사용)\n * @returns { valid: boolean, errors: string[] }\n */\n async validateFormula(\n formula: string,\n visited: Set<string> = new Set()\n ): Promise<{ valid: boolean; errors: string[] }> {\n const errors: string[] = []\n const metricCodes = this.extractMetricCodes(formula)\n const metricRepo = getRepository(KpiMetric)\n for (const code of metricCodes) {\n if (visited.has(code)) {\n errors.push(`순환참조 감지: ${Array.from(visited).join(' → ')} → ${code}`)\n continue\n }\n visited.add(code)\n const metric = await metricRepo.findOne({ where: { name: code } })\n if (!metric) {\n errors.push(`Metric '${code}' is not defined.`)\n visited.delete(code)\n continue\n }\n if (!metric.dataSetId || !metric.fieldName) {\n errors.push(`Metric '${code}' is not mapped to a dataset field.`)\n }\n // metric이 formula를 가지고 있다면 재귀적으로 순환참조 검증\n if ((metric as any).formula) {\n const subResult = await this.validateFormula((metric as any).formula, new Set(visited))\n if (!subResult.valid) errors.push(...subResult.errors)\n }\n visited.delete(code)\n }\n // (선택) formula 구문 오류, 괄호 불일치 등 추가 검사 가능\n // ...\n return { valid: errors.length === 0, errors }\n }\n}\n"]}
@@ -2,6 +2,7 @@ import { HistoryActionType, HistoryEntityInterface } from '@operato/typeorm-hist
2
2
  import { User } from '@things-factory/auth-base';
3
3
  import { Domain } from '@things-factory/shell';
4
4
  import { Kpi, KpiStatus } from './kpi';
5
+ import { KpiCategory } from '../kpi-category/kpi-category';
5
6
  export declare class KpiHistory implements HistoryEntityInterface<Kpi> {
6
7
  readonly id: string;
7
8
  version?: number;
@@ -9,9 +10,12 @@ export declare class KpiHistory implements HistoryEntityInterface<Kpi> {
9
10
  domainId?: string;
10
11
  name: string;
11
12
  description?: string;
13
+ category?: KpiCategory;
14
+ categoryId?: string;
15
+ formula?: string;
12
16
  active?: boolean;
13
17
  state?: KpiStatus;
14
- params?: string;
18
+ thumbnail?: string;
15
19
  createdAt?: Date;
16
20
  updatedAt?: Date;
17
21
  deletedAt?: Date;
@@ -19,7 +23,7 @@ export declare class KpiHistory implements HistoryEntityInterface<Kpi> {
19
23
  creatorId?: string;
20
24
  updater?: User;
21
25
  updaterId?: string;
22
- thumbnail?: string;
23
26
  originalId: string;
27
+ kpi: Kpi;
24
28
  action: HistoryActionType;
25
29
  }
@@ -9,6 +9,7 @@ const auth_base_1 = require("@things-factory/auth-base");
9
9
  const env_1 = require("@things-factory/env");
10
10
  const shell_1 = require("@things-factory/shell");
11
11
  const kpi_1 = require("./kpi");
12
+ const kpi_category_1 = require("../kpi-category/kpi-category");
12
13
  const ORMCONFIG = env_1.config.get('ormconfig', {});
13
14
  const DATABASE_TYPE = ORMCONFIG.type;
14
15
  let KpiHistory = class KpiHistory {
@@ -46,21 +47,34 @@ tslib_1.__decorate([
46
47
  (0, type_graphql_1.Field)({ nullable: true }),
47
48
  tslib_1.__metadata("design:type", String)
48
49
  ], KpiHistory.prototype, "description", void 0);
50
+ tslib_1.__decorate([
51
+ (0, typeorm_1.ManyToOne)(() => kpi_category_1.KpiCategory, { nullable: true }),
52
+ (0, type_graphql_1.Field)(type => kpi_category_1.KpiCategory, { nullable: true, description: 'Category to which this KPI belongs.' }),
53
+ tslib_1.__metadata("design:type", kpi_category_1.KpiCategory)
54
+ ], KpiHistory.prototype, "category", void 0);
55
+ tslib_1.__decorate([
56
+ (0, typeorm_1.RelationId)((kpi) => kpi.category),
57
+ tslib_1.__metadata("design:type", String)
58
+ ], KpiHistory.prototype, "categoryId", void 0);
49
59
  tslib_1.__decorate([
50
60
  (0, typeorm_1.Column)({ nullable: true }),
51
- (0, type_graphql_1.Field)({ nullable: true }),
61
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Calculation formula for the KPI.' }),
62
+ tslib_1.__metadata("design:type", String)
63
+ ], KpiHistory.prototype, "formula", void 0);
64
+ tslib_1.__decorate([
65
+ (0, typeorm_1.Column)({ nullable: false, default: false }),
66
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Whether this KPI is active (usable) or not.' }),
52
67
  tslib_1.__metadata("design:type", Boolean)
53
68
  ], KpiHistory.prototype, "active", void 0);
54
69
  tslib_1.__decorate([
55
70
  (0, typeorm_1.Column)({ nullable: true }),
56
- (0, type_graphql_1.Field)({ nullable: true }),
71
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' }),
57
72
  tslib_1.__metadata("design:type", String)
58
73
  ], KpiHistory.prototype, "state", void 0);
59
74
  tslib_1.__decorate([
60
- (0, typeorm_1.Column)({ nullable: true }),
61
- (0, type_graphql_1.Field)({ nullable: true }),
75
+ (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'Thumbnail image or file path for this KPI.' }),
62
76
  tslib_1.__metadata("design:type", String)
63
- ], KpiHistory.prototype, "params", void 0);
77
+ ], KpiHistory.prototype, "thumbnail", void 0);
64
78
  tslib_1.__decorate([
65
79
  (0, typeorm_1.Column)({ nullable: true }),
66
80
  (0, type_graphql_1.Field)({ nullable: true }),
@@ -95,13 +109,15 @@ tslib_1.__decorate([
95
109
  tslib_1.__metadata("design:type", String)
96
110
  ], KpiHistory.prototype, "updaterId", void 0);
97
111
  tslib_1.__decorate([
98
- (0, type_graphql_1.Field)(type => String, { nullable: true }),
99
- tslib_1.__metadata("design:type", String)
100
- ], KpiHistory.prototype, "thumbnail", void 0);
101
- tslib_1.__decorate([
102
- (0, typeorm_history_1.HistoryOriginalIdColumn)(),
112
+ (0, typeorm_history_1.HistoryOriginalIdColumn)({ type: 'uuid' }),
103
113
  tslib_1.__metadata("design:type", String)
104
114
  ], KpiHistory.prototype, "originalId", void 0);
115
+ tslib_1.__decorate([
116
+ (0, typeorm_1.ManyToOne)(() => kpi_1.Kpi, { nullable: false }),
117
+ (0, typeorm_1.JoinColumn)({ name: 'originalId', referencedColumnName: 'id' }),
118
+ (0, type_graphql_1.Field)(type => kpi_1.Kpi, { nullable: false, description: '이 이력이 속한 KPI' }),
119
+ tslib_1.__metadata("design:type", kpi_1.Kpi)
120
+ ], KpiHistory.prototype, "kpi", void 0);
105
121
  tslib_1.__decorate([
106
122
  (0, typeorm_history_1.HistoryActionColumn)({
107
123
  nullable: false,
@@ -122,7 +138,9 @@ tslib_1.__decorate([
122
138
  exports.KpiHistory = KpiHistory = tslib_1.__decorate([
123
139
  (0, typeorm_1.Entity)(),
124
140
  (0, typeorm_1.Index)('ix_kpi_history_0', (kpiHistory) => [kpiHistory.originalId, kpiHistory.version], { unique: true }),
125
- (0, typeorm_1.Index)('ix_kpi_history_1', (kpiHistory) => [kpiHistory.domain, kpiHistory.originalId, kpiHistory.version], { unique: true }),
141
+ (0, typeorm_1.Index)('ix_kpi_history_1', (kpiHistory) => [kpiHistory.domain, kpiHistory.originalId, kpiHistory.version], {
142
+ unique: true
143
+ }),
126
144
  (0, type_graphql_1.ObjectType)({ description: 'History Entity of Kpi' })
127
145
  ], KpiHistory);
128
146
  //# sourceMappingURL=kpi-history.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-history.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-history.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, ID, ObjectType } from 'type-graphql'\nimport { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId } from 'typeorm'\n\nimport {\n HistoryActionColumn,\n HistoryActionType,\n HistoryEntityInterface,\n HistoryOriginalIdColumn\n} from '@operato/typeorm-history'\nimport { Role, User } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { Domain } from '@things-factory/shell'\n\nimport { Kpi, KpiStatus } from './kpi'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\n@Entity()\n@Index(\n 'ix_kpi_history_0',\n (kpiHistory: KpiHistory) => [kpiHistory.originalId, kpiHistory.version],\n { unique: true }\n)\n@Index(\n 'ix_kpi_history_1',\n (kpiHistory: KpiHistory) => [kpiHistory.domain, kpiHistory.originalId, kpiHistory.version],\n { unique: true }\n)\n@ObjectType({ description: 'History Entity of Kpi' })\nexport class KpiHistory implements HistoryEntityInterface<Kpi> {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @Column({ nullable: true, default: 1 })\n @Field({ nullable: true })\n version?: number = 1\n\n @ManyToOne(type => Domain)\n @Field({ nullable: true })\n domain?: Domain\n\n @RelationId((kpi: Kpi) => kpi.domain)\n domainId?: string\n\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n active?: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n state?: KpiStatus\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n params?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n createdAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n updatedAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((kpi: Kpi) => kpi.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((kpi: Kpi) => kpi.updater)\n updaterId?: string\n\n @Field(type => String, { nullable: true })\n thumbnail?: string\n\n @HistoryOriginalIdColumn()\n public originalId!: string\n\n @HistoryActionColumn({\n nullable: false,\n type:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'enum'\n : DATABASE_TYPE == 'oracle'\n ? 'varchar2'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n enum:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? HistoryActionType\n : undefined,\n length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined: 32\n })\n public action!: HistoryActionType\n}\n"]}
1
+ {"version":3,"file":"kpi-history.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-history.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, ID, ObjectType } from 'type-graphql'\nimport { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId, JoinColumn } from 'typeorm'\n\nimport {\n HistoryActionColumn,\n HistoryActionType,\n HistoryEntityInterface,\n HistoryOriginalIdColumn\n} from '@operato/typeorm-history'\nimport { Role, User } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { Domain } from '@things-factory/shell'\n\nimport { Kpi, KpiStatus } from './kpi'\nimport { KpiCategory } from '../kpi-category/kpi-category'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\n@Entity()\n@Index('ix_kpi_history_0', (kpiHistory: KpiHistory) => [kpiHistory.originalId, kpiHistory.version], { unique: true })\n@Index('ix_kpi_history_1', (kpiHistory: KpiHistory) => [kpiHistory.domain, kpiHistory.originalId, kpiHistory.version], {\n unique: true\n})\n@ObjectType({ description: 'History Entity of Kpi' })\nexport class KpiHistory implements HistoryEntityInterface<Kpi> {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @Column({ nullable: true, default: 1 })\n @Field({ nullable: true })\n version?: number = 1\n\n @ManyToOne(type => Domain)\n @Field({ nullable: true })\n domain?: Domain\n\n @RelationId((kpi: Kpi) => kpi.domain)\n domainId?: string\n\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\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: KpiHistory) => kpi.category)\n categoryId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Calculation formula for the KPI.' })\n formula?: string\n\n @Column({ nullable: false, default: false })\n @Field({ nullable: true, description: 'Whether this KPI is active (usable) or not.' })\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 @Field(type => String, { nullable: true, description: 'Thumbnail image or file path for this KPI.' })\n thumbnail?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n createdAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n updatedAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((kpi: Kpi) => kpi.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((kpi: Kpi) => kpi.updater)\n updaterId?: string\n\n @HistoryOriginalIdColumn({ type: 'uuid' })\n public originalId!: string\n\n // Kpi와의 릴레이션 추가 (originalId를 외래키로 사용)\n @ManyToOne(() => Kpi, { nullable: false })\n @JoinColumn({ name: 'originalId', referencedColumnName: 'id' })\n @Field(type => Kpi, { nullable: false, description: '이 이력이 속한 KPI' })\n kpi: Kpi\n\n @HistoryActionColumn({\n nullable: false,\n type:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'enum'\n : DATABASE_TYPE == 'oracle'\n ? 'varchar2'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n enum:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? HistoryActionType\n : undefined,\n length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 32\n })\n public action!: HistoryActionType\n}\n"]}
@@ -7,4 +7,6 @@ export declare class KpiMutation {
7
7
  deleteKpi(id: string, context: ResolverContext): Promise<boolean>;
8
8
  deleteKpis(ids: string[], context: ResolverContext): Promise<boolean>;
9
9
  importKpis(kpis: KpiPatch[], context: ResolverContext): Promise<boolean>;
10
+ releaseKpi(id: string, context: ResolverContext): Promise<Kpi>;
11
+ revertKpiVersion(id: string, version: number, context: ResolverContext): Promise<Kpi>;
10
12
  }