@dssp/dkpi 1.0.0-alpha.7 β†’ 1.0.0-alpha.70

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 (232) hide show
  1. package/KPI-STATISTICS-SERVICE.md +233 -0
  2. package/_index.html +0 -5
  3. package/assets/favicon.ico +0 -0
  4. package/assets/images/project-image.png +0 -0
  5. package/assets/manifest/apple-1024.png +0 -0
  6. package/assets/manifest/apple-120.png +0 -0
  7. package/assets/manifest/apple-152.png +0 -0
  8. package/assets/manifest/apple-167.png +0 -0
  9. package/assets/manifest/apple-180.png +0 -0
  10. package/assets/manifest/apple-touch-icon.png +0 -0
  11. package/assets/manifest/badge-128x128.png +0 -0
  12. package/assets/manifest/chrome-splashscreen-icon-384x384.png +0 -0
  13. package/assets/manifest/chrome-touch-icon-192x192.png +0 -0
  14. package/assets/manifest/icon-128x128.png +0 -0
  15. package/assets/manifest/icon-192x192.png +0 -0
  16. package/assets/manifest/icon-512x512.png +0 -0
  17. package/assets/manifest/icon-72x72.png +0 -0
  18. package/assets/manifest/icon-96x96.png +0 -0
  19. package/assets/manifest/image-metaog.png +0 -0
  20. package/assets/manifest/maskable_icon.png +0 -0
  21. package/assets/manifest/ms-icon-144x144.png +0 -0
  22. package/assets/manifest/ms-touch-icon-144x144-precomposed.png +0 -0
  23. package/assets/videos/intro.mp4 +0 -0
  24. package/dist-client/bootstrap.js +64 -4
  25. package/dist-client/bootstrap.js.map +1 -1
  26. package/dist-client/components/kpi-2d-lookup-chart.d.ts +43 -0
  27. package/dist-client/components/kpi-2d-lookup-chart.js +253 -0
  28. package/dist-client/components/kpi-2d-lookup-chart.js.map +1 -0
  29. package/dist-client/components/kpi-boxplot-chart.d.ts +24 -0
  30. package/dist-client/components/kpi-boxplot-chart.js +291 -0
  31. package/dist-client/components/kpi-boxplot-chart.js.map +1 -0
  32. package/dist-client/components/kpi-lookup-chart.d.ts +53 -0
  33. package/dist-client/components/kpi-lookup-chart.js +430 -0
  34. package/dist-client/components/kpi-lookup-chart.js.map +1 -0
  35. package/dist-client/components/kpi-mini-trend-chart.d.ts +14 -0
  36. package/dist-client/components/kpi-mini-trend-chart.js +148 -0
  37. package/dist-client/components/kpi-mini-trend-chart.js.map +1 -0
  38. package/dist-client/components/kpi-radar-chart.d.ts +17 -0
  39. package/dist-client/components/kpi-radar-chart.js +259 -0
  40. package/dist-client/components/kpi-radar-chart.js.map +1 -0
  41. package/dist-client/components/kpi-single-boxplot-chart.d.ts +24 -0
  42. package/dist-client/components/kpi-single-boxplot-chart.js +391 -0
  43. package/dist-client/components/kpi-single-boxplot-chart.js.map +1 -0
  44. package/dist-client/components/kpi-trend-chart.d.ts +25 -0
  45. package/dist-client/components/kpi-trend-chart.js +220 -0
  46. package/dist-client/components/kpi-trend-chart.js.map +1 -0
  47. package/dist-client/components/sv-pagenation-control.d.ts +18 -0
  48. package/dist-client/components/sv-pagenation-control.js +142 -0
  49. package/dist-client/components/sv-pagenation-control.js.map +1 -0
  50. package/dist-client/google-map/common-google-map.d.ts +35 -0
  51. package/dist-client/google-map/common-google-map.js +345 -0
  52. package/dist-client/google-map/common-google-map.js.map +1 -0
  53. package/dist-client/google-map/google-map-loader.d.ts +6 -0
  54. package/dist-client/google-map/google-map-loader.js +23 -0
  55. package/dist-client/google-map/google-map-loader.js.map +1 -0
  56. package/dist-client/icons/menu-icons.d.ts +6 -0
  57. package/dist-client/icons/menu-icons.js +42 -0
  58. package/dist-client/icons/menu-icons.js.map +1 -1
  59. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.d.ts +22 -0
  60. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js +57 -0
  61. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js.map +1 -0
  62. package/dist-client/pages/kpi-admin/dssp-kpi-overview.d.ts +46 -0
  63. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js +378 -0
  64. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js.map +1 -0
  65. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.d.ts +20 -0
  66. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js +445 -0
  67. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js.map +1 -0
  68. package/dist-client/pages/kpi-admin/kpi-system-guide.d.ts +18 -0
  69. package/dist-client/pages/kpi-admin/kpi-system-guide.js +535 -0
  70. package/dist-client/pages/kpi-admin/kpi-system-guide.js.map +1 -0
  71. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.d.ts +18 -0
  72. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +259 -0
  73. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -0
  74. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.d.ts +22 -0
  75. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +346 -0
  76. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -0
  77. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.d.ts +26 -0
  78. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +433 -0
  79. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -0
  80. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.d.ts +8 -0
  81. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js +78 -0
  82. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js.map +1 -0
  83. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +38 -0
  84. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +851 -0
  85. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -0
  86. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +42 -0
  87. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +316 -0
  88. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -0
  89. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +28 -0
  90. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +497 -0
  91. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -0
  92. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
  93. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +131 -0
  94. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
  95. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +52 -0
  96. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +798 -0
  97. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -0
  98. package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +63 -0
  99. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +1089 -0
  100. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -0
  101. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +12 -0
  102. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +82 -0
  103. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +1 -0
  104. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +11 -0
  105. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +65 -0
  106. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +1 -0
  107. package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +13 -0
  108. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +115 -0
  109. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +1 -0
  110. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +15 -0
  111. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +147 -0
  112. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -0
  113. package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +7 -0
  114. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +86 -0
  115. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +1 -0
  116. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +57 -0
  117. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +719 -0
  118. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -0
  119. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.d.ts +23 -0
  120. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +76 -0
  121. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -0
  122. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +68 -0
  123. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +380 -0
  124. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -0
  125. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +12 -0
  126. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +174 -0
  127. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -0
  128. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +40 -0
  129. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +190 -0
  130. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -0
  131. package/dist-client/pages/kpi-value/kpi-value-importer.d.ts +23 -0
  132. package/dist-client/pages/kpi-value/kpi-value-importer.js +93 -0
  133. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +1 -0
  134. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +71 -0
  135. package/dist-client/pages/kpi-value/kpi-value-list-page.js +464 -0
  136. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -0
  137. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.d.ts +14 -0
  138. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +339 -0
  139. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +1 -0
  140. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.d.ts +14 -0
  141. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js +276 -0
  142. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js.map +1 -0
  143. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.d.ts +18 -0
  144. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js +307 -0
  145. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js.map +1 -0
  146. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.d.ts +18 -0
  147. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js +433 -0
  148. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js.map +1 -0
  149. package/dist-client/pages/sv-project-complete.d.ts +21 -0
  150. package/dist-client/pages/sv-project-complete.js +213 -0
  151. package/dist-client/pages/sv-project-complete.js.map +1 -0
  152. package/dist-client/pages/sv-project-completed-list.d.ts +27 -0
  153. package/dist-client/pages/sv-project-completed-list.js +416 -0
  154. package/dist-client/pages/sv-project-completed-list.js.map +1 -0
  155. package/dist-client/pages/sv-project-detail.d.ts +46 -0
  156. package/dist-client/pages/sv-project-detail.js +1236 -0
  157. package/dist-client/pages/sv-project-detail.js.map +1 -0
  158. package/dist-client/pages/sv-project-list.d.ts +165 -0
  159. package/dist-client/pages/sv-project-list.js +488 -0
  160. package/dist-client/pages/sv-project-list.js.map +1 -0
  161. package/dist-client/route.d.ts +1 -1
  162. package/dist-client/route.js +35 -1
  163. package/dist-client/route.js.map +1 -1
  164. package/dist-client/shared/complete-api.d.ts +8 -0
  165. package/dist-client/shared/complete-api.js +177 -0
  166. package/dist-client/shared/complete-api.js.map +1 -0
  167. package/dist-client/shared/func.d.ts +2 -0
  168. package/dist-client/shared/func.js +22 -0
  169. package/dist-client/shared/func.js.map +1 -0
  170. package/dist-client/themes/dark.css +24 -24
  171. package/dist-client/themes/light.css +23 -23
  172. package/dist-client/tsconfig.tsbuildinfo +1 -1
  173. package/dist-client/viewparts/menu-tools.d.ts +40 -5
  174. package/dist-client/viewparts/menu-tools.js +289 -34
  175. package/dist-client/viewparts/menu-tools.js.map +1 -1
  176. package/dist-server/index.d.ts +2 -0
  177. package/dist-server/index.js +5 -0
  178. package/dist-server/index.js.map +1 -1
  179. package/dist-server/migrations/index.d.ts +1 -0
  180. package/dist-server/migrations/index.js +12 -0
  181. package/dist-server/migrations/index.js.map +1 -0
  182. package/dist-server/scripts/calculate-kpi-scores.d.ts +10 -0
  183. package/dist-server/scripts/calculate-kpi-scores.js +333 -0
  184. package/dist-server/scripts/calculate-kpi-scores.js.map +1 -0
  185. package/dist-server/scripts/load-grade-data-migration.d.ts +14 -0
  186. package/dist-server/scripts/load-grade-data-migration.js +279 -0
  187. package/dist-server/scripts/load-grade-data-migration.js.map +1 -0
  188. package/dist-server/scripts/propagate-parent-kpi-values.d.ts +14 -0
  189. package/dist-server/scripts/propagate-parent-kpi-values.js +786 -0
  190. package/dist-server/scripts/propagate-parent-kpi-values.js.map +1 -0
  191. package/dist-server/scripts/recalculate-by-project-name.d.ts +2 -0
  192. package/dist-server/scripts/recalculate-by-project-name.js +72 -0
  193. package/dist-server/scripts/recalculate-by-project-name.js.map +1 -0
  194. package/dist-server/service/index.d.ts +4 -0
  195. package/dist-server/service/index.js +20 -0
  196. package/dist-server/service/index.js.map +1 -0
  197. package/dist-server/service/kpi-metric-value/index.d.ts +4 -0
  198. package/dist-server/service/kpi-metric-value/index.js +8 -0
  199. package/dist-server/service/kpi-metric-value/index.js.map +1 -0
  200. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +74 -0
  201. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +687 -0
  202. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -0
  203. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +7 -0
  204. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +52 -0
  205. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -0
  206. package/dist-server/service/kpi-stat/index.d.ts +4 -0
  207. package/dist-server/service/kpi-stat/index.js +8 -0
  208. package/dist-server/service/kpi-stat/index.js.map +1 -0
  209. package/dist-server/service/kpi-stat/kpi-stat-query.d.ts +12 -0
  210. package/dist-server/service/kpi-stat/kpi-stat-query.js +662 -0
  211. package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -0
  212. package/dist-server/service/kpi-stat/kpi-stat-types.d.ts +32 -0
  213. package/dist-server/service/kpi-stat/kpi-stat-types.js +180 -0
  214. package/dist-server/service/kpi-stat/kpi-stat-types.js.map +1 -0
  215. package/dist-server/service/kpi-value/index.d.ts +3 -0
  216. package/dist-server/service/kpi-value/index.js +7 -0
  217. package/dist-server/service/kpi-value/index.js.map +1 -0
  218. package/dist-server/service/kpi-value/kpi-value-query.d.ts +8 -0
  219. package/dist-server/service/kpi-value/kpi-value-query.js +69 -0
  220. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -0
  221. package/dist-server/tsconfig.tsbuildinfo +1 -1
  222. package/kpi-module-service-tests.md +1286 -0
  223. package/kpi-module-test-report.md +676 -0
  224. package/kpi-module-unit-test-detailed-report.md +925 -0
  225. package/kpi-module-unit-tests-detailed.md +1452 -0
  226. package/package.json +65 -55
  227. package/recalculate-batch.sh +64 -0
  228. package/recalculate-projects-range.sh +98 -0
  229. package/schema.graphql +2514 -455
  230. package/things-factory.config.js +11 -1
  231. package/views/auth-page.html +0 -1
  232. package/views/public/home.html +0 -1
@@ -0,0 +1,279 @@
1
+ #!/usr/bin/env ts-node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.loadKpiGradeData = loadKpiGradeData;
5
+ exports.deactivateDeletedKpis = deactivateDeletedKpis;
6
+ exports.listGradeDataFiles = listGradeDataFiles;
7
+ const tslib_1 = require("tslib");
8
+ const typeorm_1 = require("typeorm");
9
+ const fs = tslib_1.__importStar(require("fs"));
10
+ const path = tslib_1.__importStar(require("path"));
11
+ /** X31/X32 λΉ„ν™œμ„±ν™” λŒ€μƒ KPI 이름 */
12
+ const DEACTIVATE_KPI_NAMES = ['X31. ν’ˆμ§ˆμ‹œν—˜ λΆˆν•©κ²©λ₯ ', 'X32. κ²€μˆ˜μžμž¬ λΆˆν•©κ²©λ₯ '];
13
+ function isGrade2DLookup(grades) {
14
+ return grades && typeof grades === 'object' && !Array.isArray(grades) && (grades.type === 'PROGRESS_DEVIATION_LOOKUP' || grades.type === 'PROGRESS_DEVIATION_LOOKUP');
15
+ }
16
+ function normalize2DGrades(grades) {
17
+ return Object.assign(Object.assign({}, grades), { type: 'PROGRESS_DEVIATION_LOOKUP' });
18
+ }
19
+ function getGradeCount(grades) {
20
+ if (isGrade2DLookup(grades)) {
21
+ return grades.rows.length;
22
+ }
23
+ return Array.isArray(grades) ? grades.length : 0;
24
+ }
25
+ /**
26
+ * Load KPI grade data from JSON files - Migration Style
27
+ * This can be called directly from migrations or other server-side scripts
28
+ */
29
+ async function loadKpiGradeData(specificFile) {
30
+ const gradeDataPath = path.join(__dirname, 'grade-data');
31
+ // Set NODE_ENV if not set
32
+ if (!process.env.NODE_ENV) {
33
+ process.env.NODE_ENV = 'development';
34
+ }
35
+ // Initialize Things-Factory environment
36
+ const { config } = require('@things-factory/env');
37
+ const ormconfig = require('@things-factory/shell/dist-server/initializers/ormconfig.js');
38
+ const connectionConfig = config.get('ormconfig');
39
+ let connection;
40
+ console.log('πŸš€ Loading KPI Grade Data...');
41
+ console.log(`πŸ“ Source directory: ${gradeDataPath}`);
42
+ try {
43
+ // Create database connection using Things-Factory pattern
44
+ console.log('πŸ”Œ Connecting to database...');
45
+ connection = await (0, typeorm_1.createConnection)(Object.assign(Object.assign(Object.assign({}, ormconfig), connectionConfig), { logging: false }));
46
+ // Register the connection with Things-Factory shell
47
+ const { addDataSource } = require('@things-factory/shell');
48
+ addDataSource('default', connection);
49
+ console.log('βœ… Database connected');
50
+ // Check if grade-data directory exists
51
+ if (!fs.existsSync(gradeDataPath)) {
52
+ console.error(`❌ Grade data directory not found: ${gradeDataPath}`);
53
+ throw new Error('Grade data directory not found');
54
+ }
55
+ // Get files to process
56
+ let files;
57
+ if (specificFile) {
58
+ if (!fs.existsSync(path.join(gradeDataPath, specificFile))) {
59
+ throw new Error(`File not found: ${specificFile}`);
60
+ }
61
+ files = [specificFile];
62
+ console.log(`πŸ“„ Processing single file: ${specificFile}`);
63
+ }
64
+ else {
65
+ files = fs.readdirSync(gradeDataPath).filter(file => file.endsWith('.json'));
66
+ console.log(`πŸ“ Found ${files.length} grade data files`);
67
+ }
68
+ if (files.length === 0) {
69
+ console.log('⚠️ No JSON files found to process');
70
+ return;
71
+ }
72
+ let successCount = 0;
73
+ let errorCount = 0;
74
+ // Now we can use getRepository with the registered connection
75
+ const { getRepository } = require('@things-factory/shell');
76
+ const { Kpi } = require('@things-factory/kpi');
77
+ const kpiRepository = getRepository(Kpi);
78
+ for (const file of files) {
79
+ try {
80
+ console.log(`\nπŸ“„ Processing: ${file}`);
81
+ const filePath = path.join(gradeDataPath, file);
82
+ const fileContent = fs.readFileSync(filePath, 'utf8');
83
+ const gradeData = JSON.parse(fileContent);
84
+ // Validate grade data structure (1D array or 2D lookup object)
85
+ if (!gradeData.kpiName || !gradeData.grades) {
86
+ console.log(` ❌ Invalid structure - missing kpiName or grades`);
87
+ errorCount++;
88
+ continue;
89
+ }
90
+ const is2D = isGrade2DLookup(gradeData.grades);
91
+ if (!is2D && !Array.isArray(gradeData.grades)) {
92
+ console.log(` ❌ Invalid grades format - expected array or 2d-lookup object`);
93
+ errorCount++;
94
+ continue;
95
+ }
96
+ const gradeCount = getGradeCount(gradeData.grades);
97
+ console.log(` πŸ” KPI Name: ${gradeData.kpiName}`);
98
+ console.log(` πŸ“Š Grades: ${gradeCount} entries${is2D ? ' (2D lookup)' : ''}`);
99
+ // Find KPI by name in SYSTEM domain
100
+ const kpi = await kpiRepository.findOne({
101
+ where: { name: gradeData.kpiName, domain: { name: 'SYSTEM' } },
102
+ relations: ['domain']
103
+ });
104
+ if (kpi) {
105
+ // Update grades data (normalize 2D type string to 'PROGRESS_DEVIATION_LOOKUP')
106
+ const originalGradesCount = kpi.grades ? getGradeCount(kpi.grades) : 0;
107
+ if (is2D) {
108
+ kpi.grades = normalize2DGrades(gradeData.grades);
109
+ kpi.scoreType = 'CUSTOM';
110
+ }
111
+ else {
112
+ kpi.grades = gradeData.grades;
113
+ kpi.scoreType = 'LOOKUP';
114
+ }
115
+ await kpiRepository.save(kpi);
116
+ console.log(` βœ… Updated successfully (scoreType: ${kpi.scoreType})`);
117
+ console.log(` πŸ“ˆ Grades: ${originalGradesCount} β†’ ${gradeCount}`);
118
+ successCount++;
119
+ }
120
+ else {
121
+ console.log(` ⚠️ KPI not found in SYSTEM domain: ${gradeData.kpiName}`);
122
+ errorCount++;
123
+ }
124
+ }
125
+ catch (fileError) {
126
+ console.log(` ❌ File processing error: ${fileError.message}`);
127
+ errorCount++;
128
+ }
129
+ }
130
+ console.log(`\nπŸŽ‰ KPI Grade Data Loading Complete!`);
131
+ console.log(` πŸ“Š Total files: ${files.length}`);
132
+ console.log(` βœ… Successful: ${successCount}`);
133
+ console.log(` ❌ Errors: ${errorCount}`);
134
+ if (errorCount > 0) {
135
+ console.log(`\n⚠️ Some files had errors. Check the logs above for details.`);
136
+ }
137
+ }
138
+ catch (error) {
139
+ console.error(`❌ Fatal error during grade data loading:`, error);
140
+ throw error;
141
+ }
142
+ finally {
143
+ if (connection) {
144
+ await connection.close();
145
+ console.log('πŸ”Œ Database connection closed');
146
+ }
147
+ }
148
+ }
149
+ /**
150
+ * X31/X32 KPIλ₯Ό λΉ„ν™œμ„±ν™” (active = false, grades = null)
151
+ */
152
+ async function deactivateDeletedKpis() {
153
+ if (!process.env.NODE_ENV) {
154
+ process.env.NODE_ENV = 'development';
155
+ }
156
+ const { config } = require('@things-factory/env');
157
+ const ormconfig = require('@things-factory/shell/dist-server/initializers/ormconfig.js');
158
+ const connectionConfig = config.get('ormconfig');
159
+ let connection;
160
+ console.log('🚫 Deactivating deleted KPIs (X31, X32)...');
161
+ try {
162
+ console.log('πŸ”Œ Connecting to database...');
163
+ connection = await (0, typeorm_1.createConnection)(Object.assign(Object.assign(Object.assign({}, ormconfig), connectionConfig), { logging: false }));
164
+ const { addDataSource } = require('@things-factory/shell');
165
+ addDataSource('default', connection);
166
+ const { getRepository } = require('@things-factory/shell');
167
+ const { Kpi } = require('@things-factory/kpi');
168
+ const kpiRepository = getRepository(Kpi);
169
+ for (const kpiName of DEACTIVATE_KPI_NAMES) {
170
+ const kpi = await kpiRepository.findOne({
171
+ where: { name: kpiName, domain: { name: 'SYSTEM' } },
172
+ relations: ['domain']
173
+ });
174
+ if (kpi) {
175
+ kpi.active = false;
176
+ kpi.grades = null;
177
+ await kpiRepository.save(kpi);
178
+ console.log(` βœ… Deactivated: ${kpiName}`);
179
+ }
180
+ else {
181
+ console.log(` ⚠️ KPI not found: ${kpiName}`);
182
+ }
183
+ }
184
+ console.log('\nπŸŽ‰ Deactivation complete!');
185
+ }
186
+ catch (error) {
187
+ console.error('❌ Error deactivating KPIs:', error);
188
+ throw error;
189
+ }
190
+ finally {
191
+ if (connection) {
192
+ await connection.close();
193
+ console.log('πŸ”Œ Database connection closed');
194
+ }
195
+ }
196
+ }
197
+ /**
198
+ * List available grade data files
199
+ */
200
+ function listGradeDataFiles() {
201
+ const gradeDataPath = path.join(__dirname, 'grade-data');
202
+ try {
203
+ if (!fs.existsSync(gradeDataPath)) {
204
+ console.log('πŸ“ Grade data directory not found');
205
+ return [];
206
+ }
207
+ const files = fs.readdirSync(gradeDataPath).filter(file => file.endsWith('.json'));
208
+ console.log(`πŸ“ Available grade data files in ${gradeDataPath}:\n`);
209
+ files.forEach((file, index) => {
210
+ console.log(` ${(index + 1).toString().padStart(2)}: ${file}`);
211
+ });
212
+ console.log(`\nπŸ“ˆ Total: ${files.length} files`);
213
+ return files;
214
+ }
215
+ catch (error) {
216
+ console.error('❌ Error reading grade data directory:', error);
217
+ return [];
218
+ }
219
+ }
220
+ /**
221
+ * CLI execution when called directly
222
+ */
223
+ async function main() {
224
+ const args = process.argv.slice(2);
225
+ try {
226
+ if (args.includes('--help') || args.includes('-h')) {
227
+ console.log(`
228
+ 🎯 KPI Grade Data Loader (Migration Style)
229
+
230
+ Usage:
231
+ ts-node server/scripts/load-grade-data-migration.ts [options] [fileName]
232
+
233
+ Options:
234
+ --list, -l List available grade data files
235
+ --deactivate Deactivate X31/X32 KPIs (set active=false, grades=null)
236
+ --help, -h Show this help
237
+
238
+ Examples:
239
+ ts-node server/scripts/load-grade-data-migration.ts # Load all files
240
+ ts-node server/scripts/load-grade-data-migration.ts x11-performance-table.json # Load specific file
241
+ ts-node server/scripts/load-grade-data-migration.ts --list # List files
242
+ ts-node server/scripts/load-grade-data-migration.ts --deactivate # Deactivate X31/X32
243
+
244
+ Note: This script connects to the database using the current Things-Factory configuration.
245
+ Make sure the application is properly configured before running.
246
+ Supports both 1D array grades and 2D lookup grades (X13).
247
+ `);
248
+ return;
249
+ }
250
+ if (args.includes('--list') || args.includes('-l')) {
251
+ listGradeDataFiles();
252
+ return;
253
+ }
254
+ if (args.includes('--deactivate')) {
255
+ await deactivateDeletedKpis();
256
+ console.log('\n✨ Done!');
257
+ return;
258
+ }
259
+ const specificFile = args.find(arg => !arg.startsWith('--'));
260
+ if (specificFile) {
261
+ console.log(`🎯 Loading specific file: ${specificFile}`);
262
+ await loadKpiGradeData(specificFile);
263
+ }
264
+ else {
265
+ console.log(`🎯 Loading all grade data files`);
266
+ await loadKpiGradeData();
267
+ }
268
+ console.log('\n✨ Done!');
269
+ }
270
+ catch (error) {
271
+ console.error('\n❌ Script failed:', error.message);
272
+ process.exit(1);
273
+ }
274
+ }
275
+ // Run if called directly
276
+ if (require.main === module) {
277
+ main();
278
+ }
279
+ //# sourceMappingURL=load-grade-data-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-grade-data-migration.js","sourceRoot":"","sources":["../../server/scripts/load-grade-data-migration.ts"],"names":[],"mappings":";;;AAwDA,4CA6IC;AAKD,sDAsDC;AAKD,gDAsBC;;AAzRD,qCAA0C;AAC1C,+CAAwB;AACxB,mDAA4B;AA8B5B,6BAA6B;AAC7B,MAAM,oBAAoB,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;AAEjE,SAAS,eAAe,CAAC,MAAW;IAClC,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,2BAA2B,IAAI,MAAM,CAAC,IAAI,KAAK,2BAA2B,CAAC,CAAA;AACvK,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAqB;IAC9C,uCAAY,MAAM,KAAE,IAAI,EAAE,2BAA2B,IAAE;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,MAAoC;IACzD,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAA;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAClD,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,gBAAgB,CAAC,YAAqB;IAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IAExD,0BAA0B;IAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAA;IACtC,CAAC;IAED,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,6DAA6D,CAAC,CAAA;IACxF,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAEhD,IAAI,UAAU,CAAA;IAEd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;IAC3C,OAAO,CAAC,GAAG,CAAC,wBAAwB,aAAa,EAAE,CAAC,CAAA;IAEpD,IAAI,CAAC;QACH,0DAA0D;QAC1D,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;QAC3C,UAAU,GAAG,MAAM,IAAA,0BAAgB,gDAC9B,SAAS,GACT,gBAAgB,KACnB,OAAO,EAAE,KAAK,IACd,CAAA;QAEF,oDAAoD;QACpD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAEpC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;QAEnC,uCAAuC;QACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,qCAAqC,aAAa,EAAE,CAAC,CAAA;YACnE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC;QAED,uBAAuB;QACvB,IAAI,KAAe,CAAA;QACnB,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAA;YACpD,CAAC;YACD,KAAK,GAAG,CAAC,YAAY,CAAC,CAAA;YACtB,OAAO,CAAC,GAAG,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAA;QAC3D,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;YAC5E,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAA;QAC1D,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;YACjD,OAAM;QACR,CAAC;QAED,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,UAAU,GAAG,CAAC,CAAA;QAElB,8DAA8D;QAC9D,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;QAC9C,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAA;gBAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;gBAC/C,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBACrD,MAAM,SAAS,GAAc,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;gBAEpD,+DAA+D;gBAC/D,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;oBAC5C,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAA;oBACjE,UAAU,EAAE,CAAA;oBACZ,SAAQ;gBACV,CAAC;gBAED,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;gBAC9C,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9C,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAA;oBAC9E,UAAU,EAAE,CAAA;oBACZ,SAAQ;gBACV,CAAC;gBAED,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;gBAClD,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;gBACnD,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,WAAW,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;gBAE/E,oCAAoC;gBACpC,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;oBACtC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;oBAC9D,SAAS,EAAE,CAAC,QAAQ,CAAC;iBACtB,CAAC,CAAA;gBAEF,IAAI,GAAG,EAAE,CAAC;oBACR,+EAA+E;oBAC/E,MAAM,mBAAmB,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;oBACtE,IAAI,IAAI,EAAE,CAAC;wBACT,GAAG,CAAC,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,MAAuB,CAAQ,CAAA;wBACxE,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAA;oBAC1B,CAAC;yBAAM,CAAC;wBACN,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,MAAa,CAAA;wBACpC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAA;oBAC1B,CAAC;oBACD,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBAE7B,OAAO,CAAC,GAAG,CAAC,yCAAyC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAA;oBACtE,OAAO,CAAC,GAAG,CAAC,iBAAiB,mBAAmB,MAAM,UAAU,EAAE,CAAC,CAAA;oBACnE,YAAY,EAAE,CAAA;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,0CAA0C,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;oBAC1E,UAAU,EAAE,CAAA;gBACd,CAAC;YAEH,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,+BAA+B,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;gBAC/D,UAAU,EAAE,CAAA;YACd,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;QACpD,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;QACjD,OAAO,CAAC,GAAG,CAAC,oBAAoB,YAAY,EAAE,CAAC,CAAA;QAC/C,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAA;QAEzC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;QAC/E,CAAC;IAEH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAA;QAChE,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;YACxB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAA;IACtC,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,6DAA6D,CAAC,CAAA;IACxF,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAEhD,IAAI,UAAU,CAAA;IAEd,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAA;IAEzD,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;QAC3C,UAAU,GAAG,MAAM,IAAA,0BAAgB,gDAC9B,SAAS,GACT,gBAAgB,KACnB,OAAO,EAAE,KAAK,IACd,CAAA;QAEF,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAEpC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC1D,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;QAC9C,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QAExC,KAAK,MAAM,OAAO,IAAI,oBAAoB,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;gBACtC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACpD,SAAS,EAAE,CAAC,QAAQ,CAAC;aACtB,CAAC,CAAA;YAEF,IAAI,GAAG,EAAE,CAAC;gBACR,GAAG,CAAC,MAAM,GAAG,KAAK,CAAA;gBAClB,GAAG,CAAC,MAAM,GAAG,IAAI,CAAA;gBACjB,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC7B,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAA;YAC7C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAA;YACjD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAA;QAClD,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;YACxB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB;IAChC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IAExD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;YAChD,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;QAElF,OAAO,CAAC,GAAG,CAAC,oCAAoC,aAAa,KAAK,CAAC,CAAA;QACnE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAA;QAEhD,OAAO,KAAK,CAAA;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAA;QAC7D,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAElC,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;OAoBX,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,kBAAkB,EAAE,CAAA;YACpB,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,MAAM,qBAAqB,EAAE,CAAA;YAC7B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACxB,OAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QAE5D,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAA;YACxD,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;YAC9C,MAAM,gBAAgB,EAAE,CAAA;QAC1B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAE1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAA;AACR,CAAC","sourcesContent":["#!/usr/bin/env ts-node\n\nimport { createConnection } from 'typeorm'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\ninterface GradeEntry {\n name: string\n minValue: number\n maxValue: number\n score?: number\n color?: string\n description?: string\n}\n\ninterface Grade2DLookup {\n type: 'PROGRESS_DEVIATION_LOOKUP' | 'PROGRESS_DEVIATION_LOOKUP'\n description?: string\n rows: Array<{\n progressRate: number\n boundary5to4: number\n boundary4to3: number\n boundary3to2: number\n boundary2to1: number\n }>\n}\n\ninterface GradeData {\n kpiName: string\n version: number\n description: string\n grades: GradeEntry[] | Grade2DLookup\n}\n\n/** X31/X32 λΉ„ν™œμ„±ν™” λŒ€μƒ KPI 이름 */\nconst DEACTIVATE_KPI_NAMES = ['X31. ν’ˆμ§ˆμ‹œν—˜ λΆˆν•©κ²©λ₯ ', 'X32. κ²€μˆ˜μžμž¬ λΆˆν•©κ²©λ₯ ']\n\nfunction isGrade2DLookup(grades: any): grades is Grade2DLookup {\n return grades && typeof grades === 'object' && !Array.isArray(grades) && (grades.type === 'PROGRESS_DEVIATION_LOOKUP' || grades.type === 'PROGRESS_DEVIATION_LOOKUP')\n}\n\nfunction normalize2DGrades(grades: Grade2DLookup): Grade2DLookup {\n return { ...grades, type: 'PROGRESS_DEVIATION_LOOKUP' }\n}\n\nfunction getGradeCount(grades: GradeEntry[] | Grade2DLookup): number {\n if (isGrade2DLookup(grades)) {\n return grades.rows.length\n }\n return Array.isArray(grades) ? grades.length : 0\n}\n\n/**\n * Load KPI grade data from JSON files - Migration Style\n * This can be called directly from migrations or other server-side scripts\n */\nexport async function loadKpiGradeData(specificFile?: string): Promise<void> {\n const gradeDataPath = path.join(__dirname, 'grade-data')\n \n // Set NODE_ENV if not set\n if (!process.env.NODE_ENV) {\n process.env.NODE_ENV = 'development'\n }\n\n // Initialize Things-Factory environment\n const { config } = require('@things-factory/env')\n const ormconfig = require('@things-factory/shell/dist-server/initializers/ormconfig.js')\n const connectionConfig = config.get('ormconfig')\n\n let connection\n\n console.log('πŸš€ Loading KPI Grade Data...')\n console.log(`πŸ“ Source directory: ${gradeDataPath}`)\n\n try {\n // Create database connection using Things-Factory pattern\n console.log('πŸ”Œ Connecting to database...')\n connection = await createConnection({\n ...ormconfig,\n ...connectionConfig,\n logging: false\n })\n\n // Register the connection with Things-Factory shell\n const { addDataSource } = require('@things-factory/shell')\n addDataSource('default', connection)\n\n console.log('βœ… Database connected')\n\n // Check if grade-data directory exists\n if (!fs.existsSync(gradeDataPath)) {\n console.error(`❌ Grade data directory not found: ${gradeDataPath}`)\n throw new Error('Grade data directory not found')\n }\n\n // Get files to process\n let files: string[]\n if (specificFile) {\n if (!fs.existsSync(path.join(gradeDataPath, specificFile))) {\n throw new Error(`File not found: ${specificFile}`)\n }\n files = [specificFile]\n console.log(`πŸ“„ Processing single file: ${specificFile}`)\n } else {\n files = fs.readdirSync(gradeDataPath).filter(file => file.endsWith('.json'))\n console.log(`πŸ“ Found ${files.length} grade data files`)\n }\n\n if (files.length === 0) {\n console.log('⚠️ No JSON files found to process')\n return\n }\n\n let successCount = 0\n let errorCount = 0\n\n // Now we can use getRepository with the registered connection\n const { getRepository } = require('@things-factory/shell')\n const { Kpi } = require('@things-factory/kpi')\n const kpiRepository = getRepository(Kpi)\n\n for (const file of files) {\n try {\n console.log(`\\nπŸ“„ Processing: ${file}`)\n \n const filePath = path.join(gradeDataPath, file)\n const fileContent = fs.readFileSync(filePath, 'utf8')\n const gradeData: GradeData = JSON.parse(fileContent)\n\n // Validate grade data structure (1D array or 2D lookup object)\n if (!gradeData.kpiName || !gradeData.grades) {\n console.log(` ❌ Invalid structure - missing kpiName or grades`)\n errorCount++\n continue\n }\n\n const is2D = isGrade2DLookup(gradeData.grades)\n if (!is2D && !Array.isArray(gradeData.grades)) {\n console.log(` ❌ Invalid grades format - expected array or 2d-lookup object`)\n errorCount++\n continue\n }\n\n const gradeCount = getGradeCount(gradeData.grades)\n console.log(` πŸ” KPI Name: ${gradeData.kpiName}`)\n console.log(` πŸ“Š Grades: ${gradeCount} entries${is2D ? ' (2D lookup)' : ''}`)\n\n // Find KPI by name in SYSTEM domain\n const kpi = await kpiRepository.findOne({\n where: { name: gradeData.kpiName, domain: { name: 'SYSTEM' } },\n relations: ['domain']\n })\n\n if (kpi) {\n // Update grades data (normalize 2D type string to 'PROGRESS_DEVIATION_LOOKUP')\n const originalGradesCount = kpi.grades ? getGradeCount(kpi.grades) : 0\n if (is2D) {\n kpi.grades = normalize2DGrades(gradeData.grades as Grade2DLookup) as any\n kpi.scoreType = 'CUSTOM'\n } else {\n kpi.grades = gradeData.grades as any\n kpi.scoreType = 'LOOKUP'\n }\n await kpiRepository.save(kpi)\n\n console.log(` βœ… Updated successfully (scoreType: ${kpi.scoreType})`)\n console.log(` πŸ“ˆ Grades: ${originalGradesCount} β†’ ${gradeCount}`)\n successCount++\n } else {\n console.log(` ⚠️ KPI not found in SYSTEM domain: ${gradeData.kpiName}`)\n errorCount++\n }\n \n } catch (fileError) {\n console.log(` ❌ File processing error: ${fileError.message}`)\n errorCount++\n }\n }\n\n console.log(`\\nπŸŽ‰ KPI Grade Data Loading Complete!`)\n console.log(` πŸ“Š Total files: ${files.length}`)\n console.log(` βœ… Successful: ${successCount}`)\n console.log(` ❌ Errors: ${errorCount}`)\n\n if (errorCount > 0) {\n console.log(`\\n⚠️ Some files had errors. Check the logs above for details.`)\n }\n\n } catch (error) {\n console.error(`❌ Fatal error during grade data loading:`, error)\n throw error\n } finally {\n if (connection) {\n await connection.close()\n console.log('πŸ”Œ Database connection closed')\n }\n }\n}\n\n/**\n * X31/X32 KPIλ₯Ό λΉ„ν™œμ„±ν™” (active = false, grades = null)\n */\nexport async function deactivateDeletedKpis(): Promise<void> {\n if (!process.env.NODE_ENV) {\n process.env.NODE_ENV = 'development'\n }\n\n const { config } = require('@things-factory/env')\n const ormconfig = require('@things-factory/shell/dist-server/initializers/ormconfig.js')\n const connectionConfig = config.get('ormconfig')\n\n let connection\n\n console.log('🚫 Deactivating deleted KPIs (X31, X32)...')\n\n try {\n console.log('πŸ”Œ Connecting to database...')\n connection = await createConnection({\n ...ormconfig,\n ...connectionConfig,\n logging: false\n })\n\n const { addDataSource } = require('@things-factory/shell')\n addDataSource('default', connection)\n\n const { getRepository } = require('@things-factory/shell')\n const { Kpi } = require('@things-factory/kpi')\n const kpiRepository = getRepository(Kpi)\n\n for (const kpiName of DEACTIVATE_KPI_NAMES) {\n const kpi = await kpiRepository.findOne({\n where: { name: kpiName, domain: { name: 'SYSTEM' } },\n relations: ['domain']\n })\n\n if (kpi) {\n kpi.active = false\n kpi.grades = null\n await kpiRepository.save(kpi)\n console.log(` βœ… Deactivated: ${kpiName}`)\n } else {\n console.log(` ⚠️ KPI not found: ${kpiName}`)\n }\n }\n\n console.log('\\nπŸŽ‰ Deactivation complete!')\n } catch (error) {\n console.error('❌ Error deactivating KPIs:', error)\n throw error\n } finally {\n if (connection) {\n await connection.close()\n console.log('πŸ”Œ Database connection closed')\n }\n }\n}\n\n/**\n * List available grade data files\n */\nexport function listGradeDataFiles(): string[] {\n const gradeDataPath = path.join(__dirname, 'grade-data')\n \n try {\n if (!fs.existsSync(gradeDataPath)) {\n console.log('πŸ“ Grade data directory not found')\n return []\n }\n \n const files = fs.readdirSync(gradeDataPath).filter(file => file.endsWith('.json'))\n \n console.log(`πŸ“ Available grade data files in ${gradeDataPath}:\\n`)\n files.forEach((file, index) => {\n console.log(` ${(index + 1).toString().padStart(2)}: ${file}`)\n })\n console.log(`\\nπŸ“ˆ Total: ${files.length} files`)\n \n return files\n } catch (error) {\n console.error('❌ Error reading grade data directory:', error)\n return []\n }\n}\n\n/**\n * CLI execution when called directly\n */\nasync function main() {\n const args = process.argv.slice(2)\n\n try {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(`\n🎯 KPI Grade Data Loader (Migration Style)\n\nUsage:\n ts-node server/scripts/load-grade-data-migration.ts [options] [fileName]\n\nOptions:\n --list, -l List available grade data files\n --deactivate Deactivate X31/X32 KPIs (set active=false, grades=null)\n --help, -h Show this help\n\nExamples:\n ts-node server/scripts/load-grade-data-migration.ts # Load all files\n ts-node server/scripts/load-grade-data-migration.ts x11-performance-table.json # Load specific file\n ts-node server/scripts/load-grade-data-migration.ts --list # List files\n ts-node server/scripts/load-grade-data-migration.ts --deactivate # Deactivate X31/X32\n\nNote: This script connects to the database using the current Things-Factory configuration.\n Make sure the application is properly configured before running.\n Supports both 1D array grades and 2D lookup grades (X13).\n `)\n return\n }\n\n if (args.includes('--list') || args.includes('-l')) {\n listGradeDataFiles()\n return\n }\n\n if (args.includes('--deactivate')) {\n await deactivateDeletedKpis()\n console.log('\\n✨ Done!')\n return\n }\n\n const specificFile = args.find(arg => !arg.startsWith('--'))\n \n if (specificFile) {\n console.log(`🎯 Loading specific file: ${specificFile}`)\n await loadKpiGradeData(specificFile)\n } else {\n console.log(`🎯 Loading all grade data files`)\n await loadKpiGradeData()\n }\n\n console.log('\\n✨ Done!')\n \n } catch (error) {\n console.error('\\n❌ Script failed:', error.message)\n process.exit(1)\n }\n}\n\n// Run if called directly\nif (require.main === module) {\n main()\n}"]}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ts-node
2
+ /**
3
+ * Batch process multiple organizations with single initialization (optimized for performance)
4
+ */
5
+ export declare function propagateParentKpiValuesBatch(orgScopes: string[], specificKpiName?: string, forceRecalculate?: boolean, targetDate?: string, version?: number): Promise<void>;
6
+ /**
7
+ * Propagate parent KPI values based on child KPI scores and weights
8
+ * Processes hierarchy from leaf to root, calculating weighted averages
9
+ */
10
+ export declare function propagateParentKpiValues(specificKpiName?: string, forceRecalculate?: boolean, targetDate?: string, orgScope?: string, version?: number): Promise<void>;
11
+ /**
12
+ * List parent KPIs and their hierarchy
13
+ */
14
+ export declare function listParentKpiHierarchy(): Promise<void>;