@dssp/dkpi 1.0.0-y.0 → 1.0.0

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 (139) hide show
  1. package/KPI-STATISTICS-SERVICE.md +233 -0
  2. package/_index.html +4 -9
  3. package/assets/helps/index.md +1 -1
  4. package/assets/images/project-image.png +0 -0
  5. package/assets/manifest.json +2 -2
  6. package/config/config.development.js +2 -1
  7. package/config/config.production.js +2 -1
  8. package/kpi-module-service-tests.md +1286 -0
  9. package/kpi-module-test-report.md +676 -0
  10. package/kpi-module-unit-test-detailed-report.md +925 -0
  11. package/kpi-module-unit-tests-detailed.md +1452 -0
  12. package/openapi/unstable.yaml +2 -2
  13. package/package.json +58 -54
  14. package/recalculate-batch.sh +64 -0
  15. package/recalculate-projects-range.sh +98 -0
  16. package/schema.graphql +1159 -55
  17. package/things-factory.config.js +6 -1
  18. package/translations/en.json +5 -1
  19. package/translations/ko.json +5 -1
  20. package/views/auth-page.html +4 -5
  21. package/views/public/home.html +5 -6
  22. package/dist-client/bootstrap.d.ts +0 -8
  23. package/dist-client/bootstrap.js +0 -257
  24. package/dist-client/bootstrap.js.map +0 -1
  25. package/dist-client/components/kpi-single-boxplot-chart.d.ts +0 -24
  26. package/dist-client/components/kpi-single-boxplot-chart.js +0 -317
  27. package/dist-client/components/kpi-single-boxplot-chart.js.map +0 -1
  28. package/dist-client/components/sv-pagenation-control.d.ts +0 -18
  29. package/dist-client/components/sv-pagenation-control.js +0 -142
  30. package/dist-client/components/sv-pagenation-control.js.map +0 -1
  31. package/dist-client/entries/public/home.d.ts +0 -8
  32. package/dist-client/entries/public/home.js +0 -97
  33. package/dist-client/entries/public/home.js.map +0 -1
  34. package/dist-client/icons/menu-icons.d.ts +0 -11
  35. package/dist-client/icons/menu-icons.js +0 -126
  36. package/dist-client/icons/menu-icons.js.map +0 -1
  37. package/dist-client/index.d.ts +0 -0
  38. package/dist-client/index.js +0 -2
  39. package/dist-client/index.js.map +0 -1
  40. package/dist-client/menu.d.ts +0 -23
  41. package/dist-client/menu.js +0 -59
  42. package/dist-client/menu.js.map +0 -1
  43. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +0 -58
  44. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +0 -731
  45. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +0 -1
  46. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.d.ts +0 -23
  47. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +0 -76
  48. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +0 -1
  49. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +0 -69
  50. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +0 -385
  51. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +0 -1
  52. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +0 -12
  53. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +0 -174
  54. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +0 -1
  55. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +0 -41
  56. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +0 -191
  57. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +0 -1
  58. package/dist-client/pages/kpi-value/kpi-value-importer.d.ts +0 -23
  59. package/dist-client/pages/kpi-value/kpi-value-importer.js +0 -93
  60. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +0 -1
  61. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +0 -72
  62. package/dist-client/pages/kpi-value/kpi-value-list-page.js +0 -465
  63. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +0 -1
  64. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.d.ts +0 -13
  65. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +0 -248
  66. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +0 -1
  67. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.d.ts +0 -10
  68. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js +0 -229
  69. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js.map +0 -1
  70. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.d.ts +0 -12
  71. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js +0 -213
  72. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js.map +0 -1
  73. package/dist-client/pages/sv-project-complete.d.ts +0 -22
  74. package/dist-client/pages/sv-project-complete.js +0 -213
  75. package/dist-client/pages/sv-project-complete.js.map +0 -1
  76. package/dist-client/pages/sv-project-completed-list.d.ts +0 -24
  77. package/dist-client/pages/sv-project-completed-list.js +0 -357
  78. package/dist-client/pages/sv-project-completed-list.js.map +0 -1
  79. package/dist-client/pages/sv-project-detail.d.ts +0 -13
  80. package/dist-client/pages/sv-project-detail.js +0 -494
  81. package/dist-client/pages/sv-project-detail.js.map +0 -1
  82. package/dist-client/pages/sv-project-list.d.ts +0 -157
  83. package/dist-client/pages/sv-project-list.js +0 -431
  84. package/dist-client/pages/sv-project-list.js.map +0 -1
  85. package/dist-client/pages/sv-user-management.d.ts +0 -5
  86. package/dist-client/pages/sv-user-management.js +0 -219
  87. package/dist-client/pages/sv-user-management.js.map +0 -1
  88. package/dist-client/route.d.ts +0 -1
  89. package/dist-client/route.js +0 -31
  90. package/dist-client/route.js.map +0 -1
  91. package/dist-client/shared/complete-api.d.ts +0 -5
  92. package/dist-client/shared/complete-api.js +0 -125
  93. package/dist-client/shared/complete-api.js.map +0 -1
  94. package/dist-client/shared/func.d.ts +0 -2
  95. package/dist-client/shared/func.js +0 -22
  96. package/dist-client/shared/func.js.map +0 -1
  97. package/dist-client/themes/dark.css +0 -51
  98. package/dist-client/themes/light.css +0 -51
  99. package/dist-client/tsconfig.tsbuildinfo +0 -1
  100. package/dist-client/viewparts/menu-tools.d.ts +0 -54
  101. package/dist-client/viewparts/menu-tools.js +0 -503
  102. package/dist-client/viewparts/menu-tools.js.map +0 -1
  103. package/dist-client/viewparts/user-circle.d.ts +0 -5
  104. package/dist-client/viewparts/user-circle.js +0 -26
  105. package/dist-client/viewparts/user-circle.js.map +0 -1
  106. package/dist-server/index.d.ts +0 -2
  107. package/dist-server/index.js +0 -6
  108. package/dist-server/index.js.map +0 -1
  109. package/dist-server/migrations/index.d.ts +0 -1
  110. package/dist-server/migrations/index.js +0 -12
  111. package/dist-server/migrations/index.js.map +0 -1
  112. package/dist-server/scripts/calculate-kpi-scores.d.ts +0 -10
  113. package/dist-server/scripts/calculate-kpi-scores.js +0 -271
  114. package/dist-server/scripts/calculate-kpi-scores.js.map +0 -1
  115. package/dist-server/scripts/load-grade-data-migration.d.ts +0 -10
  116. package/dist-server/scripts/load-grade-data-migration.js +0 -194
  117. package/dist-server/scripts/load-grade-data-migration.js.map +0 -1
  118. package/dist-server/scripts/propagate-parent-kpi-values.d.ts +0 -10
  119. package/dist-server/scripts/propagate-parent-kpi-values.js +0 -440
  120. package/dist-server/scripts/propagate-parent-kpi-values.js.map +0 -1
  121. package/dist-server/service/index.d.ts +0 -6
  122. package/dist-server/service/index.js +0 -21
  123. package/dist-server/service/index.js.map +0 -1
  124. package/dist-server/service/kpi-metric-value/index.d.ts +0 -4
  125. package/dist-server/service/kpi-metric-value/index.js +0 -8
  126. package/dist-server/service/kpi-metric-value/index.js.map +0 -1
  127. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +0 -7
  128. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +0 -112
  129. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +0 -1
  130. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +0 -7
  131. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +0 -47
  132. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +0 -1
  133. package/dist-server/service/kpi-value/index.d.ts +0 -3
  134. package/dist-server/service/kpi-value/index.js +0 -7
  135. package/dist-server/service/kpi-value/index.js.map +0 -1
  136. package/dist-server/service/kpi-value/kpi-value-query.d.ts +0 -7
  137. package/dist-server/service/kpi-value/kpi-value-query.js +0 -47
  138. package/dist-server/service/kpi-value/kpi-value-query.js.map +0 -1
  139. package/dist-server/tsconfig.tsbuildinfo +0 -1
@@ -2,9 +2,9 @@ openapi: 3.0.0
2
2
  info:
3
3
  description: >
4
4
  For the latest release information please check our [release notes](https://developer.dssp.com/release_notes).
5
- The Digital Digital KPI Platform API exposes integrations endpoint and related functions.
5
+ The Digital Digital platform-based KPI Navigator API exposes integrations endpoint and related functions.
6
6
  version: 'unstable'
7
- title: 'Digital Digital KPI Platform'
7
+ title: 'Digital Digital platform-based KPI Navigator'
8
8
  termsOfService: 'https://dssp.com/terms/'
9
9
  contact:
10
10
  email: 'heartyoh@hatiolab.com'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dssp/dkpi",
3
- "version": "1.0.0-y.0",
3
+ "version": "1.0.0",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "scripts": {
19
19
  "serve": "things-factory dkpi",
20
- "serve:dev": "npm run build:server && concurrently -k -r \"npm run build:client:watch\" \"things-factory-dev dkpi\"",
20
+ "serve:dev": "npm run build:server && concurrently -k -r \"npm run build:client:watch\" \"things-factory-dev dkpi --webpack ../../webpack.config.dev.js\"",
21
21
  "copy:files": "copyfiles -e \"./client/**/*.{ts,js,json}\" -u 1 \"./client/**/*\" dist-client",
22
22
  "build": "npm run build:server && npm run build:client",
23
23
  "build:client": "npm run clean:client && npm run copy:files && tsc --p ./client/tsconfig.json",
@@ -48,60 +48,64 @@
48
48
  "docker:push": "docker image push hatiolab/dkpi:latest && docker image push hatiolab/dkpi:$npm_package_version"
49
49
  },
50
50
  "dependencies": {
51
- "@dssp/project": "^1.0.0-y.0",
52
- "@material/web": "^2.1.0",
53
- "@operato/chart": "^9.0.0",
54
- "@operato/gantt": "^9.0.0",
55
- "@operato/scene-auth": "^9.0.0",
56
- "@operato/scene-chartjs": "^9.0.0",
57
- "@operato/scene-clock": "^9.0.0",
58
- "@operato/scene-data-transform": "^9.0.0",
59
- "@operato/scene-form": "^9.0.0",
60
- "@operato/scene-gauge": "^9.0.0",
61
- "@operato/scene-grist": "^9.0.0",
62
- "@operato/scene-half-roundrect": "^9.0.0",
63
- "@operato/scene-image-slider": "^9.0.0",
64
- "@operato/scene-integration": "^9.0.0",
65
- "@operato/scene-legend": "^9.0.0",
66
- "@operato/scene-news-ticker": "^9.0.0",
67
- "@operato/scene-progressbar": "^9.0.0",
68
- "@operato/scene-random": "^9.0.0",
69
- "@operato/scene-switch": "^9.0.0",
70
- "@operato/scene-tab": "^9.0.0",
71
- "@operato/scene-table": "^9.0.0",
72
- "@operato/scene-timer": "^9.0.0",
73
- "@things-factory/api": "^9.0.0",
74
- "@things-factory/apptool-base": "^9.0.0",
75
- "@things-factory/apptool-ui": "^9.0.0",
76
- "@things-factory/auth-base": "^9.0.0",
77
- "@things-factory/auth-ui": "^9.0.0",
78
- "@things-factory/board-service": "^9.0.0",
79
- "@things-factory/board-ui": "^9.0.0",
80
- "@things-factory/code-ui": "^9.0.0",
81
- "@things-factory/context-ui": "^9.0.0",
82
- "@things-factory/dashboard": "^9.0.0",
83
- "@things-factory/dataset": "^9.0.0",
84
- "@things-factory/evaluation": "^9.0.0",
85
- "@things-factory/export-ui": "^9.0.0",
86
- "@things-factory/help": "^9.0.0",
87
- "@things-factory/i18n-base": "^9.0.0",
88
- "@things-factory/integration-base": "^9.0.0",
89
- "@things-factory/integration-ui": "^9.0.0",
90
- "@things-factory/kpi": "^9.0.0",
91
- "@things-factory/lite-menu": "^9.0.0",
92
- "@things-factory/more-base": "^9.0.0",
93
- "@things-factory/more-ui": "^9.0.0",
94
- "@things-factory/notification": "^9.0.0",
95
- "@things-factory/resource-ui": "^9.0.0",
96
- "@things-factory/setting-base": "^9.0.0",
97
- "@things-factory/setting-ui": "^9.0.0",
98
- "@things-factory/shell": "^9.0.0",
99
- "@things-factory/system": "^9.0.0",
51
+ "@dssp/integration-allbaro": "^1.0.0",
52
+ "@dssp/integration-kiscon": "^1.0.0",
53
+ "@dssp/project": "^1.0.0",
54
+ "@material/web": "^2.4.0",
55
+ "@operato/chart": "^10.0.0",
56
+ "@operato/gantt": "^10.0.0",
57
+ "@operato/scene-auth": "^10.0.0",
58
+ "@operato/scene-chartjs": "^10.0.0",
59
+ "@operato/scene-clock": "^10.0.0",
60
+ "@operato/scene-data-transform": "^10.0.0",
61
+ "@operato/scene-form": "^10.0.0",
62
+ "@operato/scene-gauge": "^10.0.0",
63
+ "@operato/scene-grist": "^10.0.0",
64
+ "@operato/scene-half-roundrect": "^10.0.0",
65
+ "@operato/scene-image-slider": "^10.0.0",
66
+ "@operato/scene-integration": "^10.0.0",
67
+ "@operato/scene-legend": "^10.0.0",
68
+ "@operato/scene-news-ticker": "^10.0.0",
69
+ "@operato/scene-progressbar": "^10.0.0",
70
+ "@operato/scene-random": "^10.0.0",
71
+ "@operato/scene-switch": "^10.0.0",
72
+ "@operato/scene-tab": "^10.0.0",
73
+ "@operato/scene-table": "^10.0.0",
74
+ "@operato/scene-timer": "^10.0.0",
75
+ "@things-factory/api": "^10.0.0",
76
+ "@things-factory/apptool-base": "^10.0.0",
77
+ "@things-factory/apptool-ui": "^10.0.0",
78
+ "@things-factory/auth-base": "^10.0.0",
79
+ "@things-factory/auth-ui": "^10.0.0",
80
+ "@things-factory/board-service": "^10.0.0",
81
+ "@things-factory/board-ui": "^10.0.0",
82
+ "@things-factory/code-ui": "^10.0.0",
83
+ "@things-factory/context-ui": "^10.0.0",
84
+ "@things-factory/dashboard": "^10.0.0",
85
+ "@things-factory/dataset": "^10.0.0",
86
+ "@things-factory/evaluation": "^10.0.0",
87
+ "@things-factory/export-ui": "^10.0.0",
88
+ "@things-factory/help": "^10.0.0",
89
+ "@things-factory/i18n-base": "^10.0.0",
90
+ "@things-factory/integration-base": "^10.0.0",
91
+ "@things-factory/integration-data-go-kr": "^10.0.0",
92
+ "@things-factory/integration-juso": "^10.0.0",
93
+ "@things-factory/integration-ui": "^10.0.0",
94
+ "@things-factory/kpi": "^10.0.0",
95
+ "@things-factory/lite-menu": "^10.0.0",
96
+ "@things-factory/more-base": "^10.0.0",
97
+ "@things-factory/more-ui": "^10.0.0",
98
+ "@things-factory/notification": "^10.0.0",
99
+ "@things-factory/resource-ui": "^10.0.0",
100
+ "@things-factory/setting-base": "^10.0.0",
101
+ "@things-factory/setting-ui": "^10.0.0",
102
+ "@things-factory/shell": "^10.0.0",
103
+ "@things-factory/system": "^10.0.0",
100
104
  "moment": "2.30.1",
101
- "puppeteer": "^24.5.0"
105
+ "puppeteer": "^24.39.0"
102
106
  },
103
107
  "devDependencies": {
104
- "@things-factory/builder": "^9.0.0"
108
+ "@things-factory/builder": "^10.0.0"
105
109
  },
106
- "gitHead": "aa4bb0d9c7adfe576f7962713e7dfb83a1c98d21"
110
+ "gitHead": "a41eaae7a2e1651af65e8f285e95073b921b9c91"
107
111
  }
@@ -0,0 +1,64 @@
1
+ #!/bin/bash
2
+
3
+ # Recalculate KPI values for projects in a specified range (optimized batch mode)
4
+ # Usage: ./recalculate-batch.sh <from> <to>
5
+ # Example: ./recalculate-batch.sh 1 100
6
+
7
+ if [ "$#" -ne 2 ]; then
8
+ echo "Usage: $0 <from> <to>"
9
+ echo "Example: $0 1 100"
10
+ exit 1
11
+ fi
12
+
13
+ FROM=$1
14
+ TO=$2
15
+
16
+ if ! [[ "$FROM" =~ ^[0-9]+$ ]] || ! [[ "$TO" =~ ^[0-9]+$ ]]; then
17
+ echo "Error: Both FROM and TO must be numbers"
18
+ exit 1
19
+ fi
20
+
21
+ if [ "$FROM" -gt "$TO" ]; then
22
+ echo "Error: FROM ($FROM) must be less than or equal to TO ($TO)"
23
+ exit 1
24
+ fi
25
+
26
+ echo "========================================="
27
+ echo "KPI Batch Recalculation Script"
28
+ echo "========================================="
29
+ echo "Range: 프로젝트 - $(printf '%05d' $FROM) to 프로젝트 - $(printf '%05d' $TO)"
30
+ echo ""
31
+
32
+ # Build SQL to get project IDs
33
+ SQL="SELECT id FROM projects WHERE name ~ '프로젝트.*[0-9]{5}\$' AND "
34
+ SQL+="CAST(SUBSTRING(name FROM '[0-9]{5}\$') AS INTEGER) BETWEEN $FROM AND $TO "
35
+ SQL+="ORDER BY CAST(SUBSTRING(name FROM '[0-9]{5}\$') AS INTEGER);"
36
+
37
+ # Get project IDs from database
38
+ echo "Fetching project IDs from database..."
39
+ PROJECT_IDS=$(PGPASSWORD='hatioLAB1008' psql -h 127.0.0.1 -U postgres -d dssp -t -c "$SQL" | tr -d ' ' | tr '\n' ',')
40
+
41
+ if [ -z "$PROJECT_IDS" ]; then
42
+ echo "No projects found in the specified range"
43
+ exit 1
44
+ fi
45
+
46
+ # Remove trailing comma
47
+ PROJECT_IDS=${PROJECT_IDS%,}
48
+
49
+ # Count projects
50
+ PROJECT_COUNT=$(echo "$PROJECT_IDS" | tr ',' '\n' | wc -l | tr -d ' ')
51
+
52
+ echo "Found $PROJECT_COUNT projects"
53
+ echo "========================================="
54
+ echo ""
55
+ echo "Starting batch processing with single initialization..."
56
+ echo ""
57
+
58
+ # Run the batch recalculation with --orgs option
59
+ npm run propagate-parent-kpi-values -- --orgs "$PROJECT_IDS"
60
+
61
+ echo ""
62
+ echo "========================================="
63
+ echo "Batch Recalculation Complete!"
64
+ echo "========================================="
@@ -0,0 +1,98 @@
1
+ #!/bin/bash
2
+
3
+ # Recalculate KPI values for projects in a specified range
4
+ # Usage: ./recalculate-projects-range.sh <from> <to>
5
+ # Example: ./recalculate-projects-range.sh 1 100
6
+
7
+ if [ "$#" -ne 2 ]; then
8
+ echo "Usage: $0 <from> <to>"
9
+ echo "Example: $0 1 100"
10
+ exit 1
11
+ fi
12
+
13
+ FROM=$1
14
+ TO=$2
15
+
16
+ if ! [[ "$FROM" =~ ^[0-9]+$ ]] || ! [[ "$TO" =~ ^[0-9]+$ ]]; then
17
+ echo "Error: Both FROM and TO must be numbers"
18
+ exit 1
19
+ fi
20
+
21
+ if [ "$FROM" -gt "$TO" ]; then
22
+ echo "Error: FROM ($FROM) must be less than or equal to TO ($TO)"
23
+ exit 1
24
+ fi
25
+
26
+ echo "========================================="
27
+ echo "KPI Recalculation Script"
28
+ echo "========================================="
29
+ echo "Range: 프로젝트 - $(printf '%05d' $FROM) to 프로젝트 - $(printf '%05d' $TO)"
30
+ echo ""
31
+
32
+ # Build SQL to get project IDs
33
+ SQL="SELECT id FROM projects WHERE name ~ '프로젝트.*[0-9]{5}\$' AND "
34
+ SQL+="CAST(SUBSTRING(name FROM '[0-9]{5}\$') AS INTEGER) BETWEEN $FROM AND $TO "
35
+ SQL+="ORDER BY CAST(SUBSTRING(name FROM '[0-9]{5}\$') AS INTEGER);"
36
+
37
+ # Get project IDs from database
38
+ echo "Fetching project IDs from database..."
39
+ PROJECT_IDS=$(PGPASSWORD='hatioLAB1008' psql -h 127.0.0.1 -U postgres -d dssp -t -c "$SQL" | tr -d ' ')
40
+
41
+ if [ -z "$PROJECT_IDS" ]; then
42
+ echo "No projects found in the specified range"
43
+ exit 1
44
+ fi
45
+
46
+ # Convert to array
47
+ IFS=$'\n' read -rd '' -a PROJECT_ARRAY <<<"$PROJECT_IDS"
48
+ TOTAL=${#PROJECT_ARRAY[@]}
49
+
50
+ echo "Found $TOTAL projects"
51
+ echo "========================================="
52
+ echo ""
53
+
54
+ SUCCESS=0
55
+ FAILED=0
56
+ COUNTER=0
57
+
58
+ # Process each project
59
+ for PROJECT_ID in "${PROJECT_ARRAY[@]}"; do
60
+ # Skip empty lines
61
+ if [ -z "$PROJECT_ID" ]; then
62
+ continue
63
+ fi
64
+
65
+ COUNTER=$((COUNTER + 1))
66
+
67
+ # Get project name for logging
68
+ PROJECT_NAME=$(PGPASSWORD='hatioLAB1008' psql -h 127.0.0.1 -U postgres -d dssp -t -c "SELECT name FROM projects WHERE id = '$PROJECT_ID';" | tr -d ' ')
69
+
70
+ echo "[$COUNTER/$TOTAL] Processing: $PROJECT_NAME"
71
+ echo " ID: $PROJECT_ID"
72
+
73
+ # Run the recalculation script
74
+ if npm run propagate-parent-kpi-values -- --org "$PROJECT_ID" > "/tmp/kpi-recalc-$PROJECT_ID.log" 2>&1; then
75
+ SUCCESS=$((SUCCESS + 1))
76
+ echo " ✅ SUCCESS"
77
+ # Clean up log file on success
78
+ rm -f "/tmp/kpi-recalc-$PROJECT_ID.log"
79
+ else
80
+ FAILED=$((FAILED + 1))
81
+ echo " ❌ FAILED - Check log: /tmp/kpi-recalc-$PROJECT_ID.log"
82
+ fi
83
+ echo ""
84
+ done
85
+
86
+ echo ""
87
+ echo "========================================="
88
+ echo "Recalculation Complete!"
89
+ echo "========================================="
90
+ echo "Total: $TOTAL"
91
+ echo "Success: $SUCCESS"
92
+ echo "Failed: $FAILED"
93
+ echo "========================================="
94
+
95
+ if [ $FAILED -gt 0 ]; then
96
+ echo ""
97
+ echo "Failed project logs are available in /tmp/kpi-recalc-*.log"
98
+ fi