gemcap-be-common 1.4.157 → 1.4.159

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.
@@ -0,0 +1,46 @@
1
+ /// <reference types="mongoose/types/aggregate" />
2
+ /// <reference types="mongoose/types/callback" />
3
+ /// <reference types="mongoose/types/collection" />
4
+ /// <reference types="mongoose/types/connection" />
5
+ /// <reference types="mongoose/types/cursor" />
6
+ /// <reference types="mongoose/types/document" />
7
+ /// <reference types="mongoose/types/error" />
8
+ /// <reference types="mongoose/types/expressions" />
9
+ /// <reference types="mongoose/types/helpers" />
10
+ /// <reference types="mongoose/types/middlewares" />
11
+ /// <reference types="mongoose/types/indexes" />
12
+ /// <reference types="mongoose/types/models" />
13
+ /// <reference types="mongoose/types/mongooseoptions" />
14
+ /// <reference types="mongoose/types/pipelinestage" />
15
+ /// <reference types="mongoose/types/populate" />
16
+ /// <reference types="mongoose/types/query" />
17
+ /// <reference types="mongoose/types/schemaoptions" />
18
+ /// <reference types="mongoose/types/schematypes" />
19
+ /// <reference types="mongoose/types/session" />
20
+ /// <reference types="mongoose/types/types" />
21
+ /// <reference types="mongoose/types/utility" />
22
+ /// <reference types="mongoose/types/validation" />
23
+ /// <reference types="mongoose/types/virtuals" />
24
+ /// <reference types="mongoose/types/inferschematype" />
25
+ import mongoose, { Model } from 'mongoose';
26
+ export interface IScorecard {
27
+ name: string;
28
+ }
29
+ export interface IScorecardDoc extends IScorecard, Document {
30
+ _id: mongoose.Types.ObjectId;
31
+ createdAt: Date;
32
+ updatedAt: Date;
33
+ }
34
+ export interface IScorecardLean extends IScorecard {
35
+ _id: mongoose.Types.ObjectId;
36
+ createdAt: Date;
37
+ updatedAt: Date;
38
+ }
39
+ export interface IScorecardPlain extends IScorecard {
40
+ _id: string;
41
+ }
42
+ export type TScorecardModel = Model<IScorecard>;
43
+ export declare const ScorecardSchema: mongoose.Schema<IScorecard, TScorecardModel, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, IScorecard, mongoose.Document<unknown, {}, mongoose.FlatRecord<IScorecard>> & mongoose.FlatRecord<IScorecard> & {
44
+ _id: mongoose.Types.ObjectId;
45
+ }>;
46
+ export declare const Scorecard: TScorecardModel;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Scorecard = exports.ScorecardSchema = void 0;
7
+ const mongoose_1 = __importDefault(require("mongoose"));
8
+ const _models_1 = require("./_models");
9
+ exports.ScorecardSchema = new mongoose_1.default.Schema({
10
+ name: {
11
+ type: String,
12
+ required: true,
13
+ },
14
+ }, {
15
+ timestamps: { createdAt: true, updatedAt: true },
16
+ versionKey: false,
17
+ });
18
+ exports.Scorecard = mongoose_1.default.model(_models_1.MODEL_NAMES.scorecard, exports.ScorecardSchema);
@@ -0,0 +1,40 @@
1
+ import mongoose, { Model } from 'mongoose';
2
+
3
+ import { MODEL_NAMES } from './_models';
4
+
5
+ export interface IScorecard {
6
+ name: string;
7
+ }
8
+
9
+ export interface IScorecardDoc extends IScorecard, Document {
10
+ _id: mongoose.Types.ObjectId;
11
+ createdAt: Date;
12
+ updatedAt: Date;
13
+ }
14
+
15
+ export interface IScorecardLean extends IScorecard {
16
+ _id: mongoose.Types.ObjectId;
17
+ createdAt: Date;
18
+ updatedAt: Date;
19
+ }
20
+
21
+ export interface IScorecardPlain extends IScorecard {
22
+ _id: string;
23
+ }
24
+
25
+ export type TScorecardModel = Model<IScorecard>;
26
+
27
+ export const ScorecardSchema = new mongoose.Schema<IScorecard, TScorecardModel>(
28
+ {
29
+ name: {
30
+ type: String,
31
+ required: true,
32
+ },
33
+ },
34
+ {
35
+ timestamps: { createdAt: true, updatedAt: true },
36
+ versionKey: false,
37
+ },
38
+ );
39
+
40
+ export const Scorecard = mongoose.model<IScorecard, TScorecardModel>(MODEL_NAMES.scorecard, ScorecardSchema);
@@ -0,0 +1,51 @@
1
+ /// <reference types="mongoose/types/aggregate" />
2
+ /// <reference types="mongoose/types/callback" />
3
+ /// <reference types="mongoose/types/collection" />
4
+ /// <reference types="mongoose/types/connection" />
5
+ /// <reference types="mongoose/types/cursor" />
6
+ /// <reference types="mongoose/types/document" />
7
+ /// <reference types="mongoose/types/error" />
8
+ /// <reference types="mongoose/types/expressions" />
9
+ /// <reference types="mongoose/types/helpers" />
10
+ /// <reference types="mongoose/types/middlewares" />
11
+ /// <reference types="mongoose/types/indexes" />
12
+ /// <reference types="mongoose/types/models" />
13
+ /// <reference types="mongoose/types/mongooseoptions" />
14
+ /// <reference types="mongoose/types/pipelinestage" />
15
+ /// <reference types="mongoose/types/populate" />
16
+ /// <reference types="mongoose/types/query" />
17
+ /// <reference types="mongoose/types/schemaoptions" />
18
+ /// <reference types="mongoose/types/schematypes" />
19
+ /// <reference types="mongoose/types/session" />
20
+ /// <reference types="mongoose/types/types" />
21
+ /// <reference types="mongoose/types/utility" />
22
+ /// <reference types="mongoose/types/validation" />
23
+ /// <reference types="mongoose/types/virtuals" />
24
+ /// <reference types="mongoose/types/inferschematype" />
25
+ import mongoose, { Model } from 'mongoose';
26
+ export type ScorecardAnswerValue = boolean | number | string;
27
+ export interface IScorecardAnswer {
28
+ submissionId: mongoose.Types.ObjectId;
29
+ criterionKey: string;
30
+ value: ScorecardAnswerValue;
31
+ calculatedScore: number;
32
+ }
33
+ export interface IScorecardAnswerDoc extends IScorecardAnswer, Document {
34
+ _id: mongoose.Types.ObjectId;
35
+ createdAt: Date;
36
+ updatedAt: Date;
37
+ }
38
+ export interface IScorecardAnswerLean extends IScorecardAnswer {
39
+ _id: mongoose.Types.ObjectId;
40
+ createdAt: Date;
41
+ updatedAt: Date;
42
+ }
43
+ export interface IScorecardAnswerPlain extends Omit<IScorecardAnswer, 'submissionId'> {
44
+ _id: string;
45
+ submissionId: string;
46
+ }
47
+ export type TScorecardAnswerModel = Model<IScorecardAnswer>;
48
+ export declare const ScorecardAnswerSchema: mongoose.Schema<IScorecardAnswer, TScorecardAnswerModel, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, IScorecardAnswer, mongoose.Document<unknown, {}, mongoose.FlatRecord<IScorecardAnswer>> & mongoose.FlatRecord<IScorecardAnswer> & {
49
+ _id: mongoose.Types.ObjectId;
50
+ }>;
51
+ export declare const ScorecardAnswer: TScorecardAnswerModel;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ScorecardAnswer = exports.ScorecardAnswerSchema = void 0;
7
+ const mongoose_1 = __importDefault(require("mongoose"));
8
+ const _models_1 = require("./_models");
9
+ exports.ScorecardAnswerSchema = new mongoose_1.default.Schema({
10
+ submissionId: {
11
+ type: mongoose_1.default.Schema.Types.ObjectId,
12
+ ref: _models_1.MODEL_NAMES.scorecardSubmission,
13
+ required: true,
14
+ },
15
+ criterionKey: {
16
+ type: String,
17
+ required: true,
18
+ },
19
+ value: {
20
+ type: mongoose_1.default.Schema.Types.Mixed,
21
+ required: true,
22
+ },
23
+ calculatedScore: {
24
+ type: Number,
25
+ required: true,
26
+ },
27
+ }, {
28
+ timestamps: { createdAt: true, updatedAt: true },
29
+ versionKey: false,
30
+ });
31
+ exports.ScorecardAnswer = mongoose_1.default.model(_models_1.MODEL_NAMES.scorecardAnswer, exports.ScorecardAnswerSchema);
32
+ exports.ScorecardAnswerSchema.index({ submissionId: 1, criterionKey: 1 }, { unique: true });
@@ -0,0 +1,67 @@
1
+ import mongoose, { Model } from 'mongoose';
2
+
3
+ import { MODEL_NAMES } from './_models';
4
+
5
+ export type ScorecardAnswerValue =
6
+ | boolean
7
+ | number
8
+ | string;
9
+
10
+ export interface IScorecardAnswer {
11
+ submissionId: mongoose.Types.ObjectId;
12
+ criterionKey: string;
13
+ value: ScorecardAnswerValue;
14
+ calculatedScore: number;
15
+ }
16
+
17
+ export interface IScorecardAnswerDoc extends IScorecardAnswer, Document {
18
+ _id: mongoose.Types.ObjectId;
19
+ createdAt: Date;
20
+ updatedAt: Date;
21
+ }
22
+
23
+ export interface IScorecardAnswerLean extends IScorecardAnswer {
24
+ _id: mongoose.Types.ObjectId;
25
+ createdAt: Date;
26
+ updatedAt: Date;
27
+ }
28
+
29
+ export interface IScorecardAnswerPlain extends Omit<IScorecardAnswer, 'submissionId'> {
30
+ _id: string;
31
+ submissionId: string;
32
+ }
33
+
34
+ export type TScorecardAnswerModel = Model<IScorecardAnswer>;
35
+
36
+ export const ScorecardAnswerSchema = new mongoose.Schema<IScorecardAnswer, TScorecardAnswerModel>(
37
+ {
38
+ submissionId: {
39
+ type: mongoose.Schema.Types.ObjectId,
40
+ ref: MODEL_NAMES.scorecardSubmission,
41
+ required: true,
42
+ },
43
+ criterionKey: {
44
+ type: String,
45
+ required: true,
46
+ },
47
+ value: {
48
+ type: mongoose.Schema.Types.Mixed,
49
+ required: true,
50
+ },
51
+ calculatedScore: {
52
+ type: Number,
53
+ required: true,
54
+ },
55
+ },
56
+ {
57
+ timestamps: { createdAt: true, updatedAt: true },
58
+ versionKey: false,
59
+ },
60
+ );
61
+
62
+ export const ScorecardAnswer = mongoose.model<IScorecardAnswer, TScorecardAnswerModel>(MODEL_NAMES.scorecardAnswer, ScorecardAnswerSchema);
63
+
64
+ ScorecardAnswerSchema.index(
65
+ { submissionId: 1, criterionKey: 1 },
66
+ { unique: true }
67
+ );
@@ -0,0 +1,55 @@
1
+ /// <reference types="mongoose/types/aggregate" />
2
+ /// <reference types="mongoose/types/callback" />
3
+ /// <reference types="mongoose/types/collection" />
4
+ /// <reference types="mongoose/types/connection" />
5
+ /// <reference types="mongoose/types/cursor" />
6
+ /// <reference types="mongoose/types/document" />
7
+ /// <reference types="mongoose/types/error" />
8
+ /// <reference types="mongoose/types/expressions" />
9
+ /// <reference types="mongoose/types/helpers" />
10
+ /// <reference types="mongoose/types/middlewares" />
11
+ /// <reference types="mongoose/types/indexes" />
12
+ /// <reference types="mongoose/types/models" />
13
+ /// <reference types="mongoose/types/mongooseoptions" />
14
+ /// <reference types="mongoose/types/pipelinestage" />
15
+ /// <reference types="mongoose/types/populate" />
16
+ /// <reference types="mongoose/types/query" />
17
+ /// <reference types="mongoose/types/schemaoptions" />
18
+ /// <reference types="mongoose/types/schematypes" />
19
+ /// <reference types="mongoose/types/session" />
20
+ /// <reference types="mongoose/types/types" />
21
+ /// <reference types="mongoose/types/utility" />
22
+ /// <reference types="mongoose/types/validation" />
23
+ /// <reference types="mongoose/types/virtuals" />
24
+ /// <reference types="mongoose/types/inferschematype" />
25
+ import mongoose, { Model } from 'mongoose';
26
+ export interface IStorecardSubmission {
27
+ borrowerId: mongoose.Types.ObjectId;
28
+ scorecardId: mongoose.Types.ObjectId;
29
+ scorecardVersionId: mongoose.Types.ObjectId;
30
+ period: string;
31
+ totalScore?: number;
32
+ status: 'draft' | 'final';
33
+ lockedAt: Date;
34
+ }
35
+ export interface IStorecardSubmissionDoc extends IStorecardSubmission, Document {
36
+ _id: mongoose.Types.ObjectId;
37
+ createdAt: Date;
38
+ updatedAt: Date;
39
+ }
40
+ export interface IStorecardSubmissionLean extends IStorecardSubmission {
41
+ _id: mongoose.Types.ObjectId;
42
+ createdAt: Date;
43
+ updatedAt: Date;
44
+ }
45
+ export interface IScorecardSubmissionPlain extends Omit<IStorecardSubmission, 'borrowerId' | 'scorecardId' | 'scorecardVersionId'> {
46
+ _id: string;
47
+ borrowerId: string;
48
+ scorecardId: string;
49
+ scorecardVersionId: string;
50
+ }
51
+ export type TStorecardSubmissionModel = Model<IStorecardSubmission>;
52
+ export declare const StorecardSubmissionSchema: mongoose.Schema<IStorecardSubmission, TStorecardSubmissionModel, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, IStorecardSubmission, mongoose.Document<unknown, {}, mongoose.FlatRecord<IStorecardSubmission>> & mongoose.FlatRecord<IStorecardSubmission> & {
53
+ _id: mongoose.Types.ObjectId;
54
+ }>;
55
+ export declare const StorecardSubmission: TStorecardSubmissionModel;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StorecardSubmission = exports.StorecardSubmissionSchema = void 0;
7
+ const mongoose_1 = __importDefault(require("mongoose"));
8
+ const _models_1 = require("./_models");
9
+ exports.StorecardSubmissionSchema = new mongoose_1.default.Schema({
10
+ borrowerId: {
11
+ type: mongoose_1.default.Schema.Types.ObjectId,
12
+ ref: _models_1.MODEL_NAMES.borrowers,
13
+ required: true,
14
+ },
15
+ scorecardId: {
16
+ type: mongoose_1.default.Schema.Types.ObjectId,
17
+ ref: _models_1.MODEL_NAMES.scorecard,
18
+ required: true,
19
+ },
20
+ scorecardVersionId: {
21
+ type: mongoose_1.default.Schema.Types.ObjectId,
22
+ ref: _models_1.MODEL_NAMES.scorecardVersion,
23
+ required: true,
24
+ },
25
+ period: {
26
+ type: String,
27
+ required: true,
28
+ },
29
+ totalScore: {
30
+ type: Number,
31
+ },
32
+ status: {
33
+ type: String,
34
+ enum: ['draft', 'final'],
35
+ required: true,
36
+ },
37
+ lockedAt: {
38
+ type: Date,
39
+ required: false,
40
+ },
41
+ }, {
42
+ timestamps: { createdAt: true, updatedAt: true },
43
+ versionKey: false,
44
+ });
45
+ exports.StorecardSubmission = mongoose_1.default.model(_models_1.MODEL_NAMES.scorecardSubmission, exports.StorecardSubmissionSchema);
46
+ exports.StorecardSubmissionSchema.index({ borrowerId: 1, scorecardId: 1, period: 1 }, { unique: true });
@@ -0,0 +1,81 @@
1
+ import mongoose, { Model } from 'mongoose';
2
+
3
+ import { MODEL_NAMES } from './_models';
4
+
5
+ export interface IStorecardSubmission {
6
+ borrowerId: mongoose.Types.ObjectId;
7
+ scorecardId: mongoose.Types.ObjectId;
8
+ scorecardVersionId: mongoose.Types.ObjectId;
9
+ period: string;
10
+ totalScore?: number;
11
+ status: 'draft' | 'final';
12
+ lockedAt: Date;
13
+ }
14
+
15
+ export interface IStorecardSubmissionDoc extends IStorecardSubmission, Document {
16
+ _id: mongoose.Types.ObjectId;
17
+ createdAt: Date;
18
+ updatedAt: Date;
19
+ }
20
+
21
+ export interface IStorecardSubmissionLean extends IStorecardSubmission {
22
+ _id: mongoose.Types.ObjectId;
23
+ createdAt: Date;
24
+ updatedAt: Date;
25
+ }
26
+
27
+ export interface IScorecardSubmissionPlain extends Omit<IStorecardSubmission, 'borrowerId' | 'scorecardId' | 'scorecardVersionId'> {
28
+ _id: string;
29
+ borrowerId: string;
30
+ scorecardId: string;
31
+ scorecardVersionId: string;
32
+ }
33
+
34
+ export type TStorecardSubmissionModel = Model<IStorecardSubmission>;
35
+
36
+ export const StorecardSubmissionSchema = new mongoose.Schema<IStorecardSubmission, TStorecardSubmissionModel>(
37
+ {
38
+ borrowerId: {
39
+ type: mongoose.Schema.Types.ObjectId,
40
+ ref: MODEL_NAMES.borrowers,
41
+ required: true,
42
+ },
43
+ scorecardId: {
44
+ type: mongoose.Schema.Types.ObjectId,
45
+ ref: MODEL_NAMES.scorecard,
46
+ required: true,
47
+ },
48
+ scorecardVersionId: {
49
+ type: mongoose.Schema.Types.ObjectId,
50
+ ref: MODEL_NAMES.scorecardVersion,
51
+ required: true,
52
+ },
53
+ period: {
54
+ type: String,
55
+ required: true,
56
+ },
57
+ totalScore: {
58
+ type: Number,
59
+ },
60
+ status: {
61
+ type: String,
62
+ enum: ['draft', 'final'],
63
+ required: true,
64
+ },
65
+ lockedAt: {
66
+ type: Date,
67
+ required: false,
68
+ },
69
+ },
70
+ {
71
+ timestamps: { createdAt: true, updatedAt: true },
72
+ versionKey: false,
73
+ },
74
+ );
75
+
76
+ export const StorecardSubmission = mongoose.model<IStorecardSubmission, TStorecardSubmissionModel>(MODEL_NAMES.scorecardSubmission, StorecardSubmissionSchema);
77
+
78
+ StorecardSubmissionSchema.index(
79
+ { borrowerId: 1, scorecardId: 1, period: 1 },
80
+ { unique: true }
81
+ );
@@ -0,0 +1,53 @@
1
+ /// <reference types="mongoose/types/aggregate" />
2
+ /// <reference types="mongoose/types/callback" />
3
+ /// <reference types="mongoose/types/collection" />
4
+ /// <reference types="mongoose/types/connection" />
5
+ /// <reference types="mongoose/types/cursor" />
6
+ /// <reference types="mongoose/types/document" />
7
+ /// <reference types="mongoose/types/error" />
8
+ /// <reference types="mongoose/types/expressions" />
9
+ /// <reference types="mongoose/types/helpers" />
10
+ /// <reference types="mongoose/types/middlewares" />
11
+ /// <reference types="mongoose/types/indexes" />
12
+ /// <reference types="mongoose/types/models" />
13
+ /// <reference types="mongoose/types/mongooseoptions" />
14
+ /// <reference types="mongoose/types/pipelinestage" />
15
+ /// <reference types="mongoose/types/populate" />
16
+ /// <reference types="mongoose/types/query" />
17
+ /// <reference types="mongoose/types/schemaoptions" />
18
+ /// <reference types="mongoose/types/schematypes" />
19
+ /// <reference types="mongoose/types/session" />
20
+ /// <reference types="mongoose/types/types" />
21
+ /// <reference types="mongoose/types/utility" />
22
+ /// <reference types="mongoose/types/validation" />
23
+ /// <reference types="mongoose/types/virtuals" />
24
+ /// <reference types="mongoose/types/inferschematype" />
25
+ import Joi from 'joi';
26
+ import mongoose, { Model } from 'mongoose';
27
+ export interface IScorecardVersion {
28
+ scorecardId: mongoose.Types.ObjectId;
29
+ version: string;
30
+ validFrom: Date;
31
+ validTo?: Date;
32
+ type: unknown;
33
+ }
34
+ export interface IScorecardVersionDoc extends IScorecardVersion, Document {
35
+ _id: mongoose.Types.ObjectId;
36
+ createdAt: Date;
37
+ updatedAt: Date;
38
+ }
39
+ export interface IScorecardVersionLean extends IScorecardVersion {
40
+ _id: mongoose.Types.ObjectId;
41
+ createdAt: Date;
42
+ updatedAt: Date;
43
+ }
44
+ export interface IScorecardVersionPlain extends IScorecardVersion {
45
+ _id: string;
46
+ }
47
+ export type TScorecardVersionModel = Model<IScorecardVersion>;
48
+ export declare const CRITERION_TYPES: readonly ["boolean", "enum", "number", "range", "rating"];
49
+ export declare const ScorecardDefinitionJoiSchema: Joi.ObjectSchema<any>;
50
+ export declare const ScorecardVersionSchema: mongoose.Schema<IScorecardVersion, TScorecardVersionModel, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, IScorecardVersion, mongoose.Document<unknown, {}, mongoose.FlatRecord<IScorecardVersion>> & mongoose.FlatRecord<IScorecardVersion> & {
51
+ _id: mongoose.Types.ObjectId;
52
+ }>;
53
+ export declare const ScorecardVersion: TScorecardVersionModel;
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ScorecardVersion = exports.ScorecardVersionSchema = exports.ScorecardDefinitionJoiSchema = exports.CRITERION_TYPES = void 0;
7
+ const joi_1 = __importDefault(require("joi"));
8
+ const mongoose_1 = __importDefault(require("mongoose"));
9
+ const _models_1 = require("./_models");
10
+ exports.CRITERION_TYPES = [
11
+ 'boolean',
12
+ 'enum',
13
+ 'number',
14
+ 'range',
15
+ 'rating',
16
+ ];
17
+ const scoringRuleSchema = joi_1.default.object({
18
+ score: joi_1.default.number().required(),
19
+ // mutually exclusive conditions
20
+ equals: joi_1.default.alternatives(joi_1.default.string(), joi_1.default.number(), joi_1.default.boolean()),
21
+ lt: joi_1.default.number(),
22
+ lte: joi_1.default.number(),
23
+ gt: joi_1.default.number(),
24
+ gte: joi_1.default.number(),
25
+ between: joi_1.default.array().items(joi_1.default.number()).length(2),
26
+ })
27
+ .xor('equals', 'lt', 'lte', 'gt', 'gte', 'between')
28
+ .required();
29
+ const criterionSchema = joi_1.default.object({
30
+ key: joi_1.default.string()
31
+ .regex(/^[a-z][a-zA-Z0-9]*$/)
32
+ .required(),
33
+ label: joi_1.default.string().required(),
34
+ type: joi_1.default.string()
35
+ .valid(...exports.CRITERION_TYPES)
36
+ .required(),
37
+ options: joi_1.default.when('type', {
38
+ is: 'enum',
39
+ then: joi_1.default.array().items(joi_1.default.string()).min(1).required(),
40
+ otherwise: joi_1.default.forbidden(),
41
+ }),
42
+ min: joi_1.default.when('type', {
43
+ is: 'rating',
44
+ then: joi_1.default.number().required(),
45
+ otherwise: joi_1.default.forbidden(),
46
+ }),
47
+ max: joi_1.default.when('type', {
48
+ is: 'rating',
49
+ then: joi_1.default.number().required(),
50
+ otherwise: joi_1.default.forbidden(),
51
+ }),
52
+ rules: joi_1.default.array()
53
+ .items(scoringRuleSchema)
54
+ .min(1)
55
+ .required(),
56
+ });
57
+ const sectionSchema = joi_1.default.object({
58
+ key: joi_1.default.string()
59
+ .regex(/^[a-z][a-zA-Z0-9]*$/)
60
+ .required(),
61
+ label: joi_1.default.string().required(),
62
+ order: joi_1.default.number().integer().min(1).required(),
63
+ maxScore: joi_1.default.number().required(),
64
+ criteria: joi_1.default.array()
65
+ .items(criterionSchema)
66
+ .min(1)
67
+ .required(),
68
+ });
69
+ exports.ScorecardDefinitionJoiSchema = joi_1.default.object({
70
+ sections: joi_1.default.array()
71
+ .items(sectionSchema)
72
+ .min(1)
73
+ .required(),
74
+ }).required();
75
+ exports.ScorecardVersionSchema = new mongoose_1.default.Schema({
76
+ scorecardId: {
77
+ type: mongoose_1.default.Schema.Types.ObjectId,
78
+ ref: _models_1.MODEL_NAMES.scorecard,
79
+ required: true,
80
+ },
81
+ version: {
82
+ type: String,
83
+ required: true,
84
+ },
85
+ validFrom: {
86
+ type: Date,
87
+ required: true,
88
+ },
89
+ validTo: {
90
+ type: Date,
91
+ },
92
+ type: {
93
+ type: String,
94
+ required: true,
95
+ },
96
+ }, {
97
+ timestamps: { createdAt: true, updatedAt: true },
98
+ versionKey: false,
99
+ });
100
+ exports.ScorecardVersion = mongoose_1.default.model(_models_1.MODEL_NAMES.scorecardVersion, exports.ScorecardVersionSchema);
101
+ exports.ScorecardVersionSchema.pre('save', function (next) {
102
+ if (!this.isNew && this.isModified('definitionJson')) {
103
+ return next(new Error('ScorecardVersion is immutable'));
104
+ }
105
+ next();
106
+ });