@dssp/dkpi 1.0.0-alpha.55 → 1.0.0-alpha.56

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 (29) hide show
  1. package/assets/images/project-image.png +0 -0
  2. package/dist-client/components/kpi-boxplot-chart.js +48 -76
  3. package/dist-client/components/kpi-boxplot-chart.js.map +1 -1
  4. package/dist-client/components/kpi-radar-chart.d.ts +1 -0
  5. package/dist-client/components/kpi-radar-chart.js +85 -7
  6. package/dist-client/components/kpi-radar-chart.js.map +1 -1
  7. package/dist-client/components/kpi-single-boxplot-chart.js +24 -6
  8. package/dist-client/components/kpi-single-boxplot-chart.js.map +1 -1
  9. package/dist-client/pages/sv-project-complete.js +3 -1
  10. package/dist-client/pages/sv-project-complete.js.map +1 -1
  11. package/dist-client/pages/sv-project-completed-list.d.ts +2 -2
  12. package/dist-client/pages/sv-project-completed-list.js +14 -14
  13. package/dist-client/pages/sv-project-completed-list.js.map +1 -1
  14. package/dist-client/pages/sv-project-detail.d.ts +8 -0
  15. package/dist-client/pages/sv-project-detail.js +203 -58
  16. package/dist-client/pages/sv-project-detail.js.map +1 -1
  17. package/dist-client/pages/sv-project-list.d.ts +7 -2
  18. package/dist-client/pages/sv-project-list.js +13 -13
  19. package/dist-client/pages/sv-project-list.js.map +1 -1
  20. package/dist-client/tsconfig.tsbuildinfo +1 -1
  21. package/dist-server/service/kpi-stat/kpi-stat-query.d.ts +5 -6
  22. package/dist-server/service/kpi-stat/kpi-stat-query.js +108 -100
  23. package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -1
  24. package/dist-server/service/kpi-stat/kpi-stat-types.d.ts +5 -12
  25. package/dist-server/service/kpi-stat/kpi-stat-types.js +72 -42
  26. package/dist-server/service/kpi-stat/kpi-stat-types.js.map +1 -1
  27. package/dist-server/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +3 -3
  29. package/schema.graphql +41 -0
@@ -1,8 +1,7 @@
1
- import { KpiBoxPlotStats, KpiRadarStats, KpiBoxPlotStatsByGeoGroup } from './kpi-stat-types';
1
+ import { KpiComprehensiveStats, KpiComprehensiveStatsByGeoGroup } from './kpi-stat-types';
2
2
  export declare class KpiStatQuery {
3
- totalKpiZValueBoxPlotStats(context?: ResolverContext): Promise<KpiBoxPlotStats[]>;
4
- kpiZValueBoxPlotStats(geoGroup?: string, context?: ResolverContext): Promise<KpiBoxPlotStatsByGeoGroup[]>;
5
- kpiYValueBoxPlotStats(geoGroup?: string, context?: ResolverContext): Promise<KpiBoxPlotStats[]>;
6
- kpiRadarStats(kpiPattern: string, geoGroup?: string, context?: ResolverContext): Promise<KpiRadarStats[]>;
7
- kpiComprehensiveStats(geoGroup?: string, includeOngoing?: boolean, context?: ResolverContext): Promise<KpiRadarStats[]>;
3
+ totalKpiZValueComprehensiveStats(context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
4
+ totalKpiYValueComprehensiveStats(context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
5
+ kpiZValueComprehensiveStatsByGeoGroup(geoGroup?: string, context?: ResolverContext): Promise<KpiComprehensiveStatsByGeoGroup[]>;
6
+ kpiYValueComprehensiveStatsByGeoGroup(geoGroup?: string, context?: ResolverContext): Promise<KpiComprehensiveStatsByGeoGroup[]>;
8
7
  }
@@ -7,126 +7,158 @@ const shell_1 = require("@things-factory/shell");
7
7
  const kpi_1 = require("@things-factory/kpi");
8
8
  const kpi_stat_types_1 = require("./kpi-stat-types");
9
9
  let KpiStatQuery = class KpiStatQuery {
10
- async totalKpiZValueBoxPlotStats(context) {
10
+ async totalKpiZValueComprehensiveStats(context) {
11
11
  const { domain } = context.state;
12
12
  const queryBuilder = (0, shell_1.getRepository)('kpi_values')
13
13
  .createQueryBuilder('kv')
14
14
  .select([
15
+ 'k.name as kpiName',
15
16
  'MIN(kv.score) as minVal',
16
17
  'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',
17
18
  'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',
18
19
  'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',
19
- 'MAX(kv.score) as maxVal'
20
+ 'AVG(kv.score) as avgVal',
21
+ 'MAX(kv.score) as maxVal',
22
+ 'COUNT(DISTINCT p.id) as projectCount'
20
23
  ])
21
24
  .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
22
25
  .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
23
26
  .where('k.name LIKE :pattern', { pattern: 'Z%' })
24
27
  .andWhere('p.end_date IS NOT NULL')
25
- .andWhere('kv.domain_id = :domainId', { domainId: domain.id });
28
+ .andWhere('kv.domain_id = :domainId', { domainId: domain.id })
29
+ .groupBy('k.name');
26
30
  const results = await queryBuilder.getRawMany();
27
31
  return results.map(result => {
32
+ const kpiName = result.kpiname;
28
33
  const minVal = Number(result.minval);
29
34
  const q1Val = Number(result.q1val);
30
35
  const medVal = Number(result.medval);
31
36
  const q3Val = Number(result.q3val);
37
+ const avgVal = Number(result.avgval);
32
38
  const maxVal = Number(result.maxval);
39
+ const projectCount = Number(result.projectcount);
33
40
  return {
41
+ kpiName: kpiName,
34
42
  minVal: isNaN(minVal) ? 0 : minVal,
35
43
  q1Val: isNaN(q1Val) ? 0 : q1Val,
36
44
  medVal: isNaN(medVal) ? 0 : medVal,
37
45
  q3Val: isNaN(q3Val) ? 0 : q3Val,
38
- maxVal: isNaN(maxVal) ? 0 : maxVal
46
+ maxVal: isNaN(maxVal) ? 0 : maxVal,
47
+ avgVal: isNaN(avgVal) ? 0 : avgVal,
48
+ projectCount: isNaN(projectCount) ? 0 : projectCount
39
49
  };
40
50
  });
41
51
  }
42
- async kpiZValueBoxPlotStats(geoGroup, context) {
52
+ async totalKpiYValueComprehensiveStats(context) {
43
53
  const { domain } = context.state;
44
54
  const queryBuilder = (0, shell_1.getRepository)('kpi_values')
45
55
  .createQueryBuilder('kv')
46
56
  .select([
47
- 'p.geo_group as geoGroup',
57
+ 'k.name as kpiName',
48
58
  'MIN(kv.score) as minVal',
49
59
  'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',
50
60
  'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',
51
61
  'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',
52
- 'MAX(kv.score) as maxVal'
62
+ 'AVG(kv.score) as avgVal',
63
+ 'MAX(kv.score) as maxVal',
64
+ 'COUNT(DISTINCT p.id) as projectCount'
53
65
  ])
54
66
  .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
55
67
  .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
56
- .where('k.name LIKE :pattern', { pattern: 'Z%' })
68
+ .where('k.name LIKE :pattern', { pattern: 'Y%' })
57
69
  .andWhere('p.end_date IS NOT NULL')
58
- .andWhere('p.geo_group IS NOT NULL')
59
70
  .andWhere('kv.domain_id = :domainId', { domainId: domain.id })
60
- .groupBy('p.geo_group');
61
- if (geoGroup && geoGroup.trim() !== '') {
62
- queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` });
63
- }
71
+ .groupBy('k.name')
72
+ .orderBy('k.name', 'ASC');
64
73
  const results = await queryBuilder.getRawMany();
65
- return results
66
- .map(result => {
67
- const minVal = Number(result.minVal);
68
- const q1Val = Number(result.q1Val);
69
- const medVal = Number(result.medVal);
70
- const q3Val = Number(result.q3Val);
71
- const maxVal = Number(result.maxVal);
74
+ return results.map(result => {
75
+ const kpiName = result.kpiname;
76
+ const minVal = Number(result.minval);
77
+ const q1Val = Number(result.q1val);
78
+ const medVal = Number(result.medval);
79
+ const q3Val = Number(result.q3val);
80
+ const avgVal = Number(result.avgval);
81
+ const maxVal = Number(result.maxval);
82
+ const projectCount = Number(result.projectcount);
72
83
  return {
73
- geoGroup: result.geoGroup || null,
84
+ kpiName: kpiName,
74
85
  minVal: isNaN(minVal) ? 0 : minVal,
75
86
  q1Val: isNaN(q1Val) ? 0 : q1Val,
76
87
  medVal: isNaN(medVal) ? 0 : medVal,
77
88
  q3Val: isNaN(q3Val) ? 0 : q3Val,
78
- maxVal: isNaN(maxVal) ? 0 : maxVal
89
+ maxVal: isNaN(maxVal) ? 0 : maxVal,
90
+ avgVal: isNaN(avgVal) ? 0 : avgVal,
91
+ projectCount: isNaN(projectCount) ? 0 : projectCount
79
92
  };
80
- })
81
- .filter(result => result.geoGroup !== null);
93
+ });
82
94
  }
83
- async kpiYValueBoxPlotStats(geoGroup, context) {
95
+ async kpiZValueComprehensiveStatsByGeoGroup(geoGroup, context) {
84
96
  const { domain } = context.state;
85
97
  const queryBuilder = (0, shell_1.getRepository)('kpi_values')
86
98
  .createQueryBuilder('kv')
87
99
  .select([
88
100
  'p.geo_group as geoGroup',
89
- 'k.name as kpiName',
90
101
  'MIN(kv.score) as minVal',
91
102
  'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',
92
103
  'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',
93
104
  'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',
94
- 'MAX(kv.score) as maxVal'
105
+ 'MAX(kv.score) as maxVal',
106
+ 'AVG(kv.score) as avgVal',
107
+ 'COUNT(DISTINCT p.id) as projectCount'
95
108
  ])
96
109
  .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
97
110
  .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
98
- .where('k.name LIKE :pattern', { pattern: 'Y%' })
111
+ .where('k.name LIKE :pattern', { pattern: 'Z%' })
99
112
  .andWhere('p.end_date IS NOT NULL')
100
113
  .andWhere('p.geo_group IS NOT NULL')
101
114
  .andWhere('kv.domain_id = :domainId', { domainId: domain.id })
102
- .groupBy('p.geo_group, k.name');
115
+ .groupBy('p.geo_group');
103
116
  if (geoGroup && geoGroup.trim() !== '') {
104
117
  queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` });
105
118
  }
106
119
  const results = await queryBuilder.getRawMany();
107
- return results.map(result => ({
108
- geoGroup: result.geoGroup,
109
- kpiName: result.kpiName,
110
- minVal: parseFloat(result.minVal),
111
- q1Val: parseFloat(result.q1Val),
112
- medVal: parseFloat(result.medVal),
113
- q3Val: parseFloat(result.q3Val),
114
- maxVal: parseFloat(result.maxVal)
115
- }));
120
+ return results
121
+ .map(result => {
122
+ const kpiName = result.kpiname;
123
+ const minVal = Number(result.minval);
124
+ const q1Val = Number(result.q1val);
125
+ const medVal = Number(result.medval);
126
+ const q3Val = Number(result.q3val);
127
+ const maxVal = Number(result.maxval);
128
+ const avgVal = Number(result.avgval);
129
+ const projectCount = Number(result.projectcount);
130
+ return {
131
+ kpiName: kpiName,
132
+ geoGroup: result.geogroup || null,
133
+ minVal: isNaN(minVal) ? 0 : minVal,
134
+ q1Val: isNaN(q1Val) ? 0 : q1Val,
135
+ medVal: isNaN(medVal) ? 0 : medVal,
136
+ q3Val: isNaN(q3Val) ? 0 : q3Val,
137
+ maxVal: isNaN(maxVal) ? 0 : maxVal,
138
+ avgVal: isNaN(avgVal) ? 0 : avgVal,
139
+ projectCount: isNaN(projectCount) ? 0 : projectCount
140
+ };
141
+ })
142
+ .filter(result => result.geoGroup !== null);
116
143
  }
117
- async kpiRadarStats(kpiPattern, geoGroup, context) {
144
+ async kpiYValueComprehensiveStatsByGeoGroup(geoGroup, context) {
118
145
  const { domain } = context.state;
119
146
  const queryBuilder = (0, shell_1.getRepository)('kpi_values')
120
147
  .createQueryBuilder('kv')
121
148
  .select([
122
149
  'p.geo_group as geoGroup',
123
150
  'k.name as kpiName',
124
- 'AVG(kv.score) as avgScore',
151
+ 'MIN(kv.score) as minVal',
152
+ 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',
153
+ 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',
154
+ 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',
155
+ 'MAX(kv.score) as maxVal',
156
+ 'AVG(kv.score) as avgVal',
125
157
  'COUNT(DISTINCT p.id) as projectCount'
126
158
  ])
127
159
  .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
128
160
  .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
129
- .where('k.name LIKE :pattern', { pattern: kpiPattern })
161
+ .where('k.name LIKE :pattern', { pattern: 'Y%' })
130
162
  .andWhere('p.end_date IS NOT NULL')
131
163
  .andWhere('p.geo_group IS NOT NULL')
132
164
  .andWhere('kv.domain_id = :domainId', { domainId: domain.id })
@@ -135,90 +167,66 @@ let KpiStatQuery = class KpiStatQuery {
135
167
  queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` });
136
168
  }
137
169
  const results = await queryBuilder.getRawMany();
138
- return results.map(result => ({
139
- geoGroup: result.geoGroup,
140
- kpiName: result.kpiName,
141
- avgScore: parseFloat(result.avgScore),
142
- projectCount: parseInt(result.projectCount)
143
- }));
144
- }
145
- async kpiComprehensiveStats(geoGroup, includeOngoing, context) {
146
- const { domain } = context.state;
147
- const queryBuilder = (0, shell_1.getRepository)('kpi_values')
148
- .createQueryBuilder('kv')
149
- .select([
150
- 'p.geo_group as geoGroup',
151
- 'k.name as kpiName',
152
- 'AVG(kv.score) as avgScore',
153
- 'COUNT(DISTINCT p.id) as projectCount'
154
- ])
155
- .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
156
- .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
157
- .where('kv.domain_id = :domainId', { domainId: domain.id })
158
- .andWhere('p.geo_group IS NOT NULL');
159
- if (!includeOngoing) {
160
- queryBuilder.andWhere('p.end_date IS NOT NULL');
161
- }
162
- if (geoGroup && geoGroup.trim() !== '') {
163
- queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` });
164
- }
165
- queryBuilder.groupBy('p.geo_group, k.name').orderBy('p.geo_group, k.name');
166
- const results = await queryBuilder.getRawMany();
167
- return results.map(result => ({
168
- geoGroup: result.geoGroup,
169
- kpiName: result.kpiName,
170
- avgScore: parseFloat(result.avgScore),
171
- projectCount: parseInt(result.projectCount)
172
- }));
170
+ return results
171
+ .map(result => {
172
+ const kpiName = result.kpiname;
173
+ const minVal = Number(result.minval);
174
+ const q1Val = Number(result.q1val);
175
+ const medVal = Number(result.medval);
176
+ const q3Val = Number(result.q3val);
177
+ const maxVal = Number(result.maxval);
178
+ const avgVal = Number(result.avgval);
179
+ const projectCount = Number(result.projectcount);
180
+ return {
181
+ kpiName: kpiName,
182
+ geoGroup: result.geogroup || null,
183
+ minVal: isNaN(minVal) ? 0 : minVal,
184
+ q1Val: isNaN(q1Val) ? 0 : q1Val,
185
+ medVal: isNaN(medVal) ? 0 : medVal,
186
+ q3Val: isNaN(q3Val) ? 0 : q3Val,
187
+ maxVal: isNaN(maxVal) ? 0 : maxVal,
188
+ avgVal: isNaN(avgVal) ? 0 : avgVal,
189
+ projectCount: isNaN(projectCount) ? 0 : projectCount
190
+ };
191
+ })
192
+ .filter(result => result.geoGroup !== null);
173
193
  }
174
194
  };
175
195
  exports.KpiStatQuery = KpiStatQuery;
176
196
  tslib_1.__decorate([
177
197
  (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
178
- (0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiBoxPlotStats], { description: 'Get KPI box plot statistics for Z-category KPIs by geo group' }),
198
+ (0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' }),
179
199
  tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
180
200
  tslib_1.__metadata("design:type", Function),
181
201
  tslib_1.__metadata("design:paramtypes", [Object]),
182
202
  tslib_1.__metadata("design:returntype", Promise)
183
- ], KpiStatQuery.prototype, "totalKpiZValueBoxPlotStats", null);
203
+ ], KpiStatQuery.prototype, "totalKpiZValueComprehensiveStats", null);
184
204
  tslib_1.__decorate([
185
205
  (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
186
- (0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiBoxPlotStatsByGeoGroup], { description: 'Get KPI box plot statistics for Z-category KPIs by geo group' }),
187
- tslib_1.__param(0, (0, type_graphql_1.Arg)('geoGroup', { nullable: true })),
188
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
206
+ (0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' }),
207
+ tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
189
208
  tslib_1.__metadata("design:type", Function),
190
- tslib_1.__metadata("design:paramtypes", [String, Object]),
209
+ tslib_1.__metadata("design:paramtypes", [Object]),
191
210
  tslib_1.__metadata("design:returntype", Promise)
192
- ], KpiStatQuery.prototype, "kpiZValueBoxPlotStats", null);
211
+ ], KpiStatQuery.prototype, "totalKpiYValueComprehensiveStats", null);
193
212
  tslib_1.__decorate([
194
213
  (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
195
- (0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiBoxPlotStats], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group and KPI name' }),
214
+ (0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Z-category KPIs by geo group' }),
196
215
  tslib_1.__param(0, (0, type_graphql_1.Arg)('geoGroup', { nullable: true })),
197
216
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
198
217
  tslib_1.__metadata("design:type", Function),
199
218
  tslib_1.__metadata("design:paramtypes", [String, Object]),
200
219
  tslib_1.__metadata("design:returntype", Promise)
201
- ], KpiStatQuery.prototype, "kpiYValueBoxPlotStats", null);
220
+ ], KpiStatQuery.prototype, "kpiZValueComprehensiveStatsByGeoGroup", null);
202
221
  tslib_1.__decorate([
203
222
  (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
204
- (0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiRadarStats], { description: 'Get KPI radar chart statistics by geo group and KPI category' }),
205
- tslib_1.__param(0, (0, type_graphql_1.Arg)('kpiPattern', { defaultValue: '%' })),
206
- tslib_1.__param(1, (0, type_graphql_1.Arg)('geoGroup', { nullable: true })),
207
- tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
208
- tslib_1.__metadata("design:type", Function),
209
- tslib_1.__metadata("design:paramtypes", [String, String, Object]),
210
- tslib_1.__metadata("design:returntype", Promise)
211
- ], KpiStatQuery.prototype, "kpiRadarStats", null);
212
- tslib_1.__decorate([
213
- (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
214
- (0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiRadarStats], { description: 'Get comprehensive KPI statistics for all completed projects' }),
223
+ (0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group' }),
215
224
  tslib_1.__param(0, (0, type_graphql_1.Arg)('geoGroup', { nullable: true })),
216
- tslib_1.__param(1, (0, type_graphql_1.Arg)('includeOngoing', { defaultValue: false })),
217
- tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
225
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
218
226
  tslib_1.__metadata("design:type", Function),
219
- tslib_1.__metadata("design:paramtypes", [String, Boolean, Object]),
227
+ tslib_1.__metadata("design:paramtypes", [String, Object]),
220
228
  tslib_1.__metadata("design:returntype", Promise)
221
- ], KpiStatQuery.prototype, "kpiComprehensiveStats", null);
229
+ ], KpiStatQuery.prototype, "kpiYValueComprehensiveStatsByGeoGroup", null);
222
230
  exports.KpiStatQuery = KpiStatQuery = tslib_1.__decorate([
223
231
  (0, type_graphql_1.Resolver)(kpi_1.KpiStatistic)
224
232
  ], KpiStatQuery);
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-stat-query.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/kpi-stat-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { KpiStatistic } from '@things-factory/kpi'\nimport { KpiBoxPlotStats, KpiRadarStats, KpiBoxPlotStatsByGeoGroup } from './kpi-stat-types'\n\n@Resolver(KpiStatistic)\nexport class KpiStatQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiBoxPlotStats], { description: 'Get KPI box plot statistics for Z-category KPIs by geo group' })\n async totalKpiZValueBoxPlotStats(@Ctx() context?: ResolverContext): Promise<KpiBoxPlotStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Z%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const maxVal = Number(result.maxval)\n\n return {\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiBoxPlotStatsByGeoGroup], { description: 'Get KPI box plot statistics for Z-category KPIs by geo group' })\n async kpiZValueBoxPlotStats(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiBoxPlotStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Z%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('p.geo_group')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const minVal = Number(result.minVal)\n const q1Val = Number(result.q1Val)\n const medVal = Number(result.medVal)\n const q3Val = Number(result.q3Val)\n const maxVal = Number(result.maxVal)\n\n return {\n geoGroup: result.geoGroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiBoxPlotStats], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group and KPI name' })\n async kpiYValueBoxPlotStats(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiBoxPlotStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('p.geo_group, k.name')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results.map(result => ({\n geoGroup: result.geoGroup,\n kpiName: result.kpiName,\n minVal: parseFloat(result.minVal),\n q1Val: parseFloat(result.q1Val),\n medVal: parseFloat(result.medVal),\n q3Val: parseFloat(result.q3Val),\n maxVal: parseFloat(result.maxVal)\n }))\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiRadarStats], { description: 'Get KPI radar chart statistics by geo group and KPI category' })\n async kpiRadarStats(\n @Arg('kpiPattern', { defaultValue: '%' }) kpiPattern: string,\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiRadarStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'k.name as kpiName',\n 'AVG(kv.score) as avgScore',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: kpiPattern })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('p.geo_group, k.name')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results.map(result => ({\n geoGroup: result.geoGroup,\n kpiName: result.kpiName,\n avgScore: parseFloat(result.avgScore),\n projectCount: parseInt(result.projectCount)\n }))\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiRadarStats], { description: 'Get comprehensive KPI statistics for all completed projects' })\n async kpiComprehensiveStats(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Arg('includeOngoing', { defaultValue: false }) includeOngoing?: boolean,\n @Ctx() context?: ResolverContext\n ): Promise<KpiRadarStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'k.name as kpiName',\n 'AVG(kv.score) as avgScore',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('kv.domain_id = :domainId', { domainId: domain.id })\n .andWhere('p.geo_group IS NOT NULL')\n\n if (!includeOngoing) {\n queryBuilder.andWhere('p.end_date IS NOT NULL')\n }\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n queryBuilder.groupBy('p.geo_group, k.name').orderBy('p.geo_group, k.name')\n\n const results = await queryBuilder.getRawMany()\n return results.map(result => ({\n geoGroup: result.geoGroup,\n kpiName: result.kpiName,\n avgScore: parseFloat(result.avgScore),\n projectCount: parseInt(result.projectCount)\n }))\n }\n}\n"]}
1
+ {"version":3,"file":"kpi-stat-query.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/kpi-stat-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { KpiStatistic } from '@things-factory/kpi'\nimport { KpiComprehensiveStats, KpiComprehensiveStatsByGeoGroup } from './kpi-stat-types'\n\n@Resolver(KpiStatistic)\nexport class KpiStatQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' })\n async totalKpiZValueComprehensiveStats(@Ctx() context?: ResolverContext): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Z%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('k.name')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const avgVal = Number(result.avgval)\n const maxVal = Number(result.maxval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' })\n async totalKpiYValueComprehensiveStats(@Ctx() context?: ResolverContext): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('k.name')\n .orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const avgVal = Number(result.avgval)\n const maxVal = Number(result.maxval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Z-category KPIs by geo group' })\n async kpiZValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Z%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('p.geo_group')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const maxVal = Number(result.maxval)\n const avgVal = Number(result.avgval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group' })\n async kpiYValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('p.geo_group, k.name')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const maxVal = Number(result.maxval)\n const avgVal = Number(result.avgval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n}\n"]}
@@ -1,20 +1,13 @@
1
- export declare class KpiBoxPlotStats {
2
- kpiName?: string;
1
+ export declare class KpiComprehensiveStats {
2
+ kpiName: string;
3
3
  minVal: number;
4
4
  q1Val: number;
5
5
  medVal: number;
6
6
  q3Val: number;
7
7
  maxVal: number;
8
- }
9
- export declare class KpiBoxPlotStatsByGeoGroup extends KpiBoxPlotStats {
10
- geoGroup: string;
11
- }
12
- export declare class KpiRadarStats {
13
- geoGroup: string;
14
- kpiName: string;
15
- avgScore: number;
8
+ avgVal: number;
16
9
  projectCount: number;
17
10
  }
18
- export declare class KpiRadarStatsByGeoGroup extends KpiRadarStats {
19
- geoGroup: string;
11
+ export declare class KpiComprehensiveStatsByGeoGroup extends KpiComprehensiveStats {
12
+ geoGroup?: string;
20
13
  }
@@ -1,78 +1,108 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.KpiRadarStatsByGeoGroup = exports.KpiRadarStats = exports.KpiBoxPlotStatsByGeoGroup = exports.KpiBoxPlotStats = void 0;
3
+ exports.KpiComprehensiveStatsByGeoGroup = exports.KpiComprehensiveStats = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const type_graphql_1 = require("type-graphql");
6
- let KpiBoxPlotStats = class KpiBoxPlotStats {
6
+ // @ObjectType()
7
+ // export class KpiBoxPlotStats {
8
+ // @Field({ nullable: true })
9
+ // kpiName?: string
10
+ // @Field(() => Float)
11
+ // minVal: number
12
+ // @Field(() => Float)
13
+ // q1Val: number
14
+ // @Field(() => Float)
15
+ // medVal: number
16
+ // @Field(() => Float)
17
+ // q3Val: number
18
+ // @Field(() => Float)
19
+ // maxVal: number
20
+ // }
21
+ // @ObjectType()
22
+ // export class KpiBoxPlotStatsByGeoGroup extends KpiBoxPlotStats {
23
+ // @Field({ nullable: true })
24
+ // geoGroup: string
25
+ // // @Field({ nullable: true })
26
+ // // kpiName?: string
27
+ // // @Field(() => Float)
28
+ // // minVal: number
29
+ // // @Field(() => Float)
30
+ // // q1Val: number
31
+ // // @Field(() => Float)
32
+ // // medVal: number
33
+ // // @Field(() => Float)
34
+ // // q3Val: number
35
+ // // @Field(() => Float)
36
+ // // maxVal: number
37
+ // }
38
+ // @ObjectType()
39
+ // export class KpiRadarStats {
40
+ // @Field({ nullable: true })
41
+ // geoGroup: string
42
+ // @Field()
43
+ // kpiName: string
44
+ // @Field(() => Float)
45
+ // avgScore: number
46
+ // @Field(() => Int)
47
+ // projectCount: number
48
+ // }
49
+ // @ObjectType()
50
+ // export class KpiRadarStatsByGeoGroup extends KpiRadarStats {
51
+ // @Field({ nullable: true })
52
+ // geoGroup: string
53
+ // // @Field()
54
+ // // kpiName: string
55
+ // // @Field(() => Float)
56
+ // // avgScore: number
57
+ // // @Field(() => Int)
58
+ // // projectCount: number
59
+ // }
60
+ let KpiComprehensiveStats = class KpiComprehensiveStats {
7
61
  };
8
- exports.KpiBoxPlotStats = KpiBoxPlotStats;
62
+ exports.KpiComprehensiveStats = KpiComprehensiveStats;
9
63
  tslib_1.__decorate([
10
64
  (0, type_graphql_1.Field)({ nullable: true }),
11
65
  tslib_1.__metadata("design:type", String)
12
- ], KpiBoxPlotStats.prototype, "kpiName", void 0);
66
+ ], KpiComprehensiveStats.prototype, "kpiName", void 0);
13
67
  tslib_1.__decorate([
14
68
  (0, type_graphql_1.Field)(() => type_graphql_1.Float),
15
69
  tslib_1.__metadata("design:type", Number)
16
- ], KpiBoxPlotStats.prototype, "minVal", void 0);
70
+ ], KpiComprehensiveStats.prototype, "minVal", void 0);
17
71
  tslib_1.__decorate([
18
72
  (0, type_graphql_1.Field)(() => type_graphql_1.Float),
19
73
  tslib_1.__metadata("design:type", Number)
20
- ], KpiBoxPlotStats.prototype, "q1Val", void 0);
74
+ ], KpiComprehensiveStats.prototype, "q1Val", void 0);
21
75
  tslib_1.__decorate([
22
76
  (0, type_graphql_1.Field)(() => type_graphql_1.Float),
23
77
  tslib_1.__metadata("design:type", Number)
24
- ], KpiBoxPlotStats.prototype, "medVal", void 0);
78
+ ], KpiComprehensiveStats.prototype, "medVal", void 0);
25
79
  tslib_1.__decorate([
26
80
  (0, type_graphql_1.Field)(() => type_graphql_1.Float),
27
81
  tslib_1.__metadata("design:type", Number)
28
- ], KpiBoxPlotStats.prototype, "q3Val", void 0);
82
+ ], KpiComprehensiveStats.prototype, "q3Val", void 0);
29
83
  tslib_1.__decorate([
30
84
  (0, type_graphql_1.Field)(() => type_graphql_1.Float),
31
85
  tslib_1.__metadata("design:type", Number)
32
- ], KpiBoxPlotStats.prototype, "maxVal", void 0);
33
- exports.KpiBoxPlotStats = KpiBoxPlotStats = tslib_1.__decorate([
34
- (0, type_graphql_1.ObjectType)()
35
- ], KpiBoxPlotStats);
36
- let KpiBoxPlotStatsByGeoGroup = class KpiBoxPlotStatsByGeoGroup extends KpiBoxPlotStats {
37
- };
38
- exports.KpiBoxPlotStatsByGeoGroup = KpiBoxPlotStatsByGeoGroup;
39
- tslib_1.__decorate([
40
- (0, type_graphql_1.Field)({ nullable: true }),
41
- tslib_1.__metadata("design:type", String)
42
- ], KpiBoxPlotStatsByGeoGroup.prototype, "geoGroup", void 0);
43
- exports.KpiBoxPlotStatsByGeoGroup = KpiBoxPlotStatsByGeoGroup = tslib_1.__decorate([
44
- (0, type_graphql_1.ObjectType)()
45
- ], KpiBoxPlotStatsByGeoGroup);
46
- let KpiRadarStats = class KpiRadarStats {
47
- };
48
- exports.KpiRadarStats = KpiRadarStats;
49
- tslib_1.__decorate([
50
- (0, type_graphql_1.Field)({ nullable: true }),
51
- tslib_1.__metadata("design:type", String)
52
- ], KpiRadarStats.prototype, "geoGroup", void 0);
53
- tslib_1.__decorate([
54
- (0, type_graphql_1.Field)(),
55
- tslib_1.__metadata("design:type", String)
56
- ], KpiRadarStats.prototype, "kpiName", void 0);
86
+ ], KpiComprehensiveStats.prototype, "maxVal", void 0);
57
87
  tslib_1.__decorate([
58
88
  (0, type_graphql_1.Field)(() => type_graphql_1.Float),
59
89
  tslib_1.__metadata("design:type", Number)
60
- ], KpiRadarStats.prototype, "avgScore", void 0);
90
+ ], KpiComprehensiveStats.prototype, "avgVal", void 0);
61
91
  tslib_1.__decorate([
62
92
  (0, type_graphql_1.Field)(() => type_graphql_1.Int),
63
93
  tslib_1.__metadata("design:type", Number)
64
- ], KpiRadarStats.prototype, "projectCount", void 0);
65
- exports.KpiRadarStats = KpiRadarStats = tslib_1.__decorate([
94
+ ], KpiComprehensiveStats.prototype, "projectCount", void 0);
95
+ exports.KpiComprehensiveStats = KpiComprehensiveStats = tslib_1.__decorate([
66
96
  (0, type_graphql_1.ObjectType)()
67
- ], KpiRadarStats);
68
- let KpiRadarStatsByGeoGroup = class KpiRadarStatsByGeoGroup extends KpiRadarStats {
97
+ ], KpiComprehensiveStats);
98
+ let KpiComprehensiveStatsByGeoGroup = class KpiComprehensiveStatsByGeoGroup extends KpiComprehensiveStats {
69
99
  };
70
- exports.KpiRadarStatsByGeoGroup = KpiRadarStatsByGeoGroup;
100
+ exports.KpiComprehensiveStatsByGeoGroup = KpiComprehensiveStatsByGeoGroup;
71
101
  tslib_1.__decorate([
72
102
  (0, type_graphql_1.Field)({ nullable: true }),
73
103
  tslib_1.__metadata("design:type", String)
74
- ], KpiRadarStatsByGeoGroup.prototype, "geoGroup", void 0);
75
- exports.KpiRadarStatsByGeoGroup = KpiRadarStatsByGeoGroup = tslib_1.__decorate([
104
+ ], KpiComprehensiveStatsByGeoGroup.prototype, "geoGroup", void 0);
105
+ exports.KpiComprehensiveStatsByGeoGroup = KpiComprehensiveStatsByGeoGroup = tslib_1.__decorate([
76
106
  (0, type_graphql_1.ObjectType)()
77
- ], KpiRadarStatsByGeoGroup);
107
+ ], KpiComprehensiveStatsByGeoGroup);
78
108
  //# sourceMappingURL=kpi-stat-types.js.map