@dssp/dkpi 1.0.0-alpha.8 โ 1.0.0-alpha.81
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.
- package/KPI-STATISTICS-SERVICE.md +233 -0
- package/_index.html +0 -5
- package/assets/favicon.ico +0 -0
- package/assets/images/project-image.png +0 -0
- package/assets/manifest/apple-1024.png +0 -0
- package/assets/manifest/apple-120.png +0 -0
- package/assets/manifest/apple-152.png +0 -0
- package/assets/manifest/apple-167.png +0 -0
- package/assets/manifest/apple-180.png +0 -0
- package/assets/manifest/apple-touch-icon.png +0 -0
- package/assets/manifest/badge-128x128.png +0 -0
- package/assets/manifest/chrome-splashscreen-icon-384x384.png +0 -0
- package/assets/manifest/chrome-touch-icon-192x192.png +0 -0
- package/assets/manifest/icon-128x128.png +0 -0
- package/assets/manifest/icon-192x192.png +0 -0
- package/assets/manifest/icon-512x512.png +0 -0
- package/assets/manifest/icon-72x72.png +0 -0
- package/assets/manifest/icon-96x96.png +0 -0
- package/assets/manifest/image-metaog.png +0 -0
- package/assets/manifest/maskable_icon.png +0 -0
- package/assets/manifest/ms-icon-144x144.png +0 -0
- package/assets/manifest/ms-touch-icon-144x144-precomposed.png +0 -0
- package/assets/videos/intro.mp4 +0 -0
- package/config/config.development.js +2 -1
- package/config/config.production.js +2 -1
- package/dist-client/bootstrap.d.ts +1 -0
- package/dist-client/bootstrap.js +75 -4
- package/dist-client/bootstrap.js.map +1 -1
- package/dist-client/components/kpi-2d-lookup-chart.d.ts +43 -0
- package/dist-client/components/kpi-2d-lookup-chart.js +253 -0
- package/dist-client/components/kpi-2d-lookup-chart.js.map +1 -0
- package/dist-client/components/kpi-boxplot-chart.d.ts +24 -0
- package/dist-client/components/kpi-boxplot-chart.js +291 -0
- package/dist-client/components/kpi-boxplot-chart.js.map +1 -0
- package/dist-client/components/kpi-lookup-chart.d.ts +53 -0
- package/dist-client/components/kpi-lookup-chart.js +430 -0
- package/dist-client/components/kpi-lookup-chart.js.map +1 -0
- package/dist-client/components/kpi-mini-trend-chart.d.ts +14 -0
- package/dist-client/components/kpi-mini-trend-chart.js +148 -0
- package/dist-client/components/kpi-mini-trend-chart.js.map +1 -0
- package/dist-client/components/kpi-radar-chart.d.ts +17 -0
- package/dist-client/components/kpi-radar-chart.js +259 -0
- package/dist-client/components/kpi-radar-chart.js.map +1 -0
- package/dist-client/components/kpi-single-boxplot-chart.d.ts +25 -0
- package/dist-client/components/kpi-single-boxplot-chart.js +398 -0
- package/dist-client/components/kpi-single-boxplot-chart.js.map +1 -0
- package/dist-client/components/kpi-trend-chart.d.ts +25 -0
- package/dist-client/components/kpi-trend-chart.js +220 -0
- package/dist-client/components/kpi-trend-chart.js.map +1 -0
- package/dist-client/components/sv-pagenation-control.d.ts +18 -0
- package/dist-client/components/sv-pagenation-control.js +142 -0
- package/dist-client/components/sv-pagenation-control.js.map +1 -0
- package/dist-client/entries/auth/checkin.d.ts +38 -0
- package/dist-client/entries/auth/checkin.js +546 -0
- package/dist-client/entries/auth/checkin.js.map +1 -0
- package/dist-client/google-map/common-google-map.d.ts +35 -0
- package/dist-client/google-map/common-google-map.js +345 -0
- package/dist-client/google-map/common-google-map.js.map +1 -0
- package/dist-client/google-map/google-map-loader.d.ts +6 -0
- package/dist-client/google-map/google-map-loader.js +23 -0
- package/dist-client/google-map/google-map-loader.js.map +1 -0
- package/dist-client/icons/menu-icons.d.ts +6 -0
- package/dist-client/icons/menu-icons.js +42 -0
- package/dist-client/icons/menu-icons.js.map +1 -1
- package/dist-client/pages/component/project-update-header.d.ts +1 -0
- package/dist-client/pages/component/project-update-header.js +127 -0
- package/dist-client/pages/component/project-update-header.js.map +1 -0
- package/dist-client/pages/kpi-admin/dssp-kpi-list-page.d.ts +22 -0
- package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js +57 -0
- package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js.map +1 -0
- package/dist-client/pages/kpi-admin/dssp-kpi-overview.d.ts +46 -0
- package/dist-client/pages/kpi-admin/dssp-kpi-overview.js +378 -0
- package/dist-client/pages/kpi-admin/dssp-kpi-overview.js.map +1 -0
- package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.d.ts +20 -0
- package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js +445 -0
- package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js.map +1 -0
- package/dist-client/pages/kpi-admin/kpi-system-guide.d.ts +18 -0
- package/dist-client/pages/kpi-admin/kpi-system-guide.js +535 -0
- package/dist-client/pages/kpi-admin/kpi-system-guide.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.d.ts +18 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +259 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.d.ts +22 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +346 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.d.ts +26 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +433 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.d.ts +8 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js +78 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +38 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +851 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +42 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +316 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +28 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +497 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
- package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +131 -0
- package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +52 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +798 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +63 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +1089 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +12 -0
- package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +82 -0
- package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +11 -0
- package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +65 -0
- package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +13 -0
- package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +115 -0
- package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +15 -0
- package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +147 -0
- package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +7 -0
- package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +86 -0
- package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +1 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +57 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +719 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.d.ts +23 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +76 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +68 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +394 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +12 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +174 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +40 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +190 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -0
- package/dist-client/pages/kpi-value/kpi-value-importer.d.ts +23 -0
- package/dist-client/pages/kpi-value/kpi-value-importer.js +93 -0
- package/dist-client/pages/kpi-value/kpi-value-importer.js.map +1 -0
- package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +71 -0
- package/dist-client/pages/kpi-value/kpi-value-list-page.js +454 -0
- package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -0
- package/dist-client/pages/project-complete-tabs/pc-tab1-plan.d.ts +61 -0
- package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +766 -0
- package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +1 -0
- package/dist-client/pages/project-complete-tabs/pc-tab2-rating.d.ts +16 -0
- package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js +341 -0
- package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js.map +1 -0
- package/dist-client/pages/project-complete-tabs/pc-tab3-upload.d.ts +21 -0
- package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js +335 -0
- package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js.map +1 -0
- package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.d.ts +42 -0
- package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js +641 -0
- package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js.map +1 -0
- package/dist-client/pages/sv-project-complete.d.ts +25 -0
- package/dist-client/pages/sv-project-complete.js +263 -0
- package/dist-client/pages/sv-project-complete.js.map +1 -0
- package/dist-client/pages/sv-project-completed-list.d.ts +27 -0
- package/dist-client/pages/sv-project-completed-list.js +416 -0
- package/dist-client/pages/sv-project-completed-list.js.map +1 -0
- package/dist-client/pages/sv-project-detail.d.ts +58 -0
- package/dist-client/pages/sv-project-detail.js +1418 -0
- package/dist-client/pages/sv-project-detail.js.map +1 -0
- package/dist-client/pages/sv-project-list.d.ts +174 -0
- package/dist-client/pages/sv-project-list.js +578 -0
- package/dist-client/pages/sv-project-list.js.map +1 -0
- package/dist-client/pages/sv-project-update.d.ts +86 -0
- package/dist-client/pages/sv-project-update.js +1331 -0
- package/dist-client/pages/sv-project-update.js.map +1 -0
- package/dist-client/pages/sv-user-management.d.ts +1 -0
- package/dist-client/pages/sv-user-management.js +5 -0
- package/dist-client/pages/sv-user-management.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +50 -2
- package/dist-client/route.js.map +1 -1
- package/dist-client/shared/complete-api.d.ts +37 -0
- package/dist-client/shared/complete-api.js +224 -0
- package/dist-client/shared/complete-api.js.map +1 -0
- package/dist-client/shared/func.d.ts +2 -0
- package/dist-client/shared/func.js +22 -0
- package/dist-client/shared/func.js.map +1 -0
- package/dist-client/shared/integration-fetch.d.ts +35 -0
- package/dist-client/shared/integration-fetch.js +53 -0
- package/dist-client/shared/integration-fetch.js.map +1 -0
- package/dist-client/themes/dark.css +24 -24
- package/dist-client/themes/light.css +23 -23
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/viewparts/menu-tools.d.ts +40 -5
- package/dist-client/viewparts/menu-tools.js +292 -43
- package/dist-client/viewparts/menu-tools.js.map +1 -1
- package/dist-server/index.d.ts +2 -0
- package/dist-server/index.js +5 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/index.d.ts +1 -0
- package/dist-server/migrations/index.js +12 -0
- package/dist-server/migrations/index.js.map +1 -0
- package/dist-server/scripts/calculate-kpi-scores.d.ts +10 -0
- package/dist-server/scripts/calculate-kpi-scores.js +333 -0
- package/dist-server/scripts/calculate-kpi-scores.js.map +1 -0
- package/dist-server/scripts/load-grade-data-migration.d.ts +14 -0
- package/dist-server/scripts/load-grade-data-migration.js +279 -0
- package/dist-server/scripts/load-grade-data-migration.js.map +1 -0
- package/dist-server/scripts/propagate-parent-kpi-values.d.ts +14 -0
- package/dist-server/scripts/propagate-parent-kpi-values.js +786 -0
- package/dist-server/scripts/propagate-parent-kpi-values.js.map +1 -0
- package/dist-server/scripts/recalculate-by-project-name.d.ts +2 -0
- package/dist-server/scripts/recalculate-by-project-name.js +72 -0
- package/dist-server/scripts/recalculate-by-project-name.js.map +1 -0
- package/dist-server/service/index.d.ts +4 -0
- package/dist-server/service/index.js +20 -0
- package/dist-server/service/index.js.map +1 -0
- package/dist-server/service/kpi-metric-value/index.d.ts +4 -0
- package/dist-server/service/kpi-metric-value/index.js +8 -0
- package/dist-server/service/kpi-metric-value/index.js.map +1 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +166 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +951 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +7 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +59 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -0
- package/dist-server/service/kpi-stat/index.d.ts +4 -0
- package/dist-server/service/kpi-stat/index.js +8 -0
- package/dist-server/service/kpi-stat/index.js.map +1 -0
- package/dist-server/service/kpi-stat/kpi-stat-query.d.ts +12 -0
- package/dist-server/service/kpi-stat/kpi-stat-query.js +663 -0
- package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -0
- package/dist-server/service/kpi-stat/kpi-stat-types.d.ts +32 -0
- package/dist-server/service/kpi-stat/kpi-stat-types.js +180 -0
- package/dist-server/service/kpi-stat/kpi-stat-types.js.map +1 -0
- package/dist-server/service/kpi-value/index.d.ts +3 -0
- package/dist-server/service/kpi-value/index.js +7 -0
- package/dist-server/service/kpi-value/index.js.map +1 -0
- package/dist-server/service/kpi-value/kpi-value-query.d.ts +8 -0
- package/dist-server/service/kpi-value/kpi-value-query.js +63 -0
- package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/kpi-module-service-tests.md +1286 -0
- package/kpi-module-test-report.md +676 -0
- package/kpi-module-unit-test-detailed-report.md +925 -0
- package/kpi-module-unit-tests-detailed.md +1452 -0
- package/package.json +69 -55
- package/recalculate-batch.sh +64 -0
- package/recalculate-projects-range.sh +98 -0
- package/schema.graphql +3423 -462
- package/things-factory.config.js +12 -1
- package/translations/en.json +5 -1
- package/translations/ko.json +5 -1
- package/views/auth-page.html +0 -1
- package/views/public/home.html +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kpi-metric-value-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive, ObjectType, Field } from 'type-graphql'\nimport { getRepository, ScalarObject, EnvVar, Domain } from '@things-factory/shell'\nimport { runScenario } from '@things-factory/integration-base'\nimport { In } from 'typeorm'\nimport {\n KpiPeriodType,\n KpiMetric,\n KpiMetricValue,\n KpiMetricValuePatch,\n Kpi,\n KpiValue,\n parseFormula,\n evaluateFormula,\n builtinFunctions,\n KpiMetricValueProvider\n} from '@things-factory/kpi'\nimport { Attachment, NewAttachment, createAttachment } from '@things-factory/attachment-base'\nimport { Project, ProjectState } from '@dssp/project'\nimport moment from 'moment-timezone'\nimport FormData from 'form-data'\nimport fetch from 'node-fetch'\nimport https from 'https'\nimport http from 'http'\n\n/**\n * ์ธ๋ถ ์์คํ
๋ฐ์ดํฐ ์์ง ๊ฒฐ๊ณผ โ ์์คํ
๋ณ ํ row.\n * UI \"์๋ ์์ง\" ๋ฒํผ์ด ์๋๋ฆฌ์ค ํธ์ถ ํ ์์คํ
๋ณ ์ฑ๊ณตยท์ค๋ฅ ํ์์ ์ฌ์ฉ.\n */\n@ObjectType({ description: '์ธ๋ถ ์์คํ
(์ธ์ํฐ/์ฌ๋ฐ๋ก/ํค์ค์ฝ) ๋ฐ์ดํฐ ์์ง ์๋๋ฆฌ์ค ํธ์ถ ๊ฒฐ๊ณผ' })\nclass ExternalDataCollectionResult {\n @Field({ description: '์์ค ํค: saeumteo | allbaro | kiscon' })\n source!: string\n\n @Field({ description: 'ํ์ ๋ผ๋ฒจ (์ธ์ํฐ/์ฌ๋ฐ๋ก/ํค์ค์ฝ)' })\n label!: string\n\n @Field({ description: '์๋๋ฆฌ์ค ์คํ ์ฑ๊ณต ์ฌ๋ถ' })\n ok!: boolean\n\n @Field({ description: '์ฑ๊ณต ์ \"์๋ฃ\", ์คํจ ์ ์๋ฌ ๋ฉ์์ง' })\n message!: string\n\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n '์๋๋ฆฌ์ค result ๊ฐ์ฒด โ projectKey: value ๋งต. ' +\n '์ธ์ํฐ={area, floorAreaRatio, upperFloorCount, lowerFloorCount, structureType, siteType}, ' +\n '์ฌ๋ฐ๋ก={totalConstructionWasteAmount}, ' +\n 'ํค์ค์ฝ={constructionPeriod, constructionCost}. ' +\n 'siteType (๊ฑด์ถ๋ฌผ ์ฉ๋, ์ APARTMENT_COMPLEX) / structureType (๊ตฌ์กฐํํ) ๋ ' +\n 'BuildingComplex ์ ์์ค์ ํ/๊ตฌ์กฐ์ ํ ์์ฑ ํ๋ณด. KISCON ์ \"๊ณต์ฌ์ ํ(์ ์ค/์ฆ์ถ)\" ์ ' +\n 'DSSP SiteType (์ฉ๋๋ถ๋ฅ) ์ ๋ค๋ฅธ ๋๋ฉ์ธ์ด๋ผ ๋งคํ ๋์ ์๋.'\n })\n data?: any\n}\n\n@Resolver(KpiMetricValue)\nexport class KpiMetricValueMutation {\n /* ํ๋ก์ ํธ ์ํ๊ณผ์ ์ค์ (์๊ฐ, ๋น์ฉ, ๋ฐ์ ๊ฑด์ ๋ฑ) ๋์ ๋ ๊ฐ์ ๋ฐ์ํ์ฌ KPI Metric Value ๊ฐ์ ์์ - ์๋ฅผ ๋ค๋ฉด, ์ด ์ค๊ณ ๋ณ๊ฒฝ ๊ฑด์, ์ด ๊ฑด์ค ํ๊ธฐ๋ฌผ ๋ฐ์๋, ๊ณต์ฌ๋น, ๊ณต์ฌ๊ธฐ๊ฐ, ์ฌํด ๊ฑด์ ๋ฑ */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"input\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetricValue], { description: \"To modify multiple cumulative KpiMetricValues' value\" })\n async updateKpiMetricValuesCumulative(\n @Arg('patches', type => [KpiMetricValuePatch]) patches: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n return await this.upsertKpiMetricValues(patches, context)\n }\n\n /* ์ ๋ฌธ ๊ฐ๋ฆฌ์ฌ์ ์ํด์ ํ๊ฐ๋ ๋ณ์ ์ ๋ฐ์ํ์ฌ KPI Metric Value ๊ฐ์ ์์ */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"assessment\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetricValue], { description: \"To modify multiple assessment KpiMetricValues' value\" })\n async updateKpiMetricValuesAssessment(\n @Arg('patches', type => [KpiMetricValuePatch]) patches: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n return await this.upsertKpiMetricValues(patches, context)\n }\n\n /**\n * KpiMetricValue ์ unique ์กฐํฉ (domain, metric, valueDate, org) ๊ธฐ์ค ์ง์ง upsert.\n *\n * ๊ธฐ์กด mutation ์ `repo.save({...patch})` ๋ patch.id ๋ง ๋ณด๊ณ update/insert ๊ฒฐ์ ํด\n * ๊ฐ์ metric ร ๊ฐ์ valueDate ร ๊ฐ์ org ์ธ๋ฐ patch.id ๊ฐ ์ UUID ์ธ ๊ฒฝ์ฐ unique\n * ์ธ๋ฑ์ค (ix_kpi_metric_value_latest) ์๋ฐ ์๋ฌ ๋๋ row ๋์ ์ํ. ์ ํํ upsert\n * ๋์์ ๋ณด์ฅํ๊ธฐ ์ํด ์กฐํฉ lookup โ ๊ธฐ์กด id ์ฌ์ฉ โ save.\n *\n * ์๋ณ metric (periodType=MONTH, valueDate=YYYY-MM-01) ์ ๋จ์ผ row ์ ์ฑ
์ ์์ฐ ์ถฉ์กฑ.\n *\n * **๋๋ฉ์ธ ์ปจํ
์คํธ ์ค์์น**: caller (์ด์์) ๊ฐ system ๋๋ฉ์ธ์ผ ์ ์์ด patch.org\n * (= projectId) ๋ก ํ๋ก์ ํธ ํ
๋ํธ ๋๋ฉ์ธ์ lookup ํด ๊ทธ ์ปจํ
์คํธ๋ก ์ ์ฅ. ๋ชจ๋ \n * patch ๊ฐ ๊ฐ์ projectId ๋ผ ๊ฐ์ (ํ ๋ฒ์ mutation = ํ ํ๋ก์ ํธ์ ๊ฐ๋ค).\n */\n private async upsertKpiMetricValues(\n patches: KpiMetricValuePatch[],\n context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n if (patches.length === 0) return []\n // ์ฒซ patch.org ์ projectId ๋ก ๋๋ฉ์ธ ์ค์์น. patch.org ๊ฐ ์์ผ๋ฉด caller context ๊ทธ๋๋ก.\n const projectId = (patches[0] as any).org\n const ctx = projectId ? await this.switchToProjectDomain(projectId, context) : context\n const { domain, user, tx } = ctx.state\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n const metricRepo = getRepository(KpiMetric, tx)\n\n const results: KpiMetricValue[] = []\n for (const patch of patches) {\n const metric = await metricRepo.findOne({ where: { id: patch.metricId } })\n if (!metric) {\n throw new Error(`Metric not found: ${patch.metricId}`)\n }\n // unique ์กฐํฉ ๊ธฐ์ค ๊ธฐ์กด row lookup. ์์ผ๋ฉด ๊ทธ id ๋ก save โ update.\n const existing = await metricValueRepo.findOne({\n where: {\n domain: { id: domain.id },\n metric: { id: patch.metricId },\n valueDate: patch.valueDate,\n org: patch.org\n } as any\n })\n const result = await metricValueRepo.save({\n domain,\n ...patch,\n id: existing?.id ?? patch.id,\n metric,\n updater: user\n } as any)\n results.push(result)\n }\n return results\n }\n\n /* ์ ๋ฌธ ๊ฐ๋ฆฌ์ฌ์ ์ ๊ฐ๋ฆฌ ์ต์ข
ํ๊ฐ์์ ๊ธ๋ถ์ ์ ํ
์คํธ ๋ถ์ํ๋ ๊ฐ์ ๋ถ์ ๊ธฐ๋ฐ ํ๊ฐ๊ฐ์ ์์ */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"sentiment\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Attachment, { nullable: true, description: \"To modify multiple sentiment KpiMetricValues' value\" })\n async updateKpiMetricValuesSentiment(\n @Arg('attachment', type => NewAttachment) attachment: NewAttachment,\n @Ctx() context: ResolverContext\n ): Promise<Attachment | null> {\n const { domain, user, tx } = context.state\n const projectRepo = getRepository(Project, tx)\n const projectId = attachment.refBy\n const attachmentRepo = getRepository(Attachment, tx)\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n const metricRepo = getRepository(KpiMetric, tx)\n\n // 1. ๊ธฐ์กด ํ์ผ ์ญ์ \n projectRepo.update(projectId, { completeReport: null })\n await attachmentRepo.delete({ refBy: projectId, refType: attachment.refType })\n\n // 2. ์ ํ์ผ ์์ผ๋ฉด ๋\n if (!attachment.file) {\n return null\n }\n\n // 3. ๋จผ์ ํ์ผ์ ๋ฒํผ๋ก ์ฝ๊ธฐ (์คํธ๋ฆผ์ ํ ๋ฒ๋ง ์ฝ์ ์ ์์ผ๋ฏ๋ก)\n const uploadedFile = await attachment.file\n const { filename } = uploadedFile\n const fileBuffer = await this.readFileToBuffer(uploadedFile)\n\n console.log(`Processing PDF file: ${filename}, size: ${fileBuffer.length} bytes`)\n\n // 4. ์ ํ์ผ ์ ์ฅ (๋ฒํผ๋ฅผ ์ฌ์ฉํ์ฌ attachment ์์ฑ)\n const recreatedFile = this.createFileUploadFromBuffer(fileBuffer, filename, 'application/pdf')\n const { id: resultId } = await createAttachment(null, { attachment: { ...attachment, file: recreatedFile } }, context)\n const result = await attachmentRepo.findOne({ where: { id: resultId } })\n projectRepo.update(projectId, { completeReport: result })\n\n // 5. pdf ํ์ผ์ operator-runner ์๋น์ค์ ์
๋ก๋ํ์ฌ ๋ถ์\n let safetyScore = 0\n let qualityScore = 0\n\n try {\n const operatorRunnerUrl = process.env.OPERATOR_RUNNER_URL || 'https://hatiolab-korea-uni.ettisoft.com'\n\n // sl-pa-safety ์๋น์ค ํธ์ถ\n safetyScore = await this.callOperatorRunnerServiceWithBuffer(operatorRunnerUrl, 'sl-pa-safety', fileBuffer, filename)\n\n // sl-pa-quality ์๋น์ค ํธ์ถ\n qualityScore = await this.callOperatorRunnerServiceWithBuffer(operatorRunnerUrl, 'sl-pa-quality', fileBuffer, filename)\n } catch (error) {\n console.error('Failed to analyze PDF with operator-runner:', error)\n }\n\n // 5. ๋ฉํธ๋ฆญ ์ ์ ์ ์ฅ\n await this.saveMetricValue(metricValueRepo, metricRepo, projectId, 'SL-PA ์์ ํ๊ฐ', safetyScore, domain, user)\n await this.saveMetricValue(metricValueRepo, metricRepo, projectId, 'SL-PA ํ์ง ํ๊ฐ', qualityScore, domain, user)\n\n return result\n }\n\n /**\n * FileUpload ์คํธ๋ฆผ์ ๋ฒํผ๋ก ์ฝ๊ธฐ\n */\n private async readFileToBuffer(fileUpload: any): Promise<Buffer> {\n const { createReadStream } = fileUpload\n const chunks: Buffer[] = []\n\n return new Promise((resolve, reject) => {\n const stream = createReadStream()\n stream.on('data', (chunk: Buffer) => chunks.push(chunk))\n stream.on('end', () => resolve(Buffer.concat(chunks)))\n stream.on('error', (error: Error) => reject(error))\n })\n }\n\n /**\n * Buffer๋ก๋ถํฐ FileUpload ๊ฐ์ฒด ์์ฑ\n */\n private createFileUploadFromBuffer(buffer: Buffer, filename: string, mimetype: string): any {\n const { Readable } = require('stream')\n return {\n filename,\n mimetype,\n encoding: '7bit',\n createReadStream: () => {\n const readable = new Readable()\n readable.push(buffer)\n readable.push(null)\n return readable\n }\n }\n }\n\n /**\n * operator-runner ์๋น์ค ํธ์ถ (Buffer ์ฌ์ฉ)\n */\n private async callOperatorRunnerServiceWithBuffer(\n baseUrl: string,\n serviceName: string,\n fileBuffer: Buffer,\n filename: string\n ): Promise<number> {\n console.log(`Calling operator-runner service: ${serviceName}`)\n console.log(`Base URL: ${baseUrl}`)\n console.log(`Filename: ${filename}`)\n console.log(`Buffer size: ${fileBuffer.length} bytes`)\n\n const formData = new FormData()\n\n // Buffer๋ฅผ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ์ฌ ์ถ๊ฐ\n const { Readable } = require('stream')\n const bufferStream = Readable.from(fileBuffer)\n\n formData.append('files', bufferStream, {\n filename,\n contentType: 'application/pdf'\n })\n\n const url = `${baseUrl}/api/run/${serviceName}`\n console.log(`Request URL: ${url}`)\n\n // HTTP/HTTPS agent ์ค์ \n const isHttps = url.startsWith('https')\n const agent = isHttps\n ? new https.Agent({\n keepAlive: false,\n timeout: 120000,\n rejectUnauthorized: false\n })\n : new http.Agent({\n keepAlive: false,\n timeout: 120000\n })\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n body: formData as any,\n headers: {\n ...formData.getHeaders(),\n Authorization: `Basic ${Buffer.from('admin:admin1234').toString('base64')}`\n },\n agent,\n timeout: 120000\n })\n\n console.log(`Response status: ${response.status}`)\n\n if (!response.ok) {\n const errorText = await response.text()\n console.error(`Service ${serviceName} error response:`, errorText)\n throw new Error(`Service ${serviceName} failed (${response.status}): ${errorText}`)\n }\n\n const data = await response.json()\n console.log(`Service ${serviceName} response:`, JSON.stringify(data))\n\n const score = data?.result?.score || data?.score || 0\n console.log(`Extracted score: ${score}`)\n\n return score\n } catch (error) {\n console.error(`Error calling ${serviceName}:`, error)\n throw error\n }\n }\n\n /**\n * ๋ฉํธ๋ฆญ ๊ฐ ์ ์ฅ\n */\n private async saveMetricValue(\n metricValueRepo: any,\n metricRepo: any,\n projectId: string,\n metricName: string,\n value: number,\n domain: any,\n user: any\n ): Promise<void> {\n const metricValue = await metricValueRepo.findOne({\n where: { org: projectId, metric: { name: metricName } }\n })\n\n if (metricValue) {\n await metricValueRepo.save({\n ...metricValue,\n value,\n updater: user\n })\n } else {\n const originMetric = await metricRepo.findOne({ where: { name: metricName } })\n if (originMetric) {\n await metricValueRepo.save({\n metric: { id: originMetric.id },\n unit: originMetric.unit || '',\n org: projectId,\n periodType: originMetric.periodType,\n valueDate: moment().tz('Asia/Seoul').format('YYYY-MM-DD'),\n value,\n domain,\n updater: user\n })\n }\n }\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"finalize\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To finalize project with KPI recalculation' })\n async finalizeProjectWithKpiRecalculation(\n @Arg('projectId') projectId: string,\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, user, tx } = context.state\n const projectRepo = getRepository(Project, tx)\n\n const project = await projectRepo.findOne({ where: { id: projectId } })\n\n console.log('project :', project)\n\n if (!project) {\n throw new Error(`Project not found: ${projectId}`)\n }\n\n // KPI value ๊ณ์ฐ์ ํ๋ก์ ํธ(ํ
๋ํธ) ๋๋ฉ์ธ ๊ธฐ์ค์ด๋ผ ์ปจํ
์คํธ ์ค์์น.\n // ์ธ๋ถ ์์คํ
๋ฐ์ดํฐ ์์ง์ ๋ณ๋ mutation (collectProjectExternalData) ๋ก ๋ถ๋ฆฌ โ\n // ์ฌ์ฉ์๊ฐ UI \"์๋ ์์ง\" ๋ฒํผ์ผ๋ก ๋ช
์ ์คํ. finalize/recalculate ํ๋ฆ์์๋\n // ์ธ๋ถ ์ฐ๋์ ๋์ด๋ค์ด์ง ์์ (DB ์ ์ด๋ฏธ ์ ์ฅ๋ KpiMetricValue ๋ง ๊ฐ์ง๊ณ ๊ณ์ฐ).\n const projectContext = await this.switchToProjectDomain(projectId, context)\n\n await this.recalculateProjectKpiValues(projectId, projectContext)\n\n projectRepo.save({\n ...project,\n state: ProjectState.COMPLETED\n })\n\n return true\n }\n\n /**\n * ์๊ณต ์ฒ๋ฆฌ ์์ด KPI ๋ง ์ฌ๊ณ์ฐ โ ์งํ ์ค ํ๋ก์ ํธ์ ์ค๊ฐ ๊ฒฐ๊ณผ ์ฐ์ ์ฉ๋.\n * DB ์ ์ด๋ฏธ ์ ์ฅ๋ KpiMetricValue ๋ง ๊ฐ์ง๊ณ formula ํ๊ฐ. ์ธ๋ถ ์๋๋ฆฌ์ค (juso/\n * allbaro/kiscon) ์๋ ์์ง์ ์๋์ ์ผ๋ก ํธ์ถํ์ง ์์ โ ์ธ๋ถ ์์ง์ ์ฌ์ฉ์๊ฐ\n * \"์๋ ์์ง\" ๋ฒํผ (`collectProjectExternalData`) ์ผ๋ก ๋ช
์์ ์ผ๋ก ์คํํ๋ ํ๋ฆ.\n * ๊ถํ์ `kpi:recalculate` ๋ก ๋ถ๋ฆฌํด finalize ๋ณด๋ค ๊ฐ๋ณ๊ฒ ๋ถ์ฌ ๊ฐ๋ฅ.\n */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"recalculate\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'Recalculate project KPI without finalizing (interim).' })\n async recalculateProjectKpi(\n @Arg('projectId') projectId: string,\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { tx } = context.state\n const project = await getRepository(Project, tx).findOne({ where: { id: projectId } })\n if (!project) {\n throw new Error(`Project not found: ${projectId}`)\n }\n\n const projectContext = await this.switchToProjectDomain(projectId, context)\n await this.recalculateProjectKpiValues(projectId, projectContext)\n\n return true\n }\n\n /**\n * UI \"์๋ ์์ง\" ๋ฒํผ ์ ์ฉ mutation. ์ธ๋ถ ์์คํ
3์ข
์๋๋ฆฌ์ค๋ฅผ ์์ฐจ ํธ์ถํ๊ณ \n * ์์คํ
๋ณ ์ฑ๊ณต/์คํจ + ๋ฉ์์ง๋ฅผ ๋ฐํ. UI ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์นด๋๋ณ ์ํ (์ฑ๊ณตยท์ค๋ฅ) ๋ฅผ ํ์.\n *\n * ์๋๋ฆฌ์ค๋ ๋๋ฉ์ธ EnvVar (์ฃผ์ยท์๊ฒฉ์ฆ๋ช
ยท์๋น์คํค ๋ฑ) ๋ง์ผ๋ก ๋์ํ๋ฏ๋ก ํ๋ผ๋ฏธํฐ X.\n * ํ ์์คํ
์คํจ๊ฐ ๋ค๋ฅธ ์์คํ
์์ง์ ๋ง์ง ์๋๋ก try/catch ๋ก ๊ฒฉ๋ฆฌ.\n *\n * ์ด์ ํ์ค: ํค์ค์ฝยท์ฌ๋ฐ๋ก๋ ์๊ณต์ฌ ID/PW ๊ฐ ์์ฃผ ๋ฏธํ๋ณด โ ์ค๋ฅ ํํจ. ์ธ์ํฐ๋ ๊ณต๊ณต\n * ๋ฐ์ดํฐ ์๋น์คํค๋ง์ผ๋ก ๋์ ๊ฐ๋ฅ. UI ๋ ์์คํ
๋ณ๋ก ๋ช
ํํ ์ค๋ฅ ๋ฉ์์ง ๋
ธ์ถ.\n */\n @Directive('@privilege(category: \"kpi\", privilege: \"auto-collect\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [ExternalDataCollectionResult], {\n description: 'Run external data collection scenarios per system, returning per-system result.'\n })\n async collectProjectExternalData(\n @Arg('projectId') projectId: string,\n @Ctx() context: ResolverContext\n ): Promise<ExternalDataCollectionResult[]> {\n const projectContext = await this.switchToProjectDomain(projectId, context)\n return await this.runExternalDataScenariosWithResults(projectContext)\n }\n\n /**\n * ํ๋ก์ ํธ ์ ๋ณด ์์ ํ๋ฉด์ \"์ ๋ณด ์ฐ๋\" ๋ฒํผ ์ ์ฉ โ ์ธ์ํฐ ๋จ์ผ ์๋๋ฆฌ์ค๋ง ํธ์ถ.\n * BuildingComplex ๊ธฐ๋ณธ ์์ฑ (area / floorAreaRatio / siteType / structureType /\n * coverageRatio / householdCount ๋ฑ) ์๋ ์ฑ์ ๋ชฉ์ .\n *\n * address ์ธ์๊ฐ ์์ผ๋ฉด ์๋๋ฆฌ์ค ์คํ ์ ์ EnvVar `Step::๊ฑด์ถ๋ฌผ๊ด๋ฆฌ๋์ฅ์กฐํ::address::query`\n * ๋ฅผ ๊ทธ ๊ฐ์ผ๋ก upsert โ ์ด์์๊ฐ ํผ์์ ๋ฐฉ๊ธ ์
๋ ฅํ ์ฃผ์๋ฅผ ์๋๋ฆฌ์ค๊ฐ ๊ณง๋ฐ๋ก ์ฌ์ฉ.\n * (๋๋ฉ์ธ์ ๊ธฐ์กด EnvVar ์ ๋ค๋ฅผ ์ ์์ด ๋ช
์์ ๊ฐฑ์ .)\n *\n * **๋๋ฉ์ธ ์ค์์น**: mutation ํธ์ถ์ system / ์ด์์ ๋๋ฉ์ธ์์ ์ผ์ด๋์ง๋ง ์๋๋ฆฌ์คยท\n * EnvVar ๋ **ํ๋ก์ ํธ๊ฐ ์ํ ๋๋ฉ์ธ** ์ ์์ด์ผ ์์ฐ. project.domain ์ผ๋ก ์ปจํ
์คํธ\n * ์ค์์น ํ ๊ทธ ๋๋ฉ์ธ์์ EnvVar upsert + ์๋๋ฆฌ์ค ์คํ.\n */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"basic-info\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ExternalDataCollectionResult, {\n description: 'Run only ๊ฑด์ถ๋ฌผ๊ด๋ฆฌ๋์ฅ์กฐํ scenario for project basic info collection.'\n })\n async collectProjectBasicInfo(\n @Arg('projectId') projectId: string,\n @Arg('address', { nullable: true }) address: string,\n @Ctx() context: ResolverContext\n ): Promise<ExternalDataCollectionResult> {\n const projectContext = await this.switchToProjectDomain(projectId, context)\n if (address && address.trim()) {\n await this.upsertEnvVar('Step::๊ฑด์ถ๋ฌผ๊ด๋ฆฌ๋์ฅ์กฐํ::address::query', address.trim(), projectContext)\n }\n return await this.runSingleScenario(\n { source: 'saeumteo', label: '์ธ์ํฐ', name: '๊ฑด์ถ๋ฌผ๊ด๋ฆฌ๋์ฅ์กฐํ' },\n projectContext\n )\n }\n\n /**\n * mutation ํธ์ถ์ด system / ์ด์์ ๋๋ฉ์ธ์์ ์ผ์ด๋๋ ์๋๋ฆฌ์คยทEnvVar ๋ **ํ๋ก์ ํธ\n * ํ
๋ํธ ๋๋ฉ์ธ** ์์ ๋์ํด์ผ ์์ฐ. project.code ๋ก ์์ (ํ
๋ํธ) ๋๋ฉ์ธ์ ์ฐพ์\n * ์ปจํ
์คํธ ์ฌ๋ณธ ๋ง๋ค์ด ๋ฐํ.\n *\n * ํ
๋ํธ ๋๋ฉ์ธ ๋งคํ: Domain.subdomain = project.code AND Domain.extType = 'project'\n * (promoteProjectToTenant mutation ์ด ๊ทธ๋ ๊ฒ ์์ฑ). project.domain ์์ฒด๋ ๋ถ๋ชจ\n * ๋๋ฉ์ธ์ด๋ผ ์ธ๋ถ ์ฐ๋ EnvVar ๊ฐ ๊ฑฐ๊ธฐ ์์ ์ผ์ด ์์ด ์ฌ์ฉ ๋ถ์ ํฉ.\n *\n * ํ
๋ํธ ๋๋ฉ์ธ์ด ์๊ฑฐ๋ (= ์์ง ์น๊ฒฉ ์ ๋จ) project.code ๊ฐ ๋น์ด์์ผ๋ฉด ์๋ณธ\n * ์ปจํ
์คํธ ๊ทธ๋๋ก ๋ฐํ (๋ฐฉ์ด). project ์์ฒด๊ฐ ์์ผ๋ฉด throw.\n */\n private async switchToProjectDomain(\n projectId: string,\n context: ResolverContext\n ): Promise<ResolverContext> {\n const { tx } = context.state\n const project = await getRepository(Project, tx).findOne({ where: { id: projectId } })\n if (!project) {\n throw new Error(`Project not found: ${projectId}`)\n }\n if (!project.code) {\n console.warn(`[collect] project ${projectId} ๋ ์์ง ํ
๋ํธ ์น๊ฒฉ๋์ง ์์ (no code) โ caller domain ๊ทธ๋๋ก ์ฌ์ฉ`)\n return context\n }\n const tenantDomain = await getRepository(Domain, tx).findOne({\n where: { subdomain: project.code, extType: 'project' } as any\n })\n if (!tenantDomain) {\n console.warn(\n `[collect] project ${projectId} (code=${project.code}) ์ ํ
๋ํธ ๋๋ฉ์ธ์ ์ฐพ์ง ๋ชปํจ โ caller domain ๊ทธ๋๋ก ์ฌ์ฉ`\n )\n return context\n }\n return {\n ...context,\n state: { ...context.state, domain: tenantDomain }\n } as ResolverContext\n }\n\n /**\n * ์ปจํ
์คํธ์ ๋๋ฉ์ธ์ EnvVar 1๊ฐ upsert. ์๋๋ฆฌ์ค๊ฐ ๋๋ฉ์ธ EnvVar ๋ฅผ ์ฐ์ ์ฐธ์กฐํ๋\n * ์ ์ฑ
์ด๋ผ, ํผ์์ ์
๋ ฅํ ์ฃผ์๋ฅผ ์๋๋ฆฌ์ค ์
๋ ฅ์ผ๋ก ํ๋ฆฌ๋ ๋ค๋ฆฌ ์ญํ .\n */\n private async upsertEnvVar(name: string, value: string, context: ResolverContext): Promise<void> {\n const { domain, user, tx } = context.state\n const repo = getRepository(EnvVar, tx)\n const existing = await repo.findOne({ where: { domain: { id: domain.id }, name } as any })\n if (existing) {\n existing.value = value\n existing.active = true\n ;(existing as any).updater = user\n await repo.save(existing)\n } else {\n await repo.save(\n repo.create({\n name,\n value,\n active: true,\n domain,\n description: 'Project basic info ์๋ ์ฐ๋์ฉ (project-update ์ ๋ณด์ฐ๋ ๋ฒํผ)',\n creator: user,\n updater: user\n } as any)\n )\n }\n }\n\n /**\n * ๋จ์ผ ์๋๋ฆฌ์ค ํธ์ถ + result unwrap + ์คํจ ํ์ โ collectProjectExternalData ์\n * loop ๋ณธ์ฒด์ ๊ฐ์ ๋ก์ง์ 1๊ฑด์ง๋ฆฌ๋ก ๋ถ๋ฆฌ.\n */\n private async runSingleScenario(\n s: { source: string; label: string; name: string },\n context: ResolverContext\n ): Promise<ExternalDataCollectionResult> {\n const { domain } = context.state\n const instanceName = `collect-${s.name}-${Date.now()}`\n try {\n const runResult: any = await runScenario(instanceName, s.name, {}, context)\n if (!runResult) {\n console.warn(`[collect] '${s.name}' no result on domain '${domain.subdomain}'`)\n throw new Error('์
๋ฐ์ดํธํ ์ ๋ณด๊ฐ ์์ต๋๋ค')\n }\n if (runResult.state === 'HALTED') {\n console.warn(\n `[collect] '${s.name}' HALTED on domain '${domain.subdomain}': ${runResult.message || '(no message)'}`\n )\n throw new Error('์
๋ฐ์ดํธํ ์ ๋ณด๊ฐ ์์ต๋๋ค')\n }\n\n let data = runResult.result ?? runResult.data ?? {}\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const wrapKeys = Object.keys(data)\n if (\n wrapKeys.length === 1 &&\n data[wrapKeys[0]] &&\n typeof data[wrapKeys[0]] === 'object' &&\n !Array.isArray(data[wrapKeys[0]])\n ) {\n data = data[wrapKeys[0]]\n }\n }\n console.log(`[collect] '${s.name}' OK on '${domain.subdomain}' keys=${Object.keys(data || {}).join(',')}`)\n return { source: s.source, label: s.label, ok: true, message: '์๋ฃ', data }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n console.warn(`[collect] '${s.name}' failed on '${domain.subdomain}': ${msg}`)\n return { source: s.source, label: s.label, ok: false, message: msg }\n }\n }\n\n /**\n * ์ธ๋ถ ์์คํ
3์ข
์๋๋ฆฌ์ค ์์ฐจ ์คํ + ์์คํ
๋ณ ๊ฒฐ๊ณผ ์์ง.\n */\n private async runExternalDataScenariosWithResults(context: ResolverContext): Promise<ExternalDataCollectionResult[]> {\n const { domain } = context.state\n const SCENARIOS: Array<{ source: string; label: string; name: string }> = [\n { source: 'saeumteo', label: '์ธ์ํฐ', name: '๊ฑด์ถ๋ฌผ๊ด๋ฆฌ๋์ฅ์กฐํ' },\n { source: 'allbaro', label: '์ฌ๋ฐ๋ก', name: '๊ฑด์คํ๊ธฐ๋ฌผ์ ๋ณด์กฐํ' },\n { source: 'kiscon', label: 'ํค์ค์ฝ', name: '๊ฑด์ค๊ณต์ฌ์ ๋ณด์กฐํ' }\n ]\n\n const results: ExternalDataCollectionResult[] = []\n for (const s of SCENARIOS) {\n results.push(await this.runSingleScenario(s, context))\n }\n return results\n }\n\n /**\n * finalize ํ๋ฆ์ฉ ์๋๋ฆฌ์ค ํธ์ถ. ๊ฒฐ๊ณผ ํํ ์์ด ์งํ๋ง โ finalize ์ KPI ์ฌ๊ณ์ฐ์ด ๊ณง\n * ์ด์ด์ง๋ฏ๋ก ์์คํ
๋ณ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์ ๋๋ ค์ค ํ์ ์์. ์คํจ๋ warning ๋ง.\n */\n private async runExternalDataScenarios(context: ResolverContext): Promise<void> {\n await this.runExternalDataScenariosWithResults(context)\n }\n\n /**\n * ํ๋ก์ ํธ์ ๋ชจ๋ KPI Value๋ค์ ๊ณ์ธต์ ์ผ๋ก ์ฌ๊ณ์ฐํฉ๋๋ค.\n * 1. ๊ธฐ์กด KPI Value ์ญ์ (์ค๋ณต ๋ฐฉ์ง)\n * 2. Leaf KPIs (์์์ด ์๋ KPI): formula ๊ธฐ๋ฐ ๊ณ์ฐ\n * 3. Parent KPIs (์์์ด ์๋ KPI): ์์ KPI scores์ weighted average ๊ณ์ฐ\n */\n private async recalculateProjectKpiValues(projectId: string, context: ResolverContext): Promise<void> {\n const { domain, user, tx } = context.state\n const kpiValueRepo = getRepository(KpiValue, tx)\n const kpiRepo = getRepository(Kpi, tx)\n\n try {\n // 1. ๊ธฐ์กด KPI Value ์ญ์ (์ฌ๊ณ์ฐ์ผ๋ก ์ธํ ์ค๋ณต ๋ฐฉ์ง)\n const existingKpiValues = await kpiValueRepo.find({\n where: {\n group: projectId,\n domain: { id: domain.id }\n }\n })\n\n if (existingKpiValues.length > 0) {\n await kpiValueRepo.remove(existingKpiValues)\n console.log(`Deleted ${existingKpiValues.length} existing KPI values for project ${projectId}`)\n }\n\n // 2. ๋ชจ๋ KPI๋ค์ ์กฐํ (๊ณ์ธต ๊ตฌ์กฐ ํฌํจ)\n const allKpis = await kpiRepo.find({\n relations: ['parent', 'children']\n })\n\n console.log(`Found ${allKpis.length} KPIs total for domain`)\n\n // 3. Leaf KPIs (์์์ด ์๋ KPI)์ Parent KPIs ๊ตฌ๋ถ\n const leafKpis = allKpis.filter(kpi => kpi.isLeaf || !kpi.children || kpi.children.length === 0)\n const parentKpis = allKpis.filter(kpi => !kpi.isLeaf && kpi.children && kpi.children.length > 0)\n\n console.log(`Processing ${leafKpis.length} leaf KPIs and ${parentKpis.length} parent KPIs`)\n\n // 4. ๋จผ์ Leaf KPIs๋ฅผ formula๋ก ๊ณ์ฐ\n for (const leafKpi of leafKpis) {\n try {\n await this.recalculateLeafKpiValue(leafKpi, projectId, context)\n console.log(`Successfully calculated leaf KPI: ${leafKpi.name}`)\n } catch (error) {\n console.error(`Failed to calculate leaf KPI ${leafKpi.name}:`, error.message)\n // ๊ฐ๋ณ KPI ๊ณ์ฐ ์คํจ๋ ์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ์ค๋จํ์ง ์์\n }\n }\n\n // 5. Parent KPIs๋ฅผ ๊ณ์ธต ๋ ๋ฒจ์์ผ๋ก ์ ๋ ฌ (๊น์ ๋ ๋ฒจ๋ถํฐ)\n const sortedParentKpis = this.sortKpisByLevel(parentKpis, allKpis)\n\n // 6. Parent KPIs๋ฅผ weighted average๋ก ๊ณ์ฐ\n for (const parentKpi of sortedParentKpis) {\n try {\n await this.recalculateParentKpiValue(parentKpi, projectId, allKpis, context)\n console.log(`Successfully calculated parent KPI: ${parentKpi.name}`)\n } catch (error) {\n console.error(`Failed to calculate parent KPI ${parentKpi.name}:`, error.message)\n }\n }\n } catch (error) {\n console.error(`Error recalculating KPI values for project ${projectId}:`, error)\n throw error\n }\n }\n\n /**\n * ๊ฐ๋ณ KPI Value๋ฅผ ์ฌ๊ณ์ฐํฉ๋๋ค.\n * ํญ์ ์ต์ ๋ฒ์ ์ KPI๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐํฉ๋๋ค.\n */\n private async recalculateKpiValue(kpiValue: KpiValue, context: ResolverContext): Promise<KpiValue> {\n const { domain, user, tx } = context.state\n const kpiValueRepo = getRepository(KpiValue, tx)\n const kpiRepo = getRepository(Kpi, tx)\n const metricRepo = getRepository(KpiMetric, tx)\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n\n // ํญ์ ์ต์ ๋ฒ์ ์ KPI๋ฅผ ์กฐํํ์ฌ ์ฌ์ฉ\n // kpiValue.kpi๊ฐ ์ด๋ฏธ ๋ก๋๋์ด ์์ผ๋ฉด ์ฌ์ฉํ๊ณ , ์์ผ๋ฉด DB์์ ์ต์ ๋ฒ์ ์กฐํ\n const kpi =\n kpiValue.kpi ||\n (await kpiRepo.findOne({\n where: { id: kpiValue.kpiId },\n order: { version: 'DESC' }\n }))\n if (!kpi) throw new Error('KPI ์ ๋ณด ์์')\n if (!kpi.formula) {\n console.log(`KPI ${kpi.name} has no formula, skipping recalculation`)\n return kpiValue\n }\n\n const periodType = kpi.periodType || KpiPeriodType.DAY\n const valueDate = null // kpiValue.valueDate\n const org = kpiValue.group || 'unknown' // project ID๋ฅผ org๋ก ์ฌ์ฉ\n\n // things-factory calculator ๊ธฐ๋ฐ formula ๊ณ์ฐ\n let kpiValueResult: number\n try {\n const ast = parseFormula(kpi.formula)\n const provider = new KpiMetricValueProvider({\n valueDate,\n org,\n domainId: domain.id,\n tx\n })\n const evalContext = { functions: builtinFunctions, provider }\n kpiValueResult = await evaluateFormula(ast, evalContext)\n\n if (kpiValueResult == null || isNaN(kpiValueResult)) {\n throw new Error('KPI formula ๊ฒฐ๊ณผ๊ฐ ์์')\n }\n } catch (error) {\n console.error(`Formula evaluation failed for KPI ${kpi.name}: ${kpi.formula}`, error)\n return kpiValue // ๊ณ์ฐ ์คํจ์ ๊ธฐ์กด ๊ฐ ์ ์ง\n }\n\n // KPI Value ์
๋ฐ์ดํธ (์ต์ ๋ฒ์ ์ผ๋ก)\n kpiValue.value = kpiValueResult\n kpiValue.version = kpi.version || 1\n kpiValue.updater = user\n\n // ์ฑ๊ณผ ์ ์ ์๋ ๊ณ์ฐ ๋ฐ ์ ์ฅ\n try {\n // 2D lookup KPI (X13 ๋ฑ)์ธ ๊ฒฝ์ฐ project์ totalProgress ์กฐํ\n let scoreContext: { progressRate?: number } | undefined\n const gradesData = kpi.grades as any\n if (gradesData && !Array.isArray(gradesData) && gradesData.type === 'PROGRESS_DEVIATION_LOOKUP') {\n const projectId = kpiValue.group || org\n const projectRepo = getRepository(Project, tx)\n const project = await projectRepo.findOne({ where: { id: projectId } })\n scoreContext = { progressRate: project?.totalProgress ?? 50 }\n console.log(`2D lookup KPI ${kpi.name}: progressRate=${scoreContext.progressRate}%`)\n }\n\n await this.calculateAndSaveScore(kpiValue, kpi, scoreContext)\n console.log(`Successfully calculated score for KPI value ${kpiValue.id}`)\n } catch (scoreError) {\n console.error(`Failed to calculate score for KPI value ${kpiValue.id}:`, scoreError.message)\n // ์ฑ๊ณผ ์ ์ ๊ณ์ฐ ์คํจ๋ KPI Value ์ ์ฅ์ ๋ง์ง ์์\n }\n\n return await kpiValueRepo.save(kpiValue)\n }\n\n /**\n * scoreFormula๋ฅผ ์ฌ์ฉํ ์ฑ๊ณผ ์ ์ ๊ณ์ฐ\n */\n private async calculateScoreFromFormula(kpi: Kpi, value: number): Promise<{ score: number; calculationMethod: string } | null> {\n if (!kpi.scoreFormula) {\n return null\n }\n\n try {\n const ast = parseFormula(kpi.scoreFormula)\n const provider = {\n get: async (name: string) => {\n if (name === 'value') return value\n return null\n }\n }\n const evalContext = { functions: builtinFunctions, provider }\n const result = await evaluateFormula(ast, evalContext)\n\n if (result !== null && result !== undefined && !isNaN(result)) {\n const performanceScore = Number(result)\n\n return {\n score: performanceScore,\n calculationMethod: 'formula'\n }\n }\n } catch (error) {\n console.error(`Score formula evaluation for '${kpi.name}: ${kpi.scoreFormula}' error:`, error)\n }\n\n return null\n }\n\n /**\n * KPI์ grades lookup table์ ์ด์ฉํ ์ฑ๊ณผ ์ ์ ๋ณํ\n * 1D (๊ธฐ์กด ๋ฐฐ์ด) ๋ฐ 2D (X13 ๊ณต์ ๋ฅ รํธ์ฐจ) lookup ๋ชจ๋ ์ง์\n */\n private calculateScoreFromLookup(\n kpi: Kpi,\n value: number,\n context?: { progressRate?: number }\n ): { score: number; calculationMethod: string } | null {\n if (!kpi.grades) {\n return null\n }\n\n // 2D lookup table ์ฒ๋ฆฌ (X13: ๊ณต์ ๋ฅ ร ํธ์ฐจ โ ์ ์)\n const grades = kpi.grades as any\n if (!Array.isArray(grades) && grades.type === 'PROGRESS_DEVIATION_LOOKUP') {\n return this.calculateScoreFrom2DLookup(value, grades, context?.progressRate)\n }\n\n // 1D lookup table ์ฒ๋ฆฌ (๊ธฐ์กด)\n if (!Array.isArray(grades) || grades.length === 0) {\n return null\n }\n\n const grade = grades.find((g: any) => value >= g.minValue && value <= g.maxValue)\n if (!grade) {\n return null\n }\n\n return {\n score: grade.score,\n calculationMethod: 'lookup'\n }\n }\n\n /**\n * 2D lookup table์์ ์ ์ ๊ณ์ฐ (X13: ๊ณต์ ๋ฅ ร ํธ์ฐจ โ ์ ์ 1~5)\n */\n private calculateScoreFrom2DLookup(\n deviationValue: number,\n grades: any,\n progressRate?: number\n ): { score: number; calculationMethod: string } | null {\n if (!grades.rows || !Array.isArray(grades.rows)) return null\n\n const progress = progressRate ?? 50\n const progressIndex = Math.min(99, Math.max(0, Math.floor(progress)))\n const row = grades.rows.find((r: any) => r.progressRate === progressIndex)\n if (!row) return null\n\n let score: number\n if (deviationValue < row.boundary5to4) {\n score = 5\n } else if (deviationValue < row.boundary4to3) {\n score = 4\n } else if (deviationValue < row.boundary3to2) {\n score = 3\n } else if (deviationValue < row.boundary2to1) {\n score = 2\n } else {\n score = 1\n }\n\n return { score, calculationMethod: 'PROGRESS_DEVIATION_LOOKUP' }\n }\n\n /**\n * KpiValue์ ์ฑ๊ณผ ์ ์ ๊ณ์ฐ ๋ฐ ์ ์ฅ\n * @param context.progressRate X13 ๋ฑ 2D lookup KPI์ ํ์ํ ๊ณต์ ๋ฅ (0~100)\n */\n private async calculateAndSaveScore(\n kpiValue: KpiValue,\n kpi: Kpi,\n context?: { progressRate?: number }\n ): Promise<void> {\n // 1. scoreFormula ์ฐ์ ์๋\n let scoreResult = await this.calculateScoreFromFormula(kpi, kpiValue.value)\n\n // 2. scoreFormula๊ฐ ์๊ฑฐ๋ ์คํจํ๋ฉด grades lookup table ์ฌ์ฉ\n if (!scoreResult) {\n scoreResult = this.calculateScoreFromLookup(kpi, kpiValue.value, context)\n }\n\n if (scoreResult) {\n // KpiValue์ score ํ๋์ ์ฑ๊ณผ ์ ์ ์ ์ฅ\n kpiValue.score = scoreResult.score\n console.log(`Calculated score ${scoreResult.score} for KPI ${kpi.name} with method ${scoreResult.calculationMethod}`)\n } else {\n console.log(`No score calculation method available for KPI ${kpi.name}`)\n }\n }\n\n /**\n * Leaf KPI Value๋ฅผ formula๋ก ๊ณ์ฐํฉ๋๋ค.\n * ์ฐธ๊ณ : recalculateProjectKpiValues์์ ํธ์ถ ์ ๊ธฐ์กด ๊ฐ์ด ์ด๋ฏธ ์ญ์ ๋์์ผ๋ฏ๋ก ํญ์ ์๋ก ์์ฑ๋ฉ๋๋ค.\n */\n private async recalculateLeafKpiValue(kpi: Kpi, projectId: string, context: ResolverContext): Promise<void> {\n const { domain, user, tx } = context.state\n const kpiValueRepo = getRepository(KpiValue, tx)\n\n // ๊ธฐ์กด KPI Value ์กฐํ ๋๋ ์์ฑ (ํ๋ก์ ํธ ์ฌ๊ณ์ฐ ์์๋ ์ด๋ฏธ ์ญ์ ๋์ด ํญ์ ์๋ก ์์ฑ๋จ)\n let kpiValue = await kpiValueRepo.findOne({\n where: {\n kpi: { id: kpi.id },\n group: projectId,\n domain: { id: domain.id }\n }\n })\n\n if (!kpiValue) {\n // ์ KPI Value ์์ฑ\n kpiValue = kpiValueRepo.create({\n kpi,\n version: kpi.version || 1,\n group: projectId,\n domain,\n valueDate: new Date().toISOString().slice(0, 10),\n value: 0,\n score: 0,\n updater: user\n })\n }\n\n // formula ๊ธฐ๋ฐ ๊ณ์ฐ\n await this.recalculateKpiValue(kpiValue, context)\n }\n\n /**\n * Parent KPI Value๋ฅผ ๊ณ์ฐํฉ๋๋ค.\n * 1. formula๊ฐ ์์ผ๋ฉด ์์ KPI ๊ฐ๋ค์ ๋ณ์๋ก ์ฌ์ฉํ์ฌ formula ๊ณ์ฐ\n * 2. formula๊ฐ ์์ผ๋ฉด ์์ KPI scores์ weighted average๋ก ๊ณ์ฐ\n * ์ฐธ๊ณ : recalculateProjectKpiValues์์ ํธ์ถ ์ ๊ธฐ์กด ๊ฐ์ด ์ด๋ฏธ ์ญ์ ๋์์ผ๋ฏ๋ก ํญ์ ์๋ก ์์ฑ๋ฉ๋๋ค.\n */\n private async recalculateParentKpiValue(\n parentKpi: Kpi,\n projectId: string,\n allKpis: Kpi[],\n context: ResolverContext\n ): Promise<void> {\n const { domain, user, tx } = context.state\n const kpiValueRepo = getRepository(KpiValue, tx)\n\n // ์์ KPIs ์กฐํ\n const childKpis = allKpis.filter(kpi => kpi.parent?.id === parentKpi.id)\n\n if (childKpis.length === 0) {\n console.log(`No child KPIs found for parent KPI: ${parentKpi.name}`)\n return\n }\n\n // ์์ KPI Values ์กฐํ\n const childKpiIds = childKpis.map(kpi => kpi.id)\n const childKpiValues = await kpiValueRepo.find({\n where: {\n kpi: { id: In(childKpiIds) },\n group: projectId,\n domain: { id: domain.id }\n },\n relations: ['kpi']\n })\n\n if (childKpiValues.length === 0) {\n console.log(`No child KPI values found for parent KPI: ${parentKpi.name}`)\n return\n }\n\n let calculatedValue: number\n let calculatedScore: number\n\n // 1. formula๊ฐ ์์ผ๋ฉด formula๋ก ๊ณ์ฐ\n if (parentKpi.formula) {\n try {\n const ast = parseFormula(parentKpi.formula)\n\n // ์์ KPI ์ด๋ฆ -> score ๊ฐ ๋งคํ์ ์ํ provider\n const childKpiScoreMap: Record<string, number> = {}\n childKpiValues.forEach(kpiValue => {\n const childKpi = childKpis.find(k => k.id === kpiValue.kpi.id)\n if (childKpi) {\n childKpiScoreMap[childKpi.name] = kpiValue.score ?? 0\n }\n })\n\n const provider = {\n get: async (name: string) => {\n const value = childKpiScoreMap[name]\n if (value === undefined) {\n throw new Error(`Child KPI '${name}' not found in parent KPI formula`)\n }\n return value\n }\n }\n\n const evalContext = { functions: builtinFunctions, provider }\n const result = await evaluateFormula(ast, evalContext)\n\n calculatedValue = result\n calculatedScore = result\n\n console.log(`Calculated parent KPI ${parentKpi.name} using formula: value=${calculatedValue.toFixed(4)}`)\n } catch (error) {\n console.error(`Failed to evaluate formula for parent KPI ${parentKpi.name}:`, error)\n // formula ๊ณ์ฐ ์คํจ ์ ๊ฐ์ค์น ํ๊ท ์ผ๋ก ๋์ฒด\n const { weightedValue, weightedScore } = this.calculateWeightedAverage(childKpiValues, childKpis)\n calculatedValue = weightedValue\n calculatedScore = weightedScore\n console.log(`Fallback to weighted average for parent KPI ${parentKpi.name}`)\n }\n } else {\n // 2. formula๊ฐ ์์ผ๋ฉด ๊ฐ์ค์น ํ๊ท ๊ณ์ฐ\n const { weightedValue, weightedScore } = this.calculateWeightedAverage(childKpiValues, childKpis)\n calculatedValue = weightedValue\n calculatedScore = weightedScore\n console.log(`Calculated parent KPI ${parentKpi.name} using weighted average`)\n }\n\n // ๊ธฐ์กด Parent KPI Value ์กฐํ ๋๋ ์์ฑ (ํ๋ก์ ํธ ์ฌ๊ณ์ฐ ์์๋ ์ด๋ฏธ ์ญ์ ๋์ด ํญ์ ์๋ก ์์ฑ๋จ)\n let parentKpiValue = await kpiValueRepo.findOne({\n where: {\n kpi: { id: parentKpi.id },\n group: projectId,\n domain: { id: domain.id }\n }\n })\n\n if (parentKpiValue) {\n // ๊ธฐ์กด ๊ฐ ์
๋ฐ์ดํธ (์ต์ ๋ฒ์ ์ผ๋ก)\n parentKpiValue.value = calculatedValue\n parentKpiValue.score = calculatedScore\n parentKpiValue.version = parentKpi.version || 1\n parentKpiValue.updater = user\n } else {\n // ์ ๊ฐ ์์ฑ\n parentKpiValue = kpiValueRepo.create({\n kpi: parentKpi,\n group: projectId,\n version: parentKpi.version || 1,\n domain,\n valueDate: new Date().toISOString().slice(0, 10),\n value: calculatedValue,\n score: calculatedScore,\n updater: user\n })\n }\n\n await kpiValueRepo.save(parentKpiValue)\n console.log(`Updated parent KPI ${parentKpi.name}: value=${calculatedValue.toFixed(4)}, score=${calculatedScore.toFixed(4)}`)\n }\n\n /**\n * KPIs๋ฅผ ๊ณ์ธต ๋ ๋ฒจ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค (๊น์ ๋ ๋ฒจ๋ถํฐ)\n */\n private sortKpisByLevel(parentKpis: Kpi[], allKpis: Kpi[]): Kpi[] {\n const kpiLevels = new Map<string, number>()\n\n const calculateLevel = (kpi: Kpi): number => {\n if (kpiLevels.has(kpi.id)) {\n return kpiLevels.get(kpi.id)!\n }\n\n if (!kpi.parent) {\n kpiLevels.set(kpi.id, 0)\n return 0\n }\n\n const parentKpi = allKpis.find(k => k.id === kpi.parent?.id)\n if (!parentKpi) {\n kpiLevels.set(kpi.id, 1)\n return 1\n }\n\n const level = calculateLevel(parentKpi) + 1\n kpiLevels.set(kpi.id, level)\n return level\n }\n\n // ๊ฐ parent KPI์ ๋ ๋ฒจ ๊ณ์ฐ\n parentKpis.forEach(kpi => calculateLevel(kpi))\n\n // ๋ ๋ฒจ ์์ผ๋ก ์ ๋ ฌ (๊น์ ๋ ๋ฒจ๋ถํฐ)\n return parentKpis.sort((a, b) => (kpiLevels.get(b.id) || 0) - (kpiLevels.get(a.id) || 0))\n }\n\n /**\n * ์์ KPI values์ weighted average๋ฅผ ๊ณ์ฐํฉ๋๋ค.\n */\n private calculateWeightedAverage(childValues: any[], childKpis: Kpi[]): { weightedValue: number; weightedScore: number } {\n let totalWeightedValue = 0\n let totalWeightedScore = 0\n let totalWeight = 0\n\n for (const value of childValues) {\n const childKpi = childKpis.find(kpi => kpi.id === value.kpi.id)\n const weight = childKpi?.weight || 1\n\n totalWeightedValue += value.score * weight /* value.score ๊ฐ value ์ญํ ์ value.value ๊ฐ ์๋๋ผ value.score ๊ฐ ๋ง๋ค. */\n totalWeightedScore += value.score * weight\n totalWeight += weight\n }\n\n if (totalWeight === 0) {\n return { weightedValue: 0, weightedScore: 0 }\n }\n\n return {\n weightedValue: totalWeightedValue / totalWeight,\n weightedScore: totalWeightedScore / totalWeight\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ListParam } from '@things-factory/shell';
|
|
2
|
+
import { KpiMetricValue, KpiMetricValueList } from '@things-factory/kpi';
|
|
3
|
+
import { Project } from '@dssp/project';
|
|
4
|
+
export declare class KpiMetricValueQuery {
|
|
5
|
+
kpiMetricValues(params: ListParam, context: ResolverContext): Promise<KpiMetricValueList>;
|
|
6
|
+
project(kpiMetricValue: KpiMetricValue): Promise<Project | null>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KpiMetricValueQuery = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const type_graphql_1 = require("type-graphql");
|
|
6
|
+
const shell_1 = require("@things-factory/shell");
|
|
7
|
+
const kpi_1 = require("@things-factory/kpi");
|
|
8
|
+
const domain_inheritance_js_1 = require("@things-factory/kpi/dist-server/service/utils/domain-inheritance.js");
|
|
9
|
+
const project_1 = require("@dssp/project");
|
|
10
|
+
let KpiMetricValueQuery = class KpiMetricValueQuery {
|
|
11
|
+
async kpiMetricValues(params, context) {
|
|
12
|
+
const { domain } = context.state;
|
|
13
|
+
// multi-level ๋ถ๋ชจ ๋๋ฉ์ธ๊น์ง ํฌํจ. things-factory ์ KpiMetricValueQuery ์ ๋์ผ ํจํด.
|
|
14
|
+
// SYSTEM โ ํ๋ก์ ํธ ํ
๋ํธ ๊ณ์ธต์์ ์ ์๊ฐ ๋ถ๋ชจ์ ์๊ณ ๊ฐ์ด ์์์ ์์ด๋ ํฉ์ณ ๋ณด์.
|
|
15
|
+
const domainIds = await (0, domain_inheritance_js_1.getDomainIdsWithAncestors)(domain);
|
|
16
|
+
const queryBuilder = (0, shell_1.getQueryBuilderFromListParams)({
|
|
17
|
+
domain: undefined, // ๋๋ฉ์ธ ํํฐ๋ ์๋์์ IN ์ ๋ก ์ง์ ์ถ๊ฐ
|
|
18
|
+
params,
|
|
19
|
+
repository: await (0, shell_1.getRepository)(kpi_1.KpiMetricValue),
|
|
20
|
+
searchables: ['metricId', 'group', 'valueDate', 'org']
|
|
21
|
+
});
|
|
22
|
+
queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {
|
|
23
|
+
ancestorDomainIds: domainIds
|
|
24
|
+
});
|
|
25
|
+
const [items, total] = await queryBuilder.getManyAndCount();
|
|
26
|
+
return { items, total };
|
|
27
|
+
}
|
|
28
|
+
async project(kpiMetricValue) {
|
|
29
|
+
if (!kpiMetricValue.org)
|
|
30
|
+
return null;
|
|
31
|
+
try {
|
|
32
|
+
return await (0, shell_1.getRepository)(project_1.Project).findOneBy({ id: kpiMetricValue.org });
|
|
33
|
+
}
|
|
34
|
+
catch (_a) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
exports.KpiMetricValueQuery = KpiMetricValueQuery;
|
|
40
|
+
tslib_1.__decorate([
|
|
41
|
+
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "read", domainOwnerGranted: true, superUserGranted: true)'),
|
|
42
|
+
(0, type_graphql_1.Query)(returns => kpi_1.KpiMetricValueList, { description: 'To fetch multiple KpiMetricValues' }),
|
|
43
|
+
tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
|
|
44
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
45
|
+
tslib_1.__metadata("design:type", Function),
|
|
46
|
+
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
|
|
47
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
48
|
+
], KpiMetricValueQuery.prototype, "kpiMetricValues", null);
|
|
49
|
+
tslib_1.__decorate([
|
|
50
|
+
(0, type_graphql_1.FieldResolver)(type => project_1.Project, { nullable: true }),
|
|
51
|
+
tslib_1.__param(0, (0, type_graphql_1.Root)()),
|
|
52
|
+
tslib_1.__metadata("design:type", Function),
|
|
53
|
+
tslib_1.__metadata("design:paramtypes", [kpi_1.KpiMetricValue]),
|
|
54
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
55
|
+
], KpiMetricValueQuery.prototype, "project", null);
|
|
56
|
+
exports.KpiMetricValueQuery = KpiMetricValueQuery = tslib_1.__decorate([
|
|
57
|
+
(0, type_graphql_1.Resolver)(kpi_1.KpiMetricValue)
|
|
58
|
+
], KpiMetricValueQuery);
|
|
59
|
+
//# sourceMappingURL=kpi-metric-value-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kpi-metric-value-query.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-query.ts"],"names":[],"mappings":";;;;AAAA,+CAA8F;AAC9F,iDAAuG;AAEvG,6CAAwE;AACxE,+GAA+G;AAC/G,2CAAuC;AAGhC,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAGxB,AAAN,KAAK,CAAC,eAAe,CACM,MAAiB,EACnC,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,yEAAyE;QACzE,sDAAsD;QACtD,MAAM,SAAS,GAAG,MAAM,IAAA,iDAAyB,EAAC,MAAM,CAAC,CAAA;QAEzD,MAAM,YAAY,GAAG,IAAA,qCAA6B,EAAC;YACjD,MAAM,EAAE,SAAS,EAAE,2BAA2B;YAC9C,MAAM;YACN,UAAU,EAAE,MAAM,IAAA,qBAAa,EAAC,oBAAc,CAAC;YAC/C,WAAW,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC;SACvD,CAAC,CAAA;QAEF,YAAY,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,KAAK,oCAAoC,EAAE;YAC/E,iBAAiB,EAAE,SAAS;SAC7B,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAA;QAE3D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAS,cAA8B;QAClD,IAAI,CAAC,cAAc,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,IAAA,qBAAa,EAAC,iBAAO,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC,CAAA;QAC3E,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF,CAAA;AArCY,kDAAmB;AAGxB;IAFL,IAAA,wBAAS,EAAC,kGAAkG,CAAC;IAC7G,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,wBAAkB,EAAE,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC;IAExF,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IACvB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAD2B,iBAAS;;0DAsB3C;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACpC,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAiB,oBAAc;;kDAOnD;8BApCU,mBAAmB;IAD/B,IAAA,uBAAQ,EAAC,oBAAc,CAAC;GACZ,mBAAmB,CAqC/B","sourcesContent":["import { Directive, Resolver, Query, Args, Arg, Ctx, FieldResolver, Root } from 'type-graphql'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { KpiMetricValue, KpiMetricValueList } from '@things-factory/kpi'\nimport { getDomainIdsWithAncestors } from '@things-factory/kpi/dist-server/service/utils/domain-inheritance.js'\nimport { Project } from '@dssp/project'\n\n@Resolver(KpiMetricValue)\nexport class KpiMetricValueQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => KpiMetricValueList, { description: 'To fetch multiple KpiMetricValues' })\n async kpiMetricValues(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValueList> {\n const { domain } = context.state\n // multi-level ๋ถ๋ชจ ๋๋ฉ์ธ๊น์ง ํฌํจ. things-factory ์ KpiMetricValueQuery ์ ๋์ผ ํจํด.\n // SYSTEM โ ํ๋ก์ ํธ ํ
๋ํธ ๊ณ์ธต์์ ์ ์๊ฐ ๋ถ๋ชจ์ ์๊ณ ๊ฐ์ด ์์์ ์์ด๋ ํฉ์ณ ๋ณด์.\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain: undefined, // ๋๋ฉ์ธ ํํฐ๋ ์๋์์ IN ์ ๋ก ์ง์ ์ถ๊ฐ\n params,\n repository: await getRepository(KpiMetricValue),\n searchables: ['metricId', 'group', 'valueDate', 'org']\n })\n\n queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {\n ancestorDomainIds: domainIds\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Project, { nullable: true })\n async project(@Root() kpiMetricValue: KpiMetricValue): Promise<Project | null> {\n if (!kpiMetricValue.org) return null\n try {\n return await getRepository(Project).findOneBy({ id: kpiMetricValue.org })\n } catch {\n return null\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.subscribers = exports.resolvers = exports.entities = void 0;
|
|
4
|
+
const kpi_stat_query_1 = require("./kpi-stat-query");
|
|
5
|
+
exports.entities = [];
|
|
6
|
+
exports.resolvers = [kpi_stat_query_1.KpiStatQuery];
|
|
7
|
+
exports.subscribers = [];
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/index.ts"],"names":[],"mappings":";;;AAAA,qDAA+C;AAElC,QAAA,QAAQ,GAAG,EAAE,CAAA;AACb,QAAA,SAAS,GAAG,CAAC,6BAAY,CAAC,CAAA;AAC1B,QAAA,WAAW,GAAG,EAAE,CAAA","sourcesContent":["import { KpiStatQuery } from './kpi-stat-query'\n\nexport const entities = []\nexport const resolvers = [KpiStatQuery]\nexport const subscribers = []\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { KpiComprehensiveStats, KpiComprehensiveStatsByGeoGroup, KpiMonthlyTrend, KpiProjectStat } from './kpi-stat-types';
|
|
2
|
+
export declare class KpiStatQuery {
|
|
3
|
+
totalKpiZValueComprehensiveStats(startYearMonth?: string, endYearMonth?: string, sectorType?: string, buildingUsage?: string, context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
|
|
4
|
+
totalKpiYValueComprehensiveStats(startYearMonth?: string, endYearMonth?: string, sectorType?: string, buildingUsage?: string, context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
|
|
5
|
+
kpiZValueComprehensiveStatsByGeoGroup(geoGroup?: string, kpiName?: string, startYearMonth?: string, endYearMonth?: string, sectorType?: string, buildingUsage?: string, context?: ResolverContext): Promise<KpiComprehensiveStatsByGeoGroup[]>;
|
|
6
|
+
kpiYValueComprehensiveStatsByGeoGroup(geoGroup?: string, context?: ResolverContext): Promise<KpiComprehensiveStatsByGeoGroup[]>;
|
|
7
|
+
kpiZValueMonthlyTrendByGeoGroup(kpiName?: string, startYearMonth?: string, endYearMonth?: string, sectorType?: string, buildingUsage?: string, context?: ResolverContext): Promise<KpiMonthlyTrend[]>;
|
|
8
|
+
kpiProjectStats(sectorType?: string, buildingUsage?: string, kpiNamePattern?: string, startYearMonth?: string, endYearMonth?: string, context?: ResolverContext): Promise<KpiProjectStat[]>;
|
|
9
|
+
kpiZValueStatsBySigungu(kpiName?: string, startYearMonth?: string, endYearMonth?: string, sectorType?: string, buildingUsage?: string, context?: ResolverContext): Promise<KpiComprehensiveStatsByGeoGroup[]>;
|
|
10
|
+
kpiYValueStatsByGeoGroup(geoGroup: string, startYearMonth?: string, endYearMonth?: string, context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
|
|
11
|
+
kpiYValueStatsByMetroArea(metroArea: string, startYearMonth?: string, endYearMonth?: string, context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
|
|
12
|
+
}
|