@things-factory/kpi 9.0.21 → 9.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/charts/kpi-boxplot-chart.ts +163 -0
- package/client/charts/kpi-radar-chart.ts +128 -0
- package/client/pages/kpi/kpi-list-page.ts +180 -22
- package/client/pages/kpi-category/kpi-category-list-page.ts +76 -3
- package/client/pages/kpi-category/kpi-category-value-calculator.ts +233 -0
- package/client/pages/kpi-dashboard/kpi-dashboard.ts +188 -0
- package/client/pages/kpi-metric/kpi-metric-list-page.ts +13 -1
- package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +43 -1
- package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.ts +3 -13
- package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.ts +13 -1
- package/client/pages/kpi-value/kpi-value-list-page.ts +45 -1
- package/dist-client/charts/kpi-boxplot-chart.d.ts +22 -0
- package/dist-client/charts/kpi-boxplot-chart.js +198 -0
- package/dist-client/charts/kpi-boxplot-chart.js.map +1 -0
- package/dist-client/charts/kpi-radar-chart.d.ts +16 -0
- package/dist-client/charts/kpi-radar-chart.js +138 -0
- package/dist-client/charts/kpi-radar-chart.js.map +1 -0
- package/dist-client/pages/kpi/kpi-list-page.d.ts +2 -1
- package/dist-client/pages/kpi/kpi-list-page.js +180 -22
- package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
- package/dist-client/pages/kpi-category/kpi-category-list-page.d.ts +3 -0
- package/dist-client/pages/kpi-category/kpi-category-list-page.js +71 -3
- package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +1 -1
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.d.ts +13 -0
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.js +256 -0
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +11 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +185 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -1
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +13 -1
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +4 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +39 -2
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +3 -13
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +13 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -1
- package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +1 -0
- package/dist-client/pages/kpi-value/kpi-value-list-page.js +45 -1
- package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/calculator/evaluator.d.ts +8 -0
- package/dist-server/calculator/evaluator.js +42 -0
- package/dist-server/calculator/evaluator.js.map +1 -0
- package/dist-server/calculator/functions.d.ts +3 -0
- package/dist-server/calculator/functions.js +62 -0
- package/dist-server/calculator/functions.js.map +1 -0
- package/dist-server/calculator/index.d.ts +4 -0
- package/dist-server/calculator/index.js +8 -0
- package/dist-server/calculator/index.js.map +1 -0
- package/dist-server/calculator/parser.d.ts +21 -0
- package/dist-server/calculator/parser.js +121 -0
- package/dist-server/calculator/parser.js.map +1 -0
- package/dist-server/calculator/provider.d.ts +8 -0
- package/dist-server/calculator/provider.js +13 -0
- package/dist-server/calculator/provider.js.map +1 -0
- package/dist-server/controllers/kpi-metric-value-provider.d.ts +11 -0
- package/dist-server/controllers/kpi-metric-value-provider.js +63 -0
- package/dist-server/controllers/kpi-metric-value-provider.js.map +1 -0
- package/dist-server/controllers/kpi-value-provider.d.ts +11 -0
- package/dist-server/controllers/kpi-value-provider.js +46 -0
- package/dist-server/controllers/kpi-value-provider.js.map +1 -0
- package/dist-server/service/index.d.ts +2 -2
- package/dist-server/service/kpi/aggregate-kpi.js +4 -4
- package/dist-server/service/kpi/aggregate-kpi.js.map +1 -1
- package/dist-server/service/kpi/kpi-grade.types.d.ts +11 -10
- package/dist-server/service/kpi/kpi-grade.types.js.map +1 -1
- package/dist-server/service/kpi/kpi-history.d.ts +2 -2
- package/dist-server/service/kpi/kpi-history.js.map +1 -1
- package/dist-server/service/kpi/kpi-mutation.d.ts +2 -0
- package/dist-server/service/kpi/kpi-mutation.js +126 -4
- package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
- package/dist-server/service/kpi/kpi-type.d.ts +8 -5
- package/dist-server/service/kpi/kpi-type.js +22 -8
- package/dist-server/service/kpi/kpi-type.js.map +1 -1
- package/dist-server/service/kpi/kpi.d.ts +6 -3
- package/dist-server/service/kpi/kpi.js +29 -9
- package/dist-server/service/kpi/kpi.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +1 -1
- package/dist-server/service/kpi-category/kpi-category-mutation.js +3 -3
- package/dist-server/service/kpi-category/kpi-category-mutation.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-query.d.ts +13 -0
- package/dist-server/service/kpi-category/kpi-category-query.js +180 -0
- package/dist-server/service/kpi-category/kpi-category-query.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-type.d.ts +3 -0
- package/dist-server/service/kpi-category/kpi-category-type.js +16 -1
- package/dist-server/service/kpi-category/kpi-category-type.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category.d.ts +2 -0
- package/dist-server/service/kpi-category/kpi-category.js +10 -1
- package/dist-server/service/kpi-category/kpi-category.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +5 -3
- package/dist-server/service/kpi-metric/kpi-metric-type.js +5 -3
- package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric.d.ts +2 -8
- package/dist-server/service/kpi-metric/kpi-metric.js +3 -14
- package/dist-server/service/kpi-metric/kpi-metric.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +67 -45
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value.js +3 -2
- package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-mutation.d.ts +2 -1
- package/dist-server/service/kpi-value/kpi-value-mutation.js +114 -6
- package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-query.d.ts +0 -2
- package/dist-server/service/kpi-value/kpi-value-query.js +0 -12
- package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-score.service.d.ts +26 -0
- package/dist-server/service/kpi-value/kpi-value-score.service.js +97 -0
- package/dist-server/service/kpi-value/kpi-value-score.service.js.map +1 -0
- package/dist-server/service/kpi-value/kpi-value-type.d.ts +2 -0
- package/dist-server/service/kpi-value/kpi-value-type.js +14 -0
- package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value.d.ts +1 -0
- package/dist-server/service/kpi-value/kpi-value.js +9 -1
- package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
- package/dist-server/service/utils/value-date-util.d.ts +3 -0
- package/dist-server/service/utils/value-date-util.js +76 -0
- package/dist-server/service/utils/value-date-util.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/server/calculator/evaluator.ts +45 -0
- package/server/calculator/functions.ts +67 -0
- package/server/calculator/index.ts +4 -0
- package/server/calculator/parser.ts +128 -0
- package/server/calculator/provider.ts +10 -0
- package/server/controllers/kpi-metric-value-provider.ts +66 -0
- package/server/controllers/kpi-value-provider.ts +51 -0
- package/server/service/kpi/aggregate-kpi.ts +4 -4
- package/server/service/kpi/kpi-grade.types.ts +11 -10
- package/server/service/kpi/kpi-history.ts +2 -2
- package/server/service/kpi/kpi-mutation.ts +128 -4
- package/server/service/kpi/kpi-type.ts +21 -9
- package/server/service/kpi/kpi.ts +32 -10
- package/server/service/kpi-category/kpi-category-mutation.ts +3 -3
- package/server/service/kpi-category/kpi-category-query.ts +175 -1
- package/server/service/kpi-category/kpi-category-type.ts +17 -6
- package/server/service/kpi-category/kpi-category.ts +10 -1
- package/server/service/kpi-metric/kpi-metric-type.ts +7 -5
- package/server/service/kpi-metric/kpi-metric.ts +3 -15
- package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +67 -47
- package/server/service/kpi-metric-value/kpi-metric-value.ts +4 -2
- package/server/service/kpi-value/kpi-value-mutation.ts +110 -6
- package/server/service/kpi-value/kpi-value-query.ts +2 -8
- package/server/service/kpi-value/kpi-value-score.service.ts +112 -0
- package/server/service/kpi-value/kpi-value-type.ts +12 -0
- package/server/service/kpi-value/kpi-value.ts +8 -1
- package/server/service/utils/value-date-util.ts +72 -0
- package/dist-server/service/kpi-value/kpi-value-grade.service.d.ts +0 -34
- package/dist-server/service/kpi-value/kpi-value-grade.service.js +0 -117
- package/dist-server/service/kpi-value/kpi-value-grade.service.js.map +0 -1
- package/server/service/kpi-value/kpi-value-grade.service.ts +0 -127
|
@@ -41,7 +41,9 @@ var KpiPeriodType;
|
|
|
41
41
|
KpiPeriodType["WEEK"] = "WEEK";
|
|
42
42
|
KpiPeriodType["MONTH"] = "MONTH";
|
|
43
43
|
KpiPeriodType["QUARTER"] = "QUARTER";
|
|
44
|
+
KpiPeriodType["YEAR"] = "YEAR";
|
|
44
45
|
KpiPeriodType["RANGE"] = "RANGE";
|
|
46
|
+
KpiPeriodType["ALLTIME"] = "ALLTIME";
|
|
45
47
|
})(KpiPeriodType || (exports.KpiPeriodType = KpiPeriodType = {}));
|
|
46
48
|
(0, type_graphql_1.registerEnumType)(KpiStatus, {
|
|
47
49
|
name: 'KpiStatus',
|
|
@@ -53,7 +55,7 @@ var KpiPeriodType;
|
|
|
53
55
|
});
|
|
54
56
|
(0, type_graphql_1.registerEnumType)(KpiPeriodType, {
|
|
55
57
|
name: 'KpiPeriodType',
|
|
56
|
-
description: 'Aggregation period type for KPI (DAY, WEEK, MONTH, QUARTER, RANGE)'
|
|
58
|
+
description: 'Aggregation period type for KPI (DAY, WEEK, MONTH, QUARTER, RANGE, ALLTIME)'
|
|
57
59
|
});
|
|
58
60
|
let Kpi = class Kpi {
|
|
59
61
|
constructor() {
|
|
@@ -176,6 +178,32 @@ tslib_1.__decorate([
|
|
|
176
178
|
(0, type_graphql_1.Field)({ nullable: true, description: 'Weight for aggregation in parent category.' }),
|
|
177
179
|
tslib_1.__metadata("design:type", Number)
|
|
178
180
|
], Kpi.prototype, "weight", void 0);
|
|
181
|
+
tslib_1.__decorate([
|
|
182
|
+
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
183
|
+
(0, type_graphql_1.Field)(type => shell_2.ScalarObject, {
|
|
184
|
+
nullable: true,
|
|
185
|
+
description: 'Performance index lookup table for complex transformations. @deprecated 향후 제거 예정. performanceFormula 사용 권장.'
|
|
186
|
+
}),
|
|
187
|
+
tslib_1.__metadata("design:type", Array)
|
|
188
|
+
], Kpi.prototype, "grades", void 0);
|
|
189
|
+
tslib_1.__decorate([
|
|
190
|
+
(0, typeorm_1.Column)({
|
|
191
|
+
nullable: true,
|
|
192
|
+
type: DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
|
|
193
|
+
? 'longtext'
|
|
194
|
+
: DATABASE_TYPE == 'oracle'
|
|
195
|
+
? 'clob'
|
|
196
|
+
: DATABASE_TYPE == 'mssql'
|
|
197
|
+
? 'nvarchar'
|
|
198
|
+
: 'varchar',
|
|
199
|
+
length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined
|
|
200
|
+
}),
|
|
201
|
+
(0, type_graphql_1.Field)({
|
|
202
|
+
nullable: true,
|
|
203
|
+
description: 'Score calculation formula for this KPI. Converts KPI value to performance score (0-100). For complex mappings, use grades lookup table instead. Example: "if(value >= 90, 100, if(value >= 80, 85, 70))" or "value * 0.8 + 20"'
|
|
204
|
+
}),
|
|
205
|
+
tslib_1.__metadata("design:type", String)
|
|
206
|
+
], Kpi.prototype, "scoreFormula", void 0);
|
|
179
207
|
tslib_1.__decorate([
|
|
180
208
|
(0, typeorm_1.CreateDateColumn)(),
|
|
181
209
|
(0, type_graphql_1.Field)({ nullable: true, description: 'Timestamp when this KPI was created.' }),
|
|
@@ -215,14 +243,6 @@ tslib_1.__decorate([
|
|
|
215
243
|
(0, type_graphql_1.Field)(type => String, { nullable: true, description: 'Thumbnail image or file path for this KPI.' }),
|
|
216
244
|
tslib_1.__metadata("design:type", String)
|
|
217
245
|
], Kpi.prototype, "thumbnail", void 0);
|
|
218
|
-
tslib_1.__decorate([
|
|
219
|
-
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
220
|
-
(0, type_graphql_1.Field)(type => shell_2.ScalarObject, {
|
|
221
|
-
nullable: true,
|
|
222
|
-
description: 'Grade configuration for this KPI version'
|
|
223
|
-
}),
|
|
224
|
-
tslib_1.__metadata("design:type", Array)
|
|
225
|
-
], Kpi.prototype, "grades", void 0);
|
|
226
246
|
exports.Kpi = Kpi = tslib_1.__decorate([
|
|
227
247
|
(0, typeorm_1.Entity)(),
|
|
228
248
|
(0, typeorm_1.Index)('ix_kpi_0', (kpi) => [kpi.domain, kpi.name], {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n OneToMany,\n VersionColumn,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { KpiCategory } from '../kpi-category/kpi-category'\nimport { config } from '@things-factory/env'\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { KpiGrades } from './kpi-grade.types'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\nexport enum KpiStatus {\n DRAFT = 'DRAFT',\n RELEASE = 'RELEASE',\n ARCHIVED = 'ARCHIVED'\n}\n\nexport enum KpiVizType {\n CARD = 'CARD',\n GAUGE = 'GAUGE',\n PROGRESS = 'PROGRESS',\n BAR = 'BAR',\n LINE = 'LINE',\n PIE = 'PIE',\n DONUT = 'DONUT',\n RADAR = 'RADAR',\n BULLET = 'BULLET',\n THERMOMETER = 'THERMOMETER',\n SPEEDOMETER = 'SPEEDOMETER',\n ICON = 'ICON',\n BADGE = 'BADGE',\n TEXT = 'TEXT',\n TABLE = 'TABLE'\n}\n\nexport enum KpiPeriodType {\n DAY = 'DAY',\n WEEK = 'WEEK',\n MONTH = 'MONTH',\n QUARTER = 'QUARTER',\n RANGE = 'RANGE'\n}\n\nregisterEnumType(KpiStatus, {\n name: 'KpiStatus',\n description: 'State enumeration of a KPI (DRAFT, RELEASED, ARCHIVED)'\n})\n\nregisterEnumType(KpiVizType, {\n name: 'KpiVizType',\n description: 'Visualization type for KPI display (CARD, GAUGE, PROGRESS, etc.)'\n})\n\nregisterEnumType(KpiPeriodType, {\n name: 'KpiPeriodType',\n description: 'Aggregation period type for KPI (DAY, WEEK, MONTH, QUARTER, RANGE)'\n})\n\n@Entity()\n@Index('ix_kpi_0', (kpi: Kpi) => [kpi.domain, kpi.name], {\n where: '\"deleted_at\" IS NULL',\n unique: true\n})\n@ObjectType({\n description:\n 'KPI entity. Represents a key performance indicator with calculation formula, target, category, and other attributes.'\n})\nexport class Kpi {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier for this KPI.' })\n readonly id: string\n\n @VersionColumn()\n @Field({\n nullable: true,\n description:\n 'Version number of the KPI. Increments on each modification. When the KPI is released, a snapshot is saved in kpi-history and the status becomes RELEASED. Editing after release increases the version and sets status to DRAFT.'\n })\n version?: number = 1\n\n @ManyToOne(type => Domain)\n @Field({ nullable: true, description: 'Domain (tenant) to which this KPI belongs.' })\n domain?: Domain\n\n @RelationId((kpi: Kpi) => kpi.domain)\n @Field({ nullable: true, description: 'ID of the domain (tenant) for this KPI.' })\n domainId?: string\n\n @Column()\n @Field({ nullable: true, description: 'Name of the KPI.' })\n name?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Detailed description of the KPI.' })\n description?: string\n\n @ManyToOne(() => KpiCategory, { nullable: true })\n @Field(type => KpiCategory, { nullable: true, description: 'Category to which this KPI belongs.' })\n category?: KpiCategory\n\n @RelationId((kpi: Kpi) => kpi.category)\n @Field({ nullable: true, description: 'ID of the category for this KPI.' })\n categoryId?: string\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({\n nullable: true,\n description:\n 'Calculation formula for the KPI. Expressed as a string using metric codes and operators, e.g., \"defect_count / total_count * 100\".'\n })\n formula?: string\n\n @Column({ nullable: false, default: false })\n @Field({ nullable: true, description: 'Indicates whether this KPI is active and usable.' })\n active?: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' })\n state?: KpiStatus\n\n @Column({ nullable: true })\n @Field(type => KpiVizType, {\n nullable: true,\n description: 'Visualization type for this KPI (e.g., CARD, GAUGE, PROGRESS, BAR, LINE, etc.).'\n })\n vizType?: KpiVizType\n\n @Column({ type: 'json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, min/max values, etc.'\n })\n vizMeta?: any\n\n @Column({ nullable: true })\n @Field({\n nullable: true,\n description: 'Cron schedule string for periodic KPI value aggregation (e.g., \"0 0 * * *\" for daily).'\n })\n schedule?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Schedule ID for the KPI (used for scheduler registration).' })\n scheduleId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Timezone for the KPI schedule.' })\n timezone?: string\n\n @Column({ default: 'DAY' })\n @Field(type => KpiPeriodType, { description: 'Aggregation period type for this KPI.' })\n periodType: KpiPeriodType\n\n @Column({ type: 'float', nullable: true, default: 1 })\n @Field({ nullable: true, description: 'Weight for aggregation in parent category.' })\n weight?: number\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was created.' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was last updated.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was deleted (soft delete).' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who created this KPI.' })\n creator?: User\n\n @RelationId((kpi: Kpi) => kpi.creator)\n @Field({ nullable: true, description: 'ID of the user who created this KPI.' })\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who last updated this KPI.' })\n updater?: User\n\n @RelationId((kpi: Kpi) => kpi.updater)\n @Field({ nullable: true, description: 'ID of the user who last updated this KPI.' })\n updaterId?: string\n\n @Field(type => String, { nullable: true, description: 'Thumbnail image or file path for this KPI.' })\n thumbnail?: string\n\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description: 'Grade configuration for this KPI version'\n })\n grades?: KpiGrades\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kpi.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n OneToMany,\n VersionColumn,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { KpiCategory } from '../kpi-category/kpi-category'\nimport { config } from '@things-factory/env'\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { KpiScores } from './kpi-grade.types'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\nexport enum KpiStatus {\n DRAFT = 'DRAFT',\n RELEASE = 'RELEASE',\n ARCHIVED = 'ARCHIVED'\n}\n\nexport enum KpiVizType {\n CARD = 'CARD',\n GAUGE = 'GAUGE',\n PROGRESS = 'PROGRESS',\n BAR = 'BAR',\n LINE = 'LINE',\n PIE = 'PIE',\n DONUT = 'DONUT',\n RADAR = 'RADAR',\n BULLET = 'BULLET',\n THERMOMETER = 'THERMOMETER',\n SPEEDOMETER = 'SPEEDOMETER',\n ICON = 'ICON',\n BADGE = 'BADGE',\n TEXT = 'TEXT',\n TABLE = 'TABLE'\n}\n\nexport enum KpiPeriodType {\n DAY = 'DAY',\n WEEK = 'WEEK',\n MONTH = 'MONTH',\n QUARTER = 'QUARTER',\n YEAR = 'YEAR',\n RANGE = 'RANGE',\n ALLTIME = 'ALLTIME'\n}\n\nregisterEnumType(KpiStatus, {\n name: 'KpiStatus',\n description: 'State enumeration of a KPI (DRAFT, RELEASED, ARCHIVED)'\n})\n\nregisterEnumType(KpiVizType, {\n name: 'KpiVizType',\n description: 'Visualization type for KPI display (CARD, GAUGE, PROGRESS, etc.)'\n})\n\nregisterEnumType(KpiPeriodType, {\n name: 'KpiPeriodType',\n description: 'Aggregation period type for KPI (DAY, WEEK, MONTH, QUARTER, RANGE, ALLTIME)'\n})\n\n@Entity()\n@Index('ix_kpi_0', (kpi: Kpi) => [kpi.domain, kpi.name], {\n where: '\"deleted_at\" IS NULL',\n unique: true\n})\n@ObjectType({\n description:\n 'KPI entity. Represents a key performance indicator with calculation formula, target, category, and other attributes.'\n})\nexport class Kpi {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier for this KPI.' })\n readonly id: string\n\n @VersionColumn()\n @Field({\n nullable: true,\n description:\n 'Version number of the KPI. Increments on each modification. When the KPI is released, a snapshot is saved in kpi-history and the status becomes RELEASED. Editing after release increases the version and sets status to DRAFT.'\n })\n version?: number = 1\n\n @ManyToOne(type => Domain)\n @Field({ nullable: true, description: 'Domain (tenant) to which this KPI belongs.' })\n domain?: Domain\n\n @RelationId((kpi: Kpi) => kpi.domain)\n @Field({ nullable: true, description: 'ID of the domain (tenant) for this KPI.' })\n domainId?: string\n\n @Column()\n @Field({ nullable: true, description: 'Name of the KPI.' })\n name?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Detailed description of the KPI.' })\n description?: string\n\n @ManyToOne(() => KpiCategory, { nullable: true })\n @Field(type => KpiCategory, { nullable: true, description: 'Category to which this KPI belongs.' })\n category?: KpiCategory\n\n @RelationId((kpi: Kpi) => kpi.category)\n @Field({ nullable: true, description: 'ID of the category for this KPI.' })\n categoryId?: string\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({\n nullable: true,\n description:\n 'Calculation formula for the KPI. Expressed as a string using metric codes and operators, e.g., \"defect_count / total_count * 100\".'\n })\n formula?: string\n\n @Column({ nullable: false, default: false })\n @Field({ nullable: true, description: 'Indicates whether this KPI is active and usable.' })\n active?: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' })\n state?: KpiStatus\n\n @Column({ nullable: true })\n @Field(type => KpiVizType, {\n nullable: true,\n description: 'Visualization type for this KPI (e.g., CARD, GAUGE, PROGRESS, BAR, LINE, etc.).'\n })\n vizType?: KpiVizType\n\n @Column({ type: 'json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, min/max values, etc.'\n })\n vizMeta?: any\n\n @Column({ nullable: true })\n @Field({\n nullable: true,\n description: 'Cron schedule string for periodic KPI value aggregation (e.g., \"0 0 * * *\" for daily).'\n })\n schedule?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Schedule ID for the KPI (used for scheduler registration).' })\n scheduleId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Timezone for the KPI schedule.' })\n timezone?: string\n\n @Column({ default: 'DAY' })\n @Field(type => KpiPeriodType, { description: 'Aggregation period type for this KPI.' })\n periodType: KpiPeriodType\n\n @Column({ type: 'float', nullable: true, default: 1 })\n @Field({ nullable: true, description: 'Weight for aggregation in parent category.' })\n weight?: number\n\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Performance index lookup table for complex transformations. @deprecated 향후 제거 예정. performanceFormula 사용 권장.'\n })\n grades?: KpiScores\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({\n nullable: true,\n description:\n 'Score calculation formula for this KPI. Converts KPI value to performance score (0-100). For complex mappings, use grades lookup table instead. Example: \"if(value >= 90, 100, if(value >= 80, 85, 70))\" or \"value * 0.8 + 20\"'\n })\n scoreFormula?: string\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was created.' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was last updated.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was deleted (soft delete).' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who created this KPI.' })\n creator?: User\n\n @RelationId((kpi: Kpi) => kpi.creator)\n @Field({ nullable: true, description: 'ID of the user who created this KPI.' })\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who last updated this KPI.' })\n updater?: User\n\n @RelationId((kpi: Kpi) => kpi.updater)\n @Field({ nullable: true, description: 'ID of the user who last updated this KPI.' })\n updaterId?: string\n\n @Field(type => String, { nullable: true, description: 'Thumbnail image or file path for this KPI.' })\n thumbnail?: string\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { KpiCategory } from './kpi-category';
|
|
2
2
|
import { NewKpiCategory, KpiCategoryPatch } from './kpi-category-type';
|
|
3
3
|
export declare class KpiCategoryMutation {
|
|
4
|
-
createKpiCategory(
|
|
4
|
+
createKpiCategory(kpiCategory: NewKpiCategory, context: ResolverContext): Promise<KpiCategory>;
|
|
5
5
|
updateKpiCategory(id: string, patch: KpiCategoryPatch, context: ResolverContext): Promise<KpiCategory>;
|
|
6
6
|
updateMultipleKpiCategory(patches: KpiCategoryPatch[], context: ResolverContext): Promise<KpiCategory[]>;
|
|
7
7
|
deleteKpiCategory(id: string, context: ResolverContext): Promise<boolean>;
|
|
@@ -8,10 +8,10 @@ const shell_1 = require("@things-factory/shell");
|
|
|
8
8
|
const kpi_category_1 = require("./kpi-category");
|
|
9
9
|
const kpi_category_type_1 = require("./kpi-category-type");
|
|
10
10
|
let KpiCategoryMutation = class KpiCategoryMutation {
|
|
11
|
-
async createKpiCategory(
|
|
11
|
+
async createKpiCategory(kpiCategory, context) {
|
|
12
12
|
const { domain, user, tx } = context.state;
|
|
13
13
|
const result = await (0, shell_1.getRepository)(kpi_category_1.KpiCategory, tx).save({
|
|
14
|
-
...
|
|
14
|
+
...kpiCategory,
|
|
15
15
|
domain,
|
|
16
16
|
creator: user,
|
|
17
17
|
updater: user
|
|
@@ -88,7 +88,7 @@ exports.KpiCategoryMutation = KpiCategoryMutation;
|
|
|
88
88
|
tslib_1.__decorate([
|
|
89
89
|
(0, type_graphql_1.Directive)('@transaction'),
|
|
90
90
|
(0, type_graphql_1.Mutation)(returns => kpi_category_1.KpiCategory, { description: 'Create a new KPI category with the provided details.' }),
|
|
91
|
-
tslib_1.__param(0, (0, type_graphql_1.Arg)('
|
|
91
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('kpiCategory', { description: 'Input object containing details for the new KPI category.' })),
|
|
92
92
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
93
93
|
tslib_1.__metadata("design:type", Function),
|
|
94
94
|
tslib_1.__metadata("design:paramtypes", [kpi_category_type_1.NewKpiCategory, Object]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-category-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AACtE,qCAA4B;AAC5B,iDAAqD;AAErD,iDAA4C;AAC5C,2DAAsE;AAG/D,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAGxB,AAAN,KAAK,CAAC,iBAAiB,CAErB,
|
|
1
|
+
{"version":3,"file":"kpi-category-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category-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'\n\nimport { KpiCategory } from './kpi-category'\nimport { NewKpiCategory, KpiCategoryPatch } from './kpi-category-type'\n\n@Resolver(KpiCategory)\nexport class KpiCategoryMutation {\n @Directive('@transaction')\n @Mutation(returns => KpiCategory, { description: 'Create a new KPI category with the provided details.' })\n async createKpiCategory(\n @Arg('kpiCategory', { description: 'Input object containing details for the new KPI category.' })\n kpiCategory: NewKpiCategory,\n @Ctx() context: ResolverContext\n ): Promise<KpiCategory> {\n const { domain, user, tx } = context.state\n\n const result = await getRepository(KpiCategory, tx).save({\n ...kpiCategory,\n domain,\n creator: user,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => KpiCategory, { description: 'To modify KpiCategory information' })\n async updateKpiCategory(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiCategoryPatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiCategory> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiCategory, tx)\n const kpiCategory = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n const result = await repository.save({\n ...kpiCategory,\n ...patch,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => [KpiCategory], { description: \"To modify multiple KpiCategories' information\" })\n async updateMultipleKpiCategory(\n @Arg('patches', type => [KpiCategoryPatch]) patches: KpiCategoryPatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiCategory[]> {\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 kpiCategoryRepo = getRepository(KpiCategory, 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 kpiCategoryRepo.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 kpiCategory = await kpiCategoryRepo.findOneBy({ id: updateRecord.id })\n\n const result = await kpiCategoryRepo.save({\n ...kpiCategory,\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 @Mutation(returns => Boolean, { description: 'To delete KpiCategory' })\n async deleteKpiCategory(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiCategory, tx).delete({ domain: { id: domain.id }, id })\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiCategories' })\n async deleteKpiCategories(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiCategory, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To import multiple KpiCategories' })\n async importKpiCategories(\n @Arg('kpiCategories', type => [KpiCategoryPatch]) kpiCategories: KpiCategoryPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n kpiCategories.map(async (kpiCategory: KpiCategoryPatch) => {\n const createdKpiCategory: KpiCategory = await getRepository(KpiCategory, tx).save({ domain, ...kpiCategory })\n })\n )\n\n return true\n }\n}\n"]}
|
|
@@ -3,11 +3,24 @@ import { User } from '@things-factory/auth-base';
|
|
|
3
3
|
import { KpiCategory } from './kpi-category';
|
|
4
4
|
import { KpiCategoryList } from './kpi-category-type';
|
|
5
5
|
import { Kpi } from '../kpi/kpi';
|
|
6
|
+
declare class KpiValueItem {
|
|
7
|
+
kpiId: string;
|
|
8
|
+
value: number;
|
|
9
|
+
}
|
|
10
|
+
declare class KpiCategoryValueResult {
|
|
11
|
+
value?: number;
|
|
12
|
+
score?: number;
|
|
13
|
+
valueDate?: string;
|
|
14
|
+
group?: string;
|
|
15
|
+
kpiValues: KpiValueItem[];
|
|
16
|
+
}
|
|
6
17
|
export declare class KpiCategoryQuery {
|
|
7
18
|
kpiCategory(id: string, context: ResolverContext): Promise<KpiCategory>;
|
|
8
19
|
kpiCategories(params: ListParam, context: ResolverContext): Promise<KpiCategoryList>;
|
|
20
|
+
calculateKpiValue(categoryId: string, valueDate: string, group: string, context: ResolverContext): Promise<KpiCategoryValueResult>;
|
|
9
21
|
kpis(kpiCategory: KpiCategory): Promise<Kpi[]>;
|
|
10
22
|
domain(kpiCategory: KpiCategory): Promise<Domain>;
|
|
11
23
|
updater(kpiCategory: KpiCategory): Promise<User>;
|
|
12
24
|
creator(kpiCategory: KpiCategory): Promise<User>;
|
|
13
25
|
}
|
|
26
|
+
export {};
|
|
@@ -8,6 +8,52 @@ const auth_base_1 = require("@things-factory/auth-base");
|
|
|
8
8
|
const kpi_category_1 = require("./kpi-category");
|
|
9
9
|
const kpi_category_type_1 = require("./kpi-category-type");
|
|
10
10
|
const kpi_1 = require("../kpi/kpi");
|
|
11
|
+
const kpi_value_1 = require("../kpi-value/kpi-value");
|
|
12
|
+
const parser_1 = require("../../calculator/parser");
|
|
13
|
+
const evaluator_1 = require("../../calculator/evaluator");
|
|
14
|
+
const functions_1 = require("../../calculator/functions");
|
|
15
|
+
const kpi_value_provider_1 = require("../../controllers/kpi-value-provider");
|
|
16
|
+
const value_date_util_1 = require("../utils/value-date-util");
|
|
17
|
+
const kpi_2 = require("../kpi/kpi");
|
|
18
|
+
const kpi_value_score_service_1 = require("../kpi-value/kpi-value-score.service");
|
|
19
|
+
let KpiValueItem = class KpiValueItem {
|
|
20
|
+
};
|
|
21
|
+
tslib_1.__decorate([
|
|
22
|
+
(0, type_graphql_1.Field)(),
|
|
23
|
+
tslib_1.__metadata("design:type", String)
|
|
24
|
+
], KpiValueItem.prototype, "kpiId", void 0);
|
|
25
|
+
tslib_1.__decorate([
|
|
26
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Float, { nullable: true }),
|
|
27
|
+
tslib_1.__metadata("design:type", Number)
|
|
28
|
+
], KpiValueItem.prototype, "value", void 0);
|
|
29
|
+
KpiValueItem = tslib_1.__decorate([
|
|
30
|
+
(0, type_graphql_1.ObjectType)()
|
|
31
|
+
], KpiValueItem);
|
|
32
|
+
let KpiCategoryValueResult = class KpiCategoryValueResult {
|
|
33
|
+
};
|
|
34
|
+
tslib_1.__decorate([
|
|
35
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Float, { nullable: true }),
|
|
36
|
+
tslib_1.__metadata("design:type", Number)
|
|
37
|
+
], KpiCategoryValueResult.prototype, "value", void 0);
|
|
38
|
+
tslib_1.__decorate([
|
|
39
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Float, { nullable: true, description: 'Performance score for this category (0-1 range)' }),
|
|
40
|
+
tslib_1.__metadata("design:type", Number)
|
|
41
|
+
], KpiCategoryValueResult.prototype, "score", void 0);
|
|
42
|
+
tslib_1.__decorate([
|
|
43
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
44
|
+
tslib_1.__metadata("design:type", String)
|
|
45
|
+
], KpiCategoryValueResult.prototype, "valueDate", void 0);
|
|
46
|
+
tslib_1.__decorate([
|
|
47
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
48
|
+
tslib_1.__metadata("design:type", String)
|
|
49
|
+
], KpiCategoryValueResult.prototype, "group", void 0);
|
|
50
|
+
tslib_1.__decorate([
|
|
51
|
+
(0, type_graphql_1.Field)(type => [KpiValueItem]),
|
|
52
|
+
tslib_1.__metadata("design:type", Array)
|
|
53
|
+
], KpiCategoryValueResult.prototype, "kpiValues", void 0);
|
|
54
|
+
KpiCategoryValueResult = tslib_1.__decorate([
|
|
55
|
+
(0, type_graphql_1.ObjectType)()
|
|
56
|
+
], KpiCategoryValueResult);
|
|
11
57
|
let KpiCategoryQuery = class KpiCategoryQuery {
|
|
12
58
|
async kpiCategory(id, context) {
|
|
13
59
|
const { domain } = context.state;
|
|
@@ -26,6 +72,130 @@ let KpiCategoryQuery = class KpiCategoryQuery {
|
|
|
26
72
|
const [items, total] = await queryBuilder.getManyAndCount();
|
|
27
73
|
return { items, total };
|
|
28
74
|
}
|
|
75
|
+
async calculateKpiValue(categoryId, valueDate, group, context) {
|
|
76
|
+
const { domain, tx } = context.state;
|
|
77
|
+
// 1. 카테고리 정보 조회 (formula 포함)
|
|
78
|
+
const category = await (0, shell_1.getRepository)(kpi_category_1.KpiCategory).findOne({
|
|
79
|
+
where: { domain: { id: domain.id }, id: categoryId }
|
|
80
|
+
});
|
|
81
|
+
if (!category)
|
|
82
|
+
return { value: null, score: null, kpiValues: [] };
|
|
83
|
+
// 기본 계산 기준일 설정 (카테고리 periodType 사용)
|
|
84
|
+
const defaultDate = valueDate || (0, value_date_util_1.getDefaultValueDate)(category.periodType || kpi_2.KpiPeriodType.DAY, 'last');
|
|
85
|
+
// 2. 카테고리 formula가 있으면 formula로 계산
|
|
86
|
+
if (category.formula) {
|
|
87
|
+
const ast = (0, parser_1.parseFormula)(category.formula);
|
|
88
|
+
const provider = new kpi_value_provider_1.KpiValueProvider({
|
|
89
|
+
valueDate: defaultDate,
|
|
90
|
+
group,
|
|
91
|
+
domainId: domain.id,
|
|
92
|
+
tx
|
|
93
|
+
});
|
|
94
|
+
const evalContext = { functions: functions_1.builtinFunctions, provider };
|
|
95
|
+
const value = await (0, evaluator_1.evaluateFormula)(ast, evalContext);
|
|
96
|
+
// 카테고리 formula 결과를 score로 변환 (0-1 범위)
|
|
97
|
+
const score = value !== null && value !== undefined && !isNaN(value) ? Math.max(0, Math.min(1, value)) : null;
|
|
98
|
+
return {
|
|
99
|
+
value,
|
|
100
|
+
score,
|
|
101
|
+
valueDate: defaultDate,
|
|
102
|
+
group,
|
|
103
|
+
kpiValues: [] // 카테고리 formula 기반이므로 개별 KPI 값은 제공하지 않음
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// 3. formula가 없으면 KPI score들의 가중 평균으로 category score 계산
|
|
107
|
+
const kpis = await (0, shell_1.getRepository)(kpi_1.Kpi).find({
|
|
108
|
+
where: { domain: { id: domain.id }, category: { id: categoryId } }
|
|
109
|
+
});
|
|
110
|
+
if (!kpis.length)
|
|
111
|
+
return { value: null, score: null, kpiValues: [] };
|
|
112
|
+
let totalWeight = 0;
|
|
113
|
+
let weightedScoreSum = 0;
|
|
114
|
+
const kpiValues = [];
|
|
115
|
+
for (const kpi of kpis) {
|
|
116
|
+
// KPI value 계산
|
|
117
|
+
let value = null;
|
|
118
|
+
if (kpi.formula) {
|
|
119
|
+
const ast = (0, parser_1.parseFormula)(kpi.formula);
|
|
120
|
+
const provider = new kpi_value_provider_1.KpiValueProvider({
|
|
121
|
+
valueDate: defaultDate,
|
|
122
|
+
group,
|
|
123
|
+
domainId: domain.id,
|
|
124
|
+
tx
|
|
125
|
+
});
|
|
126
|
+
const evalContext = { functions: functions_1.builtinFunctions, provider };
|
|
127
|
+
value = await (0, evaluator_1.evaluateFormula)(ast, evalContext);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const kpiValue = await (0, shell_1.getRepository)(kpi_value_1.KpiValue).findOne({
|
|
131
|
+
where: {
|
|
132
|
+
kpi: { id: kpi.id },
|
|
133
|
+
valueDate: defaultDate,
|
|
134
|
+
group: group ?? '',
|
|
135
|
+
domain: { id: domain.id }
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
value = kpiValue?.value ?? 0;
|
|
139
|
+
}
|
|
140
|
+
// KPI score 계산
|
|
141
|
+
const scoreService = new kpi_value_score_service_1.KpiValueScoreService();
|
|
142
|
+
let kpiScore = null;
|
|
143
|
+
if (value !== null && value !== undefined) {
|
|
144
|
+
let scoreResult = await scoreService.calculateScoreFromFormula(kpi, value);
|
|
145
|
+
if (!scoreResult) {
|
|
146
|
+
scoreResult = scoreService.calculateScoreFromLookup(kpi, value);
|
|
147
|
+
}
|
|
148
|
+
kpiScore = scoreResult?.score ?? null;
|
|
149
|
+
}
|
|
150
|
+
const weight = kpi.weight ?? 1;
|
|
151
|
+
if (kpiScore !== null) {
|
|
152
|
+
weightedScoreSum += kpiScore * weight;
|
|
153
|
+
totalWeight += weight;
|
|
154
|
+
}
|
|
155
|
+
kpiValues.push({ kpiId: kpi.id, value });
|
|
156
|
+
}
|
|
157
|
+
// category score 계산 (KPI score들의 가중 평균)
|
|
158
|
+
const categoryScore = totalWeight ? weightedScoreSum / totalWeight : null;
|
|
159
|
+
// category value는 기존 방식대로 계산 (호환성 유지)
|
|
160
|
+
let totalValueWeight = 0;
|
|
161
|
+
let weightedValueSum = 0;
|
|
162
|
+
for (const kpi of kpis) {
|
|
163
|
+
let value = null;
|
|
164
|
+
if (kpi.formula) {
|
|
165
|
+
const ast = (0, parser_1.parseFormula)(kpi.formula);
|
|
166
|
+
const provider = new kpi_value_provider_1.KpiValueProvider({
|
|
167
|
+
valueDate: defaultDate,
|
|
168
|
+
group,
|
|
169
|
+
domainId: domain.id,
|
|
170
|
+
tx
|
|
171
|
+
});
|
|
172
|
+
const evalContext = { functions: functions_1.builtinFunctions, provider };
|
|
173
|
+
value = await (0, evaluator_1.evaluateFormula)(ast, evalContext);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
const kpiValue = await (0, shell_1.getRepository)(kpi_value_1.KpiValue).findOne({
|
|
177
|
+
where: {
|
|
178
|
+
kpi: { id: kpi.id },
|
|
179
|
+
valueDate: defaultDate,
|
|
180
|
+
group: group ?? '',
|
|
181
|
+
domain: { id: domain.id }
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
value = kpiValue?.value ?? 0;
|
|
185
|
+
}
|
|
186
|
+
const weight = kpi.weight ?? 1;
|
|
187
|
+
weightedValueSum += (value ?? 0) * weight;
|
|
188
|
+
totalValueWeight += weight;
|
|
189
|
+
}
|
|
190
|
+
const resultValue = totalValueWeight ? weightedValueSum / totalValueWeight : null;
|
|
191
|
+
return {
|
|
192
|
+
value: resultValue,
|
|
193
|
+
score: categoryScore,
|
|
194
|
+
valueDate: defaultDate,
|
|
195
|
+
group,
|
|
196
|
+
kpiValues
|
|
197
|
+
};
|
|
198
|
+
}
|
|
29
199
|
async kpis(kpiCategory) {
|
|
30
200
|
return await (0, shell_1.getRepository)(kpi_1.Kpi).find({
|
|
31
201
|
where: { domain: { id: kpiCategory.domainId }, category: { id: kpiCategory.id } }
|
|
@@ -61,6 +231,16 @@ tslib_1.__decorate([
|
|
|
61
231
|
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
|
|
62
232
|
tslib_1.__metadata("design:returntype", Promise)
|
|
63
233
|
], KpiCategoryQuery.prototype, "kpiCategories", null);
|
|
234
|
+
tslib_1.__decorate([
|
|
235
|
+
(0, type_graphql_1.Query)(returns => KpiCategoryValueResult, { description: '카테고리 단위 KPI 실적값 집계/조회' }),
|
|
236
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('categoryId')),
|
|
237
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('valueDate', { nullable: true })),
|
|
238
|
+
tslib_1.__param(2, (0, type_graphql_1.Arg)('group', { nullable: true })),
|
|
239
|
+
tslib_1.__param(3, (0, type_graphql_1.Ctx)()),
|
|
240
|
+
tslib_1.__metadata("design:type", Function),
|
|
241
|
+
tslib_1.__metadata("design:paramtypes", [String, String, String, Object]),
|
|
242
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
243
|
+
], KpiCategoryQuery.prototype, "calculateKpiValue", null);
|
|
64
244
|
tslib_1.__decorate([
|
|
65
245
|
(0, type_graphql_1.FieldResolver)(type => [kpi_1.Kpi]),
|
|
66
246
|
tslib_1.__param(0, (0, type_graphql_1.Root)()),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-category-query.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { KpiCategory } from './kpi-category'\nimport { KpiCategoryList } from './kpi-category-type'\nimport { Kpi } from '../kpi/kpi'\n\n@Resolver(KpiCategory)\nexport class KpiCategoryQuery {\n @Query(returns => KpiCategory!, {\n nullable: true,\n description: 'Fetch a single KPI category by its unique identifier.'\n })\n async kpiCategory(\n @Arg('id', { description: 'Unique identifier of the KPI category to fetch.' }) id: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiCategory> {\n const { domain } = context.state\n\n return await getRepository(KpiCategory).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Query(returns => KpiCategoryList, { description: 'To fetch multiple KpiCategories' })\n async kpiCategories(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<KpiCategoryList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository(KpiCategory),\n searchables: ['name', 'description']\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => [Kpi])\n async kpis(@Root() kpiCategory: KpiCategory): Promise<Kpi[]> {\n return await getRepository(Kpi).find({\n where: { domain: { id: kpiCategory.domainId }, category: { id: kpiCategory.id } }\n })\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() kpiCategory: KpiCategory): Promise<Domain> {\n return kpiCategory.domainId && (await getRepository(Domain).findOneBy({ id: kpiCategory.domainId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() kpiCategory: KpiCategory): Promise<User> {\n return kpiCategory.updaterId && (await getRepository(User).findOneBy({ id: kpiCategory.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() kpiCategory: KpiCategory): Promise<User> {\n return kpiCategory.creatorId && (await getRepository(User).findOneBy({ id: kpiCategory.creatorId }))\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kpi-category-query.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, FieldResolver, Float, Root, Args, Arg, Ctx, Directive, ObjectType, Field } from 'type-graphql'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { KpiCategory } from './kpi-category'\nimport { KpiCategoryList } from './kpi-category-type'\nimport { Kpi } from '../kpi/kpi'\nimport { KpiValue } from '../kpi-value/kpi-value'\nimport { parseFormula } from '../../calculator/parser'\nimport { evaluateFormula } from '../../calculator/evaluator'\nimport { builtinFunctions } from '../../calculator/functions'\nimport { KpiValueProvider } from '../../controllers/kpi-value-provider'\nimport { getDefaultValueDate } from '../utils/value-date-util'\nimport { KpiPeriodType } from '../kpi/kpi'\nimport { KpiValueScoreService } from '../kpi-value/kpi-value-score.service'\n\n@ObjectType()\nclass KpiValueItem {\n @Field()\n kpiId: string\n\n @Field(type => Float, { nullable: true })\n value: number\n}\n\n@ObjectType()\nclass KpiCategoryValueResult {\n @Field(type => Float, { nullable: true })\n value?: number\n\n @Field(type => Float, { nullable: true, description: 'Performance score for this category (0-1 range)' })\n score?: number\n\n @Field({ nullable: true })\n valueDate?: string\n\n @Field({ nullable: true })\n group?: string\n\n @Field(type => [KpiValueItem])\n kpiValues: KpiValueItem[]\n}\n\n@Resolver(KpiCategory)\nexport class KpiCategoryQuery {\n @Query(returns => KpiCategory!, {\n nullable: true,\n description: 'Fetch a single KPI category by its unique identifier.'\n })\n async kpiCategory(\n @Arg('id', { description: 'Unique identifier of the KPI category to fetch.' }) id: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiCategory> {\n const { domain } = context.state\n\n return await getRepository(KpiCategory).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Query(returns => KpiCategoryList, { description: 'To fetch multiple KpiCategories' })\n async kpiCategories(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<KpiCategoryList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository(KpiCategory),\n searchables: ['name', 'description']\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Query(returns => KpiCategoryValueResult, { description: '카테고리 단위 KPI 실적값 집계/조회' })\n async calculateKpiValue(\n @Arg('categoryId') categoryId: string,\n @Arg('valueDate', { nullable: true }) valueDate: string,\n @Arg('group', { nullable: true }) group: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiCategoryValueResult> {\n const { domain, tx } = context.state\n // 1. 카테고리 정보 조회 (formula 포함)\n const category = await getRepository(KpiCategory).findOne({\n where: { domain: { id: domain.id }, id: categoryId }\n })\n if (!category) return { value: null, score: null, kpiValues: [] }\n\n // 기본 계산 기준일 설정 (카테고리 periodType 사용)\n const defaultDate = valueDate || getDefaultValueDate(category.periodType || KpiPeriodType.DAY, 'last')\n\n // 2. 카테고리 formula가 있으면 formula로 계산\n if (category.formula) {\n const ast = parseFormula(category.formula)\n const provider = new KpiValueProvider({\n valueDate: defaultDate,\n group,\n domainId: domain.id,\n tx\n })\n const evalContext = { functions: builtinFunctions, provider }\n const value = await evaluateFormula(ast, evalContext)\n // 카테고리 formula 결과를 score로 변환 (0-1 범위)\n const score = value !== null && value !== undefined && !isNaN(value) ? Math.max(0, Math.min(1, value)) : null\n\n return {\n value,\n score,\n valueDate: defaultDate,\n group,\n kpiValues: [] // 카테고리 formula 기반이므로 개별 KPI 값은 제공하지 않음\n }\n }\n\n // 3. formula가 없으면 KPI score들의 가중 평균으로 category score 계산\n const kpis = await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, category: { id: categoryId } }\n })\n if (!kpis.length) return { value: null, score: null, kpiValues: [] }\n\n let totalWeight = 0\n let weightedScoreSum = 0\n const kpiValues: KpiValueItem[] = []\n\n for (const kpi of kpis) {\n // KPI value 계산\n let value = null\n if (kpi.formula) {\n const ast = parseFormula(kpi.formula)\n const provider = new KpiValueProvider({\n valueDate: defaultDate,\n group,\n domainId: domain.id,\n tx\n })\n const evalContext = { functions: builtinFunctions, provider }\n value = await evaluateFormula(ast, evalContext)\n } else {\n const kpiValue = await getRepository(KpiValue).findOne({\n where: {\n kpi: { id: kpi.id },\n valueDate: defaultDate,\n group: group ?? '',\n domain: { id: domain.id }\n }\n })\n value = kpiValue?.value ?? 0\n }\n\n // KPI score 계산\n const scoreService = new KpiValueScoreService()\n let kpiScore = null\n if (value !== null && value !== undefined) {\n let scoreResult = await scoreService.calculateScoreFromFormula(kpi, value)\n if (!scoreResult) {\n scoreResult = scoreService.calculateScoreFromLookup(kpi, value)\n }\n kpiScore = scoreResult?.score ?? null\n }\n\n const weight = kpi.weight ?? 1\n if (kpiScore !== null) {\n weightedScoreSum += kpiScore * weight\n totalWeight += weight\n }\n\n kpiValues.push({ kpiId: kpi.id, value })\n }\n\n // category score 계산 (KPI score들의 가중 평균)\n const categoryScore = totalWeight ? weightedScoreSum / totalWeight : null\n\n // category value는 기존 방식대로 계산 (호환성 유지)\n let totalValueWeight = 0\n let weightedValueSum = 0\n for (const kpi of kpis) {\n let value = null\n if (kpi.formula) {\n const ast = parseFormula(kpi.formula)\n const provider = new KpiValueProvider({\n valueDate: defaultDate,\n group,\n domainId: domain.id,\n tx\n })\n const evalContext = { functions: builtinFunctions, provider }\n value = await evaluateFormula(ast, evalContext)\n } else {\n const kpiValue = await getRepository(KpiValue).findOne({\n where: {\n kpi: { id: kpi.id },\n valueDate: defaultDate,\n group: group ?? '',\n domain: { id: domain.id }\n }\n })\n value = kpiValue?.value ?? 0\n }\n const weight = kpi.weight ?? 1\n weightedValueSum += (value ?? 0) * weight\n totalValueWeight += weight\n }\n const resultValue = totalValueWeight ? weightedValueSum / totalValueWeight : null\n\n return {\n value: resultValue,\n score: categoryScore,\n valueDate: defaultDate,\n group,\n kpiValues\n }\n }\n\n @FieldResolver(type => [Kpi])\n async kpis(@Root() kpiCategory: KpiCategory): Promise<Kpi[]> {\n return await getRepository(Kpi).find({\n where: { domain: { id: kpiCategory.domainId }, category: { id: kpiCategory.id } }\n })\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() kpiCategory: KpiCategory): Promise<Domain> {\n return kpiCategory.domainId && (await getRepository(Domain).findOneBy({ id: kpiCategory.domainId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() kpiCategory: KpiCategory): Promise<User> {\n return kpiCategory.updaterId && (await getRepository(User).findOneBy({ id: kpiCategory.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() kpiCategory: KpiCategory): Promise<User> {\n return kpiCategory.creatorId && (await getRepository(User).findOneBy({ id: kpiCategory.creatorId }))\n }\n}\n"]}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { KpiCategory } from './kpi-category';
|
|
2
|
+
import { KpiPeriodType } from '../kpi/kpi';
|
|
2
3
|
export declare class NewKpiCategory {
|
|
3
4
|
name: string;
|
|
4
5
|
description?: string;
|
|
5
6
|
active?: boolean;
|
|
6
7
|
formula?: string;
|
|
7
8
|
weight?: number;
|
|
9
|
+
periodType?: KpiPeriodType;
|
|
8
10
|
}
|
|
9
11
|
export declare class KpiCategoryPatch {
|
|
10
12
|
id?: string;
|
|
@@ -13,6 +15,7 @@ export declare class KpiCategoryPatch {
|
|
|
13
15
|
active?: boolean;
|
|
14
16
|
formula?: string;
|
|
15
17
|
weight?: number;
|
|
18
|
+
periodType?: KpiPeriodType;
|
|
16
19
|
cuFlag?: string;
|
|
17
20
|
}
|
|
18
21
|
export declare class KpiCategoryList {
|
|
@@ -4,6 +4,7 @@ exports.KpiCategoryList = exports.KpiCategoryPatch = exports.NewKpiCategory = vo
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const type_graphql_1 = require("type-graphql");
|
|
6
6
|
const kpi_category_1 = require("./kpi-category");
|
|
7
|
+
const kpi_1 = require("../kpi/kpi");
|
|
7
8
|
let NewKpiCategory = class NewKpiCategory {
|
|
8
9
|
};
|
|
9
10
|
exports.NewKpiCategory = NewKpiCategory;
|
|
@@ -27,6 +28,13 @@ tslib_1.__decorate([
|
|
|
27
28
|
(0, type_graphql_1.Field)({ nullable: true, description: 'Weight for aggregation in higher-level summary.' }),
|
|
28
29
|
tslib_1.__metadata("design:type", Number)
|
|
29
30
|
], NewKpiCategory.prototype, "weight", void 0);
|
|
31
|
+
tslib_1.__decorate([
|
|
32
|
+
(0, type_graphql_1.Field)(type => kpi_1.KpiPeriodType, {
|
|
33
|
+
nullable: true,
|
|
34
|
+
description: 'Calculation formula for category score using KPI score variables. Example: "avg(sales_score, profit_score)" or "sales_score * 0.6 + profit_score * 0.4". If not provided, weighted average of child KPI scores will be used.'
|
|
35
|
+
}),
|
|
36
|
+
tslib_1.__metadata("design:type", String)
|
|
37
|
+
], NewKpiCategory.prototype, "periodType", void 0);
|
|
30
38
|
exports.NewKpiCategory = NewKpiCategory = tslib_1.__decorate([
|
|
31
39
|
(0, type_graphql_1.InputType)({
|
|
32
40
|
description: 'Input type for creating a new KPI category. Used in mutations to provide category details.'
|
|
@@ -52,13 +60,20 @@ tslib_1.__decorate([
|
|
|
52
60
|
tslib_1.__metadata("design:type", Boolean)
|
|
53
61
|
], KpiCategoryPatch.prototype, "active", void 0);
|
|
54
62
|
tslib_1.__decorate([
|
|
55
|
-
(0, type_graphql_1.Field)({
|
|
63
|
+
(0, type_graphql_1.Field)({
|
|
64
|
+
nullable: true,
|
|
65
|
+
description: 'Calculation formula for category score using KPI score variables. Example: "avg(sales_score, profit_score)" or "sales_score * 0.6 + profit_score * 0.4". If not provided, weighted average of child KPI scores will be used.'
|
|
66
|
+
}),
|
|
56
67
|
tslib_1.__metadata("design:type", String)
|
|
57
68
|
], KpiCategoryPatch.prototype, "formula", void 0);
|
|
58
69
|
tslib_1.__decorate([
|
|
59
70
|
(0, type_graphql_1.Field)({ nullable: true, description: 'Weight for aggregation in higher-level summary.' }),
|
|
60
71
|
tslib_1.__metadata("design:type", Number)
|
|
61
72
|
], KpiCategoryPatch.prototype, "weight", void 0);
|
|
73
|
+
tslib_1.__decorate([
|
|
74
|
+
(0, type_graphql_1.Field)(type => kpi_1.KpiPeriodType, { nullable: true, description: 'Aggregation period type for this category.' }),
|
|
75
|
+
tslib_1.__metadata("design:type", String)
|
|
76
|
+
], KpiCategoryPatch.prototype, "periodType", void 0);
|
|
62
77
|
tslib_1.__decorate([
|
|
63
78
|
(0, type_graphql_1.Field)({ nullable: true, description: 'Custom flag for update operations (internal use).' }),
|
|
64
79
|
tslib_1.__metadata("design:type", String)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-category-type.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category-type.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"kpi-category-type.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category-type.ts"],"names":[],"mappings":";;;;AAAA,+CAAoE;AAEpE,iDAA4C;AAC5C,oCAA0C;AAKnC,IAAM,cAAc,GAApB,MAAM,cAAc;CAsB1B,CAAA;AAtBY,wCAAc;AAEzB;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;;4CACxC;AAGZ;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;;mDACjE;AAGpB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kDAAkD,EAAE,CAAC;;8CAC3E;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;;+CACrE;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;;8CAC3E;AAOf;IALC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,mBAAa,EAAE;QAC5B,QAAQ,EAAE,IAAI;QACd,WAAW,EACT,8NAA8N;KACjO,CAAC;;kDACwB;yBArBf,cAAc;IAH1B,IAAA,wBAAS,EAAC;QACT,WAAW,EAAE,4FAA4F;KAC1G,CAAC;GACW,cAAc,CAsB1B;AAKM,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CA4B5B,CAAA;AA5BY,4CAAgB;AAE3B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC;;4CAC7E;AAGX;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;;8CACvD;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;;qDACjE;AAGpB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kDAAkD,EAAE,CAAC;;gDAC3E;AAOhB;IALC,IAAA,oBAAK,EAAC;QACL,QAAQ,EAAE,IAAI;QACd,WAAW,EACT,8NAA8N;KACjO,CAAC;;iDACc;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;;gDAC3E;AAGf;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,mBAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;;oDAClF;AAG1B;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC;;gDAC7E;2BA3BJ,gBAAgB;IAH5B,IAAA,wBAAS,EAAC;QACT,WAAW,EAAE,gGAAgG;KAC9G,CAAC;GACW,gBAAgB,CA4B5B;AAGM,IAAM,eAAe,GAArB,MAAM,eAAe;CAM3B,CAAA;AANY,0CAAe;AAE1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,0BAAW,CAAC,CAAC;;8CACT;AAGpB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;8CACN;0BALF,eAAe;IAD3B,IAAA,yBAAU,GAAE;GACA,eAAe,CAM3B","sourcesContent":["import { ObjectType, Field, InputType, Int, ID } from 'type-graphql'\n\nimport { KpiCategory } from './kpi-category'\nimport { KpiPeriodType } from '../kpi/kpi'\n\n@InputType({\n description: 'Input type for creating a new KPI category. Used in mutations to provide category details.'\n})\nexport class NewKpiCategory {\n @Field({ description: 'Name of the KPI category.' })\n name: string\n\n @Field({ nullable: true, description: 'Detailed description of this KPI category.' })\n description?: string\n\n @Field({ nullable: true, description: 'Whether this category is active (usable) or not.' })\n active?: boolean\n\n @Field({ nullable: true, description: 'Aggregation formula using child KPI codes.' })\n formula?: string\n\n @Field({ nullable: true, description: 'Weight for aggregation in higher-level summary.' })\n weight?: number\n\n @Field(type => KpiPeriodType, {\n nullable: true,\n description:\n 'Calculation formula for category score using KPI score variables. Example: \"avg(sales_score, profit_score)\" or \"sales_score * 0.6 + profit_score * 0.4\". If not provided, weighted average of child KPI scores will be used.'\n })\n periodType?: KpiPeriodType\n}\n\n@InputType({\n description: 'Input type for updating an existing KPI category. Used in mutations to patch category details.'\n})\nexport class KpiCategoryPatch {\n @Field(type => ID, { nullable: true, description: 'ID of the KPI category to update.' })\n id?: string\n\n @Field({ nullable: true, description: 'Name of the KPI category.' })\n name?: string\n\n @Field({ nullable: true, description: 'Detailed description of this KPI category.' })\n description?: string\n\n @Field({ nullable: true, description: 'Whether this category is active (usable) or not.' })\n active?: boolean\n\n @Field({\n nullable: true,\n description:\n 'Calculation formula for category score using KPI score variables. Example: \"avg(sales_score, profit_score)\" or \"sales_score * 0.6 + profit_score * 0.4\". If not provided, weighted average of child KPI scores will be used.'\n })\n formula?: string\n\n @Field({ nullable: true, description: 'Weight for aggregation in higher-level summary.' })\n weight?: number\n\n @Field(type => KpiPeriodType, { nullable: true, description: 'Aggregation period type for this category.' })\n periodType?: KpiPeriodType\n\n @Field({ nullable: true, description: 'Custom flag for update operations (internal use).' })\n cuFlag?: string\n}\n\n@ObjectType()\nexport class KpiCategoryList {\n @Field(type => [KpiCategory])\n items: KpiCategory[]\n\n @Field(type => Int)\n total: number\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Domain } from '@things-factory/shell';
|
|
2
2
|
import { User } from '@things-factory/auth-base';
|
|
3
3
|
import { Kpi } from '../kpi/kpi';
|
|
4
|
+
import { KpiPeriodType } from '../kpi/kpi';
|
|
4
5
|
export declare class KpiCategory {
|
|
5
6
|
readonly id: string;
|
|
6
7
|
domain?: Domain;
|
|
@@ -10,6 +11,7 @@ export declare class KpiCategory {
|
|
|
10
11
|
active?: boolean;
|
|
11
12
|
formula?: string;
|
|
12
13
|
weight?: number;
|
|
14
|
+
periodType: KpiPeriodType;
|
|
13
15
|
creator?: User;
|
|
14
16
|
creatorId?: string;
|
|
15
17
|
updater?: User;
|