@things-factory/kpi 9.0.32 → 9.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/client/pages/kpi-dashboard/kpi-dashboard-map.ts +291 -49
  2. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +3 -1
  3. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +268 -47
  4. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -1
  5. package/dist-client/tsconfig.tsbuildinfo +1 -1
  6. package/dist-server/migrations/seed-data/kpi-scopes-seed.json +121 -0
  7. package/dist-server/migrations/seed-data/scope-definitions-seed.json +90 -0
  8. package/dist-server/service/index.d.ts +4 -3
  9. package/dist-server/service/index.js +7 -3
  10. package/dist-server/service/index.js.map +1 -1
  11. package/dist-server/service/kpi/kpi-query.js.map +1 -1
  12. package/dist-server/service/kpi-org-scope/index.d.ts +0 -4
  13. package/dist-server/service/kpi-org-scope/index.js +0 -5
  14. package/dist-server/service/kpi-org-scope/index.js.map +1 -1
  15. package/dist-server/service/kpi-scope/index.d.ts +9 -0
  16. package/dist-server/service/kpi-scope/index.js +14 -0
  17. package/dist-server/service/kpi-scope/index.js.map +1 -0
  18. package/dist-server/service/kpi-scope/kpi-scope-mutation.d.ts +9 -0
  19. package/dist-server/service/kpi-scope/kpi-scope-mutation.js +135 -0
  20. package/dist-server/service/kpi-scope/kpi-scope-mutation.js.map +1 -0
  21. package/dist-server/service/kpi-scope/kpi-scope-query.d.ts +11 -0
  22. package/dist-server/service/kpi-scope/kpi-scope-query.js +89 -0
  23. package/dist-server/service/kpi-scope/kpi-scope-query.js.map +1 -0
  24. package/dist-server/service/kpi-scope/kpi-scope-type.d.ts +35 -0
  25. package/dist-server/service/kpi-scope/kpi-scope-type.js +138 -0
  26. package/dist-server/service/kpi-scope/kpi-scope-type.js.map +1 -0
  27. package/dist-server/service/kpi-scope/kpi-scope.d.ts +38 -0
  28. package/dist-server/service/kpi-scope/kpi-scope.js +144 -0
  29. package/dist-server/service/kpi-scope/kpi-scope.js.map +1 -0
  30. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.d.ts +43 -0
  31. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js +181 -0
  32. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js.map +1 -0
  33. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.d.ts +50 -0
  34. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js +324 -0
  35. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js.map +1 -0
  36. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.d.ts +4 -0
  37. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js +76 -0
  38. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js.map +1 -1
  39. package/dist-server/service/kpi-statistic/kpi-statistic-query.d.ts +5 -1
  40. package/dist-server/service/kpi-statistic/kpi-statistic-query.js +92 -1
  41. package/dist-server/service/kpi-statistic/kpi-statistic-query.js.map +1 -1
  42. package/dist-server/service/kpi-statistic/kpi-statistic.d.ts +3 -0
  43. package/dist-server/service/kpi-statistic/kpi-statistic.js +23 -1
  44. package/dist-server/service/kpi-statistic/kpi-statistic.js.map +1 -1
  45. package/dist-server/tsconfig.tsbuildinfo +1 -1
  46. package/package.json +5 -5
  47. package/server/migrations/seed-data/kpi-scopes-seed.json +121 -0
  48. package/server/migrations/seed-data/scope-definitions-seed.json +90 -0
  49. package/server/service/index.ts +7 -3
  50. package/server/service/kpi/kpi-query.ts +1 -0
  51. package/server/service/kpi-org-scope/index.ts +1 -6
  52. package/server/service/kpi-scope/index.ts +11 -0
  53. package/server/service/kpi-scope/kpi-scope-mutation.ts +129 -0
  54. package/server/service/kpi-scope/kpi-scope-query.ts +63 -0
  55. package/server/service/kpi-scope/kpi-scope-type.ts +96 -0
  56. package/server/service/kpi-scope/kpi-scope.ts +143 -0
  57. package/server/service/kpi-statistic/kpi-statistic-batch.service.ts +231 -0
  58. package/server/service/kpi-statistic/kpi-statistic-calculation.service.ts +410 -0
  59. package/server/service/kpi-statistic/kpi-statistic-mutation.ts +97 -0
  60. package/server/service/kpi-statistic/kpi-statistic-query.ts +89 -2
  61. package/server/service/kpi-statistic/kpi-statistic.ts +23 -1
@@ -0,0 +1,121 @@
1
+ [
2
+ {
3
+ "name": "공사진도율",
4
+ "description": "건설 프로젝트의 진행률을 나타내는 KPI",
5
+ "scopeMappingStrategy": "RULE_BASED",
6
+ "autoGenerateOrgScope": true,
7
+ "scopeMappingRules": {
8
+ "scope01": {
9
+ "strategy": "FIELD_MAPPING",
10
+ "sourceField": "project_name",
11
+ "required": true
12
+ },
13
+ "scope02": {
14
+ "strategy": "LOOKUP_TABLE",
15
+ "sourceField": "address",
16
+ "mappingTable": "address_region_mapping",
17
+ "mappingColumn": "region",
18
+ "defaultValue": "기타"
19
+ },
20
+ "scope03": {
21
+ "strategy": "FIELD_MAPPING",
22
+ "sourceField": "contractor_company",
23
+ "required": true
24
+ },
25
+ "scope04": {
26
+ "strategy": "FORMULA",
27
+ "formula": "${total_budget} >= 100000000 ? '대규모' : ${total_budget} >= 50000000 ? '중규모' : '소규모'",
28
+ "defaultValue": "중규모"
29
+ },
30
+ "scope05": {
31
+ "strategy": "STATIC",
32
+ "staticValue": "건축공사"
33
+ }
34
+ },
35
+ "dataSource": {
36
+ "type": "API",
37
+ "apiEndpoint": "https://api.construction-system.com/progress",
38
+ "refreshInterval": 60
39
+ },
40
+ "validationRules": {
41
+ "valueRange": { "min": 0, "max": 100 },
42
+ "requiredScopes": ["scope01", "scope02", "scope03"],
43
+ "allowedScopeValues": {
44
+ "scope04": ["대규모", "중규모", "소규모"],
45
+ "scope05": ["건축공사", "토목공사", "플랜트공사"]
46
+ }
47
+ }
48
+ },
49
+ {
50
+ "name": "안전사고율",
51
+ "description": "건설 현장의 안전사고 발생률",
52
+ "scopeMappingStrategy": "ENTITY_BASED",
53
+ "autoGenerateOrgScope": true,
54
+ "scopeMappingRules": {
55
+ "scope01": {
56
+ "strategy": "FIELD_MAPPING",
57
+ "sourceField": "site_name",
58
+ "required": true
59
+ },
60
+ "scope02": {
61
+ "strategy": "API_CALL",
62
+ "apiEndpoint": "https://api.address-service.com/region",
63
+ "sourceField": "site_address"
64
+ },
65
+ "scope03": {
66
+ "strategy": "FIELD_MAPPING",
67
+ "sourceField": "company_name",
68
+ "required": true
69
+ },
70
+ "scope04": {
71
+ "strategy": "LOOKUP_TABLE",
72
+ "sourceField": "worker_count",
73
+ "mappingTable": "project_size_mapping",
74
+ "mappingColumn": "size_category"
75
+ },
76
+ "scope05": {
77
+ "strategy": "FIELD_MAPPING",
78
+ "sourceField": "construction_type",
79
+ "defaultValue": "일반공사"
80
+ }
81
+ },
82
+ "dataSource": {
83
+ "type": "DATABASE",
84
+ "connection": "safety_db",
85
+ "query": "SELECT * FROM safety_incidents WHERE report_date >= CURRENT_DATE - INTERVAL '1 month'",
86
+ "refreshInterval": 1440
87
+ },
88
+ "validationRules": {
89
+ "valueRange": { "min": 0, "max": 1000 },
90
+ "requiredScopes": ["scope01", "scope02", "scope03"]
91
+ }
92
+ },
93
+ {
94
+ "name": "품질점수",
95
+ "description": "건설 품질 평가 점수",
96
+ "scopeMappingStrategy": "MANUAL",
97
+ "autoGenerateOrgScope": false,
98
+ "scopeMappingRules": {
99
+ "scope01": {
100
+ "strategy": "FIELD_MAPPING",
101
+ "sourceField": "project_id"
102
+ },
103
+ "scope02": {
104
+ "strategy": "FIELD_MAPPING",
105
+ "sourceField": "region"
106
+ },
107
+ "scope03": {
108
+ "strategy": "FIELD_MAPPING",
109
+ "sourceField": "company"
110
+ }
111
+ },
112
+ "dataSource": {
113
+ "type": "MANUAL",
114
+ "description": "수동 입력으로 관리되는 KPI"
115
+ },
116
+ "validationRules": {
117
+ "valueRange": { "min": 0, "max": 100 },
118
+ "requiredScopes": ["scope02", "scope03"]
119
+ }
120
+ }
121
+ ]
@@ -0,0 +1,90 @@
1
+ [
2
+ {
3
+ "scopeLevel": 1,
4
+ "name": "프로젝트명",
5
+ "description": "개별 건설 프로젝트나 현장의 고유 식별명",
6
+ "scopeType": "BUSINESS",
7
+ "displayOrder": 1,
8
+ "active": true,
9
+ "includeInStatistics": false,
10
+ "showInDashboard": false,
11
+ "metadata": {
12
+ "icon": "construction",
13
+ "color": "#1976d2"
14
+ }
15
+ },
16
+ {
17
+ "scopeLevel": 2,
18
+ "name": "지역",
19
+ "description": "시도 단위 행정구역 (서울특별시, 부산광역시, 경기도 등)",
20
+ "scopeType": "GEOGRAPHIC",
21
+ "displayOrder": 2,
22
+ "active": true,
23
+ "includeInStatistics": true,
24
+ "showInDashboard": true,
25
+ "validValues": [
26
+ "서울특별시", "부산광역시", "대구광역시", "인천광역시",
27
+ "광주광역시", "대전광역시", "울산광역시", "세종특별자치시",
28
+ "경기도", "강원도", "충청북도", "충청남도",
29
+ "전라북도", "전라남도", "경상북도", "경상남도", "제주특별자치도"
30
+ ],
31
+ "metadata": {
32
+ "icon": "location_on",
33
+ "color": "#388e3c",
34
+ "mapVisualization": true
35
+ }
36
+ },
37
+ {
38
+ "scopeLevel": 3,
39
+ "name": "건설회사",
40
+ "description": "주요 건설회사 또는 시공사",
41
+ "scopeType": "ORGANIZATIONAL",
42
+ "displayOrder": 3,
43
+ "active": true,
44
+ "includeInStatistics": true,
45
+ "showInDashboard": true,
46
+ "validValues": [
47
+ "현대건설", "삼성물산", "GS건설", "대우건설", "롯데건설",
48
+ "대림산업", "포스코건설", "HDC현대산업개발", "호반건설", "태영건설",
49
+ "한화건설", "코오롱글로벌", "제일건설", "남광토건", "한국토지주택공사"
50
+ ],
51
+ "metadata": {
52
+ "icon": "business",
53
+ "color": "#f57c00"
54
+ }
55
+ },
56
+ {
57
+ "scopeLevel": 4,
58
+ "name": "프로젝트규모",
59
+ "description": "프로젝트의 규모나 등급 분류",
60
+ "scopeType": "BUSINESS",
61
+ "displayOrder": 4,
62
+ "active": true,
63
+ "includeInStatistics": true,
64
+ "showInDashboard": false,
65
+ "validValues": ["대규모", "중규모", "소규모", "특대형", "일반형"],
66
+ "metadata": {
67
+ "icon": "bar_chart",
68
+ "color": "#7b1fa2"
69
+ }
70
+ },
71
+ {
72
+ "scopeLevel": 5,
73
+ "name": "공종",
74
+ "description": "건설 공사의 종류나 기술 분야",
75
+ "scopeType": "TECHNICAL",
76
+ "displayOrder": 5,
77
+ "active": true,
78
+ "includeInStatistics": true,
79
+ "showInDashboard": false,
80
+ "validValues": [
81
+ "토목공사", "건축공사", "플랜트공사", "주택공사",
82
+ "도로공사", "철도공사", "항만공사", "상하수도공사",
83
+ "전기공사", "통신공사", "조경공사", "소방공사"
84
+ ],
85
+ "metadata": {
86
+ "icon": "engineering",
87
+ "color": "#d32f2f"
88
+ }
89
+ }
90
+ ]
@@ -7,8 +7,9 @@ export * from './kpi-metric/kpi-metric';
7
7
  export * from './kpi-metric/kpi-metric-type';
8
8
  export * from './kpi-metric-value/kpi-metric-value';
9
9
  export * from './kpi-metric-value/kpi-metric-value-type';
10
- export * from './kpi-org-scope';
11
- export declare const entities: (typeof import("./kpi/kpi").Kpi | typeof import("./kpi-statistic/kpi-statistic").KpiStatistic | typeof import("./kpi-org-scope").KpiOrgScope | typeof import("./kpi-value/kpi-value").KpiValue | typeof import("./kpi-metric/kpi-metric").KpiMetric | typeof import("./kpi-metric-value/kpi-metric-value").KpiMetricValue | typeof import("./kpi/kpi-history").KpiHistory)[];
10
+ export * from './kpi-scope/kpi-scope';
11
+ export * from './kpi-org-scope/kpi-org-scope';
12
+ export declare const entities: (typeof import("./kpi-value/kpi-value").KpiValue | typeof import("./kpi/kpi").Kpi | typeof import("./kpi-org-scope/kpi-org-scope").KpiOrgScope | typeof import("./kpi-metric/kpi-metric").KpiMetric | typeof import("./kpi-statistic/kpi-statistic").KpiStatistic | typeof import("./kpi-metric-value/kpi-metric-value").KpiMetricValue | typeof import("./kpi-scope").KpiScope | typeof import("./kpi/kpi-history").KpiHistory)[];
12
13
  export declare const schema: {
13
- resolverClasses: (typeof import("./kpi-org-scope").KpiOrgScopeQuery | typeof import("./kpi-org-scope").KpiOrgScopeMutation | typeof import("./kpi-statistic/kpi-statistic-query").KpiStatisticQuery | typeof import("./kpi-statistic/kpi-statistic-mutation").KpiStatisticMutation | typeof import("./kpi/kpi-query").KpiQuery | typeof import("./kpi/kpi-mutation").KpiMutation | 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 | typeof import("./kpi-metric-value/kpi-metric-value-query").KpiMetricValueQuery | typeof import("./kpi-metric-value/kpi-metric-value-mutation").KpiMetricValueMutation | typeof import("./kpi-alert/kpi-alert-query").KpiAlertQuery)[];
14
+ resolverClasses: (typeof import("./kpi-statistic/kpi-statistic-query").KpiStatisticQuery | typeof import("./kpi-statistic/kpi-statistic-mutation").KpiStatisticMutation | typeof import("./kpi/kpi-query").KpiQuery | typeof import("./kpi/kpi-mutation").KpiMutation | 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 | typeof import("./kpi-metric-value/kpi-metric-value-query").KpiMetricValueQuery | typeof import("./kpi-metric-value/kpi-metric-value-mutation").KpiMetricValueMutation | typeof import("./kpi-org-scope/kpi-org-scope-query").KpiOrgScopeQuery | typeof import("./kpi-org-scope/kpi-org-scope-mutation").KpiOrgScopeMutation | typeof import("./kpi-alert/kpi-alert-query").KpiAlertQuery | typeof import("./kpi-scope").KpiScopeQuery | typeof import("./kpi-scope").KpiScopeMutation)[];
14
15
  };
@@ -12,7 +12,8 @@ tslib_1.__exportStar(require("./kpi-metric/kpi-metric"), exports);
12
12
  tslib_1.__exportStar(require("./kpi-metric/kpi-metric-type"), exports);
13
13
  tslib_1.__exportStar(require("./kpi-metric-value/kpi-metric-value"), exports);
14
14
  tslib_1.__exportStar(require("./kpi-metric-value/kpi-metric-value-type"), exports);
15
- tslib_1.__exportStar(require("./kpi-org-scope"), exports);
15
+ tslib_1.__exportStar(require("./kpi-scope/kpi-scope"), exports);
16
+ tslib_1.__exportStar(require("./kpi-org-scope/kpi-org-scope"), exports);
16
17
  /* IMPORT ENTITIES AND RESOLVERS */
17
18
  const kpi_statistic_1 = require("./kpi-statistic");
18
19
  const kpi_1 = require("./kpi");
@@ -21,6 +22,7 @@ const kpi_metric_1 = require("./kpi-metric");
21
22
  const kpi_metric_value_1 = require("./kpi-metric-value");
22
23
  const kpi_org_scope_1 = require("./kpi-org-scope");
23
24
  const kpi_alert_1 = require("./kpi-alert");
25
+ const kpi_scope_1 = require("./kpi-scope");
24
26
  exports.entities = [
25
27
  /* ENTITIES */
26
28
  ...kpi_statistic_1.entities,
@@ -28,7 +30,8 @@ exports.entities = [
28
30
  ...kpi_value_1.entities,
29
31
  ...kpi_metric_1.entities,
30
32
  ...kpi_metric_value_1.entities,
31
- ...kpi_org_scope_1.entities
33
+ ...kpi_org_scope_1.entities,
34
+ ...kpi_scope_1.entities
32
35
  ];
33
36
  exports.schema = {
34
37
  resolverClasses: [
@@ -39,7 +42,8 @@ exports.schema = {
39
42
  ...kpi_metric_1.resolvers,
40
43
  ...kpi_metric_value_1.resolvers,
41
44
  ...kpi_org_scope_1.resolvers,
42
- ...kpi_alert_1.resolvers
45
+ ...kpi_alert_1.resolvers,
46
+ ...kpi_scope_1.resolvers
43
47
  ]
44
48
  };
45
49
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,wEAA6C;AAC7C,oDAAyB;AACzB,yDAA8B;AAC9B,gEAAqC;AACrC,qEAA0C;AAC1C,kEAAuC;AACvC,uEAA4C;AAC5C,8EAAmD;AACnD,mFAAwD;AACxD,0DAA+B;AAE/B,mCAAmC;AACnC,mDAIwB;AACxB,+BAA0E;AAC1E,2CAA0F;AAC1F,6CAA6F;AAC7F,yDAA6G;AAC7G,mDAAoG;AACpG,2CAA4D;AAE/C,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,wBAAoB;IACvB,GAAG,cAAW;IACd,GAAG,oBAAgB;IACnB,GAAG,qBAAiB;IACpB,GAAG,2BAAsB;IACzB,GAAG,wBAAmB;CACvB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,yBAAqB;QACxB,GAAG,eAAY;QACf,GAAG,qBAAiB;QACpB,GAAG,sBAAkB;QACrB,GAAG,4BAAuB;QAC1B,GAAG,yBAAoB;QACvB,GAAG,qBAAiB;KACrB;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './kpi-statistic/kpi-statistic'\nexport * from './kpi/kpi'\nexport * from './kpi/kpi-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-metric-value/kpi-metric-value'\nexport * from './kpi-metric-value/kpi-metric-value-type'\nexport * from './kpi-org-scope'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport {\n entities as KpiStatisticEntities,\n resolvers as KpiStatisticResolvers,\n subscribers as KpiStatisticSubscribers\n} from './kpi-statistic'\nimport { entities as KpiEntities, resolvers as KpiResolvers } from './kpi'\nimport { entities as KpiValueEntities, resolvers as KpiValueResolvers } from './kpi-value'\nimport { entities as KpiMetricEntities, resolvers as KpiMetricResolvers } from './kpi-metric'\nimport { entities as KpiMetricValueEntities, resolvers as KpiMetricValueResolvers } from './kpi-metric-value'\nimport { entities as KpiOrgScopeEntities, resolvers as KpiOrgScopeResolvers } from './kpi-org-scope'\nimport { resolvers as KpiAlertResolvers } from './kpi-alert'\n\nexport const entities = [\n /* ENTITIES */\n ...KpiStatisticEntities,\n ...KpiEntities,\n ...KpiValueEntities,\n ...KpiMetricEntities,\n ...KpiMetricValueEntities,\n ...KpiOrgScopeEntities\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...KpiStatisticResolvers,\n ...KpiResolvers,\n ...KpiValueResolvers,\n ...KpiMetricResolvers,\n ...KpiMetricValueResolvers,\n ...KpiOrgScopeResolvers,\n ...KpiAlertResolvers\n ]\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,wEAA6C;AAC7C,oDAAyB;AACzB,yDAA8B;AAC9B,gEAAqC;AACrC,qEAA0C;AAC1C,kEAAuC;AACvC,uEAA4C;AAC5C,8EAAmD;AACnD,mFAAwD;AACxD,gEAAqC;AACrC,wEAA6C;AAE7C,mCAAmC;AACnC,mDAIwB;AACxB,+BAA0E;AAC1E,2CAA0F;AAC1F,6CAA6F;AAC7F,yDAA6G;AAC7G,mDAAoG;AACpG,2CAA4D;AAC5D,2CAA0F;AAE7E,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,wBAAoB;IACvB,GAAG,cAAW;IACd,GAAG,oBAAgB;IACnB,GAAG,qBAAiB;IACpB,GAAG,2BAAsB;IACzB,GAAG,wBAAmB;IACtB,GAAG,oBAAgB;CACpB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,yBAAqB;QACxB,GAAG,eAAY;QACf,GAAG,qBAAiB;QACpB,GAAG,sBAAkB;QACrB,GAAG,4BAAuB;QAC1B,GAAG,yBAAoB;QACvB,GAAG,qBAAiB;QACpB,GAAG,qBAAiB;KACrB;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './kpi-statistic/kpi-statistic'\nexport * from './kpi/kpi'\nexport * from './kpi/kpi-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-metric-value/kpi-metric-value'\nexport * from './kpi-metric-value/kpi-metric-value-type'\nexport * from './kpi-scope/kpi-scope'\nexport * from './kpi-org-scope/kpi-org-scope'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport {\n entities as KpiStatisticEntities,\n resolvers as KpiStatisticResolvers,\n subscribers as KpiStatisticSubscribers\n} from './kpi-statistic'\nimport { entities as KpiEntities, resolvers as KpiResolvers } from './kpi'\nimport { entities as KpiValueEntities, resolvers as KpiValueResolvers } from './kpi-value'\nimport { entities as KpiMetricEntities, resolvers as KpiMetricResolvers } from './kpi-metric'\nimport { entities as KpiMetricValueEntities, resolvers as KpiMetricValueResolvers } from './kpi-metric-value'\nimport { entities as KpiOrgScopeEntities, resolvers as KpiOrgScopeResolvers } from './kpi-org-scope'\nimport { resolvers as KpiAlertResolvers } from './kpi-alert'\nimport { entities as KpiScopeEntities, resolvers as KpiScopeResolvers } from './kpi-scope'\n\nexport const entities = [\n /* ENTITIES */\n ...KpiStatisticEntities,\n ...KpiEntities,\n ...KpiValueEntities,\n ...KpiMetricEntities,\n ...KpiMetricValueEntities,\n ...KpiOrgScopeEntities,\n ...KpiScopeEntities\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...KpiStatisticResolvers,\n ...KpiResolvers,\n ...KpiValueResolvers,\n ...KpiMetricResolvers,\n ...KpiMetricValueResolvers,\n ...KpiOrgScopeResolvers,\n ...KpiAlertResolvers,\n ...KpiScopeResolvers\n ]\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-query.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-query.ts"],"names":[],"mappings":";;;;AAAA,qCAAgC;AAChC,+CAA8F;AAC9F,qEAA4D;AAC5D,iDAAuG;AACvG,yDAAgD;AAChD,+BAA2B;AAC3B,yCAAoC;AACpC,sDAAiD;AACjD,+CAA0C;AAC1C,+CAAkC;AAG3B,IAAM,QAAQ,GAAd,MAAM,QAAQ;IAGb,AAAN,KAAK,CAAC,UAAU,CAAQ,OAAwB;QAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,OAAO,MAAM,IAAA,qBAAa,EAAC,SAAG,CAAC,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;YAClD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACvB,CAAC,CAAA;IACJ,CAAC;IAOK,AAAN,KAAK,CAAC,UAAU,CAKd,MAAc,EACP,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,IAAI,cAAc,GAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAA;QAEvD,IAAI,MAAM,EAAE,CAAC;YACX,aAAa;YACb,cAAc,CAAC,MAAM,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,CAAA;QACxC,CAAC;aAAM,CAAC;YACN,sCAAsC;YACtC,8BAA8B;YAC9B,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,SAAG,CAAC;iBAClC,kBAAkB,CAAC,KAAK,CAAC;iBACzB,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC;iBACzC,iBAAiB,CAAC,cAAc,EAAE,UAAU,CAAC;iBAC7C,iBAAiB,CAAC,mBAAmB,EAAE,eAAe,CAAC;iBACvD,KAAK,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;iBACxD,QAAQ,CAAC,uBAAuB,CAAC;iBACjC,QAAQ,CAAC,uBAAuB,CAAC;iBACjC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC;iBAC1B,OAAO,EAAE,CAAA;YAEZ,OAAO,IAAI,CAAA;QACb,CAAC;QAED,gBAAgB;QAChB,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,SAAG,CAAC,CAAC,IAAI,CAAC;YACzC,KAAK,EAAE,cAAc;YACrB,SAAS,EAAE,CAAC,UAAU,EAAE,mBAAmB,CAAC;YAC5C,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACvB,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;IACb,CAAC;IAIK,AAAN,KAAK,CAAC,GAAG,CAC+D,EAAU,EACzE,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,OAAO,MAAM,IAAA,qBAAa,EAAC,SAAG,CAAC,CAAC,OAAO,CAAC;YACtC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;SACzC,CAAC,CAAA;IACJ,CAAC;IAIK,AAAN,KAAK,CAAC,IAAI,CAA0B,MAAiB,EAAS,OAAwB;QACpF,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,YAAY,GAAG,IAAA,qCAA6B,EAAC;YACjD,MAAM;YACN,MAAM;YACN,UAAU,EAAE,MAAM,IAAA,qBAAa,EAAC,SAAG,CAAC;YACpC,WAAW,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;YACpC,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE;aACvD;SACF,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;IAGD,QAAQ,CAAS,GAAQ;QACvB,OAAO,IAAA,qBAAa,EAAC,SAAG,CAAC,CAAC,IAAI,CAAC;YAC7B,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE;SAClC,CAAC,CAAA;IACJ,CAAC;IAGK,AAAN,KAAK,CAAC,SAAS,CAAS,GAAQ;QAC9B,MAAM,UAAU,GAAe,MAAM,IAAA,qBAAa,EAAC,4BAAU,CAAC,CAAC,OAAO,CAAC;YACrE,KAAK,EAAE;gBACL,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE;gBAC5B,OAAO,EAAE,SAAG,CAAC,IAAI;gBACjB,KAAK,EAAE,GAAG,CAAC,EAAE;aACd;SACF,CAAC,CAAA;QAEF,OAAO,UAAU,EAAE,QAAQ,CAAA;IAC7B,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM,CAAS,GAAQ;QAC3B,OAAO,GAAG,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAA,qBAAa,EAAC,cAAM,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACtF,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAS,GAAQ;QAC5B,OAAO,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,IAAA,qBAAa,EAAC,gBAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IACtF,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAS,GAAQ;QAC5B,OAAO,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,IAAA,qBAAa,EAAC,gBAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IACtF,CAAC;IAGK,AAAN,KAAK,CAAC,KAAK,CACD,GAAQ,EACT,OAAO,EAC2E,QAAiB;QAE1G,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,IAAI,cAAc,GAAQ;YACxB,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzB,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE;SACpB,CAAA;QAED,oCAAoC;QACpC,IAAI,QAAQ,EAAE,CAAC;YACb,cAAc,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;QAChD,CAAC;QAED,OAAO,MAAM,IAAA,qBAAa,EAAC,oBAAQ,CAAC,CAAC,OAAO,CAAC;YAC3C,KAAK,EAAE,cAAc;YACrB,SAAS,EAAE,CAAC,aAAa,CAAC;YAC1B,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;SAC7B,CAAC,CAAA;IACJ,CAAC;IAGD,WAAW,CAAS,GAAQ;QAC1B,OAAO,GAAG,CAAC,OAAO,EAAE,WAAW,CAAA;IACjC,CAAC;IAGD,IAAI,CAAS,GAAQ;QACnB,OAAO,GAAG,CAAC,OAAO,EAAE,IAAI,CAAA;IAC1B,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM,CAAS,GAAQ;QAC3B,IAAI,CAAC,GAAG,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAA;QAC9B,OAAO,MAAM,IAAA,qBAAa,EAAC,SAAG,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IACjE,CAAC;IAGK,AAAN,KAAK,CAAC,SAAS,CACL,GAAQ,EACT,OAAO,EACiC,KAAc;QAE7D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,MAAM,EAAE,GAAG,IAAA,qBAAa,EAAC,wBAAU,CAAC;aACjC,kBAAkB,CAAC,SAAS,CAAC;aAC7B,KAAK,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;aAC5D,QAAQ,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;aAC1D,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAA;QACvC,IAAI,KAAK;YAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;;YACrB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChB,OAAO,MAAM,EAAE,CAAC,OAAO,EAAE,CAAA;IAC3B,CAAC;IAIK,AAAN,KAAK,CAAC,OAAO,CAAQ,OAAwB;QAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,OAAO,MAAM,IAAA,qBAAa,EAAC,SAAG,CAAC,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAA,gBAAM,GAAE,EAAE;YACtD,SAAS,EAAE,CAAC,UAAU,EAAE,mBAAmB,EAAE,4BAA4B,CAAC;YAC1E,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACvB,CAAC,CAAA;IACJ,CAAC;IAIK,AAAN,KAAK,CAAC,WAAW,CAC2C,QAAgB,EACnE,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,OAAO,MAAM,IAAA,qBAAa,EAAC,SAAG,CAAC,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;YAC9D,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACvB,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AAlNY,4BAAQ;AAGb;IAFL,IAAA,wBAAS,EAAC,mGAAmG,CAAC;IAC9G,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,SAAG,CAAC,EAAE,EAAE,WAAW,EAAE,uCAAuC,EAAE,CAAC;IAChE,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;0CAOtB;AAOK;IALL,IAAA,wBAAS,EAAC,mGAAmG,CAAC;IAC9G,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,SAAG,CAAC,EAAE;QACvB,WAAW,EACT,wIAAwI;KAC3I,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,QAAQ,EAAE;QACb,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,yFAAyF;KACvG,CAAC,CAAA;IAED,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;0CAkCP;AAIK;IAFL,IAAA,wBAAS,EAAC,mGAAmG,CAAC;IAC9G,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,SAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;IAErG,mBAAA,IAAA,kBAAG,EAAC,IAAI,EAAE,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAA;IACpE,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;mCAOP;AAIK;IAFL,IAAA,wBAAS,EAAC,mGAAmG,CAAC;IAC9G,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,kBAAO,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACzD,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;oCAgBpD;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAG,CAAC,CAAC;IACnB,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,SAAG;;wCAIxB;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;IACb,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,SAAG;;yCAU/B;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;IAChB,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,SAAG;;sCAE5B;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,CAAC;IACb,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,SAAG;;uCAE7B;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,CAAC;IACb,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,SAAG;;uCAE7B;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,oBAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAEjD,mBAAA,IAAA,mBAAI,GAAE,CAAA;IACN,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC,CAAA;;6CAF3E,SAAG;;qCAqBjB;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACrC,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,SAAG;;2CAE3B;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5C,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,SAAG;;oCAEpB;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,SAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjC,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,SAAG;;sCAG5B;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,wBAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAErD,mBAAA,IAAA,mBAAI,GAAE,CAAA;IACN,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;;6CAFjC,SAAG;;yCAajB;AAIK;IAFL,IAAA,wBAAS,EAAC,mGAAmG,CAAC;IAC9G,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,SAAG,CAAC,EAAE,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;IACvE,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;uCAQnB;AAIK;IAFL,IAAA,wBAAS,EAAC,mGAAmG,CAAC;IAC9G,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,SAAG,CAAC,EAAE,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC;IAEhF,mBAAA,IAAA,kBAAG,EAAC,UAAU,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAA;IACxD,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;2CAQP;mBAjNU,QAAQ;IADpB,IAAA,uBAAQ,EAAC,SAAG,CAAC;GACD,QAAQ,CAkNpB","sourcesContent":["import { IsNull } from 'typeorm'\nimport { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { Kpi } from './kpi'\nimport { KpiList } from './kpi-type'\nimport { KpiValue } from '../kpi-value/kpi-value'\nimport { KpiHistory } from './kpi-history'\nimport { Int } from 'type-graphql'\n\n@Resolver(Kpi)\nexport class KpiQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch root KPIs (KPIs without parent)' })\n async kpisLevel0(@Ctx() context: ResolverContext): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: null },\n order: { name: 'ASC' }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], {\n description:\n 'Fetch first level child KPIs. If rootId is provided, get children of that parent. If not, get all level 1 KPIs (children of root KPIs)'\n })\n async kpisLevel1(\n @Arg('rootId', {\n nullable: true,\n description: 'ID of the parent KPI to get level 1 children. If not provided, returns all level 1 KPIs'\n })\n rootId: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi[]> {\n const { domain } = context.state\n\n let whereCondition: any = { domain: { id: domain.id } }\n\n if (rootId) {\n // 특정 부모의 자식들\n whereCondition.parent = { id: rootId }\n } else {\n // 모든 level 1 KPI들 (root KPI들의 직계 자식들)\n // 부모가 있으면서 부모의 부모가 null인 KPI들\n const kpis = await getRepository(Kpi)\n .createQueryBuilder('kpi')\n .leftJoinAndSelect('kpi.parent', 'parent')\n .leftJoinAndSelect('kpi.children', 'children')\n .leftJoinAndSelect('children.children', 'grandchildren')\n .where('kpi.domain = :domainId', { domainId: domain.id })\n .andWhere('parent.id IS NOT NULL')\n .andWhere('parent.parent IS NULL')\n .orderBy('kpi.name', 'ASC')\n .getMany()\n\n return kpis\n }\n\n // rootId 제공된 경우\n const kpis = await getRepository(Kpi).find({\n where: whereCondition,\n relations: ['children', 'children.children'],\n order: { name: 'ASC' }\n })\n\n return kpis\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => Kpi!, { nullable: true, description: 'Fetch a single KPI by its unique identifier.' })\n async kpi(\n @Arg('id', { description: 'Unique identifier of the KPI to fetch.' }) id: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi> {\n const { domain } = context.state\n\n return await getRepository(Kpi).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => KpiList, { description: 'To fetch multiple Kpis' })\n async kpis(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<KpiList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository(Kpi),\n searchables: ['name', 'description'],\n filtersMap: {\n parent: { columnName: 'id', relationColumn: 'parent' }\n }\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => [Kpi])\n children(@Root() kpi: Kpi): Promise<Kpi[]> {\n return getRepository(Kpi).find({\n where: { parent: { id: kpi.id } }\n })\n }\n\n @FieldResolver(type => String)\n async thumbnail(@Root() kpi: Kpi): Promise<string | undefined> {\n const attachment: Attachment = await getRepository(Attachment).findOne({\n where: {\n domain: { id: kpi.domainId },\n refType: Kpi.name,\n refBy: kpi.id\n }\n })\n\n return attachment?.fullpath\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() kpi: Kpi): Promise<Domain> {\n return kpi.domainId && (await getRepository(Domain).findOneBy({ id: kpi.domainId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() kpi: Kpi): Promise<User> {\n return kpi.updaterId && (await getRepository(User).findOneBy({ id: kpi.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() kpi: Kpi): Promise<User> {\n return kpi.creatorId && (await getRepository(User).findOneBy({ id: kpi.creatorId }))\n }\n\n @FieldResolver(type => KpiValue, { nullable: true })\n async value(\n @Root() kpi: Kpi,\n @Ctx() context,\n @Arg('orgScope', { nullable: true, description: 'Organization scope filter for value' }) orgScope?: string\n ): Promise<KpiValue | null> {\n const { domain } = context.state\n\n let whereCondition: any = {\n domain: { id: domain.id },\n kpi: { id: kpi.id }\n }\n\n // orgScope 필터가 있으면 KpiOrgScope로 필터링\n if (orgScope) {\n whereCondition.kpiOrgScope = { org: orgScope }\n }\n\n return await getRepository(KpiValue).findOne({\n where: whereCondition,\n relations: ['kpiOrgScope'],\n order: { valueDate: 'DESC' }\n })\n }\n\n @FieldResolver(type => Number, { nullable: true })\n targetValue(@Root() kpi: Kpi): number | undefined {\n return kpi.vizMeta?.targetValue\n }\n\n @FieldResolver(type => String, { nullable: true })\n unit(@Root() kpi: Kpi): string | undefined {\n return kpi.vizMeta?.unit\n }\n\n @FieldResolver(type => Kpi, { nullable: true })\n async parent(@Root() kpi: Kpi): Promise<Kpi | null> {\n if (!kpi.parentId) return null\n return await getRepository(Kpi).findOneBy({ id: kpi.parentId })\n }\n\n @FieldResolver(type => [KpiHistory], { nullable: true })\n async histories(\n @Root() kpi: Kpi,\n @Ctx() context,\n @Arg('limit', type => Int, { nullable: true }) limit?: number\n ): Promise<KpiHistory[]> {\n const { domain } = context.state\n const qb = getRepository(KpiHistory)\n .createQueryBuilder('history')\n .where('history.domain = :domainId', { domainId: domain.id })\n .andWhere('history.originalId = :kpiId', { kpiId: kpi.id })\n .orderBy('history.updatedAt', 'DESC')\n if (limit) qb.limit(limit)\n else qb.limit(1)\n return await qb.getMany()\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch KPIs in hierarchical tree structure' })\n async kpiTree(@Ctx() context: ResolverContext): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: IsNull() },\n relations: ['children', 'children.children', 'children.children.children'],\n order: { name: 'ASC' }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch child KPIs of a given parent KPI' })\n async kpiChildren(\n @Arg('parentId', { description: 'ID of the parent KPI' }) parentId: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: { id: parentId } },\n order: { name: 'ASC' }\n })\n }\n}\n"]}
1
+ {"version":3,"file":"kpi-query.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { IsNull } from 'typeorm'\nimport { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { Kpi } from './kpi'\nimport { KpiList } from './kpi-type'\nimport { KpiValue } from '../kpi-value/kpi-value'\nimport { KpiHistory } from './kpi-history'\nimport { Int } from 'type-graphql'\n\n@Resolver(Kpi)\nexport class KpiQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch root KPIs (KPIs without parent)' })\n async kpisLevel0(@Ctx() context: ResolverContext): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: null },\n order: { name: 'ASC' }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], {\n description:\n 'Fetch first level child KPIs. If rootId is provided, get children of that parent. If not, get all level 1 KPIs (children of root KPIs)'\n })\n async kpisLevel1(\n @Arg('rootId', {\n nullable: true,\n description: 'ID of the parent KPI to get level 1 children. If not provided, returns all level 1 KPIs'\n })\n rootId: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi[]> {\n const { domain } = context.state\n\n let whereCondition: any = { domain: { id: domain.id } }\n\n if (rootId) {\n // 특정 부모의 자식들\n whereCondition.parent = { id: rootId }\n } else {\n // 모든 level 1 KPI들 (root KPI들의 직계 자식들)\n // 부모가 있으면서 부모의 부모가 null인 KPI들\n const kpis = await getRepository(Kpi)\n .createQueryBuilder('kpi')\n .leftJoinAndSelect('kpi.parent', 'parent')\n .leftJoinAndSelect('kpi.children', 'children')\n .leftJoinAndSelect('children.children', 'grandchildren')\n .where('kpi.domain = :domainId', { domainId: domain.id })\n .andWhere('parent.id IS NOT NULL')\n .andWhere('parent.parent IS NULL')\n .orderBy('kpi.name', 'ASC')\n .getMany()\n\n return kpis\n }\n\n // rootId 제공된 경우\n const kpis = await getRepository(Kpi).find({\n where: whereCondition,\n relations: ['children', 'children.children'],\n order: { name: 'ASC' }\n })\n\n return kpis\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => Kpi!, { nullable: true, description: 'Fetch a single KPI by its unique identifier.' })\n async kpi(\n @Arg('id', { description: 'Unique identifier of the KPI to fetch.' }) id: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi> {\n const { domain } = context.state\n\n return await getRepository(Kpi).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => KpiList, { description: 'To fetch multiple Kpis' })\n async kpis(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<KpiList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository(Kpi),\n searchables: ['name', 'description'],\n filtersMap: {\n parent: { columnName: 'id', relationColumn: 'parent' }\n }\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => [Kpi])\n children(@Root() kpi: Kpi): Promise<Kpi[]> {\n return getRepository(Kpi).find({\n where: { parent: { id: kpi.id } }\n })\n }\n\n @FieldResolver(type => String)\n async thumbnail(@Root() kpi: Kpi): Promise<string | undefined> {\n const attachment: Attachment = await getRepository(Attachment).findOne({\n where: {\n domain: { id: kpi.domainId },\n refType: Kpi.name,\n refBy: kpi.id\n }\n })\n\n return attachment?.fullpath\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() kpi: Kpi): Promise<Domain> {\n return kpi.domainId && (await getRepository(Domain).findOneBy({ id: kpi.domainId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() kpi: Kpi): Promise<User> {\n return kpi.updaterId && (await getRepository(User).findOneBy({ id: kpi.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() kpi: Kpi): Promise<User> {\n return kpi.creatorId && (await getRepository(User).findOneBy({ id: kpi.creatorId }))\n }\n\n @FieldResolver(type => KpiValue, { nullable: true })\n async value(\n @Root() kpi: Kpi,\n @Ctx() context,\n @Arg('orgScope', { nullable: true, description: 'Organization scope filter for value' }) orgScope?: string\n ): Promise<KpiValue | null> {\n const { domain } = context.state\n\n let whereCondition: any = {\n domain: { id: domain.id },\n kpi: { id: kpi.id }\n }\n\n // orgScope 필터가 있으면 KpiOrgScope로 필터링\n if (orgScope) {\n whereCondition.kpiOrgScope = { org: orgScope }\n }\n\n return await getRepository(KpiValue).findOne({\n where: whereCondition,\n relations: ['kpiOrgScope'],\n order: { valueDate: 'DESC' }\n })\n }\n\n @FieldResolver(type => Number, { nullable: true })\n targetValue(@Root() kpi: Kpi): number | undefined {\n return kpi.vizMeta?.targetValue\n }\n\n @FieldResolver(type => String, { nullable: true })\n unit(@Root() kpi: Kpi): string | undefined {\n return kpi.vizMeta?.unit\n }\n\n @FieldResolver(type => Kpi, { nullable: true })\n async parent(@Root() kpi: Kpi): Promise<Kpi | null> {\n if (!kpi.parentId) return null\n return await getRepository(Kpi).findOneBy({ id: kpi.parentId })\n }\n\n @FieldResolver(type => [KpiHistory], { nullable: true })\n async histories(\n @Root() kpi: Kpi,\n @Ctx() context,\n @Arg('limit', type => Int, { nullable: true }) limit?: number\n ): Promise<KpiHistory[]> {\n const { domain } = context.state\n const qb = getRepository(KpiHistory)\n .createQueryBuilder('history')\n .where('history.domain = :domainId', { domainId: domain.id })\n .andWhere('history.originalId = :kpiId', { kpiId: kpi.id })\n .orderBy('history.updatedAt', 'DESC')\n if (limit) qb.limit(limit)\n else qb.limit(1)\n return await qb.getMany()\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch KPIs in hierarchical tree structure' })\n async kpiTree(@Ctx() context: ResolverContext): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: IsNull() },\n relations: ['children', 'children.children', 'children.children.children'],\n order: { name: 'ASC' }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch child KPIs of a given parent KPI' })\n async kpiChildren(\n @Arg('parentId', { description: 'ID of the parent KPI' }) parentId: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: { id: parentId } },\n order: { name: 'ASC' }\n })\n }\n}\n"]}
@@ -1,7 +1,3 @@
1
- export * from './kpi-org-scope';
2
- export * from './kpi-org-scope-type';
3
- export * from './kpi-org-scope-query';
4
- export * from './kpi-org-scope-mutation';
5
1
  import { KpiOrgScope } from './kpi-org-scope';
6
2
  import { KpiOrgScopeQuery } from './kpi-org-scope-query';
7
3
  import { KpiOrgScopeMutation } from './kpi-org-scope-mutation';
@@ -1,11 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resolvers = exports.entities = void 0;
4
- const tslib_1 = require("tslib");
5
- tslib_1.__exportStar(require("./kpi-org-scope"), exports);
6
- tslib_1.__exportStar(require("./kpi-org-scope-type"), exports);
7
- tslib_1.__exportStar(require("./kpi-org-scope-query"), exports);
8
- tslib_1.__exportStar(require("./kpi-org-scope-mutation"), exports);
9
4
  const kpi_org_scope_1 = require("./kpi-org-scope");
10
5
  const kpi_org_scope_query_1 = require("./kpi-org-scope-query");
11
6
  const kpi_org_scope_mutation_1 = require("./kpi-org-scope-mutation");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/kpi-org-scope/index.ts"],"names":[],"mappings":";;;;AAAA,0DAA+B;AAC/B,+DAAoC;AACpC,gEAAqC;AACrC,mEAAwC;AAExC,mDAA6C;AAC7C,+DAAwD;AACxD,qEAA8D;AAEjD,QAAA,QAAQ,GAAG,CAAC,2BAAW,CAAC,CAAA;AACxB,QAAA,SAAS,GAAG,CAAC,sCAAgB,EAAE,4CAAmB,CAAC,CAAA","sourcesContent":["export * from './kpi-org-scope'\nexport * from './kpi-org-scope-type'\nexport * from './kpi-org-scope-query'\nexport * from './kpi-org-scope-mutation'\n\nimport { KpiOrgScope } from './kpi-org-scope'\nimport { KpiOrgScopeQuery } from './kpi-org-scope-query'\nimport { KpiOrgScopeMutation } from './kpi-org-scope-mutation'\n\nexport const entities = [KpiOrgScope]\nexport const resolvers = [KpiOrgScopeQuery, KpiOrgScopeMutation]"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/kpi-org-scope/index.ts"],"names":[],"mappings":";;;AAAA,mDAA6C;AAC7C,+DAAwD;AACxD,qEAA8D;AAEjD,QAAA,QAAQ,GAAG,CAAC,2BAAW,CAAC,CAAA;AACxB,QAAA,SAAS,GAAG,CAAC,sCAAgB,EAAE,4CAAmB,CAAC,CAAA","sourcesContent":["import { KpiOrgScope } from './kpi-org-scope'\nimport { KpiOrgScopeQuery } from './kpi-org-scope-query'\nimport { KpiOrgScopeMutation } from './kpi-org-scope-mutation'\n\nexport const entities = [KpiOrgScope]\nexport const resolvers = [KpiOrgScopeQuery, KpiOrgScopeMutation]\n"]}
@@ -0,0 +1,9 @@
1
+ import { KpiScope } from './kpi-scope';
2
+ import { KpiScopeQuery } from './kpi-scope-query';
3
+ import { KpiScopeMutation } from './kpi-scope-mutation';
4
+ export declare const entities: (typeof KpiScope)[];
5
+ export declare const resolvers: (typeof KpiScopeQuery | typeof KpiScopeMutation)[];
6
+ export * from './kpi-scope';
7
+ export * from './kpi-scope-query';
8
+ export * from './kpi-scope-mutation';
9
+ export * from './kpi-scope-type';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const kpi_scope_1 = require("./kpi-scope");
6
+ const kpi_scope_query_1 = require("./kpi-scope-query");
7
+ const kpi_scope_mutation_1 = require("./kpi-scope-mutation");
8
+ exports.entities = [kpi_scope_1.KpiScope];
9
+ exports.resolvers = [kpi_scope_query_1.KpiScopeQuery, kpi_scope_mutation_1.KpiScopeMutation];
10
+ tslib_1.__exportStar(require("./kpi-scope"), exports);
11
+ tslib_1.__exportStar(require("./kpi-scope-query"), exports);
12
+ tslib_1.__exportStar(require("./kpi-scope-mutation"), exports);
13
+ tslib_1.__exportStar(require("./kpi-scope-type"), exports);
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/kpi-scope/index.ts"],"names":[],"mappings":";;;;AAAA,2CAAsC;AACtC,uDAAiD;AACjD,6DAAuD;AAE1C,QAAA,QAAQ,GAAG,CAAC,oBAAQ,CAAC,CAAA;AACrB,QAAA,SAAS,GAAG,CAAC,+BAAa,EAAE,qCAAgB,CAAC,CAAA;AAE1D,sDAA2B;AAC3B,4DAAiC;AACjC,+DAAoC;AACpC,2DAAgC","sourcesContent":["import { KpiScope } from './kpi-scope'\nimport { KpiScopeQuery } from './kpi-scope-query'\nimport { KpiScopeMutation } from './kpi-scope-mutation'\n\nexport const entities = [KpiScope]\nexport const resolvers = [KpiScopeQuery, KpiScopeMutation]\n\nexport * from './kpi-scope'\nexport * from './kpi-scope-query'\nexport * from './kpi-scope-mutation'\nexport * from './kpi-scope-type'\n"]}
@@ -0,0 +1,9 @@
1
+ import { KpiScope } from './kpi-scope';
2
+ import { NewKpiScope, KpiScopePatch } from './kpi-scope-type';
3
+ export declare class KpiScopeMutation {
4
+ createKpiScope(kpiScope: NewKpiScope, context: ResolverContext): Promise<KpiScope>;
5
+ updateKpiScope(id: string, patch: KpiScopePatch, context: ResolverContext): Promise<KpiScope>;
6
+ updateMultipleKpiScope(patches: KpiScopePatch[], context: ResolverContext): Promise<KpiScope[]>;
7
+ deleteKpiScope(id: string, context: ResolverContext): Promise<boolean>;
8
+ deleteKpiScopes(ids: string[], context: ResolverContext): Promise<boolean>;
9
+ }
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KpiScopeMutation = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const typeorm_1 = require("typeorm");
7
+ const shell_1 = require("@things-factory/shell");
8
+ const kpi_scope_1 = require("./kpi-scope");
9
+ const kpi_scope_type_1 = require("./kpi-scope-type");
10
+ let KpiScopeMutation = class KpiScopeMutation {
11
+ async createKpiScope(kpiScope, context) {
12
+ const { domain, user, tx } = context.state;
13
+ const result = await (0, shell_1.getRepository)(kpi_scope_1.KpiScope, tx).save({
14
+ ...kpiScope,
15
+ domain,
16
+ creator: user,
17
+ updater: user
18
+ });
19
+ return result;
20
+ }
21
+ async updateKpiScope(id, patch, context) {
22
+ const { domain, user, tx } = context.state;
23
+ const repository = (0, shell_1.getRepository)(kpi_scope_1.KpiScope, tx);
24
+ const kpiScope = await repository.findOne({
25
+ where: { domain: { id: domain.id }, id }
26
+ });
27
+ const result = await repository.save({
28
+ ...kpiScope,
29
+ ...patch,
30
+ updater: user
31
+ });
32
+ return result;
33
+ }
34
+ async updateMultipleKpiScope(patches, context) {
35
+ const { domain, user, tx } = context.state;
36
+ let results = [];
37
+ const _createRecords = patches.filter((patch) => patch.cuFlag.toUpperCase() === '+');
38
+ const _updateRecords = patches.filter((patch) => patch.cuFlag.toUpperCase() === 'M');
39
+ const kpiScopeRepo = (0, shell_1.getRepository)(kpi_scope_1.KpiScope, tx);
40
+ if (_createRecords.length > 0) {
41
+ for (let i = 0; i < _createRecords.length; i++) {
42
+ const newRecord = _createRecords[i];
43
+ const result = await kpiScopeRepo.save({
44
+ ...newRecord,
45
+ domain,
46
+ creator: user,
47
+ updater: user
48
+ });
49
+ results.push({ ...result, cuFlag: '+' });
50
+ }
51
+ }
52
+ if (_updateRecords.length > 0) {
53
+ for (let i = 0; i < _updateRecords.length; i++) {
54
+ const updateRecord = _updateRecords[i];
55
+ const kpiScope = await kpiScopeRepo.findOneBy({ id: updateRecord.id });
56
+ const result = await kpiScopeRepo.save({
57
+ ...kpiScope,
58
+ ...updateRecord,
59
+ updater: user
60
+ });
61
+ results.push({ ...result, cuFlag: 'M' });
62
+ }
63
+ }
64
+ return results;
65
+ }
66
+ async deleteKpiScope(id, context) {
67
+ const { domain, tx } = context.state;
68
+ await (0, shell_1.getRepository)(kpi_scope_1.KpiScope, tx).delete({ domain: { id: domain.id }, id });
69
+ return true;
70
+ }
71
+ async deleteKpiScopes(ids, context) {
72
+ const { domain, tx } = context.state;
73
+ await (0, shell_1.getRepository)(kpi_scope_1.KpiScope, tx).delete({
74
+ domain: { id: domain.id },
75
+ id: (0, typeorm_1.In)(ids)
76
+ });
77
+ return true;
78
+ }
79
+ };
80
+ exports.KpiScopeMutation = KpiScopeMutation;
81
+ tslib_1.__decorate([
82
+ (0, type_graphql_1.Directive)('@transaction'),
83
+ (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
84
+ (0, type_graphql_1.Mutation)(returns => kpi_scope_1.KpiScope, { description: 'Create a new scope dimension definition' }),
85
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('kpiScope')),
86
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
87
+ tslib_1.__metadata("design:type", Function),
88
+ tslib_1.__metadata("design:paramtypes", [kpi_scope_type_1.NewKpiScope, Object]),
89
+ tslib_1.__metadata("design:returntype", Promise)
90
+ ], KpiScopeMutation.prototype, "createKpiScope", null);
91
+ tslib_1.__decorate([
92
+ (0, type_graphql_1.Directive)('@transaction'),
93
+ (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
94
+ (0, type_graphql_1.Mutation)(returns => kpi_scope_1.KpiScope, { description: 'Update a scope dimension definition' }),
95
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
96
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('patch')),
97
+ tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
98
+ tslib_1.__metadata("design:type", Function),
99
+ tslib_1.__metadata("design:paramtypes", [String, kpi_scope_type_1.KpiScopePatch, Object]),
100
+ tslib_1.__metadata("design:returntype", Promise)
101
+ ], KpiScopeMutation.prototype, "updateKpiScope", null);
102
+ tslib_1.__decorate([
103
+ (0, type_graphql_1.Directive)('@transaction'),
104
+ (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
105
+ (0, type_graphql_1.Mutation)(returns => [kpi_scope_1.KpiScope], { description: "Update multiple scope dimension definitions" }),
106
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [kpi_scope_type_1.KpiScopePatch])),
107
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
108
+ tslib_1.__metadata("design:type", Function),
109
+ tslib_1.__metadata("design:paramtypes", [Array, Object]),
110
+ tslib_1.__metadata("design:returntype", Promise)
111
+ ], KpiScopeMutation.prototype, "updateMultipleKpiScope", null);
112
+ tslib_1.__decorate([
113
+ (0, type_graphql_1.Directive)('@transaction'),
114
+ (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
115
+ (0, type_graphql_1.Mutation)(returns => Boolean, { description: 'Delete a scope dimension definition' }),
116
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
117
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
118
+ tslib_1.__metadata("design:type", Function),
119
+ tslib_1.__metadata("design:paramtypes", [String, Object]),
120
+ tslib_1.__metadata("design:returntype", Promise)
121
+ ], KpiScopeMutation.prototype, "deleteKpiScope", null);
122
+ tslib_1.__decorate([
123
+ (0, type_graphql_1.Directive)('@transaction'),
124
+ (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
125
+ (0, type_graphql_1.Mutation)(returns => Boolean, { description: 'Delete multiple scope dimension definitions' }),
126
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('ids', type => [String])),
127
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
128
+ tslib_1.__metadata("design:type", Function),
129
+ tslib_1.__metadata("design:paramtypes", [Array, Object]),
130
+ tslib_1.__metadata("design:returntype", Promise)
131
+ ], KpiScopeMutation.prototype, "deleteKpiScopes", null);
132
+ exports.KpiScopeMutation = KpiScopeMutation = tslib_1.__decorate([
133
+ (0, type_graphql_1.Resolver)(kpi_scope_1.KpiScope)
134
+ ], KpiScopeMutation);
135
+ //# sourceMappingURL=kpi-scope-mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kpi-scope-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-scope/kpi-scope-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\n\nimport { KpiScope } from './kpi-scope'\nimport { NewKpiScope, KpiScopePatch } from './kpi-scope-type'\n\n@Resolver(KpiScope)\nexport class KpiScopeMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiScope, { description: 'Create a new scope dimension definition' })\n async createKpiScope(\n @Arg('kpiScope') kpiScope: NewKpiScope,\n @Ctx() context: ResolverContext\n ): Promise<KpiScope> {\n const { domain, user, tx } = context.state\n\n const result = await getRepository(KpiScope, tx).save({\n ...kpiScope,\n domain,\n creator: user,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiScope, { description: 'Update a scope dimension definition' })\n async updateKpiScope(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiScopePatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiScope> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiScope, tx)\n const kpiScope = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n const result = await repository.save({\n ...kpiScope,\n ...patch,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiScope], { description: \"Update multiple scope dimension definitions\" })\n async updateMultipleKpiScope(\n @Arg('patches', type => [KpiScopePatch]) patches: KpiScopePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiScope[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const kpiScopeRepo = getRepository(KpiScope, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await kpiScopeRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const kpiScope = await kpiScopeRepo.findOneBy({ id: updateRecord.id })\n\n const result = await kpiScopeRepo.save({\n ...kpiScope,\n ...updateRecord,\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'Delete a scope dimension definition' })\n async deleteKpiScope(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiScope, tx).delete({ domain: { id: domain.id }, id })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'Delete multiple scope dimension definitions' })\n async deleteKpiScopes(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiScope, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n}"]}
@@ -0,0 +1,11 @@
1
+ import { Domain, ListParam } from '@things-factory/shell';
2
+ import { User } from '@things-factory/auth-base';
3
+ import { KpiScope } from './kpi-scope';
4
+ import { KpiScopeList } from './kpi-scope-type';
5
+ export declare class KpiScopeQuery {
6
+ kpiScope(id: string, context: ResolverContext): Promise<KpiScope>;
7
+ kpiScopes(params: ListParam, context: ResolverContext): Promise<KpiScopeList>;
8
+ domain(kpiScope: KpiScope): Promise<Domain>;
9
+ updater(kpiScope: KpiScope): Promise<User>;
10
+ creator(kpiScope: KpiScope): Promise<User>;
11
+ }