@things-factory/kpi 1.0.0-alpha.5 → 9.0.9
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/README.md +74 -0
- package/client/pages/kpi/kpi-list-page.ts +97 -47
- package/client/pages/kpi/kpi-overview-sample.ts +260 -0
- package/client/pages/kpi/kpi-overview.ts +271 -0
- package/client/pages/kpi-category/kpi-category-list-page.ts +39 -50
- package/client/pages/kpi-dashboard/kpi-alert-panel.ts +114 -0
- package/client/pages/kpi-dashboard/kpi-dashboard.ts +285 -0
- package/client/pages/kpi-dashboard/kpi-grade-visualization.ts +75 -0
- package/client/pages/kpi-dashboard/kpi-history-viewer.ts +58 -0
- package/client/pages/kpi-dashboard/kpi-list-summary.ts +100 -0
- package/client/pages/kpi-dashboard/kpi-performance-summary.ts +124 -0
- package/client/pages/kpi-dashboard/kpi-value-entry.ts +78 -0
- package/client/pages/kpi-grade/kpi-grade-list-page.ts +58 -68
- package/client/pages/kpi-history/kpi-history-list-page.ts +146 -0
- package/client/pages/kpi-metric/kpi-metric-list-page.ts +67 -63
- package/client/pages/kpi-value/kpi-value-list-page.ts +73 -72
- package/client/pages/kpi-value/kpi-value-manual-entry-form.ts +168 -0
- package/client/pages/kpi-value/kpi-value-manual-entry-page.ts +173 -0
- package/client/route.ts +35 -0
- package/dist-client/pages/kpi/kpi-importer.js +16 -17
- package/dist-client/pages/kpi/kpi-importer.js.map +1 -1
- package/dist-client/pages/kpi/kpi-list-page.js +128 -68
- package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
- package/dist-client/pages/kpi/kpi-overview-sample.d.ts +36 -0
- package/dist-client/pages/kpi/kpi-overview-sample.js +264 -0
- package/dist-client/pages/kpi/kpi-overview-sample.js.map +1 -0
- package/dist-client/pages/kpi/kpi-overview.d.ts +14 -0
- package/dist-client/pages/kpi/kpi-overview.js +290 -0
- package/dist-client/pages/kpi/kpi-overview.js.map +1 -0
- package/dist-client/pages/kpi-category/kpi-category-importer.js +16 -17
- package/dist-client/pages/kpi-category/kpi-category-importer.js.map +1 -1
- package/dist-client/pages/kpi-category/kpi-category-list-page.js +70 -71
- package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
- package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +128 -0
- package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +24 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +305 -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 +139 -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-grade/kpi-grade-importer.js +16 -17
- package/dist-client/pages/kpi-grade/kpi-grade-importer.js.map +1 -1
- package/dist-client/pages/kpi-grade/kpi-grade-list-page.js +89 -89
- package/dist-client/pages/kpi-grade/kpi-grade-list-page.js.map +1 -1
- package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +16 -0
- package/dist-client/pages/kpi-history/kpi-history-list-page.js +155 -0
- package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -0
- package/dist-client/pages/kpi-metric/kpi-metric-importer.js +16 -17
- package/dist-client/pages/kpi-metric/kpi-metric-importer.js.map +1 -1
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +98 -84
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
- package/dist-client/pages/kpi-value/kpi-value-importer.js +16 -17
- package/dist-client/pages/kpi-value/kpi-value-importer.js.map +1 -1
- package/dist-client/pages/kpi-value/kpi-value-list-page.js +104 -93
- package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
- package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.d.ts +14 -0
- package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.js +201 -0
- package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.js.map +1 -0
- package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.d.ts +41 -0
- package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.js +180 -0
- package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.js.map +1 -0
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +27 -0
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/index.d.ts +2 -1
- package/dist-server/index.js +2 -1
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1752188906708-SeedKpiCategory.d.ts +5 -0
- package/dist-server/migrations/1752188906708-SeedKpiCategory.js +56 -0
- package/dist-server/migrations/1752188906708-SeedKpiCategory.js.map +1 -0
- package/dist-server/migrations/1752190849681-SeedKpi.d.ts +5 -0
- package/dist-server/migrations/1752190849681-SeedKpi.js +107 -0
- package/dist-server/migrations/1752190849681-SeedKpi.js.map +1 -0
- package/dist-server/migrations/1752191090459-SeedKpiGrade.d.ts +5 -0
- package/dist-server/migrations/1752191090459-SeedKpiGrade.js +271 -0
- package/dist-server/migrations/1752191090459-SeedKpiGrade.js.map +1 -0
- 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/routes.d.ts +1 -0
- package/dist-server/routes.js +48 -0
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/index.d.ts +3 -4
- package/dist-server/service/index.js +4 -6
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/kpi/aggregate-kpi.d.ts +8 -0
- package/dist-server/service/kpi/aggregate-kpi.js +88 -0
- package/dist-server/service/kpi/aggregate-kpi.js.map +1 -0
- package/dist-server/service/kpi/event-subscriber.d.ts +2 -0
- package/dist-server/service/kpi/event-subscriber.js +10 -0
- package/dist-server/service/kpi/event-subscriber.js.map +1 -1
- package/dist-server/service/kpi/index.d.ts +2 -1
- package/dist-server/service/kpi/kpi-formula.service.d.ts +24 -0
- package/dist-server/service/kpi/kpi-formula.service.js +64 -0
- package/dist-server/service/kpi/kpi-formula.service.js.map +1 -0
- package/dist-server/service/kpi/kpi-history.d.ts +6 -2
- package/dist-server/service/kpi/kpi-history.js +29 -11
- package/dist-server/service/kpi/kpi-history.js.map +1 -1
- package/dist-server/service/kpi/kpi-mutation.d.ts +2 -0
- package/dist-server/service/kpi/kpi-mutation.js +215 -10
- package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
- package/dist-server/service/kpi/kpi-query.d.ts +10 -0
- package/dist-server/service/kpi/kpi-query.js +87 -3
- package/dist-server/service/kpi/kpi-query.js.map +1 -1
- package/dist-server/service/kpi/kpi-type.d.ts +14 -3
- package/dist-server/service/kpi/kpi-type.js +81 -18
- package/dist-server/service/kpi/kpi-type.js.map +1 -1
- package/dist-server/service/kpi/kpi.d.ts +14 -3
- package/dist-server/service/kpi/kpi.js +96 -19
- package/dist-server/service/kpi/kpi.js.map +1 -1
- package/dist-server/service/kpi-alert/index.d.ts +2 -0
- package/dist-server/service/kpi-alert/index.js +6 -0
- package/dist-server/service/kpi-alert/index.js.map +1 -0
- package/dist-server/service/kpi-alert/kpi-alert-query.d.ts +4 -0
- package/dist-server/service/kpi-alert/kpi-alert-query.js +71 -0
- package/dist-server/service/kpi-alert/kpi-alert-query.js.map +1 -0
- package/dist-server/service/kpi-alert/kpi-alert-type.d.ts +8 -0
- package/dist-server/service/kpi-alert/kpi-alert-type.js +33 -0
- package/dist-server/service/kpi-alert/kpi-alert-type.js.map +1 -0
- package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +1 -1
- package/dist-server/service/kpi-category/kpi-category-mutation.js +36 -10
- package/dist-server/service/kpi-category/kpi-category-mutation.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-query.d.ts +2 -0
- package/dist-server/service/kpi-category/kpi-category-query.js +18 -2
- package/dist-server/service/kpi-category/kpi-category-query.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-type.d.ts +3 -5
- package/dist-server/service/kpi-category/kpi-category-type.js +16 -20
- package/dist-server/service/kpi-category/kpi-category-type.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category.d.ts +7 -9
- package/dist-server/service/kpi-category/kpi-category.js +40 -38
- package/dist-server/service/kpi-category/kpi-category.js.map +1 -1
- package/dist-server/service/kpi-grade/index.d.ts +1 -2
- package/dist-server/service/kpi-grade/index.js +2 -4
- package/dist-server/service/kpi-grade/index.js.map +1 -1
- package/dist-server/service/kpi-grade/kpi-grade-mutation.d.ts +1 -1
- package/dist-server/service/kpi-grade/kpi-grade-mutation.js +33 -10
- package/dist-server/service/kpi-grade/kpi-grade-mutation.js.map +1 -1
- package/dist-server/service/kpi-grade/kpi-grade-query.js +2 -2
- package/dist-server/service/kpi-grade/kpi-grade-query.js.map +1 -1
- package/dist-server/service/kpi-grade/kpi-grade-type.d.ts +13 -4
- package/dist-server/service/kpi-grade/kpi-grade-type.js +54 -18
- package/dist-server/service/kpi-grade/kpi-grade-type.js.map +1 -1
- package/dist-server/service/kpi-grade/kpi-grade.d.ts +8 -8
- package/dist-server/service/kpi-grade/kpi-grade.js +48 -40
- package/dist-server/service/kpi-grade/kpi-grade.js.map +1 -1
- package/dist-server/service/kpi-metric/aggregate-kpi-metric.d.ts +8 -0
- package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +134 -0
- package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -0
- package/dist-server/service/kpi-metric/index.d.ts +1 -2
- package/dist-server/service/kpi-metric/index.js +2 -4
- package/dist-server/service/kpi-metric/index.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric-mutation.d.ts +1 -1
- package/dist-server/service/kpi-metric/kpi-metric-mutation.js +139 -13
- package/dist-server/service/kpi-metric/kpi-metric-mutation.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric-query.js +3 -3
- package/dist-server/service/kpi-metric/kpi-metric-query.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +17 -4
- package/dist-server/service/kpi-metric/kpi-metric-type.js +69 -11
- package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric.d.ts +11 -8
- package/dist-server/service/kpi-metric/kpi-metric.js +62 -37
- package/dist-server/service/kpi-metric/kpi-metric.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-mutation.js +66 -11
- package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-query.d.ts +2 -0
- package/dist-server/service/kpi-value/kpi-value-query.js +15 -2
- package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-type.d.ts +19 -10
- package/dist-server/service/kpi-value/kpi-value-type.js +87 -24
- package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value.d.ts +15 -9
- package/dist-server/service/kpi-value/kpi-value.js +86 -32
- package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/implement-plan/01-entity-type-resolver.md +57 -0
- package/implement-plan/02-dataset-integration.md +35 -0
- package/implement-plan/03-kpivalue-automation.md +34 -0
- package/implement-plan/04-version-history.md +33 -0
- package/implement-plan/05-grade-visualization.md +33 -0
- package/implement-plan/06-graphql-frontend.md +30 -0
- package/implement-plan/07-test-docs.md +35 -0
- package/implement-plan/TODO.md +41 -0
- package/package.json +18 -6
- package/server/index.ts +2 -1
- package/server/migrations/1752188906708-SeedKpiCategory.ts +61 -0
- package/server/migrations/1752190849681-SeedKpi.ts +112 -0
- package/server/migrations/1752191090459-SeedKpiGrade.ts +270 -0
- package/server/migrations/index.ts +9 -0
- package/server/routes.ts +55 -0
- package/server/service/index.ts +4 -6
- package/server/service/kpi/aggregate-kpi.ts +82 -0
- package/server/service/kpi/event-subscriber.ts +12 -0
- package/server/service/kpi/kpi-formula.service.ts +63 -0
- package/server/service/kpi/kpi-history.ts +29 -21
- package/server/service/kpi/kpi-mutation.ts +194 -12
- package/server/service/kpi/kpi-query.ts +57 -2
- package/server/service/kpi/kpi-type.ts +72 -19
- package/server/service/kpi/kpi.ts +96 -20
- package/server/service/kpi-alert/index.ts +3 -0
- package/server/service/kpi-alert/kpi-alert-query.ts +59 -0
- package/server/service/kpi-alert/kpi-alert-type.ts +20 -0
- package/server/service/kpi-category/kpi-category-mutation.ts +17 -4
- package/server/service/kpi-category/kpi-category-query.ts +20 -3
- package/server/service/kpi-category/kpi-category-type.ts +17 -19
- package/server/service/kpi-category/kpi-category.ts +39 -37
- package/server/service/kpi-grade/index.ts +2 -4
- package/server/service/kpi-grade/kpi-grade-mutation.ts +13 -4
- package/server/service/kpi-grade/kpi-grade-query.ts +5 -2
- package/server/service/kpi-grade/kpi-grade-type.ts +46 -19
- package/server/service/kpi-grade/kpi-grade.ts +44 -38
- package/server/service/kpi-metric/aggregate-kpi-metric.ts +128 -0
- package/server/service/kpi-metric/index.ts +2 -4
- package/server/service/kpi-metric/kpi-metric-mutation.ts +123 -7
- package/server/service/kpi-metric/kpi-metric-query.ts +9 -3
- package/server/service/kpi-metric/kpi-metric-type.ts +56 -13
- package/server/service/kpi-metric/kpi-metric.ts +55 -35
- package/server/service/kpi-value/kpi-value-mutation.ts +52 -14
- package/server/service/kpi-value/kpi-value-query.ts +12 -2
- package/server/service/kpi-value/kpi-value-type.ts +80 -25
- package/server/service/kpi-value/kpi-value.ts +81 -29
- package/things-factory.config.js +12 -4
- package/translations/en.json +12 -1
- package/translations/ja.json +12 -1
- package/translations/ko.json +12 -1
- package/translations/ms.json +12 -1
- package/translations/zh.json +12 -1
- package/client/pages/kpe-metric/kpe-metric-importer.ts +0 -90
- package/client/pages/kpe-metric/kpe-metric-list-page.ts +0 -398
- package/client/pages/kpi-formula/kpi-formula-importer.ts +0 -90
- package/client/pages/kpi-formula/kpi-formula-list-page.ts +0 -398
- package/client/pages/metric/metric-importer.ts +0 -90
- package/client/pages/metric/metric-list-page.ts +0 -398
- package/dist-client/pages/kpe-metric/kpe-metric-importer.d.ts +0 -23
- package/dist-client/pages/kpe-metric/kpe-metric-importer.js +0 -93
- package/dist-client/pages/kpe-metric/kpe-metric-importer.js.map +0 -1
- package/dist-client/pages/kpe-metric/kpe-metric-list-page.d.ts +0 -66
- package/dist-client/pages/kpe-metric/kpe-metric-list-page.js +0 -370
- package/dist-client/pages/kpe-metric/kpe-metric-list-page.js.map +0 -1
- package/dist-client/pages/kpi-formula/kpi-formula-importer.d.ts +0 -23
- package/dist-client/pages/kpi-formula/kpi-formula-importer.js +0 -93
- package/dist-client/pages/kpi-formula/kpi-formula-importer.js.map +0 -1
- package/dist-client/pages/kpi-formula/kpi-formula-list-page.d.ts +0 -66
- package/dist-client/pages/kpi-formula/kpi-formula-list-page.js +0 -370
- package/dist-client/pages/kpi-formula/kpi-formula-list-page.js.map +0 -1
- package/dist-client/pages/metric/metric-importer.d.ts +0 -23
- package/dist-client/pages/metric/metric-importer.js +0 -93
- package/dist-client/pages/metric/metric-importer.js.map +0 -1
- package/dist-client/pages/metric/metric-list-page.d.ts +0 -66
- package/dist-client/pages/metric/metric-list-page.js +0 -370
- package/dist-client/pages/metric/metric-list-page.js.map +0 -1
- package/dist-server/service/kpi-formula/event-subscriber.d.ts +0 -7
- package/dist-server/service/kpi-formula/event-subscriber.js +0 -21
- package/dist-server/service/kpi-formula/event-subscriber.js.map +0 -1
- package/dist-server/service/kpi-formula/index.d.ts +0 -7
- package/dist-server/service/kpi-formula/index.js +0 -12
- package/dist-server/service/kpi-formula/index.js.map +0 -1
- package/dist-server/service/kpi-formula/kpi-formula-history.d.ts +0 -25
- package/dist-server/service/kpi-formula/kpi-formula-history.js +0 -128
- package/dist-server/service/kpi-formula/kpi-formula-history.js.map +0 -1
- package/dist-server/service/kpi-formula/kpi-formula-mutation.d.ts +0 -10
- package/dist-server/service/kpi-formula/kpi-formula-mutation.js +0 -128
- package/dist-server/service/kpi-formula/kpi-formula-mutation.js.map +0 -1
- package/dist-server/service/kpi-formula/kpi-formula-query.d.ts +0 -11
- package/dist-server/service/kpi-formula/kpi-formula-query.js +0 -79
- package/dist-server/service/kpi-formula/kpi-formula-query.js.map +0 -1
- package/dist-server/service/kpi-formula/kpi-formula-type.d.ts +0 -20
- package/dist-server/service/kpi-formula/kpi-formula-type.js +0 -77
- package/dist-server/service/kpi-formula/kpi-formula-type.js.map +0 -1
- package/dist-server/service/kpi-formula/kpi-formula.d.ts +0 -24
- package/dist-server/service/kpi-formula/kpi-formula.js +0 -109
- package/dist-server/service/kpi-formula/kpi-formula.js.map +0 -1
- package/dist-server/service/kpi-grade/event-subscriber.d.ts +0 -7
- package/dist-server/service/kpi-grade/event-subscriber.js +0 -21
- package/dist-server/service/kpi-grade/event-subscriber.js.map +0 -1
- package/dist-server/service/kpi-grade/kpi-grade-history.d.ts +0 -25
- package/dist-server/service/kpi-grade/kpi-grade-history.js +0 -128
- package/dist-server/service/kpi-grade/kpi-grade-history.js.map +0 -1
- package/dist-server/service/kpi-metric/event-subscriber.d.ts +0 -7
- package/dist-server/service/kpi-metric/event-subscriber.js +0 -21
- package/dist-server/service/kpi-metric/event-subscriber.js.map +0 -1
- package/dist-server/service/kpi-metric/kpi-metric-history.d.ts +0 -25
- package/dist-server/service/kpi-metric/kpi-metric-history.js +0 -128
- package/dist-server/service/kpi-metric/kpi-metric-history.js.map +0 -1
- package/server/service/kpi-formula/event-subscriber.ts +0 -17
- package/server/service/kpi-formula/index.ts +0 -9
- package/server/service/kpi-formula/kpi-formula-history.ts +0 -116
- package/server/service/kpi-formula/kpi-formula-mutation.ts +0 -137
- package/server/service/kpi-formula/kpi-formula-query.ts +0 -48
- package/server/service/kpi-formula/kpi-formula-type.ts +0 -55
- package/server/service/kpi-formula/kpi-formula.ts +0 -95
- package/server/service/kpi-grade/event-subscriber.ts +0 -17
- package/server/service/kpi-grade/kpi-grade-history.ts +0 -116
- package/server/service/kpi-metric/event-subscriber.ts +0 -17
- package/server/service/kpi-metric/kpi-metric-history.ts +0 -116
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
export * from './kpi/kpi';
|
|
2
2
|
export * from './kpi/kpi-type';
|
|
3
|
-
export * from './kpi-formula/kpi-formula';
|
|
4
|
-
export * from './kpi-formula/kpi-formula-type';
|
|
5
3
|
export * from './kpi-category/kpi-category';
|
|
6
4
|
export * from './kpi-category/kpi-category-type';
|
|
7
5
|
export * from './kpi-grade/kpi-grade';
|
|
@@ -10,7 +8,8 @@ export * from './kpi-value/kpi-value';
|
|
|
10
8
|
export * from './kpi-value/kpi-value-type';
|
|
11
9
|
export * from './kpi-metric/kpi-metric';
|
|
12
10
|
export * from './kpi-metric/kpi-metric-type';
|
|
13
|
-
export
|
|
11
|
+
export * from './kpi-alert';
|
|
12
|
+
export declare const entities: (typeof import("./kpi-category/kpi-category").KpiCategory | typeof import("./kpi/kpi").Kpi | typeof import("./kpi-grade/kpi-grade").KpiGrade | typeof import("./kpi-value/kpi-value").KpiValue | typeof import("./kpi-metric/kpi-metric").KpiMetric | typeof import("./kpi/kpi-history").KpiHistory)[];
|
|
14
13
|
export declare const schema: {
|
|
15
|
-
resolverClasses: (typeof import("./kpi/kpi-query").
|
|
14
|
+
resolverClasses: (typeof import("./kpi-alert/kpi-alert-query").KpiAlertQuery | typeof import("./kpi/kpi-query").KpiQuery | typeof import("./kpi/kpi-mutation").KpiMutation | typeof import("./kpi-category/kpi-category-query").KpiCategoryQuery | typeof import("./kpi-category/kpi-category-mutation").KpiCategoryMutation | typeof import("./kpi-grade/kpi-grade-query").KpiGradeQuery | typeof import("./kpi-grade/kpi-grade-mutation").KpiGradeMutation | typeof import("./kpi-value/kpi-value-query").KpiValueQuery | typeof import("./kpi-value/kpi-value-mutation").KpiValueMutation | typeof import("./kpi-metric/kpi-metric-query").KpiMetricQuery | typeof import("./kpi-metric/kpi-metric-mutation").KpiMetricMutation)[];
|
|
16
15
|
};
|
|
@@ -5,8 +5,6 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
/* EXPORT ENTITY TYPES */
|
|
6
6
|
tslib_1.__exportStar(require("./kpi/kpi"), exports);
|
|
7
7
|
tslib_1.__exportStar(require("./kpi/kpi-type"), exports);
|
|
8
|
-
tslib_1.__exportStar(require("./kpi-formula/kpi-formula"), exports);
|
|
9
|
-
tslib_1.__exportStar(require("./kpi-formula/kpi-formula-type"), exports);
|
|
10
8
|
tslib_1.__exportStar(require("./kpi-category/kpi-category"), exports);
|
|
11
9
|
tslib_1.__exportStar(require("./kpi-category/kpi-category-type"), exports);
|
|
12
10
|
tslib_1.__exportStar(require("./kpi-grade/kpi-grade"), exports);
|
|
@@ -15,17 +13,17 @@ tslib_1.__exportStar(require("./kpi-value/kpi-value"), exports);
|
|
|
15
13
|
tslib_1.__exportStar(require("./kpi-value/kpi-value-type"), exports);
|
|
16
14
|
tslib_1.__exportStar(require("./kpi-metric/kpi-metric"), exports);
|
|
17
15
|
tslib_1.__exportStar(require("./kpi-metric/kpi-metric-type"), exports);
|
|
16
|
+
tslib_1.__exportStar(require("./kpi-alert"), exports);
|
|
18
17
|
/* IMPORT ENTITIES AND RESOLVERS */
|
|
19
18
|
const kpi_1 = require("./kpi");
|
|
20
|
-
const kpi_formula_1 = require("./kpi-formula");
|
|
21
19
|
const kpi_category_1 = require("./kpi-category");
|
|
22
20
|
const kpi_grade_1 = require("./kpi-grade");
|
|
23
21
|
const kpi_value_1 = require("./kpi-value");
|
|
24
22
|
const kpi_metric_1 = require("./kpi-metric");
|
|
23
|
+
const kpi_alert_1 = require("./kpi-alert");
|
|
25
24
|
exports.entities = [
|
|
26
25
|
/* ENTITIES */
|
|
27
26
|
...kpi_1.entities,
|
|
28
|
-
...kpi_formula_1.entities,
|
|
29
27
|
...kpi_category_1.entities,
|
|
30
28
|
...kpi_grade_1.entities,
|
|
31
29
|
...kpi_value_1.entities,
|
|
@@ -35,11 +33,11 @@ exports.schema = {
|
|
|
35
33
|
resolverClasses: [
|
|
36
34
|
/* RESOLVER CLASSES */
|
|
37
35
|
...kpi_1.resolvers,
|
|
38
|
-
...kpi_formula_1.resolvers,
|
|
39
36
|
...kpi_category_1.resolvers,
|
|
40
37
|
...kpi_grade_1.resolvers,
|
|
41
38
|
...kpi_value_1.resolvers,
|
|
42
|
-
...kpi_metric_1.resolvers
|
|
39
|
+
...kpi_metric_1.resolvers,
|
|
40
|
+
...kpi_alert_1.resolvers
|
|
43
41
|
]
|
|
44
42
|
};
|
|
45
43
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,oDAAyB;AACzB,yDAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,oDAAyB;AACzB,yDAA8B;AAC9B,sEAA2C;AAC3C,2EAAgD;AAChD,gEAAqC;AACrC,qEAA0C;AAC1C,gEAAqC;AACrC,qEAA0C;AAC1C,kEAAuC;AACvC,uEAA4C;AAC5C,sDAA2B;AAE3B,mCAAmC;AACnC,+BAA0E;AAC1E,iDAAmG;AACnG,2CAA0F;AAC1F,2CAA0F;AAC1F,6CAA6F;AAC7F,2CAA4D;AAE/C,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,cAAW;IACd,GAAG,uBAAmB;IACtB,GAAG,oBAAgB;IACnB,GAAG,oBAAgB;IACnB,GAAG,qBAAiB;CACrB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,eAAY;QACf,GAAG,wBAAoB;QACvB,GAAG,qBAAiB;QACpB,GAAG,qBAAiB;QACpB,GAAG,sBAAkB;QACrB,GAAG,qBAAiB;KACrB;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './kpi/kpi'\nexport * from './kpi/kpi-type'\nexport * from './kpi-category/kpi-category'\nexport * from './kpi-category/kpi-category-type'\nexport * from './kpi-grade/kpi-grade'\nexport * from './kpi-grade/kpi-grade-type'\nexport * from './kpi-value/kpi-value'\nexport * from './kpi-value/kpi-value-type'\nexport * from './kpi-metric/kpi-metric'\nexport * from './kpi-metric/kpi-metric-type'\nexport * from './kpi-alert'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { entities as KpiEntities, resolvers as KpiResolvers } from './kpi'\nimport { entities as KpiCategoryEntities, resolvers as KpiCategoryResolvers } from './kpi-category'\nimport { entities as KpiGradeEntities, resolvers as KpiGradeResolvers } from './kpi-grade'\nimport { entities as KpiValueEntities, resolvers as KpiValueResolvers } from './kpi-value'\nimport { entities as KpiMetricEntities, resolvers as KpiMetricResolvers } from './kpi-metric'\nimport { resolvers as KpiAlertResolvers } from './kpi-alert'\n\nexport const entities = [\n /* ENTITIES */\n ...KpiEntities,\n ...KpiCategoryEntities,\n ...KpiGradeEntities,\n ...KpiValueEntities,\n ...KpiMetricEntities\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...KpiResolvers,\n ...KpiCategoryResolvers,\n ...KpiGradeResolvers,\n ...KpiValueResolvers,\n ...KpiMetricResolvers,\n ...KpiAlertResolvers\n ]\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KPI 단위 집계/산식 자동화 함수
|
|
3
|
+
* @param kpiId KPI ID
|
|
4
|
+
* @param domainId 도메인 ID
|
|
5
|
+
* @param context ResolverContext
|
|
6
|
+
* @returns 저장된 KPI Value 배열
|
|
7
|
+
*/
|
|
8
|
+
export declare function aggregateKpiValue(kpiId: string, domainId: string, context: ResolverContext): Promise<any[]>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.aggregateKpiValue = aggregateKpiValue;
|
|
4
|
+
const shell_1 = require("@things-factory/shell");
|
|
5
|
+
const kpi_1 = require("./kpi");
|
|
6
|
+
const kpi_metric_1 = require("../kpi-metric/kpi-metric");
|
|
7
|
+
const kpi_value_1 = require("../kpi-value/kpi-value");
|
|
8
|
+
const kpi_formula_service_1 = require("./kpi-formula.service");
|
|
9
|
+
const aggregate_kpi_metric_1 = require("../kpi-metric/aggregate-kpi-metric");
|
|
10
|
+
/**
|
|
11
|
+
* KPI 단위 집계/산식 자동화 함수
|
|
12
|
+
* @param kpiId KPI ID
|
|
13
|
+
* @param domainId 도메인 ID
|
|
14
|
+
* @param context ResolverContext
|
|
15
|
+
* @returns 저장된 KPI Value 배열
|
|
16
|
+
*/
|
|
17
|
+
async function aggregateKpiValue(kpiId, domainId, context) {
|
|
18
|
+
const tx = context.state?.tx || (0, shell_1.getRepository)(kpi_1.Kpi).manager;
|
|
19
|
+
// 1. KPI 정보 조회
|
|
20
|
+
const kpi = await (0, shell_1.getRepository)(kpi_1.Kpi).findOne({ where: { id: kpiId, domain: { id: domainId } } });
|
|
21
|
+
if (!kpi)
|
|
22
|
+
throw new Error('KPI 정보 없음');
|
|
23
|
+
if (!kpi.active)
|
|
24
|
+
throw new Error('비활성화된 KPI');
|
|
25
|
+
if (!kpi.formula)
|
|
26
|
+
throw new Error('KPI formula 없음');
|
|
27
|
+
// 2. formula 파싱 및 metric code별 값 집계
|
|
28
|
+
const formulaService = new kpi_formula_service_1.KpiFormulaService();
|
|
29
|
+
const metricCodes = formulaService.extractMetricCodes(kpi.formula);
|
|
30
|
+
const codeValueMap = {};
|
|
31
|
+
for (const code of metricCodes) {
|
|
32
|
+
// code로 metric 찾기
|
|
33
|
+
const metric = await (0, shell_1.getRepository)(kpi_metric_1.KpiMetric).findOne({ where: { name: code, domain: { id: domainId } } });
|
|
34
|
+
if (!metric)
|
|
35
|
+
throw new Error(`KPI formula metric '${code}' not found`);
|
|
36
|
+
codeValueMap[code] = await (0, aggregate_kpi_metric_1.aggregateKpiMetricValue)(metric.id, domainId, context);
|
|
37
|
+
}
|
|
38
|
+
// group/date/period별로 값 매핑(가장 최근 기준, group key 조합)
|
|
39
|
+
const groupKey = v => [v.date, v.period, v.group?.key01, v.group?.key02, v.group?.key03, v.group?.key04, v.group?.key05].join('|');
|
|
40
|
+
const groupMap = {};
|
|
41
|
+
for (const code of metricCodes) {
|
|
42
|
+
for (const v of codeValueMap[code]) {
|
|
43
|
+
const key = groupKey(v);
|
|
44
|
+
groupMap[key] = groupMap[key] || { ...v, _values: {} };
|
|
45
|
+
groupMap[key]._values[code] = v.value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// formula 계산 (js eval)
|
|
49
|
+
const savedValues = [];
|
|
50
|
+
for (const key in groupMap) {
|
|
51
|
+
const ctx = groupMap[key]._values;
|
|
52
|
+
let value = null;
|
|
53
|
+
try {
|
|
54
|
+
value = Function(...Object.keys(ctx), `return (${kpi.formula})`)(...Object.values(ctx));
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
value = null;
|
|
58
|
+
}
|
|
59
|
+
const valueDate = groupMap[key].date;
|
|
60
|
+
const groupId = groupMap[key].group?.key01;
|
|
61
|
+
const groupType = groupMap[key].group?.key02;
|
|
62
|
+
const version = kpi.version || 1;
|
|
63
|
+
if (value == null || isNaN(value))
|
|
64
|
+
continue;
|
|
65
|
+
// upsert(동일 KPI, valueDate, groupId, groupType, version) 기준으로 저장
|
|
66
|
+
const repo = (0, shell_1.getRepository)(kpi_value_1.KpiValue, context.state?.tx);
|
|
67
|
+
const existing = await repo.findOne({
|
|
68
|
+
where: { kpi: { id: kpi.id }, valueDate, groupId, groupType, version, domain: { id: domainId } }
|
|
69
|
+
});
|
|
70
|
+
let entity = existing || repo.create();
|
|
71
|
+
entity.kpi = kpi;
|
|
72
|
+
entity.kpiId = kpi.id;
|
|
73
|
+
entity.version = version;
|
|
74
|
+
entity.valueDate = valueDate;
|
|
75
|
+
entity.value = value;
|
|
76
|
+
entity.groupId = groupId;
|
|
77
|
+
entity.groupType = groupType;
|
|
78
|
+
entity.inputType = kpi_value_1.KpiValueInputType.AUTO;
|
|
79
|
+
entity.source = 'AUTO';
|
|
80
|
+
entity.domain = kpi.domain;
|
|
81
|
+
entity.creator = context.state?.user;
|
|
82
|
+
entity.updater = context.state?.user;
|
|
83
|
+
entity = await repo.save(entity);
|
|
84
|
+
savedValues.push(entity);
|
|
85
|
+
}
|
|
86
|
+
return savedValues;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=aggregate-kpi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate-kpi.js","sourceRoot":"","sources":["../../../server/service/kpi/aggregate-kpi.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { Kpi } from './kpi'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\nimport { KpiValue, KpiValueInputType } from '../kpi-value/kpi-value'\nimport { KpiFormulaService } from './kpi-formula.service'\nimport { aggregateKpiMetricValue } from '../kpi-metric/aggregate-kpi-metric'\n\n/**\n * KPI 단위 집계/산식 자동화 함수\n * @param kpiId KPI ID\n * @param domainId 도메인 ID\n * @param context ResolverContext\n * @returns 저장된 KPI Value 배열\n */\nexport async function aggregateKpiValue(kpiId: string, domainId: string, context: ResolverContext) {\n const tx = context.state?.tx || getRepository(Kpi).manager\n\n // 1. KPI 정보 조회\n const kpi = await getRepository(Kpi).findOne({ where: { id: kpiId, domain: { id: domainId } } })\n if (!kpi) throw new Error('KPI 정보 없음')\n if (!kpi.active) throw new Error('비활성화된 KPI')\n if (!kpi.formula) throw new Error('KPI formula 없음')\n\n // 2. formula 파싱 및 metric code별 값 집계\n const formulaService = new KpiFormulaService()\n const metricCodes = formulaService.extractMetricCodes(kpi.formula)\n const codeValueMap: Record<string, any[]> = {}\n for (const code of metricCodes) {\n // code로 metric 찾기\n const metric = await getRepository(KpiMetric).findOne({ where: { name: code, domain: { id: domainId } } })\n if (!metric) throw new Error(`KPI formula metric '${code}' not found`)\n codeValueMap[code] = await aggregateKpiMetricValue(metric.id, domainId, context)\n }\n // group/date/period별로 값 매핑(가장 최근 기준, group key 조합)\n const groupKey = v =>\n [v.date, v.period, v.group?.key01, v.group?.key02, v.group?.key03, v.group?.key04, v.group?.key05].join('|')\n const groupMap: Record<string, any> = {}\n for (const code of metricCodes) {\n for (const v of codeValueMap[code]) {\n const key = groupKey(v)\n groupMap[key] = groupMap[key] || { ...v, _values: {} }\n groupMap[key]._values[code] = v.value\n }\n }\n // formula 계산 (js eval)\n const savedValues = []\n for (const key in groupMap) {\n const ctx = groupMap[key]._values\n let value = null\n try {\n value = Function(...Object.keys(ctx), `return (${kpi.formula})`)(...Object.values(ctx))\n } catch (e) {\n value = null\n }\n const valueDate = groupMap[key].date\n const groupId = groupMap[key].group?.key01\n const groupType = groupMap[key].group?.key02\n const version = kpi.version || 1\n if (value == null || isNaN(value)) continue\n // upsert(동일 KPI, valueDate, groupId, groupType, version) 기준으로 저장\n const repo = getRepository(KpiValue, context.state?.tx)\n const existing = await repo.findOne({\n where: { kpi: { id: kpi.id }, valueDate, groupId, groupType, version, domain: { id: domainId } }\n })\n let entity = existing || repo.create()\n entity.kpi = kpi\n entity.kpiId = kpi.id\n entity.version = version\n entity.valueDate = valueDate\n entity.value = value\n entity.groupId = groupId\n entity.groupType = groupType\n entity.inputType = KpiValueInputType.AUTO\n entity.source = 'AUTO'\n entity.domain = kpi.domain\n entity.creator = context.state?.user\n entity.updater = context.state?.user\n entity = await repo.save(entity)\n savedValues.push(entity)\n }\n return savedValues\n}\n"]}
|
|
@@ -4,4 +4,6 @@ import { KpiHistory } from './kpi-history';
|
|
|
4
4
|
export declare class KpiHistoryEntitySubscriber extends HistoryEntitySubscriber<Kpi, KpiHistory> {
|
|
5
5
|
get entity(): typeof Kpi;
|
|
6
6
|
get historyEntity(): typeof KpiHistory;
|
|
7
|
+
afterInsert(event: any): Promise<void>;
|
|
8
|
+
afterUpdate(event: any): Promise<void>;
|
|
7
9
|
}
|
|
@@ -13,6 +13,16 @@ let KpiHistoryEntitySubscriber = class KpiHistoryEntitySubscriber extends typeor
|
|
|
13
13
|
get historyEntity() {
|
|
14
14
|
return kpi_history_1.KpiHistory;
|
|
15
15
|
}
|
|
16
|
+
async afterInsert(event) {
|
|
17
|
+
if (event.entity.state == 'RELEASE') {
|
|
18
|
+
await super.afterInsert(event);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async afterUpdate(event) {
|
|
22
|
+
if (event.entity.state == 'RELEASE') {
|
|
23
|
+
await super.afterUpdate(event);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
16
26
|
};
|
|
17
27
|
exports.KpiHistoryEntitySubscriber = KpiHistoryEntitySubscriber;
|
|
18
28
|
exports.KpiHistoryEntitySubscriber = KpiHistoryEntitySubscriber = tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-subscriber.js","sourceRoot":"","sources":["../../../server/service/kpi/event-subscriber.ts"],"names":[],"mappings":";;;;AAAA,qCAAyC;AAEzC,8DAAkE;AAElE,+BAA2B;AAC3B,+CAA0C;AAGnC,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,yCAAwC;IACtF,IAAW,MAAM;QACf,OAAO,SAAG,CAAA;IACZ,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,wBAAU,CAAA;IACnB,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"event-subscriber.js","sourceRoot":"","sources":["../../../server/service/kpi/event-subscriber.ts"],"names":[],"mappings":";;;;AAAA,qCAAyC;AAEzC,8DAAkE;AAElE,+BAA2B;AAC3B,+CAA0C;AAGnC,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,yCAAwC;IACtF,IAAW,MAAM;QACf,OAAO,SAAG,CAAA;IACZ,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,wBAAU,CAAA;IACnB,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAK;QAC5B,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC;YACpC,MAAM,KAAK,CAAC,WAAW,CAAC,KAAY,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAK;QAC5B,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC;YACpC,MAAM,KAAK,CAAC,WAAW,CAAC,KAAY,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;CACF,CAAA;AApBY,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,yBAAe,GAAE;GACL,0BAA0B,CAoBtC","sourcesContent":["import { EventSubscriber } from 'typeorm'\n\nimport { HistoryEntitySubscriber } from '@operato/typeorm-history'\n\nimport { Kpi } from './kpi'\nimport { KpiHistory } from './kpi-history'\n\n@EventSubscriber()\nexport class KpiHistoryEntitySubscriber extends HistoryEntitySubscriber<Kpi, KpiHistory> {\n public get entity() {\n return Kpi\n }\n\n public get historyEntity() {\n return KpiHistory\n }\n\n public async afterInsert(event): Promise<void> {\n if (event.entity.state == 'RELEASE') {\n await super.afterInsert(event as any)\n }\n }\n\n public async afterUpdate(event): Promise<void> {\n if (event.entity.state == 'RELEASE') {\n await super.afterUpdate(event as any)\n }\n }\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Kpi } from './kpi';
|
|
2
|
+
import { KpiHistory } from './kpi-history';
|
|
2
3
|
import { KpiHistoryEntitySubscriber } from './event-subscriber';
|
|
3
4
|
import { KpiQuery } from './kpi-query';
|
|
4
5
|
import { KpiMutation } from './kpi-mutation';
|
|
5
|
-
export declare const entities: (typeof Kpi)[];
|
|
6
|
+
export declare const entities: (typeof Kpi | typeof KpiHistory)[];
|
|
6
7
|
export declare const resolvers: (typeof KpiQuery | typeof KpiMutation)[];
|
|
7
8
|
export declare const subscribers: (typeof KpiHistoryEntitySubscriber)[];
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KPI formula 파싱/검증/매핑 유효성 검사 서비스
|
|
3
|
+
* - formula에서 Metric 코드(변수명) 추출
|
|
4
|
+
* - 각 Metric의 존재/매핑 유효성 검사
|
|
5
|
+
* - 구문 오류, 미정의 Metric, 매핑 오류 등 에러 리포팅
|
|
6
|
+
*/
|
|
7
|
+
export declare class KpiFormulaService {
|
|
8
|
+
/**
|
|
9
|
+
* formula 문자열에서 Metric 코드(변수명) 추출
|
|
10
|
+
* @param formula KPI formula (예: 'defect_count / total_count * 100')
|
|
11
|
+
* @returns string[] 추출된 Metric 코드 리스트
|
|
12
|
+
*/
|
|
13
|
+
extractMetricCodes(formula: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* formula 내 Metric 코드의 존재/매핑 유효성 검사 + 순환참조 검출
|
|
16
|
+
* @param formula KPI formula
|
|
17
|
+
* @param visited 순환참조 검출용 Set (재귀 호출 시 사용)
|
|
18
|
+
* @returns { valid: boolean, errors: string[] }
|
|
19
|
+
*/
|
|
20
|
+
validateFormula(formula: string, visited?: Set<string>): Promise<{
|
|
21
|
+
valid: boolean;
|
|
22
|
+
errors: string[];
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KpiFormulaService = void 0;
|
|
4
|
+
const shell_1 = require("@things-factory/shell");
|
|
5
|
+
const kpi_metric_1 = require("../kpi-metric/kpi-metric");
|
|
6
|
+
/**
|
|
7
|
+
* KPI formula 파싱/검증/매핑 유효성 검사 서비스
|
|
8
|
+
* - formula에서 Metric 코드(변수명) 추출
|
|
9
|
+
* - 각 Metric의 존재/매핑 유효성 검사
|
|
10
|
+
* - 구문 오류, 미정의 Metric, 매핑 오류 등 에러 리포팅
|
|
11
|
+
*/
|
|
12
|
+
class KpiFormulaService {
|
|
13
|
+
/**
|
|
14
|
+
* formula 문자열에서 Metric 코드(변수명) 추출
|
|
15
|
+
* @param formula KPI formula (예: 'defect_count / total_count * 100')
|
|
16
|
+
* @returns string[] 추출된 Metric 코드 리스트
|
|
17
|
+
*/
|
|
18
|
+
extractMetricCodes(formula) {
|
|
19
|
+
// 변수명: 알파벳/언더스코어로 시작, 숫자/알파벳/언더스코어 포함
|
|
20
|
+
const regex = /[a-zA-Z_][a-zA-Z0-9_]*/g;
|
|
21
|
+
// 숫자/예약어/연산자 제외(후처리 필요)
|
|
22
|
+
const reserved = new Set(['if', 'else', 'return', 'true', 'false']);
|
|
23
|
+
return Array.from(new Set((formula.match(regex) || []).filter(code => isNaN(Number(code)) && !reserved.has(code))));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* formula 내 Metric 코드의 존재/매핑 유효성 검사 + 순환참조 검출
|
|
27
|
+
* @param formula KPI formula
|
|
28
|
+
* @param visited 순환참조 검출용 Set (재귀 호출 시 사용)
|
|
29
|
+
* @returns { valid: boolean, errors: string[] }
|
|
30
|
+
*/
|
|
31
|
+
async validateFormula(formula, visited = new Set()) {
|
|
32
|
+
const errors = [];
|
|
33
|
+
const metricCodes = this.extractMetricCodes(formula);
|
|
34
|
+
const metricRepo = (0, shell_1.getRepository)(kpi_metric_1.KpiMetric);
|
|
35
|
+
for (const code of metricCodes) {
|
|
36
|
+
if (visited.has(code)) {
|
|
37
|
+
errors.push(`순환참조 감지: ${Array.from(visited).join(' → ')} → ${code}`);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
visited.add(code);
|
|
41
|
+
const metric = await metricRepo.findOne({ where: { name: code } });
|
|
42
|
+
if (!metric) {
|
|
43
|
+
errors.push(`Metric '${code}' is not defined.`);
|
|
44
|
+
visited.delete(code);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (!metric.dataSetId || !metric.fieldName) {
|
|
48
|
+
errors.push(`Metric '${code}' is not mapped to a dataset field.`);
|
|
49
|
+
}
|
|
50
|
+
// metric이 formula를 가지고 있다면 재귀적으로 순환참조 검증
|
|
51
|
+
if (metric.formula) {
|
|
52
|
+
const subResult = await this.validateFormula(metric.formula, new Set(visited));
|
|
53
|
+
if (!subResult.valid)
|
|
54
|
+
errors.push(...subResult.errors);
|
|
55
|
+
}
|
|
56
|
+
visited.delete(code);
|
|
57
|
+
}
|
|
58
|
+
// (선택) formula 구문 오류, 괄호 불일치 등 추가 검사 가능
|
|
59
|
+
// ...
|
|
60
|
+
return { valid: errors.length === 0, errors };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.KpiFormulaService = KpiFormulaService;
|
|
64
|
+
//# sourceMappingURL=kpi-formula.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kpi-formula.service.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-formula.service.ts"],"names":[],"mappings":";;;AAAA,iDAAqD;AACrD,yDAAoD;AAEpD;;;;;GAKG;AACH,MAAa,iBAAiB;IAC5B;;;;OAIG;IACH,kBAAkB,CAAC,OAAe;QAChC,sCAAsC;QACtC,MAAM,KAAK,GAAG,yBAAyB,CAAA;QACvC,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QACnE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACrH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CACnB,OAAe,EACf,UAAuB,IAAI,GAAG,EAAE;QAEhC,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;QACpD,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,sBAAS,CAAC,CAAA;QAC3C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;gBACpE,SAAQ;YACV,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACjB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;YAClE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,mBAAmB,CAAC,CAAA;gBAC/C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACpB,SAAQ;YACV,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,qCAAqC,CAAC,CAAA;YACnE,CAAC;YACD,yCAAyC;YACzC,IAAK,MAAc,CAAC,OAAO,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAE,MAAc,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;gBACvF,IAAI,CAAC,SAAS,CAAC,KAAK;oBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;YACxD,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;QACD,wCAAwC;QACxC,MAAM;QACN,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/C,CAAC;CACF;AArDD,8CAqDC","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\n\n/**\n * KPI formula 파싱/검증/매핑 유효성 검사 서비스\n * - formula에서 Metric 코드(변수명) 추출\n * - 각 Metric의 존재/매핑 유효성 검사\n * - 구문 오류, 미정의 Metric, 매핑 오류 등 에러 리포팅\n */\nexport class KpiFormulaService {\n /**\n * formula 문자열에서 Metric 코드(변수명) 추출\n * @param formula KPI formula (예: 'defect_count / total_count * 100')\n * @returns string[] 추출된 Metric 코드 리스트\n */\n extractMetricCodes(formula: string): string[] {\n // 변수명: 알파벳/언더스코어로 시작, 숫자/알파벳/언더스코어 포함\n const regex = /[a-zA-Z_][a-zA-Z0-9_]*/g\n // 숫자/예약어/연산자 제외(후처리 필요)\n const reserved = new Set(['if', 'else', 'return', 'true', 'false'])\n return Array.from(new Set((formula.match(regex) || []).filter(code => isNaN(Number(code)) && !reserved.has(code))))\n }\n\n /**\n * formula 내 Metric 코드의 존재/매핑 유효성 검사 + 순환참조 검출\n * @param formula KPI formula\n * @param visited 순환참조 검출용 Set (재귀 호출 시 사용)\n * @returns { valid: boolean, errors: string[] }\n */\n async validateFormula(\n formula: string,\n visited: Set<string> = new Set()\n ): Promise<{ valid: boolean; errors: string[] }> {\n const errors: string[] = []\n const metricCodes = this.extractMetricCodes(formula)\n const metricRepo = getRepository(KpiMetric)\n for (const code of metricCodes) {\n if (visited.has(code)) {\n errors.push(`순환참조 감지: ${Array.from(visited).join(' → ')} → ${code}`)\n continue\n }\n visited.add(code)\n const metric = await metricRepo.findOne({ where: { name: code } })\n if (!metric) {\n errors.push(`Metric '${code}' is not defined.`)\n visited.delete(code)\n continue\n }\n if (!metric.dataSetId || !metric.fieldName) {\n errors.push(`Metric '${code}' is not mapped to a dataset field.`)\n }\n // metric이 formula를 가지고 있다면 재귀적으로 순환참조 검증\n if ((metric as any).formula) {\n const subResult = await this.validateFormula((metric as any).formula, new Set(visited))\n if (!subResult.valid) errors.push(...subResult.errors)\n }\n visited.delete(code)\n }\n // (선택) formula 구문 오류, 괄호 불일치 등 추가 검사 가능\n // ...\n return { valid: errors.length === 0, errors }\n }\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import { HistoryActionType, HistoryEntityInterface } from '@operato/typeorm-hist
|
|
|
2
2
|
import { User } from '@things-factory/auth-base';
|
|
3
3
|
import { Domain } from '@things-factory/shell';
|
|
4
4
|
import { Kpi, KpiStatus } from './kpi';
|
|
5
|
+
import { KpiCategory } from '../kpi-category/kpi-category';
|
|
5
6
|
export declare class KpiHistory implements HistoryEntityInterface<Kpi> {
|
|
6
7
|
readonly id: string;
|
|
7
8
|
version?: number;
|
|
@@ -9,9 +10,12 @@ export declare class KpiHistory implements HistoryEntityInterface<Kpi> {
|
|
|
9
10
|
domainId?: string;
|
|
10
11
|
name: string;
|
|
11
12
|
description?: string;
|
|
13
|
+
category?: KpiCategory;
|
|
14
|
+
categoryId?: string;
|
|
15
|
+
formula?: string;
|
|
12
16
|
active?: boolean;
|
|
13
17
|
state?: KpiStatus;
|
|
14
|
-
|
|
18
|
+
thumbnail?: string;
|
|
15
19
|
createdAt?: Date;
|
|
16
20
|
updatedAt?: Date;
|
|
17
21
|
deletedAt?: Date;
|
|
@@ -19,7 +23,7 @@ export declare class KpiHistory implements HistoryEntityInterface<Kpi> {
|
|
|
19
23
|
creatorId?: string;
|
|
20
24
|
updater?: User;
|
|
21
25
|
updaterId?: string;
|
|
22
|
-
thumbnail?: string;
|
|
23
26
|
originalId: string;
|
|
27
|
+
kpi: Kpi;
|
|
24
28
|
action: HistoryActionType;
|
|
25
29
|
}
|
|
@@ -9,6 +9,7 @@ const auth_base_1 = require("@things-factory/auth-base");
|
|
|
9
9
|
const env_1 = require("@things-factory/env");
|
|
10
10
|
const shell_1 = require("@things-factory/shell");
|
|
11
11
|
const kpi_1 = require("./kpi");
|
|
12
|
+
const kpi_category_1 = require("../kpi-category/kpi-category");
|
|
12
13
|
const ORMCONFIG = env_1.config.get('ormconfig', {});
|
|
13
14
|
const DATABASE_TYPE = ORMCONFIG.type;
|
|
14
15
|
let KpiHistory = class KpiHistory {
|
|
@@ -46,21 +47,34 @@ tslib_1.__decorate([
|
|
|
46
47
|
(0, type_graphql_1.Field)({ nullable: true }),
|
|
47
48
|
tslib_1.__metadata("design:type", String)
|
|
48
49
|
], KpiHistory.prototype, "description", void 0);
|
|
50
|
+
tslib_1.__decorate([
|
|
51
|
+
(0, typeorm_1.ManyToOne)(() => kpi_category_1.KpiCategory, { nullable: true }),
|
|
52
|
+
(0, type_graphql_1.Field)(type => kpi_category_1.KpiCategory, { nullable: true, description: 'Category to which this KPI belongs.' }),
|
|
53
|
+
tslib_1.__metadata("design:type", kpi_category_1.KpiCategory)
|
|
54
|
+
], KpiHistory.prototype, "category", void 0);
|
|
55
|
+
tslib_1.__decorate([
|
|
56
|
+
(0, typeorm_1.RelationId)((kpi) => kpi.category),
|
|
57
|
+
tslib_1.__metadata("design:type", String)
|
|
58
|
+
], KpiHistory.prototype, "categoryId", void 0);
|
|
49
59
|
tslib_1.__decorate([
|
|
50
60
|
(0, typeorm_1.Column)({ nullable: true }),
|
|
51
|
-
(0, type_graphql_1.Field)({ nullable: true }),
|
|
61
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Calculation formula for the KPI.' }),
|
|
62
|
+
tslib_1.__metadata("design:type", String)
|
|
63
|
+
], KpiHistory.prototype, "formula", void 0);
|
|
64
|
+
tslib_1.__decorate([
|
|
65
|
+
(0, typeorm_1.Column)({ nullable: false, default: false }),
|
|
66
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Whether this KPI is active (usable) or not.' }),
|
|
52
67
|
tslib_1.__metadata("design:type", Boolean)
|
|
53
68
|
], KpiHistory.prototype, "active", void 0);
|
|
54
69
|
tslib_1.__decorate([
|
|
55
70
|
(0, typeorm_1.Column)({ nullable: true }),
|
|
56
|
-
(0, type_graphql_1.Field)({ nullable: true }),
|
|
71
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' }),
|
|
57
72
|
tslib_1.__metadata("design:type", String)
|
|
58
73
|
], KpiHistory.prototype, "state", void 0);
|
|
59
74
|
tslib_1.__decorate([
|
|
60
|
-
(0,
|
|
61
|
-
(0, type_graphql_1.Field)({ nullable: true }),
|
|
75
|
+
(0, type_graphql_1.Field)(type => String, { nullable: true, description: 'Thumbnail image or file path for this KPI.' }),
|
|
62
76
|
tslib_1.__metadata("design:type", String)
|
|
63
|
-
], KpiHistory.prototype, "
|
|
77
|
+
], KpiHistory.prototype, "thumbnail", void 0);
|
|
64
78
|
tslib_1.__decorate([
|
|
65
79
|
(0, typeorm_1.Column)({ nullable: true }),
|
|
66
80
|
(0, type_graphql_1.Field)({ nullable: true }),
|
|
@@ -95,13 +109,15 @@ tslib_1.__decorate([
|
|
|
95
109
|
tslib_1.__metadata("design:type", String)
|
|
96
110
|
], KpiHistory.prototype, "updaterId", void 0);
|
|
97
111
|
tslib_1.__decorate([
|
|
98
|
-
(0,
|
|
99
|
-
tslib_1.__metadata("design:type", String)
|
|
100
|
-
], KpiHistory.prototype, "thumbnail", void 0);
|
|
101
|
-
tslib_1.__decorate([
|
|
102
|
-
(0, typeorm_history_1.HistoryOriginalIdColumn)(),
|
|
112
|
+
(0, typeorm_history_1.HistoryOriginalIdColumn)({ type: 'uuid' }),
|
|
103
113
|
tslib_1.__metadata("design:type", String)
|
|
104
114
|
], KpiHistory.prototype, "originalId", void 0);
|
|
115
|
+
tslib_1.__decorate([
|
|
116
|
+
(0, typeorm_1.ManyToOne)(() => kpi_1.Kpi, { nullable: false }),
|
|
117
|
+
(0, typeorm_1.JoinColumn)({ name: 'originalId', referencedColumnName: 'id' }),
|
|
118
|
+
(0, type_graphql_1.Field)(type => kpi_1.Kpi, { nullable: false, description: '이 이력이 속한 KPI' }),
|
|
119
|
+
tslib_1.__metadata("design:type", kpi_1.Kpi)
|
|
120
|
+
], KpiHistory.prototype, "kpi", void 0);
|
|
105
121
|
tslib_1.__decorate([
|
|
106
122
|
(0, typeorm_history_1.HistoryActionColumn)({
|
|
107
123
|
nullable: false,
|
|
@@ -122,7 +138,9 @@ tslib_1.__decorate([
|
|
|
122
138
|
exports.KpiHistory = KpiHistory = tslib_1.__decorate([
|
|
123
139
|
(0, typeorm_1.Entity)(),
|
|
124
140
|
(0, typeorm_1.Index)('ix_kpi_history_0', (kpiHistory) => [kpiHistory.originalId, kpiHistory.version], { unique: true }),
|
|
125
|
-
(0, typeorm_1.Index)('ix_kpi_history_1', (kpiHistory) => [kpiHistory.domain, kpiHistory.originalId, kpiHistory.version], {
|
|
141
|
+
(0, typeorm_1.Index)('ix_kpi_history_1', (kpiHistory) => [kpiHistory.domain, kpiHistory.originalId, kpiHistory.version], {
|
|
142
|
+
unique: true
|
|
143
|
+
}),
|
|
126
144
|
(0, type_graphql_1.ObjectType)({ description: 'History Entity of Kpi' })
|
|
127
145
|
], KpiHistory);
|
|
128
146
|
//# sourceMappingURL=kpi-history.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-history.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-history.ts"],"names":[],"mappings":";;;;AAAA,+CAAoD;AACpD,
|
|
1
|
+
{"version":3,"file":"kpi-history.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-history.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, ID, ObjectType } from 'type-graphql'\nimport { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId, JoinColumn } from 'typeorm'\n\nimport {\n HistoryActionColumn,\n HistoryActionType,\n HistoryEntityInterface,\n HistoryOriginalIdColumn\n} from '@operato/typeorm-history'\nimport { Role, User } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { Domain } from '@things-factory/shell'\n\nimport { Kpi, KpiStatus } from './kpi'\nimport { KpiCategory } from '../kpi-category/kpi-category'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\n@Entity()\n@Index('ix_kpi_history_0', (kpiHistory: KpiHistory) => [kpiHistory.originalId, kpiHistory.version], { unique: true })\n@Index('ix_kpi_history_1', (kpiHistory: KpiHistory) => [kpiHistory.domain, kpiHistory.originalId, kpiHistory.version], {\n unique: true\n})\n@ObjectType({ description: 'History Entity of Kpi' })\nexport class KpiHistory implements HistoryEntityInterface<Kpi> {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @Column({ nullable: true, default: 1 })\n @Field({ nullable: true })\n version?: number = 1\n\n @ManyToOne(type => Domain)\n @Field({ nullable: true })\n domain?: Domain\n\n @RelationId((kpi: Kpi) => kpi.domain)\n domainId?: string\n\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n @ManyToOne(() => KpiCategory, { nullable: true })\n @Field(type => KpiCategory, { nullable: true, description: 'Category to which this KPI belongs.' })\n category?: KpiCategory\n\n @RelationId((kpi: KpiHistory) => kpi.category)\n categoryId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Calculation formula for the KPI.' })\n formula?: string\n\n @Column({ nullable: false, default: false })\n @Field({ nullable: true, description: 'Whether this KPI is active (usable) or not.' })\n active?: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' })\n state?: KpiStatus\n\n @Field(type => String, { nullable: true, description: 'Thumbnail image or file path for this KPI.' })\n thumbnail?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n createdAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n updatedAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((kpi: Kpi) => kpi.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((kpi: Kpi) => kpi.updater)\n updaterId?: string\n\n @HistoryOriginalIdColumn({ type: 'uuid' })\n public originalId!: string\n\n // Kpi와의 릴레이션 추가 (originalId를 외래키로 사용)\n @ManyToOne(() => Kpi, { nullable: false })\n @JoinColumn({ name: 'originalId', referencedColumnName: 'id' })\n @Field(type => Kpi, { nullable: false, description: '이 이력이 속한 KPI' })\n kpi: Kpi\n\n @HistoryActionColumn({\n nullable: false,\n type:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'enum'\n : DATABASE_TYPE == 'oracle'\n ? 'varchar2'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n enum:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? HistoryActionType\n : undefined,\n length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 32\n })\n public action!: HistoryActionType\n}\n"]}
|
|
@@ -7,4 +7,6 @@ export declare class KpiMutation {
|
|
|
7
7
|
deleteKpi(id: string, context: ResolverContext): Promise<boolean>;
|
|
8
8
|
deleteKpis(ids: string[], context: ResolverContext): Promise<boolean>;
|
|
9
9
|
importKpis(kpis: KpiPatch[], context: ResolverContext): Promise<boolean>;
|
|
10
|
+
releaseKpi(id: string, context: ResolverContext): Promise<Kpi>;
|
|
11
|
+
revertKpiVersion(id: string, version: number, context: ResolverContext): Promise<Kpi>;
|
|
10
12
|
}
|