@things-factory/kpi 9.0.13 → 9.0.15

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 (122) hide show
  1. package/client/pages/kpi/kpi-grade-editor.ts +294 -0
  2. package/client/pages/kpi/kpi-list-page.ts +69 -1
  3. package/client/pages/kpi/kpi-overview.ts +5 -11
  4. package/client/pages/kpi-dashboard/kpi-dashboard.ts +43 -15
  5. package/client/pages/kpi-dashboard/kpi-performance-summary.ts +17 -10
  6. package/client/pages/kpi-value/kpi-value-manual-entry-form.ts +1 -0
  7. package/client/route.ts +0 -4
  8. package/dist-client/pages/kpi/kpi-grade-editor.d.ts +35 -0
  9. package/dist-client/pages/kpi/kpi-grade-editor.js +278 -0
  10. package/dist-client/pages/kpi/kpi-grade-editor.js.map +1 -0
  11. package/dist-client/pages/kpi/kpi-list-page.d.ts +4 -0
  12. package/dist-client/pages/kpi/kpi-list-page.js +64 -1
  13. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
  14. package/dist-client/pages/kpi/kpi-overview.js +3 -11
  15. package/dist-client/pages/kpi/kpi-overview.js.map +1 -1
  16. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +44 -12
  17. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -1
  18. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +17 -10
  19. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -1
  20. package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.js +1 -0
  21. package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.js.map +1 -1
  22. package/dist-client/route.d.ts +1 -1
  23. package/dist-client/route.js +0 -3
  24. package/dist-client/route.js.map +1 -1
  25. package/dist-client/tsconfig.tsbuildinfo +1 -1
  26. package/dist-server/index.d.ts +0 -1
  27. package/dist-server/index.js +0 -1
  28. package/dist-server/index.js.map +1 -1
  29. package/dist-server/service/index.d.ts +2 -4
  30. package/dist-server/service/index.js +0 -5
  31. package/dist-server/service/index.js.map +1 -1
  32. package/dist-server/service/kpi/aggregate-kpi.js +4 -0
  33. package/dist-server/service/kpi/aggregate-kpi.js.map +1 -1
  34. package/dist-server/service/kpi/kpi-grade.types.d.ts +21 -0
  35. package/dist-server/service/kpi/kpi-grade.types.js +3 -0
  36. package/dist-server/service/kpi/kpi-grade.types.js.map +1 -0
  37. package/dist-server/service/kpi/kpi-history.d.ts +2 -0
  38. package/dist-server/service/kpi/kpi-history.js +8 -0
  39. package/dist-server/service/kpi/kpi-history.js.map +1 -1
  40. package/dist-server/service/kpi/kpi-query.d.ts +0 -2
  41. package/dist-server/service/kpi/kpi-query.js +0 -11
  42. package/dist-server/service/kpi/kpi-query.js.map +1 -1
  43. package/dist-server/service/kpi/kpi-type.d.ts +3 -0
  44. package/dist-server/service/kpi/kpi-type.js +14 -0
  45. package/dist-server/service/kpi/kpi-type.js.map +1 -1
  46. package/dist-server/service/kpi/kpi.d.ts +2 -2
  47. package/dist-server/service/kpi/kpi.js +5 -3
  48. package/dist-server/service/kpi/kpi.js.map +1 -1
  49. package/dist-server/service/kpi-alert/kpi-alert-query.js +13 -13
  50. package/dist-server/service/kpi-alert/kpi-alert-query.js.map +1 -1
  51. package/dist-server/service/kpi-category/kpi-category-type.d.ts +1 -0
  52. package/dist-server/service/kpi-category/kpi-category-type.js +5 -1
  53. package/dist-server/service/kpi-category/kpi-category-type.js.map +1 -1
  54. package/dist-server/service/kpi-value/kpi-value-grade.service.d.ts +34 -0
  55. package/dist-server/service/kpi-value/kpi-value-grade.service.js +117 -0
  56. package/dist-server/service/kpi-value/kpi-value-grade.service.js.map +1 -0
  57. package/dist-server/service/kpi-value/kpi-value-mutation.d.ts +1 -0
  58. package/dist-server/service/kpi-value/kpi-value-mutation.js +15 -0
  59. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
  60. package/dist-server/service/kpi-value/kpi-value-query.d.ts +2 -0
  61. package/dist-server/service/kpi-value/kpi-value-query.js +12 -0
  62. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
  63. package/dist-server/tsconfig.tsbuildinfo +1 -1
  64. package/package.json +3 -3
  65. package/server/index.ts +0 -1
  66. package/server/service/index.ts +0 -5
  67. package/server/service/kpi/aggregate-kpi.ts +6 -0
  68. package/server/service/kpi/kpi-grade.types.ts +27 -0
  69. package/server/service/kpi/kpi-history.ts +9 -1
  70. package/server/service/kpi/kpi-query.ts +0 -6
  71. package/server/service/kpi/kpi-type.ts +13 -0
  72. package/server/service/kpi/kpi.ts +8 -4
  73. package/server/service/kpi-alert/kpi-alert-query.ts +13 -14
  74. package/server/service/kpi-category/kpi-category-type.ts +4 -1
  75. package/server/service/kpi-value/kpi-value-grade.service.ts +127 -0
  76. package/server/service/kpi-value/kpi-value-mutation.ts +9 -0
  77. package/server/service/kpi-value/kpi-value-query.ts +7 -0
  78. package/things-factory.config.js +0 -1
  79. package/client/pages/kpi-grade/kpi-grade-importer.ts +0 -90
  80. package/client/pages/kpi-grade/kpi-grade-list-page.ts +0 -405
  81. package/dist-client/pages/kpi-grade/kpi-grade-importer.d.ts +0 -23
  82. package/dist-client/pages/kpi-grade/kpi-grade-importer.js +0 -92
  83. package/dist-client/pages/kpi-grade/kpi-grade-importer.js.map +0 -1
  84. package/dist-client/pages/kpi-grade/kpi-grade-list-page.d.ts +0 -66
  85. package/dist-client/pages/kpi-grade/kpi-grade-list-page.js +0 -387
  86. package/dist-client/pages/kpi-grade/kpi-grade-list-page.js.map +0 -1
  87. package/dist-server/migrations/1752188906708-SeedKpiCategory.d.ts +0 -5
  88. package/dist-server/migrations/1752188906708-SeedKpiCategory.js +0 -56
  89. package/dist-server/migrations/1752188906708-SeedKpiCategory.js.map +0 -1
  90. package/dist-server/migrations/1752190849681-SeedKpi.d.ts +0 -5
  91. package/dist-server/migrations/1752190849681-SeedKpi.js +0 -107
  92. package/dist-server/migrations/1752190849681-SeedKpi.js.map +0 -1
  93. package/dist-server/migrations/1752191090459-SeedKpiGrade.d.ts +0 -5
  94. package/dist-server/migrations/1752191090459-SeedKpiGrade.js +0 -271
  95. package/dist-server/migrations/1752191090459-SeedKpiGrade.js.map +0 -1
  96. package/dist-server/migrations/index.d.ts +0 -1
  97. package/dist-server/migrations/index.js +0 -12
  98. package/dist-server/migrations/index.js.map +0 -1
  99. package/dist-server/service/kpi-grade/index.d.ts +0 -6
  100. package/dist-server/service/kpi-grade/index.js +0 -10
  101. package/dist-server/service/kpi-grade/index.js.map +0 -1
  102. package/dist-server/service/kpi-grade/kpi-grade-mutation.d.ts +0 -10
  103. package/dist-server/service/kpi-grade/kpi-grade-mutation.js +0 -151
  104. package/dist-server/service/kpi-grade/kpi-grade-mutation.js.map +0 -1
  105. package/dist-server/service/kpi-grade/kpi-grade-query.d.ts +0 -13
  106. package/dist-server/service/kpi-grade/kpi-grade-query.js +0 -92
  107. package/dist-server/service/kpi-grade/kpi-grade-query.js.map +0 -1
  108. package/dist-server/service/kpi-grade/kpi-grade-type.d.ts +0 -29
  109. package/dist-server/service/kpi-grade/kpi-grade-type.js +0 -113
  110. package/dist-server/service/kpi-grade/kpi-grade-type.js.map +0 -1
  111. package/dist-server/service/kpi-grade/kpi-grade.d.ts +0 -24
  112. package/dist-server/service/kpi-grade/kpi-grade.js +0 -117
  113. package/dist-server/service/kpi-grade/kpi-grade.js.map +0 -1
  114. package/server/migrations/1752188906708-SeedKpiCategory.ts +0 -61
  115. package/server/migrations/1752190849681-SeedKpi.ts +0 -112
  116. package/server/migrations/1752191090459-SeedKpiGrade.ts +0 -270
  117. package/server/migrations/index.ts +0 -9
  118. package/server/service/kpi-grade/index.ts +0 -7
  119. package/server/service/kpi-grade/kpi-grade-mutation.ts +0 -146
  120. package/server/service/kpi-grade/kpi-grade-query.ts +0 -58
  121. package/server/service/kpi-grade/kpi-grade-type.ts +0 -82
  122. package/server/service/kpi-grade/kpi-grade.ts +0 -101
@@ -1,270 +0,0 @@
1
- import { MigrationInterface, QueryRunner } from 'typeorm'
2
- import { Domain, getRepository } from '@things-factory/shell'
3
- import { KpiGrade } from '../service/kpi-grade/kpi-grade.js'
4
- import { Kpi } from '../service/kpi/kpi.js'
5
-
6
- const GRADE_SEED = [
7
- {
8
- kpiName: '일정성과 수준 평가',
9
- version: 1,
10
- grades: [
11
- {
12
- name: '1점',
13
- minValue: 1,
14
- maxValue: 1,
15
- score: 1,
16
- description: '달성상황(기후, 일반변화 등)과 인근주민 민원 등이 발생하여 공기가 지연됨.'
17
- },
18
- {
19
- name: '2점',
20
- minValue: 2,
21
- maxValue: 2,
22
- score: 2,
23
- description: '달성상황(기후, 일반변화 등)과 인근주민 민원 등이 발생하여 공기를 맞춤.'
24
- },
25
- {
26
- name: '3점',
27
- minValue: 3,
28
- maxValue: 3,
29
- score: 3,
30
- description: '달성상황(기후, 일반변화 등)과 인근주민 민원 등이 발생하지 않으나 공기를 맞춤.'
31
- },
32
- {
33
- name: '4점',
34
- minValue: 4,
35
- maxValue: 4,
36
- score: 4,
37
- description: '달성상황(기후, 일반변화 등)과 인근주민 민원 등이 발생하지 않으며 공기를 단축함.'
38
- },
39
- {
40
- name: '5점',
41
- minValue: 5,
42
- maxValue: 5,
43
- score: 5,
44
- description: '달성상황(기후, 일반변화 등)과 인근주민 민원 등이 발생하지 않으며 공기를 단축함.'
45
- }
46
- ]
47
- },
48
- {
49
- kpiName: '비용성과 수준 평가',
50
- version: 1,
51
- grades: [
52
- {
53
- name: '1점',
54
- minValue: 1,
55
- maxValue: 1,
56
- score: 1,
57
- description: '공사비 변동과 민원 등이 발생하여 공사비 관리가 미흡함.'
58
- },
59
- {
60
- name: '2점',
61
- minValue: 2,
62
- maxValue: 2,
63
- score: 2,
64
- description: '공사비 변동과 민원 등이 발생하여 공사비 관리가 미흡함.'
65
- },
66
- {
67
- name: '3점',
68
- minValue: 3,
69
- maxValue: 3,
70
- score: 3,
71
- description: '공사비 변동과 민원 등이 발생하였으나 공사비 관리를 적정하게 수행함.'
72
- },
73
- {
74
- name: '4점',
75
- minValue: 4,
76
- maxValue: 4,
77
- score: 4,
78
- description: '공사비 변동과 민원 등이 발생하지 않으며 공사비 관리를 적정하게 수행함.'
79
- },
80
- {
81
- name: '5점',
82
- minValue: 5,
83
- maxValue: 5,
84
- score: 5,
85
- description: '공사비 변동과 민원 등이 발생하지 않으며 매우 훌륭하게 수행함.'
86
- }
87
- ]
88
- },
89
- {
90
- kpiName: '품질성과 수준 평가',
91
- version: 1,
92
- grades: [
93
- {
94
- name: '1점',
95
- minValue: 1,
96
- maxValue: 1,
97
- score: 1,
98
- description: '법적 요구 수준에 못 미치거나 공사 완성도의 개선이 매우 필요한 경우'
99
- },
100
- {
101
- name: '2점',
102
- minValue: 2,
103
- maxValue: 2,
104
- score: 2,
105
- description: '법적 요구 수준을 일부 만족하나, 공사 완성도의 개선이 일부 필요한 경우'
106
- },
107
- { name: '3점', minValue: 3, maxValue: 3, score: 3, description: '법적 요구 수준을 충족하는 수준' },
108
- {
109
- name: '4점',
110
- minValue: 4,
111
- maxValue: 4,
112
- score: 4,
113
- description: '법적 요구 수준을 만족하며, 품질관리 활동이 능동적인 경우'
114
- },
115
- {
116
- name: '5점',
117
- minValue: 5,
118
- maxValue: 5,
119
- score: 5,
120
- description: '법적 요구 수준을 만족하며, 품질관리 활동이 매우 능동적인 경우'
121
- }
122
- ]
123
- },
124
- {
125
- kpiName: '안전성과 수준 평가',
126
- version: 1,
127
- grades: [
128
- {
129
- name: '1점',
130
- minValue: 1,
131
- maxValue: 1,
132
- score: 1,
133
- description: '법적 요구 수준을 미달하거나 안전관리 활동이 미흡한 경우'
134
- },
135
- {
136
- name: '2점',
137
- minValue: 2,
138
- maxValue: 2,
139
- score: 2,
140
- description: '법적 요구 수준을 일부 만족하나, 안전관리 활동이 다소 필요한 경우'
141
- },
142
- { name: '3점', minValue: 3, maxValue: 3, score: 3, description: '법적 요구 수준을 충족하는 수준' },
143
- {
144
- name: '4점',
145
- minValue: 4,
146
- maxValue: 4,
147
- score: 4,
148
- description: '법적 요구 수준을 만족하며, 안전관리 활동이 능동적인 경우'
149
- },
150
- {
151
- name: '5점',
152
- minValue: 5,
153
- maxValue: 5,
154
- score: 5,
155
- description: '법적 요구 수준을 만족하며, 안전관리 활동이 매우 능동적인 경우'
156
- }
157
- ]
158
- },
159
- {
160
- kpiName: '환경성과 수준 평가',
161
- version: 1,
162
- grades: [
163
- {
164
- name: '1점',
165
- minValue: 1,
166
- maxValue: 1,
167
- score: 1,
168
- description: '법적 요구 수준에 못 미치거나 환경관리 활동의 개선이 매우 필요한 경우'
169
- },
170
- {
171
- name: '2점',
172
- minValue: 2,
173
- maxValue: 2,
174
- score: 2,
175
- description: '법적 요구 수준을 일부 만족하나, 환경관리 활동이 다소 필요한 경우'
176
- },
177
- { name: '3점', minValue: 3, maxValue: 3, score: 3, description: '법적 요구 수준을 충족하는 수준' },
178
- {
179
- name: '4점',
180
- minValue: 4,
181
- maxValue: 4,
182
- score: 4,
183
- description: '법적 요구 수준을 만족하며, 환경관리 활동의 효율성을 다소 높은 수준'
184
- },
185
- {
186
- name: '5점',
187
- minValue: 5,
188
- maxValue: 5,
189
- score: 5,
190
- description: '법적 요구 수준을 만족하며, 환경관리 활동의 효율성이 확연히 높은 수준'
191
- }
192
- ]
193
- },
194
- {
195
- kpiName: '생산성과 수준 평가',
196
- version: 1,
197
- grades: [
198
- {
199
- name: '1점',
200
- minValue: 1,
201
- maxValue: 1,
202
- score: 1,
203
- description: '인력 및 장비 투입 규모에 대한 효율성이 매우 낮은 수준'
204
- },
205
- {
206
- name: '2점',
207
- minValue: 2,
208
- maxValue: 2,
209
- score: 2,
210
- description: '인력 및 장비 투입 규모가 법적 요구 수준을 충족하나, 연계에 비해 미흡함.'
211
- },
212
- {
213
- name: '3점',
214
- minValue: 3,
215
- maxValue: 3,
216
- score: 3,
217
- description: '인력 및 장비 투입 규모가 법적 요구 수준을 충족하는 수준'
218
- },
219
- {
220
- name: '4점',
221
- minValue: 4,
222
- maxValue: 4,
223
- score: 4,
224
- description: '투입 규모가 법적 요구 수준을 충족하며, 효율성이 다소 높은 수준'
225
- },
226
- {
227
- name: '5점',
228
- minValue: 5,
229
- maxValue: 5,
230
- score: 5,
231
- description: '투입 규모가 법적 요구 수준을 충족하며, 효율성이 확연히 높은 수준'
232
- }
233
- ]
234
- }
235
- ]
236
-
237
- export class SeedKpiGrade1752191090459 implements MigrationInterface {
238
- public async up(queryRunner: QueryRunner): Promise<any> {
239
- const repository = getRepository(KpiGrade)
240
- const kpiRepository = getRepository(Kpi)
241
- const domain: Domain = await getRepository(Domain).findOneBy({ name: 'SYSTEM' })
242
-
243
- for (const seed of GRADE_SEED) {
244
- const kpi = await kpiRepository.findOneBy({ name: seed.kpiName, domain: { id: domain.id } })
245
- if (!kpi) continue
246
- for (const grade of seed.grades) {
247
- await repository.save({
248
- ...grade,
249
- version: seed.version,
250
- kpi,
251
- domain
252
- })
253
- }
254
- }
255
- }
256
-
257
- public async down(queryRunner: QueryRunner): Promise<any> {
258
- const repository = getRepository(KpiGrade)
259
- const kpiRepository = getRepository(Kpi)
260
- const domain: Domain = await getRepository(Domain).findOneBy({ name: 'SYSTEM' })
261
-
262
- for (const seed of GRADE_SEED) {
263
- const kpi = await kpiRepository.findOneBy({ name: seed.kpiName, domain: { id: domain.id } })
264
- if (!kpi) continue
265
- for (const grade of seed.grades.reverse()) {
266
- await repository.delete({ name: grade.name, kpi: { id: kpi.id }, domain: { id: domain.id } })
267
- }
268
- }
269
- }
270
- }
@@ -1,9 +0,0 @@
1
- const glob = require('glob')
2
- const path = require('path')
3
-
4
- export var migrations = []
5
-
6
- glob.sync(path.resolve(__dirname, '.', '**', '*.js')).forEach(function(file) {
7
- if (file.indexOf('index.js') !== -1) return
8
- migrations = migrations.concat(Object.values(require(path.resolve(file))) || [])
9
- })
@@ -1,7 +0,0 @@
1
- import { KpiGrade } from './kpi-grade'
2
- import { KpiGradeQuery } from './kpi-grade-query'
3
- import { KpiGradeMutation } from './kpi-grade-mutation'
4
-
5
- export const entities = [KpiGrade]
6
- export const resolvers = [KpiGradeQuery, KpiGradeMutation]
7
- export const subscribers = []
@@ -1,146 +0,0 @@
1
- import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'
2
- import { In } from 'typeorm'
3
- import { getRepository } from '@things-factory/shell'
4
-
5
- import { KpiGrade } from './kpi-grade'
6
- import { NewKpiGrade, KpiGradePatch } from './kpi-grade-type'
7
- import { Kpi } from '../kpi/kpi'
8
-
9
- @Resolver(KpiGrade)
10
- export class KpiGradeMutation {
11
- @Directive('@transaction')
12
- @Mutation(returns => KpiGrade, { description: 'Create a new KPI grade with the provided details.' })
13
- async createKpiGrade(
14
- @Arg('grade', { description: 'Input object containing details for the new KPI grade.' }) grade: NewKpiGrade,
15
- @Ctx() context: ResolverContext
16
- ): Promise<KpiGrade> {
17
- const { domain, user, tx } = context.state
18
-
19
- let kpi = grade.kpiId ? await getRepository(Kpi).findOne({ where: { id: grade.kpiId } }) : undefined
20
-
21
- const result = await getRepository(KpiGrade, tx).save({
22
- ...grade,
23
- kpi,
24
- domain,
25
- creator: user,
26
- updater: user
27
- })
28
-
29
- return result
30
- }
31
-
32
- @Directive('@transaction')
33
- @Mutation(returns => KpiGrade, { description: 'To modify KpiGrade information' })
34
- async updateKpiGrade(
35
- @Arg('id') id: string,
36
- @Arg('patch') patch: KpiGradePatch,
37
- @Ctx() context: ResolverContext
38
- ): Promise<KpiGrade> {
39
- const { domain, user, tx } = context.state
40
-
41
- const repository = getRepository(KpiGrade, tx)
42
- const kpiGrade = await repository.findOne({
43
- where: { domain: { id: domain.id }, id }
44
- })
45
-
46
- let kpi = patch.kpiId ? await getRepository(Kpi).findOne({ where: { id: patch.kpiId } }) : kpiGrade.kpi
47
-
48
- const result = await repository.save({
49
- ...kpiGrade,
50
- ...patch,
51
- kpi,
52
- updater: user
53
- })
54
-
55
- return result
56
- }
57
-
58
- @Directive('@transaction')
59
- @Mutation(returns => [KpiGrade], { description: "To modify multiple KpiGrades' information" })
60
- async updateMultipleKpiGrade(
61
- @Arg('patches', type => [KpiGradePatch]) patches: KpiGradePatch[],
62
- @Ctx() context: ResolverContext
63
- ): Promise<KpiGrade[]> {
64
- const { domain, user, tx } = context.state
65
-
66
- let results = []
67
- const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
68
- const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
69
- const kpiGradeRepo = getRepository(KpiGrade, tx)
70
-
71
- if (_createRecords.length > 0) {
72
- for (let i = 0; i < _createRecords.length; i++) {
73
- const newRecord = _createRecords[i]
74
-
75
- const result = await kpiGradeRepo.save({
76
- ...newRecord,
77
- domain,
78
- creator: user,
79
- updater: user
80
- })
81
-
82
- results.push({ ...result, cuFlag: '+' })
83
- }
84
- }
85
-
86
- if (_updateRecords.length > 0) {
87
- for (let i = 0; i < _updateRecords.length; i++) {
88
- const updateRecord = _updateRecords[i]
89
- const kpiGrade = await kpiGradeRepo.findOneBy({ id: updateRecord.id })
90
-
91
- const result = await kpiGradeRepo.save({
92
- ...kpiGrade,
93
- ...updateRecord,
94
- updater: user
95
- })
96
-
97
- results.push({ ...result, cuFlag: 'M' })
98
- }
99
- }
100
-
101
- return results
102
- }
103
-
104
- @Directive('@transaction')
105
- @Mutation(returns => Boolean, { description: 'To delete KpiGrade' })
106
- async deleteKpiGrade(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
107
- const { domain, tx } = context.state
108
-
109
- await getRepository(KpiGrade, tx).delete({ domain: { id: domain.id }, id })
110
-
111
- return true
112
- }
113
-
114
- @Directive('@transaction')
115
- @Mutation(returns => Boolean, { description: 'To delete multiple KpiGrades' })
116
- async deleteKpiGrades(
117
- @Arg('ids', type => [String]) ids: string[],
118
- @Ctx() context: ResolverContext
119
- ): Promise<boolean> {
120
- const { domain, tx } = context.state
121
-
122
- await getRepository(KpiGrade, tx).delete({
123
- domain: { id: domain.id },
124
- id: In(ids)
125
- })
126
-
127
- return true
128
- }
129
-
130
- @Directive('@transaction')
131
- @Mutation(returns => Boolean, { description: 'To import multiple KpiGrades' })
132
- async importKpiGrades(
133
- @Arg('kpiGrades', type => [KpiGradePatch]) kpiGrades: KpiGradePatch[],
134
- @Ctx() context: ResolverContext
135
- ): Promise<boolean> {
136
- const { domain, tx } = context.state
137
-
138
- await Promise.all(
139
- kpiGrades.map(async (kpiGrade: KpiGradePatch) => {
140
- const createdKpiGrade: KpiGrade = await getRepository(KpiGrade, tx).save({ domain, ...kpiGrade })
141
- })
142
- )
143
-
144
- return true
145
- }
146
- }
@@ -1,58 +0,0 @@
1
- import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
2
- import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
3
- import { User } from '@things-factory/auth-base'
4
- import { KpiGrade } from './kpi-grade'
5
- import { KpiGradeList } from './kpi-grade-type'
6
- import { Kpi } from '../kpi/kpi'
7
-
8
- @Resolver(KpiGrade)
9
- export class KpiGradeQuery {
10
- @Query(returns => KpiGrade!, { nullable: true, description: 'Fetch a single KPI grade by its unique identifier.' })
11
- async kpiGrade(
12
- @Arg('id', { description: 'Unique identifier of the KPI grade to fetch.' }) id: string,
13
- @Ctx() context: ResolverContext
14
- ): Promise<KpiGrade> {
15
- const { domain } = context.state
16
-
17
- return await getRepository(KpiGrade).findOne({
18
- where: { domain: { id: domain.id }, id }
19
- })
20
- }
21
-
22
- @Query(returns => KpiGradeList, { description: 'To fetch multiple KpiGrades' })
23
- async kpiGrades(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<KpiGradeList> {
24
- const { domain } = context.state
25
-
26
- const queryBuilder = getQueryBuilderFromListParams({
27
- domain,
28
- params,
29
- repository: await getRepository(KpiGrade),
30
- searchables: ['name', 'description']
31
- })
32
-
33
- const [items, total] = await queryBuilder.getManyAndCount()
34
-
35
- return { items, total }
36
- }
37
-
38
- @FieldResolver(type => Domain)
39
- async domain(@Root() kpiGrade: KpiGrade): Promise<Domain> {
40
- return kpiGrade.domainId && (await getRepository(Domain).findOneBy({ id: kpiGrade.domainId }))
41
- }
42
-
43
- @FieldResolver(type => User)
44
- async updater(@Root() kpiGrade: KpiGrade): Promise<User> {
45
- return kpiGrade.updaterId && (await getRepository(User).findOneBy({ id: kpiGrade.updaterId }))
46
- }
47
-
48
- @FieldResolver(type => User)
49
- async creator(@Root() kpiGrade: KpiGrade): Promise<User> {
50
- return kpiGrade.creatorId && (await getRepository(User).findOneBy({ id: kpiGrade.creatorId }))
51
- }
52
-
53
- @FieldResolver(type => Kpi, { nullable: true })
54
- async kpi(@Root() kpiGrade: KpiGrade): Promise<Kpi | null> {
55
- if (!kpiGrade.kpiId) return null
56
- return await getRepository(Kpi).findOneBy({ id: kpiGrade.kpiId })
57
- }
58
- }
@@ -1,82 +0,0 @@
1
- import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'
2
- import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
3
- import { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'
4
-
5
- import { ObjectRef, ScalarObject } from '@things-factory/shell'
6
-
7
- import { KpiGrade } from './kpi-grade'
8
-
9
- @InputType({ description: 'Input type for creating a new KPI grade. Used in mutations to provide grade details.' })
10
- export class NewKpiGrade {
11
- @Field({ description: 'Name of the grade or section for this KPI.' })
12
- name: string
13
-
14
- @Field({ nullable: true, description: 'Detailed description of this KPI grade.' })
15
- description?: string
16
-
17
- @Field(type => ID, { description: 'ID of the KPI to which this grade belongs.' })
18
- kpiId: string
19
-
20
- @Field(type => Int, { description: 'Version of the KPI definition to which this grade belongs.' })
21
- version: number
22
-
23
- @Field(type => Int, { description: 'Minimum value for this grade section.' })
24
- minValue: number
25
-
26
- @Field(type => Int, { description: 'Maximum value for this grade section.' })
27
- maxValue: number
28
-
29
- @Field(type => Int, { nullable: true, description: 'Score or weight for this grade (optional).' })
30
- score?: number
31
-
32
- @Field({ nullable: true, description: 'Color code for this grade (for visualization purposes).' })
33
- color?: string
34
-
35
- @Field({ nullable: true, description: 'Indicates whether this KPI grade is active and usable.' })
36
- active?: boolean
37
- }
38
-
39
- @InputType({ description: 'Input type for updating an existing KPI grade. Used in mutations to patch grade details.' })
40
- export class KpiGradePatch {
41
- @Field(type => ID, { nullable: true, description: 'ID of the KPI grade to update.' })
42
- id?: string
43
-
44
- @Field({ nullable: true, description: 'Name of the grade or section for this KPI.' })
45
- name?: string
46
-
47
- @Field({ nullable: true, description: 'Detailed description of this KPI grade.' })
48
- description?: string
49
-
50
- @Field(type => ID, { nullable: true, description: 'ID of the KPI to which this grade belongs.' })
51
- kpiId?: string
52
-
53
- @Field(type => Int, { nullable: true, description: 'Version of the KPI definition to which this grade belongs.' })
54
- version?: number
55
-
56
- @Field(type => Int, { nullable: true, description: 'Minimum value for this grade section.' })
57
- minValue?: number
58
-
59
- @Field(type => Int, { nullable: true, description: 'Maximum value for this grade section.' })
60
- maxValue?: number
61
-
62
- @Field(type => Int, { nullable: true, description: 'Score or weight for this grade (optional).' })
63
- score?: number
64
-
65
- @Field({ nullable: true, description: 'Color code for this grade (for visualization purposes).' })
66
- color?: string
67
-
68
- @Field({ nullable: true, description: 'Indicates whether this KPI grade is active and usable.' })
69
- active?: boolean
70
-
71
- @Field({ nullable: true, description: 'Custom flag for update operations (internal use).' })
72
- cuFlag?: string
73
- }
74
-
75
- @ObjectType()
76
- export class KpiGradeList {
77
- @Field(type => [KpiGrade])
78
- items: KpiGrade[]
79
-
80
- @Field(type => Int)
81
- total: number
82
- }
@@ -1,101 +0,0 @@
1
- import {
2
- CreateDateColumn,
3
- UpdateDateColumn,
4
- Entity,
5
- Index,
6
- Column,
7
- RelationId,
8
- ManyToOne,
9
- PrimaryGeneratedColumn
10
- } from 'typeorm'
11
- import { ObjectType, Field, Int, ID, registerEnumType, Float } from 'type-graphql'
12
-
13
- import { Domain } from '@things-factory/shell'
14
- import { User } from '@things-factory/auth-base'
15
- import { Kpi } from '../kpi/kpi'
16
-
17
- @Entity()
18
- @Index('ix_kpi_grade_0', (kpiGrade: KpiGrade) => [kpiGrade.domain, kpiGrade.kpi, kpiGrade.version, kpiGrade.name], {
19
- unique: true
20
- })
21
- @ObjectType({
22
- description:
23
- 'KPI grade entity. Represents a grade/section for a KPI version, with value range, score, color, and description.'
24
- })
25
- export class KpiGrade {
26
- @PrimaryGeneratedColumn('uuid')
27
- @Field(type => ID, { description: 'Unique identifier for this KPI grade.' })
28
- readonly id: string
29
-
30
- @ManyToOne(type => Domain)
31
- @Field({ nullable: true, description: 'Domain (tenant) to which this KPI grade belongs.' })
32
- domain?: Domain
33
-
34
- @RelationId((kpiGrade: KpiGrade) => kpiGrade.domain)
35
- @Field({ nullable: true, description: 'ID of the domain (tenant) for this KPI grade.' })
36
- domainId?: string
37
-
38
- @Column()
39
- @Field({ nullable: true, description: 'Name of the grade or section for this KPI.' })
40
- name?: string
41
-
42
- @Column({ nullable: true })
43
- @Field({ nullable: true, description: 'Detailed description of this KPI grade.' })
44
- description?: string
45
-
46
- @Column({ nullable: false, default: false })
47
- @Field({ nullable: true, description: 'Indicates whether this KPI grade is active and usable.' })
48
- active?: boolean
49
-
50
- @ManyToOne(() => Kpi)
51
- @Field(type => Kpi, { description: 'Reference to the KPI to which this grade belongs.' })
52
- kpi: Kpi
53
-
54
- @RelationId((kpiGrade: KpiGrade) => kpiGrade.kpi)
55
- @Field({ description: 'ID of the referenced KPI.' })
56
- kpiId: string
57
-
58
- @Column('int')
59
- @Field(type => Int, { description: 'Version of the KPI definition to which this grade belongs.' })
60
- version: number
61
-
62
- @Column('float')
63
- @Field(type => Float, { description: 'Minimum value for this grade section.' })
64
- minValue: number
65
-
66
- @Column('float')
67
- @Field(type => Float, { description: 'Maximum value for this grade section.' })
68
- maxValue: number
69
-
70
- @Column({ nullable: true, type: 'float' })
71
- @Field(type => Float, { nullable: true, description: 'Score or weight for this grade (optional).' })
72
- score?: number
73
-
74
- @Column({ nullable: true })
75
- @Field({ nullable: true, description: 'Color code for this grade (for visualization purposes).' })
76
- color?: string
77
-
78
- @CreateDateColumn()
79
- @Field({ nullable: true, description: 'Timestamp when this KPI grade was created.' })
80
- createdAt?: Date
81
-
82
- @UpdateDateColumn()
83
- @Field({ nullable: true, description: 'Timestamp when this KPI grade was last updated.' })
84
- updatedAt?: Date
85
-
86
- @ManyToOne(type => User, { nullable: true })
87
- @Field(type => User, { nullable: true, description: 'User who created this KPI grade.' })
88
- creator?: User
89
-
90
- @RelationId((kpiGrade: KpiGrade) => kpiGrade.creator)
91
- @Field({ nullable: true, description: 'ID of the user who created this KPI grade.' })
92
- creatorId?: string
93
-
94
- @ManyToOne(type => User, { nullable: true })
95
- @Field(type => User, { nullable: true, description: 'User who last updated this KPI grade.' })
96
- updater?: User
97
-
98
- @RelationId((kpiGrade: KpiGrade) => kpiGrade.updater)
99
- @Field({ nullable: true, description: 'ID of the user who last updated this KPI grade.' })
100
- updaterId?: string
101
- }