@things-factory/kpi 9.0.22 → 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.
Files changed (140) hide show
  1. package/client/pages/kpi/kpi-list-page.ts +180 -22
  2. package/client/pages/kpi-category/kpi-category-list-page.ts +76 -3
  3. package/client/pages/kpi-category/kpi-category-value-calculator.ts +233 -0
  4. package/client/pages/kpi-metric/kpi-metric-list-page.ts +13 -1
  5. package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +43 -1
  6. package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.ts +3 -13
  7. package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.ts +13 -1
  8. package/client/pages/kpi-value/kpi-value-list-page.ts +45 -1
  9. package/dist-client/pages/kpi/kpi-list-page.d.ts +2 -1
  10. package/dist-client/pages/kpi/kpi-list-page.js +180 -22
  11. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
  12. package/dist-client/pages/kpi-category/kpi-category-list-page.d.ts +3 -0
  13. package/dist-client/pages/kpi-category/kpi-category-list-page.js +71 -3
  14. package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +1 -1
  15. package/dist-client/pages/kpi-category/kpi-category-value-calculator.d.ts +13 -0
  16. package/dist-client/pages/kpi-category/kpi-category-value-calculator.js +256 -0
  17. package/dist-client/pages/kpi-category/kpi-category-value-calculator.js.map +1 -0
  18. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +13 -1
  19. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
  20. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +4 -1
  21. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +39 -2
  22. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
  23. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +3 -13
  24. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -1
  25. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +13 -1
  26. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -1
  27. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +1 -0
  28. package/dist-client/pages/kpi-value/kpi-value-list-page.js +45 -1
  29. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
  30. package/dist-client/tsconfig.tsbuildinfo +1 -1
  31. package/dist-server/calculator/evaluator.d.ts +8 -0
  32. package/dist-server/calculator/evaluator.js +42 -0
  33. package/dist-server/calculator/evaluator.js.map +1 -0
  34. package/dist-server/calculator/functions.d.ts +3 -0
  35. package/dist-server/calculator/functions.js +62 -0
  36. package/dist-server/calculator/functions.js.map +1 -0
  37. package/dist-server/calculator/index.d.ts +4 -0
  38. package/dist-server/calculator/index.js +8 -0
  39. package/dist-server/calculator/index.js.map +1 -0
  40. package/dist-server/calculator/parser.d.ts +21 -0
  41. package/dist-server/calculator/parser.js +121 -0
  42. package/dist-server/calculator/parser.js.map +1 -0
  43. package/dist-server/calculator/provider.d.ts +8 -0
  44. package/dist-server/calculator/provider.js +13 -0
  45. package/dist-server/calculator/provider.js.map +1 -0
  46. package/dist-server/controllers/kpi-metric-value-provider.d.ts +11 -0
  47. package/dist-server/controllers/kpi-metric-value-provider.js +63 -0
  48. package/dist-server/controllers/kpi-metric-value-provider.js.map +1 -0
  49. package/dist-server/controllers/kpi-value-provider.d.ts +11 -0
  50. package/dist-server/controllers/kpi-value-provider.js +46 -0
  51. package/dist-server/controllers/kpi-value-provider.js.map +1 -0
  52. package/dist-server/service/index.d.ts +2 -2
  53. package/dist-server/service/kpi/aggregate-kpi.js +4 -4
  54. package/dist-server/service/kpi/aggregate-kpi.js.map +1 -1
  55. package/dist-server/service/kpi/kpi-grade.types.d.ts +11 -10
  56. package/dist-server/service/kpi/kpi-grade.types.js.map +1 -1
  57. package/dist-server/service/kpi/kpi-history.d.ts +2 -2
  58. package/dist-server/service/kpi/kpi-history.js.map +1 -1
  59. package/dist-server/service/kpi/kpi-mutation.d.ts +2 -0
  60. package/dist-server/service/kpi/kpi-mutation.js +126 -4
  61. package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
  62. package/dist-server/service/kpi/kpi-type.d.ts +8 -5
  63. package/dist-server/service/kpi/kpi-type.js +22 -8
  64. package/dist-server/service/kpi/kpi-type.js.map +1 -1
  65. package/dist-server/service/kpi/kpi.d.ts +6 -3
  66. package/dist-server/service/kpi/kpi.js +29 -9
  67. package/dist-server/service/kpi/kpi.js.map +1 -1
  68. package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +1 -1
  69. package/dist-server/service/kpi-category/kpi-category-mutation.js +3 -3
  70. package/dist-server/service/kpi-category/kpi-category-mutation.js.map +1 -1
  71. package/dist-server/service/kpi-category/kpi-category-query.d.ts +13 -0
  72. package/dist-server/service/kpi-category/kpi-category-query.js +180 -0
  73. package/dist-server/service/kpi-category/kpi-category-query.js.map +1 -1
  74. package/dist-server/service/kpi-category/kpi-category-type.d.ts +3 -0
  75. package/dist-server/service/kpi-category/kpi-category-type.js +16 -1
  76. package/dist-server/service/kpi-category/kpi-category-type.js.map +1 -1
  77. package/dist-server/service/kpi-category/kpi-category.d.ts +2 -0
  78. package/dist-server/service/kpi-category/kpi-category.js +10 -1
  79. package/dist-server/service/kpi-category/kpi-category.js.map +1 -1
  80. package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +5 -3
  81. package/dist-server/service/kpi-metric/kpi-metric-type.js +5 -3
  82. package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -1
  83. package/dist-server/service/kpi-metric/kpi-metric.d.ts +2 -8
  84. package/dist-server/service/kpi-metric/kpi-metric.js +3 -14
  85. package/dist-server/service/kpi-metric/kpi-metric.js.map +1 -1
  86. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +67 -45
  87. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
  88. package/dist-server/service/kpi-metric-value/kpi-metric-value.js +3 -2
  89. package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -1
  90. package/dist-server/service/kpi-value/kpi-value-mutation.d.ts +2 -1
  91. package/dist-server/service/kpi-value/kpi-value-mutation.js +114 -6
  92. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
  93. package/dist-server/service/kpi-value/kpi-value-query.d.ts +0 -2
  94. package/dist-server/service/kpi-value/kpi-value-query.js +0 -12
  95. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
  96. package/dist-server/service/kpi-value/kpi-value-score.service.d.ts +26 -0
  97. package/dist-server/service/kpi-value/kpi-value-score.service.js +97 -0
  98. package/dist-server/service/kpi-value/kpi-value-score.service.js.map +1 -0
  99. package/dist-server/service/kpi-value/kpi-value-type.d.ts +2 -0
  100. package/dist-server/service/kpi-value/kpi-value-type.js +14 -0
  101. package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
  102. package/dist-server/service/kpi-value/kpi-value.d.ts +1 -0
  103. package/dist-server/service/kpi-value/kpi-value.js +9 -1
  104. package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
  105. package/dist-server/service/utils/value-date-util.d.ts +3 -0
  106. package/dist-server/service/utils/value-date-util.js +76 -0
  107. package/dist-server/service/utils/value-date-util.js.map +1 -0
  108. package/dist-server/tsconfig.tsbuildinfo +1 -1
  109. package/package.json +2 -2
  110. package/server/calculator/evaluator.ts +45 -0
  111. package/server/calculator/functions.ts +67 -0
  112. package/server/calculator/index.ts +4 -0
  113. package/server/calculator/parser.ts +128 -0
  114. package/server/calculator/provider.ts +10 -0
  115. package/server/controllers/kpi-metric-value-provider.ts +66 -0
  116. package/server/controllers/kpi-value-provider.ts +51 -0
  117. package/server/service/kpi/aggregate-kpi.ts +4 -4
  118. package/server/service/kpi/kpi-grade.types.ts +11 -10
  119. package/server/service/kpi/kpi-history.ts +2 -2
  120. package/server/service/kpi/kpi-mutation.ts +128 -4
  121. package/server/service/kpi/kpi-type.ts +21 -9
  122. package/server/service/kpi/kpi.ts +32 -10
  123. package/server/service/kpi-category/kpi-category-mutation.ts +3 -3
  124. package/server/service/kpi-category/kpi-category-query.ts +175 -1
  125. package/server/service/kpi-category/kpi-category-type.ts +17 -6
  126. package/server/service/kpi-category/kpi-category.ts +10 -1
  127. package/server/service/kpi-metric/kpi-metric-type.ts +7 -5
  128. package/server/service/kpi-metric/kpi-metric.ts +3 -15
  129. package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +67 -47
  130. package/server/service/kpi-metric-value/kpi-metric-value.ts +4 -2
  131. package/server/service/kpi-value/kpi-value-mutation.ts +110 -6
  132. package/server/service/kpi-value/kpi-value-query.ts +2 -8
  133. package/server/service/kpi-value/kpi-value-score.service.ts +112 -0
  134. package/server/service/kpi-value/kpi-value-type.ts +12 -0
  135. package/server/service/kpi-value/kpi-value.ts +8 -1
  136. package/server/service/utils/value-date-util.ts +72 -0
  137. package/dist-server/service/kpi-value/kpi-value-grade.service.d.ts +0 -34
  138. package/dist-server/service/kpi-value/kpi-value-grade.service.js +0 -117
  139. package/dist-server/service/kpi-value/kpi-value-grade.service.js.map +0 -1
  140. package/server/service/kpi-value/kpi-value-grade.service.ts +0 -127
@@ -3,6 +3,7 @@ import '@material/web/button/elevated-button.js'
3
3
  import '@operato/data-grist/ox-grist.js'
4
4
  import '@operato/data-grist/ox-filters-form.js'
5
5
  import '@operato/data-grist/ox-record-creator.js'
6
+ import './kpi-metric-value-manual-entry-form.js'
6
7
 
7
8
  import { CommonButtonStyles, CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'
8
9
  import { PageView, store } from '@operato/shell'
@@ -113,6 +114,18 @@ export class KpiMetricValueListPage extends connect(store)(localize(i18next)(Sco
113
114
  columns: [
114
115
  { type: 'gutter', gutterName: 'sequence' },
115
116
  { type: 'gutter', gutterName: 'row-selector', multiple: true },
117
+ // KPI Metric Value 수정 버튼 추가
118
+ {
119
+ type: 'gutter',
120
+ gutterName: 'button',
121
+ icon: 'edit',
122
+ title: '수정',
123
+ handlers: {
124
+ click: (columns, data, column, record, rowIndex) => {
125
+ this._editKpiMetricValue(record)
126
+ }
127
+ }
128
+ },
116
129
  {
117
130
  type: 'string',
118
131
  name: 'metric',
@@ -120,7 +133,7 @@ export class KpiMetricValueListPage extends connect(store)(localize(i18next)(Sco
120
133
  record: { editable: false, renderer: (v, c, r) => r.metric?.name },
121
134
  width: 150
122
135
  },
123
- { type: 'date', name: 'valueDate', header: '날짜', record: { editable: true }, width: 120 },
136
+ { type: 'string', name: 'valueDate', header: '날짜', record: { editable: true }, width: 120 },
124
137
  { type: 'number', name: 'value', header: '값', record: { editable: true }, width: 120 },
125
138
  { type: 'string', name: 'group', header: '그룹', record: { editable: false }, width: 120 },
126
139
  { type: 'object', name: 'meta', header: '메타', record: { editable: false }, width: 120 },
@@ -151,6 +164,12 @@ export class KpiMetricValueListPage extends connect(store)(localize(i18next)(Sco
151
164
  }
152
165
  }
153
166
 
167
+ pageUpdated(changes: any, lifecycle: any) {
168
+ if (this.active) {
169
+ this.grist.fetch()
170
+ }
171
+ }
172
+
154
173
  async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) {
155
174
  const response = await client.query({
156
175
  query: gql`
@@ -296,4 +315,27 @@ export class KpiMetricValueListPage extends connect(store)(localize(i18next)(Sco
296
315
  async importHandler(records) {
297
316
  // 임포트 팝업 등은 추후 구현
298
317
  }
318
+
319
+ async _editKpiMetricValue(metricValue) {
320
+ const popup = await openPopup(
321
+ html`
322
+ <kpi-metric-value-manual-entry-form
323
+ .metric=${metricValue.metric}
324
+ .valueDate=${metricValue.valueDate}
325
+ .value=${metricValue.value}
326
+ .group=${metricValue.group}
327
+ .meta=${metricValue.meta ? JSON.stringify(metricValue.meta) : ''}
328
+ @saved=${() => {
329
+ this.grist.fetch()
330
+ popup.close()
331
+ }}
332
+ ></kpi-metric-value-manual-entry-form>
333
+ `,
334
+ {
335
+ title: `${metricValue.metric?.name || ''} 값 수정`,
336
+ size: 'medium',
337
+ backdrop: true
338
+ }
339
+ )
340
+ }
299
341
  }
@@ -111,24 +111,14 @@ export class KpiMetricValueManualEntryForm extends LitElement {
111
111
  try {
112
112
  await client.mutate({
113
113
  mutation: gql`
114
- mutation ($metricId: ID!, $valueDate: String!, $value: Float!, $group: String, $meta: Object) {
115
- createKpiMetricValue(
116
- metricValue: {
117
- metricId: $metricId
118
- valueDate: $valueDate
119
- value: $value
120
- group: $group
121
- meta: $meta
122
- periodType: DAY
123
- }
124
- ) {
114
+ mutation ($metricName: String!, $value: Float!, $group: String, $meta: Object) {
115
+ recordKpiMetricValue(metricName: $metricName, value: $value, meta: $meta, group: $group) {
125
116
  id
126
117
  }
127
118
  }
128
119
  `,
129
120
  variables: {
130
- metricId: this.metric.id,
131
- valueDate: this.valueDate,
121
+ metricName: this.metric.name,
132
122
  value: parseFloat(this.value),
133
123
  group: this.group || undefined,
134
124
  meta: parsedMeta
@@ -99,7 +99,19 @@ export class KpiMetricValueManualEntryPage extends connect(store)(localize(i18ne
99
99
  type: 'select',
100
100
  name: 'periodType',
101
101
  header: '주기',
102
- record: { editable: true, options: ['', 'DAY', 'WEEK', 'MONTH', 'QUARTER', 'YEAR', 'RANGE'] },
102
+ record: {
103
+ editable: true,
104
+ options: [
105
+ { value: '', display: '' },
106
+ { value: 'DAY', display: '일' },
107
+ { value: 'WEEK', display: '주' },
108
+ { value: 'MONTH', display: '월' },
109
+ { value: 'QUARTER', display: '분기' },
110
+ { value: 'YEAR', display: '년' },
111
+ { value: 'RANGE', display: '범위' },
112
+ { value: 'ALLTIME', display: '전체' }
113
+ ]
114
+ },
103
115
  width: 80
104
116
  },
105
117
  {
@@ -130,6 +130,7 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
130
130
  'version',
131
131
  'valueDate',
132
132
  'value',
133
+ 'score',
133
134
  'group',
134
135
  'inputType',
135
136
  'source',
@@ -144,6 +145,7 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
144
145
  'version',
145
146
  'valueDate',
146
147
  'value',
148
+ 'score',
147
149
  'group',
148
150
  'inputType',
149
151
  'source',
@@ -157,6 +159,18 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
157
159
  columns: [
158
160
  { type: 'gutter', gutterName: 'sequence' },
159
161
  { type: 'gutter', gutterName: 'row-selector', multiple: true },
162
+ // KPI Value 재계산 버튼 추가
163
+ {
164
+ type: 'gutter',
165
+ gutterName: 'button',
166
+ icon: 'refresh',
167
+ title: '재계산',
168
+ handlers: {
169
+ click: (columns, data, column, record, rowIndex) => {
170
+ this._recalculateKpiValue(record)
171
+ }
172
+ }
173
+ },
160
174
  {
161
175
  type: 'string',
162
176
  name: 'kpi',
@@ -165,8 +179,9 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
165
179
  width: 150
166
180
  },
167
181
  { type: 'number', name: 'version', header: '버전', record: { editable: false }, width: 80 },
168
- { type: 'date', name: 'valueDate', header: '실적일', record: { editable: true }, width: 120 },
182
+ { type: 'string', name: 'valueDate', header: '실적일', record: { editable: true }, width: 120 },
169
183
  { type: 'number', name: 'value', header: '실적값', record: { editable: true }, width: 120 },
184
+ { type: 'number', name: 'score', header: '성과점수', record: { editable: false }, width: 120 },
170
185
  { type: 'string', name: 'group', header: '그룹', record: { editable: false }, width: 120 },
171
186
  { type: 'string', name: 'inputType', header: '입력방식', record: { editable: false }, width: 100 },
172
187
  { type: 'string', name: 'source', header: '수집출처', record: { editable: false }, width: 120 },
@@ -218,6 +233,7 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
218
233
  version
219
234
  valueDate
220
235
  value
236
+ score
221
237
  inputType
222
238
  source
223
239
  meta
@@ -308,6 +324,7 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
308
324
  version
309
325
  valueDate
310
326
  value
327
+ score
311
328
  }
312
329
  }
313
330
  `,
@@ -322,6 +339,33 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
322
339
  }
323
340
  }
324
341
 
342
+ async _recalculateKpiValue(kpiValue) {
343
+ try {
344
+ const response = await client.mutate({
345
+ mutation: gql`
346
+ mutation ($id: String!) {
347
+ recalculateKpiValue(id: $id) {
348
+ id
349
+ value
350
+ score
351
+ valueDate
352
+ group
353
+ }
354
+ }
355
+ `,
356
+ variables: {
357
+ id: kpiValue.id
358
+ }
359
+ })
360
+ if (!response.errors) {
361
+ notify({ message: 'KPI Value가 성공적으로 재계산되었습니다.' })
362
+ this.grist.fetch()
363
+ }
364
+ } catch (error) {
365
+ notify({ message: 'KPI Value 재계산 중 오류가 발생했습니다.' })
366
+ }
367
+ }
368
+
325
369
  async creationCallback(kpiValue) {
326
370
  try {
327
371
  const response = await client.query({
@@ -29,7 +29,7 @@ export declare class KpiListPage extends KpiListPage_base {
29
29
  private grist;
30
30
  availableVariables: any[];
31
31
  availableVariablesLoaded: boolean;
32
- getAvailableVariables(): Promise<any[]>;
32
+ getAvailableKpiMetricVariables(): Promise<any[]>;
33
33
  get context(): {
34
34
  title: string;
35
35
  search: {
@@ -76,5 +76,6 @@ export declare class KpiListPage extends KpiListPage_base {
76
76
  _editGrades(kpi: any): Promise<void>;
77
77
  _editViz(kpi: any): Promise<void>;
78
78
  _onVizUpdated(kpiId: string, vizType: string, vizMeta: any): Promise<void>;
79
+ _calculateKpiValue(kpi: any): Promise<void>;
79
80
  }
80
81
  export {};
@@ -60,7 +60,7 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
60
60
  'kpi-viz-editor': KpiVizEditor
61
61
  };
62
62
  }
63
- async getAvailableVariables() {
63
+ async getAvailableKpiMetricVariables() {
64
64
  if (this.availableVariablesLoaded) {
65
65
  return this.availableVariables;
66
66
  }
@@ -153,24 +153,7 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
153
153
  async pageInitialized(lifecycle) {
154
154
  this.gristConfig = {
155
155
  list: {
156
- fields: [
157
- 'name',
158
- 'description',
159
- 'category',
160
- 'formula',
161
- 'active',
162
- 'state',
163
- 'vizType',
164
- 'schedule',
165
- 'scheduleId',
166
- 'timezone',
167
- 'version',
168
- 'createdAt',
169
- 'updatedAt',
170
- 'creator',
171
- 'updater',
172
- 'thumbnail'
173
- ],
156
+ fields: ['name', 'description'],
174
157
  details: [
175
158
  'name',
176
159
  'description',
@@ -193,6 +176,18 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
193
176
  columns: [
194
177
  { type: 'gutter', gutterName: 'sequence' },
195
178
  { type: 'gutter', gutterName: 'row-selector', multiple: true },
179
+ // KPI 실적값 계산 버튼 추가
180
+ {
181
+ type: 'gutter',
182
+ gutterName: 'button',
183
+ icon: 'calculate',
184
+ title: '실적값 계산',
185
+ handlers: {
186
+ click: (columns, data, column, record, rowIndex) => {
187
+ this._calculateKpiValue(record);
188
+ }
189
+ }
190
+ },
196
191
  {
197
192
  type: 'string',
198
193
  name: 'name',
@@ -231,15 +226,150 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
231
226
  record: {
232
227
  editable: true,
233
228
  availableVariables: async () => {
234
- return await this.getAvailableVariables();
229
+ return await this.getAvailableKpiMetricVariables();
235
230
  }
236
231
  },
237
232
  width: 320
238
233
  },
234
+ {
235
+ type: 'select',
236
+ name: 'periodType',
237
+ header: '계산주기',
238
+ record: {
239
+ editable: true,
240
+ options: [
241
+ { value: '', display: '' },
242
+ { value: 'DAY', display: '일' },
243
+ { value: 'WEEK', display: '주' },
244
+ { value: 'MONTH', display: '월' },
245
+ { value: 'QUARTER', display: '분기' },
246
+ { value: 'YEAR', display: '년' },
247
+ { value: 'RANGE', display: '범위' },
248
+ { value: 'ALLTIME', display: '전체' }
249
+ ]
250
+ },
251
+ width: 80
252
+ },
253
+ {
254
+ type: 'formula',
255
+ name: 'scoreFormula',
256
+ header: '성과점수수식',
257
+ record: {
258
+ editable: true,
259
+ availableVariables: async () => {
260
+ return [
261
+ {
262
+ name: 'value',
263
+ description: 'KPI 실적값',
264
+ type: 'kpi-value',
265
+ unit: ''
266
+ }
267
+ ];
268
+ },
269
+ includeDefaultFunctions: false,
270
+ availableFunctions: [
271
+ {
272
+ name: 'INTEGRATE()',
273
+ description: '수치 적분',
274
+ template: 'INTEGRATE({func}, {a}, {b}, {n})',
275
+ syntax: 'INTEGRATE(func, a, b, n)',
276
+ parameters: ['func - 적분할 함수', 'a - 하한값', 'b - 상한값', 'n - 분할 수 (기본값: 1000)'],
277
+ returnType: 'number',
278
+ help: '사다리꼴 적분법을 사용하여 수치 적분을 계산합니다.',
279
+ examples: ['INTEGRATE(x => x*x, 0, 1, 1000)', 'INTEGRATE([효율성], 0, 1)']
280
+ },
281
+ {
282
+ name: 'BETA_FUNCTION()',
283
+ description: '베타 함수',
284
+ template: 'BETA_FUNCTION({x}, {alpha}, {beta})',
285
+ syntax: 'BETA_FUNCTION(x, alpha, beta)',
286
+ parameters: ['x - 변수 (0 ≤ x ≤ 1)', 'alpha - 첫 번째 모수', 'beta - 두 번째 모수'],
287
+ returnType: 'number',
288
+ help: '베타 분포 함수를 계산합니다. t^(α-1) × (1-t)^(β-1)',
289
+ examples: ['BETA_FUNCTION(0.5, 2, 3)', 'BETA_FUNCTION([품질지수], 3, 2)']
290
+ },
291
+ {
292
+ name: 'INCOMPLETE_BETA()',
293
+ description: '불완전 베타 함수',
294
+ template: 'INCOMPLETE_BETA({x}, {alpha}, {beta})',
295
+ syntax: 'INCOMPLETE_BETA(x, alpha, beta)',
296
+ parameters: ['x - 상한값 (0 ≤ x ≤ 1)', 'alpha - 첫 번째 모수', 'beta - 두 번째 모수'],
297
+ returnType: 'number',
298
+ help: '불완전 베타 함수를 수치 적분으로 계산합니다.',
299
+ examples: ['INCOMPLETE_BETA(0.7, 2, 3)', 'INCOMPLETE_BETA([목표달성률]/100, 2, 3)']
300
+ },
301
+ {
302
+ name: 'COMPLETE_BETA()',
303
+ description: '완전 베타 함수',
304
+ template: 'COMPLETE_BETA({alpha}, {beta})',
305
+ syntax: 'COMPLETE_BETA(alpha, beta)',
306
+ parameters: ['alpha - 첫 번째 모수', 'beta - 두 번째 모수'],
307
+ returnType: 'number',
308
+ help: '완전 베타 함수 B(α,β)를 계산합니다.',
309
+ examples: ['COMPLETE_BETA(2, 3)', 'COMPLETE_BETA(3, 2)']
310
+ },
311
+ {
312
+ name: 'PERFORMANCE_INDEX()',
313
+ description: '성과 지수',
314
+ template: 'PERFORMANCE_INDEX({x}, {alpha1}, {beta1}, {alpha2}, {beta2})',
315
+ syntax: 'PERFORMANCE_INDEX(x, alpha1, beta1, alpha2, beta2)',
316
+ parameters: [
317
+ 'x - 성과 값 (0 ≤ x ≤ 1)',
318
+ 'alpha1, beta1 - 분자 베타 함수 모수',
319
+ 'alpha2, beta2 - 분모 베타 함수 모수'
320
+ ],
321
+ returnType: 'number',
322
+ help: '성과 지수를 계산합니다: 1 - (불완전 베타 / 완전 베타)',
323
+ examples: ['PERFORMANCE_INDEX(0.8, 2, 3, 2, 3)', 'PERFORMANCE_INDEX([성과점수]/100, 2, 3, 2, 3)']
324
+ },
325
+ {
326
+ name: 'EXP()',
327
+ description: '지수 함수',
328
+ template: 'EXP({x})',
329
+ syntax: 'EXP(x)',
330
+ parameters: ['x - 지수'],
331
+ returnType: 'number',
332
+ help: '자연상수 e의 x제곱을 계산합니다.',
333
+ examples: ['EXP(1)', 'EXP([효율성])']
334
+ },
335
+ {
336
+ name: 'LOG()',
337
+ description: '자연 로그',
338
+ template: 'LOG({x})',
339
+ syntax: 'LOG(x)',
340
+ parameters: ['x - 로그를 취할 값'],
341
+ returnType: 'number',
342
+ help: '자연 로그 ln(x)를 계산합니다.',
343
+ examples: ['LOG(2.718)', 'LOG([성과점수])']
344
+ },
345
+ {
346
+ name: 'POW()',
347
+ description: '거듭제곱',
348
+ template: 'POW({x}, {y})',
349
+ syntax: 'POW(x, y)',
350
+ parameters: ['x - 밑수', 'y - 지수'],
351
+ returnType: 'number',
352
+ help: 'x의 y제곱을 계산합니다.',
353
+ examples: ['POW(2, 3)', 'POW([효율성], 2)']
354
+ },
355
+ {
356
+ name: 'EXPONENTIAL_DECAY()',
357
+ description: '지수 감쇠',
358
+ template: 'EXPONENTIAL_DECAY({value}, {scale}, {power})',
359
+ syntax: 'EXPONENTIAL_DECAY(value, scale, power)',
360
+ parameters: ['value - 입력 값', 'scale - 스케일 파라미터', 'power - 지수 파라미터'],
361
+ returnType: 'number',
362
+ help: '지수 감쇠 함수 exp(-(value/scale)^power)를 계산합니다.',
363
+ examples: ['EXPONENTIAL_DECAY(50, 100, 2)', 'EXPONENTIAL_DECAY([목표달성률], 50, 2)']
364
+ }
365
+ ]
366
+ },
367
+ width: 200
368
+ },
239
369
  {
240
370
  type: 'string',
241
371
  name: 'grades',
242
- header: '등급 설정',
372
+ header: '성과지수 Lookup',
243
373
  record: {
244
374
  editable: false,
245
375
  renderer: (v, c, r) => {
@@ -354,11 +484,13 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
354
484
  name
355
485
  description
356
486
  active
487
+ formula
488
+ periodType
489
+ scoreFormula
357
490
  grades
358
491
  vizType
359
492
  vizMeta
360
493
  weight
361
- formula
362
494
  schedule
363
495
  scheduleId
364
496
  timezone
@@ -599,6 +731,32 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
599
731
  });
600
732
  }
601
733
  }
734
+ async _calculateKpiValue(kpi) {
735
+ try {
736
+ const response = await client.mutate({
737
+ mutation: gql `
738
+ mutation ($kpiId: String!) {
739
+ calculateKpiValue(kpiId: $kpiId) {
740
+ id
741
+ value
742
+ valueDate
743
+ group
744
+ }
745
+ }
746
+ `,
747
+ variables: {
748
+ kpiId: kpi.id
749
+ }
750
+ });
751
+ if (!response.errors) {
752
+ notify({ message: 'KPI 실적값이 성공적으로 계산되었습니다.' });
753
+ this.grist.fetch();
754
+ }
755
+ }
756
+ catch (error) {
757
+ notify({ message: 'KPI 실적값 계산 중 오류가 발생했습니다.' });
758
+ }
759
+ }
602
760
  };
603
761
  __decorate([
604
762
  property({ type: Object }),