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,584 @@
|
|
|
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.ReportsService = void 0;
|
|
7
|
+
const dayjs_1 = __importDefault(require("dayjs"));
|
|
8
|
+
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
9
|
+
const Borrower_model_1 = require("../models/Borrower.model");
|
|
10
|
+
const date_helper_1 = require("../helpers/date.helper");
|
|
11
|
+
const loan_types_enum_1 = require("../enums/loan-types.enum");
|
|
12
|
+
const reserve_types_enum_1 = require("../enums/reserve-types.enum");
|
|
13
|
+
const equipment_types_enum_1 = require("../enums/equipment-types.enum");
|
|
14
|
+
const reports_db_1 = require("../db/reports.db");
|
|
15
|
+
const pdf_service_1 = require("./pdf.service");
|
|
16
|
+
const createReportItemFromInventory = (item) => {
|
|
17
|
+
return {
|
|
18
|
+
name: item.inventoryName,
|
|
19
|
+
grossValue: -item.totalValue,
|
|
20
|
+
advanceRate: item.advanceRate * 100,
|
|
21
|
+
netValue: -item.availability,
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
const createReportItemFromEquipment = (items) => {
|
|
25
|
+
const titleMap = {
|
|
26
|
+
EQUIPMENT: 'Equipment',
|
|
27
|
+
INTELLECTUAL_PROPERTY: 'Intellectual property',
|
|
28
|
+
REAL_ESTATE: 'Real estate',
|
|
29
|
+
BOOT_COLLATERAL: 'Boot collateral',
|
|
30
|
+
};
|
|
31
|
+
return Object.entries(titleMap).map(([key, title]) => {
|
|
32
|
+
return {
|
|
33
|
+
name: title,
|
|
34
|
+
grossValue: items[key].amount,
|
|
35
|
+
advanceRate: items[key].advanceRate,
|
|
36
|
+
netValue: items[key].availability,
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
const createReportItemFromReserve = (item, reserveName) => {
|
|
41
|
+
return {
|
|
42
|
+
name: reserveName,
|
|
43
|
+
grossValue: 0,
|
|
44
|
+
advanceRate: 0,
|
|
45
|
+
netValue: -item.amount,
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
const createReportItemsFromReceivable = (receivable) => {
|
|
49
|
+
const getArUninsured = () => {
|
|
50
|
+
return receivable
|
|
51
|
+
? {
|
|
52
|
+
grossValue: receivable.uninsuredComponent,
|
|
53
|
+
advanceRate: receivable.uninsuredComponent === 0 ? 0 : new decimal_js_1.default(receivable.uninsuredAvailability).div(receivable.uninsuredComponent).mul(100).toDP(2).toNumber(),
|
|
54
|
+
netValue: receivable.uninsuredAvailability,
|
|
55
|
+
}
|
|
56
|
+
: {
|
|
57
|
+
grossValue: 0,
|
|
58
|
+
advanceRate: 0,
|
|
59
|
+
netValue: 0,
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
const getArInsured = () => {
|
|
63
|
+
return receivable
|
|
64
|
+
? {
|
|
65
|
+
grossValue: receivable.insuredComponent,
|
|
66
|
+
advanceRate: receivable.insuredComponent === 0 ? 0 : new decimal_js_1.default(receivable.insuredAvailability).div(receivable.insuredComponent).mul(100).toDP(2).toNumber(),
|
|
67
|
+
netValue: receivable.insuredAvailability,
|
|
68
|
+
}
|
|
69
|
+
: {
|
|
70
|
+
grossValue: 0,
|
|
71
|
+
advanceRate: 0,
|
|
72
|
+
netValue: 0,
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
arUninsured: {
|
|
77
|
+
name: 'AR Uninsured',
|
|
78
|
+
...getArUninsured(),
|
|
79
|
+
},
|
|
80
|
+
arInsured: {
|
|
81
|
+
name: 'AR Insured',
|
|
82
|
+
...getArInsured(),
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
const createTotalRows = (allResults, productType, loanBalance) => {
|
|
87
|
+
const productTypeTitles = {
|
|
88
|
+
REVOLVER: {
|
|
89
|
+
totalCollateral: 'TOTAL REVOLVING COLLATERAL',
|
|
90
|
+
loanBalance: 'LOAN BALANCE (Revolving products only)',
|
|
91
|
+
netAvailability: 'NET REVOLVER AVAILABILITY',
|
|
92
|
+
},
|
|
93
|
+
TERM: {
|
|
94
|
+
totalCollateral: 'TOTAL TERM COLLATERAL',
|
|
95
|
+
loanBalance: 'LOAN BALANCE (Term products only)',
|
|
96
|
+
netAvailability: 'NET TERM AVAILABILITY',
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
const totalCollateralRow = allResults.reduce((acc, item) => {
|
|
100
|
+
acc.grossValue = new decimal_js_1.default(acc.grossValue).plus(item.grossValue).toNumber();
|
|
101
|
+
acc.netValue = new decimal_js_1.default(acc.netValue).plus(item.netValue).toNumber();
|
|
102
|
+
acc.advanceRate = item.grossValue === 0 ? 0 : new decimal_js_1.default(acc.netValue).div(item.grossValue).toDP(2).toNumber();
|
|
103
|
+
return acc;
|
|
104
|
+
}, {
|
|
105
|
+
name: productTypeTitles[productType].totalCollateral,
|
|
106
|
+
grossValue: 0,
|
|
107
|
+
advanceRate: 0,
|
|
108
|
+
netValue: 0,
|
|
109
|
+
});
|
|
110
|
+
const loanBalanceRow = {
|
|
111
|
+
name: productTypeTitles[productType].loanBalance,
|
|
112
|
+
grossValue: loanBalance,
|
|
113
|
+
advanceRate: 0,
|
|
114
|
+
netValue: loanBalance,
|
|
115
|
+
};
|
|
116
|
+
const netAvailabilityRow = {
|
|
117
|
+
name: productTypeTitles[productType].netAvailability,
|
|
118
|
+
grossValue: 0,
|
|
119
|
+
advanceRate: 0,
|
|
120
|
+
netValue: new decimal_js_1.default(totalCollateralRow.netValue).sub(loanBalanceRow.netValue).toNumber(),
|
|
121
|
+
};
|
|
122
|
+
return { totalCollateralRow, loanBalanceRow, netAvailabilityRow };
|
|
123
|
+
};
|
|
124
|
+
const getInventoryGrossValue = (inventory) => {
|
|
125
|
+
const foundInv = inventory?.find((s) => s.inventoryName === 'TOTAL');
|
|
126
|
+
if (foundInv) {
|
|
127
|
+
return foundInv.totalValue;
|
|
128
|
+
}
|
|
129
|
+
return 0;
|
|
130
|
+
};
|
|
131
|
+
const getInventoryAdvanceRate = (inventory) => {
|
|
132
|
+
const foundInv = inventory?.find((s) => s.inventoryName === 'TOTAL');
|
|
133
|
+
if (foundInv) {
|
|
134
|
+
return foundInv.availability;
|
|
135
|
+
}
|
|
136
|
+
return 0;
|
|
137
|
+
};
|
|
138
|
+
const getInventoryReservesValue = (reserve) => {
|
|
139
|
+
return reserve[reserve_types_enum_1.EReserveTypes.INVENTORY]?.amount ?? 0;
|
|
140
|
+
};
|
|
141
|
+
const getARGross = (receivable) => {
|
|
142
|
+
return !receivable ? 0 : new decimal_js_1.default(receivable.uninsuredComponent || 0).add(receivable.insuredComponent || 0).toNumber();
|
|
143
|
+
};
|
|
144
|
+
const getARAdvanceRate = (receivable) => {
|
|
145
|
+
return !receivable ? 0 : new decimal_js_1.default(receivable.uninsuredAvailability || 0).add(receivable.insuredAvailability || 0).toNumber();
|
|
146
|
+
};
|
|
147
|
+
const getOtherValue = (reserves) => {
|
|
148
|
+
return Object
|
|
149
|
+
.entries(reserves)
|
|
150
|
+
.reduce((acc, [key, el]) => {
|
|
151
|
+
if (key === reserve_types_enum_1.EReserveTypes.EQUIPMENT ||
|
|
152
|
+
key === reserve_types_enum_1.EReserveTypes.INVENTORY ||
|
|
153
|
+
key === reserve_types_enum_1.EReserveTypes.RECEIVABLES) {
|
|
154
|
+
return acc;
|
|
155
|
+
}
|
|
156
|
+
return new decimal_js_1.default(acc || 0).sub(el.amount).toNumber();
|
|
157
|
+
}, 0);
|
|
158
|
+
};
|
|
159
|
+
class ReportsService {
|
|
160
|
+
availabilityService;
|
|
161
|
+
borrowerService;
|
|
162
|
+
collateralAdjustmentsService;
|
|
163
|
+
collateralsService;
|
|
164
|
+
equipmentService;
|
|
165
|
+
loanChargesService;
|
|
166
|
+
loanTransactionsService;
|
|
167
|
+
signsService;
|
|
168
|
+
uploadsService;
|
|
169
|
+
investorSummaryService;
|
|
170
|
+
margin = pdf_service_1.defaultPDFPageMarginSize;
|
|
171
|
+
constructor(availabilityService, borrowerService, collateralAdjustmentsService, collateralsService, equipmentService, loanChargesService, loanTransactionsService, signsService, uploadsService, investorSummaryService) {
|
|
172
|
+
this.availabilityService = availabilityService;
|
|
173
|
+
this.borrowerService = borrowerService;
|
|
174
|
+
this.collateralAdjustmentsService = collateralAdjustmentsService;
|
|
175
|
+
this.collateralsService = collateralsService;
|
|
176
|
+
this.equipmentService = equipmentService;
|
|
177
|
+
this.loanChargesService = loanChargesService;
|
|
178
|
+
this.loanTransactionsService = loanTransactionsService;
|
|
179
|
+
this.signsService = signsService;
|
|
180
|
+
this.uploadsService = uploadsService;
|
|
181
|
+
this.investorSummaryService = investorSummaryService;
|
|
182
|
+
}
|
|
183
|
+
async getCollateralAdjustmentsForLastSignedBBC(borrowerId, date) {
|
|
184
|
+
const lastSignedBBC = await this.signsService.getLatestSignedBBCDate(borrowerId, date);
|
|
185
|
+
if (!lastSignedBBC) {
|
|
186
|
+
return 0;
|
|
187
|
+
}
|
|
188
|
+
const summary = await this.collateralAdjustmentsService.getCollateralAdjustmentSummary(lastSignedBBC._id.toString());
|
|
189
|
+
return Object.values(summary).reduce((acc, summaryRow) => (new decimal_js_1.default(acc).add(summaryRow.amount).toNumber()), 0);
|
|
190
|
+
}
|
|
191
|
+
;
|
|
192
|
+
async getProductBalances(productId, isRevolver, date) {
|
|
193
|
+
const lastTransaction = await this.loanTransactionsService.getLastTransactionForDate(productId, date);
|
|
194
|
+
const balance = lastTransaction ? lastTransaction.balance : 0;
|
|
195
|
+
const availability = -balance;
|
|
196
|
+
const balances = {
|
|
197
|
+
loanBalanceRevolver: isRevolver ? balance : 0,
|
|
198
|
+
netRevolverAvailability: isRevolver ? availability : 0,
|
|
199
|
+
loanTermBalance: isRevolver ? 0 : balance,
|
|
200
|
+
netTermAvailability: isRevolver ? 0 : availability,
|
|
201
|
+
};
|
|
202
|
+
return balances;
|
|
203
|
+
}
|
|
204
|
+
;
|
|
205
|
+
async getBorrowerAndProducts(borrowerId, date, useSignedBBC = false, requireBBC = true) {
|
|
206
|
+
const borrower = await Borrower_model_1.BorrowerModel.findById(borrowerId);
|
|
207
|
+
if (!borrower) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
const latestBBC = useSignedBBC
|
|
211
|
+
? await this.signsService.getLatestSignedBBCDate(borrowerId, date)
|
|
212
|
+
: await this.collateralsService.getLatestBBC(borrowerId, date);
|
|
213
|
+
if (!latestBBC && requireBBC) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
const summaries = latestBBC ? await this.availabilityService.getAllSummaries(latestBBC._id.toString(), null) : null;
|
|
217
|
+
const products = await this.loanChargesService.getLoanProducts(borrowerId);
|
|
218
|
+
return { borrower, latestBBC, summaries, products };
|
|
219
|
+
}
|
|
220
|
+
async generatePortfolioSummary(borrowerIds, date) {
|
|
221
|
+
if (borrowerIds.length === 0) {
|
|
222
|
+
return {};
|
|
223
|
+
}
|
|
224
|
+
const allResults = {};
|
|
225
|
+
await Promise.all(borrowerIds.map(async (borrowerId) => {
|
|
226
|
+
const borrowerData = await this.getBorrowerAndProducts(borrowerId, date, true);
|
|
227
|
+
if (!borrowerData) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const { borrower, latestBBC, summaries, products } = borrowerData;
|
|
231
|
+
if (!borrower) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const revolverProduct = products.find((product) => product.type === loan_types_enum_1.ELoanTypes.REVOLVER);
|
|
235
|
+
const termProduct = products.find((product) => product.type === loan_types_enum_1.ELoanTypes.TERM);
|
|
236
|
+
let revolverDataGroup = null;
|
|
237
|
+
if (revolverProduct) {
|
|
238
|
+
const inventoryItems = summaries.inventory.map(createReportItemFromInventory);
|
|
239
|
+
const inventoryReserve = createReportItemFromReserve(summaries.reserve['INVENTORY'], 'Inventory Reserves');
|
|
240
|
+
const ARReserve = createReportItemFromReserve(summaries.reserve['RECEIVABLES'], 'AR Reserves');
|
|
241
|
+
const otherReserve = createReportItemFromReserve(summaries.reserve['OTHER'], 'Other non-equipment reserves');
|
|
242
|
+
const { arUninsured, arInsured } = createReportItemsFromReceivable(summaries.receivable);
|
|
243
|
+
const revolverItems = [...inventoryItems, inventoryReserve, arUninsured, arInsured, ARReserve, otherReserve];
|
|
244
|
+
const revolverBalance = await this.loanChargesService.getLoanProductBalance(revolverProduct._id.toString(), date);
|
|
245
|
+
const { totalCollateralRow: totalCollateralRowRevolver, loanBalanceRow: loanBalanceRowRevolver, netAvailabilityRow: netAvailabilityRowRevolver, } = createTotalRows(revolverItems, 'REVOLVER', revolverBalance.balance);
|
|
246
|
+
revolverDataGroup = {
|
|
247
|
+
NAISCCode: '',
|
|
248
|
+
productCode: '',
|
|
249
|
+
isCompliant: false,
|
|
250
|
+
isExternalAppraisal: false,
|
|
251
|
+
items: [...revolverItems, totalCollateralRowRevolver, loanBalanceRowRevolver, netAvailabilityRowRevolver],
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
let termDataGroup = null;
|
|
255
|
+
if (termProduct) {
|
|
256
|
+
const equipmentItems = createReportItemFromEquipment(summaries.equipment);
|
|
257
|
+
const termReserve = createReportItemFromReserve(summaries.reserve['EQUIPMENT'], 'Term Loan Reserves (total)');
|
|
258
|
+
const termItems = [...equipmentItems, termReserve];
|
|
259
|
+
const termBalance = await this.loanChargesService.getLoanProductBalance(termProduct._id.toString(), date);
|
|
260
|
+
const { totalCollateralRow: totalCollateralRowTerm, loanBalanceRow: loanBalanceRowTerm, netAvailabilityRow: netAvailabilityRowTerm, } = createTotalRows(termItems, 'TERM', termBalance.balance);
|
|
261
|
+
termDataGroup = {
|
|
262
|
+
NAISCCode: '',
|
|
263
|
+
productCode: '',
|
|
264
|
+
isCompliant: false,
|
|
265
|
+
isExternalAppraisal: false,
|
|
266
|
+
items: [...termItems, totalCollateralRowTerm, loanBalanceRowTerm, netAvailabilityRowTerm],
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
allResults[borrowerId] = {
|
|
270
|
+
borrowerName: borrower.name,
|
|
271
|
+
bbcDate: latestBBC.bbcDate,
|
|
272
|
+
revolverDataGroup,
|
|
273
|
+
termDataGroup,
|
|
274
|
+
};
|
|
275
|
+
}));
|
|
276
|
+
return allResults;
|
|
277
|
+
}
|
|
278
|
+
async getPortfolioSummaryExcel(borrowerIds, date) {
|
|
279
|
+
const report = await this.generatePortfolioSummary(borrowerIds, date);
|
|
280
|
+
const emptyRow = [['']];
|
|
281
|
+
const reportHeader = [
|
|
282
|
+
['PORTFOLIO LOAN BALANCE AND COLLATERAL REPORT'],
|
|
283
|
+
[`RUN DATE ${(0, date_helper_1.formatDate)(date)}`],
|
|
284
|
+
[''],
|
|
285
|
+
];
|
|
286
|
+
const reportToCovert = Object.values(report).reduce((acc, borrowerData) => {
|
|
287
|
+
const headers = [
|
|
288
|
+
[`LOAN BALANCE AND COLLATERAL REPORT ${borrowerData.borrowerName}, Last BBC date - ${(0, date_helper_1.formatDate)(borrowerData.bbcDate)}`],
|
|
289
|
+
['', 'Gross Value', 'Advance Rate', 'Net Value'],
|
|
290
|
+
];
|
|
291
|
+
const convertToExcel = (dataGroup) => {
|
|
292
|
+
if (!dataGroup) {
|
|
293
|
+
return [];
|
|
294
|
+
}
|
|
295
|
+
return dataGroup.items.reduce((acc, revolverItem) => {
|
|
296
|
+
if (revolverItem.name === 'TOTAL') {
|
|
297
|
+
return acc;
|
|
298
|
+
}
|
|
299
|
+
return [...acc, [...Object.values(revolverItem).map((v) => v === 0 ? '-' : v)]];
|
|
300
|
+
}, []);
|
|
301
|
+
};
|
|
302
|
+
const revolverData = convertToExcel(borrowerData.revolverDataGroup);
|
|
303
|
+
const termData = convertToExcel(borrowerData.termDataGroup);
|
|
304
|
+
return [...acc, ...headers, ...revolverData, ...emptyRow, ...termData, ...emptyRow, ...emptyRow];
|
|
305
|
+
}, [...reportHeader]);
|
|
306
|
+
return await this.uploadsService.convertDataToFile([{ portfolio: reportToCovert }]);
|
|
307
|
+
}
|
|
308
|
+
async generateBankPortfolioSummary(borrowerIds, date, { useSignedBBC, useStoredBalance, } = { useSignedBBC: true, useStoredBalance: false }) {
|
|
309
|
+
const productsGrouped = await Promise.all(borrowerIds.map(async (borrowerId) => {
|
|
310
|
+
const borrowerData = await this.getBorrowerAndProducts(borrowerId, date, useSignedBBC, false);
|
|
311
|
+
if (!borrowerData) {
|
|
312
|
+
return [];
|
|
313
|
+
}
|
|
314
|
+
const { borrower, summaries, products } = borrowerData;
|
|
315
|
+
if (!borrower) {
|
|
316
|
+
return [];
|
|
317
|
+
}
|
|
318
|
+
const borrowerSettings = await this.borrowerService.getBorrowerSettings(borrowerId);
|
|
319
|
+
const borrowerOptions = borrowerSettings.data.options;
|
|
320
|
+
const NAISCCodeOption = borrowerOptions.find((option) => option['dataName'] === 'NAISC Code');
|
|
321
|
+
const NAISCCode = NAISCCodeOption ? NAISCCodeOption.dataValue : '';
|
|
322
|
+
const hasTermProduct = products.some((product) => product.type === loan_types_enum_1.ELoanTypes.TERM);
|
|
323
|
+
const manyTermProduct = products.filter((product) => product.type === loan_types_enum_1.ELoanTypes.TERM).length > 1;
|
|
324
|
+
return await Promise.all(products.map(async (product) => {
|
|
325
|
+
if (product.isParticipant) {
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
const isRevolver = product.type === loan_types_enum_1.ELoanTypes.REVOLVER;
|
|
329
|
+
const productMainData = {
|
|
330
|
+
borrowerId,
|
|
331
|
+
borrowerName: borrower.name,
|
|
332
|
+
productCode: product.code,
|
|
333
|
+
productType: product.type,
|
|
334
|
+
commitment: product.commitment,
|
|
335
|
+
startDate: product.startDate,
|
|
336
|
+
maturityDate: product.maturityDate,
|
|
337
|
+
NAISC: NAISCCode,
|
|
338
|
+
...(await this.getProductBalances(product._id.toString(), isRevolver, date)),
|
|
339
|
+
};
|
|
340
|
+
if (!summaries) {
|
|
341
|
+
return {
|
|
342
|
+
inventoryGrossValue: 0,
|
|
343
|
+
inventoryAdvanceRate: 0,
|
|
344
|
+
inventoryReserves: 0,
|
|
345
|
+
inventoryNet: 0,
|
|
346
|
+
ARGross: 0,
|
|
347
|
+
ARAdvanceRate: 0,
|
|
348
|
+
ARReserves: 0,
|
|
349
|
+
ARNet: 0,
|
|
350
|
+
otherReserves: 0,
|
|
351
|
+
collateralAdjustments: 0,
|
|
352
|
+
totalCollateral: 0,
|
|
353
|
+
loanBalanceRevolver: 0,
|
|
354
|
+
netRevolverAvailability: 0,
|
|
355
|
+
equipmentCollateral: 0,
|
|
356
|
+
intellectualProperty: 0,
|
|
357
|
+
realEstate: 0,
|
|
358
|
+
bootCollateral: 0,
|
|
359
|
+
termLoanReserves: 0,
|
|
360
|
+
loanTermBalance: 0,
|
|
361
|
+
netTermAvailability: 0,
|
|
362
|
+
participantBalance: 0,
|
|
363
|
+
...(await this.getProductBalances(product._id.toString(), isRevolver, date)),
|
|
364
|
+
...productMainData,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
const balances = await this.getProductBalances(product._id.toString(), isRevolver, date);
|
|
369
|
+
if (useStoredBalance) {
|
|
370
|
+
const bbc = await this.collateralsService.getLatestBBC(borrowerId, date);
|
|
371
|
+
if (bbc) {
|
|
372
|
+
const savedData = await this.signsService.getSavedData(bbc._id.toString());
|
|
373
|
+
if (savedData.loanBalances?.REVOLVER) {
|
|
374
|
+
balances.loanBalanceRevolver = savedData.loanBalances?.REVOLVER;
|
|
375
|
+
balances.loanTermBalance = savedData.loanBalances?.TERM;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
const inventoryGrossValue = isRevolver ? getInventoryGrossValue(summaries.inventory) : 0;
|
|
380
|
+
const inventoryAdvanceRate = isRevolver ? getInventoryAdvanceRate(summaries.inventory) : 0;
|
|
381
|
+
const inventoryReserves = isRevolver ? getInventoryReservesValue(summaries.reserve) : 0;
|
|
382
|
+
const inventoryNet = new decimal_js_1.default(inventoryAdvanceRate).sub(inventoryReserves).toNumber();
|
|
383
|
+
const ARGross = isRevolver ? getARGross(summaries.receivable) : 0;
|
|
384
|
+
const ARAdvanceRate = isRevolver ? getARAdvanceRate(summaries.receivable) : 0;
|
|
385
|
+
const ARReserves = isRevolver ? summaries.reserve[reserve_types_enum_1.EReserveTypes.RECEIVABLES].amount : 0;
|
|
386
|
+
const ARNet = isRevolver ? (summaries.receivable?.ARAvailability || 0) : 0;
|
|
387
|
+
const otherReserves = isRevolver ? getOtherValue(summaries.reserve) : 0;
|
|
388
|
+
const collateralAdjustments = isRevolver ? await this.getCollateralAdjustmentsForLastSignedBBC(borrowerId, date) : 0;
|
|
389
|
+
const totalCollateral = new decimal_js_1.default(inventoryAdvanceRate).sub(inventoryReserves).add(ARNet).add(otherReserves).add(collateralAdjustments).toNumber();
|
|
390
|
+
const loanBalanceRevolver = isRevolver ? balances.loanBalanceRevolver : 0;
|
|
391
|
+
const netRevolverAvailability = new decimal_js_1.default(totalCollateral).sub(loanBalanceRevolver).toNumber();
|
|
392
|
+
const productEquipmentSummary = !(isRevolver && hasTermProduct)
|
|
393
|
+
? manyTermProduct
|
|
394
|
+
? await this.equipmentService.getEquipmentSummaryForProduct(borrowerId, date, product._id.toString())
|
|
395
|
+
: (await this.equipmentService.getLatestEquipmentForDate(borrowerId, date)).summary
|
|
396
|
+
: null;
|
|
397
|
+
const equipmentCollateral = productEquipmentSummary ? productEquipmentSummary[equipment_types_enum_1.EEquipmentTypes.EQUIPMENT].amount : 0;
|
|
398
|
+
const intellectualProperty = productEquipmentSummary ? productEquipmentSummary[equipment_types_enum_1.EEquipmentTypes.INTELLECTUAL_PROPERTY].amount : 0;
|
|
399
|
+
const realEstate = productEquipmentSummary ? productEquipmentSummary[equipment_types_enum_1.EEquipmentTypes.REAL_ESTATE].amount : 0;
|
|
400
|
+
const bootCollateral = productEquipmentSummary ? productEquipmentSummary[equipment_types_enum_1.EEquipmentTypes.BOOT_COLLATERAL].amount : 0;
|
|
401
|
+
const termLoanReserves = !(isRevolver && hasTermProduct) ? summaries.reserve[reserve_types_enum_1.EReserveTypes.EQUIPMENT].amount : 0;
|
|
402
|
+
const loanTermBalance = !isRevolver ? balances.loanTermBalance : 0;
|
|
403
|
+
const netTermAvailability = new decimal_js_1.default(equipmentCollateral).sub(termLoanReserves).sub(loanTermBalance).toNumber();
|
|
404
|
+
const participantBalance = await this.loanChargesService.getParticipationBalance(product.code, date);
|
|
405
|
+
return {
|
|
406
|
+
...productMainData,
|
|
407
|
+
inventoryGrossValue,
|
|
408
|
+
inventoryAdvanceRate,
|
|
409
|
+
inventoryReserves,
|
|
410
|
+
inventoryNet,
|
|
411
|
+
ARGross,
|
|
412
|
+
ARAdvanceRate,
|
|
413
|
+
ARReserves,
|
|
414
|
+
ARNet,
|
|
415
|
+
otherReserves,
|
|
416
|
+
collateralAdjustments,
|
|
417
|
+
totalCollateral,
|
|
418
|
+
loanBalanceRevolver,
|
|
419
|
+
netRevolverAvailability,
|
|
420
|
+
equipmentCollateral,
|
|
421
|
+
intellectualProperty,
|
|
422
|
+
realEstate,
|
|
423
|
+
bootCollateral,
|
|
424
|
+
termLoanReserves,
|
|
425
|
+
loanTermBalance,
|
|
426
|
+
netTermAvailability,
|
|
427
|
+
participantBalance,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
}));
|
|
431
|
+
}));
|
|
432
|
+
return productsGrouped
|
|
433
|
+
.reduce((acc, group) => [...acc, ...group], [])
|
|
434
|
+
.filter((report) => !!report);
|
|
435
|
+
}
|
|
436
|
+
async getBalancesCollateralReportExcel(borrowerIds, date) {
|
|
437
|
+
const reportHeader = [
|
|
438
|
+
['PORTFOLIO LOAN BALANCE AND COLLATERAL REPORT'],
|
|
439
|
+
[`RUN DATE ${(0, date_helper_1.formatDate)(date)}`],
|
|
440
|
+
[''],
|
|
441
|
+
];
|
|
442
|
+
const keyOrder = [
|
|
443
|
+
'borrowerName',
|
|
444
|
+
'productCode',
|
|
445
|
+
'productType',
|
|
446
|
+
'commitment',
|
|
447
|
+
'startDate',
|
|
448
|
+
'maturityDate',
|
|
449
|
+
'inventoryGrossValue',
|
|
450
|
+
'inventoryAdvanceRate',
|
|
451
|
+
'inventoryReserves',
|
|
452
|
+
'inventoryNet',
|
|
453
|
+
'ARGross',
|
|
454
|
+
'ARAdvanceRate',
|
|
455
|
+
'ARReserves',
|
|
456
|
+
'ARNet',
|
|
457
|
+
'otherReserves',
|
|
458
|
+
'collateralAdjustments',
|
|
459
|
+
'totalCollateral',
|
|
460
|
+
'loanBalanceRevolver',
|
|
461
|
+
'netRevolverAvailability',
|
|
462
|
+
'equipmentCollateral',
|
|
463
|
+
'intellectualProperty',
|
|
464
|
+
'realEstate',
|
|
465
|
+
'bootCollateral',
|
|
466
|
+
'termLoanReserves',
|
|
467
|
+
'loanTermBalance',
|
|
468
|
+
'netTermAvailability',
|
|
469
|
+
'participantBalance',
|
|
470
|
+
'NAISC',
|
|
471
|
+
];
|
|
472
|
+
const tableHeader = {
|
|
473
|
+
borrowerName: 'Borrower name',
|
|
474
|
+
productCode: 'Product code',
|
|
475
|
+
productType: 'Product type',
|
|
476
|
+
commitment: 'Commitment',
|
|
477
|
+
startDate: 'Start Date',
|
|
478
|
+
maturityDate: 'Maturity Date',
|
|
479
|
+
inventoryGrossValue: 'Inventory Gross Value',
|
|
480
|
+
inventoryAdvanceRate: 'Inventory @ Advance Rate',
|
|
481
|
+
inventoryReserves: 'Inventory Reserves',
|
|
482
|
+
inventoryNet: 'Inventory Net',
|
|
483
|
+
ARGross: 'AR Gross',
|
|
484
|
+
ARAdvanceRate: 'AR Advance Rate',
|
|
485
|
+
ARReserves: 'AR Reserves',
|
|
486
|
+
ARNet: 'AR Net',
|
|
487
|
+
otherReserves: 'Other Reserves',
|
|
488
|
+
collateralAdjustments: 'Collateral Adjustments',
|
|
489
|
+
totalCollateral: 'Total Revolver Collateral',
|
|
490
|
+
loanBalanceRevolver: 'LOAN BALANCE Revolver',
|
|
491
|
+
netRevolverAvailability: 'Available to borrow',
|
|
492
|
+
equipmentCollateral: 'Equipment Collateral',
|
|
493
|
+
intellectualProperty: 'Intellectual Property',
|
|
494
|
+
realEstate: 'Real Estate',
|
|
495
|
+
bootCollateral: 'Boot Collateral',
|
|
496
|
+
termLoanReserves: 'Term Loan Reserves (total)',
|
|
497
|
+
loanTermBalance: 'LOAN BALANCE (Term products only)',
|
|
498
|
+
netTermAvailability: 'NET TERM AVAILABILITY',
|
|
499
|
+
participantBalance: 'Participant balance',
|
|
500
|
+
NAISC: 'NAISC Code',
|
|
501
|
+
};
|
|
502
|
+
const reportData = await this.generateBankPortfolioSummary(borrowerIds, date, {
|
|
503
|
+
useSignedBBC: true,
|
|
504
|
+
useStoredBalance: false,
|
|
505
|
+
});
|
|
506
|
+
const headerArray = Object.values(reorderObject(tableHeader, keyOrder));
|
|
507
|
+
const dataAsArrays = reportData.map((row) => Object.values(reorderObject(row, keyOrder)));
|
|
508
|
+
return await this.uploadsService.convertDataToFile([{ portfolio: [...reportHeader, headerArray, ...dataAsArrays] }]);
|
|
509
|
+
}
|
|
510
|
+
async getLedger(productIds, startDate, endDate, reportType, showFloatedBalance = true) {
|
|
511
|
+
const params = {
|
|
512
|
+
endDate,
|
|
513
|
+
productIds,
|
|
514
|
+
reportType,
|
|
515
|
+
startDate,
|
|
516
|
+
};
|
|
517
|
+
const options = { showBalances: showFloatedBalance, showFloatedBalance };
|
|
518
|
+
return (0, reports_db_1.getLedger)(params, options);
|
|
519
|
+
}
|
|
520
|
+
async getInvestorSummaryReport(selectedBorrowerIds, start, end) {
|
|
521
|
+
const startFormatted = (0, dayjs_1.default)(start).format(date_helper_1.defaultDateFormat);
|
|
522
|
+
const endFormatted = (0, dayjs_1.default)(end).format(date_helper_1.defaultDateFormat);
|
|
523
|
+
const keyOrder = [
|
|
524
|
+
'clientName',
|
|
525
|
+
'productName',
|
|
526
|
+
'maturityDate',
|
|
527
|
+
'commitmentAmount',
|
|
528
|
+
'balanceEnd',
|
|
529
|
+
'participationBalanceEnd',
|
|
530
|
+
'companyExposure',
|
|
531
|
+
'netAvailable',
|
|
532
|
+
'collectionsBetweenStartEnd',
|
|
533
|
+
'disbursementsBetweenStartEnd',
|
|
534
|
+
'availableToBorrow',
|
|
535
|
+
'ARNet',
|
|
536
|
+
'inventoryNet',
|
|
537
|
+
'otherCollateral',
|
|
538
|
+
'otherReservesAndAdjustments',
|
|
539
|
+
'totalRevolverCollateral',
|
|
540
|
+
'collectionsBetweenBeginningEnd',
|
|
541
|
+
'disbursementsBetweenBeginningEnd',
|
|
542
|
+
];
|
|
543
|
+
const header = [
|
|
544
|
+
['Report period'],
|
|
545
|
+
['From', startFormatted],
|
|
546
|
+
['To', endFormatted],
|
|
547
|
+
[''],
|
|
548
|
+
];
|
|
549
|
+
const tableHeader = {
|
|
550
|
+
clientName: 'Client name',
|
|
551
|
+
productName: 'Product name',
|
|
552
|
+
maturityDate: 'Maturity date',
|
|
553
|
+
commitmentAmount: 'Commitment amount',
|
|
554
|
+
balanceEnd: `Balance as at ${endFormatted}`,
|
|
555
|
+
participationBalanceEnd: `Participation balance as at ${endFormatted}`,
|
|
556
|
+
companyExposure: 'Exposure',
|
|
557
|
+
netAvailable: 'Net available',
|
|
558
|
+
collectionsBetweenStartEnd: `Collections between ${startFormatted} & ${endFormatted}`,
|
|
559
|
+
disbursementsBetweenStartEnd: `Disbursements between ${startFormatted} & ${endFormatted}`,
|
|
560
|
+
netRevolverAvailability: 'Available to borrow',
|
|
561
|
+
ARNet: 'AR net',
|
|
562
|
+
inventoryNet: 'Inventory net',
|
|
563
|
+
otherCollateral: 'Other collateral (sum of equipment, ip, real estate, boot )',
|
|
564
|
+
otherReservesAndAdjustments: 'Other Reserves & Adjustments',
|
|
565
|
+
totalRevolver: 'Total revolver collateral + total equipment & ip collateral)',
|
|
566
|
+
collectionsBetweenBeginningEnd: `Collections between beginning to ${endFormatted}`,
|
|
567
|
+
disbursementsBetweenBeginningEnd: `Disbursements between beginning to ${endFormatted}`,
|
|
568
|
+
};
|
|
569
|
+
const data = await this.investorSummaryService.getInvestorSummaryData(selectedBorrowerIds, start, end);
|
|
570
|
+
const headerArray = Object.values(reorderObject(tableHeader, keyOrder));
|
|
571
|
+
const dataAsArrays = data.map((row) => Object.values(reorderObject(row, keyOrder)));
|
|
572
|
+
return [{ report: [...header, headerArray, ...dataAsArrays] }];
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
exports.ReportsService = ReportsService;
|
|
576
|
+
function reorderObject(obj, keyOrder) {
|
|
577
|
+
const reorderedObject = {};
|
|
578
|
+
keyOrder.forEach(key => {
|
|
579
|
+
if (Object.hasOwn(obj, key)) {
|
|
580
|
+
reorderedObject[key] = obj[key];
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
return reorderedObject;
|
|
584
|
+
}
|