gemcap-be-common 1.2.140 → 1.3.0
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/classes/bank-transaction-item.d.ts +17 -0
- package/classes/bank-transaction-item.js +64 -0
- package/classes/bank-transaction-item.ts +66 -0
- package/classes/bank-uploaded-transaction.d.ts +17 -0
- package/classes/bank-uploaded-transaction.js +35 -0
- package/classes/bank-uploaded-transaction.ts +35 -0
- package/classes/inventory-item.d.ts +41 -0
- package/classes/inventory-item.js +44 -0
- package/classes/inventory-item.ts +63 -0
- package/classes/payable-account-item.d.ts +22 -0
- package/classes/payable-account-item.js +27 -0
- package/classes/payable-account-item.ts +35 -0
- package/classes/quickbook-item.d.ts +37 -0
- package/classes/quickbook-item.js +51 -0
- package/classes/quickbook-item.ts +59 -0
- package/classes/receivable-item.d.ts +26 -0
- package/classes/receivable-item.js +28 -0
- package/classes/receivable-item.ts +38 -0
- package/constants/date-formats.contsants.d.ts +1 -0
- package/constants/date-formats.contsants.js +4 -0
- package/constants/date-formats.contsants.ts +1 -0
- package/db/brokers.db.d.ts +185 -0
- package/db/brokers.db.js +35 -2
- package/db/brokers.db.ts +34 -1
- package/db/collateral-adjustments.db.d.ts +34 -0
- package/db/collateral-adjustments.db.js +52 -0
- package/db/collateral-adjustments.db.ts +54 -0
- package/db/collaterals.db.d.ts +1 -1
- package/db/equipment.db.d.ts +40 -0
- package/db/equipment.db.js +55 -0
- package/db/equipment.db.ts +56 -0
- package/db/financial-spreading.db.ts +2 -1
- package/db/groups.d.ts +5 -0
- package/db/groups.js +57 -0
- package/db/groups.ts +52 -0
- package/db/inventories.d.ts +91 -0
- package/db/inventories.js +449 -0
- package/db/inventories.ts +481 -0
- package/db/inventory-availability.d.ts +3 -0
- package/db/inventory-availability.js +103 -0
- package/db/inventory-availability.ts +113 -0
- package/db/new-summary.d.ts +31 -0
- package/db/new-summary.js +1295 -0
- package/db/new-summary.ts +1509 -0
- package/db/payable-accounts.d.ts +30 -0
- package/db/payable-accounts.js +55 -0
- package/db/payable-accounts.ts +50 -0
- package/db/reserve.db.d.ts +34 -0
- package/db/reserve.db.js +52 -0
- package/db/reserve.db.ts +48 -0
- package/db/uploads.db.d.ts +2 -0
- package/db/uploads.db.js +29 -0
- package/db/uploads.db.ts +24 -0
- package/helpers/main.helper.d.ts +31 -0
- package/helpers/main.helper.js +63 -0
- package/helpers/main.helper.ts +63 -0
- package/models/AccountPayableItem.model.d.ts +6 -6
- package/models/AllocatedBankTransaction.model.d.ts +54 -0
- package/models/AllocatedBankTransaction.model.js +70 -0
- package/models/AllocatedBankTransaction.model.ts +94 -0
- package/models/AllocatedData.model.d.ts +33 -0
- package/models/AllocatedData.model.js +19 -0
- package/models/AllocatedData.model.ts +24 -0
- package/models/BBCDate.model.d.ts +3 -3
- package/models/BBCSheet.model.d.ts +3 -3
- package/models/Banks.model.d.ts +3 -3
- package/models/Borrower.model.d.ts +3 -3
- package/models/BorrowerData.model.d.ts +3 -3
- package/models/BorrowerDataInsurance.model.d.ts +3 -3
- package/models/BorrowerDataTerm.model.d.ts +3 -3
- package/models/BorrowerSummary.model.js +1 -1
- package/models/BorrowerSummary.model.ts +1 -1
- package/models/CalandarDay.model.d.ts +40 -0
- package/models/CalandarDay.model.js +47 -0
- package/models/CalandarDay.model.ts +61 -0
- package/models/CashAllocationProduct.model.d.ts +119 -0
- package/models/CashAllocationProduct.model.js +102 -0
- package/models/CashAllocationProduct.model.ts +112 -0
- package/models/CashAllocationReference.model.d.ts +37 -0
- package/models/CashAllocationReference.model.js +27 -0
- package/models/CashAllocationReference.model.ts +40 -0
- package/models/CollateralAdjustment.model.d.ts +51 -0
- package/models/CollateralAdjustment.model.js +61 -0
- package/models/CollateralAdjustment.model.ts +98 -0
- package/models/Company.model.d.ts +35 -0
- package/models/Company.model.js +18 -0
- package/models/Company.model.ts +29 -0
- package/models/CustomerAPGroup.model.d.ts +32 -0
- package/models/CustomerAPGroup.model.js +24 -0
- package/models/CustomerAPGroup.model.ts +31 -0
- package/models/Equipment.model.d.ts +53 -0
- package/models/Equipment.model.js +140 -0
- package/models/Equipment.model.ts +172 -0
- package/models/FinancialCompliance.model.d.ts +39 -0
- package/models/FinancialCompliance.model.js +64 -0
- package/models/FinancialCompliance.model.ts +78 -0
- package/models/FinancialComplianceBorrower.model.d.ts +58 -0
- package/models/FinancialComplianceBorrower.model.js +82 -0
- package/models/FinancialComplianceBorrower.model.ts +118 -0
- package/models/FinancialIndexes.model.d.ts +36 -0
- package/models/FinancialIndexes.model.js +27 -0
- package/models/FinancialIndexes.model.ts +37 -0
- package/models/Inventory.model.d.ts +18 -18
- package/models/InventoryAvailability.model.d.ts +21 -21
- package/models/InventoryAvailabilityItem.model.d.ts +6 -6
- package/models/InventoryItem.model.d.ts +24 -24
- package/models/InventoryManualEntry.model.d.ts +9 -9
- package/models/InventorySeasonalRates.model.d.ts +3 -3
- package/models/LoanBroker.model.d.ts +3 -3
- package/models/LoanCharges.model.d.ts +12 -12
- package/models/LoanProducts.model.d.ts +9 -9
- package/models/LoanStatementStatus.model.d.ts +35 -0
- package/models/LoanStatementStatus.model.js +34 -0
- package/models/LoanStatementStatus.model.ts +45 -0
- package/models/LoanStatementTransaction.model.d.ts +9 -9
- package/models/LoanTransactionFile.model.d.ts +41 -0
- package/models/LoanTransactionFile.model.js +44 -0
- package/models/LoanTransactionFile.model.ts +61 -0
- package/models/MappedGroup.model.d.ts +37 -0
- package/models/MappedGroup.model.js +33 -0
- package/models/MappedGroup.model.ts +46 -0
- package/models/MonthEndData.Model.d.ts +41 -0
- package/models/MonthEndData.Model.js +42 -0
- package/models/MonthEndData.Model.ts +53 -0
- package/models/OrganizationEmails.model.d.ts +44 -0
- package/models/OrganizationEmails.model.js +40 -0
- package/models/OrganizationEmails.model.ts +54 -0
- package/models/ProductBroker.model.d.ts +9 -9
- package/models/QuickbooksAccount.model.d.ts +39 -0
- package/models/QuickbooksAccount.model.js +43 -0
- package/models/QuickbooksAccount.model.ts +57 -0
- package/models/Receivable.model.d.ts +12 -12
- package/models/ReceivableAvailability.model.d.ts +54 -54
- package/models/ReceivableAvailabilityItem.model.d.ts +57 -57
- package/models/ReceivableItem.model.d.ts +6 -6
- package/models/Reserve.model.d.ts +51 -0
- package/models/Reserve.model.js +96 -0
- package/models/Reserve.model.ts +125 -0
- package/models/TermLoan.model.d.ts +3 -3
- package/models/TermLoanCalculated.model.d.ts +6 -6
- package/models/TransactionAttachedFile.Model.d.ts +35 -0
- package/models/TransactionAttachedFile.Model.js +37 -0
- package/models/TransactionAttachedFile.Model.ts +48 -0
- package/models/UploadedBankTransaction.model.d.ts +56 -0
- package/models/UploadedBankTransaction.model.js +78 -0
- package/models/UploadedBankTransaction.model.ts +110 -0
- package/models/UploadedData.model.d.ts +36 -0
- package/models/UploadedData.model.js +23 -0
- package/models/UploadedData.model.ts +35 -0
- package/models/UploadedFile.model.d.ts +40 -0
- package/models/UploadedFile.model.js +41 -0
- package/models/UploadedFile.model.ts +57 -0
- package/models/UploadedSheet.model.d.ts +46 -0
- package/models/UploadedSheet.model.js +27 -0
- package/models/UploadedSheet.model.ts +51 -0
- package/package.json +10 -1
- package/repositories/globals.repository.d.ts +8 -0
- package/repositories/globals.repository.js +24 -0
- package/repositories/globals.repository.ts +21 -0
- package/services/attached-files.service.d.ts +57 -0
- package/services/attached-files.service.js +103 -0
- package/services/attached-files.service.ts +123 -0
- package/services/availability.service.d.ts +77 -0
- package/services/availability.service.js +897 -0
- package/services/availability.service.ts +1034 -0
- package/services/bank-uploaded-transactions.service.d.ts +33 -0
- package/services/bank-uploaded-transactions.service.js +430 -0
- package/services/bank-uploaded-transactions.service.ts +475 -0
- package/services/banks.service.d.ts +36 -0
- package/services/banks.service.js +91 -0
- package/services/banks.service.ts +95 -0
- package/services/borrower-summary.service.d.ts +35 -0
- package/services/borrower-summary.service.js +310 -0
- package/services/borrower-summary.service.ts +334 -0
- package/services/borrowers.service.d.ts +103 -0
- package/services/borrowers.service.js +268 -0
- package/services/borrowers.service.ts +302 -0
- package/services/brokers.service.d.ts +212 -0
- package/services/brokers.service.js +160 -0
- package/services/brokers.service.ts +200 -0
- package/services/calendar.service.d.ts +53 -0
- package/services/calendar.service.js +108 -0
- package/services/calendar.service.ts +128 -0
- package/services/cash-allocation.service.d.ts +40 -0
- package/services/cash-allocation.service.js +92 -0
- package/services/cash-allocation.service.ts +105 -0
- package/services/collateral-adjustments.service.d.ts +38 -0
- package/services/collateral-adjustments.service.js +82 -0
- package/services/collateral-adjustments.service.ts +95 -0
- package/services/collaterals.service.d.ts +69 -0
- package/services/collaterals.service.js +279 -0
- package/services/collaterals.service.ts +319 -0
- package/services/companies.service.d.ts +5 -0
- package/services/companies.service.js +21 -0
- package/services/companies.service.ts +23 -0
- package/services/compliance-borrowers.service.d.ts +152 -0
- package/services/compliance-borrowers.service.js +569 -0
- package/services/compliance-borrowers.service.ts +617 -0
- package/services/equipment.service.d.ts +42 -0
- package/services/equipment.service.js +120 -0
- package/services/equipment.service.ts +149 -0
- package/services/file-manager.service.d.ts +44 -0
- package/services/file-manager.service.js +120 -0
- package/services/file-manager.service.ts +146 -0
- package/services/financial-compliance.service.d.ts +58 -0
- package/services/financial-compliance.service.js +281 -0
- package/services/financial-compliance.service.ts +309 -0
- package/services/financial-indexes.service.d.ts +20 -0
- package/services/financial-indexes.service.js +241 -0
- package/services/financial-indexes.service.ts +257 -0
- package/services/financial-spreading.service.d.ts +74 -0
- package/services/financial-spreading.service.js +450 -0
- package/services/financial-spreading.service.ts +517 -0
- package/services/globals.service.d.ts +5 -0
- package/services/globals.service.js +11 -0
- package/services/globals.service.ts +8 -0
- package/services/groups.service.d.ts +39 -0
- package/services/groups.service.js +65 -0
- package/services/groups.service.ts +64 -0
- package/services/inventory-availability.service.d.ts +13 -0
- package/services/inventory-availability.service.js +170 -0
- package/services/inventory-availability.service.ts +187 -0
- package/services/inventory.service.d.ts +118 -0
- package/services/inventory.service.js +239 -0
- package/services/inventory.service.ts +276 -0
- package/services/loan-charges.service.d.ts +83 -0
- package/services/loan-charges.service.js +343 -0
- package/services/loan-charges.service.ts +396 -0
- package/services/loan-payments.service.d.ts +94 -0
- package/services/loan-payments.service.js +485 -0
- package/services/loan-payments.service.ts +541 -0
- package/services/loan-products.service.d.ts +12 -0
- package/services/loan-products.service.js +55 -0
- package/services/loan-products.service.ts +58 -0
- package/services/loan-statement-balance.service.d.ts +16 -0
- package/services/loan-statement-balance.service.js +106 -0
- package/services/loan-statement-balance.service.ts +113 -0
- package/services/loan-statement-effects.service.d.ts +8 -0
- package/services/loan-statement-effects.service.js +42 -0
- package/services/loan-statement-effects.service.ts +41 -0
- package/services/loan-statement-status.service.d.ts +208 -0
- package/services/loan-statement-status.service.js +159 -0
- package/services/loan-statement-status.service.ts +177 -0
- package/services/loan-statement.service.d.ts +186 -0
- package/services/loan-statement.service.js +935 -0
- package/services/loan-statement.service.ts +1040 -0
- package/services/loan-transactions.service.d.ts +169 -0
- package/services/loan-transactions.service.js +941 -0
- package/services/loan-transactions.service.ts +1042 -0
- package/services/lock.service.d.ts +6 -0
- package/services/lock.service.js +45 -0
- package/services/lock.service.ts +45 -0
- package/services/manual-entry.service.d.ts +20 -0
- package/services/manual-entry.service.js +186 -0
- package/services/manual-entry.service.ts +201 -0
- package/services/month-end-data.service.d.ts +34 -0
- package/services/month-end-data.service.js +30 -0
- package/services/month-end-data.service.ts +35 -0
- package/services/nodemailer.service.d.ts +96 -0
- package/services/nodemailer.service.js +689 -0
- package/services/nodemailer.service.ts +774 -0
- package/services/organization-emails.service.d.ts +31 -0
- package/services/organization-emails.service.js +10 -0
- package/services/organization-emails.service.ts +7 -0
- package/services/organizations.service.d.ts +34 -0
- package/services/organizations.service.js +74 -0
- package/services/organizations.service.ts +84 -0
- package/services/pdf.service.d.ts +61 -0
- package/services/pdf.service.js +547 -0
- package/services/pdf.service.ts +642 -0
- package/services/quickbooks.service.d.ts +99 -0
- package/services/quickbooks.service.js +640 -0
- package/services/quickbooks.service.ts +734 -0
- package/services/reports/investor-summary.service.d.ts +28 -0
- package/services/reports/investor-summary.service.js +136 -0
- package/services/reports/investor-summary.service.ts +159 -0
- package/services/reports.service.d.ts +126 -0
- package/services/reports.service.js +584 -0
- package/services/reports.service.ts +702 -0
- package/services/reserve.service.d.ts +37 -0
- package/services/reserve.service.js +76 -0
- package/services/reserve.service.ts +79 -0
- package/services/sentry.service.d.ts +11 -0
- package/services/sentry.service.js +49 -0
- package/services/sentry.service.ts +33 -0
- package/services/signs.service.d.ts +69 -0
- package/services/signs.service.js +230 -0
- package/services/signs.service.ts +260 -0
- package/services/term-loan.service.d.ts +30 -0
- package/services/term-loan.service.js +614 -0
- package/services/term-loan.service.ts +696 -0
- package/services/uploads.service.d.ts +134 -0
- package/services/uploads.service.js +587 -0
- package/services/uploads.service.ts +643 -0
- package/services/user-logs.service.d.ts +23 -0
- package/services/user-logs.service.js +160 -0
- package/services/user-logs.service.ts +177 -0
- package/services/users.service.d.ts +4 -4
- package/services/yield.service.d.ts +46 -0
- package/services/yield.service.js +42 -12
- package/services/yield.service.ts +38 -8
- package/tsconfig.json +5 -5
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ReportsService } from '../reports.service';
|
|
2
|
+
import { LoanChargesService } from '../loan-charges.service';
|
|
3
|
+
export interface IInvestorSummaryDataRow {
|
|
4
|
+
clientName: string;
|
|
5
|
+
productName: string;
|
|
6
|
+
maturityDate: string;
|
|
7
|
+
commitmentAmount: number;
|
|
8
|
+
balanceEnd: number;
|
|
9
|
+
participationBalanceEnd: number;
|
|
10
|
+
companyExposure: number;
|
|
11
|
+
netAvailable: number;
|
|
12
|
+
collectionsBetweenStartEnd: number;
|
|
13
|
+
disbursementsBetweenStartEnd: number;
|
|
14
|
+
netRevolverAvailability: number;
|
|
15
|
+
ARNet: number;
|
|
16
|
+
inventoryNet: number;
|
|
17
|
+
otherCollateral: number;
|
|
18
|
+
otherReservesAndAdjustments: number;
|
|
19
|
+
totalRevolver: number;
|
|
20
|
+
collectionsBetweenBeginningEnd: number;
|
|
21
|
+
disbursementsBetweenBeginningEnd: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class InvestorSummaryService {
|
|
24
|
+
private readonly loanChargesService;
|
|
25
|
+
private readonly reportsService;
|
|
26
|
+
constructor(loanChargesService: LoanChargesService, reportsService: ReportsService);
|
|
27
|
+
getInvestorSummaryData(borrowerIds: string[], start: Date, end: Date): Promise<IInvestorSummaryDataRow[]>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
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.InvestorSummaryService = void 0;
|
|
7
|
+
const mongoose_1 = __importDefault(require("mongoose"));
|
|
8
|
+
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
9
|
+
const dayjs_1 = __importDefault(require("dayjs"));
|
|
10
|
+
const date_helper_1 = require("../../helpers/date.helper");
|
|
11
|
+
const Borrower_model_1 = require("../../models/Borrower.model");
|
|
12
|
+
const LoanTransaction_model_1 = require("../../models/LoanTransaction.model");
|
|
13
|
+
const loan_types_enum_1 = require("../../enums/loan-types.enum");
|
|
14
|
+
const getFirstTransactionDate = async (productId, transactionType) => {
|
|
15
|
+
const firstDocs = await LoanTransaction_model_1.LoanTransaction
|
|
16
|
+
.find({ productId: new mongoose_1.default.Types.ObjectId(productId), transactionType: transactionType })
|
|
17
|
+
.sort('date')
|
|
18
|
+
.limit(1)
|
|
19
|
+
.lean();
|
|
20
|
+
if (!firstDocs.length) {
|
|
21
|
+
return new Date();
|
|
22
|
+
}
|
|
23
|
+
return firstDocs[0].date;
|
|
24
|
+
};
|
|
25
|
+
const getCollectionBetweenDates = async (productId, start, end, transactionType) => {
|
|
26
|
+
const collections = await LoanTransaction_model_1.LoanTransaction.aggregate([{
|
|
27
|
+
$match: {
|
|
28
|
+
date: { $gte: start, $lte: end },
|
|
29
|
+
productId: new mongoose_1.default.Types.ObjectId(productId),
|
|
30
|
+
transactionType: transactionType,
|
|
31
|
+
},
|
|
32
|
+
}]);
|
|
33
|
+
return collections.reduce((sum, collection) => new decimal_js_1.default(collection.amount).abs().add(sum).toNumber(), 0);
|
|
34
|
+
};
|
|
35
|
+
const emptySummary = {
|
|
36
|
+
ARAdvanceRate: 0,
|
|
37
|
+
ARGross: 0,
|
|
38
|
+
ARNet: 0,
|
|
39
|
+
ARReserves: 0,
|
|
40
|
+
NAISC: '',
|
|
41
|
+
bootCollateral: 0,
|
|
42
|
+
borrowerName: '',
|
|
43
|
+
collateralAdjustments: 0,
|
|
44
|
+
commitment: 0,
|
|
45
|
+
equipmentCollateral: 0,
|
|
46
|
+
intellectualProperty: 0,
|
|
47
|
+
inventoryAdvanceRate: 0,
|
|
48
|
+
inventoryGrossValue: 0,
|
|
49
|
+
inventoryNet: 0,
|
|
50
|
+
inventoryReserves: 0,
|
|
51
|
+
loanBalanceRevolver: 0,
|
|
52
|
+
loanTermBalance: 0,
|
|
53
|
+
maturityDate: undefined,
|
|
54
|
+
netRevolverAvailability: 0,
|
|
55
|
+
netTermAvailability: 0,
|
|
56
|
+
otherReserves: 0,
|
|
57
|
+
participantBalance: 0,
|
|
58
|
+
productCode: '',
|
|
59
|
+
productType: '',
|
|
60
|
+
realEstate: 0,
|
|
61
|
+
startDate: undefined,
|
|
62
|
+
termLoanReserves: 0,
|
|
63
|
+
totalCollateral: 0,
|
|
64
|
+
};
|
|
65
|
+
class InvestorSummaryService {
|
|
66
|
+
loanChargesService;
|
|
67
|
+
reportsService;
|
|
68
|
+
constructor(loanChargesService, reportsService) {
|
|
69
|
+
this.loanChargesService = loanChargesService;
|
|
70
|
+
this.reportsService = reportsService;
|
|
71
|
+
}
|
|
72
|
+
async getInvestorSummaryData(borrowerIds, start, end) {
|
|
73
|
+
const data = [];
|
|
74
|
+
const borrowerSummaries = await this.reportsService.generateBankPortfolioSummary(borrowerIds, end);
|
|
75
|
+
await Promise.all(borrowerIds.map(async (borrowerId) => {
|
|
76
|
+
const borrower = await Borrower_model_1.BorrowerModel.findById(borrowerId).lean();
|
|
77
|
+
const borrowerProducts = await this.loanChargesService.getLoanProducts(borrowerId);
|
|
78
|
+
await Promise.all(borrowerProducts.filter((product) => !product.isParticipant).map(async (product) => {
|
|
79
|
+
const productId = product._id.toString();
|
|
80
|
+
const isRevolver = product.type === loan_types_enum_1.ELoanTypes.REVOLVER;
|
|
81
|
+
const { balance: balanceEnd } = await this.loanChargesService.getLoanProductBalance(productId, end);
|
|
82
|
+
const collectionsBetweenStartEnd = await getCollectionBetweenDates(productId, start, end, LoanTransaction_model_1.ELoanTransactionTypes.COLLECTION);
|
|
83
|
+
const disbursementsBetweenStartEnd = await getCollectionBetweenDates(productId, start, end, LoanTransaction_model_1.ELoanTransactionTypes.DISBURSEMENT);
|
|
84
|
+
const collectionsBeginning = await getFirstTransactionDate(productId, LoanTransaction_model_1.ELoanTransactionTypes.COLLECTION);
|
|
85
|
+
const disbursementBeginning = await getFirstTransactionDate(productId, LoanTransaction_model_1.ELoanTransactionTypes.COLLECTION);
|
|
86
|
+
const collectionsBetweenBeginningEnd = await getCollectionBetweenDates(productId, collectionsBeginning, end, LoanTransaction_model_1.ELoanTransactionTypes.COLLECTION);
|
|
87
|
+
const disbursementsBetweenBeginningEnd = await getCollectionBetweenDates(productId, disbursementBeginning, end, LoanTransaction_model_1.ELoanTransactionTypes.DISBURSEMENT);
|
|
88
|
+
const participationBalanceEnd = await this.loanChargesService.getParticipationBalance(product.code, end);
|
|
89
|
+
const companyExposure = new decimal_js_1.default(balanceEnd).sub(participationBalanceEnd).toNumber();
|
|
90
|
+
const productSummary = borrowerSummaries.find((summary) => summary.productCode === product.code) || emptySummary;
|
|
91
|
+
const netRevolverAvailability = productSummary.netRevolverAvailability;
|
|
92
|
+
const ARNet = productSummary.ARNet;
|
|
93
|
+
const inventoryNet = productSummary.inventoryNet;
|
|
94
|
+
const otherCollateral = new decimal_js_1.default(productSummary.equipmentCollateral).add(productSummary.intellectualProperty).add(productSummary.realEstate).add(productSummary.bootCollateral).toNumber();
|
|
95
|
+
const otherReserves = isRevolver ? productSummary.otherReserves : 0;
|
|
96
|
+
const collateralAdjustments = isRevolver ? await this.reportsService.getCollateralAdjustmentsForLastSignedBBC(borrowerId, end) : 0;
|
|
97
|
+
const otherReservesAndAdjustments = new decimal_js_1.default(otherReserves).add(collateralAdjustments).toNumber();
|
|
98
|
+
const totalRevolver = new decimal_js_1.default(productSummary.totalCollateral).add(productSummary.equipmentCollateral).add(productSummary.intellectualProperty).toNumber();
|
|
99
|
+
const netAvailable = new decimal_js_1.default(inventoryNet).add(ARNet).add(otherCollateral).add(otherReservesAndAdjustments).minus(balanceEnd).toNumber();
|
|
100
|
+
const newRow = {
|
|
101
|
+
clientName: borrower.name,
|
|
102
|
+
productName: product.name,
|
|
103
|
+
maturityDate: (0, dayjs_1.default)(product.maturityDate).format(date_helper_1.defaultDateFormat),
|
|
104
|
+
commitmentAmount: product.commitment,
|
|
105
|
+
balanceEnd,
|
|
106
|
+
participationBalanceEnd,
|
|
107
|
+
companyExposure,
|
|
108
|
+
netAvailable,
|
|
109
|
+
collectionsBetweenStartEnd,
|
|
110
|
+
disbursementsBetweenStartEnd,
|
|
111
|
+
netRevolverAvailability,
|
|
112
|
+
ARNet,
|
|
113
|
+
inventoryNet,
|
|
114
|
+
otherCollateral,
|
|
115
|
+
otherReservesAndAdjustments,
|
|
116
|
+
totalRevolver,
|
|
117
|
+
collectionsBetweenBeginningEnd,
|
|
118
|
+
disbursementsBetweenBeginningEnd,
|
|
119
|
+
};
|
|
120
|
+
data.push(newRow);
|
|
121
|
+
}));
|
|
122
|
+
}));
|
|
123
|
+
return data
|
|
124
|
+
.sort((a, b) => {
|
|
125
|
+
const borrowerComparison = a.clientName.localeCompare(b.clientName);
|
|
126
|
+
if (borrowerComparison !== 0) {
|
|
127
|
+
return borrowerComparison;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
return a.productName.localeCompare(b.productName);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
;
|
|
135
|
+
}
|
|
136
|
+
exports.InvestorSummaryService = InvestorSummaryService;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
import Decimal from 'decimal.js';
|
|
3
|
+
import dayjs from 'dayjs';
|
|
4
|
+
|
|
5
|
+
import { defaultDateFormat } from '../../helpers/date.helper';
|
|
6
|
+
import { BorrowerModel } from '../../models/Borrower.model';
|
|
7
|
+
import { ELoanTransactionTypes, ILoanTransactionDoc, LoanTransaction } from '../../models/LoanTransaction.model';
|
|
8
|
+
import { ELoanTypes } from '../../enums/loan-types.enum';
|
|
9
|
+
import { IBankReportData, ReportsService } from '../reports.service';
|
|
10
|
+
import { LoanChargesService } from '../loan-charges.service';
|
|
11
|
+
|
|
12
|
+
export interface IInvestorSummaryDataRow {
|
|
13
|
+
clientName: string;
|
|
14
|
+
productName: string;
|
|
15
|
+
maturityDate: string;
|
|
16
|
+
commitmentAmount: number;
|
|
17
|
+
balanceEnd: number;
|
|
18
|
+
participationBalanceEnd: number;
|
|
19
|
+
companyExposure: number;
|
|
20
|
+
netAvailable: number;
|
|
21
|
+
collectionsBetweenStartEnd: number;
|
|
22
|
+
disbursementsBetweenStartEnd: number;
|
|
23
|
+
netRevolverAvailability: number;
|
|
24
|
+
ARNet: number;
|
|
25
|
+
inventoryNet: number;
|
|
26
|
+
otherCollateral: number;
|
|
27
|
+
otherReservesAndAdjustments: number;
|
|
28
|
+
totalRevolver: number;
|
|
29
|
+
collectionsBetweenBeginningEnd: number;
|
|
30
|
+
disbursementsBetweenBeginningEnd: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const getFirstTransactionDate = async (productId: string, transactionType: ELoanTransactionTypes) => {
|
|
34
|
+
const firstDocs = await LoanTransaction
|
|
35
|
+
.find({ productId: new mongoose.Types.ObjectId(productId), transactionType: transactionType })
|
|
36
|
+
.sort('date')
|
|
37
|
+
.limit(1)
|
|
38
|
+
.lean();
|
|
39
|
+
if (!firstDocs.length) {
|
|
40
|
+
return new Date();
|
|
41
|
+
}
|
|
42
|
+
return firstDocs[0].date;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const getCollectionBetweenDates = async (productId: string, start: Date, end: Date, transactionType: ELoanTransactionTypes) => {
|
|
46
|
+
const collections = await LoanTransaction.aggregate<ILoanTransactionDoc>([{
|
|
47
|
+
$match: {
|
|
48
|
+
date: { $gte: start, $lte: end },
|
|
49
|
+
productId: new mongoose.Types.ObjectId(productId),
|
|
50
|
+
transactionType: transactionType,
|
|
51
|
+
},
|
|
52
|
+
}]);
|
|
53
|
+
return collections.reduce((sum, collection) => new Decimal(collection.amount).abs().add(sum).toNumber(), 0);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const emptySummary: IBankReportData = {
|
|
57
|
+
ARAdvanceRate: 0,
|
|
58
|
+
ARGross: 0,
|
|
59
|
+
ARNet: 0,
|
|
60
|
+
ARReserves: 0,
|
|
61
|
+
NAISC: '',
|
|
62
|
+
bootCollateral: 0,
|
|
63
|
+
borrowerName: '',
|
|
64
|
+
collateralAdjustments: 0,
|
|
65
|
+
commitment: 0,
|
|
66
|
+
equipmentCollateral: 0,
|
|
67
|
+
intellectualProperty: 0,
|
|
68
|
+
inventoryAdvanceRate: 0,
|
|
69
|
+
inventoryGrossValue: 0,
|
|
70
|
+
inventoryNet: 0,
|
|
71
|
+
inventoryReserves: 0,
|
|
72
|
+
loanBalanceRevolver: 0,
|
|
73
|
+
loanTermBalance: 0,
|
|
74
|
+
maturityDate: undefined,
|
|
75
|
+
netRevolverAvailability: 0,
|
|
76
|
+
netTermAvailability: 0,
|
|
77
|
+
otherReserves: 0,
|
|
78
|
+
participantBalance: 0,
|
|
79
|
+
productCode: '',
|
|
80
|
+
productType: '',
|
|
81
|
+
realEstate: 0,
|
|
82
|
+
startDate: undefined,
|
|
83
|
+
termLoanReserves: 0,
|
|
84
|
+
totalCollateral: 0,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
export class InvestorSummaryService {
|
|
89
|
+
|
|
90
|
+
constructor(
|
|
91
|
+
private readonly loanChargesService: LoanChargesService,
|
|
92
|
+
private readonly reportsService: ReportsService,
|
|
93
|
+
) {
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async getInvestorSummaryData(borrowerIds: string[], start: Date, end: Date) {
|
|
97
|
+
const data: IInvestorSummaryDataRow[] = [];
|
|
98
|
+
const borrowerSummaries = await this.reportsService.generateBankPortfolioSummary(borrowerIds, end);
|
|
99
|
+
await Promise.all(borrowerIds.map(async (borrowerId) => {
|
|
100
|
+
const borrower = await BorrowerModel.findById(borrowerId).lean();
|
|
101
|
+
const borrowerProducts = await this.loanChargesService.getLoanProducts(borrowerId);
|
|
102
|
+
await Promise.all(borrowerProducts.filter((product) => !product.isParticipant).map(async (product) => {
|
|
103
|
+
const productId = product._id.toString();
|
|
104
|
+
const isRevolver = product.type === ELoanTypes.REVOLVER;
|
|
105
|
+
const { balance: balanceEnd } = await this.loanChargesService.getLoanProductBalance(productId, end);
|
|
106
|
+
const collectionsBetweenStartEnd = await getCollectionBetweenDates(productId, start, end, ELoanTransactionTypes.COLLECTION);
|
|
107
|
+
const disbursementsBetweenStartEnd = await getCollectionBetweenDates(productId, start, end, ELoanTransactionTypes.DISBURSEMENT);
|
|
108
|
+
const collectionsBeginning = await getFirstTransactionDate(productId, ELoanTransactionTypes.COLLECTION);
|
|
109
|
+
const disbursementBeginning = await getFirstTransactionDate(productId, ELoanTransactionTypes.COLLECTION);
|
|
110
|
+
const collectionsBetweenBeginningEnd = await getCollectionBetweenDates(productId, collectionsBeginning, end, ELoanTransactionTypes.COLLECTION);
|
|
111
|
+
const disbursementsBetweenBeginningEnd = await getCollectionBetweenDates(productId, disbursementBeginning, end, ELoanTransactionTypes.DISBURSEMENT);
|
|
112
|
+
const participationBalanceEnd = await this.loanChargesService.getParticipationBalance(product.code, end);
|
|
113
|
+
const companyExposure = new Decimal(balanceEnd).sub(participationBalanceEnd).toNumber();
|
|
114
|
+
|
|
115
|
+
const productSummary = borrowerSummaries.find((summary) => summary.productCode === product.code) || emptySummary;
|
|
116
|
+
const netRevolverAvailability = productSummary.netRevolverAvailability;
|
|
117
|
+
const ARNet = productSummary.ARNet;
|
|
118
|
+
const inventoryNet = productSummary.inventoryNet;
|
|
119
|
+
const otherCollateral = new Decimal(productSummary.equipmentCollateral).add(productSummary.intellectualProperty).add(productSummary.realEstate).add(productSummary.bootCollateral).toNumber();
|
|
120
|
+
const otherReserves = isRevolver ? productSummary.otherReserves : 0;
|
|
121
|
+
const collateralAdjustments = isRevolver ? await this.reportsService.getCollateralAdjustmentsForLastSignedBBC(borrowerId, end) : 0;
|
|
122
|
+
const otherReservesAndAdjustments = new Decimal(otherReserves).add(collateralAdjustments).toNumber();
|
|
123
|
+
const totalRevolver = new Decimal(productSummary.totalCollateral).add(productSummary.equipmentCollateral).add(productSummary.intellectualProperty).toNumber();
|
|
124
|
+
const netAvailable = new Decimal(inventoryNet).add(ARNet).add(otherCollateral).add(otherReservesAndAdjustments).minus(balanceEnd).toNumber();
|
|
125
|
+
const newRow: IInvestorSummaryDataRow = {
|
|
126
|
+
clientName: borrower.name,
|
|
127
|
+
productName: product.name,
|
|
128
|
+
maturityDate: dayjs(product.maturityDate).format(defaultDateFormat),
|
|
129
|
+
commitmentAmount: product.commitment,
|
|
130
|
+
balanceEnd,
|
|
131
|
+
participationBalanceEnd,
|
|
132
|
+
companyExposure,
|
|
133
|
+
netAvailable,
|
|
134
|
+
collectionsBetweenStartEnd,
|
|
135
|
+
disbursementsBetweenStartEnd,
|
|
136
|
+
netRevolverAvailability,
|
|
137
|
+
ARNet,
|
|
138
|
+
inventoryNet,
|
|
139
|
+
otherCollateral,
|
|
140
|
+
otherReservesAndAdjustments,
|
|
141
|
+
totalRevolver,
|
|
142
|
+
collectionsBetweenBeginningEnd,
|
|
143
|
+
disbursementsBetweenBeginningEnd,
|
|
144
|
+
};
|
|
145
|
+
data.push(newRow);
|
|
146
|
+
}));
|
|
147
|
+
}));
|
|
148
|
+
return data
|
|
149
|
+
.sort((a, b) => {
|
|
150
|
+
const borrowerComparison = a.clientName.localeCompare(b.clientName);
|
|
151
|
+
if (borrowerComparison !== 0) {
|
|
152
|
+
return borrowerComparison;
|
|
153
|
+
} else {
|
|
154
|
+
return a.productName.localeCompare(b.productName);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
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 { ELedgerReportType } from '../db/loan-statement.db';
|
|
27
|
+
import { InvestorSummaryService } from './reports/investor-summary.service';
|
|
28
|
+
import { AvailabilityService } from './availability.service';
|
|
29
|
+
import { BorrowerService } from './borrowers.service';
|
|
30
|
+
import { CollateralAdjustmentsService } from './collateral-adjustments.service';
|
|
31
|
+
import { CollateralsService } from './collaterals.service';
|
|
32
|
+
import { EquipmentService } from './equipment.service';
|
|
33
|
+
import { LoanChargesService } from './loan-charges.service';
|
|
34
|
+
import { LoanTransactionsService } from './loan-transactions.service';
|
|
35
|
+
import { SignsService } from './signs.service';
|
|
36
|
+
import { UploadsService } from './uploads.service';
|
|
37
|
+
export interface IBankReportData {
|
|
38
|
+
borrowerId?: string;
|
|
39
|
+
borrowerName: string;
|
|
40
|
+
productCode: string;
|
|
41
|
+
productType: string;
|
|
42
|
+
commitment: number;
|
|
43
|
+
startDate: Date;
|
|
44
|
+
maturityDate: Date;
|
|
45
|
+
inventoryGrossValue: number;
|
|
46
|
+
inventoryAdvanceRate: number;
|
|
47
|
+
inventoryReserves: number;
|
|
48
|
+
inventoryNet: number;
|
|
49
|
+
ARGross: number;
|
|
50
|
+
ARAdvanceRate: number;
|
|
51
|
+
ARReserves: number;
|
|
52
|
+
ARNet: number;
|
|
53
|
+
otherReserves: number;
|
|
54
|
+
collateralAdjustments: number;
|
|
55
|
+
totalCollateral: number;
|
|
56
|
+
loanBalanceRevolver: number;
|
|
57
|
+
netRevolverAvailability: number;
|
|
58
|
+
equipmentCollateral: number;
|
|
59
|
+
intellectualProperty: number;
|
|
60
|
+
realEstate: number;
|
|
61
|
+
bootCollateral: number;
|
|
62
|
+
termLoanReserves: number;
|
|
63
|
+
loanTermBalance: number;
|
|
64
|
+
netTermAvailability: number;
|
|
65
|
+
participantBalance: number;
|
|
66
|
+
NAISC: string;
|
|
67
|
+
}
|
|
68
|
+
interface IReportDataItem {
|
|
69
|
+
name: string;
|
|
70
|
+
grossValue: number;
|
|
71
|
+
advanceRate: number;
|
|
72
|
+
netValue: number;
|
|
73
|
+
}
|
|
74
|
+
interface ISummaryReportDataGroup {
|
|
75
|
+
NAISCCode: string;
|
|
76
|
+
isExternalAppraisal: boolean;
|
|
77
|
+
isCompliant: boolean;
|
|
78
|
+
productCode: string;
|
|
79
|
+
items: IReportDataItem[];
|
|
80
|
+
}
|
|
81
|
+
interface ISummaryReportData {
|
|
82
|
+
borrowerName: string;
|
|
83
|
+
bbcDate: Date;
|
|
84
|
+
revolverDataGroup: ISummaryReportDataGroup;
|
|
85
|
+
termDataGroup: ISummaryReportDataGroup;
|
|
86
|
+
}
|
|
87
|
+
export declare class ReportsService {
|
|
88
|
+
private readonly availabilityService;
|
|
89
|
+
private readonly borrowerService;
|
|
90
|
+
private readonly collateralAdjustmentsService;
|
|
91
|
+
private readonly collateralsService;
|
|
92
|
+
private readonly equipmentService;
|
|
93
|
+
private readonly loanChargesService;
|
|
94
|
+
private readonly loanTransactionsService;
|
|
95
|
+
private readonly signsService;
|
|
96
|
+
private readonly uploadsService;
|
|
97
|
+
private readonly investorSummaryService;
|
|
98
|
+
margin: number;
|
|
99
|
+
constructor(availabilityService: AvailabilityService, borrowerService: BorrowerService, collateralAdjustmentsService: CollateralAdjustmentsService, collateralsService: CollateralsService, equipmentService: EquipmentService, loanChargesService: LoanChargesService, loanTransactionsService: LoanTransactionsService, signsService: SignsService, uploadsService: UploadsService, investorSummaryService: InvestorSummaryService);
|
|
100
|
+
getCollateralAdjustmentsForLastSignedBBC(borrowerId: string, date: Date): Promise<number>;
|
|
101
|
+
private getProductBalances;
|
|
102
|
+
getBorrowerAndProducts(borrowerId: string, date: Date, useSignedBBC?: boolean, requireBBC?: boolean): Promise<{
|
|
103
|
+
borrower: import("mongoose").Document<unknown, {}, import("../models/Borrower.model").IBorrowerDocument> & import("../models/Borrower.model").IBorrowerDocument & {
|
|
104
|
+
_id: import("mongoose").Types.ObjectId;
|
|
105
|
+
};
|
|
106
|
+
latestBBC: import("../models/BBCDate.model").IBBCDateDoc;
|
|
107
|
+
summaries: import("./availability.service").IAvailabilityFullSummary;
|
|
108
|
+
products: import("../models/LoanProducts.model").ILoanProductView[];
|
|
109
|
+
}>;
|
|
110
|
+
generatePortfolioSummary(borrowerIds: string[], date: Date): Promise<{
|
|
111
|
+
[borrowerId: string]: ISummaryReportData;
|
|
112
|
+
}>;
|
|
113
|
+
getPortfolioSummaryExcel(borrowerIds: string[], date: Date): Promise<any>;
|
|
114
|
+
generateBankPortfolioSummary(borrowerIds: string[], date: Date, { useSignedBBC, useStoredBalance, }?: {
|
|
115
|
+
useSignedBBC: boolean;
|
|
116
|
+
useStoredBalance: boolean;
|
|
117
|
+
}): Promise<IBankReportData[]>;
|
|
118
|
+
getBalancesCollateralReportExcel(borrowerIds: string[], date: Date): Promise<any>;
|
|
119
|
+
getLedger(productIds: string[], startDate: Date, endDate: Date, reportType: ELedgerReportType, showFloatedBalance?: boolean): Promise<{
|
|
120
|
+
[productId: string]: import("../db/reports.db").ILedgerReportRow[];
|
|
121
|
+
}>;
|
|
122
|
+
getInvestorSummaryReport(selectedBorrowerIds: string[], start: Date, end: Date): Promise<{
|
|
123
|
+
report: any[][];
|
|
124
|
+
}[]>;
|
|
125
|
+
}
|
|
126
|
+
export {};
|