@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
@@ -1,5 +1,6 @@
1
1
  import { LitElement, html, css } from 'lit'
2
2
  import { customElement, property, state } from 'lit/decorators.js'
3
+ import { ScrollbarStyles } from '@operato/styles'
3
4
 
4
5
  import '../../../charts/kpi-radar-chart.js'
5
6
  import '../../../charts/kpi-boxplot-chart.js'
@@ -7,165 +8,168 @@ import '../../../charts/kpi-mini-trend-chart.js'
7
8
 
8
9
  @customElement('kpi-left-panel')
9
10
  export class KpiLeftPanel extends LitElement {
10
- static styles = css`
11
- :host {
12
- display: block;
13
- width: 400px;
14
- background: #fff;
15
- border-right: 1px solid #e0e0e0;
16
- overflow: hidden;
17
- display: flex;
18
- flex-direction: column;
19
- box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
20
- }
21
- .panel-content {
22
- padding: 24px;
23
- overflow-y: auto;
24
- flex: 1;
25
- }
26
- .panel-header {
27
- display: flex;
28
- justify-content: space-between;
29
- align-items: center;
30
- padding: 20px 24px;
31
- border-bottom: 1px solid #e0e0e0;
32
- background: #fff;
33
- height: 70px;
34
- box-sizing: border-box;
35
- }
36
- .panel-title {
37
- font-size: 1.3rem;
38
- font-weight: bold;
39
- color: #333;
40
- margin: 0;
41
- }
42
- .panel-close {
43
- width: 32px;
44
- height: 32px;
45
- border: none;
46
- background: #fff;
47
- border-radius: 50%;
48
- cursor: pointer;
49
- display: flex;
50
- align-items: center;
51
- justify-content: center;
52
- font-size: 1.2rem;
53
- color: #666;
54
- transition: all 0.2s;
55
- }
56
- .panel-close:hover {
57
- background: #e9ecef;
58
- color: #333;
59
- }
60
- .sub-title {
61
- font-size: 1rem;
62
- font-weight: 600;
63
- margin-bottom: 16px;
64
- color: #495057;
65
- }
66
- .chart-section {
67
- background: #f8f9fa;
68
- border-radius: 8px;
69
- padding: 16px;
70
- margin-bottom: 20px;
71
- }
72
- .chart-toggle {
73
- display: flex;
74
- gap: 8px;
75
- margin-bottom: 16px;
76
- }
77
- .toggle-button {
78
- padding: 8px 16px;
79
- border: 1px solid #ced4da;
80
- background: #fff;
81
- border-radius: 6px;
82
- cursor: pointer;
83
- font-size: 0.9rem;
84
- transition: all 0.2s;
85
- }
86
- .toggle-button.active {
87
- background: #667eea;
88
- color: white;
89
- border-color: #667eea;
90
- }
91
- .chart-container {
92
- height: 300px;
93
- display: flex;
94
- align-items: center;
95
- justify-content: center;
96
- background: white;
97
- border-radius: 6px;
98
- border: 1px solid #e9ecef;
99
- }
100
- .performance-table {
101
- width: 100%;
102
- border-collapse: collapse;
103
- margin-top: 16px;
104
- }
105
- .performance-table th,
106
- .performance-table td {
107
- padding: 12px 8px;
108
- text-align: left;
109
- border-bottom: 1px solid #e9ecef;
110
- }
111
- .performance-table th {
112
- background: #f8f9fa;
113
- font-weight: 600;
114
- color: #495057;
115
- }
116
- .performance-table td {
117
- color: #333;
118
- }
119
- .change-rate {
120
- display: flex;
121
- align-items: center;
122
- gap: 4px;
123
- }
124
- .change-up {
125
- color: #dc3545;
126
- }
127
- .change-down {
128
- color: #198754;
129
- }
130
- .change-neutral {
131
- color: #6c757d;
132
- }
133
- .trend-chart {
134
- width: 60px;
135
- height: 30px;
136
- background: #f8f9fa;
137
- border-radius: 4px;
138
- display: flex;
139
- align-items: center;
140
- justify-content: center;
141
- font-size: 0.8rem;
142
- color: #666;
143
- }
144
- .download-button {
145
- margin-top: 16px;
146
- padding: 8px 16px;
147
- background: #28a745;
148
- color: white;
149
- border: none;
150
- border-radius: 6px;
151
- cursor: pointer;
152
- font-size: 0.9rem;
153
- display: flex;
154
- align-items: center;
155
- gap: 8px;
156
- }
157
- .download-button:hover {
158
- background: #218838;
159
- }
160
- .category-select {
161
- width: 100%;
162
- padding: 8px 12px;
163
- border: 1px solid #ced4da;
164
- border-radius: 6px;
165
- background: white;
166
- margin-bottom: 20px;
167
- }
168
- `
11
+ static styles = [
12
+ ScrollbarStyles,
13
+ css`
14
+ :host {
15
+ display: block;
16
+ width: 400px;
17
+ background: #fff;
18
+ border-right: 1px solid #e0e0e0;
19
+ overflow: hidden;
20
+ display: flex;
21
+ flex-direction: column;
22
+ box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
23
+ }
24
+ .panel-content {
25
+ padding: 20px;
26
+ overflow-y: auto;
27
+ flex: 1;
28
+ }
29
+ .panel-header {
30
+ display: flex;
31
+ justify-content: space-between;
32
+ align-items: center;
33
+ padding: 20px;
34
+ border-bottom: 1px solid #e0e0e0;
35
+ background: #fff;
36
+ height: 70px;
37
+ box-sizing: border-box;
38
+ }
39
+ .panel-title {
40
+ font-size: 1.3rem;
41
+ font-weight: bold;
42
+ color: #333;
43
+ margin: 0;
44
+ }
45
+ .panel-close {
46
+ width: 32px;
47
+ height: 32px;
48
+ border: none;
49
+ background: #fff;
50
+ border-radius: 50%;
51
+ cursor: pointer;
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ font-size: 1.2rem;
56
+ color: #666;
57
+ transition: all 0.2s;
58
+ }
59
+ .panel-close:hover {
60
+ background: #e9ecef;
61
+ color: #333;
62
+ }
63
+ .sub-title {
64
+ font-size: 1rem;
65
+ font-weight: 600;
66
+ margin-bottom: 16px;
67
+ color: #495057;
68
+ }
69
+ .chart-section {
70
+ background: #f8f9fa;
71
+ border-radius: 8px;
72
+ padding: 16px;
73
+ margin-bottom: 20px;
74
+ }
75
+ .chart-toggle {
76
+ display: flex;
77
+ gap: 8px;
78
+ margin-bottom: 16px;
79
+ }
80
+ .toggle-button {
81
+ padding: 8px 16px;
82
+ border: 1px solid #ced4da;
83
+ background: #fff;
84
+ border-radius: 6px;
85
+ cursor: pointer;
86
+ font-size: 0.9rem;
87
+ transition: all 0.2s;
88
+ }
89
+ .toggle-button.active {
90
+ background: #667eea;
91
+ color: white;
92
+ border-color: #667eea;
93
+ }
94
+ .chart-container {
95
+ height: 300px;
96
+ display: flex;
97
+ align-items: center;
98
+ justify-content: center;
99
+ background: white;
100
+ border-radius: 6px;
101
+ border: 1px solid #e9ecef;
102
+ }
103
+ .performance-table {
104
+ width: 100%;
105
+ border-collapse: collapse;
106
+ margin-top: 16px;
107
+ }
108
+ .performance-table th,
109
+ .performance-table td {
110
+ padding: 12px 8px;
111
+ text-align: left;
112
+ border-bottom: 1px solid #e9ecef;
113
+ }
114
+ .performance-table th {
115
+ background: #f8f9fa;
116
+ font-weight: 600;
117
+ color: #495057;
118
+ }
119
+ .performance-table td {
120
+ color: #333;
121
+ }
122
+ .change-rate {
123
+ display: flex;
124
+ align-items: center;
125
+ gap: 4px;
126
+ }
127
+ .change-up {
128
+ color: #dc3545;
129
+ }
130
+ .change-down {
131
+ color: #198754;
132
+ }
133
+ .change-neutral {
134
+ color: #6c757d;
135
+ }
136
+ .trend-chart {
137
+ width: 60px;
138
+ height: 30px;
139
+ background: #f8f9fa;
140
+ border-radius: 4px;
141
+ display: flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ font-size: 0.8rem;
145
+ color: #666;
146
+ }
147
+ .download-button {
148
+ margin-top: 16px;
149
+ padding: 8px 16px;
150
+ background: #28a745;
151
+ color: white;
152
+ border: none;
153
+ border-radius: 6px;
154
+ cursor: pointer;
155
+ font-size: 0.9rem;
156
+ display: flex;
157
+ align-items: center;
158
+ gap: 8px;
159
+ }
160
+ .download-button:hover {
161
+ background: #218838;
162
+ }
163
+ .category-select {
164
+ width: 100%;
165
+ padding: 8px 12px;
166
+ border: 1px solid #ced4da;
167
+ border-radius: 6px;
168
+ background: white;
169
+ margin-bottom: 20px;
170
+ }
171
+ `
172
+ ]
169
173
 
170
174
  @property({ type: String }) selectedCategory = '전체 KPI'
171
175
  @property({ type: String }) selectedChartType = 'boxplot'
@@ -174,6 +178,27 @@ export class KpiLeftPanel extends LitElement {
174
178
  @state() private chartData: any[] = []
175
179
  @state() private chartCategories: string[] = []
176
180
 
181
+ // 행정안전부 행정구역코드 순서
182
+ private readonly regionOrder = [
183
+ '서울특별시',
184
+ '부산광역시',
185
+ '대구광역시',
186
+ '인천광역시',
187
+ '광주광역시',
188
+ '대전광역시',
189
+ '울산광역시',
190
+ '세종특별자치시',
191
+ '경기도',
192
+ '강원도',
193
+ '충청북도',
194
+ '충청남도',
195
+ '전라북도',
196
+ '전라남도',
197
+ '경상북도',
198
+ '경상남도',
199
+ '제주특별자치도'
200
+ ]
201
+
177
202
  connectedCallback() {
178
203
  super.connectedCallback()
179
204
  this.generateChartData()
@@ -280,6 +305,18 @@ export class KpiLeftPanel extends LitElement {
280
305
  )
281
306
  }
282
307
 
308
+ // regionOrder에 따라 지역 데이터를 정렬
309
+ private getSortedRegionData() {
310
+ // 모든 시도에 대한 데이터 생성
311
+ return this.regionOrder.map(regionName => ({
312
+ region: regionName,
313
+ kpi: (Math.random() * 30 + 70).toFixed(1), // 70-100 범위
314
+ change: (Math.random() * 0.4 - 0.2).toFixed(2), // -0.2 ~ 0.2 범위
315
+ lat: 36.5,
316
+ lng: 127.5
317
+ }))
318
+ }
319
+
283
320
  private getChangeRateClass(change: number): string {
284
321
  if (change > 0) return 'change-up'
285
322
  if (change < 0) return 'change-down'
@@ -334,6 +371,7 @@ export class KpiLeftPanel extends LitElement {
334
371
  .groups=${this.chartCategories}
335
372
  .valueKey=${'value'}
336
373
  .currentGroup=${this.selectedCategory}
374
+ .independentScale=${true}
337
375
  ></kpi-boxplot-chart>
338
376
  `
339
377
  : html`
@@ -360,7 +398,7 @@ export class KpiLeftPanel extends LitElement {
360
398
  </tr>
361
399
  </thead>
362
400
  <tbody>
363
- ${this.mapData?.slice(0, 5).map(
401
+ ${this.getSortedRegionData().map(
364
402
  (item: any) => html`
365
403
  <tr
366
404
  style="cursor: pointer; transition: background-color 0.2s;"
@@ -56,6 +56,40 @@ export class KpiMapPanel extends LitElement {
56
56
  .category-button.active:hover {
57
57
  background: #5a6fd8;
58
58
  }
59
+ .period-form {
60
+ margin-top: 12px;
61
+ padding-top: 12px;
62
+ border-top: 1px solid #e9ecef;
63
+ }
64
+ .period-row {
65
+ display: flex;
66
+ align-items: center;
67
+ gap: 8px;
68
+ margin-bottom: 8px;
69
+ }
70
+ .period-label {
71
+ font-size: 0.85rem;
72
+ font-weight: 600;
73
+ color: #495057;
74
+ min-width: 40px;
75
+ }
76
+ .period-select {
77
+ padding: 4px 8px;
78
+ border: 1px solid #ced4da;
79
+ border-radius: 4px;
80
+ background: white;
81
+ font-size: 0.8rem;
82
+ cursor: pointer;
83
+ }
84
+ .period-select:focus {
85
+ outline: none;
86
+ border-color: #667eea;
87
+ }
88
+ .period-separator {
89
+ font-size: 0.85rem;
90
+ color: #6c757d;
91
+ margin: 0 4px;
92
+ }
59
93
  .map-container {
60
94
  flex: 1;
61
95
  position: relative;
@@ -117,6 +151,10 @@ export class KpiMapPanel extends LitElement {
117
151
  @property({ type: Array }) mapData: any[] = []
118
152
 
119
153
  @state() private map: any = null
154
+ @state() private startYear = '전체'
155
+ @state() private startMonth = '전체'
156
+ @state() private endYear = '전체'
157
+ @state() private endMonth = '전체'
120
158
 
121
159
  // mapData를 지도 마커 형식으로 변환
122
160
  get mapLocations() {
@@ -222,6 +260,21 @@ export class KpiMapPanel extends LitElement {
222
260
  }
223
261
  }
224
262
 
263
+ private onPeriodChange() {
264
+ this.dispatchEvent(
265
+ new CustomEvent('period-change', {
266
+ detail: {
267
+ startYear: this.startYear,
268
+ startMonth: this.startMonth,
269
+ endYear: this.endYear,
270
+ endMonth: this.endMonth
271
+ },
272
+ bubbles: true,
273
+ composed: true
274
+ })
275
+ )
276
+ }
277
+
225
278
  render() {
226
279
  return html`
227
280
  <div class="map-overlay">
@@ -263,6 +316,86 @@ export class KpiMapPanel extends LitElement {
263
316
  환경 성과
264
317
  </button>
265
318
  </div>
319
+
320
+ <!-- 기간 선택 폼 -->
321
+ <div class="period-form">
322
+ <div class="period-row">
323
+ <span class="period-label">기간:</span>
324
+ <select
325
+ class="period-select"
326
+ .value=${this.startYear}
327
+ @change=${(e: Event) => {
328
+ this.startYear = (e.target as HTMLSelectElement).value
329
+ this.onPeriodChange()
330
+ }}
331
+ >
332
+ <option value="전체">전체</option>
333
+ <option value="2025">2025년</option>
334
+ <option value="2024">2024년</option>
335
+ <option value="2023">2023년</option>
336
+ <option value="2022">2022년</option>
337
+ </select>
338
+ <select
339
+ class="period-select"
340
+ .value=${this.startMonth}
341
+ @change=${(e: Event) => {
342
+ this.startMonth = (e.target as HTMLSelectElement).value
343
+ this.onPeriodChange()
344
+ }}
345
+ >
346
+ <option value="전체">전체</option>
347
+ <option value="1">1월</option>
348
+ <option value="2">2월</option>
349
+ <option value="3">3월</option>
350
+ <option value="4">4월</option>
351
+ <option value="5">5월</option>
352
+ <option value="6">6월</option>
353
+ <option value="7">7월</option>
354
+ <option value="8">8월</option>
355
+ <option value="9">9월</option>
356
+ <option value="10">10월</option>
357
+ <option value="11">11월</option>
358
+ <option value="12">12월</option>
359
+ </select>
360
+ <span class="period-separator">~</span>
361
+ <select
362
+ class="period-select"
363
+ .value=${this.endYear}
364
+ @change=${(e: Event) => {
365
+ this.endYear = (e.target as HTMLSelectElement).value
366
+ this.onPeriodChange()
367
+ }}
368
+ >
369
+ <option value="전체">전체</option>
370
+ <option value="2025">2025년</option>
371
+ <option value="2024">2024년</option>
372
+ <option value="2023">2023년</option>
373
+ <option value="2022">2022년</option>
374
+ </select>
375
+ <select
376
+ class="period-select"
377
+ .value=${this.endMonth}
378
+ @change=${(e: Event) => {
379
+ this.endMonth = (e.target as HTMLSelectElement).value
380
+ this.onPeriodChange()
381
+ }}
382
+ >
383
+ <option value="전체">전체</option>
384
+ <option value="1">1월</option>
385
+ <option value="2">2월</option>
386
+ <option value="3">3월</option>
387
+ <option value="4">4월</option>
388
+ <option value="5">5월</option>
389
+ <option value="6">6월</option>
390
+ <option value="7">7월</option>
391
+ <option value="8">8월</option>
392
+ <option value="9">9월</option>
393
+ <option value="10">10월</option>
394
+ <option value="11">11월</option>
395
+ <option value="12">12월</option>
396
+ </select>
397
+ </div>
398
+ </div>
266
399
  </div>
267
400
 
268
401
  <div class="map-container">
@@ -24,7 +24,7 @@ export class KpiRegionPopup extends LitElement {
24
24
  box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
25
25
  }
26
26
  .popup-content {
27
- padding: 24px;
27
+ padding: 20px;
28
28
  overflow-y: auto;
29
29
  flex: 1;
30
30
  }
@@ -32,7 +32,7 @@ export class KpiRegionPopup extends LitElement {
32
32
  display: flex;
33
33
  justify-content: space-between;
34
34
  align-items: center;
35
- padding: 20px 24px;
35
+ padding: 20px;
36
36
  border-bottom: 1px solid #e0e0e0;
37
37
  background: #fff;
38
38
  height: 70px;
@@ -295,6 +295,7 @@ export class KpiRegionPopup extends LitElement {
295
295
  .groups=${this.chartCategories}
296
296
  .valueKey=${'value'}
297
297
  .currentGroup=${this.selectedRegion || '전체'}
298
+ .independentScale=${true}
298
299
  ></kpi-boxplot-chart>
299
300
  `
300
301
  : html`