@things-factory/kpi 10.1.248 → 10.1.249

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/dist-client/bootstrap.d.ts +2 -0
  2. package/dist-client/bootstrap.js +7 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/charts/kpi-boxplot-chart.d.ts +24 -0
  5. package/dist-client/charts/kpi-boxplot-chart.js +324 -0
  6. package/dist-client/charts/kpi-boxplot-chart.js.map +1 -0
  7. package/dist-client/charts/kpi-mini-trend-chart.d.ts +14 -0
  8. package/dist-client/charts/kpi-mini-trend-chart.js +148 -0
  9. package/dist-client/charts/kpi-mini-trend-chart.js.map +1 -0
  10. package/dist-client/charts/kpi-radar-chart.d.ts +16 -0
  11. package/dist-client/charts/kpi-radar-chart.js +138 -0
  12. package/dist-client/charts/kpi-radar-chart.js.map +1 -0
  13. package/dist-client/charts/kpi-trend-chart.d.ts +25 -0
  14. package/dist-client/charts/kpi-trend-chart.js +186 -0
  15. package/dist-client/charts/kpi-trend-chart.js.map +1 -0
  16. package/dist-client/google-map/common-google-map.d.ts +34 -0
  17. package/dist-client/google-map/common-google-map.js +333 -0
  18. package/dist-client/google-map/common-google-map.js.map +1 -0
  19. package/dist-client/google-map/google-map-loader.d.ts +8 -0
  20. package/dist-client/google-map/google-map-loader.js +22 -0
  21. package/dist-client/google-map/google-map-loader.js.map +1 -0
  22. package/dist-client/index.d.ts +1 -0
  23. package/dist-client/index.js +2 -0
  24. package/dist-client/index.js.map +1 -0
  25. package/dist-client/pages/kpi/kpi-grade-editor.d.ts +35 -0
  26. package/dist-client/pages/kpi/kpi-grade-editor.js +165 -0
  27. package/dist-client/pages/kpi/kpi-grade-editor.js.map +1 -0
  28. package/dist-client/pages/kpi/kpi-importer.d.ts +23 -0
  29. package/dist-client/pages/kpi/kpi-importer.js +92 -0
  30. package/dist-client/pages/kpi/kpi-importer.js.map +1 -0
  31. package/dist-client/pages/kpi/kpi-list-page.d.ts +136 -0
  32. package/dist-client/pages/kpi/kpi-list-page.js +948 -0
  33. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -0
  34. package/dist-client/pages/kpi/kpi-overview-sample.d.ts +36 -0
  35. package/dist-client/pages/kpi/kpi-overview-sample.js +264 -0
  36. package/dist-client/pages/kpi/kpi-overview-sample.js.map +1 -0
  37. package/dist-client/pages/kpi/kpi-overview.d.ts +14 -0
  38. package/dist-client/pages/kpi/kpi-overview.js +361 -0
  39. package/dist-client/pages/kpi/kpi-overview.js.map +1 -0
  40. package/dist-client/pages/kpi/kpi-tree-page.d.ts +51 -0
  41. package/dist-client/pages/kpi/kpi-tree-page.js +355 -0
  42. package/dist-client/pages/kpi/kpi-tree-page.js.map +1 -0
  43. package/dist-client/pages/kpi/kpi-view.d.ts +12 -0
  44. package/dist-client/pages/kpi/kpi-view.js +193 -0
  45. package/dist-client/pages/kpi/kpi-view.js.map +1 -0
  46. package/dist-client/pages/kpi/kpi-viz-editor.d.ts +19 -0
  47. package/dist-client/pages/kpi/kpi-viz-editor.js +562 -0
  48. package/dist-client/pages/kpi/kpi-viz-editor.js.map +1 -0
  49. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.d.ts +17 -0
  50. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +279 -0
  51. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -0
  52. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.d.ts +19 -0
  53. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +385 -0
  54. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -0
  55. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.d.ts +23 -0
  56. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +465 -0
  57. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -0
  58. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.d.ts +8 -0
  59. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js +78 -0
  60. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js.map +1 -0
  61. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +24 -0
  62. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +440 -0
  63. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -0
  64. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +33 -0
  65. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +444 -0
  66. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -0
  67. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +23 -0
  68. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +369 -0
  69. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -0
  70. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
  71. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +128 -0
  72. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
  73. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +31 -0
  74. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +493 -0
  75. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -0
  76. package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +50 -0
  77. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +884 -0
  78. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -0
  79. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +12 -0
  80. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +82 -0
  81. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +1 -0
  82. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +11 -0
  83. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +65 -0
  84. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +1 -0
  85. package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +13 -0
  86. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +115 -0
  87. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +1 -0
  88. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +15 -0
  89. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +146 -0
  90. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -0
  91. package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +7 -0
  92. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +86 -0
  93. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +1 -0
  94. package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +21 -0
  95. package/dist-client/pages/kpi-history/kpi-history-list-page.js +160 -0
  96. package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -0
  97. package/dist-client/pages/kpi-metric/kpi-metric-importer.d.ts +23 -0
  98. package/dist-client/pages/kpi-metric/kpi-metric-importer.js +92 -0
  99. package/dist-client/pages/kpi-metric/kpi-metric-importer.js.map +1 -0
  100. package/dist-client/pages/kpi-metric/kpi-metric-list-page.d.ts +65 -0
  101. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +415 -0
  102. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -0
  103. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +52 -0
  104. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +678 -0
  105. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -0
  106. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.d.ts +23 -0
  107. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +75 -0
  108. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -0
  109. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +64 -0
  110. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +311 -0
  111. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -0
  112. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +12 -0
  113. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +175 -0
  114. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -0
  115. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +35 -0
  116. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +161 -0
  117. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -0
  118. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.d.ts +47 -0
  119. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js +655 -0
  120. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js.map +1 -0
  121. package/dist-client/pages/kpi-statistic/kpi-statistic-importer.d.ts +23 -0
  122. package/dist-client/pages/kpi-statistic/kpi-statistic-importer.js +92 -0
  123. package/dist-client/pages/kpi-statistic/kpi-statistic-importer.js.map +1 -0
  124. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.d.ts +65 -0
  125. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js +416 -0
  126. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js.map +1 -0
  127. package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +50 -0
  128. package/dist-client/pages/kpi-value/kpi-value-editor-page.js +700 -0
  129. package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +1 -0
  130. package/dist-client/pages/kpi-value/kpi-value-importer.d.ts +23 -0
  131. package/dist-client/pages/kpi-value/kpi-value-importer.js +92 -0
  132. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +1 -0
  133. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +73 -0
  134. package/dist-client/pages/kpi-value/kpi-value-list-page.js +403 -0
  135. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -0
  136. package/dist-client/route.d.ts +1 -0
  137. package/dist-client/route.js +47 -0
  138. package/dist-client/route.js.map +1 -0
  139. package/dist-client/tsconfig.tsbuildinfo +1 -0
  140. package/dist-client/viewparts/kpi-metric-input.d.ts +23 -0
  141. package/dist-client/viewparts/kpi-metric-input.js +140 -0
  142. package/dist-client/viewparts/kpi-metric-input.js.map +1 -0
  143. package/dist-client/viewparts/kpi-metric-meta-editor.d.ts +36 -0
  144. package/dist-client/viewparts/kpi-metric-meta-editor.js +321 -0
  145. package/dist-client/viewparts/kpi-metric-meta-editor.js.map +1 -0
  146. package/dist-client/viewparts/metric-input-hint.d.ts +26 -0
  147. package/dist-client/viewparts/metric-input-hint.js +19 -0
  148. package/dist-client/viewparts/metric-input-hint.js.map +1 -0
  149. package/dist-client/viewparts/metric-input.test.d.ts +1 -0
  150. package/dist-client/viewparts/metric-input.test.js +43 -0
  151. package/dist-client/viewparts/metric-input.test.js.map +1 -0
  152. package/dist-client/viewparts/metric-renderer-registry.d.ts +18 -0
  153. package/dist-client/viewparts/metric-renderer-registry.js +29 -0
  154. package/dist-client/viewparts/metric-renderer-registry.js.map +1 -0
  155. package/dist-client/viewparts/ox-grist-editor-metric-input-hint.d.ts +19 -0
  156. package/dist-client/viewparts/ox-grist-editor-metric-input-hint.js +76 -0
  157. package/dist-client/viewparts/ox-grist-editor-metric-input-hint.js.map +1 -0
  158. package/dist-server/calculator/calculator.test.d.ts +1 -0
  159. package/dist-server/calculator/calculator.test.js +126 -0
  160. package/dist-server/calculator/calculator.test.js.map +1 -0
  161. package/dist-server/calculator/evaluator.d.ts +8 -0
  162. package/dist-server/calculator/evaluator.js +42 -0
  163. package/dist-server/calculator/evaluator.js.map +1 -0
  164. package/dist-server/calculator/functions.d.ts +3 -0
  165. package/dist-server/calculator/functions.js +62 -0
  166. package/dist-server/calculator/functions.js.map +1 -0
  167. package/dist-server/calculator/index.d.ts +6 -0
  168. package/dist-server/calculator/index.js +10 -0
  169. package/dist-server/calculator/index.js.map +1 -0
  170. package/dist-server/calculator/parser.d.ts +34 -0
  171. package/dist-server/calculator/parser.js +185 -0
  172. package/dist-server/calculator/parser.js.map +1 -0
  173. package/dist-server/calculator/provider.d.ts +8 -0
  174. package/dist-server/calculator/provider.js +13 -0
  175. package/dist-server/calculator/provider.js.map +1 -0
  176. package/dist-server/calculator/score.d.ts +21 -0
  177. package/dist-server/calculator/score.js +36 -0
  178. package/dist-server/calculator/score.js.map +1 -0
  179. package/dist-server/calculator/score.test.d.ts +1 -0
  180. package/dist-server/calculator/score.test.js +47 -0
  181. package/dist-server/calculator/score.test.js.map +1 -0
  182. package/dist-server/calculator/validate.d.ts +15 -0
  183. package/dist-server/calculator/validate.js +30 -0
  184. package/dist-server/calculator/validate.js.map +1 -0
  185. package/dist-server/calculator/validate.test.d.ts +1 -0
  186. package/dist-server/calculator/validate.test.js +45 -0
  187. package/dist-server/calculator/validate.test.js.map +1 -0
  188. package/dist-server/controllers/index.d.ts +2 -0
  189. package/dist-server/controllers/index.js +6 -0
  190. package/dist-server/controllers/index.js.map +1 -0
  191. package/dist-server/controllers/kpi-metric-value-provider.d.ts +11 -0
  192. package/dist-server/controllers/kpi-metric-value-provider.js +97 -0
  193. package/dist-server/controllers/kpi-metric-value-provider.js.map +1 -0
  194. package/dist-server/controllers/kpi-value-provider.d.ts +11 -0
  195. package/dist-server/controllers/kpi-value-provider.js +50 -0
  196. package/dist-server/controllers/kpi-value-provider.js.map +1 -0
  197. package/dist-server/index.d.ts +5 -0
  198. package/dist-server/index.js +9 -0
  199. package/dist-server/index.js.map +1 -0
  200. package/dist-server/migrations/1752190849680-seed-kpi-metrics.d.ts +6 -0
  201. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js +102 -0
  202. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js.map +1 -0
  203. package/dist-server/migrations/1752190849681-seed-kpi.d.ts +5 -0
  204. package/dist-server/migrations/1752190849681-seed-kpi.js +315 -0
  205. package/dist-server/migrations/1752190849681-seed-kpi.js.map +1 -0
  206. package/dist-server/migrations/1752192090123-add-grades-to-kpi.d.ts +7 -0
  207. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js +51 -0
  208. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js.map +1 -0
  209. package/dist-server/migrations/1752192090124-add-kpi-statistics.d.ts +5 -0
  210. package/dist-server/migrations/1752192090124-add-kpi-statistics.js +710 -0
  211. package/dist-server/migrations/1752192090124-add-kpi-statistics.js.map +1 -0
  212. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.d.ts +6 -0
  213. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js +111 -0
  214. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js.map +1 -0
  215. package/dist-server/migrations/1752192090129-seed-kpi-values.d.ts +6 -0
  216. package/dist-server/migrations/1752192090129-seed-kpi-values.js +187 -0
  217. package/dist-server/migrations/1752192090129-seed-kpi-values.js.map +1 -0
  218. package/dist-server/migrations/1752192090200-add-meta-to-kpi-metric.d.ts +10 -0
  219. package/dist-server/migrations/1752192090200-add-meta-to-kpi-metric.js +26 -0
  220. package/dist-server/migrations/1752192090200-add-meta-to-kpi-metric.js.map +1 -0
  221. package/dist-server/migrations/1752192090201-backfill-kpi-metric-meta.d.ts +11 -0
  222. package/dist-server/migrations/1752192090201-backfill-kpi-metric-meta.js +54 -0
  223. package/dist-server/migrations/1752192090201-backfill-kpi-metric-meta.js.map +1 -0
  224. package/dist-server/migrations/grade-data/x11-performance-table.json +962 -0
  225. package/dist-server/migrations/grade-data/x12-performance-table.json +611 -0
  226. package/dist-server/migrations/grade-data/x14-performance-table.json +42 -0
  227. package/dist-server/migrations/grade-data/x21-performance-table.json +889 -0
  228. package/dist-server/migrations/grade-data/x22-performance-table.json +1064 -0
  229. package/dist-server/migrations/grade-data/x23-performance-table.json +42 -0
  230. package/dist-server/migrations/grade-data/x31-performance-table.json +644 -0
  231. package/dist-server/migrations/grade-data/x32-performance-table.json +993 -0
  232. package/dist-server/migrations/grade-data/x33-performance-table.json +195 -0
  233. package/dist-server/migrations/grade-data/x34-performance-table.json +12 -0
  234. package/dist-server/migrations/grade-data/x35-performance-table.json +42 -0
  235. package/dist-server/migrations/grade-data/x41-performance-table.json +825 -0
  236. package/dist-server/migrations/grade-data/x42-performance-table.json +786 -0
  237. package/dist-server/migrations/grade-data/x43-performance-table.json +12 -0
  238. package/dist-server/migrations/grade-data/x44-performance-table.json +42 -0
  239. package/dist-server/migrations/grade-data/x51-performance-table.json +924 -0
  240. package/dist-server/migrations/grade-data/x52-performance-table.json +42 -0
  241. package/dist-server/migrations/grade-data/x61-performance-table.json +261 -0
  242. package/dist-server/migrations/grade-data/x62-performance-table.json +42 -0
  243. package/dist-server/migrations/index.d.ts +1 -0
  244. package/dist-server/migrations/index.js +12 -0
  245. package/dist-server/migrations/index.js.map +1 -0
  246. package/dist-server/migrations/seed-data/kpi-metrics-seed.json +517 -0
  247. package/dist-server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
  248. package/dist-server/migrations/seed-data/kpi-scopes-seed.json +121 -0
  249. package/dist-server/migrations/seed-data/kpi-values-seed.json +402 -0
  250. package/dist-server/migrations/seed-data/kpis-seed.json +488 -0
  251. package/dist-server/migrations/seed-data/scope-definitions-seed.json +90 -0
  252. package/dist-server/routes.d.ts +1 -0
  253. package/dist-server/routes.js +72 -0
  254. package/dist-server/routes.js.map +1 -0
  255. package/dist-server/service/index.d.ts +15 -0
  256. package/dist-server/service/index.js +49 -0
  257. package/dist-server/service/index.js.map +1 -0
  258. package/dist-server/service/kpi/aggregate-kpi.d.ts +8 -0
  259. package/dist-server/service/kpi/aggregate-kpi.js +123 -0
  260. package/dist-server/service/kpi/aggregate-kpi.js.map +1 -0
  261. package/dist-server/service/kpi/event-subscriber.d.ts +9 -0
  262. package/dist-server/service/kpi/event-subscriber.js +31 -0
  263. package/dist-server/service/kpi/event-subscriber.js.map +1 -0
  264. package/dist-server/service/kpi/index.d.ts +8 -0
  265. package/dist-server/service/kpi/index.js +12 -0
  266. package/dist-server/service/kpi/index.js.map +1 -0
  267. package/dist-server/service/kpi/kpi-formula.service.d.ts +49 -0
  268. package/dist-server/service/kpi/kpi-formula.service.js +165 -0
  269. package/dist-server/service/kpi/kpi-formula.service.js.map +1 -0
  270. package/dist-server/service/kpi/kpi-grade.types.d.ts +22 -0
  271. package/dist-server/service/kpi/kpi-grade.types.js +3 -0
  272. package/dist-server/service/kpi/kpi-grade.types.js.map +1 -0
  273. package/dist-server/service/kpi/kpi-history.d.ts +29 -0
  274. package/dist-server/service/kpi/kpi-history.js +148 -0
  275. package/dist-server/service/kpi/kpi-history.js.map +1 -0
  276. package/dist-server/service/kpi/kpi-mutation.d.ts +14 -0
  277. package/dist-server/service/kpi/kpi-mutation.js +553 -0
  278. package/dist-server/service/kpi/kpi-mutation.js.map +1 -0
  279. package/dist-server/service/kpi/kpi-query.d.ts +24 -0
  280. package/dist-server/service/kpi/kpi-query.js +309 -0
  281. package/dist-server/service/kpi/kpi-query.js.map +1 -0
  282. package/dist-server/service/kpi/kpi-type.d.ts +48 -0
  283. package/dist-server/service/kpi/kpi-type.js +221 -0
  284. package/dist-server/service/kpi/kpi-type.js.map +1 -0
  285. package/dist-server/service/kpi/kpi.d.ts +130 -0
  286. package/dist-server/service/kpi/kpi.js +356 -0
  287. package/dist-server/service/kpi/kpi.js.map +1 -0
  288. package/dist-server/service/kpi-alert/index.d.ts +2 -0
  289. package/dist-server/service/kpi-alert/index.js +6 -0
  290. package/dist-server/service/kpi-alert/index.js.map +1 -0
  291. package/dist-server/service/kpi-alert/kpi-alert-query.d.ts +4 -0
  292. package/dist-server/service/kpi-alert/kpi-alert-query.js +72 -0
  293. package/dist-server/service/kpi-alert/kpi-alert-query.js.map +1 -0
  294. package/dist-server/service/kpi-alert/kpi-alert-type.d.ts +8 -0
  295. package/dist-server/service/kpi-alert/kpi-alert-type.js +33 -0
  296. package/dist-server/service/kpi-alert/kpi-alert-type.js.map +1 -0
  297. package/dist-server/service/kpi-metric/aggregate-kpi-metric.d.ts +8 -0
  298. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +126 -0
  299. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -0
  300. package/dist-server/service/kpi-metric/index.d.ts +6 -0
  301. package/dist-server/service/kpi-metric/index.js +10 -0
  302. package/dist-server/service/kpi-metric/index.js.map +1 -0
  303. package/dist-server/service/kpi-metric/kpi-metric-meta.d.ts +46 -0
  304. package/dist-server/service/kpi-metric/kpi-metric-meta.js +27 -0
  305. package/dist-server/service/kpi-metric/kpi-metric-meta.js.map +1 -0
  306. package/dist-server/service/kpi-metric/kpi-metric-meta.test.d.ts +1 -0
  307. package/dist-server/service/kpi-metric/kpi-metric-meta.test.js +43 -0
  308. package/dist-server/service/kpi-metric/kpi-metric-meta.test.js.map +1 -0
  309. package/dist-server/service/kpi-metric/kpi-metric-mutation.d.ts +10 -0
  310. package/dist-server/service/kpi-metric/kpi-metric-mutation.js +296 -0
  311. package/dist-server/service/kpi-metric/kpi-metric-mutation.js.map +1 -0
  312. package/dist-server/service/kpi-metric/kpi-metric-query.d.ts +14 -0
  313. package/dist-server/service/kpi-metric/kpi-metric-query.js +126 -0
  314. package/dist-server/service/kpi-metric/kpi-metric-query.js.map +1 -0
  315. package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +45 -0
  316. package/dist-server/service/kpi-metric/kpi-metric-type.js +177 -0
  317. package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -0
  318. package/dist-server/service/kpi-metric/kpi-metric.d.ts +39 -0
  319. package/dist-server/service/kpi-metric/kpi-metric.js +174 -0
  320. package/dist-server/service/kpi-metric/kpi-metric.js.map +1 -0
  321. package/dist-server/service/kpi-metric-value/index.d.ts +6 -0
  322. package/dist-server/service/kpi-metric-value/index.js +10 -0
  323. package/dist-server/service/kpi-metric-value/index.js.map +1 -0
  324. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +11 -0
  325. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +283 -0
  326. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -0
  327. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +13 -0
  328. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +106 -0
  329. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -0
  330. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.d.ts +26 -0
  331. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js +112 -0
  332. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js.map +1 -0
  333. package/dist-server/service/kpi-metric-value/kpi-metric-value.d.ts +23 -0
  334. package/dist-server/service/kpi-metric-value/kpi-metric-value.js +107 -0
  335. package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -0
  336. package/dist-server/service/kpi-org-scope/index.d.ts +5 -0
  337. package/dist-server/service/kpi-org-scope/index.js +9 -0
  338. package/dist-server/service/kpi-org-scope/index.js.map +1 -0
  339. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.d.ts +8 -0
  340. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js +170 -0
  341. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js.map +1 -0
  342. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.d.ts +14 -0
  343. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js +152 -0
  344. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js.map +1 -0
  345. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.d.ts +26 -0
  346. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js +101 -0
  347. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js.map +1 -0
  348. package/dist-server/service/kpi-org-scope/kpi-org-scope.d.ts +26 -0
  349. package/dist-server/service/kpi-org-scope/kpi-org-scope.js +135 -0
  350. package/dist-server/service/kpi-org-scope/kpi-org-scope.js.map +1 -0
  351. package/dist-server/service/kpi-scope/index.d.ts +9 -0
  352. package/dist-server/service/kpi-scope/index.js +14 -0
  353. package/dist-server/service/kpi-scope/index.js.map +1 -0
  354. package/dist-server/service/kpi-scope/kpi-scope-mutation.d.ts +9 -0
  355. package/dist-server/service/kpi-scope/kpi-scope-mutation.js +140 -0
  356. package/dist-server/service/kpi-scope/kpi-scope-mutation.js.map +1 -0
  357. package/dist-server/service/kpi-scope/kpi-scope-query.d.ts +11 -0
  358. package/dist-server/service/kpi-scope/kpi-scope-query.js +89 -0
  359. package/dist-server/service/kpi-scope/kpi-scope-query.js.map +1 -0
  360. package/dist-server/service/kpi-scope/kpi-scope-type.d.ts +35 -0
  361. package/dist-server/service/kpi-scope/kpi-scope-type.js +138 -0
  362. package/dist-server/service/kpi-scope/kpi-scope-type.js.map +1 -0
  363. package/dist-server/service/kpi-scope/kpi-scope.d.ts +38 -0
  364. package/dist-server/service/kpi-scope/kpi-scope.js +144 -0
  365. package/dist-server/service/kpi-scope/kpi-scope.js.map +1 -0
  366. package/dist-server/service/kpi-statistic/index.d.ts +6 -0
  367. package/dist-server/service/kpi-statistic/index.js +10 -0
  368. package/dist-server/service/kpi-statistic/index.js.map +1 -0
  369. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.d.ts +43 -0
  370. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js +181 -0
  371. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js.map +1 -0
  372. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.d.ts +50 -0
  373. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js +324 -0
  374. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js.map +1 -0
  375. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.d.ts +14 -0
  376. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js +279 -0
  377. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js.map +1 -0
  378. package/dist-server/service/kpi-statistic/kpi-statistic-query.d.ts +17 -0
  379. package/dist-server/service/kpi-statistic/kpi-statistic-query.js +183 -0
  380. package/dist-server/service/kpi-statistic/kpi-statistic-query.js.map +1 -0
  381. package/dist-server/service/kpi-statistic/kpi-statistic-type.d.ts +59 -0
  382. package/dist-server/service/kpi-statistic/kpi-statistic-type.js +200 -0
  383. package/dist-server/service/kpi-statistic/kpi-statistic-type.js.map +1 -0
  384. package/dist-server/service/kpi-statistic/kpi-statistic.d.ts +42 -0
  385. package/dist-server/service/kpi-statistic/kpi-statistic.js +210 -0
  386. package/dist-server/service/kpi-statistic/kpi-statistic.js.map +1 -0
  387. package/dist-server/service/kpi-value/index.d.ts +6 -0
  388. package/dist-server/service/kpi-value/index.js +10 -0
  389. package/dist-server/service/kpi-value/index.js.map +1 -0
  390. package/dist-server/service/kpi-value/kpi-value-mutation.d.ts +13 -0
  391. package/dist-server/service/kpi-value/kpi-value-mutation.js +447 -0
  392. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -0
  393. package/dist-server/service/kpi-value/kpi-value-query.d.ts +22 -0
  394. package/dist-server/service/kpi-value/kpi-value-query.js +149 -0
  395. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -0
  396. package/dist-server/service/kpi-value/kpi-value-score.service.d.ts +24 -0
  397. package/dist-server/service/kpi-value/kpi-value-score.service.js +61 -0
  398. package/dist-server/service/kpi-value/kpi-value-score.service.js.map +1 -0
  399. package/dist-server/service/kpi-value/kpi-value-type.d.ts +33 -0
  400. package/dist-server/service/kpi-value/kpi-value-type.js +156 -0
  401. package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -0
  402. package/dist-server/service/kpi-value/kpi-value.d.ts +32 -0
  403. package/dist-server/service/kpi-value/kpi-value.js +175 -0
  404. package/dist-server/service/kpi-value/kpi-value.js.map +1 -0
  405. package/dist-server/service/utils/value-date-util.d.ts +4 -0
  406. package/dist-server/service/utils/value-date-util.js +117 -0
  407. package/dist-server/service/utils/value-date-util.js.map +1 -0
  408. package/dist-server/tsconfig.tsbuildinfo +1 -0
  409. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kpi-metric-value-provider.js","sourceRoot":"","sources":["../../server/controllers/kpi-metric-value-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\nimport { Domain, getRepository, getDomainIdsWithAncestors } from '@things-factory/shell'\nimport { KpiMetric } from '../service/kpi-metric/kpi-metric'\nimport { KpiMetricValue } from '../service/kpi-metric-value/kpi-metric-value'\nimport { ValueProvider } from '../calculator/provider'\n\nexport class KpiMetricValueProvider implements ValueProvider {\n constructor(\n private options: {\n valueDate: string\n org?: string\n domainId: string\n tx?: any\n }\n ) {}\n\n async get(name: string) {\n const metricRepo = getRepository(KpiMetric, this.options.tx)\n\n // KpiMetric '정의' 는 부모(admin) 도메인에 있을 수 있어 조상 도메인까지 포함해 조회한다.\n // 단, KpiMetricValue '값' 은 테넌트(현재 도메인)에만 저장되므로 값 조회는 반드시\n // 현재 도메인(this.options.domainId)으로만 한정한다 — 조상을 포함하면 부모/템플릿·타 테넌트\n // 값을 집어 도메인 격리가 깨질 수 있다.\n const domain = await getRepository(Domain, this.options.tx).findOne({ where: { id: this.options.domainId } })\n const domainIds = domain ? await getDomainIdsWithAncestors(domain) : [this.options.domainId]\n\n const metric = await metricRepo.findOne({ where: { name, domain: { id: In(domainIds) } } })\n if (!metric) throw new Error(`Metric not found: ${name}`)\n\n // ALLTIME 타입인 경우 valueDate 무시하고 최신 값 조회\n if (metric.periodType === 'ALLTIME') {\n const valueRepo = getRepository(KpiMetricValue, this.options.tx)\n const value = await valueRepo.findOne({\n where: {\n metric: { id: metric.id },\n org: this.options.org ?? '',\n domain: { id: this.options.domainId }\n },\n order: { createdAt: 'DESC' }\n })\n if (!value) {\n throw new Error(`Metric value not found: metric='${name}', org='${this.options.org ?? ''}' (ALLTIME type)`)\n }\n return value.value\n }\n\n const valueRepo = getRepository(KpiMetricValue, this.options.tx)\n\n // valueDate 미지정 (예: KPI 재계산) → 그 metric 의 '최신 월'(가장 최근 valueDate) 값을\n // 대표값으로 사용한다. 완료평가/'월별 데이터' 탭에서 최신월을 수정하면 이 값이 곧 KPI\n // 계산 입력이 된다.\n // (MONTH 는 valueDate 를 'YYYY-MM-01' 로 저장하는데, 과거엔 current-month('YYYY-MM')\n // exact 조회라 포맷 불일치로 못 찾고 우연히 아래 fallback 으로만 동작했음 — 명시적 최신월 조회)\n if (!this.options.valueDate) {\n const latest = await valueRepo.findOne({\n where: {\n metric: { id: metric.id },\n org: this.options.org ?? '',\n domain: { id: this.options.domainId },\n // metric 의 periodType 과 같은 값만 — MONTH 지표인데 섞여 있는 DAY 행이 valueDate 로\n // 더 최신이라 잘못 집히던 문제 방지 (예: 실적공정률 MONTH 2026-05 vs 잔여 DAY 2026-06-15).\n periodType: metric.periodType\n },\n order: { valueDate: 'DESC' }\n })\n if (!latest) {\n throw new Error(`Metric value not found: metric='${name}', org='${this.options.org ?? ''}' (latest)`)\n }\n return latest.value\n }\n\n // 명시적 valueDate 가 주어진 경우: 해당 기간 조회 (없으면 최신 fallback).\n let valueDate = this.options.valueDate\n // valueDate가 metric.periodType에 맞는 포맷인지 검사, 아니면 보정\n if (metric.periodType === 'MONTH' && valueDate.length > 7) valueDate = valueDate.slice(0, 7)\n if (metric.periodType === 'DAY' && valueDate.length > 10) valueDate = valueDate.slice(0, 10)\n var value = await valueRepo.findOne({\n where: {\n metric: { id: metric.id },\n valueDate,\n org: this.options.org ?? '',\n domain: { id: this.options.domainId },\n periodType: metric.periodType\n }\n })\n if (!value) {\n // 해당 기간 데이터 없으면 최신 데이터로 fallback.\n value = await valueRepo.findOne({\n where: {\n metric: { id: metric.id },\n org: this.options.org ?? '',\n domain: { id: this.options.domainId },\n periodType: metric.periodType\n },\n order: { valueDate: 'DESC' }\n })\n\n if (!value) {\n throw new Error(\n `Metric value not found: metric='${name}', org='${this.options.org ?? ''}', valueDate='${valueDate}', periodType='${metric.periodType}'`\n )\n }\n }\n\n return value.value\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { ValueProvider } from '../calculator/provider';
2
+ export declare class KpiValueProvider implements ValueProvider {
3
+ private options;
4
+ constructor(options: {
5
+ valueDate: string;
6
+ org?: string;
7
+ domainId: string;
8
+ tx?: any;
9
+ });
10
+ get(name: string): Promise<number>;
11
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KpiValueProvider = void 0;
4
+ const shell_1 = require("@things-factory/shell");
5
+ const kpi_1 = require("../service/kpi/kpi");
6
+ const kpi_value_1 = require("../service/kpi-value/kpi-value");
7
+ class KpiValueProvider {
8
+ constructor(options) {
9
+ this.options = options;
10
+ }
11
+ async get(name) {
12
+ const kpiRepo = (0, shell_1.getRepository)(kpi_1.Kpi, this.options.tx);
13
+ const kpi = await kpiRepo.findOne({ where: { name, domain: { id: this.options.domainId } } });
14
+ if (!kpi)
15
+ throw new Error(`KPI not found: ${name}`);
16
+ const valueRepo = (0, shell_1.getRepository)(kpi_value_1.KpiValue, this.options.tx);
17
+ // SINGLE 타입인 경우 valueDate 무시하고 최신 값 조회
18
+ const whereCondition = {
19
+ kpi: { id: kpi.id },
20
+ org: this.options.org ?? '',
21
+ domain: { id: this.options.domainId }
22
+ };
23
+ if (kpi.periodType === 'ALLTIME') {
24
+ // ALLTIME 타입은 valueDate 무시하고 최신 version → createdAt 순으로 1건
25
+ const value = await valueRepo.findOne({
26
+ where: whereCondition,
27
+ order: { version: 'DESC', createdAt: 'DESC' }
28
+ });
29
+ if (!value) {
30
+ throw new Error(`KPI value not found: kpi='${name}', org='${this.options.org ?? ''}' (ALLTIME type)`);
31
+ }
32
+ return value.value;
33
+ }
34
+ else {
35
+ // 같은 (kpi, valueDate, org, domain) 좌표에 여러 version 가능 →
36
+ // version DESC 으로 latest 보장.
37
+ whereCondition.valueDate = this.options.valueDate;
38
+ const value = await valueRepo.findOne({
39
+ where: whereCondition,
40
+ order: { version: 'DESC' }
41
+ });
42
+ if (!value) {
43
+ throw new Error(`KPI value not found: kpi='${name}', org='${this.options.org ?? ''}', valueDate='${this.options.valueDate}'`);
44
+ }
45
+ return value.value;
46
+ }
47
+ }
48
+ }
49
+ exports.KpiValueProvider = KpiValueProvider;
50
+ //# sourceMappingURL=kpi-value-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kpi-value-provider.js","sourceRoot":"","sources":["../../server/controllers/kpi-value-provider.ts"],"names":[],"mappings":";;;AAAA,iDAAqD;AACrD,4CAAwC;AACxC,8DAAyD;AAGzD,MAAa,gBAAgB;IAC3B,YACU,OAKP;QALO,YAAO,GAAP,OAAO,CAKd;IACA,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,OAAO,GAAG,IAAA,qBAAa,EAAC,SAAG,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACnD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7F,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAA;QACnD,MAAM,SAAS,GAAG,IAAA,qBAAa,EAAC,oBAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAE1D,uCAAuC;QACvC,MAAM,cAAc,GAAQ;YAC1B,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE;YACnB,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE;YAC3B,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;SACtC,CAAA;QAED,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACjC,2DAA2D;YAC3D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;gBACpC,KAAK,EAAE,cAAc;gBACrB,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;aAC9C,CAAC,CAAA;YACF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAA;YACvG,CAAC;YACD,OAAO,KAAK,CAAC,KAAK,CAAA;QACpB,CAAC;aAAM,CAAC;YACN,uDAAuD;YACvD,6BAA6B;YAC7B,cAAc,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAA;YACjD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;gBACpC,KAAK,EAAE,cAAc;gBACrB,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;aAC3B,CAAC,CAAA;YACF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,iBAAiB,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAC7G,CAAA;YACH,CAAC;YACD,OAAO,KAAK,CAAC,KAAK,CAAA;QACpB,CAAC;IACH,CAAC;CACF;AAjDD,4CAiDC","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { Kpi } from '../service/kpi/kpi'\nimport { KpiValue } from '../service/kpi-value/kpi-value'\nimport { ValueProvider } from '../calculator/provider'\n\nexport class KpiValueProvider implements ValueProvider {\n constructor(\n private options: {\n valueDate: string\n org?: string\n domainId: string\n tx?: any\n }\n ) {}\n\n async get(name: string) {\n const kpiRepo = getRepository(Kpi, this.options.tx)\n const kpi = await kpiRepo.findOne({ where: { name, domain: { id: this.options.domainId } } })\n if (!kpi) throw new Error(`KPI not found: ${name}`)\n const valueRepo = getRepository(KpiValue, this.options.tx)\n\n // SINGLE 타입인 경우 valueDate 무시하고 최신 값 조회\n const whereCondition: any = {\n kpi: { id: kpi.id },\n org: this.options.org ?? '',\n domain: { id: this.options.domainId }\n }\n\n if (kpi.periodType === 'ALLTIME') {\n // ALLTIME 타입은 valueDate 무시하고 최신 version → createdAt 순으로 1건\n const value = await valueRepo.findOne({\n where: whereCondition,\n order: { version: 'DESC', createdAt: 'DESC' }\n })\n if (!value) {\n throw new Error(`KPI value not found: kpi='${name}', org='${this.options.org ?? ''}' (ALLTIME type)`)\n }\n return value.value\n } else {\n // 같은 (kpi, valueDate, org, domain) 좌표에 여러 version 가능 →\n // version DESC 으로 latest 보장.\n whereCondition.valueDate = this.options.valueDate\n const value = await valueRepo.findOne({\n where: whereCondition,\n order: { version: 'DESC' }\n })\n if (!value) {\n throw new Error(\n `KPI value not found: kpi='${name}', org='${this.options.org ?? ''}', valueDate='${this.options.valueDate}'`\n )\n }\n return value.value\n }\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export * from './migrations/index.js';
2
+ export * from './service/index.js';
3
+ export * from './calculator/index.js';
4
+ export * from './controllers/index.js';
5
+ import './routes';
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./migrations/index.js"), exports);
5
+ tslib_1.__exportStar(require("./service/index.js"), exports);
6
+ tslib_1.__exportStar(require("./calculator/index.js"), exports);
7
+ tslib_1.__exportStar(require("./controllers/index.js"), exports);
8
+ require("./routes");
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA,gEAAqC;AACrC,6DAAkC;AAClC,gEAAqC;AACrC,iEAAsC;AAEtC,oBAAiB","sourcesContent":["export * from './migrations/index.js'\nexport * from './service/index.js'\nexport * from './calculator/index.js'\nexport * from './controllers/index.js'\n\nimport './routes'\n"]}
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class SeedKpiMetrics1752190849680 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SeedKpiMetrics1752190849680 = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const shell_1 = require("@things-factory/shell");
6
+ const kpi_1 = require("../service/kpi/kpi");
7
+ const kpi_metric_1 = require("../service/kpi-metric/kpi-metric");
8
+ const fs = tslib_1.__importStar(require("fs"));
9
+ const path = tslib_1.__importStar(require("path"));
10
+ class SeedKpiMetrics1752190849680 {
11
+ constructor() {
12
+ this.name = 'SeedKpiMetrics1752190849680';
13
+ }
14
+ async up(queryRunner) {
15
+ try {
16
+ const repository = (0, shell_1.getRepository)(kpi_metric_1.KpiMetric);
17
+ const domainRepository = (0, shell_1.getRepository)(shell_1.Domain);
18
+ // SYSTEM 도메인 확인
19
+ const domain = await domainRepository.findOneBy({ name: 'SYSTEM' });
20
+ if (!domain) {
21
+ console.log('❌ SYSTEM domain not found');
22
+ return;
23
+ }
24
+ // JSON 파일 읽기
25
+ const seedFilePath = path.join(__dirname, 'seed-data', 'kpi-metrics-seed.json');
26
+ const seedData = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'));
27
+ console.log(`📊 Processing ${seedData.length} KPI metrics from JSON seed`);
28
+ for (const metricData of seedData) {
29
+ try {
30
+ const existingMetric = await repository.findOne({
31
+ where: { name: metricData.name, domain: { id: domain.id } }
32
+ });
33
+ if (existingMetric) {
34
+ console.log(`⚠️ KPI Metric already exists: ${metricData.name}`);
35
+ continue;
36
+ }
37
+ const metric = await repository.save({
38
+ name: metricData.name,
39
+ description: metricData.description,
40
+ unit: metricData.unit,
41
+ source: metricData.source,
42
+ fieldName: metricData.field_name,
43
+ active: metricData.active,
44
+ scheduleId: metricData.schedule_id,
45
+ timezone: metricData.timezone,
46
+ dataSetId: metricData.data_set_id,
47
+ periodType: kpi_1.KpiPeriodType[metricData.period_type],
48
+ collectType: kpi_metric_1.KpiMetricCollectType[metricData.collect_type],
49
+ schedule: metricData.schedule,
50
+ meta: metricData.meta,
51
+ domain
52
+ });
53
+ console.log(`✅ Created KPI Metric: ${metric.name}`);
54
+ }
55
+ catch (error) {
56
+ console.error(`❌ Error creating KPI Metric "${metricData.name}":`, error);
57
+ }
58
+ }
59
+ console.log(`🎉 Successfully processed KPI metrics from JSON seed`);
60
+ }
61
+ catch (error) {
62
+ console.error('❌ Error seeding KPI metrics from JSON:', error);
63
+ throw error;
64
+ }
65
+ }
66
+ async down(queryRunner) {
67
+ try {
68
+ const repository = (0, shell_1.getRepository)(kpi_metric_1.KpiMetric);
69
+ const domainRepository = (0, shell_1.getRepository)(shell_1.Domain);
70
+ const domain = await domainRepository.findOneBy({ name: 'SYSTEM' });
71
+ if (!domain) {
72
+ console.log('⚠️ SYSTEM domain not found. Nothing to delete.');
73
+ return;
74
+ }
75
+ // JSON 파일 읽기
76
+ const seedFilePath = path.join(__dirname, 'seed-data', 'kpi-metrics-seed.json');
77
+ const seedData = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'));
78
+ console.log(`🗑️ Cleaning up ${seedData.length} KPI metrics`);
79
+ for (const metricData of seedData.reverse()) {
80
+ try {
81
+ const metric = await repository.findOne({
82
+ where: { name: metricData.name, domain: { id: domain.id } }
83
+ });
84
+ if (metric) {
85
+ await repository.delete(metric.id);
86
+ console.log(`✅ Deleted KPI Metric: ${metricData.name}`);
87
+ }
88
+ }
89
+ catch (error) {
90
+ console.error(`❌ Error deleting KPI Metric "${metricData.name}":`, error);
91
+ }
92
+ }
93
+ console.log(`🎉 Successfully cleaned up KPI metrics`);
94
+ }
95
+ catch (error) {
96
+ console.error('❌ Error cleaning up KPI metrics:', error);
97
+ throw error;
98
+ }
99
+ }
100
+ }
101
+ exports.SeedKpiMetrics1752190849680 = SeedKpiMetrics1752190849680;
102
+ //# sourceMappingURL=1752190849680-seed-kpi-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1752190849680-seed-kpi-metrics.js","sourceRoot":"","sources":["../../server/migrations/1752190849680-seed-kpi-metrics.ts"],"names":[],"mappings":"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","sourcesContent":["import { MigrationInterface, QueryRunner } from 'typeorm'\nimport { Domain, getRepository } from '@things-factory/shell'\nimport { KpiPeriodType } from '../service/kpi/kpi'\nimport { KpiMetric, KpiMetricCollectType } from '../service/kpi-metric/kpi-metric'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\ninterface KpiMetricSeedData {\n name: string\n description: string\n unit?: string | null\n source?: string | null\n field_name?: string | null\n active: boolean\n schedule_id?: string | null\n timezone: string\n data_set_id?: string | null\n period_type: string\n collect_type: string\n schedule?: string | null\n meta?: any\n created_at?: string\n updated_at?: string\n}\n\nexport class SeedKpiMetrics1752190849680 implements MigrationInterface {\n name = 'SeedKpiMetrics1752190849680'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n try {\n const repository = getRepository(KpiMetric)\n const domainRepository = getRepository(Domain)\n\n // SYSTEM 도메인 확인\n const domain: Domain = await domainRepository.findOneBy({ name: 'SYSTEM' })\n if (!domain) {\n console.log('❌ SYSTEM domain not found')\n return\n }\n\n // JSON 파일 읽기\n const seedFilePath = path.join(__dirname, 'seed-data', 'kpi-metrics-seed.json')\n const seedData: KpiMetricSeedData[] = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'))\n\n console.log(`📊 Processing ${seedData.length} KPI metrics from JSON seed`)\n\n for (const metricData of seedData) {\n try {\n const existingMetric = await repository.findOne({\n where: { name: metricData.name, domain: { id: domain.id } }\n })\n\n if (existingMetric) {\n console.log(`⚠️ KPI Metric already exists: ${metricData.name}`)\n continue\n }\n\n const metric = await repository.save({\n name: metricData.name,\n description: metricData.description,\n unit: metricData.unit,\n source: metricData.source,\n fieldName: metricData.field_name,\n active: metricData.active,\n scheduleId: metricData.schedule_id,\n timezone: metricData.timezone,\n dataSetId: metricData.data_set_id,\n periodType: KpiPeriodType[metricData.period_type as keyof typeof KpiPeriodType],\n collectType: KpiMetricCollectType[metricData.collect_type as keyof typeof KpiMetricCollectType],\n schedule: metricData.schedule,\n meta: (metricData as any).meta,\n domain\n })\n\n console.log(`✅ Created KPI Metric: ${metric.name}`)\n } catch (error) {\n console.error(`❌ Error creating KPI Metric \"${metricData.name}\":`, error)\n }\n }\n\n console.log(`🎉 Successfully processed KPI metrics from JSON seed`)\n } catch (error) {\n console.error('❌ Error seeding KPI metrics from JSON:', error)\n throw error\n }\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n try {\n const repository = getRepository(KpiMetric)\n const domainRepository = getRepository(Domain)\n\n const domain: Domain = await domainRepository.findOneBy({ name: 'SYSTEM' })\n if (!domain) {\n console.log('⚠️ SYSTEM domain not found. Nothing to delete.')\n return\n }\n\n // JSON 파일 읽기\n const seedFilePath = path.join(__dirname, 'seed-data', 'kpi-metrics-seed.json')\n const seedData: KpiMetricSeedData[] = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'))\n\n console.log(`🗑️ Cleaning up ${seedData.length} KPI metrics`)\n\n for (const metricData of seedData.reverse()) {\n try {\n const metric = await repository.findOne({\n where: { name: metricData.name, domain: { id: domain.id } }\n })\n\n if (metric) {\n await repository.delete(metric.id)\n console.log(`✅ Deleted KPI Metric: ${metricData.name}`)\n }\n } catch (error) {\n console.error(`❌ Error deleting KPI Metric \"${metricData.name}\":`, error)\n }\n }\n\n console.log(`🎉 Successfully cleaned up KPI metrics`)\n } catch (error) {\n console.error('❌ Error cleaning up KPI metrics:', error)\n throw error\n }\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class SeedKpi1752190849681 implements MigrationInterface {
3
+ up(queryRunner: QueryRunner): Promise<any>;
4
+ down(queryRunner: QueryRunner): Promise<any>;
5
+ }
@@ -0,0 +1,315 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SeedKpi1752190849681 = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const shell_1 = require("@things-factory/shell");
6
+ const kpi_1 = require("../service/kpi/kpi");
7
+ const fs = tslib_1.__importStar(require("fs"));
8
+ const path = tslib_1.__importStar(require("path"));
9
+ const SEED = [
10
+ // 일정성과 (Y1) - Schedule Performance
11
+ {
12
+ name: '연면적 대비 공사기간',
13
+ description: '연면적 대비 공사기간 평가',
14
+ categoryName: '일정성과',
15
+ formula: 'Eq. 활용',
16
+ scoreType: 'equation',
17
+ dataType: 'ratio'
18
+ },
19
+ {
20
+ name: '설계변경에 따른 공기 증감률',
21
+ description: '설계변경에 따른 공기 증감률 평가',
22
+ categoryName: '일정성과',
23
+ formula: 'Eq. 활용',
24
+ scoreType: 'equation',
25
+ dataType: 'ratio'
26
+ },
27
+ {
28
+ name: '일정 이탈 수준',
29
+ description: '프로젝트 일정 이탈 수준 평가',
30
+ categoryName: '일정성과',
31
+ formula: 'Table(DART 등) 활용(1~5점)',
32
+ scoreType: 'table',
33
+ dataType: 'score'
34
+ },
35
+ {
36
+ name: '일정성과 수준 평가',
37
+ description: '일정성과 종합 평가',
38
+ categoryName: '일정성과',
39
+ formula: '감리자 1~5점 척도',
40
+ scoreType: 'inspector',
41
+ dataType: 'score'
42
+ },
43
+ // 비용성과 (Y2) - Cost Performance
44
+ {
45
+ name: '연면적 대비 공사비',
46
+ description: '연면적 대비 공사비 평가',
47
+ categoryName: '비용성과',
48
+ formula: 'Eq. 활용',
49
+ scoreType: 'equation',
50
+ dataType: 'ratio'
51
+ },
52
+ {
53
+ name: '설계변경에 따른 공사비 증감률',
54
+ description: '설계변경에 따른 공사비 증감률 평가',
55
+ categoryName: '비용성과',
56
+ formula: 'Eq. 활용',
57
+ scoreType: 'equation',
58
+ dataType: 'ratio'
59
+ },
60
+ {
61
+ name: '비용성과 수준 평가',
62
+ description: '비용성과 종합 평가',
63
+ categoryName: '비용성과',
64
+ formula: '감리자 1~5점 척도',
65
+ scoreType: 'inspector',
66
+ dataType: 'score'
67
+ },
68
+ // 품질성과 (Y3) - Quality Performance
69
+ {
70
+ name: '품질시험 불합격률',
71
+ description: '품질시험 불합격률 평가',
72
+ categoryName: '품질성과',
73
+ formula: 'Eq. 활용',
74
+ scoreType: 'equation',
75
+ dataType: 'ratio'
76
+ },
77
+ {
78
+ name: '검수자재 불합격률',
79
+ description: '검수자재 불합격률 평가',
80
+ categoryName: '품질성과',
81
+ formula: 'Eq. 활용',
82
+ scoreType: 'equation',
83
+ dataType: 'ratio'
84
+ },
85
+ {
86
+ name: '검측 불합격률',
87
+ description: '검측 불합격률 평가',
88
+ categoryName: '품질성과',
89
+ formula: 'Table 활용',
90
+ scoreType: 'table',
91
+ dataType: 'score'
92
+ },
93
+ {
94
+ name: '품질 SL-PA 결과값',
95
+ description: '품질 SL-PA 결과',
96
+ categoryName: '품질성과',
97
+ formula: 'Python 활용(1~5점)',
98
+ scoreType: 'python',
99
+ dataType: 'score'
100
+ },
101
+ {
102
+ name: '품질성과 수준 평가',
103
+ description: '품질성과 종합 평가',
104
+ categoryName: '품질성과',
105
+ formula: '감리자 1~5점 척도',
106
+ scoreType: 'inspector',
107
+ dataType: 'score'
108
+ },
109
+ // 안전성과 (Y4) - Safety Performance
110
+ {
111
+ name: '재해율',
112
+ description: '재해율 평가',
113
+ categoryName: '안전성과',
114
+ formula: 'Eq. 활용',
115
+ scoreType: 'equation',
116
+ dataType: 'ratio'
117
+ },
118
+ {
119
+ name: '재해강도율',
120
+ description: '재해강도율 평가',
121
+ categoryName: '안전성과',
122
+ formula: 'Table 활용',
123
+ scoreType: 'table',
124
+ dataType: 'score'
125
+ },
126
+ {
127
+ name: '안전 SL-PA 결과값',
128
+ description: '안전 SL-PA 결과',
129
+ categoryName: '안전성과',
130
+ formula: 'Python 활용(1~5점)',
131
+ scoreType: 'python',
132
+ dataType: 'score'
133
+ },
134
+ {
135
+ name: '안전성과 수준 평가',
136
+ description: '안전성과 종합 평가',
137
+ categoryName: '안전성과',
138
+ formula: '감리자 1~5점 척도',
139
+ scoreType: 'inspector',
140
+ dataType: 'score'
141
+ },
142
+ // 환경성과 (Y5) - Environmental Performance
143
+ {
144
+ name: '건설폐기물 발생량',
145
+ description: '건설폐기물 발생량 평가',
146
+ categoryName: '환경성과',
147
+ formula: 'Table 활용',
148
+ scoreType: 'table',
149
+ dataType: 'score'
150
+ },
151
+ {
152
+ name: '환경성과 수준 평가',
153
+ description: '환경성과 종합 평가',
154
+ categoryName: '환경성과',
155
+ formula: '감리자 1~5점 척도',
156
+ scoreType: 'inspector',
157
+ dataType: 'score'
158
+ },
159
+ // 생산성성과 (Y6) - Productivity Performance
160
+ {
161
+ name: '투입인력 생산성',
162
+ description: '투입인력 생산성 평가',
163
+ categoryName: '생산성과',
164
+ formula: 'Eq. 활용',
165
+ scoreType: 'equation',
166
+ dataType: 'ratio'
167
+ },
168
+ {
169
+ name: '생산성성과 수준 평가',
170
+ description: '생산성과 종합 평가',
171
+ categoryName: '생산성과',
172
+ formula: '감리자 1~5점 척도',
173
+ scoreType: 'inspector',
174
+ dataType: 'score'
175
+ }
176
+ ];
177
+ class SeedKpi1752190849681 {
178
+ async up(queryRunner) {
179
+ try {
180
+ const repository = (0, shell_1.getRepository)(kpi_1.Kpi);
181
+ const domainRepository = (0, shell_1.getRepository)(shell_1.Domain);
182
+ // SYSTEM 도메인 확인
183
+ const domain = await domainRepository.findOneBy({ name: 'SYSTEM' });
184
+ if (!domain) {
185
+ console.log('❌ SYSTEM domain not found');
186
+ return;
187
+ }
188
+ // JSON 파일 읽기
189
+ const seedFilePath = path.join(__dirname, 'seed-data', 'kpis-seed.json');
190
+ const seedData = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'));
191
+ // 이름으로 KPI를 찾을 수 있는 맵 생성
192
+ const kpiNameMap = new Map();
193
+ // 1단계: parent_name이 null인 루트 KPI들 먼저 생성
194
+ const rootKpis = seedData.filter(kpi => kpi.parent_name === null);
195
+ for (const kpiData of rootKpis) {
196
+ const existingKpi = await repository.findOne({
197
+ where: { name: kpiData.name, domain: { id: domain.id } }
198
+ });
199
+ if (existingKpi) {
200
+ console.log(`⚠️ KPI already exists: ${kpiData.name}`);
201
+ kpiNameMap.set(kpiData.name, existingKpi);
202
+ continue;
203
+ }
204
+ const kpi = await repository.save({
205
+ name: kpiData.name,
206
+ description: kpiData.description,
207
+ formula: kpiData.formula,
208
+ active: kpiData.active,
209
+ state: kpiData.state ? kpi_1.KpiStatus[kpiData.state] : kpi_1.KpiStatus.DRAFT,
210
+ vizType: kpiData.viz_type ? kpi_1.KpiVizType[kpiData.viz_type] : null,
211
+ vizMeta: kpiData.viz_meta,
212
+ schedule: kpiData.schedule,
213
+ scheduleId: kpiData.schedule_id,
214
+ timezone: kpiData.timezone,
215
+ grades: kpiData.grades ? JSON.parse(kpiData.grades) : null,
216
+ periodType: kpi_1.KpiPeriodType[kpiData.period_type],
217
+ weight: kpiData.weight,
218
+ scoreFormula: kpiData.score_formula,
219
+ isLeaf: kpiData.is_leaf,
220
+ parent: null,
221
+ domain
222
+ });
223
+ kpiNameMap.set(kpi.name, kpi);
224
+ console.log(`✅ Created root KPI: ${kpi.name}`);
225
+ }
226
+ // 2단계: 자식 KPI들 생성 (parent_name이 있는 KPI들)
227
+ const childKpis = seedData.filter(kpi => kpi.parent_name !== null);
228
+ for (const kpiData of childKpis) {
229
+ const existingKpi = await repository.findOne({
230
+ where: { name: kpiData.name, domain: { id: domain.id } }
231
+ });
232
+ if (existingKpi) {
233
+ console.log(`⚠️ KPI already exists: ${kpiData.name}`);
234
+ continue;
235
+ }
236
+ // 부모 KPI 찾기
237
+ const parentKpi = kpiNameMap.get(kpiData.parent_name);
238
+ if (!parentKpi) {
239
+ console.log(`❌ Parent KPI not found: ${kpiData.parent_name} for ${kpiData.name}`);
240
+ continue;
241
+ }
242
+ const kpi = await repository.save({
243
+ name: kpiData.name,
244
+ description: kpiData.description,
245
+ formula: kpiData.formula,
246
+ active: kpiData.active,
247
+ state: kpiData.state ? kpi_1.KpiStatus[kpiData.state] : kpi_1.KpiStatus.DRAFT,
248
+ vizType: kpiData.viz_type ? kpi_1.KpiVizType[kpiData.viz_type] : null,
249
+ vizMeta: kpiData.viz_meta,
250
+ schedule: kpiData.schedule,
251
+ scheduleId: kpiData.schedule_id,
252
+ timezone: kpiData.timezone,
253
+ grades: kpiData.grades ? JSON.parse(kpiData.grades) : null,
254
+ periodType: kpi_1.KpiPeriodType[kpiData.period_type],
255
+ weight: kpiData.weight,
256
+ scoreFormula: kpiData.score_formula,
257
+ isLeaf: kpiData.is_leaf,
258
+ parent: parentKpi,
259
+ domain
260
+ });
261
+ kpiNameMap.set(kpi.name, kpi);
262
+ console.log(`✅ Created child KPI: ${kpi.name} (parent: ${parentKpi.name})`);
263
+ }
264
+ console.log(`🎉 Successfully processed ${seedData.length} KPIs from JSON seed`);
265
+ }
266
+ catch (error) {
267
+ console.error('❌ Error seeding KPIs from JSON:', error);
268
+ throw error;
269
+ }
270
+ }
271
+ async down(queryRunner) {
272
+ try {
273
+ const repository = (0, shell_1.getRepository)(kpi_1.Kpi);
274
+ const domainRepository = (0, shell_1.getRepository)(shell_1.Domain);
275
+ const domain = await domainRepository.findOneBy({ name: 'SYSTEM' });
276
+ if (!domain) {
277
+ console.log('⚠️ SYSTEM domain not found. Nothing to delete.');
278
+ return;
279
+ }
280
+ // JSON 파일 읽기
281
+ const seedFilePath = path.join(__dirname, 'seed-data', 'kpis-seed.json');
282
+ const seedData = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'));
283
+ // 자식부터 삭제 (역순으로)
284
+ const childKpis = seedData.filter(kpi => kpi.parent_name !== null).reverse();
285
+ const rootKpis = seedData.filter(kpi => kpi.parent_name === null).reverse();
286
+ // 자식 KPI들 먼저 삭제
287
+ for (const kpiData of childKpis) {
288
+ const kpi = await repository.findOne({
289
+ where: { name: kpiData.name, domain: { id: domain.id } }
290
+ });
291
+ if (kpi) {
292
+ await repository.delete(kpi.id);
293
+ console.log(`✅ Deleted child KPI: ${kpiData.name}`);
294
+ }
295
+ }
296
+ // 루트 KPI들 삭제
297
+ for (const kpiData of rootKpis) {
298
+ const kpi = await repository.findOne({
299
+ where: { name: kpiData.name, domain: { id: domain.id } }
300
+ });
301
+ if (kpi) {
302
+ await repository.delete(kpi.id);
303
+ console.log(`✅ Deleted root KPI: ${kpiData.name}`);
304
+ }
305
+ }
306
+ console.log(`🎉 Successfully cleaned up KPIs from JSON seed`);
307
+ }
308
+ catch (error) {
309
+ console.error('❌ Error cleaning up KPIs:', error);
310
+ throw error;
311
+ }
312
+ }
313
+ }
314
+ exports.SeedKpi1752190849681 = SeedKpi1752190849681;
315
+ //# sourceMappingURL=1752190849681-seed-kpi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1752190849681-seed-kpi.js","sourceRoot":"","sources":["../../server/migrations/1752190849681-seed-kpi.ts"],"names":[],"mappings":"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","sourcesContent":["import { MigrationInterface, QueryRunner } from 'typeorm'\nimport { Domain, getRepository } from '@things-factory/shell'\nimport { Kpi, KpiStatus, KpiPeriodType, KpiVizType } from '../service/kpi/kpi'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\nconst SEED = [\n // 일정성과 (Y1) - Schedule Performance\n {\n name: '연면적 대비 공사기간',\n description: '연면적 대비 공사기간 평가',\n categoryName: '일정성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '설계변경에 따른 공기 증감률',\n description: '설계변경에 따른 공기 증감률 평가',\n categoryName: '일정성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '일정 이탈 수준',\n description: '프로젝트 일정 이탈 수준 평가',\n categoryName: '일정성과',\n formula: 'Table(DART 등) 활용(1~5점)',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '일정성과 수준 평가',\n description: '일정성과 종합 평가',\n categoryName: '일정성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 비용성과 (Y2) - Cost Performance\n {\n name: '연면적 대비 공사비',\n description: '연면적 대비 공사비 평가',\n categoryName: '비용성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '설계변경에 따른 공사비 증감률',\n description: '설계변경에 따른 공사비 증감률 평가',\n categoryName: '비용성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '비용성과 수준 평가',\n description: '비용성과 종합 평가',\n categoryName: '비용성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 품질성과 (Y3) - Quality Performance\n {\n name: '품질시험 불합격률',\n description: '품질시험 불합격률 평가',\n categoryName: '품질성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '검수자재 불합격률',\n description: '검수자재 불합격률 평가',\n categoryName: '품질성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '검측 불합격률',\n description: '검측 불합격률 평가',\n categoryName: '품질성과',\n formula: 'Table 활용',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '품질 SL-PA 결과값',\n description: '품질 SL-PA 결과',\n categoryName: '품질성과',\n formula: 'Python 활용(1~5점)',\n scoreType: 'python',\n dataType: 'score'\n },\n {\n name: '품질성과 수준 평가',\n description: '품질성과 종합 평가',\n categoryName: '품질성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 안전성과 (Y4) - Safety Performance\n {\n name: '재해율',\n description: '재해율 평가',\n categoryName: '안전성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '재해강도율',\n description: '재해강도율 평가',\n categoryName: '안전성과',\n formula: 'Table 활용',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '안전 SL-PA 결과값',\n description: '안전 SL-PA 결과',\n categoryName: '안전성과',\n formula: 'Python 활용(1~5점)',\n scoreType: 'python',\n dataType: 'score'\n },\n {\n name: '안전성과 수준 평가',\n description: '안전성과 종합 평가',\n categoryName: '안전성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 환경성과 (Y5) - Environmental Performance\n {\n name: '건설폐기물 발생량',\n description: '건설폐기물 발생량 평가',\n categoryName: '환경성과',\n formula: 'Table 활용',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '환경성과 수준 평가',\n description: '환경성과 종합 평가',\n categoryName: '환경성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 생산성성과 (Y6) - Productivity Performance\n {\n name: '투입인력 생산성',\n description: '투입인력 생산성 평가',\n categoryName: '생산성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '생산성성과 수준 평가',\n description: '생산성과 종합 평가',\n categoryName: '생산성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n }\n]\n\ninterface KpiSeedData {\n name: string\n description: string\n formula?: string | null\n active: boolean\n state?: string | null\n viz_type?: string | null\n viz_meta?: any | null\n schedule?: string | null\n schedule_id?: string | null\n timezone?: string | null\n grades?: any | null\n period_type: string\n weight: number\n score_formula?: string | null\n is_leaf: boolean\n parent_name?: string | null\n}\n\nexport class SeedKpi1752190849681 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<any> {\n try {\n const repository = getRepository(Kpi)\n const domainRepository = getRepository(Domain)\n\n // SYSTEM 도메인 확인\n const domain: Domain = await domainRepository.findOneBy({ name: 'SYSTEM' })\n if (!domain) {\n console.log('❌ SYSTEM domain not found')\n return\n }\n\n // JSON 파일 읽기\n const seedFilePath = path.join(__dirname, 'seed-data', 'kpis-seed.json')\n const seedData: KpiSeedData[] = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'))\n\n // 이름으로 KPI를 찾을 수 있는 맵 생성\n const kpiNameMap = new Map<string, Kpi>()\n\n // 1단계: parent_name이 null인 루트 KPI들 먼저 생성\n const rootKpis = seedData.filter(kpi => kpi.parent_name === null)\n\n for (const kpiData of rootKpis) {\n const existingKpi = await repository.findOne({\n where: { name: kpiData.name, domain: { id: domain.id } }\n })\n\n if (existingKpi) {\n console.log(`⚠️ KPI already exists: ${kpiData.name}`)\n kpiNameMap.set(kpiData.name, existingKpi)\n continue\n }\n\n const kpi = await repository.save({\n name: kpiData.name,\n description: kpiData.description,\n formula: kpiData.formula,\n active: kpiData.active,\n state: kpiData.state ? KpiStatus[kpiData.state as keyof typeof KpiStatus] : KpiStatus.DRAFT,\n vizType: kpiData.viz_type ? KpiVizType[kpiData.viz_type as keyof typeof KpiVizType] : null,\n vizMeta: kpiData.viz_meta,\n schedule: kpiData.schedule,\n scheduleId: kpiData.schedule_id,\n timezone: kpiData.timezone,\n grades: kpiData.grades ? JSON.parse(kpiData.grades) : null,\n periodType: KpiPeriodType[kpiData.period_type as keyof typeof KpiPeriodType],\n weight: kpiData.weight,\n scoreFormula: kpiData.score_formula,\n isLeaf: kpiData.is_leaf,\n parent: null,\n domain\n })\n\n kpiNameMap.set(kpi.name, kpi)\n console.log(`✅ Created root KPI: ${kpi.name}`)\n }\n\n // 2단계: 자식 KPI들 생성 (parent_name이 있는 KPI들)\n const childKpis = seedData.filter(kpi => kpi.parent_name !== null)\n\n for (const kpiData of childKpis) {\n const existingKpi = await repository.findOne({\n where: { name: kpiData.name, domain: { id: domain.id } }\n })\n\n if (existingKpi) {\n console.log(`⚠️ KPI already exists: ${kpiData.name}`)\n continue\n }\n\n // 부모 KPI 찾기\n const parentKpi = kpiNameMap.get(kpiData.parent_name!)\n if (!parentKpi) {\n console.log(`❌ Parent KPI not found: ${kpiData.parent_name} for ${kpiData.name}`)\n continue\n }\n\n const kpi = await repository.save({\n name: kpiData.name,\n description: kpiData.description,\n formula: kpiData.formula,\n active: kpiData.active,\n state: kpiData.state ? KpiStatus[kpiData.state as keyof typeof KpiStatus] : KpiStatus.DRAFT,\n vizType: kpiData.viz_type ? KpiVizType[kpiData.viz_type as keyof typeof KpiVizType] : null,\n vizMeta: kpiData.viz_meta,\n schedule: kpiData.schedule,\n scheduleId: kpiData.schedule_id,\n timezone: kpiData.timezone,\n grades: kpiData.grades ? JSON.parse(kpiData.grades) : null,\n periodType: KpiPeriodType[kpiData.period_type as keyof typeof KpiPeriodType],\n weight: kpiData.weight,\n scoreFormula: kpiData.score_formula,\n isLeaf: kpiData.is_leaf,\n parent: parentKpi,\n domain\n })\n\n kpiNameMap.set(kpi.name, kpi)\n console.log(`✅ Created child KPI: ${kpi.name} (parent: ${parentKpi.name})`)\n }\n\n console.log(`🎉 Successfully processed ${seedData.length} KPIs from JSON seed`)\n } catch (error) {\n console.error('❌ Error seeding KPIs from JSON:', error)\n throw error\n }\n }\n\n public async down(queryRunner: QueryRunner): Promise<any> {\n try {\n const repository = getRepository(Kpi)\n const domainRepository = getRepository(Domain)\n\n const domain: Domain = await domainRepository.findOneBy({ name: 'SYSTEM' })\n if (!domain) {\n console.log('⚠️ SYSTEM domain not found. Nothing to delete.')\n return\n }\n\n // JSON 파일 읽기\n const seedFilePath = path.join(__dirname, 'seed-data', 'kpis-seed.json')\n const seedData: KpiSeedData[] = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'))\n\n // 자식부터 삭제 (역순으로)\n const childKpis = seedData.filter(kpi => kpi.parent_name !== null).reverse()\n const rootKpis = seedData.filter(kpi => kpi.parent_name === null).reverse()\n\n // 자식 KPI들 먼저 삭제\n for (const kpiData of childKpis) {\n const kpi = await repository.findOne({\n where: { name: kpiData.name, domain: { id: domain.id } }\n })\n if (kpi) {\n await repository.delete(kpi.id)\n console.log(`✅ Deleted child KPI: ${kpiData.name}`)\n }\n }\n\n // 루트 KPI들 삭제\n for (const kpiData of rootKpis) {\n const kpi = await repository.findOne({\n where: { name: kpiData.name, domain: { id: domain.id } }\n })\n if (kpi) {\n await repository.delete(kpi.id)\n console.log(`✅ Deleted root KPI: ${kpiData.name}`)\n }\n }\n\n console.log(`🎉 Successfully cleaned up KPIs from JSON seed`)\n } catch (error) {\n console.error('❌ Error cleaning up KPIs:', error)\n throw error\n }\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class AddGradesToKpi1752192090123 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ private loadGradeDataToKpi;
7
+ }