@things-factory/dataset 8.0.0 → 8.0.3

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 (45) hide show
  1. package/client/activities/activity-data-review-edit.ts +150 -5
  2. package/client/activities/activity-data-review-view.ts +81 -0
  3. package/dist-client/activities/activity-data-review-edit.d.ts +5 -1
  4. package/dist-client/activities/activity-data-review-edit.js +152 -5
  5. package/dist-client/activities/activity-data-review-edit.js.map +1 -1
  6. package/dist-client/activities/activity-data-review-view.js +80 -0
  7. package/dist-client/activities/activity-data-review-view.js.map +1 -1
  8. package/dist-client/tsconfig.tsbuildinfo +1 -1
  9. package/dist-server/activities/activity-data-review.js +18 -5
  10. package/dist-server/activities/activity-data-review.js.map +1 -1
  11. package/dist-server/activities/activity-ooc-review.js +13 -52
  12. package/dist-server/activities/activity-ooc-review.js.map +1 -1
  13. package/dist-server/controllers/create-data-ooc.d.ts +4 -0
  14. package/dist-server/controllers/create-data-ooc.js +67 -0
  15. package/dist-server/controllers/create-data-ooc.js.map +1 -0
  16. package/dist-server/controllers/create-data-sample.js +4 -94
  17. package/dist-server/controllers/create-data-sample.js.map +1 -1
  18. package/dist-server/controllers/index.d.ts +3 -0
  19. package/dist-server/controllers/index.js +3 -0
  20. package/dist-server/controllers/index.js.map +1 -1
  21. package/dist-server/controllers/issue-ooc-resolve.d.ts +3 -0
  22. package/dist-server/controllers/issue-ooc-resolve.js +49 -0
  23. package/dist-server/controllers/issue-ooc-resolve.js.map +1 -0
  24. package/dist-server/controllers/issue-ooc-review.d.ts +3 -0
  25. package/dist-server/controllers/issue-ooc-review.js +47 -0
  26. package/dist-server/controllers/issue-ooc-review.js.map +1 -0
  27. package/dist-server/service/data-archive/index.d.ts +1 -1
  28. package/dist-server/service/data-ooc/index.d.ts +1 -1
  29. package/dist-server/service/data-sample/index.d.ts +1 -1
  30. package/dist-server/service/data-set/index.d.ts +1 -1
  31. package/dist-server/service/index.d.ts +2 -2
  32. package/dist-server/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +13 -13
  34. package/server/activities/activity-data-review.ts +32 -5
  35. package/server/activities/activity-ooc-review.ts +20 -69
  36. package/server/controllers/create-data-ooc.ts +80 -0
  37. package/server/controllers/create-data-sample.ts +4 -107
  38. package/server/controllers/index.ts +3 -0
  39. package/server/controllers/issue-ooc-resolve.ts +58 -0
  40. package/server/controllers/issue-ooc-review.ts +52 -0
  41. package/translations/en.json +3 -0
  42. package/translations/ja.json +3 -0
  43. package/translations/ko.json +3 -0
  44. package/translations/ms.json +3 -0
  45. package/translations/zh.json +3 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/dataset",
3
- "version": "8.0.0",
3
+ "version": "8.0.3",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -40,21 +40,21 @@
40
40
  "@operato/shell": "^8.0.0",
41
41
  "@operato/styles": "^8.0.0",
42
42
  "@operato/utils": "^8.0.0",
43
- "@things-factory/auth-base": "^8.0.0",
44
- "@things-factory/aws-base": "^8.0.0",
45
- "@things-factory/board-service": "^8.0.0",
46
- "@things-factory/env": "^8.0.0",
47
- "@things-factory/integration-base": "^8.0.0",
48
- "@things-factory/organization": "^8.0.0",
49
- "@things-factory/personalization": "^8.0.0",
50
- "@things-factory/scheduler-client": "^8.0.0",
51
- "@things-factory/shell": "^8.0.0",
52
- "@things-factory/work-shift": "^8.0.0",
53
- "@things-factory/worklist": "^8.0.0",
43
+ "@things-factory/auth-base": "^8.0.2",
44
+ "@things-factory/aws-base": "^8.0.2",
45
+ "@things-factory/board-service": "^8.0.3",
46
+ "@things-factory/env": "^8.0.2",
47
+ "@things-factory/integration-base": "^8.0.3",
48
+ "@things-factory/organization": "^8.0.2",
49
+ "@things-factory/personalization": "^8.0.2",
50
+ "@things-factory/scheduler-client": "^8.0.2",
51
+ "@things-factory/shell": "^8.0.2",
52
+ "@things-factory/work-shift": "^8.0.2",
53
+ "@things-factory/worklist": "^8.0.3",
54
54
  "cron-parser": "^4.3.0",
55
55
  "moment-timezone": "^0.5.45",
56
56
  "simple-statistics": "^7.8.3",
57
57
  "statistics": "^3.3.0"
58
58
  },
59
- "gitHead": "07ef27d272dd9a067a9648ac7013748510556a18"
59
+ "gitHead": "a040c124aa33e9bb8a691e00e0afbded1f378b62"
60
60
  }
@@ -1,26 +1,53 @@
1
1
  import { ActivityInstance, ActivityInstanceStatus, UpdateActivityInstanceStateAddendum } from '@things-factory/worklist'
2
2
 
3
- import { DataOocStatus } from '../service/data-ooc/data-ooc'
3
+ import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
4
4
  import { DataSample } from '../service/data-sample/data-sample'
5
+ import { createDataOoc } from '../controllers/create-data-ooc'
6
+ import { issueOocResolve } from '../controllers/issue-ooc-resolve'
5
7
 
6
8
  async function callback(
7
9
  activityInstance: ActivityInstance,
8
10
  addendum: UpdateActivityInstanceStateAddendum,
9
11
  context: ResolverContext
10
12
  ) {
11
- const { domain, tx, user } = context.state
13
+ const { domain, tx } = context.state
12
14
  const { input, output, state } = activityInstance
13
15
 
14
16
  if (state == ActivityInstanceStatus.Ended) {
15
- var dataSample = await tx.getRepository(DataSample).findOne({
16
- where: { domain: { id: domain.id }, id: input?.dataSample?.id }
17
+ const { dataSampleId } = input || {}
18
+
19
+ if (!dataSampleId) {
20
+ throw new Error('Data sample ID is missing in the input.')
21
+ }
22
+
23
+ const dataSample = await tx.getRepository(DataSample).findOne({
24
+ where: { domain: { id: domain.id }, id: dataSampleId },
25
+ relations: ['domain', 'dataSet', 'creator', 'updater']
17
26
  })
18
27
 
19
- dataSample = await tx.getRepository(DataSample).save({
28
+ await tx.getRepository(DataSample).save({
20
29
  ...dataSample,
21
30
  output,
22
31
  state: DataOocStatus.REVIEWED
23
32
  })
33
+
34
+ const { judgment, instruction } = output
35
+
36
+ if (judgment == 'abnormal') {
37
+ /* Review 결과가 Ooc 조치가 필요하다고 하면, DataOoc를 생성하고, DataOocResolve를 이슈한다. */
38
+ var ooc = await createDataOoc(dataSample, dataSample.dataSet, context)
39
+
40
+ ooc = await tx.getRepository(DataOoc).save({
41
+ ...ooc,
42
+ reviewedAt: activityInstance.terminatedAt,
43
+ reviewer: activityInstance.updater,
44
+ correctiveInstruction: instruction,
45
+ reviewActivityInstance: activityInstance,
46
+ state: DataOocStatus.REVIEWED
47
+ })
48
+
49
+ await issueOocResolve(ooc, dataSample.dataSet, instruction, context)
50
+ }
24
51
  }
25
52
  }
26
53
 
@@ -1,14 +1,7 @@
1
- import { In } from 'typeorm'
2
- import {
3
- Activity,
4
- ActivityInstance,
5
- ActivityInstanceStatus,
6
- UpdateActivityInstanceStateAddendum
7
- } from '@things-factory/worklist'
8
- import { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'
9
- import { Role } from '@things-factory/auth-base'
1
+ import { ActivityInstance, ActivityInstanceStatus, UpdateActivityInstanceStateAddendum } from '@things-factory/worklist'
10
2
 
11
3
  import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
4
+ import { issueOocResolve } from '../controllers/issue-ooc-resolve'
12
5
 
13
6
  async function callback(
14
7
  activityInstance: ActivityInstance,
@@ -20,69 +13,27 @@ async function callback(
20
13
  const { causedBy } = addendum || {}
21
14
 
22
15
  if (state == ActivityInstanceStatus.Ended) {
23
- const activity = (await tx.getRepository(Activity).findOneBy({
24
- domain: domain.parentId ? In([domain.id, domain.parentId]) : { id: domain.id },
25
- name: 'OOC Resolve'
26
- })) as Activity
16
+ const { dataOocId } = input
17
+ const correctiveInstruction = output?.instruction
27
18
 
28
- if (activity) {
29
- const { dataOocId } = input
30
- const correctiveInstruction = output?.instruction
19
+ var dataOoc = await tx.getRepository(DataOoc).findOne({
20
+ where: {
21
+ domain: { id: domain.id },
22
+ id: dataOocId
23
+ },
24
+ relations: ['dataSet']
25
+ })
31
26
 
32
- var dataOoc = await tx.getRepository(DataOoc).findOne({
33
- where: {
34
- domain: { id: domain.id },
35
- id: dataOocId
36
- },
37
- relations: ['dataSet']
38
- })
27
+ /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */
28
+ dataOoc = await tx.getRepository(DataOoc).save({
29
+ ...dataOoc,
30
+ reviewedAt: terminatedAt,
31
+ reviewer: user,
32
+ correctiveInstruction,
33
+ state: DataOocStatus.REVIEWED
34
+ })
39
35
 
40
- const dataSet = dataOoc.dataSet
41
- const { resolverRoleId, outlierApprovalLine } = dataSet
42
-
43
- /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */
44
- dataOoc = await tx.getRepository(DataOoc).save({
45
- ...dataOoc,
46
- reviewedAt: terminatedAt,
47
- reviewer: user,
48
- correctiveInstruction,
49
- state: DataOocStatus.REVIEWED
50
- })
51
-
52
- const assigneeRole =
53
- resolverRoleId &&
54
- (await tx.getRepository(Role).findOneBy({
55
- domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },
56
- id: resolverRoleId
57
- }))
58
-
59
- /* 해당 dataset의 작업 담당자(resolverRole)에게 OOC 해결을 위한 태스크를 지시한다. */
60
- if (assigneeRole) {
61
- const activityInstance = {
62
- name: `[OOC 조치] ${dataSet.name}`,
63
- description: dataSet.description,
64
- activityId: activity.id,
65
- dueAt: new Date(terminatedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),
66
- input: {
67
- dataOocId,
68
- instruction: correctiveInstruction
69
- },
70
- assigneeRole,
71
- threadsMin: 1,
72
- threadsMax: 1,
73
- approvalLine: outlierApprovalLine
74
- }
75
-
76
- dataOoc.resolveActivityInstance = await issue(activityInstance, context)
77
- await tx.getRepository(DataOoc).save(dataOoc)
78
- } else {
79
- console.error(
80
- `Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`
81
- )
82
- }
83
- } else {
84
- console.error('OOC Resolve Activity not installed.')
85
- }
36
+ await issueOocResolve(dataOoc, dataOoc.dataSet, correctiveInstruction, context)
86
37
  }
87
38
  }
88
39
 
@@ -0,0 +1,80 @@
1
+ import { In } from 'typeorm'
2
+
3
+ import { Scenario } from '@things-factory/integration-base'
4
+
5
+ import { DataSet } from '../service/data-set/data-set'
6
+ import { DataSample } from '../service/data-sample/data-sample'
7
+ import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
8
+
9
+ export async function createDataOoc(
10
+ dataSample: DataSample,
11
+ dataSet: DataSet,
12
+ context: ResolverContext
13
+ ): Promise<DataOoc> {
14
+ const { domain, user, tx } = context.state
15
+ const { collectedAt, data, ooc, oos, judgment, workDate, workShift } = dataSample
16
+
17
+ const dataOoc = await tx.getRepository(DataOoc).save({
18
+ ...dataSample,
19
+ history: [
20
+ {
21
+ user: {
22
+ id: user?.id,
23
+ // @ts-ignore
24
+ username: user?.username || user?.email,
25
+ name: user?.name
26
+ },
27
+ state: DataOocStatus.ISSUED,
28
+ timestamp: collectedAt
29
+ }
30
+ ],
31
+ state: DataOocStatus.ISSUED,
32
+ dataSample: dataSample
33
+ })
34
+
35
+ if (dataSet.outlierScenarioId) {
36
+ const scenario = await tx.getRepository(Scenario).findOne({
37
+ where: {
38
+ domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },
39
+ id: dataSet.outlierScenarioId
40
+ },
41
+ relations: ['domain', 'steps', 'updater']
42
+ })
43
+
44
+ if (scenario) {
45
+ scenario.start({
46
+ instanceName: scenario.name + ':' + dataSet.name + ':' + dataSample.id,
47
+ domain,
48
+ user,
49
+ variables: {
50
+ dataOocId: dataOoc.id,
51
+ dataSampleId: dataSample.id,
52
+ dataSet: dataSet.id,
53
+ data,
54
+ ooc,
55
+ oos,
56
+ judgment,
57
+ collectedAt,
58
+ workDate,
59
+ workShift,
60
+ domain: {
61
+ id: domain.id,
62
+ subdomain: domain.subdomain,
63
+ name: domain.name
64
+ },
65
+ updator: {
66
+ id: user.id,
67
+ // @ts-ignore
68
+ username: user.username || user.email,
69
+ email: user.email,
70
+ name: user.name
71
+ }
72
+ }
73
+ })
74
+ } else {
75
+ console.error(`Cannot find the set outlier-scenario for the dataset(${dataSet.name}).`)
76
+ }
77
+ }
78
+
79
+ return dataOoc
80
+ }
@@ -10,10 +10,11 @@ import { Scenario, publishData } from '@things-factory/integration-base'
10
10
  import { Activity } from '@things-factory/worklist'
11
11
  import { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'
12
12
 
13
- import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
14
13
  import { DataSample } from '../service/data-sample/data-sample'
15
14
  import { NewDataSample } from '../service/data-sample/data-sample-type'
16
15
  import { DataSet } from '../service/data-set/data-set'
16
+ import { createDataOoc } from './create-data-ooc'
17
+ import { issueOocReview } from './issue-ooc-review'
17
18
  import { DataUseCase } from './data-use-case'
18
19
 
19
20
  // See README.md at ## Data Samples
@@ -196,114 +197,10 @@ export async function createDataSample(newDataSample: NewDataSample, context: Re
196
197
  }
197
198
 
198
199
  if (ooc || oos) {
199
- const dataOoc = await tx.getRepository(DataOoc).save({
200
- ...dataSample,
201
- history: [
202
- {
203
- user: {
204
- id: user?.id,
205
- name: user?.name
206
- },
207
- state: DataOocStatus.ISSUED,
208
- timestamp: collectedAt
209
- }
210
- ],
211
- state: DataOocStatus.ISSUED,
212
- dataSample: dataSample
213
- })
214
-
215
- if (outlierScenarioId) {
216
- const scenario = await tx.getRepository(Scenario).findOne({
217
- where: {
218
- domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },
219
- id: outlierScenarioId
220
- },
221
- relations: ['domain', 'steps', 'updater']
222
- })
223
-
224
- if (scenario) {
225
- scenario.start({
226
- instanceName: scenario.name + ':' + dataSet.name + ':' + dataSample.id,
227
- domain,
228
- user,
229
- variables: {
230
- dataOocId: dataOoc.id,
231
- dataSampleId: dataSample.id,
232
- dataSet: dataSet.id,
233
- data,
234
- ooc,
235
- oos,
236
- judgment,
237
- collectedAt,
238
- workDate,
239
- workShift,
240
- domain: {
241
- id: domain.id,
242
- subdomain: domain.subdomain,
243
- name: domain.name
244
- },
245
- updator: {
246
- id: user.id,
247
- email: user.email,
248
- name: user.name
249
- }
250
- }
251
- })
252
- } else {
253
- console.error(`Cannot find the set outlier-scenario for the dataset(${dataSet.name}).`)
254
- }
255
- }
256
-
257
- const activity = (await tx.getRepository(Activity).findOneBy({
258
- domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },
259
- name: 'OOC Review'
260
- })) as Activity
261
-
262
- if (activity) {
263
- const assigneeRole =
264
- dataSet.supervisoryRoleId &&
265
- (await tx.getRepository(Role).findOneBy({
266
- domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },
267
- id: dataSet.supervisoryRoleId
268
- }))
269
-
270
- // const assignees = dataSet.supervisoryRoleId
271
- // ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assigneeRole }]
272
- // : []
273
-
274
- /* 해당 dataset의 supervisor로 하여금, OOC를 리뷰하고 instruction을 작성해서, OOC 해결을 위한 태스크를 dataset assignees에게 지시하도록 한다. */
275
- if (assigneeRole) {
276
- const activityInstance = {
277
- name: `[OOC 검토] ${dataSet.name}`,
278
- description: dataSet.description,
279
- activityId: activity.id,
280
- dueAt: new Date(collectedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),
281
- input: {
282
- dataOocId: dataOoc.id
283
- },
284
- assigneeRole,
285
- threadsMin: 1,
286
- threadsMax: 1,
287
- approvalLine: []
288
- }
289
-
290
- dataOoc.reviewActivityInstance = await issue(activityInstance as any, context)
291
- await tx.getRepository(DataOoc).save(dataOoc)
292
- } else {
293
- console.error(
294
- `Assignees are not set. So Data OOC Review task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`
295
- )
296
- }
297
- } else {
298
- console.warn('OOC Review Activity not installed.')
299
- }
200
+ const dataOoc = await createDataOoc(dataSample, dataSet, context)
201
+ await issueOocReview(dataOoc, dataSet, context)
300
202
 
301
203
  try {
302
- // pubsub.publish('data-ooc', {
303
- // dataOoc,
304
- // supervisoryRoleId: dataSet.supervisoryRoleId
305
- // })
306
-
307
204
  pubsub.publish('notification', {
308
205
  notification: {
309
206
  domain,
@@ -1,3 +1,6 @@
1
1
  export * from './create-data-sample'
2
+ export * from './create-data-ooc'
3
+ export * from './issue-ooc-review'
4
+ export * from './issue-ooc-resolve'
2
5
  export * from './data-use-case'
3
6
  export * from './query-data-summary-by-period'
@@ -0,0 +1,58 @@
1
+ import { In } from 'typeorm'
2
+ import { Activity } from '@things-factory/worklist'
3
+ import { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'
4
+ import { Role } from '@things-factory/auth-base'
5
+
6
+ import { DataOoc } from '../service/data-ooc/data-ooc'
7
+ import { DataSet } from 'service'
8
+
9
+ export async function issueOocResolve(
10
+ dataOoc: DataOoc,
11
+ dataSet: DataSet,
12
+ correctiveInstruction: string,
13
+ context: ResolverContext
14
+ ): Promise<void> {
15
+ const { domain, user, tx } = context.state
16
+ const { resolverRoleId, outlierApprovalLine } = dataSet
17
+
18
+ const activity = (await tx.getRepository(Activity).findOneBy({
19
+ domain: domain.parentId ? In([domain.id, domain.parentId]) : { id: domain.id },
20
+ name: 'OOC Resolve'
21
+ })) as Activity
22
+
23
+ if (activity) {
24
+ const assigneeRole =
25
+ resolverRoleId &&
26
+ (await tx.getRepository(Role).findOneBy({
27
+ domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },
28
+ id: resolverRoleId
29
+ }))
30
+
31
+ /* 해당 dataset의 작업 담당자(resolverRole)에게 OOC 해결을 위한 태스크를 지시한다. */
32
+ if (assigneeRole) {
33
+ const activityInstance = {
34
+ name: `[OOC 조치] ${dataSet.name}`,
35
+ description: dataSet.description,
36
+ activityId: activity.id,
37
+ dueAt: new Date(Date.now() + (activity.standardTime || 24 * 60 * 60) * 1000),
38
+ input: {
39
+ dataOocId: dataOoc.id,
40
+ instruction: correctiveInstruction
41
+ },
42
+ assigneeRole,
43
+ threadsMin: 1,
44
+ threadsMax: 1,
45
+ approvalLine: outlierApprovalLine
46
+ }
47
+
48
+ dataOoc.resolveActivityInstance = await issue(activityInstance, context)
49
+ await tx.getRepository(DataOoc).save(dataOoc)
50
+ } else {
51
+ console.error(
52
+ `Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`
53
+ )
54
+ }
55
+ } else {
56
+ console.error('OOC Resolve Activity not installed.')
57
+ }
58
+ }
@@ -0,0 +1,52 @@
1
+ import { In } from 'typeorm'
2
+
3
+ import { Role } from '@things-factory/auth-base'
4
+ import { Activity } from '@things-factory/worklist'
5
+ import { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'
6
+
7
+ import { DataSet } from '../service/data-set/data-set'
8
+ import { DataOoc } from '../service/data-ooc/data-ooc'
9
+
10
+ export async function issueOocReview(dataOoc: DataOoc, dataSet: DataSet, context: ResolverContext): Promise<void> {
11
+ const { domain, tx } = context.state
12
+ const { collectedAt } = dataOoc
13
+
14
+ const activity = (await tx.getRepository(Activity).findOneBy({
15
+ domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },
16
+ name: 'OOC Review'
17
+ })) as Activity
18
+
19
+ if (activity) {
20
+ const assigneeRole =
21
+ dataSet.supervisoryRoleId &&
22
+ (await tx.getRepository(Role).findOneBy({
23
+ domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },
24
+ id: dataSet.supervisoryRoleId
25
+ }))
26
+
27
+ if (assigneeRole) {
28
+ const activityInstance = {
29
+ name: `[OOC 검토] ${dataSet.name}`,
30
+ description: dataSet.description,
31
+ activityId: activity.id,
32
+ dueAt: new Date(collectedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),
33
+ input: {
34
+ dataOocId: dataOoc.id
35
+ },
36
+ assigneeRole,
37
+ threadsMin: 1,
38
+ threadsMax: 1,
39
+ approvalLine: []
40
+ }
41
+
42
+ dataOoc.reviewActivityInstance = await issue(activityInstance as any, context)
43
+ await tx.getRepository(DataOoc).save(dataOoc)
44
+ } else {
45
+ console.error(
46
+ `Assignees are not set. So Data OOC Review task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`
47
+ )
48
+ }
49
+ } else {
50
+ console.warn('OOC Review Activity not installed.')
51
+ }
52
+ }
@@ -99,6 +99,9 @@
99
99
  "label.datasample review timeline": "data sample review timeline",
100
100
  "label.end-date": "end date",
101
101
  "label.group-by data-keys": "group by each data-keys",
102
+ "label.judgment": "judgment",
103
+ "label.judgment-abnormal": "action needed",
104
+ "label.judgment-normal": "normal",
102
105
  "label.maximum value": "maximum value",
103
106
  "label.minimum value": "minimum value",
104
107
  "label.ooc resolve timeline": "OOC resolve timeline",
@@ -99,6 +99,9 @@
99
99
  "label.datasample review timeline": "データサンプルレビュータイムライン",
100
100
  "label.end-date": "終了日",
101
101
  "label.group-by data-keys": "各データキーごとにグループ化",
102
+ "label.judgment": "判定",
103
+ "label.judgment-abnormal": "措置必要",
104
+ "label.judgment-normal": "正常",
102
105
  "label.maximum value": "最大値",
103
106
  "label.minimum value": "最小値",
104
107
  "label.ooc resolve timeline": "OOC 解決タイムライン",
@@ -99,6 +99,9 @@
99
99
  "label.datasample review timeline": "데이타샘플 리뷰 타임라인",
100
100
  "label.end-date": "종료일",
101
101
  "label.group-by data-keys": "각 데이터 키별로 그룹화",
102
+ "label.judgment": "판정",
103
+ "label.judgment-abnormal": "조치필요",
104
+ "label.judgment-normal": "정상",
102
105
  "label.maximum value": "최대값",
103
106
  "label.minimum value": "최소값",
104
107
  "label.ooc resolve timeline": "OOC 조치 타임라인",
@@ -99,6 +99,9 @@
99
99
  "label.datasample review timeline": "garis masa ulasan sampel data",
100
100
  "label.end-date": "tarikh tamat",
101
101
  "label.group-by data-keys": "kumpulkan mengikut setiap data-keys",
102
+ "label.judgment": "penilaian",
103
+ "label.judgment-abnormal": "memerlukan tindakan",
104
+ "label.judgment-normal": "normal",
102
105
  "label.maximum value": "nilai maksimum",
103
106
  "label.minimum value": "nilai minimum",
104
107
  "label.ooc resolve timeline": "garis masa penyelesaian OOC",
@@ -99,6 +99,9 @@
99
99
  "label.datasample review timeline": "数据样本审查时间线",
100
100
  "label.end-date": "结束日期",
101
101
  "label.group-by data-keys": "按每个数据键分组",
102
+ "label.judgment": "判定",
103
+ "label.judgment-abnormal": "需要措施",
104
+ "label.judgment-normal": "正常",
102
105
  "label.maximum value": "最大值",
103
106
  "label.minimum value": "最小值",
104
107
  "label.ooc resolve timeline": "OOC 解决时间线",