@things-factory/kpi 9.1.19 → 10.0.0-beta.2
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/pages/kpi/kpi-list-page.ts +339 -525
- package/client/pages/kpi/kpi-tree-page.ts +135 -207
- package/client/pages/kpi-metric/kpi-metric-list-page.ts +146 -226
- package/client/pages/kpi-metric-value/kpi-metric-value-editor-page.ts +187 -295
- package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +123 -194
- package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.ts +57 -91
- package/client/pages/kpi-statistic/kpi-statistic-editor-page.ts +180 -278
- package/client/pages/kpi-statistic/kpi-statistic-list-page.ts +186 -286
- package/client/pages/kpi-value/kpi-value-editor-page.ts +189 -292
- package/client/pages/kpi-value/kpi-value-list-page.ts +170 -264
- package/dist-client/pages/kpi/kpi-list-page.d.ts +0 -6
- package/dist-client/pages/kpi/kpi-list-page.js +150 -282
- package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
- package/dist-client/pages/kpi/kpi-tree-page.d.ts +1 -7
- package/dist-client/pages/kpi/kpi-tree-page.js +76 -127
- package/dist-client/pages/kpi/kpi-tree-page.js.map +1 -1
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.d.ts +0 -6
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +62 -116
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +1 -7
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +82 -140
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +0 -6
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +54 -98
- 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-page.d.ts +1 -7
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +30 -57
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -1
- package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.d.ts +1 -7
- package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js +91 -153
- package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js.map +1 -1
- package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.d.ts +0 -6
- package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js +81 -155
- package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js.map +1 -1
- package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +1 -7
- package/dist-client/pages/kpi-value/kpi-value-editor-page.js +80 -136
- package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +1 -1
- package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +0 -6
- package/dist-client/pages/kpi-value/kpi-value-list-page.js +73 -134
- package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/index.d.ts +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -18
- package/client/tsconfig.json +0 -11
- package/dist-server/tsconfig.json +0 -10
- package/server/@types/index.d.ts +0 -11
- package/server/calculator/evaluator.ts +0 -45
- package/server/calculator/functions.ts +0 -67
- package/server/calculator/index.ts +0 -4
- package/server/calculator/parser.ts +0 -137
- package/server/calculator/provider.ts +0 -10
- package/server/controllers/index.ts +0 -2
- package/server/controllers/kpi-metric-value-provider.ts +0 -79
- package/server/controllers/kpi-value-provider.ts +0 -51
- package/server/index.ts +0 -6
- package/server/migrations/1752190849680-seed-kpi-metrics.ts +0 -124
- package/server/migrations/1752190849681-seed-kpi.ts +0 -356
- package/server/migrations/1752192090123-add-grades-to-kpi.ts +0 -67
- package/server/migrations/1752192090124-add-kpi-statistics.ts +0 -719
- package/server/migrations/1752192090128-seed-kpi-org-scope.ts +0 -132
- package/server/migrations/1752192090129-seed-kpi-values.ts +0 -207
- package/server/migrations/grade-data/x11-performance-table.json +0 -962
- package/server/migrations/grade-data/x12-performance-table.json +0 -611
- package/server/migrations/grade-data/x14-performance-table.json +0 -42
- package/server/migrations/grade-data/x21-performance-table.json +0 -889
- package/server/migrations/grade-data/x22-performance-table.json +0 -1064
- package/server/migrations/grade-data/x23-performance-table.json +0 -42
- package/server/migrations/grade-data/x31-performance-table.json +0 -644
- package/server/migrations/grade-data/x32-performance-table.json +0 -993
- package/server/migrations/grade-data/x33-performance-table.json +0 -195
- package/server/migrations/grade-data/x34-performance-table.json +0 -12
- package/server/migrations/grade-data/x35-performance-table.json +0 -42
- package/server/migrations/grade-data/x41-performance-table.json +0 -825
- package/server/migrations/grade-data/x42-performance-table.json +0 -786
- package/server/migrations/grade-data/x43-performance-table.json +0 -12
- package/server/migrations/grade-data/x44-performance-table.json +0 -42
- package/server/migrations/grade-data/x51-performance-table.json +0 -924
- package/server/migrations/grade-data/x52-performance-table.json +0 -42
- package/server/migrations/grade-data/x61-performance-table.json +0 -261
- package/server/migrations/grade-data/x62-performance-table.json +0 -42
- package/server/migrations/index.ts +0 -9
- package/server/migrations/seed-data/kpi-metrics-seed.json +0 -454
- package/server/migrations/seed-data/kpi-org-scope-seed.json +0 -1676
- package/server/migrations/seed-data/kpi-scopes-seed.json +0 -121
- package/server/migrations/seed-data/kpi-values-seed.json +0 -402
- package/server/migrations/seed-data/kpis-seed.json +0 -488
- package/server/migrations/seed-data/scope-definitions-seed.json +0 -90
- package/server/routes.ts +0 -81
- package/server/service/index.ts +0 -51
- package/server/service/kpi/aggregate-kpi.ts +0 -103
- package/server/service/kpi/event-subscriber.ts +0 -29
- package/server/service/kpi/index.ts +0 -9
- package/server/service/kpi/kpi-formula.service.ts +0 -164
- package/server/service/kpi/kpi-grade.types.ts +0 -28
- package/server/service/kpi/kpi-history.ts +0 -126
- package/server/service/kpi/kpi-mutation.ts +0 -553
- package/server/service/kpi/kpi-query.ts +0 -224
- package/server/service/kpi/kpi-type.ts +0 -151
- package/server/service/kpi/kpi.ts +0 -254
- package/server/service/kpi-alert/index.ts +0 -3
- package/server/service/kpi-alert/kpi-alert-query.ts +0 -59
- package/server/service/kpi-alert/kpi-alert-type.ts +0 -20
- package/server/service/kpi-metric/aggregate-kpi-metric.ts +0 -132
- package/server/service/kpi-metric/index.ts +0 -7
- package/server/service/kpi-metric/kpi-metric-mutation.ts +0 -309
- package/server/service/kpi-metric/kpi-metric-query.ts +0 -70
- package/server/service/kpi-metric/kpi-metric-type.ts +0 -111
- package/server/service/kpi-metric/kpi-metric.ts +0 -134
- package/server/service/kpi-metric-value/index.ts +0 -7
- package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +0 -270
- package/server/service/kpi-metric-value/kpi-metric-value-query.ts +0 -62
- package/server/service/kpi-metric-value/kpi-metric-value-type.ts +0 -82
- package/server/service/kpi-metric-value/kpi-metric-value.ts +0 -93
- package/server/service/kpi-org-scope/index.ts +0 -6
- package/server/service/kpi-org-scope/kpi-org-scope-mutation.ts +0 -173
- package/server/service/kpi-org-scope/kpi-org-scope-query.ts +0 -127
- package/server/service/kpi-org-scope/kpi-org-scope-type.ts +0 -68
- package/server/service/kpi-org-scope/kpi-org-scope.ts +0 -123
- package/server/service/kpi-scope/index.ts +0 -11
- package/server/service/kpi-scope/kpi-scope-mutation.ts +0 -129
- package/server/service/kpi-scope/kpi-scope-query.ts +0 -63
- package/server/service/kpi-scope/kpi-scope-type.ts +0 -96
- package/server/service/kpi-scope/kpi-scope.ts +0 -143
- package/server/service/kpi-statistic/index.ts +0 -7
- package/server/service/kpi-statistic/kpi-statistic-batch.service.ts +0 -231
- package/server/service/kpi-statistic/kpi-statistic-calculation.service.ts +0 -410
- package/server/service/kpi-statistic/kpi-statistic-mutation.ts +0 -291
- package/server/service/kpi-statistic/kpi-statistic-query.ts +0 -146
- package/server/service/kpi-statistic/kpi-statistic-type.ts +0 -152
- package/server/service/kpi-statistic/kpi-statistic.ts +0 -199
- package/server/service/kpi-value/index.ts +0 -7
- package/server/service/kpi-value/kpi-value-mutation.ts +0 -432
- package/server/service/kpi-value/kpi-value-query.ts +0 -61
- package/server/service/kpi-value/kpi-value-score.service.ts +0 -106
- package/server/service/kpi-value/kpi-value-type.ts +0 -122
- package/server/service/kpi-value/kpi-value.ts +0 -160
- package/server/service/utils/value-date-util.ts +0 -119
- package/server/tsconfig.json +0 -10
- package/server/types/global.d.ts +0 -8
|
@@ -1,122 +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, Float } from 'type-graphql'
|
|
4
|
-
|
|
5
|
-
import { ObjectRef, ScalarObject } from '@things-factory/shell'
|
|
6
|
-
|
|
7
|
-
import { KpiValue, KpiValueInputType } from './kpi-value'
|
|
8
|
-
|
|
9
|
-
@InputType({ description: 'Input type for creating a new KPI value. Used in mutations to provide KPI value details.' })
|
|
10
|
-
export class NewKpiValue {
|
|
11
|
-
@Field(type => ID, { description: 'ID of the KPI to which this value belongs.' })
|
|
12
|
-
kpiId: string
|
|
13
|
-
|
|
14
|
-
@Field(type => Int, { description: 'Version of the KPI definition at the time this value is calculated.' })
|
|
15
|
-
version: number
|
|
16
|
-
|
|
17
|
-
@Field({ description: 'Date or period for which this KPI value is recorded (e.g., day, month, quarter).' })
|
|
18
|
-
valueDate: string
|
|
19
|
-
|
|
20
|
-
@Field(type => Float, { description: 'The calculated numeric value for this KPI and period.' })
|
|
21
|
-
value: number
|
|
22
|
-
|
|
23
|
-
@Field(type => Float, {
|
|
24
|
-
nullable: true,
|
|
25
|
-
description: 'Performance score calculated from KPI value using scoreFormula or grades lookup table. Range: 0-1.'
|
|
26
|
-
})
|
|
27
|
-
score?: number
|
|
28
|
-
|
|
29
|
-
@Field(type => ScalarObject, {
|
|
30
|
-
nullable: true,
|
|
31
|
-
description:
|
|
32
|
-
'Extended or non-numeric information related to this KPI value, stored as JSON5. Can include grade, status, comments, or other metadata.'
|
|
33
|
-
})
|
|
34
|
-
meta?: any
|
|
35
|
-
|
|
36
|
-
@Field(type => ID, { nullable: true, description: 'ID of the KPI organization scope for this value.' })
|
|
37
|
-
kpiOrgScopeId?: string
|
|
38
|
-
|
|
39
|
-
@Field({ nullable: true, description: 'Legacy organizational unit identifier (for backward compatibility)' })
|
|
40
|
-
org?: string
|
|
41
|
-
|
|
42
|
-
@Field({ nullable: true, description: 'Group key for this value (organization, line, user, project, etc.)' })
|
|
43
|
-
group?: string
|
|
44
|
-
|
|
45
|
-
@Field(type => KpiValueInputType, {
|
|
46
|
-
nullable: true,
|
|
47
|
-
description: 'Indicates whether this value was entered manually or generated automatically.'
|
|
48
|
-
})
|
|
49
|
-
inputType?: KpiValueInputType
|
|
50
|
-
|
|
51
|
-
@Field({ nullable: true, description: 'Source of the value (e.g., system, user, external integration).' })
|
|
52
|
-
source?: string
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
@InputType({
|
|
56
|
-
description: 'Input type for updating an existing KPI value. Used in mutations to patch KPI value details.'
|
|
57
|
-
})
|
|
58
|
-
export class KpiValuePatch {
|
|
59
|
-
@Field(type => ID, { nullable: true, description: 'ID of the KPI value to update.' })
|
|
60
|
-
id?: string
|
|
61
|
-
|
|
62
|
-
@Field(type => ID, { nullable: true, description: 'ID of the KPI to which this value belongs.' })
|
|
63
|
-
kpiId?: string
|
|
64
|
-
|
|
65
|
-
@Field(type => Int, {
|
|
66
|
-
nullable: true,
|
|
67
|
-
description: 'Version of the KPI definition at the time this value is calculated.'
|
|
68
|
-
})
|
|
69
|
-
version?: number
|
|
70
|
-
|
|
71
|
-
@Field({
|
|
72
|
-
nullable: true,
|
|
73
|
-
description: 'Date or period for which this KPI value is recorded (e.g., day, month, quarter).'
|
|
74
|
-
})
|
|
75
|
-
valueDate?: string
|
|
76
|
-
|
|
77
|
-
@Field(type => Float, { nullable: true, description: 'The calculated numeric value for this KPI and period.' })
|
|
78
|
-
value?: number
|
|
79
|
-
|
|
80
|
-
@Field(type => Float, {
|
|
81
|
-
nullable: true,
|
|
82
|
-
description: 'Performance score calculated from KPI value using scoreFormula or grades lookup table. Range: 0-1.'
|
|
83
|
-
})
|
|
84
|
-
score?: number
|
|
85
|
-
|
|
86
|
-
@Field(type => ScalarObject, {
|
|
87
|
-
nullable: true,
|
|
88
|
-
description:
|
|
89
|
-
'Extended or non-numeric information related to this KPI value, stored as JSON5. Can include grade, status, comments, or other metadata.'
|
|
90
|
-
})
|
|
91
|
-
meta?: any
|
|
92
|
-
|
|
93
|
-
@Field(type => ID, { nullable: true, description: 'ID of the KPI organization scope for this value.' })
|
|
94
|
-
kpiOrgScopeId?: string
|
|
95
|
-
|
|
96
|
-
@Field({ nullable: true, description: 'Legacy organizational unit identifier (for backward compatibility)' })
|
|
97
|
-
org?: string
|
|
98
|
-
|
|
99
|
-
@Field({ nullable: true, description: 'Group key for this value (organization, line, user, project, etc.)' })
|
|
100
|
-
group?: string
|
|
101
|
-
|
|
102
|
-
@Field(type => KpiValueInputType, {
|
|
103
|
-
nullable: true,
|
|
104
|
-
description: 'Indicates whether this value was entered manually or generated automatically.'
|
|
105
|
-
})
|
|
106
|
-
inputType?: KpiValueInputType
|
|
107
|
-
|
|
108
|
-
@Field({ nullable: true, description: 'Source of the value (e.g., system, user, external integration).' })
|
|
109
|
-
source?: string
|
|
110
|
-
|
|
111
|
-
@Field({ nullable: true, description: 'Custom flag for update operations (internal use).' })
|
|
112
|
-
cuFlag?: string
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
@ObjectType()
|
|
116
|
-
export class KpiValueList {
|
|
117
|
-
@Field(type => [KpiValue])
|
|
118
|
-
items: KpiValue[]
|
|
119
|
-
|
|
120
|
-
@Field(type => Int)
|
|
121
|
-
total: number
|
|
122
|
-
}
|
|
@@ -1,160 +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 { User } from '@things-factory/auth-base'
|
|
14
|
-
import { Domain, ScalarObject, json5Transformer } from '@things-factory/shell'
|
|
15
|
-
import { config } from '@things-factory/env'
|
|
16
|
-
import { Kpi, KpiPeriodType } from '../kpi/kpi'
|
|
17
|
-
import { KpiOrgScope } from '../kpi-org-scope/kpi-org-scope'
|
|
18
|
-
|
|
19
|
-
const ORMCONFIG = config.get('ormconfig', {})
|
|
20
|
-
const DATABASE_TYPE = ORMCONFIG.type
|
|
21
|
-
|
|
22
|
-
export enum KpiValueInputType {
|
|
23
|
-
MANUAL = 'MANUAL',
|
|
24
|
-
AUTO = 'AUTO'
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
registerEnumType(KpiValueInputType, {
|
|
28
|
-
name: 'KpiValueInputType',
|
|
29
|
-
description: 'Type of the input (Manual or Auto)'
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
@Entity()
|
|
33
|
-
@Index('ix_kpi_value_latest', ['domain', 'kpi', 'valueDate', 'kpiOrgScope', 'version'], { unique: true })
|
|
34
|
-
@Index('ix_kpi_value_latest_for_query', ['domain', 'kpi', 'valueDate', 'kpiOrgScope'], { unique: false })
|
|
35
|
-
@Index('ix_kpi_value_group_kpi', ['domain', 'group', 'kpi', 'valueDate'], { unique: false })
|
|
36
|
-
@Index('ix_kpi_value_kpi_group', ['domain', 'kpi', 'group', 'valueDate'], { unique: false })
|
|
37
|
-
@ObjectType({ description: 'Entity for KpiValue' })
|
|
38
|
-
export class KpiValue {
|
|
39
|
-
@PrimaryGeneratedColumn('uuid')
|
|
40
|
-
@Field(type => ID, { description: 'Unique identifier for this KPI value record.' })
|
|
41
|
-
readonly id: string
|
|
42
|
-
|
|
43
|
-
@ManyToOne(type => Domain)
|
|
44
|
-
@Field({ nullable: true, description: 'Domain (tenant) to which this KPI value belongs.' })
|
|
45
|
-
domain?: Domain
|
|
46
|
-
|
|
47
|
-
@RelationId((kpiValue: KpiValue) => kpiValue.domain)
|
|
48
|
-
@Field({ nullable: true, description: 'ID of the domain (tenant) for this KPI value.' })
|
|
49
|
-
domainId?: string
|
|
50
|
-
|
|
51
|
-
@ManyToOne(() => Kpi)
|
|
52
|
-
@Field(type => Kpi, {
|
|
53
|
-
nullable: true,
|
|
54
|
-
description: 'Reference to the KPI definition for which this value is calculated.'
|
|
55
|
-
})
|
|
56
|
-
kpi: Kpi
|
|
57
|
-
|
|
58
|
-
@RelationId((kpiValue: KpiValue) => kpiValue.kpi)
|
|
59
|
-
@Field({ description: 'ID of the referenced KPI.' })
|
|
60
|
-
kpiId: string
|
|
61
|
-
|
|
62
|
-
@Column('int')
|
|
63
|
-
@Field(type => Int, { description: 'Version of the KPI definition at the time this value was calculated.' })
|
|
64
|
-
version: number
|
|
65
|
-
|
|
66
|
-
@Column()
|
|
67
|
-
@Field({
|
|
68
|
-
description:
|
|
69
|
-
'Date or period for which this KPI value is recorded (e.g., day: YYYY-MM-DD, month: YYYY-MM, quarter: YYYY-Qn, range: YYYY-MM-DD~YYYY-MM-DD).'
|
|
70
|
-
})
|
|
71
|
-
valueDate: string
|
|
72
|
-
|
|
73
|
-
@Column('float')
|
|
74
|
-
@Field(type => Float, { description: 'The calculated numeric value for this KPI and period.' })
|
|
75
|
-
value: number
|
|
76
|
-
|
|
77
|
-
@Column('float', { nullable: true })
|
|
78
|
-
@Field(type => Float, {
|
|
79
|
-
nullable: true,
|
|
80
|
-
description: 'Performance score calculated from KPI value using scoreFormula or grades lookup table.'
|
|
81
|
-
})
|
|
82
|
-
score?: number
|
|
83
|
-
|
|
84
|
-
@Column({ nullable: true })
|
|
85
|
-
@Field(type => String, {
|
|
86
|
-
nullable: true,
|
|
87
|
-
description: 'Group key for this value (organization, line, user, project, etc.)'
|
|
88
|
-
})
|
|
89
|
-
group?: string
|
|
90
|
-
|
|
91
|
-
@ManyToOne(() => KpiOrgScope, { nullable: true })
|
|
92
|
-
@Field(type => KpiOrgScope, {
|
|
93
|
-
nullable: true,
|
|
94
|
-
description: 'Reference to the organization scope mapping for this KPI value.'
|
|
95
|
-
})
|
|
96
|
-
kpiOrgScope?: KpiOrgScope
|
|
97
|
-
|
|
98
|
-
@RelationId((kpiValue: KpiValue) => kpiValue.kpiOrgScope)
|
|
99
|
-
@Field({ nullable: true, description: 'ID of the referenced KPI organization scope.' })
|
|
100
|
-
kpiOrgScopeId?: string
|
|
101
|
-
|
|
102
|
-
@Column({ nullable: true })
|
|
103
|
-
@Field({
|
|
104
|
-
nullable: true,
|
|
105
|
-
description: 'Indicates whether this value was entered manually or generated automatically.'
|
|
106
|
-
})
|
|
107
|
-
inputType?: KpiValueInputType
|
|
108
|
-
|
|
109
|
-
@Column({ nullable: true })
|
|
110
|
-
@Field({ nullable: true, description: 'Source of the value (e.g., system, user, external integration).' })
|
|
111
|
-
source?: string
|
|
112
|
-
|
|
113
|
-
@Column({
|
|
114
|
-
nullable: true,
|
|
115
|
-
type:
|
|
116
|
-
DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
|
|
117
|
-
? 'longtext'
|
|
118
|
-
: DATABASE_TYPE == 'oracle'
|
|
119
|
-
? 'clob'
|
|
120
|
-
: DATABASE_TYPE == 'mssql'
|
|
121
|
-
? 'nvarchar'
|
|
122
|
-
: 'varchar',
|
|
123
|
-
length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined,
|
|
124
|
-
transformer: json5Transformer
|
|
125
|
-
})
|
|
126
|
-
@Field(type => ScalarObject, {
|
|
127
|
-
nullable: true,
|
|
128
|
-
description:
|
|
129
|
-
'Extended or non-numeric information related to this KPI value, stored as JSON5. Can include grade, status, comments, or other metadata.'
|
|
130
|
-
})
|
|
131
|
-
meta?: any
|
|
132
|
-
|
|
133
|
-
@Column({ default: 'DAY' })
|
|
134
|
-
@Field(type => KpiPeriodType, { description: 'Aggregation period type for this KPI value.' })
|
|
135
|
-
periodType: KpiPeriodType
|
|
136
|
-
|
|
137
|
-
@CreateDateColumn()
|
|
138
|
-
@Field({ nullable: true, description: 'Timestamp when this KPI value record was created.' })
|
|
139
|
-
createdAt?: Date
|
|
140
|
-
|
|
141
|
-
@UpdateDateColumn()
|
|
142
|
-
@Field({ nullable: true, description: 'Timestamp when this KPI value record was last updated.' })
|
|
143
|
-
updatedAt?: Date
|
|
144
|
-
|
|
145
|
-
@ManyToOne(type => User, { nullable: true })
|
|
146
|
-
@Field(type => User, { nullable: true, description: 'User who created this KPI value record.' })
|
|
147
|
-
creator?: User
|
|
148
|
-
|
|
149
|
-
@RelationId((kpiValue: KpiValue) => kpiValue.creator)
|
|
150
|
-
@Field({ nullable: true, description: 'ID of the user who created this KPI value record.' })
|
|
151
|
-
creatorId?: string
|
|
152
|
-
|
|
153
|
-
@ManyToOne(type => User, { nullable: true })
|
|
154
|
-
@Field(type => User, { nullable: true, description: 'User who last updated this KPI value record.' })
|
|
155
|
-
updater?: User
|
|
156
|
-
|
|
157
|
-
@RelationId((kpiValue: KpiValue) => kpiValue.updater)
|
|
158
|
-
@Field({ nullable: true, description: 'ID of the user who last updated this KPI value record.' })
|
|
159
|
-
updaterId?: string
|
|
160
|
-
}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { KpiPeriodType } from '../kpi/kpi'
|
|
2
|
-
|
|
3
|
-
export function getISOWeek(date: Date): number {
|
|
4
|
-
const tmp = new Date(date.getTime())
|
|
5
|
-
tmp.setHours(0, 0, 0, 0)
|
|
6
|
-
tmp.setDate(tmp.getDate() + 4 - (tmp.getDay() || 7))
|
|
7
|
-
const yearStart = new Date(tmp.getFullYear(), 0, 1)
|
|
8
|
-
const weekNo = Math.ceil(((tmp.getTime() - yearStart.getTime()) / 86400000 + 1) / 7)
|
|
9
|
-
return weekNo
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function getMonday(year: number, week: number): Date {
|
|
13
|
-
const simple = new Date(year, 0, 1 + (week - 1) * 7)
|
|
14
|
-
const dow = simple.getDay()
|
|
15
|
-
const ISOweekStart = simple
|
|
16
|
-
if (dow <= 4) ISOweekStart.setDate(simple.getDate() - simple.getDay() + 1)
|
|
17
|
-
else ISOweekStart.setDate(simple.getDate() + 8 - simple.getDay())
|
|
18
|
-
return ISOweekStart
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function normalizePeriodDate(valueDate: string, periodType: KpiPeriodType): Date {
|
|
22
|
-
switch (periodType) {
|
|
23
|
-
case KpiPeriodType.DAY:
|
|
24
|
-
return new Date(valueDate + 'T00:00:00.000Z')
|
|
25
|
-
|
|
26
|
-
case KpiPeriodType.WEEK: {
|
|
27
|
-
// "2024-W03" → 해당 주의 월요일
|
|
28
|
-
const [year, week] = valueDate.split('-W')
|
|
29
|
-
return getMonday(parseInt(year), parseInt(week))
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
case KpiPeriodType.MONTH:
|
|
33
|
-
return new Date(valueDate + '-01T00:00:00.000Z')
|
|
34
|
-
|
|
35
|
-
case KpiPeriodType.QUARTER: {
|
|
36
|
-
// "2024-Q1" → 해당 분기 시작일
|
|
37
|
-
const [year, quarter] = valueDate.split('-Q')
|
|
38
|
-
const month = (parseInt(quarter) - 1) * 3 + 1
|
|
39
|
-
return new Date(`${year}-${month.toString().padStart(2, '0')}-01T00:00:00.000Z`)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
case KpiPeriodType.YEAR:
|
|
43
|
-
return new Date(valueDate + '-01-01T00:00:00.000Z')
|
|
44
|
-
|
|
45
|
-
case KpiPeriodType.RANGE: {
|
|
46
|
-
// "2024-01-01~2024-01-31" → 시작일 사용
|
|
47
|
-
const startDate = valueDate.split('~')[0]
|
|
48
|
-
return new Date(startDate + 'T00:00:00.000Z')
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
case KpiPeriodType.ALLTIME:
|
|
52
|
-
return new Date('1900-01-01T00:00:00.000Z') // 고정 기준점
|
|
53
|
-
|
|
54
|
-
default:
|
|
55
|
-
return new Date(valueDate + 'T00:00:00.000Z')
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function getDefaultValueDate(periodType: KpiPeriodType, mode: 'current' | 'last' = 'current'): string {
|
|
60
|
-
const now = new Date()
|
|
61
|
-
if (mode === 'last') {
|
|
62
|
-
switch (periodType) {
|
|
63
|
-
case KpiPeriodType.DAY: {
|
|
64
|
-
const d = new Date(now)
|
|
65
|
-
d.setDate(d.getDate() - 1)
|
|
66
|
-
return d.toISOString().slice(0, 10)
|
|
67
|
-
}
|
|
68
|
-
case KpiPeriodType.MONTH: {
|
|
69
|
-
const d = new Date(now)
|
|
70
|
-
d.setMonth(d.getMonth() - 1)
|
|
71
|
-
return d.toISOString().slice(0, 7)
|
|
72
|
-
}
|
|
73
|
-
case KpiPeriodType.QUARTER: {
|
|
74
|
-
let year = now.getFullYear()
|
|
75
|
-
let quarter = Math.floor(now.getMonth() / 3)
|
|
76
|
-
if (quarter === 0) {
|
|
77
|
-
year -= 1
|
|
78
|
-
quarter = 4
|
|
79
|
-
}
|
|
80
|
-
return `${year}-Q${quarter}`
|
|
81
|
-
}
|
|
82
|
-
case KpiPeriodType.WEEK: {
|
|
83
|
-
const d = new Date(now)
|
|
84
|
-
d.setDate(d.getDate() - 7)
|
|
85
|
-
const year = d.getFullYear()
|
|
86
|
-
const week = getISOWeek(d)
|
|
87
|
-
return `${year}-W${week}`
|
|
88
|
-
}
|
|
89
|
-
case KpiPeriodType.ALLTIME:
|
|
90
|
-
return 'ALLTIME'
|
|
91
|
-
default: {
|
|
92
|
-
const d = new Date(now)
|
|
93
|
-
d.setDate(d.getDate() - 1)
|
|
94
|
-
return d.toISOString().slice(0, 10)
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
} else {
|
|
98
|
-
switch (periodType) {
|
|
99
|
-
case KpiPeriodType.DAY:
|
|
100
|
-
return now.toISOString().slice(0, 10)
|
|
101
|
-
case KpiPeriodType.MONTH:
|
|
102
|
-
return now.toISOString().slice(0, 7)
|
|
103
|
-
case KpiPeriodType.QUARTER: {
|
|
104
|
-
const year = now.getFullYear()
|
|
105
|
-
const quarter = Math.floor(now.getMonth() / 3) + 1
|
|
106
|
-
return `${year}-Q${quarter}`
|
|
107
|
-
}
|
|
108
|
-
case KpiPeriodType.WEEK: {
|
|
109
|
-
const year = now.getFullYear()
|
|
110
|
-
const week = getISOWeek(now)
|
|
111
|
-
return `${year}-W${week}`
|
|
112
|
-
}
|
|
113
|
-
case KpiPeriodType.ALLTIME:
|
|
114
|
-
return 'ALLTIME'
|
|
115
|
-
default:
|
|
116
|
-
return now.toISOString().slice(0, 10)
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
package/server/tsconfig.json
DELETED