gemcap-be-common 1.3.115 → 1.3.116
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/models/CRMYield.model.d.ts +93 -0
- package/models/CRMYield.model.js +123 -0
- package/models/CRMYield.model.ts +188 -0
- package/models/_models.d.ts +1 -0
- package/models/_models.js +1 -0
- package/models/_models.ts +1 -0
- package/package.json +1 -1
- package/repositories/CRMYieldCalculation.repository.d.ts +41 -0
- package/repositories/CRMYieldCalculation.repository.js +67 -0
- package/repositories/CRMYieldCalculation.repository.ts +93 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,93 @@
|
|
|
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, { Document } from 'mongoose';
|
|
26
|
+
import Joi from 'joi';
|
|
27
|
+
export declare const CRMCalculationInputsValidationSchema: Joi.ObjectSchema<ICRMCalculationInputs>;
|
|
28
|
+
export interface ICRMCalculationInputs {
|
|
29
|
+
primeRate: number;
|
|
30
|
+
leverageCost: number;
|
|
31
|
+
equityCost: number;
|
|
32
|
+
yearsRevolver: number;
|
|
33
|
+
yearsTerm: number;
|
|
34
|
+
commitmentRevolver: number;
|
|
35
|
+
commitmentTerm: number;
|
|
36
|
+
utilizationRevolver: number;
|
|
37
|
+
utilizationTerm: number;
|
|
38
|
+
marginRevolver: number;
|
|
39
|
+
marginTerm: number;
|
|
40
|
+
adminFeeRevolver: number;
|
|
41
|
+
adminFeeTerm: number;
|
|
42
|
+
closingPointsRevolver: number;
|
|
43
|
+
closingPointsTerm: number;
|
|
44
|
+
annualLineFeeRevolver: number;
|
|
45
|
+
annualLineFeeTerm: number;
|
|
46
|
+
unusedLineFee: number;
|
|
47
|
+
referralPointsRevolver: number;
|
|
48
|
+
referralPointsTerm: number;
|
|
49
|
+
referralPercentRevolver: number;
|
|
50
|
+
referralPercentTerm: number;
|
|
51
|
+
leveragePercentRevolver: number;
|
|
52
|
+
leveragePercentTerm: number;
|
|
53
|
+
}
|
|
54
|
+
export interface ICRMCalculationResultsData {
|
|
55
|
+
revolver: number;
|
|
56
|
+
term: number;
|
|
57
|
+
blended: number;
|
|
58
|
+
}
|
|
59
|
+
export declare const CRMYieldCalculationResultsKeys: readonly ["margin", "outstanding", "interest", "adminFee", "closing", "annual", "unusedLineFee", "grossYield", "referralFeePoints", "referralFeePercent", "opYield", "costOfCapital", "netYield", "leveragedReturn", "leveragedMOIC", "impliedIRR"];
|
|
60
|
+
export type TCRMResultKey = typeof CRMYieldCalculationResultsKeys[number];
|
|
61
|
+
export type TCRMCalculationResults = {
|
|
62
|
+
[K in TCRMResultKey]: ICRMCalculationResultsData;
|
|
63
|
+
};
|
|
64
|
+
export interface ICRMCalculation {
|
|
65
|
+
prospectId: mongoose.Schema.Types.ObjectId;
|
|
66
|
+
inputs: ICRMCalculationInputs;
|
|
67
|
+
results: TCRMCalculationResults;
|
|
68
|
+
}
|
|
69
|
+
export interface ICRMCalculationDoc extends ICRMCalculation, Document {
|
|
70
|
+
}
|
|
71
|
+
export declare const CRMCalculationInputsSchema: mongoose.Schema<ICRMCalculationInputs, mongoose.Model<ICRMCalculationInputs, any, any, any, mongoose.Document<unknown, any, ICRMCalculationInputs> & ICRMCalculationInputs & {
|
|
72
|
+
_id: mongoose.Types.ObjectId;
|
|
73
|
+
}, any>, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, ICRMCalculationInputs, mongoose.Document<unknown, {}, mongoose.FlatRecord<ICRMCalculationInputs>> & mongoose.FlatRecord<ICRMCalculationInputs> & {
|
|
74
|
+
_id: mongoose.Types.ObjectId;
|
|
75
|
+
}>;
|
|
76
|
+
export declare const CRMCalculationResultsDataSchema: mongoose.Schema<ICRMCalculationResultsData, mongoose.Model<ICRMCalculationResultsData, any, any, any, mongoose.Document<unknown, any, ICRMCalculationResultsData> & ICRMCalculationResultsData & {
|
|
77
|
+
_id: mongoose.Types.ObjectId;
|
|
78
|
+
}, any>, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, ICRMCalculationResultsData, mongoose.Document<unknown, {}, mongoose.FlatRecord<ICRMCalculationResultsData>> & mongoose.FlatRecord<ICRMCalculationResultsData> & {
|
|
79
|
+
_id: mongoose.Types.ObjectId;
|
|
80
|
+
}>;
|
|
81
|
+
export declare const CRMCalculationResultsSchema: mongoose.Schema<TCRMCalculationResults, mongoose.Model<TCRMCalculationResults, any, any, any, mongoose.Document<unknown, any, TCRMCalculationResults> & TCRMCalculationResults & {
|
|
82
|
+
_id: mongoose.Types.ObjectId;
|
|
83
|
+
}, any>, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, TCRMCalculationResults, mongoose.Document<unknown, {}, mongoose.FlatRecord<TCRMCalculationResults>> & mongoose.FlatRecord<TCRMCalculationResults> & {
|
|
84
|
+
_id: mongoose.Types.ObjectId;
|
|
85
|
+
}>;
|
|
86
|
+
export declare const CRMCalculationSchema: mongoose.Schema<ICRMCalculation, mongoose.Model<ICRMCalculation, any, any, any, mongoose.Document<unknown, any, ICRMCalculation> & ICRMCalculation & {
|
|
87
|
+
_id: mongoose.Types.ObjectId;
|
|
88
|
+
}, any>, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, ICRMCalculation, mongoose.Document<unknown, {}, mongoose.FlatRecord<ICRMCalculation>> & mongoose.FlatRecord<ICRMCalculation> & {
|
|
89
|
+
_id: mongoose.Types.ObjectId;
|
|
90
|
+
}>;
|
|
91
|
+
export declare const CRMCalculationModel: mongoose.Model<ICRMCalculation, {}, {}, {}, mongoose.Document<unknown, {}, ICRMCalculation> & ICRMCalculation & {
|
|
92
|
+
_id: mongoose.Types.ObjectId;
|
|
93
|
+
}, any>;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.CRMCalculationModel = exports.CRMCalculationSchema = exports.CRMCalculationResultsSchema = exports.CRMCalculationResultsDataSchema = exports.CRMCalculationInputsSchema = exports.CRMYieldCalculationResultsKeys = exports.CRMCalculationInputsValidationSchema = void 0;
|
|
30
|
+
const mongoose_1 = __importStar(require("mongoose"));
|
|
31
|
+
const joi_1 = __importDefault(require("joi"));
|
|
32
|
+
const _models_1 = require("./_models");
|
|
33
|
+
exports.CRMCalculationInputsValidationSchema = joi_1.default.object({
|
|
34
|
+
primeRate: joi_1.default.number().required(),
|
|
35
|
+
leverageCost: joi_1.default.number().required(),
|
|
36
|
+
equityCost: joi_1.default.number().required(),
|
|
37
|
+
yearsRevolver: joi_1.default.number().required(),
|
|
38
|
+
yearsTerm: joi_1.default.number().required(),
|
|
39
|
+
commitmentRevolver: joi_1.default.number().required(),
|
|
40
|
+
commitmentTerm: joi_1.default.number().required(),
|
|
41
|
+
utilizationRevolver: joi_1.default.number().required(),
|
|
42
|
+
utilizationTerm: joi_1.default.number().required(),
|
|
43
|
+
marginRevolver: joi_1.default.number().required(),
|
|
44
|
+
marginTerm: joi_1.default.number().required(),
|
|
45
|
+
adminFeeRevolver: joi_1.default.number().required(),
|
|
46
|
+
adminFeeTerm: joi_1.default.number().required(),
|
|
47
|
+
closingPointsRevolver: joi_1.default.number().required(),
|
|
48
|
+
closingPointsTerm: joi_1.default.number().required(),
|
|
49
|
+
annualLineFeeRevolver: joi_1.default.number().required(),
|
|
50
|
+
annualLineFeeTerm: joi_1.default.number().required(),
|
|
51
|
+
unusedLineFee: joi_1.default.number().required(),
|
|
52
|
+
referralPointsRevolver: joi_1.default.number().required(),
|
|
53
|
+
referralPointsTerm: joi_1.default.number().required(),
|
|
54
|
+
referralPercentRevolver: joi_1.default.number().required(),
|
|
55
|
+
referralPercentTerm: joi_1.default.number().required(),
|
|
56
|
+
leveragePercentRevolver: joi_1.default.number().required(),
|
|
57
|
+
leveragePercentTerm: joi_1.default.number().required(),
|
|
58
|
+
});
|
|
59
|
+
exports.CRMYieldCalculationResultsKeys = [
|
|
60
|
+
'margin',
|
|
61
|
+
'outstanding',
|
|
62
|
+
'interest',
|
|
63
|
+
'adminFee',
|
|
64
|
+
'closing',
|
|
65
|
+
'annual',
|
|
66
|
+
'unusedLineFee',
|
|
67
|
+
'grossYield',
|
|
68
|
+
'referralFeePoints',
|
|
69
|
+
'referralFeePercent',
|
|
70
|
+
'opYield',
|
|
71
|
+
'costOfCapital',
|
|
72
|
+
'netYield',
|
|
73
|
+
'leveragedReturn',
|
|
74
|
+
'leveragedMOIC',
|
|
75
|
+
'impliedIRR',
|
|
76
|
+
];
|
|
77
|
+
exports.CRMCalculationInputsSchema = new mongoose_1.Schema({
|
|
78
|
+
primeRate: { type: Number, required: true },
|
|
79
|
+
leverageCost: { type: Number, required: true },
|
|
80
|
+
equityCost: { type: Number, required: true },
|
|
81
|
+
yearsTerm: { type: Number, required: true },
|
|
82
|
+
yearsRevolver: { type: Number, required: true },
|
|
83
|
+
commitmentRevolver: { type: Number, required: true },
|
|
84
|
+
commitmentTerm: { type: Number, required: true },
|
|
85
|
+
utilizationRevolver: { type: Number, required: true },
|
|
86
|
+
utilizationTerm: { type: Number, required: true },
|
|
87
|
+
marginRevolver: { type: Number, required: true },
|
|
88
|
+
marginTerm: { type: Number, required: true },
|
|
89
|
+
adminFeeRevolver: { type: Number, required: true },
|
|
90
|
+
adminFeeTerm: { type: Number, required: true },
|
|
91
|
+
closingPointsRevolver: { type: Number, required: true },
|
|
92
|
+
closingPointsTerm: { type: Number, required: true },
|
|
93
|
+
annualLineFeeRevolver: { type: Number, required: true },
|
|
94
|
+
annualLineFeeTerm: { type: Number, required: true },
|
|
95
|
+
unusedLineFee: { type: Number, required: true },
|
|
96
|
+
referralPointsRevolver: { type: Number, required: true },
|
|
97
|
+
referralPointsTerm: { type: Number, required: true },
|
|
98
|
+
referralPercentRevolver: { type: Number, required: true },
|
|
99
|
+
referralPercentTerm: { type: Number, required: true },
|
|
100
|
+
leveragePercentRevolver: { type: Number, required: true },
|
|
101
|
+
leveragePercentTerm: { type: Number, required: true },
|
|
102
|
+
}, { timestamps: false, versionKey: false, _id: false });
|
|
103
|
+
exports.CRMCalculationResultsDataSchema = new mongoose_1.Schema({
|
|
104
|
+
revolver: { type: Number, required: true },
|
|
105
|
+
term: { type: Number, required: true },
|
|
106
|
+
blended: { type: Number, required: true },
|
|
107
|
+
}, { timestamps: false, versionKey: false, _id: false });
|
|
108
|
+
const resultFields = Object.fromEntries(exports.CRMYieldCalculationResultsKeys.map((key) => [
|
|
109
|
+
key,
|
|
110
|
+
{ type: exports.CRMCalculationResultsDataSchema, required: true },
|
|
111
|
+
]));
|
|
112
|
+
exports.CRMCalculationResultsSchema = new mongoose_1.Schema(resultFields, { timestamps: false, versionKey: false, _id: false });
|
|
113
|
+
exports.CRMCalculationSchema = new mongoose_1.Schema({
|
|
114
|
+
prospectId: {
|
|
115
|
+
type: mongoose_1.default.Schema.Types.ObjectId,
|
|
116
|
+
ref: _models_1.MODEL_NAMES.CRMProspects,
|
|
117
|
+
required: true,
|
|
118
|
+
index: true,
|
|
119
|
+
},
|
|
120
|
+
inputs: { type: exports.CRMCalculationInputsSchema, required: true },
|
|
121
|
+
results: { type: exports.CRMCalculationResultsSchema, required: true },
|
|
122
|
+
}, { timestamps: true, versionKey: false });
|
|
123
|
+
exports.CRMCalculationModel = (0, mongoose_1.model)(_models_1.MODEL_NAMES.CRMYieldCalculations, exports.CRMCalculationSchema);
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import mongoose, { Schema, model, Document } from 'mongoose';
|
|
2
|
+
import Joi from 'joi';
|
|
3
|
+
import { MODEL_NAMES } from './_models';
|
|
4
|
+
|
|
5
|
+
export const CRMCalculationInputsValidationSchema = Joi.object<ICRMCalculationInputs>({
|
|
6
|
+
primeRate: Joi.number().required(),
|
|
7
|
+
leverageCost: Joi.number().required(),
|
|
8
|
+
equityCost: Joi.number().required(),
|
|
9
|
+
|
|
10
|
+
yearsRevolver: Joi.number().required(),
|
|
11
|
+
yearsTerm: Joi.number().required(),
|
|
12
|
+
|
|
13
|
+
commitmentRevolver: Joi.number().required(),
|
|
14
|
+
commitmentTerm: Joi.number().required(),
|
|
15
|
+
|
|
16
|
+
utilizationRevolver: Joi.number().required(),
|
|
17
|
+
utilizationTerm: Joi.number().required(),
|
|
18
|
+
|
|
19
|
+
marginRevolver: Joi.number().required(),
|
|
20
|
+
marginTerm: Joi.number().required(),
|
|
21
|
+
|
|
22
|
+
adminFeeRevolver: Joi.number().required(),
|
|
23
|
+
adminFeeTerm: Joi.number().required(),
|
|
24
|
+
|
|
25
|
+
closingPointsRevolver: Joi.number().required(),
|
|
26
|
+
closingPointsTerm: Joi.number().required(),
|
|
27
|
+
|
|
28
|
+
annualLineFeeRevolver: Joi.number().required(),
|
|
29
|
+
annualLineFeeTerm: Joi.number().required(),
|
|
30
|
+
|
|
31
|
+
unusedLineFee: Joi.number().required(),
|
|
32
|
+
|
|
33
|
+
referralPointsRevolver: Joi.number().required(),
|
|
34
|
+
referralPointsTerm: Joi.number().required(),
|
|
35
|
+
|
|
36
|
+
referralPercentRevolver: Joi.number().required(),
|
|
37
|
+
referralPercentTerm: Joi.number().required(),
|
|
38
|
+
|
|
39
|
+
leveragePercentRevolver: Joi.number().required(),
|
|
40
|
+
leveragePercentTerm: Joi.number().required(),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
export interface ICRMCalculationInputs {
|
|
44
|
+
primeRate: number;
|
|
45
|
+
leverageCost: number;
|
|
46
|
+
equityCost: number;
|
|
47
|
+
|
|
48
|
+
yearsRevolver: number;
|
|
49
|
+
yearsTerm: number;
|
|
50
|
+
|
|
51
|
+
commitmentRevolver: number;
|
|
52
|
+
commitmentTerm: number;
|
|
53
|
+
|
|
54
|
+
utilizationRevolver: number;
|
|
55
|
+
utilizationTerm: number;
|
|
56
|
+
|
|
57
|
+
marginRevolver: number;
|
|
58
|
+
marginTerm: number;
|
|
59
|
+
|
|
60
|
+
adminFeeRevolver: number;
|
|
61
|
+
adminFeeTerm: number;
|
|
62
|
+
|
|
63
|
+
closingPointsRevolver: number;
|
|
64
|
+
closingPointsTerm: number;
|
|
65
|
+
|
|
66
|
+
annualLineFeeRevolver: number;
|
|
67
|
+
annualLineFeeTerm: number;
|
|
68
|
+
|
|
69
|
+
unusedLineFee: number;
|
|
70
|
+
|
|
71
|
+
referralPointsRevolver: number;
|
|
72
|
+
referralPointsTerm: number;
|
|
73
|
+
|
|
74
|
+
referralPercentRevolver: number;
|
|
75
|
+
referralPercentTerm: number;
|
|
76
|
+
|
|
77
|
+
leveragePercentRevolver: number;
|
|
78
|
+
leveragePercentTerm: number;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface ICRMCalculationResultsData {
|
|
82
|
+
revolver: number;
|
|
83
|
+
term: number;
|
|
84
|
+
blended: number;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export const CRMYieldCalculationResultsKeys = [
|
|
88
|
+
'margin',
|
|
89
|
+
'outstanding',
|
|
90
|
+
'interest',
|
|
91
|
+
'adminFee',
|
|
92
|
+
'closing',
|
|
93
|
+
'annual',
|
|
94
|
+
'unusedLineFee',
|
|
95
|
+
'grossYield',
|
|
96
|
+
'referralFeePoints',
|
|
97
|
+
'referralFeePercent',
|
|
98
|
+
'opYield',
|
|
99
|
+
'costOfCapital',
|
|
100
|
+
'netYield',
|
|
101
|
+
'leveragedReturn',
|
|
102
|
+
'leveragedMOIC',
|
|
103
|
+
'impliedIRR',
|
|
104
|
+
] as const;
|
|
105
|
+
|
|
106
|
+
export type TCRMResultKey = typeof CRMYieldCalculationResultsKeys[number];
|
|
107
|
+
|
|
108
|
+
export type TCRMCalculationResults = {
|
|
109
|
+
[K in TCRMResultKey]: ICRMCalculationResultsData
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface ICRMCalculation {
|
|
113
|
+
prospectId: mongoose.Schema.Types.ObjectId;
|
|
114
|
+
inputs: ICRMCalculationInputs;
|
|
115
|
+
results: TCRMCalculationResults;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface ICRMCalculationDoc extends ICRMCalculation, Document {
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export const CRMCalculationInputsSchema = new Schema<ICRMCalculationInputs>({
|
|
122
|
+
primeRate: { type: Number, required: true },
|
|
123
|
+
leverageCost: { type: Number, required: true },
|
|
124
|
+
equityCost: { type: Number, required: true },
|
|
125
|
+
|
|
126
|
+
yearsTerm: { type: Number, required: true },
|
|
127
|
+
yearsRevolver: { type: Number, required: true },
|
|
128
|
+
|
|
129
|
+
commitmentRevolver: { type: Number, required: true },
|
|
130
|
+
commitmentTerm: { type: Number, required: true },
|
|
131
|
+
|
|
132
|
+
utilizationRevolver: { type: Number, required: true },
|
|
133
|
+
utilizationTerm: { type: Number, required: true },
|
|
134
|
+
|
|
135
|
+
marginRevolver: { type: Number, required: true },
|
|
136
|
+
marginTerm: { type: Number, required: true },
|
|
137
|
+
|
|
138
|
+
adminFeeRevolver: { type: Number, required: true },
|
|
139
|
+
adminFeeTerm: { type: Number, required: true },
|
|
140
|
+
|
|
141
|
+
closingPointsRevolver: { type: Number, required: true },
|
|
142
|
+
closingPointsTerm: { type: Number, required: true },
|
|
143
|
+
|
|
144
|
+
annualLineFeeRevolver: { type: Number, required: true },
|
|
145
|
+
annualLineFeeTerm: { type: Number, required: true },
|
|
146
|
+
|
|
147
|
+
unusedLineFee: { type: Number, required: true },
|
|
148
|
+
|
|
149
|
+
referralPointsRevolver: { type: Number, required: true },
|
|
150
|
+
referralPointsTerm: { type: Number, required: true },
|
|
151
|
+
|
|
152
|
+
referralPercentRevolver: { type: Number, required: true },
|
|
153
|
+
referralPercentTerm: { type: Number, required: true },
|
|
154
|
+
|
|
155
|
+
leveragePercentRevolver: { type: Number, required: true },
|
|
156
|
+
leveragePercentTerm: { type: Number, required: true },
|
|
157
|
+
}, { timestamps: false, versionKey: false, _id: false });
|
|
158
|
+
|
|
159
|
+
export const CRMCalculationResultsDataSchema = new Schema<ICRMCalculationResultsData>({
|
|
160
|
+
revolver: { type: Number, required: true },
|
|
161
|
+
term: { type: Number, required: true },
|
|
162
|
+
blended: { type: Number, required: true },
|
|
163
|
+
}, { timestamps: false, versionKey: false, _id: false });
|
|
164
|
+
|
|
165
|
+
const resultFields = Object.fromEntries(
|
|
166
|
+
CRMYieldCalculationResultsKeys.map((key) => [
|
|
167
|
+
key,
|
|
168
|
+
{ type: CRMCalculationResultsDataSchema, required: true },
|
|
169
|
+
]),
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
export const CRMCalculationResultsSchema = new Schema<TCRMCalculationResults>(
|
|
173
|
+
resultFields,
|
|
174
|
+
{ timestamps: false, versionKey: false, _id: false },
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
export const CRMCalculationSchema = new Schema<ICRMCalculation>({
|
|
178
|
+
prospectId: {
|
|
179
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
180
|
+
ref: MODEL_NAMES.CRMProspects,
|
|
181
|
+
required: true,
|
|
182
|
+
index: true,
|
|
183
|
+
},
|
|
184
|
+
inputs: { type: CRMCalculationInputsSchema, required: true },
|
|
185
|
+
results: { type: CRMCalculationResultsSchema, required: true },
|
|
186
|
+
}, { timestamps: true, versionKey: false });
|
|
187
|
+
|
|
188
|
+
export const CRMCalculationModel = model<ICRMCalculation>(MODEL_NAMES.CRMYieldCalculations, CRMCalculationSchema);
|
package/models/_models.d.ts
CHANGED
|
@@ -45,6 +45,7 @@ export declare const MODEL_NAMES: {
|
|
|
45
45
|
CRMProspectExternalUpdates: string;
|
|
46
46
|
CRMProspectInternalUpdates: string;
|
|
47
47
|
CRMProspectSharepoint: string;
|
|
48
|
+
CRMYieldCalculations: string;
|
|
48
49
|
customerAPGroups: string;
|
|
49
50
|
customerGroups: string;
|
|
50
51
|
deletedRecords: string;
|
package/models/_models.js
CHANGED
|
@@ -48,6 +48,7 @@ exports.MODEL_NAMES = {
|
|
|
48
48
|
CRMProspectExternalUpdates: 'crm_prospect_external_updates',
|
|
49
49
|
CRMProspectInternalUpdates: 'crm_prospect_internal_updates',
|
|
50
50
|
CRMProspectSharepoint: 'crm_prospect_sharepoint',
|
|
51
|
+
CRMYieldCalculations: 'crm_yield_calculations',
|
|
51
52
|
customerAPGroups: 'customerAPGroups',
|
|
52
53
|
customerGroups: 'customerGroups',
|
|
53
54
|
deletedRecords: 'deleted_records',
|
package/models/_models.ts
CHANGED
|
@@ -45,6 +45,7 @@ export const MODEL_NAMES = {
|
|
|
45
45
|
CRMProspectExternalUpdates: 'crm_prospect_external_updates',
|
|
46
46
|
CRMProspectInternalUpdates: 'crm_prospect_internal_updates',
|
|
47
47
|
CRMProspectSharepoint: 'crm_prospect_sharepoint',
|
|
48
|
+
CRMYieldCalculations: 'crm_yield_calculations',
|
|
48
49
|
customerAPGroups: 'customerAPGroups',
|
|
49
50
|
customerGroups: 'customerGroups',
|
|
50
51
|
deletedRecords: 'deleted_records',
|
package/package.json
CHANGED
|
@@ -0,0 +1,41 @@
|
|
|
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" />
|
|
25
|
+
/// <reference types="mongoose/types/inferschematype" />
|
|
26
|
+
import { ICRMCalculationInputs, TCRMCalculationResults } from '../models/CRMYield.model';
|
|
27
|
+
export declare class CRMYieldCalculationRepository {
|
|
28
|
+
defaultInputs: ICRMCalculationInputs;
|
|
29
|
+
getCRMYieldCalculation(prospectId: string): Promise<import("mongoose").Document<unknown, {}, import("../models/CRMYield.model").ICRMCalculation> & import("../models/CRMYield.model").ICRMCalculation & {
|
|
30
|
+
_id: import("mongoose").Types.ObjectId;
|
|
31
|
+
}>;
|
|
32
|
+
updateCRMYieldInputsPartial({ prospectId, inputs }: {
|
|
33
|
+
prospectId: string;
|
|
34
|
+
inputs: Partial<ICRMCalculationInputs>;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
updateCRMYieldInputs({ prospectId, inputs }: {
|
|
37
|
+
prospectId: string;
|
|
38
|
+
inputs: ICRMCalculationInputs;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
updateCRMYieldResults(prospectId: string, results: TCRMCalculationResults): Promise<void>;
|
|
41
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CRMYieldCalculationRepository = void 0;
|
|
4
|
+
const CRMYield_model_1 = require("../models/CRMYield.model");
|
|
5
|
+
class CRMYieldCalculationRepository {
|
|
6
|
+
defaultInputs = {
|
|
7
|
+
primeRate: 0,
|
|
8
|
+
leverageCost: 0,
|
|
9
|
+
equityCost: 0,
|
|
10
|
+
yearsRevolver: 0,
|
|
11
|
+
yearsTerm: 0,
|
|
12
|
+
commitmentRevolver: 0,
|
|
13
|
+
commitmentTerm: 0,
|
|
14
|
+
utilizationRevolver: 0,
|
|
15
|
+
utilizationTerm: 0,
|
|
16
|
+
marginRevolver: 0,
|
|
17
|
+
marginTerm: 0,
|
|
18
|
+
adminFeeRevolver: 0,
|
|
19
|
+
adminFeeTerm: 0,
|
|
20
|
+
closingPointsRevolver: 0,
|
|
21
|
+
closingPointsTerm: 0,
|
|
22
|
+
annualLineFeeRevolver: 0,
|
|
23
|
+
annualLineFeeTerm: 0,
|
|
24
|
+
unusedLineFee: 0,
|
|
25
|
+
referralPointsRevolver: 0,
|
|
26
|
+
referralPointsTerm: 0,
|
|
27
|
+
referralPercentRevolver: 0,
|
|
28
|
+
referralPercentTerm: 0,
|
|
29
|
+
leveragePercentRevolver: 0,
|
|
30
|
+
leveragePercentTerm: 0,
|
|
31
|
+
};
|
|
32
|
+
async getCRMYieldCalculation(prospectId) {
|
|
33
|
+
return CRMYield_model_1.CRMCalculationModel.findOne({ prospectId });
|
|
34
|
+
}
|
|
35
|
+
async updateCRMYieldInputsPartial({ prospectId, inputs }) {
|
|
36
|
+
if (!prospectId) {
|
|
37
|
+
throw new Error('prospectId is required to update calculation inputs.');
|
|
38
|
+
}
|
|
39
|
+
const partialSchema = CRMYield_model_1.CRMCalculationInputsValidationSchema.fork(Object.keys(CRMYield_model_1.CRMCalculationInputsValidationSchema.describe().keys), (field) => field.optional());
|
|
40
|
+
const { error } = partialSchema.validate(inputs, { abortEarly: false });
|
|
41
|
+
if (error) {
|
|
42
|
+
throw new Error(error.details[0].message);
|
|
43
|
+
}
|
|
44
|
+
const setFields = {};
|
|
45
|
+
for (const [key, value] of Object.entries(inputs)) {
|
|
46
|
+
setFields[`inputs.${key}`] = value;
|
|
47
|
+
}
|
|
48
|
+
await CRMYield_model_1.CRMCalculationModel.findOneAndUpdate({ prospectId }, { $set: setFields }, { upsert: true });
|
|
49
|
+
}
|
|
50
|
+
async updateCRMYieldInputs({ prospectId, inputs }) {
|
|
51
|
+
if (!prospectId) {
|
|
52
|
+
throw new Error('prospectId is required to update calculation inputs.');
|
|
53
|
+
}
|
|
54
|
+
const { error } = CRMYield_model_1.CRMCalculationInputsValidationSchema.validate(inputs, { abortEarly: false });
|
|
55
|
+
if (error) {
|
|
56
|
+
throw new Error(error.details[0].message);
|
|
57
|
+
}
|
|
58
|
+
await CRMYield_model_1.CRMCalculationModel.findOneAndUpdate({ prospectId }, { $set: { inputs } }, { upsert: true });
|
|
59
|
+
}
|
|
60
|
+
async updateCRMYieldResults(prospectId, results) {
|
|
61
|
+
if (!prospectId) {
|
|
62
|
+
throw new Error('prospectId is required to update calculation inputs.');
|
|
63
|
+
}
|
|
64
|
+
await CRMYield_model_1.CRMCalculationModel.findOneAndUpdate({ prospectId }, { $set: { results } }, { upsert: true });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.CRMYieldCalculationRepository = CRMYieldCalculationRepository;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CRMCalculationInputsValidationSchema,
|
|
3
|
+
CRMCalculationModel,
|
|
4
|
+
ICRMCalculationInputs,
|
|
5
|
+
TCRMCalculationResults,
|
|
6
|
+
} from '../models/CRMYield.model';
|
|
7
|
+
|
|
8
|
+
export class CRMYieldCalculationRepository {
|
|
9
|
+
public defaultInputs: ICRMCalculationInputs = {
|
|
10
|
+
primeRate: 0,
|
|
11
|
+
leverageCost: 0,
|
|
12
|
+
equityCost: 0,
|
|
13
|
+
|
|
14
|
+
yearsRevolver: 0,
|
|
15
|
+
yearsTerm: 0,
|
|
16
|
+
|
|
17
|
+
commitmentRevolver: 0,
|
|
18
|
+
commitmentTerm: 0,
|
|
19
|
+
|
|
20
|
+
utilizationRevolver: 0,
|
|
21
|
+
utilizationTerm: 0,
|
|
22
|
+
|
|
23
|
+
marginRevolver: 0,
|
|
24
|
+
marginTerm: 0,
|
|
25
|
+
|
|
26
|
+
adminFeeRevolver: 0,
|
|
27
|
+
adminFeeTerm: 0,
|
|
28
|
+
|
|
29
|
+
closingPointsRevolver: 0,
|
|
30
|
+
closingPointsTerm: 0,
|
|
31
|
+
|
|
32
|
+
annualLineFeeRevolver: 0,
|
|
33
|
+
annualLineFeeTerm: 0,
|
|
34
|
+
unusedLineFee: 0,
|
|
35
|
+
|
|
36
|
+
referralPointsRevolver: 0,
|
|
37
|
+
referralPointsTerm: 0,
|
|
38
|
+
|
|
39
|
+
referralPercentRevolver: 0,
|
|
40
|
+
referralPercentTerm: 0,
|
|
41
|
+
|
|
42
|
+
leveragePercentRevolver: 0,
|
|
43
|
+
leveragePercentTerm: 0,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
async getCRMYieldCalculation(prospectId: string) {
|
|
47
|
+
return CRMCalculationModel.findOne({ prospectId });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async updateCRMYieldInputsPartial({ prospectId, inputs }: { prospectId: string, inputs: Partial<ICRMCalculationInputs> }): Promise<void> {
|
|
51
|
+
if (!prospectId) {
|
|
52
|
+
throw new Error('prospectId is required to update calculation inputs.');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const partialSchema = CRMCalculationInputsValidationSchema.fork(
|
|
56
|
+
Object.keys(CRMCalculationInputsValidationSchema.describe().keys),
|
|
57
|
+
(field) => field.optional()
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
const { error } = partialSchema.validate(inputs, { abortEarly: false });
|
|
61
|
+
if (error) {
|
|
62
|
+
throw new Error(error.details[0].message);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const setFields: Record<string, number> = {};
|
|
66
|
+
|
|
67
|
+
for (const [key, value] of Object.entries(inputs)) {
|
|
68
|
+
setFields[`inputs.${key}`] = value;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
await CRMCalculationModel.findOneAndUpdate({ prospectId }, { $set: setFields }, { upsert: true });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async updateCRMYieldInputs({ prospectId, inputs }: { prospectId: string, inputs: ICRMCalculationInputs }): Promise<void> {
|
|
75
|
+
if (!prospectId) {
|
|
76
|
+
throw new Error('prospectId is required to update calculation inputs.');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const { error } = CRMCalculationInputsValidationSchema.validate(inputs, { abortEarly: false });
|
|
80
|
+
if (error) {
|
|
81
|
+
throw new Error(error.details[0].message);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
await CRMCalculationModel.findOneAndUpdate({ prospectId }, { $set: { inputs } }, { upsert: true });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async updateCRMYieldResults(prospectId: string, results: TCRMCalculationResults): Promise<void> {
|
|
88
|
+
if (!prospectId) {
|
|
89
|
+
throw new Error('prospectId is required to update calculation inputs.');
|
|
90
|
+
}
|
|
91
|
+
await CRMCalculationModel.findOneAndUpdate({ prospectId }, { $set: { results } }, { upsert: true });
|
|
92
|
+
}
|
|
93
|
+
}
|