@things-factory/kpi 9.0.31 → 9.0.33

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 (365) 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 +291 -48
  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.d.ts +3 -1
  59. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +268 -46
  60. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -1
  61. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +28 -30
  62. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -1
  63. package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +6 -1
  64. package/dist-client/pages/kpi-history/kpi-history-list-page.js +11 -11
  65. package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -1
  66. package/dist-client/pages/kpi-metric/kpi-metric-list-page.d.ts +5 -0
  67. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +10 -2
  68. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
  69. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +1 -1
  70. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +8 -8
  71. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -1
  72. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +2 -2
  73. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -1
  74. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +5 -0
  75. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +16 -8
  76. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
  77. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +1 -1
  78. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +6 -6
  79. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -1
  80. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js +1 -2
  81. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js.map +1 -1
  82. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.d.ts +5 -0
  83. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js +10 -2
  84. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js.map +1 -1
  85. package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +2 -1
  86. package/dist-client/pages/kpi-value/kpi-value-editor-page.js +16 -8
  87. package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +1 -1
  88. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +5 -0
  89. package/dist-client/pages/kpi-value/kpi-value-list-page.js +31 -7
  90. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
  91. package/dist-client/route.d.ts +1 -1
  92. package/dist-client/route.js +2 -8
  93. package/dist-client/route.js.map +1 -1
  94. package/dist-client/tsconfig.tsbuildinfo +1 -1
  95. package/dist-server/controllers/kpi-metric-value-provider.d.ts +1 -1
  96. package/dist-server/controllers/kpi-metric-value-provider.js +4 -4
  97. package/dist-server/controllers/kpi-metric-value-provider.js.map +1 -1
  98. package/dist-server/controllers/kpi-value-provider.d.ts +1 -1
  99. package/dist-server/controllers/kpi-value-provider.js +3 -3
  100. package/dist-server/controllers/kpi-value-provider.js.map +1 -1
  101. package/dist-server/migrations/1752190849680-seed-kpi-metrics.d.ts +6 -0
  102. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js +101 -0
  103. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js.map +1 -0
  104. package/dist-server/migrations/1752190849681-seed-kpi.d.ts +5 -0
  105. package/dist-server/migrations/1752190849681-seed-kpi.js +315 -0
  106. package/dist-server/migrations/1752190849681-seed-kpi.js.map +1 -0
  107. package/dist-server/migrations/1752192090123-add-grades-to-kpi.d.ts +7 -0
  108. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js +51 -0
  109. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js.map +1 -0
  110. package/dist-server/migrations/1752192090124-add-kpi-statistics.d.ts +5 -0
  111. package/dist-server/migrations/1752192090124-add-kpi-statistics.js +710 -0
  112. package/dist-server/migrations/1752192090124-add-kpi-statistics.js.map +1 -0
  113. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.d.ts +6 -0
  114. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js +111 -0
  115. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js.map +1 -0
  116. package/dist-server/migrations/1752192090129-seed-kpi-values.d.ts +6 -0
  117. package/dist-server/migrations/1752192090129-seed-kpi-values.js +187 -0
  118. package/dist-server/migrations/1752192090129-seed-kpi-values.js.map +1 -0
  119. package/dist-server/migrations/grade-data/x11-performance-table.json +962 -0
  120. package/dist-server/migrations/grade-data/x12-performance-table.json +611 -0
  121. package/dist-server/migrations/grade-data/x14-performance-table.json +42 -0
  122. package/dist-server/migrations/grade-data/x21-performance-table.json +889 -0
  123. package/dist-server/migrations/grade-data/x22-performance-table.json +1064 -0
  124. package/dist-server/migrations/grade-data/x23-performance-table.json +42 -0
  125. package/dist-server/migrations/grade-data/x31-performance-table.json +644 -0
  126. package/dist-server/migrations/grade-data/x32-performance-table.json +993 -0
  127. package/dist-server/migrations/grade-data/x33-performance-table.json +195 -0
  128. package/dist-server/migrations/grade-data/x34-performance-table.json +12 -0
  129. package/dist-server/migrations/grade-data/x35-performance-table.json +42 -0
  130. package/dist-server/migrations/grade-data/x41-performance-table.json +825 -0
  131. package/dist-server/migrations/grade-data/x42-performance-table.json +786 -0
  132. package/dist-server/migrations/grade-data/x43-performance-table.json +12 -0
  133. package/dist-server/migrations/grade-data/x44-performance-table.json +42 -0
  134. package/dist-server/migrations/grade-data/x51-performance-table.json +924 -0
  135. package/dist-server/migrations/grade-data/x52-performance-table.json +42 -0
  136. package/dist-server/migrations/grade-data/x61-performance-table.json +261 -0
  137. package/dist-server/migrations/grade-data/x62-performance-table.json +42 -0
  138. package/dist-server/migrations/seed-data/kpi-metrics-seed.json +454 -0
  139. package/dist-server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
  140. package/dist-server/migrations/seed-data/kpi-scopes-seed.json +121 -0
  141. package/dist-server/migrations/seed-data/kpi-values-seed.json +402 -0
  142. package/dist-server/migrations/seed-data/kpis-seed.json +488 -0
  143. package/dist-server/migrations/seed-data/scope-definitions-seed.json +90 -0
  144. package/dist-server/service/index.d.ts +4 -7
  145. package/dist-server/service/index.js +10 -13
  146. package/dist-server/service/index.js.map +1 -1
  147. package/dist-server/service/kpi/aggregate-kpi.js +30 -13
  148. package/dist-server/service/kpi/aggregate-kpi.js.map +1 -1
  149. package/dist-server/service/kpi/kpi-formula.service.d.ts +15 -0
  150. package/dist-server/service/kpi/kpi-formula.service.js +90 -0
  151. package/dist-server/service/kpi/kpi-formula.service.js.map +1 -1
  152. package/dist-server/service/kpi/kpi-history.d.ts +0 -3
  153. package/dist-server/service/kpi/kpi-history.js +0 -10
  154. package/dist-server/service/kpi/kpi-history.js.map +1 -1
  155. package/dist-server/service/kpi/kpi-mutation.d.ts +1 -1
  156. package/dist-server/service/kpi/kpi-mutation.js +57 -20
  157. package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
  158. package/dist-server/service/kpi/kpi-query.d.ts +7 -3
  159. package/dist-server/service/kpi/kpi-query.js +126 -10
  160. package/dist-server/service/kpi/kpi-query.js.map +1 -1
  161. package/dist-server/service/kpi/kpi-type.d.ts +4 -2
  162. package/dist-server/service/kpi/kpi-type.js +12 -4
  163. package/dist-server/service/kpi/kpi-type.js.map +1 -1
  164. package/dist-server/service/kpi/kpi.d.ts +4 -3
  165. package/dist-server/service/kpi/kpi.js +20 -8
  166. package/dist-server/service/kpi/kpi.js.map +1 -1
  167. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +46 -11
  168. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -1
  169. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +1 -1
  170. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +6 -6
  171. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
  172. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.d.ts +2 -2
  173. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js +4 -4
  174. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js.map +1 -1
  175. package/dist-server/service/kpi-metric-value/kpi-metric-value.d.ts +1 -1
  176. package/dist-server/service/kpi-metric-value/kpi-metric-value.js +3 -3
  177. package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -1
  178. package/dist-server/service/kpi-org-scope/index.d.ts +5 -0
  179. package/dist-server/service/kpi-org-scope/index.js +9 -0
  180. package/dist-server/service/kpi-org-scope/index.js.map +1 -0
  181. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.d.ts +8 -0
  182. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js +170 -0
  183. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js.map +1 -0
  184. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.d.ts +14 -0
  185. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js +152 -0
  186. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js.map +1 -0
  187. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.d.ts +26 -0
  188. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js +101 -0
  189. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js.map +1 -0
  190. package/dist-server/service/kpi-org-scope/kpi-org-scope.d.ts +26 -0
  191. package/dist-server/service/kpi-org-scope/kpi-org-scope.js +135 -0
  192. package/dist-server/service/kpi-org-scope/kpi-org-scope.js.map +1 -0
  193. package/dist-server/service/kpi-scope/index.d.ts +9 -0
  194. package/dist-server/service/kpi-scope/index.js +14 -0
  195. package/dist-server/service/kpi-scope/index.js.map +1 -0
  196. package/dist-server/service/kpi-scope/kpi-scope-mutation.d.ts +9 -0
  197. package/dist-server/service/kpi-scope/kpi-scope-mutation.js +135 -0
  198. package/dist-server/service/kpi-scope/kpi-scope-mutation.js.map +1 -0
  199. package/dist-server/service/kpi-scope/kpi-scope-query.d.ts +11 -0
  200. package/dist-server/service/kpi-scope/kpi-scope-query.js +89 -0
  201. package/dist-server/service/kpi-scope/kpi-scope-query.js.map +1 -0
  202. package/dist-server/service/kpi-scope/kpi-scope-type.d.ts +35 -0
  203. package/dist-server/service/kpi-scope/kpi-scope-type.js +138 -0
  204. package/dist-server/service/kpi-scope/kpi-scope-type.js.map +1 -0
  205. package/dist-server/service/kpi-scope/kpi-scope.d.ts +38 -0
  206. package/dist-server/service/kpi-scope/kpi-scope.js +144 -0
  207. package/dist-server/service/kpi-scope/kpi-scope.js.map +1 -0
  208. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.d.ts +43 -0
  209. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js +181 -0
  210. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js.map +1 -0
  211. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.d.ts +50 -0
  212. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js +324 -0
  213. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js.map +1 -0
  214. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.d.ts +4 -0
  215. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js +76 -0
  216. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js.map +1 -1
  217. package/dist-server/service/kpi-statistic/kpi-statistic-query.d.ts +5 -1
  218. package/dist-server/service/kpi-statistic/kpi-statistic-query.js +92 -1
  219. package/dist-server/service/kpi-statistic/kpi-statistic-query.js.map +1 -1
  220. package/dist-server/service/kpi-statistic/kpi-statistic.d.ts +4 -0
  221. package/dist-server/service/kpi-statistic/kpi-statistic.js +33 -0
  222. package/dist-server/service/kpi-statistic/kpi-statistic.js.map +1 -1
  223. package/dist-server/service/kpi-value/kpi-value-mutation.js +71 -7
  224. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
  225. package/dist-server/service/kpi-value/kpi-value-type.d.ts +4 -2
  226. package/dist-server/service/kpi-value/kpi-value-type.js +12 -4
  227. package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
  228. package/dist-server/service/kpi-value/kpi-value.d.ts +3 -1
  229. package/dist-server/service/kpi-value/kpi-value.js +11 -5
  230. package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
  231. package/dist-server/service/utils/value-date-util.d.ts +1 -0
  232. package/dist-server/service/utils/value-date-util.js +41 -0
  233. package/dist-server/service/utils/value-date-util.js.map +1 -1
  234. package/dist-server/tsconfig.json +10 -0
  235. package/dist-server/tsconfig.tsbuildinfo +1 -1
  236. package/package.json +7 -6
  237. package/server/@types/index.d.ts +11 -0
  238. package/server/controllers/kpi-metric-value-provider.ts +5 -5
  239. package/server/controllers/kpi-value-provider.ts +4 -4
  240. package/server/migrations/1752190849680-seed-kpi-metrics.ts +124 -0
  241. package/server/migrations/1752190849681-seed-kpi.ts +356 -0
  242. package/server/migrations/1752192090123-add-grades-to-kpi.ts +67 -0
  243. package/server/migrations/1752192090124-add-kpi-statistics.ts +719 -0
  244. package/server/migrations/1752192090128-seed-kpi-org-scope.ts +132 -0
  245. package/server/migrations/1752192090129-seed-kpi-values.ts +207 -0
  246. package/server/migrations/grade-data/x11-performance-table.json +962 -0
  247. package/server/migrations/grade-data/x12-performance-table.json +611 -0
  248. package/server/migrations/grade-data/x14-performance-table.json +42 -0
  249. package/server/migrations/grade-data/x21-performance-table.json +889 -0
  250. package/server/migrations/grade-data/x22-performance-table.json +1064 -0
  251. package/server/migrations/grade-data/x23-performance-table.json +42 -0
  252. package/server/migrations/grade-data/x31-performance-table.json +644 -0
  253. package/server/migrations/grade-data/x32-performance-table.json +993 -0
  254. package/server/migrations/grade-data/x33-performance-table.json +195 -0
  255. package/server/migrations/grade-data/x34-performance-table.json +12 -0
  256. package/server/migrations/grade-data/x35-performance-table.json +42 -0
  257. package/server/migrations/grade-data/x41-performance-table.json +825 -0
  258. package/server/migrations/grade-data/x42-performance-table.json +786 -0
  259. package/server/migrations/grade-data/x43-performance-table.json +12 -0
  260. package/server/migrations/grade-data/x44-performance-table.json +42 -0
  261. package/server/migrations/grade-data/x51-performance-table.json +924 -0
  262. package/server/migrations/grade-data/x52-performance-table.json +42 -0
  263. package/server/migrations/grade-data/x61-performance-table.json +261 -0
  264. package/server/migrations/grade-data/x62-performance-table.json +42 -0
  265. package/server/migrations/seed-data/kpi-metrics-seed.json +454 -0
  266. package/server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
  267. package/server/migrations/seed-data/kpi-scopes-seed.json +121 -0
  268. package/server/migrations/seed-data/kpi-values-seed.json +402 -0
  269. package/server/migrations/seed-data/kpis-seed.json +488 -0
  270. package/server/migrations/seed-data/scope-definitions-seed.json +90 -0
  271. package/server/service/index.ts +10 -13
  272. package/server/service/kpi/aggregate-kpi.ts +31 -13
  273. package/server/service/kpi/kpi-formula.service.ts +101 -0
  274. package/server/service/kpi/kpi-history.ts +0 -8
  275. package/server/service/kpi/kpi-mutation.ts +59 -19
  276. package/server/service/kpi/kpi-query.ts +119 -8
  277. package/server/service/kpi/kpi-type.ts +10 -4
  278. package/server/service/kpi/kpi.ts +17 -7
  279. package/server/service/kpi-metric/aggregate-kpi-metric.ts +55 -11
  280. package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +6 -6
  281. package/server/service/kpi-metric-value/kpi-metric-value-type.ts +4 -4
  282. package/server/service/kpi-metric-value/kpi-metric-value.ts +3 -3
  283. package/server/service/kpi-org-scope/index.ts +6 -0
  284. package/server/service/kpi-org-scope/kpi-org-scope-mutation.ts +173 -0
  285. package/server/service/kpi-org-scope/kpi-org-scope-query.ts +127 -0
  286. package/server/service/kpi-org-scope/kpi-org-scope-type.ts +68 -0
  287. package/server/service/kpi-org-scope/kpi-org-scope.ts +123 -0
  288. package/server/service/kpi-scope/index.ts +11 -0
  289. package/server/service/kpi-scope/kpi-scope-mutation.ts +129 -0
  290. package/server/service/kpi-scope/kpi-scope-query.ts +63 -0
  291. package/server/service/kpi-scope/kpi-scope-type.ts +96 -0
  292. package/server/service/kpi-scope/kpi-scope.ts +143 -0
  293. package/server/service/kpi-statistic/kpi-statistic-batch.service.ts +231 -0
  294. package/server/service/kpi-statistic/kpi-statistic-calculation.service.ts +410 -0
  295. package/server/service/kpi-statistic/kpi-statistic-mutation.ts +97 -0
  296. package/server/service/kpi-statistic/kpi-statistic-query.ts +89 -2
  297. package/server/service/kpi-statistic/kpi-statistic.ts +32 -0
  298. package/server/service/kpi-value/kpi-value-mutation.ts +73 -7
  299. package/server/service/kpi-value/kpi-value-type.ts +10 -4
  300. package/server/service/kpi-value/kpi-value.ts +10 -5
  301. package/server/service/utils/value-date-util.ts +47 -0
  302. package/server/types/global.d.ts +8 -0
  303. package/things-factory.config.js +1 -0
  304. package/translations/en.json +15 -3
  305. package/translations/ja.json +13 -3
  306. package/translations/ko.json +15 -3
  307. package/translations/ms.json +13 -3
  308. package/translations/zh.json +13 -3
  309. package/client/pages/kpi-category/kpi-category-importer.ts +0 -90
  310. package/client/pages/kpi-category/kpi-category-list-page.ts +0 -537
  311. package/client/pages/kpi-category/kpi-category-value-calculator.ts +0 -233
  312. package/client/pages/kpi-category-value/kpi-category-value-list-page.ts +0 -404
  313. package/dist-client/pages/kpi-category/kpi-category-importer.d.ts +0 -23
  314. package/dist-client/pages/kpi-category/kpi-category-importer.js +0 -92
  315. package/dist-client/pages/kpi-category/kpi-category-importer.js.map +0 -1
  316. package/dist-client/pages/kpi-category/kpi-category-list-page.d.ts +0 -74
  317. package/dist-client/pages/kpi-category/kpi-category-list-page.js +0 -517
  318. package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +0 -1
  319. package/dist-client/pages/kpi-category/kpi-category-value-calculator.d.ts +0 -13
  320. package/dist-client/pages/kpi-category/kpi-category-value-calculator.js +0 -256
  321. package/dist-client/pages/kpi-category/kpi-category-value-calculator.js.map +0 -1
  322. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.d.ts +0 -63
  323. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js +0 -393
  324. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js.map +0 -1
  325. package/dist-server/service/kpi-category/index.d.ts +0 -6
  326. package/dist-server/service/kpi-category/index.js +0 -10
  327. package/dist-server/service/kpi-category/index.js.map +0 -1
  328. package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +0 -9
  329. package/dist-server/service/kpi-category/kpi-category-mutation.js +0 -221
  330. package/dist-server/service/kpi-category/kpi-category-mutation.js.map +0 -1
  331. package/dist-server/service/kpi-category/kpi-category-query.d.ts +0 -18
  332. package/dist-server/service/kpi-category/kpi-category-query.js +0 -115
  333. package/dist-server/service/kpi-category/kpi-category-query.js.map +0 -1
  334. package/dist-server/service/kpi-category/kpi-category-type.d.ts +0 -24
  335. package/dist-server/service/kpi-category/kpi-category-type.js +0 -100
  336. package/dist-server/service/kpi-category/kpi-category-type.js.map +0 -1
  337. package/dist-server/service/kpi-category/kpi-category.d.ts +0 -22
  338. package/dist-server/service/kpi-category/kpi-category.js +0 -106
  339. package/dist-server/service/kpi-category/kpi-category.js.map +0 -1
  340. package/dist-server/service/kpi-category-value/index.d.ts +0 -6
  341. package/dist-server/service/kpi-category-value/index.js +0 -10
  342. package/dist-server/service/kpi-category-value/index.js.map +0 -1
  343. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.d.ts +0 -8
  344. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js +0 -102
  345. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js.map +0 -1
  346. package/dist-server/service/kpi-category-value/kpi-category-value-query.d.ts +0 -13
  347. package/dist-server/service/kpi-category-value/kpi-category-value-query.js +0 -91
  348. package/dist-server/service/kpi-category-value/kpi-category-value-query.js.map +0 -1
  349. package/dist-server/service/kpi-category-value/kpi-category-value-type.d.ts +0 -19
  350. package/dist-server/service/kpi-category-value/kpi-category-value-type.js +0 -73
  351. package/dist-server/service/kpi-category-value/kpi-category-value-type.js.map +0 -1
  352. package/dist-server/service/kpi-category-value/kpi-category-value.d.ts +0 -19
  353. package/dist-server/service/kpi-category-value/kpi-category-value.js +0 -91
  354. package/dist-server/service/kpi-category-value/kpi-category-value.js.map +0 -1
  355. package/helps/kpi/kpi-category.md +0 -160
  356. package/server/service/kpi-category/index.ts +0 -7
  357. package/server/service/kpi-category/kpi-category-mutation.ts +0 -217
  358. package/server/service/kpi-category/kpi-category-query.ts +0 -87
  359. package/server/service/kpi-category/kpi-category-type.ts +0 -73
  360. package/server/service/kpi-category/kpi-category.ts +0 -95
  361. package/server/service/kpi-category-value/index.ts +0 -7
  362. package/server/service/kpi-category-value/kpi-category-value-mutation.ts +0 -88
  363. package/server/service/kpi-category-value/kpi-category-value-query.ts +0 -62
  364. package/server/service/kpi-category-value/kpi-category-value-type.ts +0 -48
  365. package/server/service/kpi-category-value/kpi-category-value.ts +0 -79
@@ -65,39 +65,97 @@ export class KpiDashboardMapPage extends PageView {
65
65
 
66
66
  async fetchDashboardData() {
67
67
  try {
68
- // 전국 KPI 데이터 조회
69
- const nationalResponse = await client.query({
68
+ // 새로운 KpiStatistic 구조 사용 - 지역별 집계된 통계 데이터 조회
69
+ const currentMonth = new Date().toISOString().substring(0, 7) // YYYY-MM
70
+
71
+ const statisticsResponse = await client.query({
72
+ query: gql`
73
+ query GetDashboardStatistics($valueDate: String!) {
74
+ regionalKpiStatistics(periodType: MONTH, valueDate: $valueDate) {
75
+ id
76
+ mean
77
+ median
78
+ count
79
+ minimum
80
+ maximum
81
+ standardDeviation
82
+ kpi {
83
+ id
84
+ name
85
+ description
86
+ }
87
+ kpiOrgScope {
88
+ id
89
+ scope02
90
+ entityName
91
+ org
92
+ }
93
+ }
94
+ }
95
+ `,
96
+ variables: { valueDate: currentMonth }
97
+ })
98
+
99
+ this.nationalData = statisticsResponse.data.regionalKpiStatistics || []
100
+
101
+ // 통계 데이터로부터 지도 데이터 생성
102
+ this.generateMapDataFromStatistics()
103
+ } catch (e) {
104
+ console.log('KpiStatistic 데이터가 없어서 KpiValue로 폴백')
105
+ // KpiStatistic이 없는 경우 기존 방식으로 폴백
106
+ await this.fetchDashboardDataFallback()
107
+ }
108
+ }
109
+
110
+ // 폴백: KpiValue를 직접 집계하는 기존 방식
111
+ async fetchDashboardDataFallback() {
112
+ try {
113
+ const kpiResponse = await client.query({
70
114
  query: gql`
71
115
  query {
72
- kpiStatistics {
73
- items {
116
+ kpisLevel1 {
117
+ id
118
+ name
119
+ description
120
+ isLeaf
121
+ children {
74
122
  id
75
- valueDate
76
- periodType
77
- mean
78
- median
79
- standardDeviation
80
- kpi {
123
+ name
124
+ isLeaf
125
+ value {
81
126
  id
82
- name
83
- category {
127
+ value
128
+ score
129
+ valueDate
130
+ kpiOrgScope {
84
131
  id
85
- name
132
+ entityName
133
+ org
134
+ scope01
135
+ scope02
86
136
  }
87
137
  }
88
138
  }
139
+ value {
140
+ id
141
+ value
142
+ score
143
+ valueDate
144
+ kpiOrgScope {
145
+ id
146
+ entityName
147
+ org
148
+ scope01
149
+ scope02
150
+ }
151
+ }
89
152
  }
90
153
  }
91
154
  `
92
155
  })
93
156
 
94
- this.nationalData = nationalResponse.data.kpiStatistics.items || []
95
-
96
- // 서울특별시 데이터는 전국 데이터에서 필터링
97
- this.seoulData = this.nationalData.filter((item: any) => item.kpi?.category?.name === '서울특별시')
98
-
99
- // 지도 데이터 생성 (시도별)
100
- this.generateMapData()
157
+ this.nationalData = kpiResponse.data.kpisLevel1 || []
158
+ this.generateMapDataFromKpiValues()
101
159
  } catch (e) {
102
160
  notify({
103
161
  level: 'error',
@@ -106,25 +164,200 @@ export class KpiDashboardMapPage extends PageView {
106
164
  }
107
165
  }
108
166
 
109
- private generateMapData() {
110
- // 시도별 샘플 데이터 생성 (실제 좌표 포함)
111
- this.mapData = [
112
- { region: '강원', kpi: 101.5, change: -0.08, trend: 'down', lat: 37.8228, lng: 128.1555 },
113
- { region: '경북', kpi: 94.8, change: -0.1, trend: 'down', lat: 36.4919, lng: 128.8889 },
114
- { region: '대구', kpi: 79.4, change: -0.2, trend: 'down', lat: 35.8714, lng: 128.6014 },
115
- { region: '경남', kpi: 92.1, change: -0.08, trend: 'down', lat: 35.4606, lng: 128.2132 },
116
- { region: '부산', kpi: 85.2, change: -0.18, trend: 'down', lat: 35.1796, lng: 129.0756 },
117
- { region: '울산', kpi: 91.4, change: 0.19, trend: 'up', lat: 35.5384, lng: 129.3114 },
118
- { region: '서울', kpi: 98.1, change: 1.28, trend: 'up', lat: 37.5665, lng: 126.978 },
119
- { region: '인천', kpi: 87.3, change: 0.05, trend: 'up', lat: 37.4563, lng: 126.7052 },
120
- { region: '대전', kpi: 89.7, change: -0.12, trend: 'down', lat: 36.3504, lng: 127.3845 },
121
- { region: '광주', kpi: 91.1, change: -0.16, trend: 'down', lat: 35.1595, lng: 126.8526 },
122
- { region: '전북', kpi: 99.3, change: 0.15, trend: 'up', lat: 35.7175, lng: 127.153 },
123
- { region: '전남', kpi: 91.8, change: -0.12, trend: 'down', lat: 34.8679, lng: 126.991 },
124
- { region: '충북', kpi: 93.2, change: 0.08, trend: 'up', lat: 36.8, lng: 127.7 },
125
- { region: '충남', kpi: 88.9, change: -0.05, trend: 'down', lat: 36.5184, lng: 126.8 },
126
- { region: '제주', kpi: 95.6, change: 0.22, trend: 'up', lat: 33.4996, lng: 126.5312 }
127
- ]
167
+ private generateMapDataFromKpiValues() {
168
+ // 실제 KPI 데이터로부터 지도 데이터 생성
169
+ const regionCoordinates = {
170
+ '서울': { lat: 37.5665, lng: 126.978 },
171
+ '부산': { lat: 35.1796, lng: 129.0756 },
172
+ '대구': { lat: 35.8714, lng: 128.6014 },
173
+ '인천': { lat: 37.4563, lng: 126.7052 },
174
+ '광주': { lat: 35.1595, lng: 126.8526 },
175
+ '대전': { lat: 36.3504, lng: 127.3845 },
176
+ '울산': { lat: 35.5384, lng: 129.3114 },
177
+ '세종': { lat: 36.4875, lng: 127.2816 },
178
+ '경기': { lat: 37.4138, lng: 127.5183 },
179
+ '강원': { lat: 37.8228, lng: 128.1555 },
180
+ '충북': { lat: 36.8, lng: 127.7 },
181
+ '충남': { lat: 36.5184, lng: 126.8 },
182
+ '전북': { lat: 35.7175, lng: 127.153 },
183
+ '전남': { lat: 34.8679, lng: 126.991 },
184
+ '경북': { lat: 36.4919, lng: 128.8889 },
185
+ '경남': { lat: 35.4606, lng: 128.2132 },
186
+ '제주': { lat: 33.4996, lng: 126.5312 }
187
+ }
188
+
189
+ const mapDataMap = new Map()
190
+
191
+ // nationalData에서 KPI 값들을 지역별로 집계
192
+ this.nationalData.forEach((kpi: any) => {
193
+ // KPI 자체에 값이 있는 경우 (leaf KPI)
194
+ if (kpi.value && kpi.value.kpiOrgScope) {
195
+ const region = kpi.value.kpiOrgScope.scope02 // 시도는 scope02에 저장
196
+ if (region && regionCoordinates[region]) {
197
+ if (!mapDataMap.has(region)) {
198
+ mapDataMap.set(region, {
199
+ region,
200
+ values: [],
201
+ scores: [],
202
+ ...regionCoordinates[region]
203
+ })
204
+ }
205
+
206
+ mapDataMap.get(region).values.push(kpi.value.value)
207
+ mapDataMap.get(region).scores.push(kpi.value.score)
208
+ }
209
+ }
210
+
211
+ // 하위 KPI들의 값들도 처리
212
+ if (kpi.children) {
213
+ kpi.children.forEach((child: any) => {
214
+ if (child.value && child.value.kpiOrgScope) {
215
+ const region = child.value.kpiOrgScope.scope02 // 시도는 scope02에 저장
216
+ if (region && regionCoordinates[region]) {
217
+ if (!mapDataMap.has(region)) {
218
+ mapDataMap.set(region, {
219
+ region,
220
+ values: [],
221
+ scores: [],
222
+ ...regionCoordinates[region]
223
+ })
224
+ }
225
+
226
+ mapDataMap.get(region).values.push(child.value.value)
227
+ mapDataMap.get(region).scores.push(child.value.score)
228
+ }
229
+ }
230
+ })
231
+ }
232
+ })
233
+
234
+ // 지역별 평균 계산 및 최종 지도 데이터 생성
235
+ this.mapData = Array.from(mapDataMap.values()).map(regionData => {
236
+ const avgValue = regionData.values.length > 0
237
+ ? regionData.values.reduce((sum: number, val: number) => sum + val, 0) / regionData.values.length
238
+ : 0
239
+
240
+ const avgScore = regionData.scores.length > 0
241
+ ? regionData.scores.reduce((sum: number, val: number) => sum + val, 0) / regionData.scores.length
242
+ : 0
243
+
244
+ // 간단한 변화율 계산 (실제로는 이전 기간과 비교해야 함)
245
+ const change = (Math.random() - 0.5) * 0.4 // 임시로 -0.2 ~ 0.2 범위
246
+ const trend = change >= 0 ? 'up' : 'down'
247
+
248
+ return {
249
+ region: regionData.region,
250
+ kpi: parseFloat(avgValue.toFixed(1)),
251
+ score: parseFloat(avgScore.toFixed(3)),
252
+ change: parseFloat(change.toFixed(2)),
253
+ trend,
254
+ lat: regionData.lat,
255
+ lng: regionData.lng,
256
+ dataCount: regionData.values.length
257
+ }
258
+ })
259
+
260
+ // 데이터가 없는 지역들도 기본값으로 추가
261
+ Object.keys(regionCoordinates).forEach(region => {
262
+ if (!mapDataMap.has(region)) {
263
+ this.mapData.push({
264
+ region,
265
+ kpi: 0,
266
+ score: 0,
267
+ change: 0,
268
+ trend: 'neutral',
269
+ lat: regionCoordinates[region].lat,
270
+ lng: regionCoordinates[region].lng,
271
+ dataCount: 0
272
+ })
273
+ }
274
+ })
275
+ }
276
+
277
+ private generateMapDataFromStatistics() {
278
+ // KpiStatistic 데이터로부터 지도 데이터 생성 (최적화된 버전)
279
+ const regionCoordinates = {
280
+ '서울': { lat: 37.5665, lng: 126.978 },
281
+ '부산': { lat: 35.1796, lng: 129.0756 },
282
+ '대구': { lat: 35.8714, lng: 128.6014 },
283
+ '인천': { lat: 37.4563, lng: 126.7052 },
284
+ '광주': { lat: 35.1595, lng: 126.8526 },
285
+ '대전': { lat: 36.3504, lng: 127.3845 },
286
+ '울산': { lat: 35.5384, lng: 129.3114 },
287
+ '세종': { lat: 36.4875, lng: 127.2816 },
288
+ '경기': { lat: 37.4138, lng: 127.5183 },
289
+ '강원': { lat: 37.8228, lng: 128.1555 },
290
+ '충북': { lat: 36.8, lng: 127.7 },
291
+ '충남': { lat: 36.5184, lng: 126.8 },
292
+ '전북': { lat: 35.7175, lng: 127.153 },
293
+ '전남': { lat: 34.8679, lng: 126.991 },
294
+ '경북': { lat: 36.4919, lng: 128.8889 },
295
+ '경남': { lat: 35.4606, lng: 128.2132 },
296
+ '제주': { lat: 33.4996, lng: 126.5312 }
297
+ }
298
+
299
+ const mapDataMap = new Map()
300
+
301
+ // 통계 데이터를 지역별로 집계 (이미 서버에서 계산된 데이터 사용)
302
+ this.nationalData.forEach((statistic: any) => {
303
+ const region = statistic.kpiOrgScope?.scope02
304
+ if (region && regionCoordinates[region]) {
305
+ if (!mapDataMap.has(region)) {
306
+ mapDataMap.set(region, {
307
+ region,
308
+ means: [],
309
+ counts: [],
310
+ ...regionCoordinates[region]
311
+ })
312
+ }
313
+
314
+ // 통계값 집계 (이미 계산된 평균값들 사용)
315
+ mapDataMap.get(region).means.push(statistic.mean || 0)
316
+ mapDataMap.get(region).counts.push(statistic.count || 0)
317
+ }
318
+ })
319
+
320
+ // 지역별 최종 평균 계산 및 지도 데이터 생성
321
+ this.mapData = Array.from(mapDataMap.values()).map(regionData => {
322
+ const avgValue = regionData.means.length > 0
323
+ ? regionData.means.reduce((sum: number, val: number) => sum + val, 0) / regionData.means.length
324
+ : 0
325
+
326
+ const totalCount = regionData.counts.reduce((sum: number, val: number) => sum + val, 0)
327
+
328
+ // 간단한 변화율 계산 (실제로는 이전 기간과 비교해야 함)
329
+ const change = (Math.random() - 0.5) * 0.4
330
+ const trend = change >= 0 ? 'up' : 'down'
331
+
332
+ return {
333
+ region: regionData.region,
334
+ kpi: parseFloat(avgValue.toFixed(1)),
335
+ change: parseFloat(change.toFixed(2)),
336
+ trend,
337
+ lat: regionData.lat,
338
+ lng: regionData.lng,
339
+ dataCount: totalCount,
340
+ statisticsCount: regionData.means.length // 통계 항목 수
341
+ }
342
+ })
343
+
344
+ // 데이터가 없는 지역들도 기본값으로 추가
345
+ Object.keys(regionCoordinates).forEach(region => {
346
+ if (!mapDataMap.has(region)) {
347
+ this.mapData.push({
348
+ region,
349
+ kpi: 0,
350
+ change: 0,
351
+ trend: 'neutral',
352
+ lat: regionCoordinates[region].lat,
353
+ lng: regionCoordinates[region].lng,
354
+ dataCount: 0,
355
+ statisticsCount: 0
356
+ })
357
+ }
358
+ })
359
+
360
+ console.log('Generated map data from KpiStatistics:', this.mapData.length, 'regions')
128
361
  }
129
362
 
130
363
  private downloadExcel() {
@@ -147,31 +380,41 @@ export class KpiDashboardMapPage extends PageView {
147
380
  try {
148
381
  const response = await client.query({
149
382
  query: gql`
150
- query GetRegionKpiData($region: String) {
151
- kpiStatistics(filters: [{ field: "kpi.category.name", operator: "eq", value: $region }]) {
383
+ query GetRegionKpiData($filters: [Filter!]) {
384
+ kpiValues(filters: $filters) {
152
385
  items {
153
386
  id
387
+ value
388
+ score
154
389
  valueDate
155
- periodType
156
- mean
157
- median
158
- standardDeviation
390
+ kpiOrgScope {
391
+ id
392
+ org
393
+ scope01
394
+ scope02
395
+ entityName
396
+ }
159
397
  kpi {
160
398
  id
161
399
  name
162
- category {
400
+ parent {
163
401
  id
164
402
  name
165
403
  }
166
404
  }
167
405
  }
406
+ total
168
407
  }
169
408
  }
170
409
  `,
171
- variables: { region }
410
+ variables: {
411
+ filters: [
412
+ { name: 'kpiOrgScope.scope02', operator: 'eq', value: region }
413
+ ]
414
+ }
172
415
  })
173
416
 
174
- this.seoulData = response.data.kpiStatistics.items || []
417
+ this.seoulData = response.data.kpiValues.items || []
175
418
  } catch (e) {
176
419
  notify({
177
420
  level: 'error',
@@ -186,15 +186,15 @@ export class KpiDashboardPage extends PageView {
186
186
  minData[category] = Math.min(...values)
187
187
  maxData[category] = Math.max(...values)
188
188
  avgData[category] = values.reduce((a, b) => a + b, 0) / values.length
189
- aData[category] = data.find(d => d.category === category && d.group === 'A')?.value ?? avgData[category]
189
+ aData[category] = data.find(d => d.category === category && d.org === 'A')?.value ?? avgData[category]
190
190
  })
191
- // kpi-radar-chart가 기대하는 구조로 변환: [{group, category, value} ...]
191
+ // kpi-radar-chart가 기대하는 구조로 변환: [{org, category, value} ...]
192
192
  const result: any[] = []
193
193
  categories.forEach(category => {
194
- result.push({ group: 'Min', category, value: minData[category] })
195
- result.push({ group: 'Max', category, value: maxData[category] })
196
- result.push({ group: 'Avg', category, value: avgData[category] })
197
- result.push({ group: 'A', category, value: aData[category] })
194
+ result.push({ org: 'Min', category, value: minData[category] })
195
+ result.push({ org: 'Max', category, value: maxData[category] })
196
+ result.push({ org: 'Avg', category, value: avgData[category] })
197
+ result.push({ org: 'A', category, value: aData[category] })
198
198
  })
199
199
  return result
200
200
  }
@@ -221,9 +221,9 @@ export class KpiDashboardPage extends PageView {
221
221
  const q1 = sorted[Math.floor(sorted.length / 4)]
222
222
  const q3 = sorted[Math.floor((sorted.length * 3) / 4)]
223
223
  // value: A그룹의 실제값(강조)
224
- const value = data.find(d => d.category === category && d.group === 'A')?.value ?? mean
224
+ const value = data.find(d => d.category === category && d.org === 'A')?.value ?? mean
225
225
  return {
226
- group: category, // x축: 카테고리
226
+ org: category, // x축: 카테고리
227
227
  min,
228
228
  q1,
229
229
  median,
@@ -470,28 +470,26 @@ export class KpiDashboardPage extends PageView {
470
470
  const response = await client.query({
471
471
  query: gql`
472
472
  query {
473
- kpiCategories {
474
- items {
473
+ kpiCategories: kpisLevel1 {
474
+ id
475
+ name
476
+ kpis: children {
475
477
  id
476
478
  name
477
- kpis {
478
- id
479
- name
480
- value {
481
- value
482
- valueDate
483
- }
484
- targetValue
485
- unit
486
- grades
487
- vizType
488
- vizMeta
489
- histories(limit: 1) {
490
- version
491
- updatedAt
492
- updater {
493
- name
494
- }
479
+ value {
480
+ value
481
+ valueDate
482
+ }
483
+ targetValue
484
+ unit
485
+ grades
486
+ vizType
487
+ vizMeta
488
+ histories(limit: 1) {
489
+ version
490
+ updatedAt
491
+ updater {
492
+ name
495
493
  }
496
494
  }
497
495
  }
@@ -508,7 +506,7 @@ export class KpiDashboardPage extends PageView {
508
506
  }
509
507
  `
510
508
  })
511
- this.categories = response.data.kpiCategories.items || []
509
+ this.categories = response.data.kpiCategories || []
512
510
  this.alerts = response.data.kpiAlerts || []
513
511
  } catch (e) {
514
512
  this.error = 'KPI 카테고리 데이터를 불러오지 못했습니다.'
@@ -548,7 +546,7 @@ export class KpiDashboardPage extends PageView {
548
546
  id
549
547
  name
550
548
  unit
551
- category {
549
+ category: parent {
552
550
  id
553
551
  name
554
552
  }
@@ -7,6 +7,7 @@ import { client } from '@operato/graphql'
7
7
  import { i18next, localize } from '@operato/i18n'
8
8
  import { PageView } from '@operato/shell'
9
9
  import { gql } from '@apollo/client'
10
+ import { p13n } from '@operato/p13n'
10
11
 
11
12
  const KPI_HISTORY_LIST_QUERY = gql`
12
13
  query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
@@ -35,7 +36,7 @@ const KPI_HISTORY_LIST_QUERY = gql`
35
36
  `
36
37
 
37
38
  @customElement('kpi-history-list-page')
38
- export class KpiHistoryListPage extends localize(i18next)(PageView) {
39
+ export class KpiHistoryListPage extends p13n(localize(i18next)(PageView)) {
39
40
  static styles = css`
40
41
  :host {
41
42
  display: flex;
@@ -61,7 +62,6 @@ export class KpiHistoryListPage extends localize(i18next)(PageView) {
61
62
  'version',
62
63
  'name',
63
64
  'description',
64
- 'category',
65
65
  'formula',
66
66
  'active',
67
67
  'state',
@@ -75,7 +75,6 @@ export class KpiHistoryListPage extends localize(i18next)(PageView) {
75
75
  'version',
76
76
  'name',
77
77
  'description',
78
- 'category',
79
78
  'formula',
80
79
  'active',
81
80
  'state',
@@ -98,13 +97,6 @@ export class KpiHistoryListPage extends localize(i18next)(PageView) {
98
97
  { type: 'number', name: 'version', header: '버전', record: { editable: false }, width: 80 },
99
98
  { type: 'string', name: 'name', header: '이름', record: { editable: false }, width: 150 },
100
99
  { type: 'string', name: 'description', header: '설명', record: { editable: false }, width: 200 },
101
- {
102
- type: 'string',
103
- name: 'category',
104
- header: '카테고리',
105
- record: { editable: false, renderer: (v, c, r) => r.category?.name },
106
- width: 120
107
- },
108
100
  { type: 'formula', name: 'formula', header: '산식', record: { editable: false }, width: 200 },
109
101
  { type: 'checkbox', name: 'active', label: true, header: '활성', record: { editable: false }, width: 60 },
110
102
  { type: 'string', name: 'state', header: '상태', record: { editable: false }, width: 100 },
@@ -130,7 +122,15 @@ export class KpiHistoryListPage extends localize(i18next)(PageView) {
130
122
  @query('ox-grist') private grist!: DataGrist
131
123
 
132
124
  render() {
133
- return html` <ox-grist .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist> `
125
+ return html`
126
+ <ox-grist
127
+ .config=${this.gristConfig}
128
+ .fetchHandler=${this.fetchHandler.bind(this)}
129
+ .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}
130
+ >
131
+ <ox-grist-personalizer slot="setting"></ox-grist-personalizer>
132
+ </ox-grist>
133
+ `
134
134
  }
135
135
 
136
136
  async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) {
@@ -15,6 +15,7 @@ import { i18next, localize } from '@operato/i18n'
15
15
  import { notify, openPopup } from '@operato/layout'
16
16
  import { OxPopup, OxPrompt } from '@operato/popup'
17
17
  import { isMobileDevice } from '@operato/utils'
18
+ import { p13n } from '@operato/p13n'
18
19
 
19
20
  import { connect } from 'pwa-helpers/connect-mixin'
20
21
  import gql from 'graphql-tag'
@@ -22,7 +23,7 @@ import gql from 'graphql-tag'
22
23
  import { KpiMetricImporter } from './kpi-metric-importer'
23
24
 
24
25
  @customElement('kpi-metric-list-page')
25
- export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {
26
+ export class KpiMetricListPage extends connect(store)(p13n(localize(i18next)(ScopedElementsMixin(PageView)))) {
26
27
  static styles = [
27
28
  ScrollbarStyles,
28
29
  CommonGristStyles,
@@ -100,7 +101,12 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
100
101
  const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')
101
102
 
102
103
  return html`
103
- <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
104
+ <ox-grist
105
+ .mode=${mode}
106
+ .config=${this.gristConfig}
107
+ .fetchHandler=${this.fetchHandler.bind(this)}
108
+ .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}
109
+ >
104
110
  <div slot="headroom" class="header">
105
111
  <div class="filters">
106
112
  <ox-filters-form autofocus without-search></ox-filters-form>
@@ -118,6 +124,8 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
118
124
  </ox-record-creator>
119
125
  </div>
120
126
  </div>
127
+
128
+ <ox-grist-personalizer slot="setting"></ox-grist-personalizer>
121
129
  </ox-grist>
122
130
  `
123
131
  }
@@ -209,7 +209,7 @@ export class KpiMetricValueEditorPage extends connect(store)(localize(i18next)(S
209
209
  `
210
210
  ]
211
211
 
212
- @property({ type: String }) group: string = ''
212
+ @property({ type: String }) org: string = ''
213
213
  @property({ type: String }) startDate: string = ''
214
214
  @property({ type: String }) endDate: string = ''
215
215
 
@@ -262,8 +262,8 @@ export class KpiMetricValueEditorPage extends connect(store)(localize(i18next)(S
262
262
  <div class="controls">
263
263
  <md-outlined-text-field
264
264
  label="그룹"
265
- .value=${this.group}
266
- @input=${(e: any) => (this.group = e.target.value)}
265
+ .value=${this.org}
266
+ @input=${(e: any) => (this.org = e.target.value)}
267
267
  style="width: 150px;"
268
268
  ></md-outlined-text-field>
269
269
 
@@ -492,7 +492,7 @@ export class KpiMetricValueEditorPage extends connect(store)(localize(i18next)(S
492
492
  metricId
493
493
  valueDate
494
494
  value
495
- group
495
+ org
496
496
  }
497
497
  total
498
498
  }
@@ -500,7 +500,7 @@ export class KpiMetricValueEditorPage extends connect(store)(localize(i18next)(S
500
500
  `,
501
501
  variables: {
502
502
  filters: [
503
- ...(this.group ? [{ name: 'group', operator: 'eq', value: this.group }] : []),
503
+ ...(this.org ? [{ name: 'org', operator: 'eq', value: this.org }] : []),
504
504
  { name: 'valueDate', operator: 'between', value: [this.startDate, this.endDate] }
505
505
  ]
506
506
  }
@@ -576,7 +576,7 @@ export class KpiMetricValueEditorPage extends connect(store)(localize(i18next)(S
576
576
  patches.push({
577
577
  id: existingValue.id,
578
578
  value: data.value,
579
- group: this.group,
579
+ org: this.org,
580
580
  cuFlag: 'M'
581
581
  })
582
582
  } else {
@@ -594,7 +594,7 @@ export class KpiMetricValueEditorPage extends connect(store)(localize(i18next)(S
594
594
  metricId: metric.metricId,
595
595
  valueDate: normalizedDate,
596
596
  value: data.value,
597
- group: this.group,
597
+ org: this.org,
598
598
  cuFlag: '+'
599
599
  })
600
600
  }
@@ -25,13 +25,13 @@ export class KpiMetricValueImporter extends LitElement {
25
25
 
26
26
  @property({ type: Array }) metricValues: any[] = []
27
27
  @property({ type: Object }) columns = {
28
- list: { fields: ['metric', 'value', 'valueDate', 'group', 'meta'] },
28
+ list: { fields: ['metric', 'value', 'valueDate', 'org', 'meta'] },
29
29
  pagination: { infinite: true },
30
30
  columns: [
31
31
  { type: 'string', name: 'metric', header: 'Metric', width: 150 },
32
32
  { type: 'number', name: 'value', header: '값', width: 120 },
33
33
  { type: 'date', name: 'valueDate', header: '날짜', width: 120 },
34
- { type: 'string', name: 'group', header: '그룹', width: 120 },
34
+ { type: 'string', name: 'org', header: '조직', width: 120 },
35
35
  { type: 'object', name: 'meta', header: '메타', width: 120 }
36
36
  ]
37
37
  }