@neutron.co.id/pendidikan-operation 1.3.0 → 1.4.0-beta.1

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/build/index.cjs CHANGED
@@ -3,6 +3,7 @@
3
3
  const core = require('@neon.id/core');
4
4
  const operation = require('@neon.id/operation');
5
5
  const query = require('@neon.id/query');
6
+ const value = require('@neon.id/utils/value');
6
7
  const nanoid = require('nanoid');
7
8
 
8
9
  const setSomething = operation.Action.define({
@@ -136,34 +137,6 @@ const syncCommitment = operation.Action.define({
136
137
  }
137
138
  });
138
139
 
139
- const calculateManyComparator = operation.Action.define({
140
- key: "calculateManyComparator",
141
- name: "Create Penilaian dan Score",
142
- type: "command",
143
- category: "domain",
144
- execute: async ({ gradingComparatorId }, stream) => {
145
- console.log("id", gradingComparatorId);
146
- console.time("\u23F1\uFE0F syncGradingComparator");
147
- const result = await stream.actions.data.syncMany.execute(
148
- {
149
- model: "neu:penilaian:gradingComparator",
150
- useDry: false,
151
- query: query.Query.define({
152
- limit: 1e5
153
- })
154
- },
155
- stream
156
- );
157
- console.log(result);
158
- console.timeEnd("\u23F1\uFE0F syncGradingComparator");
159
- return core.Result.ok({
160
- state: "ComparatorCalculated",
161
- message: "Camparator have been calculated.",
162
- data: {}
163
- });
164
- }
165
- });
166
-
167
140
  const generateGrading = operation.Action.define({
168
141
  key: "generateGrading",
169
142
  name: "Create Penilaian dan Score",
@@ -366,6 +339,240 @@ async function _destroyMany(stream, input) {
366
339
  console.timeEnd("\u23F1\uFE0F destroyManyGradingComparisonItem");
367
340
  }
368
341
 
342
+ class NumberUtil {
343
+ static transformDecimal(value) {
344
+ if (!value)
345
+ return 0;
346
+ const string = value.toString();
347
+ const float = parseFloat(string);
348
+ return float || 0;
349
+ }
350
+ static twoDecimal(value) {
351
+ return Math.round(value * 100) / 100;
352
+ }
353
+ }
354
+
355
+ const calculateManyComparator = operation.Action.define({
356
+ key: "calculateManyComparator",
357
+ name: "Create Penilaian dan Score",
358
+ type: "command",
359
+ category: "domain",
360
+ execute: async (_, stream) => {
361
+ console.time("\u23F1\uFE0F getManyComparators");
362
+ const comparators = await _getManyComparators(stream);
363
+ console.timeEnd("\u23F1\uFE0F getManyComparators");
364
+ console.time("\u23F1\uFE0F updateManyComparators");
365
+ await _updateManyComparators(stream, comparators);
366
+ console.timeEnd("\u23F1\uFE0F updateManyComparators");
367
+ console.time("\u23F1\uFE0F syncGradingComparator");
368
+ const result = await stream.actions.data.syncMany.execute(
369
+ {
370
+ model: "neu:penilaian:gradingComparator",
371
+ useDry: false,
372
+ query: query.Query.define({
373
+ limit: 1e5
374
+ })
375
+ },
376
+ stream
377
+ );
378
+ console.log(result);
379
+ console.timeEnd("\u23F1\uFE0F syncGradingComparator");
380
+ return core.Result.ok({
381
+ state: "ComparatorCalculated",
382
+ message: "Camparator have been calculated.",
383
+ data: {}
384
+ });
385
+ }
386
+ });
387
+ async function _getManyComparators(stream) {
388
+ const result = await stream.actions.data.getMany.execute(
389
+ {
390
+ model: "neu:penilaian:gradingComparator",
391
+ query: query.Query.define({
392
+ fields: {
393
+ id: 1,
394
+ overrideComparison: 1,
395
+ derivativeComparison: 1,
396
+ acceptedGradingRasionalizations: {
397
+ student: {
398
+ name: 1
399
+ },
400
+ acceptedValidation: 1,
401
+ scores: 1
402
+ }
403
+ },
404
+ limit: 1e4
405
+ })
406
+ },
407
+ stream
408
+ );
409
+ if (result.isFailure)
410
+ throw result;
411
+ return result.value;
412
+ }
413
+ async function _updateManyComparators(stream, comparators) {
414
+ const operations = [];
415
+ comparators.map((comparator) => {
416
+ const comparison = _calculateComparison(comparator);
417
+ operations.push({
418
+ updateOne: {
419
+ filter: {
420
+ _id: comparator.id
421
+ },
422
+ update: {
423
+ $set: {
424
+ comparison
425
+ }
426
+ }
427
+ }
428
+ });
429
+ });
430
+ console.dir({ operations }, { depth: 5 });
431
+ await stream.core.dbs["neu-penilaian"].models["neu:penilaian:gradingComparator"].bulkWrite(operations);
432
+ }
433
+ function _calculateComparison(o) {
434
+ console.dir(o, { depth: 10 });
435
+ if (o.overrideComparison && !value.ValueUtil.isEmpty(o.overrideComparison)) {
436
+ return o.overrideComparison;
437
+ }
438
+ if (!o.acceptedGradingRasionalizations?.length) {
439
+ if (o.derivativeComparison && !value.ValueUtil.isEmpty(o.derivativeComparison)) {
440
+ return o.derivativeComparison;
441
+ }
442
+ return {};
443
+ }
444
+ const comparison = o.acceptedGradingRasionalizations.filter((item) => item.acceptedValidation == "verified").reduce((final, comparison2) => {
445
+ if (!comparison2.scores)
446
+ return final;
447
+ const scores = Object.entries(comparison2.scores);
448
+ for (const [gradingComponentId, score] of scores) {
449
+ let value = NumberUtil.transformDecimal(score);
450
+ value = NumberUtil.twoDecimal(value);
451
+ if (!final[gradingComponentId]) {
452
+ final[gradingComponentId] = {
453
+ total: 0,
454
+ count: 0,
455
+ average: 0,
456
+ max: 0,
457
+ min: 1e4
458
+ };
459
+ }
460
+ final[gradingComponentId].total += value;
461
+ final[gradingComponentId].count += 1;
462
+ final[gradingComponentId].max = Math.max(
463
+ final[gradingComponentId].max,
464
+ value
465
+ );
466
+ final[gradingComponentId].min = Math.min(
467
+ final[gradingComponentId].min,
468
+ value
469
+ );
470
+ }
471
+ for (const gradingComponentId of Object.keys(final)) {
472
+ const average = final[gradingComponentId].total / final[gradingComponentId].count;
473
+ final[gradingComponentId].average = NumberUtil.twoDecimal(average);
474
+ }
475
+ return final;
476
+ }, {});
477
+ return comparison;
478
+ }
479
+
480
+ const calculateOneComparator = operation.Action.define({
481
+ key: "calculateOneComparator",
482
+ name: "Calculate One Comparator",
483
+ type: "command",
484
+ category: "domain",
485
+ execute: async ({ gradingComparatorId }, stream) => {
486
+ console.time("\u23F1\uFE0F getOneComparator");
487
+ const gradingComparator = await _getOneComparator(
488
+ stream,
489
+ gradingComparatorId
490
+ );
491
+ console.timeEnd("\u23F1\uFE0F getOneComparator");
492
+ console.time("\u23F1\uFE0F updateOneComparator");
493
+ await _updateOneComparator(stream, gradingComparator);
494
+ console.timeEnd("\u23F1\uFE0F updateOneComparator");
495
+ return core.Result.ok({
496
+ state: "comparatorCalculated",
497
+ message: "Comparator have been calculated.",
498
+ data: {}
499
+ });
500
+ }
501
+ });
502
+ async function _getOneComparator(stream, gradingComparatorId) {
503
+ const result = await stream.actions.data.getOne.execute(
504
+ {
505
+ model: "neu:penilaian:gradingComparator",
506
+ id: gradingComparatorId,
507
+ query: query.Query.define({
508
+ fields: {
509
+ id: 1,
510
+ overrideComparison: 1,
511
+ derivativeComparison: 1,
512
+ acceptedGradingRasionalizations: {
513
+ student: {
514
+ name: 1
515
+ },
516
+ acceptedValidation: 1,
517
+ scores: 1
518
+ }
519
+ }
520
+ })
521
+ },
522
+ stream
523
+ );
524
+ if (result.isFailure)
525
+ throw result;
526
+ return result.value;
527
+ }
528
+ async function _updateOneComparator(stream, comparator) {
529
+ const comparison = _calculateComparison(comparator);
530
+ console.dir({ comparison }, { depth: 10 });
531
+ const result = await stream.actions.data.updateOne.execute(
532
+ {
533
+ model: "neu:penilaian:gradingComparator",
534
+ id: comparator.id,
535
+ data: {
536
+ comparison
537
+ },
538
+ query: query.Query.define({})
539
+ },
540
+ stream
541
+ );
542
+ if (result.isFailure)
543
+ throw result;
544
+ return result.value;
545
+ }
546
+
547
+ const clearAllOverrides = operation.Action.define({
548
+ key: "clearAllOverrides",
549
+ name: "Clear All Overrides",
550
+ type: "command",
551
+ category: "domain",
552
+ execute: async (_, stream) => {
553
+ console.time("\u23F1\uFE0F clearAllOverrides");
554
+ await _clearAllOverrides(stream);
555
+ console.timeEnd("\u23F1\uFE0F clearAllOverrides");
556
+ return core.Result.ok({
557
+ state: "overridesCleared",
558
+ message: "Overrides have been cleared.",
559
+ data: {}
560
+ });
561
+ }
562
+ });
563
+ async function _clearAllOverrides(stream) {
564
+ await stream.actions.data.updateMany.execute(
565
+ {
566
+ model: "neu:penilaian:gradingComparator",
567
+ data: { overrideComparison: {} },
568
+ query: query.Query.define({
569
+ limit: 1e4
570
+ })
571
+ },
572
+ stream
573
+ );
574
+ }
575
+
369
576
  const clearGrading = operation.Action.define({
370
577
  key: "clearGrading",
371
578
  name: "Clear Grading",
@@ -827,9 +1034,12 @@ const sendAnswer = operation.Action.define({
827
1034
 
828
1035
  const index = {
829
1036
  __proto__: null,
1037
+ _calculateComparison: _calculateComparison,
830
1038
  acceptQuestion: acceptQuestion,
831
1039
  calculateGrading: calculateGrading,
832
1040
  calculateManyComparator: calculateManyComparator,
1041
+ calculateOneComparator: calculateOneComparator,
1042
+ clearAllOverrides: clearAllOverrides,
833
1043
  clearGrading: clearGrading,
834
1044
  createGradingAndScores: createGradingAndScores,
835
1045
  editAnswer: editAnswer,
@@ -843,10 +1053,13 @@ const index = {
843
1053
  updateGradingAndScores: updateGradingAndScores
844
1054
  };
845
1055
 
1056
+ exports._calculateComparison = _calculateComparison;
846
1057
  exports.acceptQuestion = acceptQuestion;
847
1058
  exports.actions = index;
848
1059
  exports.calculateGrading = calculateGrading;
849
1060
  exports.calculateManyComparator = calculateManyComparator;
1061
+ exports.calculateOneComparator = calculateOneComparator;
1062
+ exports.clearAllOverrides = clearAllOverrides;
850
1063
  exports.clearGrading = clearGrading;
851
1064
  exports.createGradingAndScores = createGradingAndScores;
852
1065
  exports.editAnswer = editAnswer;
package/build/index.d.ts CHANGED
@@ -43,14 +43,27 @@ interface SyncCommitmentMeta {
43
43
  declare const syncCommitment: Action<"syncCommitment", SyncCommitmentInput, SyncCommitmentOutput, SyncCommitmentMeta>;
44
44
  type SyncCommitmentAction = typeof syncCommitment;
45
45
 
46
+ interface CalculateGradingInput {
47
+ gradingInsertId: string;
48
+ gradingContextIds: string[];
49
+ sourceSchoolId: string;
50
+ gradingId: string;
51
+ }
52
+ interface CalculateGradingOutput {
53
+ }
54
+ interface CalculateGradingMeta {
55
+ }
56
+ declare const calculateGrading: Action<"calculateGrading", CalculateGradingInput, CalculateGradingOutput, CalculateGradingMeta>;
57
+ type CalculateGradingAction = typeof calculateGrading;
58
+
46
59
  interface CalculateManyComparatorInput {
47
- gradingComparatorId: string;
48
60
  }
49
61
  interface CalculateManyComparatorOutput {
50
62
  }
51
63
  interface CalculateManyComparatorMeta {
52
64
  }
53
65
  declare const calculateManyComparator: Action<"calculateManyComparator", CalculateManyComparatorInput, CalculateManyComparatorOutput, CalculateManyComparatorMeta>;
66
+ declare function _calculateComparison(o: GradingComparator): GradingComparatorComparison;
54
67
  interface GradingComparatorComparison {
55
68
  [key: string]: {
56
69
  total: number;
@@ -61,27 +74,34 @@ interface GradingComparatorComparison {
61
74
  };
62
75
  }
63
76
  interface GradingComparator {
64
- gradingRasionalizations?: {
77
+ id: string;
78
+ acceptedGradingRasionalizations?: {
65
79
  scores?: Record<string, number>;
80
+ acceptedValidation?: 'verified' | 'accept' | 'rejected';
66
81
  }[];
67
- comparison?: GradingComparatorComparison;
68
82
  derivativeComparison?: GradingComparatorComparison;
69
83
  overrideComparison?: GradingComparatorComparison;
70
84
  }
71
85
  type CalculateManyComparatorAction = typeof calculateManyComparator;
72
86
 
73
- interface CalculateGradingInput {
74
- gradingInsertId: string;
75
- gradingContextIds: string[];
76
- sourceSchoolId: string;
77
- gradingId: string;
87
+ interface CalculateOneComparatorInput {
88
+ gradingComparatorId: string;
78
89
  }
79
- interface CalculateGradingOutput {
90
+ interface CalculateOneComparatorOutput {
80
91
  }
81
- interface CalculateGradingMeta {
92
+ interface CalculateOneComparatorMeta {
82
93
  }
83
- declare const calculateGrading: Action<"calculateGrading", CalculateGradingInput, CalculateGradingOutput, CalculateGradingMeta>;
84
- type CalculateGradingAction = typeof calculateGrading;
94
+ declare const calculateOneComparator: Action<"calculateOneComparator", CalculateOneComparatorInput, CalculateOneComparatorOutput, CalculateOneComparatorMeta>;
95
+ type CalculateOneComparatorAction = typeof calculateOneComparator;
96
+
97
+ interface ClearAllOverridesInput {
98
+ }
99
+ interface ClearAllOverridesOutput {
100
+ }
101
+ interface ClearAllOverridesMeta {
102
+ }
103
+ declare const clearAllOverrides: Action<"clearAllOverrides", ClearAllOverridesInput, ClearAllOverridesOutput, ClearAllOverridesMeta>;
104
+ type ClearAllOverridesAction = typeof clearAllOverrides;
85
105
 
86
106
  interface ClearGradingInput {
87
107
  gradingInsertId: string;
@@ -184,6 +204,14 @@ type index_CalculateManyComparatorAction = CalculateManyComparatorAction;
184
204
  type index_CalculateManyComparatorInput = CalculateManyComparatorInput;
185
205
  type index_CalculateManyComparatorMeta = CalculateManyComparatorMeta;
186
206
  type index_CalculateManyComparatorOutput = CalculateManyComparatorOutput;
207
+ type index_CalculateOneComparatorAction = CalculateOneComparatorAction;
208
+ type index_CalculateOneComparatorInput = CalculateOneComparatorInput;
209
+ type index_CalculateOneComparatorMeta = CalculateOneComparatorMeta;
210
+ type index_CalculateOneComparatorOutput = CalculateOneComparatorOutput;
211
+ type index_ClearAllOverridesAction = ClearAllOverridesAction;
212
+ type index_ClearAllOverridesInput = ClearAllOverridesInput;
213
+ type index_ClearAllOverridesMeta = ClearAllOverridesMeta;
214
+ type index_ClearAllOverridesOutput = ClearAllOverridesOutput;
187
215
  type index_ClearGradingAction = ClearGradingAction;
188
216
  type index_ClearGradingInput = ClearGradingInput;
189
217
  type index_ClearGradingMeta = ClearGradingMeta;
@@ -230,9 +258,12 @@ type index_UpdateGradingAndScoresAction = UpdateGradingAndScoresAction;
230
258
  type index_UpdateGradingAndScoresInput = UpdateGradingAndScoresInput;
231
259
  type index_UpdateGradingAndScoresMeta = UpdateGradingAndScoresMeta;
232
260
  type index_UpdateGradingAndScoresOutput = UpdateGradingAndScoresOutput;
261
+ declare const index__calculateComparison: typeof _calculateComparison;
233
262
  declare const index_acceptQuestion: typeof acceptQuestion;
234
263
  declare const index_calculateGrading: typeof calculateGrading;
235
264
  declare const index_calculateManyComparator: typeof calculateManyComparator;
265
+ declare const index_calculateOneComparator: typeof calculateOneComparator;
266
+ declare const index_clearAllOverrides: typeof clearAllOverrides;
236
267
  declare const index_clearGrading: typeof clearGrading;
237
268
  declare const index_createGradingAndScores: typeof createGradingAndScores;
238
269
  declare const index_editAnswer: typeof editAnswer;
@@ -258,6 +289,14 @@ declare namespace index {
258
289
  index_CalculateManyComparatorInput as CalculateManyComparatorInput,
259
290
  index_CalculateManyComparatorMeta as CalculateManyComparatorMeta,
260
291
  index_CalculateManyComparatorOutput as CalculateManyComparatorOutput,
292
+ index_CalculateOneComparatorAction as CalculateOneComparatorAction,
293
+ index_CalculateOneComparatorInput as CalculateOneComparatorInput,
294
+ index_CalculateOneComparatorMeta as CalculateOneComparatorMeta,
295
+ index_CalculateOneComparatorOutput as CalculateOneComparatorOutput,
296
+ index_ClearAllOverridesAction as ClearAllOverridesAction,
297
+ index_ClearAllOverridesInput as ClearAllOverridesInput,
298
+ index_ClearAllOverridesMeta as ClearAllOverridesMeta,
299
+ index_ClearAllOverridesOutput as ClearAllOverridesOutput,
261
300
  index_ClearGradingAction as ClearGradingAction,
262
301
  index_ClearGradingInput as ClearGradingInput,
263
302
  index_ClearGradingMeta as ClearGradingMeta,
@@ -304,9 +343,12 @@ declare namespace index {
304
343
  index_UpdateGradingAndScoresInput as UpdateGradingAndScoresInput,
305
344
  index_UpdateGradingAndScoresMeta as UpdateGradingAndScoresMeta,
306
345
  index_UpdateGradingAndScoresOutput as UpdateGradingAndScoresOutput,
346
+ index__calculateComparison as _calculateComparison,
307
347
  index_acceptQuestion as acceptQuestion,
308
348
  index_calculateGrading as calculateGrading,
309
349
  index_calculateManyComparator as calculateManyComparator,
350
+ index_calculateOneComparator as calculateOneComparator,
351
+ index_clearAllOverrides as clearAllOverrides,
310
352
  index_clearGrading as clearGrading,
311
353
  index_createGradingAndScores as createGradingAndScores,
312
354
  index_editAnswer as editAnswer,
@@ -321,4 +363,4 @@ declare namespace index {
321
363
  };
322
364
  }
323
365
 
324
- export { AcceptQuestionAction, AcceptQuestionInput, AcceptQuestionMeta, AcceptQuestionOutput, CalculateGradingAction, CalculateGradingInput, CalculateGradingMeta, CalculateGradingOutput, CalculateManyComparatorAction, CalculateManyComparatorInput, CalculateManyComparatorMeta, CalculateManyComparatorOutput, ClearGradingAction, ClearGradingInput, ClearGradingMeta, ClearGradingOutput, CreateGradingAndScoresAction, CreateGradingAndScoresInput, CreateGradingAndScoresMeta, CreateGradingAndScoresOutput, EditAnswerAction, EditAnswerInput, EditAnswerMeta, EditAnswerOutput, GenerateGradingAction, GenerateGradingInput, GenerateGradingMeta, GenerateGradingOutput, GradingComparator, GradingComparatorComparison, PresenceSessionStudentAction, PresenceSessionStudentInput, PresenceSessionStudentMeta, PresenceSessionStudentOutput, PresenceSessionTeacherAction, PresenceSessionTeacherInput, PresenceSessionTeacherMeta, PresenceSessionTeacherOutput, RasionalizeGradingAction, RasionalizeGradingInput, RasionalizeGradingMeta, RasionalizeGradingOutput, SendAnswerAction, SendAnswerInput, SendAnswerMeta, SendAnswerOutput, SetSomethingAction, SetSomethingInput, SetSomethingMeta, SetSomethingOutput, SyncCommitmentAction, SyncCommitmentInput, SyncCommitmentMeta, SyncCommitmentOutput, UpdateGradingAndScoresAction, UpdateGradingAndScoresInput, UpdateGradingAndScoresMeta, UpdateGradingAndScoresOutput, acceptQuestion, index as actions, calculateGrading, calculateManyComparator, clearGrading, createGradingAndScores, editAnswer, generateGrading, presenceSessionStudent, presenceSessionTeacher, rasionalizeGrading, sendAnswer, setSomething, syncCommitment, updateGradingAndScores };
366
+ export { AcceptQuestionAction, AcceptQuestionInput, AcceptQuestionMeta, AcceptQuestionOutput, CalculateGradingAction, CalculateGradingInput, CalculateGradingMeta, CalculateGradingOutput, CalculateManyComparatorAction, CalculateManyComparatorInput, CalculateManyComparatorMeta, CalculateManyComparatorOutput, CalculateOneComparatorAction, CalculateOneComparatorInput, CalculateOneComparatorMeta, CalculateOneComparatorOutput, ClearAllOverridesAction, ClearAllOverridesInput, ClearAllOverridesMeta, ClearAllOverridesOutput, ClearGradingAction, ClearGradingInput, ClearGradingMeta, ClearGradingOutput, CreateGradingAndScoresAction, CreateGradingAndScoresInput, CreateGradingAndScoresMeta, CreateGradingAndScoresOutput, EditAnswerAction, EditAnswerInput, EditAnswerMeta, EditAnswerOutput, GenerateGradingAction, GenerateGradingInput, GenerateGradingMeta, GenerateGradingOutput, GradingComparator, GradingComparatorComparison, PresenceSessionStudentAction, PresenceSessionStudentInput, PresenceSessionStudentMeta, PresenceSessionStudentOutput, PresenceSessionTeacherAction, PresenceSessionTeacherInput, PresenceSessionTeacherMeta, PresenceSessionTeacherOutput, RasionalizeGradingAction, RasionalizeGradingInput, RasionalizeGradingMeta, RasionalizeGradingOutput, SendAnswerAction, SendAnswerInput, SendAnswerMeta, SendAnswerOutput, SetSomethingAction, SetSomethingInput, SetSomethingMeta, SetSomethingOutput, SyncCommitmentAction, SyncCommitmentInput, SyncCommitmentMeta, SyncCommitmentOutput, UpdateGradingAndScoresAction, UpdateGradingAndScoresInput, UpdateGradingAndScoresMeta, UpdateGradingAndScoresOutput, _calculateComparison, acceptQuestion, index as actions, calculateGrading, calculateManyComparator, calculateOneComparator, clearAllOverrides, clearGrading, createGradingAndScores, editAnswer, generateGrading, presenceSessionStudent, presenceSessionTeacher, rasionalizeGrading, sendAnswer, setSomething, syncCommitment, updateGradingAndScores };
package/build/index.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Result } from '@neon.id/core';
2
2
  import { Action } from '@neon.id/operation';
3
3
  import { Query } from '@neon.id/query';
4
+ import { ValueUtil } from '@neon.id/utils/value';
4
5
  import { customAlphabet } from 'nanoid';
5
6
 
6
7
  const setSomething = Action.define({
@@ -134,34 +135,6 @@ const syncCommitment = Action.define({
134
135
  }
135
136
  });
136
137
 
137
- const calculateManyComparator = Action.define({
138
- key: "calculateManyComparator",
139
- name: "Create Penilaian dan Score",
140
- type: "command",
141
- category: "domain",
142
- execute: async ({ gradingComparatorId }, stream) => {
143
- console.log("id", gradingComparatorId);
144
- console.time("\u23F1\uFE0F syncGradingComparator");
145
- const result = await stream.actions.data.syncMany.execute(
146
- {
147
- model: "neu:penilaian:gradingComparator",
148
- useDry: false,
149
- query: Query.define({
150
- limit: 1e5
151
- })
152
- },
153
- stream
154
- );
155
- console.log(result);
156
- console.timeEnd("\u23F1\uFE0F syncGradingComparator");
157
- return Result.ok({
158
- state: "ComparatorCalculated",
159
- message: "Camparator have been calculated.",
160
- data: {}
161
- });
162
- }
163
- });
164
-
165
138
  const generateGrading = Action.define({
166
139
  key: "generateGrading",
167
140
  name: "Create Penilaian dan Score",
@@ -364,6 +337,240 @@ async function _destroyMany(stream, input) {
364
337
  console.timeEnd("\u23F1\uFE0F destroyManyGradingComparisonItem");
365
338
  }
366
339
 
340
+ class NumberUtil {
341
+ static transformDecimal(value) {
342
+ if (!value)
343
+ return 0;
344
+ const string = value.toString();
345
+ const float = parseFloat(string);
346
+ return float || 0;
347
+ }
348
+ static twoDecimal(value) {
349
+ return Math.round(value * 100) / 100;
350
+ }
351
+ }
352
+
353
+ const calculateManyComparator = Action.define({
354
+ key: "calculateManyComparator",
355
+ name: "Create Penilaian dan Score",
356
+ type: "command",
357
+ category: "domain",
358
+ execute: async (_, stream) => {
359
+ console.time("\u23F1\uFE0F getManyComparators");
360
+ const comparators = await _getManyComparators(stream);
361
+ console.timeEnd("\u23F1\uFE0F getManyComparators");
362
+ console.time("\u23F1\uFE0F updateManyComparators");
363
+ await _updateManyComparators(stream, comparators);
364
+ console.timeEnd("\u23F1\uFE0F updateManyComparators");
365
+ console.time("\u23F1\uFE0F syncGradingComparator");
366
+ const result = await stream.actions.data.syncMany.execute(
367
+ {
368
+ model: "neu:penilaian:gradingComparator",
369
+ useDry: false,
370
+ query: Query.define({
371
+ limit: 1e5
372
+ })
373
+ },
374
+ stream
375
+ );
376
+ console.log(result);
377
+ console.timeEnd("\u23F1\uFE0F syncGradingComparator");
378
+ return Result.ok({
379
+ state: "ComparatorCalculated",
380
+ message: "Camparator have been calculated.",
381
+ data: {}
382
+ });
383
+ }
384
+ });
385
+ async function _getManyComparators(stream) {
386
+ const result = await stream.actions.data.getMany.execute(
387
+ {
388
+ model: "neu:penilaian:gradingComparator",
389
+ query: Query.define({
390
+ fields: {
391
+ id: 1,
392
+ overrideComparison: 1,
393
+ derivativeComparison: 1,
394
+ acceptedGradingRasionalizations: {
395
+ student: {
396
+ name: 1
397
+ },
398
+ acceptedValidation: 1,
399
+ scores: 1
400
+ }
401
+ },
402
+ limit: 1e4
403
+ })
404
+ },
405
+ stream
406
+ );
407
+ if (result.isFailure)
408
+ throw result;
409
+ return result.value;
410
+ }
411
+ async function _updateManyComparators(stream, comparators) {
412
+ const operations = [];
413
+ comparators.map((comparator) => {
414
+ const comparison = _calculateComparison(comparator);
415
+ operations.push({
416
+ updateOne: {
417
+ filter: {
418
+ _id: comparator.id
419
+ },
420
+ update: {
421
+ $set: {
422
+ comparison
423
+ }
424
+ }
425
+ }
426
+ });
427
+ });
428
+ console.dir({ operations }, { depth: 5 });
429
+ await stream.core.dbs["neu-penilaian"].models["neu:penilaian:gradingComparator"].bulkWrite(operations);
430
+ }
431
+ function _calculateComparison(o) {
432
+ console.dir(o, { depth: 10 });
433
+ if (o.overrideComparison && !ValueUtil.isEmpty(o.overrideComparison)) {
434
+ return o.overrideComparison;
435
+ }
436
+ if (!o.acceptedGradingRasionalizations?.length) {
437
+ if (o.derivativeComparison && !ValueUtil.isEmpty(o.derivativeComparison)) {
438
+ return o.derivativeComparison;
439
+ }
440
+ return {};
441
+ }
442
+ const comparison = o.acceptedGradingRasionalizations.filter((item) => item.acceptedValidation == "verified").reduce((final, comparison2) => {
443
+ if (!comparison2.scores)
444
+ return final;
445
+ const scores = Object.entries(comparison2.scores);
446
+ for (const [gradingComponentId, score] of scores) {
447
+ let value = NumberUtil.transformDecimal(score);
448
+ value = NumberUtil.twoDecimal(value);
449
+ if (!final[gradingComponentId]) {
450
+ final[gradingComponentId] = {
451
+ total: 0,
452
+ count: 0,
453
+ average: 0,
454
+ max: 0,
455
+ min: 1e4
456
+ };
457
+ }
458
+ final[gradingComponentId].total += value;
459
+ final[gradingComponentId].count += 1;
460
+ final[gradingComponentId].max = Math.max(
461
+ final[gradingComponentId].max,
462
+ value
463
+ );
464
+ final[gradingComponentId].min = Math.min(
465
+ final[gradingComponentId].min,
466
+ value
467
+ );
468
+ }
469
+ for (const gradingComponentId of Object.keys(final)) {
470
+ const average = final[gradingComponentId].total / final[gradingComponentId].count;
471
+ final[gradingComponentId].average = NumberUtil.twoDecimal(average);
472
+ }
473
+ return final;
474
+ }, {});
475
+ return comparison;
476
+ }
477
+
478
+ const calculateOneComparator = Action.define({
479
+ key: "calculateOneComparator",
480
+ name: "Calculate One Comparator",
481
+ type: "command",
482
+ category: "domain",
483
+ execute: async ({ gradingComparatorId }, stream) => {
484
+ console.time("\u23F1\uFE0F getOneComparator");
485
+ const gradingComparator = await _getOneComparator(
486
+ stream,
487
+ gradingComparatorId
488
+ );
489
+ console.timeEnd("\u23F1\uFE0F getOneComparator");
490
+ console.time("\u23F1\uFE0F updateOneComparator");
491
+ await _updateOneComparator(stream, gradingComparator);
492
+ console.timeEnd("\u23F1\uFE0F updateOneComparator");
493
+ return Result.ok({
494
+ state: "comparatorCalculated",
495
+ message: "Comparator have been calculated.",
496
+ data: {}
497
+ });
498
+ }
499
+ });
500
+ async function _getOneComparator(stream, gradingComparatorId) {
501
+ const result = await stream.actions.data.getOne.execute(
502
+ {
503
+ model: "neu:penilaian:gradingComparator",
504
+ id: gradingComparatorId,
505
+ query: Query.define({
506
+ fields: {
507
+ id: 1,
508
+ overrideComparison: 1,
509
+ derivativeComparison: 1,
510
+ acceptedGradingRasionalizations: {
511
+ student: {
512
+ name: 1
513
+ },
514
+ acceptedValidation: 1,
515
+ scores: 1
516
+ }
517
+ }
518
+ })
519
+ },
520
+ stream
521
+ );
522
+ if (result.isFailure)
523
+ throw result;
524
+ return result.value;
525
+ }
526
+ async function _updateOneComparator(stream, comparator) {
527
+ const comparison = _calculateComparison(comparator);
528
+ console.dir({ comparison }, { depth: 10 });
529
+ const result = await stream.actions.data.updateOne.execute(
530
+ {
531
+ model: "neu:penilaian:gradingComparator",
532
+ id: comparator.id,
533
+ data: {
534
+ comparison
535
+ },
536
+ query: Query.define({})
537
+ },
538
+ stream
539
+ );
540
+ if (result.isFailure)
541
+ throw result;
542
+ return result.value;
543
+ }
544
+
545
+ const clearAllOverrides = Action.define({
546
+ key: "clearAllOverrides",
547
+ name: "Clear All Overrides",
548
+ type: "command",
549
+ category: "domain",
550
+ execute: async (_, stream) => {
551
+ console.time("\u23F1\uFE0F clearAllOverrides");
552
+ await _clearAllOverrides(stream);
553
+ console.timeEnd("\u23F1\uFE0F clearAllOverrides");
554
+ return Result.ok({
555
+ state: "overridesCleared",
556
+ message: "Overrides have been cleared.",
557
+ data: {}
558
+ });
559
+ }
560
+ });
561
+ async function _clearAllOverrides(stream) {
562
+ await stream.actions.data.updateMany.execute(
563
+ {
564
+ model: "neu:penilaian:gradingComparator",
565
+ data: { overrideComparison: {} },
566
+ query: Query.define({
567
+ limit: 1e4
568
+ })
569
+ },
570
+ stream
571
+ );
572
+ }
573
+
367
574
  const clearGrading = Action.define({
368
575
  key: "clearGrading",
369
576
  name: "Clear Grading",
@@ -825,9 +1032,12 @@ const sendAnswer = Action.define({
825
1032
 
826
1033
  const index = {
827
1034
  __proto__: null,
1035
+ _calculateComparison: _calculateComparison,
828
1036
  acceptQuestion: acceptQuestion,
829
1037
  calculateGrading: calculateGrading,
830
1038
  calculateManyComparator: calculateManyComparator,
1039
+ calculateOneComparator: calculateOneComparator,
1040
+ clearAllOverrides: clearAllOverrides,
831
1041
  clearGrading: clearGrading,
832
1042
  createGradingAndScores: createGradingAndScores,
833
1043
  editAnswer: editAnswer,
@@ -841,4 +1051,4 @@ const index = {
841
1051
  updateGradingAndScores: updateGradingAndScores
842
1052
  };
843
1053
 
844
- export { acceptQuestion, index as actions, calculateGrading, calculateManyComparator, clearGrading, createGradingAndScores, editAnswer, generateGrading, presenceSessionStudent, presenceSessionTeacher, rasionalizeGrading, sendAnswer, setSomething, syncCommitment, updateGradingAndScores };
1054
+ export { _calculateComparison, acceptQuestion, index as actions, calculateGrading, calculateManyComparator, calculateOneComparator, clearAllOverrides, clearGrading, createGradingAndScores, editAnswer, generateGrading, presenceSessionStudent, presenceSessionTeacher, rasionalizeGrading, sendAnswer, setSomething, syncCommitment, updateGradingAndScores };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neutron.co.id/pendidikan-operation",
3
- "version": "1.3.0",
3
+ "version": "1.4.0-beta.1",
4
4
  "description": "Operation package of Neutron Pendidikan.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "contributors": [
@@ -39,7 +39,7 @@
39
39
  "@neon.id/utils": "0.33.5",
40
40
  "@neutron.co.id/akademik-models": "1.2.0",
41
41
  "@neutron.co.id/jadwal-models": "1.2.0",
42
- "@neutron.co.id/penilaian-models": "1.3.0",
42
+ "@neutron.co.id/penilaian-models": "1.4.0-beta.1",
43
43
  "@neutron.co.id/tanya-models": "1.1.0",
44
44
  "mongoose": "6.9.1",
45
45
  "nanoid": "4.0.1",
@@ -68,7 +68,7 @@
68
68
  "@neon.id/utils": "^0.33.5",
69
69
  "@neutron.co.id/akademik-models": "^1.2.0",
70
70
  "@neutron.co.id/jadwal-models": "^1.2.0",
71
- "@neutron.co.id/penilaian-models": "^1.3.0",
71
+ "@neutron.co.id/penilaian-models": "^1.4.0-beta.1",
72
72
  "@neutron.co.id/tanya-models": "^1.1.0",
73
73
  "mongoose": "^6.9.1",
74
74
  "ofetch": "^1.0.0"
@@ -76,5 +76,5 @@
76
76
  "publishConfig": {
77
77
  "access": "public"
78
78
  },
79
- "build": 15
79
+ "build": 16
80
80
  }