@things-factory/kpi 10.1.246 → 10.1.248

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 (409) hide show
  1. package/package.json +6 -6
  2. package/dist-client/bootstrap.d.ts +0 -2
  3. package/dist-client/bootstrap.js +0 -7
  4. package/dist-client/bootstrap.js.map +0 -1
  5. package/dist-client/charts/kpi-boxplot-chart.d.ts +0 -24
  6. package/dist-client/charts/kpi-boxplot-chart.js +0 -324
  7. package/dist-client/charts/kpi-boxplot-chart.js.map +0 -1
  8. package/dist-client/charts/kpi-mini-trend-chart.d.ts +0 -14
  9. package/dist-client/charts/kpi-mini-trend-chart.js +0 -148
  10. package/dist-client/charts/kpi-mini-trend-chart.js.map +0 -1
  11. package/dist-client/charts/kpi-radar-chart.d.ts +0 -16
  12. package/dist-client/charts/kpi-radar-chart.js +0 -138
  13. package/dist-client/charts/kpi-radar-chart.js.map +0 -1
  14. package/dist-client/charts/kpi-trend-chart.d.ts +0 -25
  15. package/dist-client/charts/kpi-trend-chart.js +0 -186
  16. package/dist-client/charts/kpi-trend-chart.js.map +0 -1
  17. package/dist-client/google-map/common-google-map.d.ts +0 -34
  18. package/dist-client/google-map/common-google-map.js +0 -333
  19. package/dist-client/google-map/common-google-map.js.map +0 -1
  20. package/dist-client/google-map/google-map-loader.d.ts +0 -8
  21. package/dist-client/google-map/google-map-loader.js +0 -22
  22. package/dist-client/google-map/google-map-loader.js.map +0 -1
  23. package/dist-client/index.d.ts +0 -1
  24. package/dist-client/index.js +0 -2
  25. package/dist-client/index.js.map +0 -1
  26. package/dist-client/pages/kpi/kpi-grade-editor.d.ts +0 -35
  27. package/dist-client/pages/kpi/kpi-grade-editor.js +0 -165
  28. package/dist-client/pages/kpi/kpi-grade-editor.js.map +0 -1
  29. package/dist-client/pages/kpi/kpi-importer.d.ts +0 -23
  30. package/dist-client/pages/kpi/kpi-importer.js +0 -92
  31. package/dist-client/pages/kpi/kpi-importer.js.map +0 -1
  32. package/dist-client/pages/kpi/kpi-list-page.d.ts +0 -136
  33. package/dist-client/pages/kpi/kpi-list-page.js +0 -948
  34. package/dist-client/pages/kpi/kpi-list-page.js.map +0 -1
  35. package/dist-client/pages/kpi/kpi-overview-sample.d.ts +0 -36
  36. package/dist-client/pages/kpi/kpi-overview-sample.js +0 -264
  37. package/dist-client/pages/kpi/kpi-overview-sample.js.map +0 -1
  38. package/dist-client/pages/kpi/kpi-overview.d.ts +0 -14
  39. package/dist-client/pages/kpi/kpi-overview.js +0 -361
  40. package/dist-client/pages/kpi/kpi-overview.js.map +0 -1
  41. package/dist-client/pages/kpi/kpi-tree-page.d.ts +0 -51
  42. package/dist-client/pages/kpi/kpi-tree-page.js +0 -355
  43. package/dist-client/pages/kpi/kpi-tree-page.js.map +0 -1
  44. package/dist-client/pages/kpi/kpi-view.d.ts +0 -12
  45. package/dist-client/pages/kpi/kpi-view.js +0 -193
  46. package/dist-client/pages/kpi/kpi-view.js.map +0 -1
  47. package/dist-client/pages/kpi/kpi-viz-editor.d.ts +0 -19
  48. package/dist-client/pages/kpi/kpi-viz-editor.js +0 -562
  49. package/dist-client/pages/kpi/kpi-viz-editor.js.map +0 -1
  50. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.d.ts +0 -17
  51. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +0 -279
  52. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +0 -1
  53. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.d.ts +0 -19
  54. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +0 -385
  55. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +0 -1
  56. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.d.ts +0 -23
  57. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +0 -465
  58. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +0 -1
  59. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.d.ts +0 -8
  60. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js +0 -78
  61. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js.map +0 -1
  62. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +0 -24
  63. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +0 -440
  64. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +0 -1
  65. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +0 -33
  66. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +0 -444
  67. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +0 -1
  68. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +0 -23
  69. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +0 -369
  70. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +0 -1
  71. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +0 -18
  72. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +0 -128
  73. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +0 -1
  74. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +0 -31
  75. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +0 -493
  76. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +0 -1
  77. package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +0 -50
  78. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +0 -884
  79. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +0 -1
  80. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +0 -12
  81. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +0 -82
  82. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +0 -1
  83. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +0 -11
  84. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +0 -65
  85. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +0 -1
  86. package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +0 -13
  87. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +0 -115
  88. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +0 -1
  89. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +0 -15
  90. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +0 -146
  91. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +0 -1
  92. package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +0 -7
  93. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +0 -86
  94. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +0 -1
  95. package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +0 -21
  96. package/dist-client/pages/kpi-history/kpi-history-list-page.js +0 -160
  97. package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +0 -1
  98. package/dist-client/pages/kpi-metric/kpi-metric-importer.d.ts +0 -23
  99. package/dist-client/pages/kpi-metric/kpi-metric-importer.js +0 -92
  100. package/dist-client/pages/kpi-metric/kpi-metric-importer.js.map +0 -1
  101. package/dist-client/pages/kpi-metric/kpi-metric-list-page.d.ts +0 -65
  102. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +0 -415
  103. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +0 -1
  104. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +0 -52
  105. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +0 -678
  106. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +0 -1
  107. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.d.ts +0 -23
  108. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +0 -75
  109. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +0 -1
  110. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +0 -64
  111. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +0 -311
  112. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +0 -1
  113. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +0 -12
  114. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +0 -175
  115. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +0 -1
  116. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +0 -35
  117. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +0 -161
  118. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +0 -1
  119. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.d.ts +0 -47
  120. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js +0 -655
  121. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js.map +0 -1
  122. package/dist-client/pages/kpi-statistic/kpi-statistic-importer.d.ts +0 -23
  123. package/dist-client/pages/kpi-statistic/kpi-statistic-importer.js +0 -92
  124. package/dist-client/pages/kpi-statistic/kpi-statistic-importer.js.map +0 -1
  125. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.d.ts +0 -65
  126. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js +0 -416
  127. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js.map +0 -1
  128. package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +0 -50
  129. package/dist-client/pages/kpi-value/kpi-value-editor-page.js +0 -700
  130. package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +0 -1
  131. package/dist-client/pages/kpi-value/kpi-value-importer.d.ts +0 -23
  132. package/dist-client/pages/kpi-value/kpi-value-importer.js +0 -92
  133. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +0 -1
  134. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +0 -73
  135. package/dist-client/pages/kpi-value/kpi-value-list-page.js +0 -403
  136. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +0 -1
  137. package/dist-client/route.d.ts +0 -1
  138. package/dist-client/route.js +0 -47
  139. package/dist-client/route.js.map +0 -1
  140. package/dist-client/tsconfig.tsbuildinfo +0 -1
  141. package/dist-client/viewparts/kpi-metric-input.d.ts +0 -23
  142. package/dist-client/viewparts/kpi-metric-input.js +0 -140
  143. package/dist-client/viewparts/kpi-metric-input.js.map +0 -1
  144. package/dist-client/viewparts/kpi-metric-meta-editor.d.ts +0 -36
  145. package/dist-client/viewparts/kpi-metric-meta-editor.js +0 -321
  146. package/dist-client/viewparts/kpi-metric-meta-editor.js.map +0 -1
  147. package/dist-client/viewparts/metric-input-hint.d.ts +0 -26
  148. package/dist-client/viewparts/metric-input-hint.js +0 -19
  149. package/dist-client/viewparts/metric-input-hint.js.map +0 -1
  150. package/dist-client/viewparts/metric-input.test.d.ts +0 -1
  151. package/dist-client/viewparts/metric-input.test.js +0 -43
  152. package/dist-client/viewparts/metric-input.test.js.map +0 -1
  153. package/dist-client/viewparts/metric-renderer-registry.d.ts +0 -18
  154. package/dist-client/viewparts/metric-renderer-registry.js +0 -29
  155. package/dist-client/viewparts/metric-renderer-registry.js.map +0 -1
  156. package/dist-client/viewparts/ox-grist-editor-metric-input-hint.d.ts +0 -19
  157. package/dist-client/viewparts/ox-grist-editor-metric-input-hint.js +0 -76
  158. package/dist-client/viewparts/ox-grist-editor-metric-input-hint.js.map +0 -1
  159. package/dist-server/calculator/calculator.test.d.ts +0 -1
  160. package/dist-server/calculator/calculator.test.js +0 -126
  161. package/dist-server/calculator/calculator.test.js.map +0 -1
  162. package/dist-server/calculator/evaluator.d.ts +0 -8
  163. package/dist-server/calculator/evaluator.js +0 -42
  164. package/dist-server/calculator/evaluator.js.map +0 -1
  165. package/dist-server/calculator/functions.d.ts +0 -3
  166. package/dist-server/calculator/functions.js +0 -62
  167. package/dist-server/calculator/functions.js.map +0 -1
  168. package/dist-server/calculator/index.d.ts +0 -6
  169. package/dist-server/calculator/index.js +0 -10
  170. package/dist-server/calculator/index.js.map +0 -1
  171. package/dist-server/calculator/parser.d.ts +0 -34
  172. package/dist-server/calculator/parser.js +0 -185
  173. package/dist-server/calculator/parser.js.map +0 -1
  174. package/dist-server/calculator/provider.d.ts +0 -8
  175. package/dist-server/calculator/provider.js +0 -13
  176. package/dist-server/calculator/provider.js.map +0 -1
  177. package/dist-server/calculator/score.d.ts +0 -21
  178. package/dist-server/calculator/score.js +0 -36
  179. package/dist-server/calculator/score.js.map +0 -1
  180. package/dist-server/calculator/score.test.d.ts +0 -1
  181. package/dist-server/calculator/score.test.js +0 -47
  182. package/dist-server/calculator/score.test.js.map +0 -1
  183. package/dist-server/calculator/validate.d.ts +0 -15
  184. package/dist-server/calculator/validate.js +0 -30
  185. package/dist-server/calculator/validate.js.map +0 -1
  186. package/dist-server/calculator/validate.test.d.ts +0 -1
  187. package/dist-server/calculator/validate.test.js +0 -45
  188. package/dist-server/calculator/validate.test.js.map +0 -1
  189. package/dist-server/controllers/index.d.ts +0 -2
  190. package/dist-server/controllers/index.js +0 -6
  191. package/dist-server/controllers/index.js.map +0 -1
  192. package/dist-server/controllers/kpi-metric-value-provider.d.ts +0 -11
  193. package/dist-server/controllers/kpi-metric-value-provider.js +0 -97
  194. package/dist-server/controllers/kpi-metric-value-provider.js.map +0 -1
  195. package/dist-server/controllers/kpi-value-provider.d.ts +0 -11
  196. package/dist-server/controllers/kpi-value-provider.js +0 -50
  197. package/dist-server/controllers/kpi-value-provider.js.map +0 -1
  198. package/dist-server/index.d.ts +0 -5
  199. package/dist-server/index.js +0 -9
  200. package/dist-server/index.js.map +0 -1
  201. package/dist-server/migrations/1752190849680-seed-kpi-metrics.d.ts +0 -6
  202. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js +0 -102
  203. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js.map +0 -1
  204. package/dist-server/migrations/1752190849681-seed-kpi.d.ts +0 -5
  205. package/dist-server/migrations/1752190849681-seed-kpi.js +0 -315
  206. package/dist-server/migrations/1752190849681-seed-kpi.js.map +0 -1
  207. package/dist-server/migrations/1752192090123-add-grades-to-kpi.d.ts +0 -7
  208. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js +0 -51
  209. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js.map +0 -1
  210. package/dist-server/migrations/1752192090124-add-kpi-statistics.d.ts +0 -5
  211. package/dist-server/migrations/1752192090124-add-kpi-statistics.js +0 -710
  212. package/dist-server/migrations/1752192090124-add-kpi-statistics.js.map +0 -1
  213. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.d.ts +0 -6
  214. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js +0 -111
  215. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js.map +0 -1
  216. package/dist-server/migrations/1752192090129-seed-kpi-values.d.ts +0 -6
  217. package/dist-server/migrations/1752192090129-seed-kpi-values.js +0 -187
  218. package/dist-server/migrations/1752192090129-seed-kpi-values.js.map +0 -1
  219. package/dist-server/migrations/1752192090200-add-meta-to-kpi-metric.d.ts +0 -10
  220. package/dist-server/migrations/1752192090200-add-meta-to-kpi-metric.js +0 -26
  221. package/dist-server/migrations/1752192090200-add-meta-to-kpi-metric.js.map +0 -1
  222. package/dist-server/migrations/1752192090201-backfill-kpi-metric-meta.d.ts +0 -11
  223. package/dist-server/migrations/1752192090201-backfill-kpi-metric-meta.js +0 -54
  224. package/dist-server/migrations/1752192090201-backfill-kpi-metric-meta.js.map +0 -1
  225. package/dist-server/migrations/grade-data/x11-performance-table.json +0 -962
  226. package/dist-server/migrations/grade-data/x12-performance-table.json +0 -611
  227. package/dist-server/migrations/grade-data/x14-performance-table.json +0 -42
  228. package/dist-server/migrations/grade-data/x21-performance-table.json +0 -889
  229. package/dist-server/migrations/grade-data/x22-performance-table.json +0 -1064
  230. package/dist-server/migrations/grade-data/x23-performance-table.json +0 -42
  231. package/dist-server/migrations/grade-data/x31-performance-table.json +0 -644
  232. package/dist-server/migrations/grade-data/x32-performance-table.json +0 -993
  233. package/dist-server/migrations/grade-data/x33-performance-table.json +0 -195
  234. package/dist-server/migrations/grade-data/x34-performance-table.json +0 -12
  235. package/dist-server/migrations/grade-data/x35-performance-table.json +0 -42
  236. package/dist-server/migrations/grade-data/x41-performance-table.json +0 -825
  237. package/dist-server/migrations/grade-data/x42-performance-table.json +0 -786
  238. package/dist-server/migrations/grade-data/x43-performance-table.json +0 -12
  239. package/dist-server/migrations/grade-data/x44-performance-table.json +0 -42
  240. package/dist-server/migrations/grade-data/x51-performance-table.json +0 -924
  241. package/dist-server/migrations/grade-data/x52-performance-table.json +0 -42
  242. package/dist-server/migrations/grade-data/x61-performance-table.json +0 -261
  243. package/dist-server/migrations/grade-data/x62-performance-table.json +0 -42
  244. package/dist-server/migrations/index.d.ts +0 -1
  245. package/dist-server/migrations/index.js +0 -12
  246. package/dist-server/migrations/index.js.map +0 -1
  247. package/dist-server/migrations/seed-data/kpi-metrics-seed.json +0 -517
  248. package/dist-server/migrations/seed-data/kpi-org-scope-seed.json +0 -1676
  249. package/dist-server/migrations/seed-data/kpi-scopes-seed.json +0 -121
  250. package/dist-server/migrations/seed-data/kpi-values-seed.json +0 -402
  251. package/dist-server/migrations/seed-data/kpis-seed.json +0 -488
  252. package/dist-server/migrations/seed-data/scope-definitions-seed.json +0 -90
  253. package/dist-server/routes.d.ts +0 -1
  254. package/dist-server/routes.js +0 -72
  255. package/dist-server/routes.js.map +0 -1
  256. package/dist-server/service/index.d.ts +0 -15
  257. package/dist-server/service/index.js +0 -49
  258. package/dist-server/service/index.js.map +0 -1
  259. package/dist-server/service/kpi/aggregate-kpi.d.ts +0 -8
  260. package/dist-server/service/kpi/aggregate-kpi.js +0 -123
  261. package/dist-server/service/kpi/aggregate-kpi.js.map +0 -1
  262. package/dist-server/service/kpi/event-subscriber.d.ts +0 -9
  263. package/dist-server/service/kpi/event-subscriber.js +0 -31
  264. package/dist-server/service/kpi/event-subscriber.js.map +0 -1
  265. package/dist-server/service/kpi/index.d.ts +0 -8
  266. package/dist-server/service/kpi/index.js +0 -12
  267. package/dist-server/service/kpi/index.js.map +0 -1
  268. package/dist-server/service/kpi/kpi-formula.service.d.ts +0 -49
  269. package/dist-server/service/kpi/kpi-formula.service.js +0 -165
  270. package/dist-server/service/kpi/kpi-formula.service.js.map +0 -1
  271. package/dist-server/service/kpi/kpi-grade.types.d.ts +0 -22
  272. package/dist-server/service/kpi/kpi-grade.types.js +0 -3
  273. package/dist-server/service/kpi/kpi-grade.types.js.map +0 -1
  274. package/dist-server/service/kpi/kpi-history.d.ts +0 -29
  275. package/dist-server/service/kpi/kpi-history.js +0 -148
  276. package/dist-server/service/kpi/kpi-history.js.map +0 -1
  277. package/dist-server/service/kpi/kpi-mutation.d.ts +0 -14
  278. package/dist-server/service/kpi/kpi-mutation.js +0 -553
  279. package/dist-server/service/kpi/kpi-mutation.js.map +0 -1
  280. package/dist-server/service/kpi/kpi-query.d.ts +0 -24
  281. package/dist-server/service/kpi/kpi-query.js +0 -309
  282. package/dist-server/service/kpi/kpi-query.js.map +0 -1
  283. package/dist-server/service/kpi/kpi-type.d.ts +0 -48
  284. package/dist-server/service/kpi/kpi-type.js +0 -221
  285. package/dist-server/service/kpi/kpi-type.js.map +0 -1
  286. package/dist-server/service/kpi/kpi.d.ts +0 -130
  287. package/dist-server/service/kpi/kpi.js +0 -356
  288. package/dist-server/service/kpi/kpi.js.map +0 -1
  289. package/dist-server/service/kpi-alert/index.d.ts +0 -2
  290. package/dist-server/service/kpi-alert/index.js +0 -6
  291. package/dist-server/service/kpi-alert/index.js.map +0 -1
  292. package/dist-server/service/kpi-alert/kpi-alert-query.d.ts +0 -4
  293. package/dist-server/service/kpi-alert/kpi-alert-query.js +0 -72
  294. package/dist-server/service/kpi-alert/kpi-alert-query.js.map +0 -1
  295. package/dist-server/service/kpi-alert/kpi-alert-type.d.ts +0 -8
  296. package/dist-server/service/kpi-alert/kpi-alert-type.js +0 -33
  297. package/dist-server/service/kpi-alert/kpi-alert-type.js.map +0 -1
  298. package/dist-server/service/kpi-metric/aggregate-kpi-metric.d.ts +0 -8
  299. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +0 -126
  300. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +0 -1
  301. package/dist-server/service/kpi-metric/index.d.ts +0 -6
  302. package/dist-server/service/kpi-metric/index.js +0 -10
  303. package/dist-server/service/kpi-metric/index.js.map +0 -1
  304. package/dist-server/service/kpi-metric/kpi-metric-meta.d.ts +0 -46
  305. package/dist-server/service/kpi-metric/kpi-metric-meta.js +0 -27
  306. package/dist-server/service/kpi-metric/kpi-metric-meta.js.map +0 -1
  307. package/dist-server/service/kpi-metric/kpi-metric-meta.test.d.ts +0 -1
  308. package/dist-server/service/kpi-metric/kpi-metric-meta.test.js +0 -43
  309. package/dist-server/service/kpi-metric/kpi-metric-meta.test.js.map +0 -1
  310. package/dist-server/service/kpi-metric/kpi-metric-mutation.d.ts +0 -10
  311. package/dist-server/service/kpi-metric/kpi-metric-mutation.js +0 -296
  312. package/dist-server/service/kpi-metric/kpi-metric-mutation.js.map +0 -1
  313. package/dist-server/service/kpi-metric/kpi-metric-query.d.ts +0 -14
  314. package/dist-server/service/kpi-metric/kpi-metric-query.js +0 -126
  315. package/dist-server/service/kpi-metric/kpi-metric-query.js.map +0 -1
  316. package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +0 -45
  317. package/dist-server/service/kpi-metric/kpi-metric-type.js +0 -177
  318. package/dist-server/service/kpi-metric/kpi-metric-type.js.map +0 -1
  319. package/dist-server/service/kpi-metric/kpi-metric.d.ts +0 -39
  320. package/dist-server/service/kpi-metric/kpi-metric.js +0 -174
  321. package/dist-server/service/kpi-metric/kpi-metric.js.map +0 -1
  322. package/dist-server/service/kpi-metric-value/index.d.ts +0 -6
  323. package/dist-server/service/kpi-metric-value/index.js +0 -10
  324. package/dist-server/service/kpi-metric-value/index.js.map +0 -1
  325. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +0 -11
  326. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +0 -283
  327. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +0 -1
  328. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +0 -13
  329. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +0 -106
  330. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +0 -1
  331. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.d.ts +0 -26
  332. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js +0 -112
  333. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js.map +0 -1
  334. package/dist-server/service/kpi-metric-value/kpi-metric-value.d.ts +0 -23
  335. package/dist-server/service/kpi-metric-value/kpi-metric-value.js +0 -107
  336. package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +0 -1
  337. package/dist-server/service/kpi-org-scope/index.d.ts +0 -5
  338. package/dist-server/service/kpi-org-scope/index.js +0 -9
  339. package/dist-server/service/kpi-org-scope/index.js.map +0 -1
  340. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.d.ts +0 -8
  341. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js +0 -170
  342. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js.map +0 -1
  343. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.d.ts +0 -14
  344. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js +0 -152
  345. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js.map +0 -1
  346. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.d.ts +0 -26
  347. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js +0 -101
  348. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js.map +0 -1
  349. package/dist-server/service/kpi-org-scope/kpi-org-scope.d.ts +0 -26
  350. package/dist-server/service/kpi-org-scope/kpi-org-scope.js +0 -135
  351. package/dist-server/service/kpi-org-scope/kpi-org-scope.js.map +0 -1
  352. package/dist-server/service/kpi-scope/index.d.ts +0 -9
  353. package/dist-server/service/kpi-scope/index.js +0 -14
  354. package/dist-server/service/kpi-scope/index.js.map +0 -1
  355. package/dist-server/service/kpi-scope/kpi-scope-mutation.d.ts +0 -9
  356. package/dist-server/service/kpi-scope/kpi-scope-mutation.js +0 -140
  357. package/dist-server/service/kpi-scope/kpi-scope-mutation.js.map +0 -1
  358. package/dist-server/service/kpi-scope/kpi-scope-query.d.ts +0 -11
  359. package/dist-server/service/kpi-scope/kpi-scope-query.js +0 -89
  360. package/dist-server/service/kpi-scope/kpi-scope-query.js.map +0 -1
  361. package/dist-server/service/kpi-scope/kpi-scope-type.d.ts +0 -35
  362. package/dist-server/service/kpi-scope/kpi-scope-type.js +0 -138
  363. package/dist-server/service/kpi-scope/kpi-scope-type.js.map +0 -1
  364. package/dist-server/service/kpi-scope/kpi-scope.d.ts +0 -38
  365. package/dist-server/service/kpi-scope/kpi-scope.js +0 -144
  366. package/dist-server/service/kpi-scope/kpi-scope.js.map +0 -1
  367. package/dist-server/service/kpi-statistic/index.d.ts +0 -6
  368. package/dist-server/service/kpi-statistic/index.js +0 -10
  369. package/dist-server/service/kpi-statistic/index.js.map +0 -1
  370. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.d.ts +0 -43
  371. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js +0 -181
  372. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js.map +0 -1
  373. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.d.ts +0 -50
  374. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js +0 -324
  375. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js.map +0 -1
  376. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.d.ts +0 -14
  377. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js +0 -279
  378. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js.map +0 -1
  379. package/dist-server/service/kpi-statistic/kpi-statistic-query.d.ts +0 -17
  380. package/dist-server/service/kpi-statistic/kpi-statistic-query.js +0 -183
  381. package/dist-server/service/kpi-statistic/kpi-statistic-query.js.map +0 -1
  382. package/dist-server/service/kpi-statistic/kpi-statistic-type.d.ts +0 -59
  383. package/dist-server/service/kpi-statistic/kpi-statistic-type.js +0 -200
  384. package/dist-server/service/kpi-statistic/kpi-statistic-type.js.map +0 -1
  385. package/dist-server/service/kpi-statistic/kpi-statistic.d.ts +0 -42
  386. package/dist-server/service/kpi-statistic/kpi-statistic.js +0 -210
  387. package/dist-server/service/kpi-statistic/kpi-statistic.js.map +0 -1
  388. package/dist-server/service/kpi-value/index.d.ts +0 -6
  389. package/dist-server/service/kpi-value/index.js +0 -10
  390. package/dist-server/service/kpi-value/index.js.map +0 -1
  391. package/dist-server/service/kpi-value/kpi-value-mutation.d.ts +0 -13
  392. package/dist-server/service/kpi-value/kpi-value-mutation.js +0 -447
  393. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +0 -1
  394. package/dist-server/service/kpi-value/kpi-value-query.d.ts +0 -22
  395. package/dist-server/service/kpi-value/kpi-value-query.js +0 -149
  396. package/dist-server/service/kpi-value/kpi-value-query.js.map +0 -1
  397. package/dist-server/service/kpi-value/kpi-value-score.service.d.ts +0 -24
  398. package/dist-server/service/kpi-value/kpi-value-score.service.js +0 -61
  399. package/dist-server/service/kpi-value/kpi-value-score.service.js.map +0 -1
  400. package/dist-server/service/kpi-value/kpi-value-type.d.ts +0 -33
  401. package/dist-server/service/kpi-value/kpi-value-type.js +0 -156
  402. package/dist-server/service/kpi-value/kpi-value-type.js.map +0 -1
  403. package/dist-server/service/kpi-value/kpi-value.d.ts +0 -32
  404. package/dist-server/service/kpi-value/kpi-value.js +0 -175
  405. package/dist-server/service/kpi-value/kpi-value.js.map +0 -1
  406. package/dist-server/service/utils/value-date-util.d.ts +0 -4
  407. package/dist-server/service/utils/value-date-util.js +0 -117
  408. package/dist-server/service/utils/value-date-util.js.map +0 -1
  409. package/dist-server/tsconfig.tsbuildinfo +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"kpi-statistic-batch.service.js","sourceRoot":"","sources":["../../../server/service/kpi-statistic/kpi-statistic-batch.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { KpiStatisticCalculationService } from './kpi-statistic-calculation.service'\nimport { KpiPeriodType } from '../kpi/kpi'\nimport { Domain } from '@things-factory/shell'\n\n/**\n * KPI 통계 배치 계산 서비스\n * 정기적으로 실행하여 KpiValue 데이터를 집계해서 KpiStatistic을 생성/업데이트\n */\nexport class KpiStatisticBatchService {\n \n /**\n * 일일 배치: 어제 날짜의 모든 통계 계산\n */\n static async runDailyBatch(domainId?: string): Promise<void> {\n console.log('[KPI Statistics] Starting daily batch calculation...')\n \n const yesterday = new Date()\n yesterday.setDate(yesterday.getDate() - 1)\n const valueDate = yesterday.toISOString().split('T')[0] // YYYY-MM-DD\n \n await this.calculateForAllDomains(KpiPeriodType.DAY, valueDate, domainId)\n \n console.log(`[KPI Statistics] Daily batch completed for ${valueDate}`)\n }\n \n /**\n * 월간 배치: 지난 달의 모든 통계 계산\n */\n static async runMonthlyBatch(domainId?: string): Promise<void> {\n console.log('[KPI Statistics] Starting monthly batch calculation...')\n \n const lastMonth = new Date()\n lastMonth.setMonth(lastMonth.getMonth() - 1)\n const valueDate = lastMonth.toISOString().substring(0, 7) // YYYY-MM\n \n await this.calculateForAllDomains(KpiPeriodType.MONTH, valueDate, domainId)\n \n console.log(`[KPI Statistics] Monthly batch completed for ${valueDate}`)\n }\n \n /**\n * 분기 배치: 지난 분기의 모든 통계 계산\n */\n static async runQuarterlyBatch(domainId?: string): Promise<void> {\n console.log('[KPI Statistics] Starting quarterly batch calculation...')\n \n const now = new Date()\n const currentQuarter = Math.floor(now.getMonth() / 3) + 1\n const lastQuarter = currentQuarter === 1 ? 4 : currentQuarter - 1\n const year = currentQuarter === 1 ? now.getFullYear() - 1 : now.getFullYear()\n const valueDate = `${year}-Q${lastQuarter}`\n \n await this.calculateForAllDomains(KpiPeriodType.QUARTER, valueDate, domainId)\n \n console.log(`[KPI Statistics] Quarterly batch completed for ${valueDate}`)\n }\n \n /**\n * 연간 배치: 작년의 모든 통계 계산\n */\n static async runYearlyBatch(domainId?: string): Promise<void> {\n console.log('[KPI Statistics] Starting yearly batch calculation...')\n \n const lastYear = new Date().getFullYear() - 1\n const valueDate = lastYear.toString()\n \n await this.calculateForAllDomains(KpiPeriodType.YEAR, valueDate, domainId)\n \n console.log(`[KPI Statistics] Yearly batch completed for ${valueDate}`)\n }\n \n /**\n * 대시보드용 지역별 통계 계산\n */\n static async runDashboardBatch(\n periodType: KpiPeriodType = KpiPeriodType.MONTH,\n valueDate?: string,\n domainId?: string\n ): Promise<void> {\n console.log('[KPI Statistics] Starting dashboard batch calculation...')\n \n if (!valueDate) {\n const now = new Date()\n if (periodType === KpiPeriodType.MONTH) {\n now.setMonth(now.getMonth() - 1)\n valueDate = now.toISOString().substring(0, 7) // YYYY-MM\n } else {\n now.setDate(now.getDate() - 1)\n valueDate = now.toISOString().split('T')[0] // YYYY-MM-DD\n }\n }\n \n await this.calculateForAllDomains(periodType, valueDate, domainId)\n \n console.log(`[KPI Statistics] Dashboard batch completed for ${valueDate} (${periodType})`)\n }\n \n /**\n * 모든 도메인에 대해 통계 계산\n */\n private static async calculateForAllDomains(\n periodType: KpiPeriodType,\n valueDate: string,\n domainId?: string\n ): Promise<void> {\n try {\n const domains = domainId \n ? await getRepository(Domain).find({ where: { id: domainId } })\n : await getRepository(Domain).find()\n \n for (const domain of domains) {\n try {\n await this.calculateForDomain(domain, periodType, valueDate)\n } catch (error) {\n console.error(`[KPI Statistics] Domain ${domain.name} calculation failed, continuing with next domain:`, error)\n // 개별 도메인 실패가 전체 배치를 중단시키지 않도록 계속 진행\n continue\n }\n }\n } catch (error) {\n console.error('[KPI Statistics] Batch calculation failed:', error)\n throw error\n }\n }\n \n /**\n * 특정 도메인에 대해 통계 계산\n */\n private static async calculateForDomain(\n domain: Domain,\n periodType: KpiPeriodType,\n valueDate: string\n ): Promise<void> {\n console.log(`[KPI Statistics] Calculating for domain: ${domain.name} (${domain.id})`)\n \n // 가짜 ResolverContext 생성 (배치 작업용)\n const context: ResolverContext = {\n state: {\n domain,\n user: { id: 'system', name: 'System Batch' }, // 시스템 사용자\n tx: null // 트랜잭션 없음 (각 계산마다 개별 트랜잭션)\n }\n } as any\n \n try {\n const statistics = await KpiStatisticCalculationService.calculateAllStatistics(\n periodType,\n valueDate,\n context\n )\n \n console.log(`[KPI Statistics] Generated ${statistics.length} statistics for domain ${domain.name}`)\n \n // 성공 로깅\n this.logBatchResult(domain.id, periodType, valueDate, statistics.length, 'SUCCESS')\n \n } catch (error) {\n console.error(`[KPI Statistics] Failed to calculate for domain ${domain.name}:`, error)\n \n // 실패 로깅\n this.logBatchResult(domain.id, periodType, valueDate, 0, 'FAILED', error.message)\n \n // 에러를 던져서 상위에서 처리\n throw error\n }\n }\n \n /**\n * 배치 실행 결과 로깅\n */\n private static logBatchResult(\n domainId: string,\n periodType: KpiPeriodType,\n valueDate: string,\n statisticsCount: number,\n status: 'SUCCESS' | 'FAILED',\n errorMessage?: string\n ): void {\n const logData = {\n timestamp: new Date().toISOString(),\n domainId,\n periodType,\n valueDate,\n statisticsCount,\n status,\n errorMessage\n }\n \n // 실제 운영에서는 로깅 시스템에 저장\n console.log('[KPI Statistics Batch Log]', JSON.stringify(logData))\n }\n \n /**\n * 배치 작업 스케줄링 설정 예시\n */\n static setupBatchSchedule(): void {\n // 실제 구현시에는 cron 등의 스케줄러 사용\n console.log('[KPI Statistics] Batch schedule setup example:')\n console.log('Daily batch: Run at 02:00 AM every day')\n console.log('Monthly batch: Run at 03:00 AM on 1st of every month') \n console.log('Quarterly batch: Run at 04:00 AM on 1st of every quarter')\n console.log('Yearly batch: Run at 05:00 AM on January 1st')\n \n /*\n // Node-cron 사용 예시:\n import cron from 'node-cron'\n \n // 매일 새벽 2시\n cron.schedule('0 2 * * *', () => {\n this.runDailyBatch()\n })\n \n // 매월 1일 새벽 3시\n cron.schedule('0 3 1 * *', () => {\n this.runMonthlyBatch()\n })\n \n // 매 분기 첫날 새벽 4시 (1, 4, 7, 10월)\n cron.schedule('0 4 1 1,4,7,10 *', () => {\n this.runQuarterlyBatch()\n })\n \n // 매년 1월 1일 새벽 5시\n cron.schedule('0 5 1 1 *', () => {\n this.runYearlyBatch()\n })\n */\n }\n}"]}
@@ -1,50 +0,0 @@
1
- import { KpiStatistic } from './kpi-statistic';
2
- import { KpiPeriodType } from '../kpi/kpi';
3
- import { KpiOrgScope } from '../kpi-org-scope/kpi-org-scope';
4
- import { KpiScope } from '../kpi-scope/kpi-scope';
5
- /**
6
- * KPI 통계 계산 서비스
7
- * KpiValue 데이터로부터 통계값을 계산하여 KpiStatistic에 저장
8
- */
9
- export declare class KpiStatisticCalculationService {
10
- /**
11
- * 전체 KPI에 대해 통계를 계산
12
- */
13
- static calculateAllStatistics(periodType: KpiPeriodType, valueDate: string, context: ResolverContext): Promise<KpiStatistic[]>;
14
- /**
15
- * 특정 KPI의 통계를 계산
16
- */
17
- static calculateKpiStatistics(kpiId: string, periodType: KpiPeriodType, valueDate: string, kpiOrgScope: KpiOrgScope | null, context: ResolverContext): Promise<KpiStatistic | null>;
18
- /**
19
- * 스코프별 통계 계산 (KpiScope 기반)
20
- */
21
- static calculateScopedStatistics(kpiId: string, periodType: KpiPeriodType, valueDate: string, context: ResolverContext): Promise<KpiStatistic[]>;
22
- /**
23
- * 특정 스코프 차원별 통계 계산
24
- */
25
- static calculateStatisticsByScope(kpiId: string, periodType: KpiPeriodType, valueDate: string, kpiScope: KpiScope, context: ResolverContext): Promise<KpiStatistic[]>;
26
- /**
27
- * 스코프 값별 집계 통계 계산 (예: 서울 전체 평균)
28
- */
29
- private static calculateAggregatedScopeStatistics;
30
- /**
31
- * 특정 스코프 필드의 유니크한 값들 조회
32
- */
33
- private static getDistinctScopeValues;
34
- /**
35
- * 통계값 계산 로직
36
- */
37
- private static calculateStatistics;
38
- /**
39
- * 왜도 계산
40
- */
41
- private static calculateSkewness;
42
- /**
43
- * 첨도 계산
44
- */
45
- private static calculateKurtosis;
46
- /**
47
- * 기간 타입에 따른 날짜 필터 생성
48
- */
49
- private static buildDateFilter;
50
- }
@@ -1,324 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.KpiStatisticCalculationService = void 0;
4
- const shell_1 = require("@things-factory/shell");
5
- const kpi_statistic_1 = require("./kpi-statistic");
6
- const kpi_value_1 = require("../kpi-value/kpi-value");
7
- const kpi_1 = require("../kpi/kpi");
8
- const kpi_org_scope_1 = require("../kpi-org-scope/kpi-org-scope");
9
- const kpi_scope_1 = require("../kpi-scope/kpi-scope");
10
- /**
11
- * KPI 통계 계산 서비스
12
- * KpiValue 데이터로부터 통계값을 계산하여 KpiStatistic에 저장
13
- */
14
- class KpiStatisticCalculationService {
15
- /**
16
- * 전체 KPI에 대해 통계를 계산
17
- */
18
- static async calculateAllStatistics(periodType, valueDate, context) {
19
- const { domain } = context.state;
20
- // Leaf KPI들만 대상으로 함 (실제 값을 가진 KPI)
21
- const leafKpis = await (0, shell_1.getRepository)(kpi_1.Kpi).find({
22
- where: { domain: { id: domain.id }, isLeaf: true }
23
- });
24
- const results = [];
25
- for (const kpi of leafKpis) {
26
- // 1. 전체 통계 (scope 없음)
27
- const overallStats = await this.calculateKpiStatistics(kpi.id, periodType, valueDate, null, // kpiOrgScope 없음 = 전체 통계
28
- context);
29
- if (overallStats)
30
- results.push(overallStats);
31
- // 2. 스코프별 통계
32
- const scopedStats = await this.calculateScopedStatistics(kpi.id, periodType, valueDate, context);
33
- results.push(...scopedStats);
34
- }
35
- return results;
36
- }
37
- /**
38
- * 특정 KPI의 통계를 계산
39
- */
40
- static async calculateKpiStatistics(kpiId, periodType, valueDate, kpiOrgScope, context) {
41
- const { domain, user, tx } = context.state;
42
- // KPI 값들 조회
43
- const whereCondition = {
44
- kpi: { id: kpiId },
45
- domain: { id: domain.id },
46
- valueDate: this.buildDateFilter(valueDate, periodType)
47
- };
48
- if (kpiOrgScope) {
49
- whereCondition.kpiOrgScope = { id: kpiOrgScope.id };
50
- }
51
- const kpiValues = await (0, shell_1.getRepository)(kpi_value_1.KpiValue, tx).find({
52
- where: whereCondition,
53
- relations: ['kpi', 'kpiOrgScope']
54
- });
55
- if (kpiValues.length === 0) {
56
- return null;
57
- }
58
- // 통계 계산
59
- const statistics = this.calculateStatistics(kpiValues.map(v => v.value).filter(v => v !== null));
60
- // KpiStatistic 엔티티 생성/업데이트
61
- const kpiStatisticRepo = (0, shell_1.getRepository)(kpi_statistic_1.KpiStatistic, tx);
62
- // 기존 통계 조회
63
- const existingWhere = {
64
- kpi: { id: kpiId },
65
- domain: { id: domain.id },
66
- periodType,
67
- valueDate
68
- };
69
- if (kpiOrgScope) {
70
- existingWhere.kpiOrgScope = { id: kpiOrgScope.id };
71
- }
72
- else {
73
- existingWhere.kpiOrgScope = null;
74
- }
75
- let kpiStatistic = await kpiStatisticRepo.findOne({ where: existingWhere });
76
- if (!kpiStatistic) {
77
- kpiStatistic = kpiStatisticRepo.create();
78
- kpiStatistic.kpi = kpiValues[0].kpi;
79
- kpiStatistic.kpiId = kpiId;
80
- kpiStatistic.domain = { id: domain.id };
81
- kpiStatistic.periodType = periodType;
82
- kpiStatistic.valueDate = valueDate;
83
- kpiStatistic.creator = user;
84
- kpiStatistic.kpiOrgScope = kpiOrgScope;
85
- kpiStatistic.kpiOrgScopeId = kpiOrgScope?.id;
86
- }
87
- // 통계값 적용
88
- Object.assign(kpiStatistic, statistics);
89
- kpiStatistic.updater = user;
90
- kpiStatistic.metadata = {
91
- ...kpiStatistic.metadata,
92
- calculationMethod: 'auto-calculated',
93
- lastCalculated: new Date(),
94
- dataCount: kpiValues.length,
95
- calculatedFrom: 'kpi-values'
96
- };
97
- return await kpiStatisticRepo.save(kpiStatistic);
98
- }
99
- /**
100
- * 스코프별 통계 계산 (KpiScope 기반)
101
- */
102
- static async calculateScopedStatistics(kpiId, periodType, valueDate, context) {
103
- const { domain } = context.state;
104
- // 통계 계산에 사용할 스코프 정의 조회
105
- const kpiScopes = await (0, shell_1.getRepository)(kpi_scope_1.KpiScope).find({
106
- where: {
107
- domain: { id: domain.id },
108
- active: true,
109
- includeInStatistics: true
110
- },
111
- order: { displayOrder: 'ASC' }
112
- });
113
- const results = [];
114
- for (const kpiScope of kpiScopes) {
115
- const scopedStats = await this.calculateStatisticsByScope(kpiId, periodType, valueDate, kpiScope, context);
116
- results.push(...scopedStats);
117
- }
118
- return results;
119
- }
120
- /**
121
- * 특정 스코프 차원별 통계 계산
122
- */
123
- static async calculateStatisticsByScope(kpiId, periodType, valueDate, kpiScope, context) {
124
- const { domain } = context.state;
125
- const scopeLevel = kpiScope.level;
126
- const fieldName = `scope${scopeLevel.toString().padStart(2, '0')}`;
127
- // 해당 스코프 레벨의 유니크한 값들 조회
128
- const scopeValues = kpiScope.validValues || (await this.getDistinctScopeValues(fieldName, domain.id));
129
- const results = [];
130
- for (const scopeValue of scopeValues) {
131
- // 해당 스코프 값을 가진 KpiOrgScope들 조회
132
- const kpiOrgScopes = await (0, shell_1.getRepository)(kpi_org_scope_1.KpiOrgScope).find({
133
- where: {
134
- domain: { id: domain.id },
135
- [fieldName]: scopeValue
136
- }
137
- });
138
- // 각 KpiOrgScope에 대해 통계 계산
139
- for (const orgScope of kpiOrgScopes) {
140
- const statistic = await this.calculateKpiStatistics(kpiId, periodType, valueDate, orgScope, context);
141
- if (statistic) {
142
- results.push(statistic);
143
- }
144
- }
145
- // 스코프 값별 집계 통계도 생성 (선택적)
146
- if (kpiOrgScopes.length > 1) {
147
- const aggregatedStats = await this.calculateAggregatedScopeStatistics(kpiId, periodType, valueDate, kpiScope, scopeValue, kpiOrgScopes, context);
148
- if (aggregatedStats) {
149
- results.push(aggregatedStats);
150
- }
151
- }
152
- }
153
- return results;
154
- }
155
- /**
156
- * 스코프 값별 집계 통계 계산 (예: 서울 전체 평균)
157
- */
158
- static async calculateAggregatedScopeStatistics(kpiId, periodType, valueDate, kpiScope, scopeValue, kpiOrgScopes, context) {
159
- const { domain, user, tx } = context.state;
160
- // 모든 KpiOrgScope에서 KpiValue들 수집
161
- const allValues = [];
162
- for (const orgScope of kpiOrgScopes) {
163
- const kpiValues = await (0, shell_1.getRepository)(kpi_value_1.KpiValue, tx).find({
164
- where: {
165
- kpi: { id: kpiId },
166
- domain: { id: domain.id },
167
- kpiOrgScope: { id: orgScope.id },
168
- valueDate: this.buildDateFilter(valueDate, periodType)
169
- }
170
- });
171
- allValues.push(...kpiValues.map(v => v.value).filter(v => v !== null));
172
- }
173
- if (allValues.length === 0)
174
- return null;
175
- // 집계 통계 계산
176
- const statistics = this.calculateStatistics(allValues);
177
- // 가상의 KpiOrgScope 생성 (집계용)
178
- const aggregatedOrgScope = {
179
- id: `aggregated-${kpiScope.level}-${scopeValue}`,
180
- entityType: 'AGGREGATED',
181
- entityName: `${kpiScope.name}: ${scopeValue}`,
182
- org: scopeValue,
183
- [`scope${kpiScope.level.toString().padStart(2, '0')}`]: scopeValue
184
- };
185
- // KpiStatistic 생성
186
- const kpiStatisticRepo = (0, shell_1.getRepository)(kpi_statistic_1.KpiStatistic, tx);
187
- const kpiStatistic = kpiStatisticRepo.create();
188
- const kpi = await (0, shell_1.getRepository)(kpi_1.Kpi).findOneBy({ id: kpiId });
189
- kpiStatistic.kpi = kpi;
190
- kpiStatistic.kpiId = kpiId;
191
- kpiStatistic.domain = { id: domain.id };
192
- kpiStatistic.periodType = periodType;
193
- kpiStatistic.valueDate = valueDate;
194
- kpiStatistic.creator = user;
195
- kpiStatistic.updater = user;
196
- // 통계값 적용
197
- Object.assign(kpiStatistic, statistics);
198
- kpiStatistic.metadata = {
199
- ...kpiStatistic.metadata,
200
- calculationMethod: 'scope-aggregated',
201
- lastCalculated: new Date(),
202
- dataCount: allValues.length,
203
- kpiScope: {
204
- id: kpiScope.id,
205
- name: kpiScope.name,
206
- level: kpiScope.level,
207
- scopeType: kpiScope.scopeType
208
- },
209
- aggregatedScopeValue: scopeValue,
210
- orgScopeCount: kpiOrgScopes.length
211
- };
212
- return await kpiStatisticRepo.save(kpiStatistic);
213
- }
214
- /**
215
- * 특정 스코프 필드의 유니크한 값들 조회
216
- */
217
- static async getDistinctScopeValues(fieldName, domainId) {
218
- const query = `
219
- SELECT DISTINCT ${fieldName} as value
220
- FROM kpi_org_scope
221
- WHERE domainId = ? AND ${fieldName} IS NOT NULL
222
- ORDER BY ${fieldName}
223
- `;
224
- const results = await (0, shell_1.getRepository)(kpi_org_scope_1.KpiOrgScope).query(query, [domainId]);
225
- return results.map((r) => r.value).filter(Boolean);
226
- }
227
- /**
228
- * 통계값 계산 로직
229
- */
230
- static calculateStatistics(values) {
231
- if (values.length === 0)
232
- return {};
233
- const sortedValues = [...values].sort((a, b) => a - b);
234
- const count = values.length;
235
- const sum = values.reduce((acc, val) => acc + val, 0);
236
- const mean = sum / count;
237
- // 중앙값
238
- const median = count % 2 === 0
239
- ? (sortedValues[Math.floor(count / 2) - 1] + sortedValues[Math.floor(count / 2)]) / 2
240
- : sortedValues[Math.floor(count / 2)];
241
- // 분산 및 표준편차
242
- const variance = values.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) / count;
243
- const standardDeviation = Math.sqrt(variance);
244
- // 최소/최대값 및 범위
245
- const minimum = Math.min(...values);
246
- const maximum = Math.max(...values);
247
- const range = maximum - minimum;
248
- // 분위수 계산
249
- const q1Index = Math.floor(count * 0.25);
250
- const q3Index = Math.floor(count * 0.75);
251
- const percentile25 = sortedValues[q1Index];
252
- const percentile75 = sortedValues[q3Index];
253
- const iqr = percentile75 - percentile25;
254
- // 이상치 감지를 위한 fence
255
- const lowerFence = percentile25 - 1.5 * iqr;
256
- const upperFence = percentile75 + 1.5 * iqr;
257
- return {
258
- count,
259
- sum,
260
- range,
261
- mean,
262
- median,
263
- minimum,
264
- maximum,
265
- standardDeviation,
266
- variance,
267
- percentile25,
268
- percentile75,
269
- iqr,
270
- lowerFence,
271
- upperFence,
272
- additionalStatistics: {
273
- coefficientOfVariation: standardDeviation / mean,
274
- skewness: this.calculateSkewness(values, mean, standardDeviation),
275
- kurtosis: this.calculateKurtosis(values, mean, standardDeviation)
276
- }
277
- };
278
- }
279
- /**
280
- * 왜도 계산
281
- */
282
- static calculateSkewness(values, mean, stdDev) {
283
- if (stdDev === 0)
284
- return 0;
285
- const n = values.length;
286
- const sum = values.reduce((acc, val) => acc + Math.pow((val - mean) / stdDev, 3), 0);
287
- return (n / ((n - 1) * (n - 2))) * sum;
288
- }
289
- /**
290
- * 첨도 계산
291
- */
292
- static calculateKurtosis(values, mean, stdDev) {
293
- if (stdDev === 0)
294
- return 0;
295
- const n = values.length;
296
- const sum = values.reduce((acc, val) => acc + Math.pow((val - mean) / stdDev, 4), 0);
297
- const kurtosis = ((n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))) * sum;
298
- const adjustment = (3 * Math.pow(n - 1, 2)) / ((n - 2) * (n - 3));
299
- return kurtosis - adjustment;
300
- }
301
- /**
302
- * 기간 타입에 따른 날짜 필터 생성
303
- */
304
- static buildDateFilter(valueDate, periodType) {
305
- switch (periodType) {
306
- case kpi_1.KpiPeriodType.DAY:
307
- return valueDate; // 정확한 날짜 매치
308
- case kpi_1.KpiPeriodType.WEEK:
309
- return `${valueDate.substring(0, 8)}%`; // YYYY-MM-DD% -> 주 단위
310
- case kpi_1.KpiPeriodType.MONTH:
311
- return `${valueDate.substring(0, 7)}%`; // YYYY-MM%
312
- case kpi_1.KpiPeriodType.QUARTER:
313
- const year = valueDate.substring(0, 4);
314
- const quarter = valueDate.substring(5, 7); // Q1, Q2, Q3, Q4
315
- return `${year}-${quarter}%`;
316
- case kpi_1.KpiPeriodType.YEAR:
317
- return `${valueDate.substring(0, 4)}%`; // YYYY%
318
- default:
319
- return valueDate;
320
- }
321
- }
322
- }
323
- exports.KpiStatisticCalculationService = KpiStatisticCalculationService;
324
- //# sourceMappingURL=kpi-statistic-calculation.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kpi-statistic-calculation.service.js","sourceRoot":"","sources":["../../../server/service/kpi-statistic/kpi-statistic-calculation.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { KpiStatistic } from './kpi-statistic'\nimport { KpiValue } from '../kpi-value/kpi-value'\nimport { Kpi, KpiPeriodType } from '../kpi/kpi'\nimport { KpiOrgScope } from '../kpi-org-scope/kpi-org-scope'\nimport { KpiScope } from '../kpi-scope/kpi-scope'\n\n/**\n * KPI 통계 계산 서비스\n * KpiValue 데이터로부터 통계값을 계산하여 KpiStatistic에 저장\n */\nexport class KpiStatisticCalculationService {\n /**\n * 전체 KPI에 대해 통계를 계산\n */\n static async calculateAllStatistics(\n periodType: KpiPeriodType,\n valueDate: string,\n context: ResolverContext\n ): Promise<KpiStatistic[]> {\n const { domain } = context.state\n\n // Leaf KPI들만 대상으로 함 (실제 값을 가진 KPI)\n const leafKpis = await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, isLeaf: true }\n })\n\n const results: KpiStatistic[] = []\n\n for (const kpi of leafKpis) {\n // 1. 전체 통계 (scope 없음)\n const overallStats = await this.calculateKpiStatistics(\n kpi.id,\n periodType,\n valueDate,\n null, // kpiOrgScope 없음 = 전체 통계\n context\n )\n if (overallStats) results.push(overallStats)\n\n // 2. 스코프별 통계\n const scopedStats = await this.calculateScopedStatistics(kpi.id, periodType, valueDate, context)\n results.push(...scopedStats)\n }\n\n return results\n }\n\n /**\n * 특정 KPI의 통계를 계산\n */\n static async calculateKpiStatistics(\n kpiId: string,\n periodType: KpiPeriodType,\n valueDate: string,\n kpiOrgScope: KpiOrgScope | null,\n context: ResolverContext\n ): Promise<KpiStatistic | null> {\n const { domain, user, tx } = context.state\n\n // KPI 값들 조회\n const whereCondition: any = {\n kpi: { id: kpiId },\n domain: { id: domain.id },\n valueDate: this.buildDateFilter(valueDate, periodType)\n }\n\n if (kpiOrgScope) {\n whereCondition.kpiOrgScope = { id: kpiOrgScope.id }\n }\n\n const kpiValues = await getRepository(KpiValue, tx).find({\n where: whereCondition,\n relations: ['kpi', 'kpiOrgScope']\n })\n\n if (kpiValues.length === 0) {\n return null\n }\n\n // 통계 계산\n const statistics = this.calculateStatistics(kpiValues.map(v => v.value).filter(v => v !== null))\n\n // KpiStatistic 엔티티 생성/업데이트\n const kpiStatisticRepo = getRepository(KpiStatistic, tx)\n\n // 기존 통계 조회\n const existingWhere: any = {\n kpi: { id: kpiId },\n domain: { id: domain.id },\n periodType,\n valueDate\n }\n\n if (kpiOrgScope) {\n existingWhere.kpiOrgScope = { id: kpiOrgScope.id }\n } else {\n existingWhere.kpiOrgScope = null\n }\n\n let kpiStatistic = await kpiStatisticRepo.findOne({ where: existingWhere })\n\n if (!kpiStatistic) {\n kpiStatistic = kpiStatisticRepo.create()\n kpiStatistic.kpi = kpiValues[0].kpi\n kpiStatistic.kpiId = kpiId\n kpiStatistic.domain = { id: domain.id } as any\n kpiStatistic.periodType = periodType\n kpiStatistic.valueDate = valueDate\n kpiStatistic.creator = user\n kpiStatistic.kpiOrgScope = kpiOrgScope\n kpiStatistic.kpiOrgScopeId = kpiOrgScope?.id\n }\n\n // 통계값 적용\n Object.assign(kpiStatistic, statistics)\n kpiStatistic.updater = user\n kpiStatistic.metadata = {\n ...kpiStatistic.metadata,\n calculationMethod: 'auto-calculated',\n lastCalculated: new Date(),\n dataCount: kpiValues.length,\n calculatedFrom: 'kpi-values'\n }\n\n return await kpiStatisticRepo.save(kpiStatistic)\n }\n\n /**\n * 스코프별 통계 계산 (KpiScope 기반)\n */\n static async calculateScopedStatistics(\n kpiId: string,\n periodType: KpiPeriodType,\n valueDate: string,\n context: ResolverContext\n ): Promise<KpiStatistic[]> {\n const { domain } = context.state\n\n // 통계 계산에 사용할 스코프 정의 조회\n const kpiScopes = await getRepository(KpiScope).find({\n where: {\n domain: { id: domain.id },\n active: true,\n includeInStatistics: true\n },\n order: { displayOrder: 'ASC' }\n })\n\n const results: KpiStatistic[] = []\n\n for (const kpiScope of kpiScopes) {\n const scopedStats = await this.calculateStatisticsByScope(kpiId, periodType, valueDate, kpiScope, context)\n results.push(...scopedStats)\n }\n\n return results\n }\n\n /**\n * 특정 스코프 차원별 통계 계산\n */\n static async calculateStatisticsByScope(\n kpiId: string,\n periodType: KpiPeriodType,\n valueDate: string,\n kpiScope: KpiScope,\n context: ResolverContext\n ): Promise<KpiStatistic[]> {\n const { domain } = context.state\n const scopeLevel = kpiScope.level\n const fieldName = `scope${scopeLevel.toString().padStart(2, '0')}`\n\n // 해당 스코프 레벨의 유니크한 값들 조회\n const scopeValues = kpiScope.validValues || (await this.getDistinctScopeValues(fieldName, domain.id))\n\n const results: KpiStatistic[] = []\n\n for (const scopeValue of scopeValues) {\n // 해당 스코프 값을 가진 KpiOrgScope들 조회\n const kpiOrgScopes = await getRepository(KpiOrgScope).find({\n where: {\n domain: { id: domain.id },\n [fieldName]: scopeValue\n }\n })\n\n // 각 KpiOrgScope에 대해 통계 계산\n for (const orgScope of kpiOrgScopes) {\n const statistic = await this.calculateKpiStatistics(kpiId, periodType, valueDate, orgScope, context)\n if (statistic) {\n results.push(statistic)\n }\n }\n\n // 스코프 값별 집계 통계도 생성 (선택적)\n if (kpiOrgScopes.length > 1) {\n const aggregatedStats = await this.calculateAggregatedScopeStatistics(\n kpiId,\n periodType,\n valueDate,\n kpiScope,\n scopeValue,\n kpiOrgScopes,\n context\n )\n if (aggregatedStats) {\n results.push(aggregatedStats)\n }\n }\n }\n\n return results\n }\n\n /**\n * 스코프 값별 집계 통계 계산 (예: 서울 전체 평균)\n */\n private static async calculateAggregatedScopeStatistics(\n kpiId: string,\n periodType: KpiPeriodType,\n valueDate: string,\n kpiScope: KpiScope,\n scopeValue: string,\n kpiOrgScopes: KpiOrgScope[],\n context: ResolverContext\n ): Promise<KpiStatistic | null> {\n const { domain, user, tx } = context.state\n\n // 모든 KpiOrgScope에서 KpiValue들 수집\n const allValues: number[] = []\n for (const orgScope of kpiOrgScopes) {\n const kpiValues = await getRepository(KpiValue, tx).find({\n where: {\n kpi: { id: kpiId },\n domain: { id: domain.id },\n kpiOrgScope: { id: orgScope.id },\n valueDate: this.buildDateFilter(valueDate, periodType)\n }\n })\n allValues.push(...kpiValues.map(v => v.value).filter(v => v !== null))\n }\n\n if (allValues.length === 0) return null\n\n // 집계 통계 계산\n const statistics = this.calculateStatistics(allValues)\n\n // 가상의 KpiOrgScope 생성 (집계용)\n const aggregatedOrgScope = {\n id: `aggregated-${kpiScope.level}-${scopeValue}`,\n entityType: 'AGGREGATED',\n entityName: `${kpiScope.name}: ${scopeValue}`,\n org: scopeValue,\n [`scope${kpiScope.level.toString().padStart(2, '0')}`]: scopeValue\n }\n\n // KpiStatistic 생성\n const kpiStatisticRepo = getRepository(KpiStatistic, tx)\n const kpiStatistic = kpiStatisticRepo.create()\n\n const kpi = await getRepository(Kpi).findOneBy({ id: kpiId })\n kpiStatistic.kpi = kpi\n kpiStatistic.kpiId = kpiId\n kpiStatistic.domain = { id: domain.id } as any\n kpiStatistic.periodType = periodType\n kpiStatistic.valueDate = valueDate\n kpiStatistic.creator = user\n kpiStatistic.updater = user\n\n // 통계값 적용\n Object.assign(kpiStatistic, statistics)\n kpiStatistic.metadata = {\n ...kpiStatistic.metadata,\n calculationMethod: 'scope-aggregated',\n lastCalculated: new Date(),\n dataCount: allValues.length,\n kpiScope: {\n id: kpiScope.id,\n name: kpiScope.name,\n level: kpiScope.level,\n scopeType: kpiScope.scopeType\n },\n aggregatedScopeValue: scopeValue,\n orgScopeCount: kpiOrgScopes.length\n }\n\n return await kpiStatisticRepo.save(kpiStatistic)\n }\n\n /**\n * 특정 스코프 필드의 유니크한 값들 조회\n */\n private static async getDistinctScopeValues(fieldName: string, domainId: string): Promise<string[]> {\n const query = `\n SELECT DISTINCT ${fieldName} as value \n FROM kpi_org_scope \n WHERE domainId = ? AND ${fieldName} IS NOT NULL \n ORDER BY ${fieldName}\n `\n\n const results = await getRepository(KpiOrgScope).query(query, [domainId])\n return results.map((r: any) => r.value).filter(Boolean)\n }\n\n /**\n * 통계값 계산 로직\n */\n private static calculateStatistics(values: number[]) {\n if (values.length === 0) return {}\n\n const sortedValues = [...values].sort((a, b) => a - b)\n const count = values.length\n const sum = values.reduce((acc, val) => acc + val, 0)\n const mean = sum / count\n\n // 중앙값\n const median =\n count % 2 === 0\n ? (sortedValues[Math.floor(count / 2) - 1] + sortedValues[Math.floor(count / 2)]) / 2\n : sortedValues[Math.floor(count / 2)]\n\n // 분산 및 표준편차\n const variance = values.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) / count\n const standardDeviation = Math.sqrt(variance)\n\n // 최소/최대값 및 범위\n const minimum = Math.min(...values)\n const maximum = Math.max(...values)\n const range = maximum - minimum\n\n // 분위수 계산\n const q1Index = Math.floor(count * 0.25)\n const q3Index = Math.floor(count * 0.75)\n const percentile25 = sortedValues[q1Index]\n const percentile75 = sortedValues[q3Index]\n const iqr = percentile75 - percentile25\n\n // 이상치 감지를 위한 fence\n const lowerFence = percentile25 - 1.5 * iqr\n const upperFence = percentile75 + 1.5 * iqr\n\n return {\n count,\n sum,\n range,\n mean,\n median,\n minimum,\n maximum,\n standardDeviation,\n variance,\n percentile25,\n percentile75,\n iqr,\n lowerFence,\n upperFence,\n additionalStatistics: {\n coefficientOfVariation: standardDeviation / mean,\n skewness: this.calculateSkewness(values, mean, standardDeviation),\n kurtosis: this.calculateKurtosis(values, mean, standardDeviation)\n }\n }\n }\n\n /**\n * 왜도 계산\n */\n private static calculateSkewness(values: number[], mean: number, stdDev: number): number {\n if (stdDev === 0) return 0\n const n = values.length\n const sum = values.reduce((acc, val) => acc + Math.pow((val - mean) / stdDev, 3), 0)\n return (n / ((n - 1) * (n - 2))) * sum\n }\n\n /**\n * 첨도 계산\n */\n private static calculateKurtosis(values: number[], mean: number, stdDev: number): number {\n if (stdDev === 0) return 0\n const n = values.length\n const sum = values.reduce((acc, val) => acc + Math.pow((val - mean) / stdDev, 4), 0)\n const kurtosis = ((n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))) * sum\n const adjustment = (3 * Math.pow(n - 1, 2)) / ((n - 2) * (n - 3))\n return kurtosis - adjustment\n }\n\n /**\n * 기간 타입에 따른 날짜 필터 생성\n */\n private static buildDateFilter(valueDate: string, periodType: KpiPeriodType): string {\n switch (periodType) {\n case KpiPeriodType.DAY:\n return valueDate // 정확한 날짜 매치\n case KpiPeriodType.WEEK:\n return `${valueDate.substring(0, 8)}%` // YYYY-MM-DD% -> 주 단위\n case KpiPeriodType.MONTH:\n return `${valueDate.substring(0, 7)}%` // YYYY-MM%\n case KpiPeriodType.QUARTER:\n const year = valueDate.substring(0, 4)\n const quarter = valueDate.substring(5, 7) // Q1, Q2, Q3, Q4\n return `${year}-${quarter}%`\n case KpiPeriodType.YEAR:\n return `${valueDate.substring(0, 4)}%` // YYYY%\n default:\n return valueDate\n }\n }\n}\n"]}
@@ -1,14 +0,0 @@
1
- import { KpiStatistic } from './kpi-statistic.js';
2
- import { NewKpiStatistic, KpiStatisticPatch } from './kpi-statistic-type.js';
3
- import { KpiPeriodType } from '../kpi/kpi.js';
4
- export declare class KpiStatisticMutation {
5
- createKpiStatistic(kpiStatistic: NewKpiStatistic, context: ResolverContext): Promise<KpiStatistic>;
6
- updateKpiStatistic(id: string, patch: KpiStatisticPatch, context: ResolverContext): Promise<KpiStatistic>;
7
- updateMultipleKpiStatistic(patches: KpiStatisticPatch[], context: ResolverContext): Promise<KpiStatistic[]>;
8
- deleteKpiStatistic(id: string, context: ResolverContext): Promise<boolean>;
9
- deleteKpiStatistics(ids: string[], context: ResolverContext): Promise<boolean>;
10
- importKpiStatistics(kpiStatistics: KpiStatisticPatch[], context: ResolverContext): Promise<boolean>;
11
- calculateKpiStatistics(kpiId: string, periodType: KpiPeriodType, valueDate: string, context: ResolverContext): Promise<KpiStatistic[]>;
12
- calculateAllKpiStatistics(periodType: KpiPeriodType, valueDate: string, context: ResolverContext): Promise<KpiStatistic[]>;
13
- calculateRegionalStatistics(periodType: KpiPeriodType, valueDate: string, context: ResolverContext): Promise<KpiStatistic[]>;
14
- }