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,120 @@
|
|
|
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.EquipmentService = void 0;
|
|
7
|
+
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
8
|
+
const dayjs_1 = __importDefault(require("dayjs"));
|
|
9
|
+
const equipment_types_enum_1 = require("../enums/equipment-types.enum");
|
|
10
|
+
const BBCDate_model_1 = require("../models/BBCDate.model");
|
|
11
|
+
const equipment_db_1 = require("../db/equipment.db");
|
|
12
|
+
class EquipmentService {
|
|
13
|
+
lockService;
|
|
14
|
+
constructor(lockService) {
|
|
15
|
+
this.lockService = lockService;
|
|
16
|
+
}
|
|
17
|
+
async getEquipmentDates(borrowerId) {
|
|
18
|
+
const equipments = await (0, equipment_db_1.getEquipmentDates)(borrowerId);
|
|
19
|
+
return equipments.map((equipment) => (0, dayjs_1.default)(equipment.date).format('YYYY-MM-DD'));
|
|
20
|
+
}
|
|
21
|
+
async getEquipmentForDate(borrowerId, date) {
|
|
22
|
+
const equipment = await (0, equipment_db_1.getEquipment)(borrowerId, date);
|
|
23
|
+
if (!equipment) {
|
|
24
|
+
const lastItems = [];
|
|
25
|
+
const summary = this.calculateSummary(lastItems);
|
|
26
|
+
return await (0, equipment_db_1.copyEquipmentWithoutSaving)(borrowerId, date, lastItems, summary);
|
|
27
|
+
}
|
|
28
|
+
return equipment;
|
|
29
|
+
}
|
|
30
|
+
async getLatestEquipmentForDate(borrowerId, date) {
|
|
31
|
+
const equipment = await (0, equipment_db_1.getLatestEquipments)(borrowerId, date);
|
|
32
|
+
if (!equipment.length) {
|
|
33
|
+
const lastItems = [];
|
|
34
|
+
const summary = this.calculateSummary(lastItems);
|
|
35
|
+
return await (0, equipment_db_1.copyEquipmentWithoutSaving)(borrowerId, date, lastItems, summary);
|
|
36
|
+
}
|
|
37
|
+
return equipment[0];
|
|
38
|
+
}
|
|
39
|
+
async getEquipmentSummaryForProduct(borrowerId, date, productId) {
|
|
40
|
+
const equipment = await (0, equipment_db_1.getEquipment)(borrowerId, date);
|
|
41
|
+
const lastItems = equipment
|
|
42
|
+
? equipment.items.filter((item) => item.productId.toString() === productId)
|
|
43
|
+
: [];
|
|
44
|
+
return this.calculateSummary(lastItems);
|
|
45
|
+
}
|
|
46
|
+
async getEquipmentForBBC(bbcDateId) {
|
|
47
|
+
if (!bbcDateId) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const bbcDateDoc = await BBCDate_model_1.BBCDateModel.findById(bbcDateId).lean();
|
|
51
|
+
const { bbcDate, borrowerId } = bbcDateDoc;
|
|
52
|
+
const equipmentDocs = await (0, equipment_db_1.getLatestEquipments)(borrowerId.toString(), bbcDate);
|
|
53
|
+
if (equipmentDocs.length) {
|
|
54
|
+
return equipmentDocs.pop();
|
|
55
|
+
}
|
|
56
|
+
const emptySummary = this.calculateSummary([]);
|
|
57
|
+
return { borrowerId, date: bbcDate, items: [], summary: emptySummary };
|
|
58
|
+
}
|
|
59
|
+
async saveAndReturnEquipment(borrowerId, date, items) {
|
|
60
|
+
const isBBCLockedResult = await this.lockService.isDateLocked(date, borrowerId);
|
|
61
|
+
if (isBBCLockedResult) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const summary = this.calculateSummary(items);
|
|
65
|
+
return await (0, equipment_db_1.saveEquipmentDoc)(borrowerId, date, items, summary);
|
|
66
|
+
}
|
|
67
|
+
async deleteEquipment(borrowerId, date) {
|
|
68
|
+
const isBBCLockedResult = await this.lockService.isDateLocked(date, borrowerId);
|
|
69
|
+
if (isBBCLockedResult) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
await (0, equipment_db_1.deleteEquipment)(borrowerId, date);
|
|
73
|
+
}
|
|
74
|
+
async getLastCopyEquipmentItems(borrowerId, date) {
|
|
75
|
+
const equipment = await (0, equipment_db_1.getLatestEquipments)(borrowerId, date);
|
|
76
|
+
if (equipment.length) {
|
|
77
|
+
return equipment.pop().items;
|
|
78
|
+
}
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
calculateSummary(equipmentItems) {
|
|
82
|
+
const netTotalTypes = [equipment_types_enum_1.EEquipmentTypes.EQUIPMENT, equipment_types_enum_1.EEquipmentTypes.REAL_ESTATE, equipment_types_enum_1.EEquipmentTypes.BOOT_COLLATERAL];
|
|
83
|
+
const summary = [];
|
|
84
|
+
const result = Object.keys(equipment_types_enum_1.EEquipmentTypes).map((equipmentType) => {
|
|
85
|
+
const typeSummary = { rowDef: equipmentType, amount: 0, advanceRate: 0, availability: 0 };
|
|
86
|
+
equipmentItems.forEach((item) => {
|
|
87
|
+
if (item.type === equipmentType) {
|
|
88
|
+
typeSummary.amount = new decimal_js_1.default(typeSummary.amount).add(item.amount).toNumber();
|
|
89
|
+
typeSummary.availability = new decimal_js_1.default(item.advanceRate).mul(item.amount).add(typeSummary.availability).toNumber();
|
|
90
|
+
typeSummary.advanceRate = typeSummary.amount === 0 ? 0 : new decimal_js_1.default(typeSummary.availability).div(typeSummary.amount).toDP(4).toNumber();
|
|
91
|
+
}
|
|
92
|
+
return typeSummary;
|
|
93
|
+
}, typeSummary);
|
|
94
|
+
return typeSummary;
|
|
95
|
+
});
|
|
96
|
+
netTotalTypes.forEach((type) => {
|
|
97
|
+
summary.push(...result.filter((r) => r.rowDef === type));
|
|
98
|
+
});
|
|
99
|
+
const calculateSummaryField = (acc, item) => {
|
|
100
|
+
acc.amount = new decimal_js_1.default(acc.amount).add(item.amount).toNumber();
|
|
101
|
+
acc.availability = new decimal_js_1.default(acc.availability).add(item.availability).toNumber();
|
|
102
|
+
acc.advanceRate = acc.amount === 0 ? 0 : new decimal_js_1.default(acc.availability).div(acc.amount).toDP(4).toNumber();
|
|
103
|
+
return acc;
|
|
104
|
+
};
|
|
105
|
+
const netTotal = result.reduce((acc, e) => {
|
|
106
|
+
if (netTotalTypes.includes(e.rowDef)) {
|
|
107
|
+
acc = calculateSummaryField(acc, e);
|
|
108
|
+
}
|
|
109
|
+
return acc;
|
|
110
|
+
}, { rowDef: 'netTotal', amount: 0, advanceRate: 0, availability: 0 });
|
|
111
|
+
summary.push(netTotal);
|
|
112
|
+
summary.push(...result.filter((r) => r.rowDef === equipment_types_enum_1.EEquipmentTypes.INTELLECTUAL_PROPERTY));
|
|
113
|
+
const grossTotal = result.reduce((acc, e) => {
|
|
114
|
+
return calculateSummaryField(acc, e);
|
|
115
|
+
}, { rowDef: 'grossTotal', amount: 0, advanceRate: 0, availability: 0 });
|
|
116
|
+
summary.push(grossTotal);
|
|
117
|
+
return summary.reduce((acc, s) => ({ ...acc, [s.rowDef]: s }), {});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.EquipmentService = EquipmentService;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import Decimal from 'decimal.js';
|
|
2
|
+
import dayjs from 'dayjs';
|
|
3
|
+
|
|
4
|
+
import { EEquipmentTypes } from '../enums/equipment-types.enum';
|
|
5
|
+
import { BBCDateModel } from '../models/BBCDate.model';
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
copyEquipmentWithoutSaving,
|
|
9
|
+
deleteEquipment,
|
|
10
|
+
getEquipment,
|
|
11
|
+
getEquipmentDates,
|
|
12
|
+
getLatestEquipments,
|
|
13
|
+
saveEquipmentDoc,
|
|
14
|
+
} from '../db/equipment.db';
|
|
15
|
+
import { IEquipment, IEquipmentItem, IEquipmentSummary } from '../models/Equipment.model';
|
|
16
|
+
import { LockService } from './lock.service';
|
|
17
|
+
|
|
18
|
+
interface ISummaryItem {
|
|
19
|
+
rowDef: string;
|
|
20
|
+
amount: number;
|
|
21
|
+
advanceRate: number;
|
|
22
|
+
availability: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class EquipmentService {
|
|
26
|
+
|
|
27
|
+
constructor(
|
|
28
|
+
private readonly lockService: LockService,
|
|
29
|
+
) {
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async getEquipmentDates(borrowerId: string): Promise<string[]> {
|
|
33
|
+
const equipments = await getEquipmentDates(borrowerId);
|
|
34
|
+
return equipments.map((equipment) => dayjs(equipment.date).format('YYYY-MM-DD'));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async getEquipmentForDate(borrowerId: string, date: Date): Promise<IEquipment> {
|
|
38
|
+
const equipment = await getEquipment(borrowerId, date);
|
|
39
|
+
if (!equipment) {
|
|
40
|
+
const lastItems = [];
|
|
41
|
+
const summary = this.calculateSummary(lastItems);
|
|
42
|
+
return await copyEquipmentWithoutSaving(borrowerId, date, lastItems, summary);
|
|
43
|
+
}
|
|
44
|
+
return equipment;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async getLatestEquipmentForDate(borrowerId: string, date: Date): Promise<IEquipment> {
|
|
48
|
+
const equipment = await getLatestEquipments(borrowerId, date);
|
|
49
|
+
if (!equipment.length) {
|
|
50
|
+
const lastItems = [];
|
|
51
|
+
const summary = this.calculateSummary(lastItems);
|
|
52
|
+
return await copyEquipmentWithoutSaving(borrowerId, date, lastItems, summary);
|
|
53
|
+
}
|
|
54
|
+
return equipment[0];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async getEquipmentSummaryForProduct(borrowerId: string, date: Date, productId: string): Promise<IEquipmentSummary> {
|
|
58
|
+
const equipment = await getEquipment(borrowerId, date);
|
|
59
|
+
const lastItems = equipment
|
|
60
|
+
? equipment.items.filter((item) => item.productId.toString() === productId)
|
|
61
|
+
: [];
|
|
62
|
+
return this.calculateSummary(lastItems);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async getEquipmentForBBC(bbcDateId: string): Promise<IEquipment> {
|
|
66
|
+
if (!bbcDateId) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const bbcDateDoc = await BBCDateModel.findById(bbcDateId).lean();
|
|
70
|
+
const { bbcDate, borrowerId } = bbcDateDoc;
|
|
71
|
+
const equipmentDocs = await getLatestEquipments(borrowerId.toString(), bbcDate);
|
|
72
|
+
if (equipmentDocs.length) {
|
|
73
|
+
return equipmentDocs.pop();
|
|
74
|
+
}
|
|
75
|
+
const emptySummary = this.calculateSummary([]);
|
|
76
|
+
return { borrowerId, date: bbcDate, items: [], summary: emptySummary };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async saveAndReturnEquipment(borrowerId: string, date: Date, items: IEquipmentItem[]) {
|
|
80
|
+
const isBBCLockedResult = await this.lockService.isDateLocked(date, borrowerId);
|
|
81
|
+
if (isBBCLockedResult) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const summary = this.calculateSummary(items);
|
|
85
|
+
return await saveEquipmentDoc(borrowerId, date, items, summary);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async deleteEquipment(borrowerId: string, date: Date) {
|
|
89
|
+
const isBBCLockedResult = await this.lockService.isDateLocked(date, borrowerId);
|
|
90
|
+
if (isBBCLockedResult) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
await deleteEquipment(borrowerId, date);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async getLastCopyEquipmentItems(borrowerId: string, date: Date) {
|
|
97
|
+
const equipment = await getLatestEquipments(borrowerId, date);
|
|
98
|
+
if (equipment.length) {
|
|
99
|
+
return equipment.pop().items;
|
|
100
|
+
}
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private calculateSummary(equipmentItems: IEquipmentItem[]): IEquipmentSummary {
|
|
105
|
+
const netTotalTypes: string[] = [EEquipmentTypes.EQUIPMENT, EEquipmentTypes.REAL_ESTATE, EEquipmentTypes.BOOT_COLLATERAL];
|
|
106
|
+
const summary: ISummaryItem[] = [];
|
|
107
|
+
|
|
108
|
+
const result = Object.keys(EEquipmentTypes).map((equipmentType) => {
|
|
109
|
+
const typeSummary = <ISummaryItem>{ rowDef: equipmentType, amount: 0, advanceRate: 0, availability: 0 };
|
|
110
|
+
equipmentItems.forEach((item) => {
|
|
111
|
+
if (item.type === equipmentType) {
|
|
112
|
+
typeSummary.amount = new Decimal(typeSummary.amount).add(item.amount).toNumber();
|
|
113
|
+
typeSummary.availability = new Decimal(item.advanceRate).mul(item.amount).add(typeSummary.availability).toNumber();
|
|
114
|
+
typeSummary.advanceRate = typeSummary.amount === 0 ? 0 : new Decimal(typeSummary.availability).div(typeSummary.amount).toDP(4).toNumber();
|
|
115
|
+
}
|
|
116
|
+
return typeSummary;
|
|
117
|
+
}, typeSummary);
|
|
118
|
+
return typeSummary;
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
netTotalTypes.forEach((type) => {
|
|
122
|
+
summary.push(...result.filter((r) => r.rowDef === type));
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
const calculateSummaryField = (acc: ISummaryItem, item: ISummaryItem) => {
|
|
126
|
+
acc.amount = new Decimal(acc.amount).add(item.amount).toNumber();
|
|
127
|
+
acc.availability = new Decimal(acc.availability).add(item.availability).toNumber();
|
|
128
|
+
acc.advanceRate = acc.amount === 0 ? 0 : new Decimal(acc.availability).div(acc.amount).toDP(4).toNumber();
|
|
129
|
+
return acc;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const netTotal = result.reduce((acc, e) => {
|
|
133
|
+
if (netTotalTypes.includes(e.rowDef)) {
|
|
134
|
+
acc = calculateSummaryField(acc, e);
|
|
135
|
+
}
|
|
136
|
+
return acc;
|
|
137
|
+
}, { rowDef: 'netTotal', amount: 0, advanceRate: 0, availability: 0 });
|
|
138
|
+
summary.push(netTotal);
|
|
139
|
+
|
|
140
|
+
summary.push(...result.filter((r) => r.rowDef === EEquipmentTypes.INTELLECTUAL_PROPERTY));
|
|
141
|
+
|
|
142
|
+
const grossTotal = result.reduce((acc, e) => {
|
|
143
|
+
return calculateSummaryField(acc, e);
|
|
144
|
+
}, { rowDef: 'grossTotal', amount: 0, advanceRate: 0, availability: 0 });
|
|
145
|
+
summary.push(grossTotal);
|
|
146
|
+
return summary.reduce((acc, s) => ({ ...acc, [s.rowDef]: s }), {});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
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 from 'mongoose';
|
|
26
|
+
import { IBorrowerDocument } from '../models/Borrower.model';
|
|
27
|
+
import { IComplianceFile } from '../models/ComplianceItem.model';
|
|
28
|
+
import { ComplianceBorrowersService } from './compliance-borrowers.service';
|
|
29
|
+
export type BorrowerWithFiles = {
|
|
30
|
+
_id: mongoose.Types.ObjectId;
|
|
31
|
+
borrower: IBorrowerDocument;
|
|
32
|
+
files: IComplianceFile[];
|
|
33
|
+
};
|
|
34
|
+
export declare class FileManagerService {
|
|
35
|
+
private readonly getComplianceBorrowersService;
|
|
36
|
+
constructor(getComplianceBorrowersService: () => ComplianceBorrowersService);
|
|
37
|
+
getAwsFileId(borrowerId: string, instanceId: string, fileId: string): Promise<any>;
|
|
38
|
+
uploadFile(complianceBorrowerId: string, instanceId: string, originalName: string, uuid: string, user: any): Promise<void>;
|
|
39
|
+
findItemByInstanceId(instanceId: any): Promise<any[]>;
|
|
40
|
+
getFilesNewerThanDate(date: Date): Promise<BorrowerWithFiles[]>;
|
|
41
|
+
deleteFile(complianceBorrowerId: string, fileId: string): Promise<void>;
|
|
42
|
+
getFilesByBorrowerId(borrowerId: string): Promise<import("../models/ComplianceItem.model").IBorrowerItemDocument[]>;
|
|
43
|
+
updateAWSID(itemId: any, instanceId: any, fileId: any, awsFileId: any): Promise<void>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
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.FileManagerService = void 0;
|
|
7
|
+
const mongoose_1 = __importDefault(require("mongoose"));
|
|
8
|
+
const BorrowerCompliance_model_1 = require("../models/BorrowerCompliance.model");
|
|
9
|
+
class FileManagerService {
|
|
10
|
+
getComplianceBorrowersService;
|
|
11
|
+
constructor(getComplianceBorrowersService) {
|
|
12
|
+
this.getComplianceBorrowersService = getComplianceBorrowersService;
|
|
13
|
+
}
|
|
14
|
+
async getAwsFileId(borrowerId, instanceId, fileId) {
|
|
15
|
+
try {
|
|
16
|
+
const borrower = await BorrowerCompliance_model_1.BorrowerCompliance
|
|
17
|
+
.findOne({ '_id': borrowerId, 'items.instances._id': instanceId, 'items.instances.files._id': fileId })
|
|
18
|
+
.select('+items.instances.files.fileId');
|
|
19
|
+
if (borrower) {
|
|
20
|
+
const files = borrower.items.reduce((acc, item) => {
|
|
21
|
+
return [...acc, ...item.instances.reduce((accI, instance) => {
|
|
22
|
+
return [...accI, ...instance.files];
|
|
23
|
+
}, [])];
|
|
24
|
+
}, []);
|
|
25
|
+
const foundFile = files.find((file) => file._id.toString() === fileId);
|
|
26
|
+
return foundFile.fileId;
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
console.error(e);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async uploadFile(complianceBorrowerId, instanceId, originalName, uuid, user) {
|
|
36
|
+
try {
|
|
37
|
+
const items = await this.findItemByInstanceId(instanceId);
|
|
38
|
+
if (items.length > 0) {
|
|
39
|
+
const itemId = items.pop().items._id;
|
|
40
|
+
await BorrowerCompliance_model_1.BorrowerCompliance
|
|
41
|
+
.findOneAndUpdate({ _id: complianceBorrowerId }, {
|
|
42
|
+
$set: {
|
|
43
|
+
'items.$[item].instances.$[instance].submittedDate': (new Date()).toISOString(),
|
|
44
|
+
'items.$[item].instances.$[instance].status': 'IN_REVIEW',
|
|
45
|
+
},
|
|
46
|
+
$push: {
|
|
47
|
+
'items.$[item].instances.$[instance].files': {
|
|
48
|
+
'fileId': uuid,
|
|
49
|
+
'name': originalName,
|
|
50
|
+
'isNew': true,
|
|
51
|
+
'uploadedAt': new Date(),
|
|
52
|
+
'uploadedBy': user?._id,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
}, {
|
|
56
|
+
arrayFilters: [
|
|
57
|
+
{ 'item._id': itemId },
|
|
58
|
+
{ 'instance._id': new mongoose_1.default.Types.ObjectId(instanceId) },
|
|
59
|
+
],
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
console.error(e);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async findItemByInstanceId(instanceId) {
|
|
68
|
+
return BorrowerCompliance_model_1.BorrowerCompliance.aggregate([
|
|
69
|
+
{ $unwind: '$items' },
|
|
70
|
+
{ $unwind: '$items.instances' },
|
|
71
|
+
{ $match: { 'items.instances._id': new mongoose_1.default.Types.ObjectId(instanceId) } },
|
|
72
|
+
]);
|
|
73
|
+
}
|
|
74
|
+
async getFilesNewerThanDate(date) {
|
|
75
|
+
const borrowerWithFiles = await BorrowerCompliance_model_1.BorrowerCompliance.aggregate([
|
|
76
|
+
{ $unwind: '$items' },
|
|
77
|
+
{ $unwind: '$items.instances' },
|
|
78
|
+
{ $unwind: '$items.instances.files' },
|
|
79
|
+
{ $match: { 'items.instances.files.uploadedAt': { $gte: new Date(date) } } },
|
|
80
|
+
{
|
|
81
|
+
$group: {
|
|
82
|
+
_id: '$_id',
|
|
83
|
+
borrower: { $first: '$borrower' },
|
|
84
|
+
files: { $addToSet: '$items.instances.files' },
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
]);
|
|
88
|
+
return await BorrowerCompliance_model_1.BorrowerCompliance.populate(borrowerWithFiles, { path: 'borrower' });
|
|
89
|
+
}
|
|
90
|
+
async deleteFile(complianceBorrowerId, fileId) {
|
|
91
|
+
try {
|
|
92
|
+
await BorrowerCompliance_model_1.BorrowerCompliance
|
|
93
|
+
.findOneAndUpdate({ _id: complianceBorrowerId }, { '$pull': { 'items.$[].instances.$[].files': { _id: fileId } } });
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
console.error(e);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async getFilesByBorrowerId(borrowerId) {
|
|
100
|
+
const foundComplianceBorrower = await BorrowerCompliance_model_1.BorrowerCompliance
|
|
101
|
+
.findOne({ borrower: borrowerId })
|
|
102
|
+
.select('+items.instances.files.fileId');
|
|
103
|
+
return foundComplianceBorrower ? foundComplianceBorrower.items : [];
|
|
104
|
+
}
|
|
105
|
+
async updateAWSID(itemId, instanceId, fileId, awsFileId) {
|
|
106
|
+
const complianceBorrowersService = this.getComplianceBorrowersService();
|
|
107
|
+
const complianceBorrower = await complianceBorrowersService.getBorrowerByInstanceId(instanceId);
|
|
108
|
+
await BorrowerCompliance_model_1.BorrowerCompliance
|
|
109
|
+
.findOneAndUpdate({ _id: complianceBorrower._id }, {
|
|
110
|
+
$set: { 'items.$[item].instances.$[instance].files.$[file].fileId': awsFileId },
|
|
111
|
+
}, {
|
|
112
|
+
arrayFilters: [
|
|
113
|
+
{ 'item.item': itemId },
|
|
114
|
+
{ 'instance._id': new mongoose_1.default.Types.ObjectId(instanceId) },
|
|
115
|
+
{ 'file._id': new mongoose_1.default.Types.ObjectId(fileId) },
|
|
116
|
+
],
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.FileManagerService = FileManagerService;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
|
|
3
|
+
import { BorrowerCompliance } from '../models/BorrowerCompliance.model';
|
|
4
|
+
import { IBorrowerDocument } from '../models/Borrower.model';
|
|
5
|
+
import { IComplianceFile } from '../models/ComplianceItem.model';
|
|
6
|
+
|
|
7
|
+
import { ComplianceBorrowersService } from './compliance-borrowers.service';
|
|
8
|
+
|
|
9
|
+
export type BorrowerWithFiles = {
|
|
10
|
+
_id: mongoose.Types.ObjectId;
|
|
11
|
+
borrower: IBorrowerDocument;
|
|
12
|
+
files: IComplianceFile[]
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class FileManagerService {
|
|
16
|
+
|
|
17
|
+
constructor(
|
|
18
|
+
private readonly getComplianceBorrowersService: () => ComplianceBorrowersService,
|
|
19
|
+
) {
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async getAwsFileId(borrowerId: string, instanceId: string, fileId: string): Promise<any> {
|
|
23
|
+
try {
|
|
24
|
+
const borrower = await BorrowerCompliance
|
|
25
|
+
.findOne({ '_id': borrowerId, 'items.instances._id': instanceId, 'items.instances.files._id': fileId })
|
|
26
|
+
.select('+items.instances.files.fileId');
|
|
27
|
+
if (borrower) {
|
|
28
|
+
const files = borrower.items.reduce((acc, item) => {
|
|
29
|
+
return [...acc, ...item.instances.reduce((accI, instance) => {
|
|
30
|
+
return [...accI, ...instance.files];
|
|
31
|
+
}, [])];
|
|
32
|
+
}, []);
|
|
33
|
+
const foundFile = files.find((file) => file._id.toString() === fileId);
|
|
34
|
+
return foundFile.fileId;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
} catch (e) {
|
|
38
|
+
console.error(e);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async uploadFile(complianceBorrowerId: string, instanceId: string, originalName: string, uuid: string, user): Promise<void> {
|
|
44
|
+
try {
|
|
45
|
+
const items = await this.findItemByInstanceId(instanceId);
|
|
46
|
+
if (items.length > 0) {
|
|
47
|
+
const itemId = items.pop().items._id;
|
|
48
|
+
await BorrowerCompliance
|
|
49
|
+
.findOneAndUpdate(
|
|
50
|
+
{ _id: complianceBorrowerId },
|
|
51
|
+
{
|
|
52
|
+
$set: {
|
|
53
|
+
'items.$[item].instances.$[instance].submittedDate': (new Date()).toISOString(),
|
|
54
|
+
'items.$[item].instances.$[instance].status': 'IN_REVIEW',
|
|
55
|
+
},
|
|
56
|
+
$push:
|
|
57
|
+
{
|
|
58
|
+
'items.$[item].instances.$[instance].files':
|
|
59
|
+
{
|
|
60
|
+
'fileId': uuid,
|
|
61
|
+
'name': originalName,
|
|
62
|
+
'isNew': true,
|
|
63
|
+
'uploadedAt': new Date(),
|
|
64
|
+
'uploadedBy': user?._id,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
arrayFilters: [
|
|
70
|
+
{ 'item._id': itemId },
|
|
71
|
+
{ 'instance._id': new mongoose.Types.ObjectId(instanceId) },
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
} catch (e) {
|
|
78
|
+
console.error(e);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async findItemByInstanceId(instanceId) {
|
|
83
|
+
return BorrowerCompliance.aggregate([
|
|
84
|
+
{ $unwind: '$items' },
|
|
85
|
+
{ $unwind: '$items.instances' },
|
|
86
|
+
{ $match: { 'items.instances._id': new mongoose.Types.ObjectId(instanceId) } },
|
|
87
|
+
]);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async getFilesNewerThanDate(date: Date): Promise<BorrowerWithFiles[]> {
|
|
91
|
+
const borrowerWithFiles: BorrowerWithFiles[] = await BorrowerCompliance.aggregate([
|
|
92
|
+
{ $unwind: '$items' },
|
|
93
|
+
{ $unwind: '$items.instances' },
|
|
94
|
+
{ $unwind: '$items.instances.files' },
|
|
95
|
+
{ $match: { 'items.instances.files.uploadedAt': { $gte: new Date(date) } } },
|
|
96
|
+
{
|
|
97
|
+
$group:
|
|
98
|
+
{
|
|
99
|
+
_id: '$_id',
|
|
100
|
+
borrower: { $first: '$borrower' },
|
|
101
|
+
files: { $addToSet: '$items.instances.files' },
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
]);
|
|
105
|
+
return (await BorrowerCompliance.populate(borrowerWithFiles, { path: 'borrower' }) as unknown[]) as BorrowerWithFiles[];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async deleteFile(complianceBorrowerId: string, fileId: string): Promise<void> {
|
|
109
|
+
try {
|
|
110
|
+
await BorrowerCompliance
|
|
111
|
+
.findOneAndUpdate(
|
|
112
|
+
{ _id: complianceBorrowerId },
|
|
113
|
+
{ '$pull': { 'items.$[].instances.$[].files': { _id: fileId } } },
|
|
114
|
+
);
|
|
115
|
+
} catch (e) {
|
|
116
|
+
console.error(e);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async getFilesByBorrowerId(borrowerId: string) {
|
|
121
|
+
const foundComplianceBorrower = await BorrowerCompliance
|
|
122
|
+
.findOne({ borrower: borrowerId })
|
|
123
|
+
.select('+items.instances.files.fileId');
|
|
124
|
+
return foundComplianceBorrower ? foundComplianceBorrower.items : [];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async updateAWSID(itemId, instanceId, fileId, awsFileId) {
|
|
128
|
+
const complianceBorrowersService = this.getComplianceBorrowersService();
|
|
129
|
+
const complianceBorrower = await complianceBorrowersService.getBorrowerByInstanceId(instanceId);
|
|
130
|
+
await BorrowerCompliance
|
|
131
|
+
.findOneAndUpdate(
|
|
132
|
+
{ _id: complianceBorrower._id },
|
|
133
|
+
{
|
|
134
|
+
$set: { 'items.$[item].instances.$[instance].files.$[file].fileId': awsFileId },
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
arrayFilters: [
|
|
138
|
+
{ 'item.item': itemId },
|
|
139
|
+
{ 'instance._id': new mongoose.Types.ObjectId(instanceId) },
|
|
140
|
+
{ 'file._id': new mongoose.Types.ObjectId(fileId) },
|
|
141
|
+
],
|
|
142
|
+
},
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
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 { IFinancialComplianceBorrowerDocument, IFinancialComplianceBorrowerDocumentWithEmailingStatus, IFinancialComplianceBorrowerSettings } from '../models/FinancialComplianceBorrower.model';
|
|
27
|
+
import { IFinancialComplianceSettings, IFinancialComplianceSettingsDocument } from '../models/FinancialCompliance.model';
|
|
28
|
+
import { NodemailerService } from './nodemailer.service';
|
|
29
|
+
import { GlobalsRepository } from '../repositories/globals.repository';
|
|
30
|
+
import { GlobalsService } from './globals.service';
|
|
31
|
+
import { LoanStatementService } from './loan-statement.service';
|
|
32
|
+
import { OrganizationsService } from './organizations.service';
|
|
33
|
+
export declare class FinancialComplianceService {
|
|
34
|
+
private readonly globalsRepository;
|
|
35
|
+
private readonly globalsService;
|
|
36
|
+
private readonly getLoanStatementService;
|
|
37
|
+
private readonly getNodemailerService;
|
|
38
|
+
private readonly organizationsService;
|
|
39
|
+
constructor(globalsRepository: GlobalsRepository, globalsService: GlobalsService, getLoanStatementService: () => LoanStatementService, getNodemailerService: () => NodemailerService, organizationsService: OrganizationsService);
|
|
40
|
+
getFinancialComplianceSettings(): Promise<IFinancialComplianceSettingsDocument>;
|
|
41
|
+
updateSettings(newSettings: IFinancialComplianceSettings): Promise<import("mongoose").Document<unknown, {}, IFinancialComplianceSettingsDocument> & IFinancialComplianceSettingsDocument & {
|
|
42
|
+
_id: import("mongoose").Types.ObjectId;
|
|
43
|
+
}>;
|
|
44
|
+
refreshFinancial(): Promise<unknown>;
|
|
45
|
+
refillFinancial(): Promise<null>;
|
|
46
|
+
sendFinancialReminders(ids?: string): Promise<void>;
|
|
47
|
+
sendExternalReminder(ids: string, ignoreRules: boolean): Promise<any>;
|
|
48
|
+
sendInternalReminders(remindedBorrowers: any, stopFundingBorrowers: any): Promise<void>;
|
|
49
|
+
createEmptyBorrower(borrowerId: string): Promise<void>;
|
|
50
|
+
removeBorrower(borrowerId: string): Promise<void>;
|
|
51
|
+
getAllFinancialComplianceBorrowers(): Promise<IFinancialComplianceBorrowerDocumentWithEmailingStatus[]>;
|
|
52
|
+
updateBorrower(id: string, updatedBorrower: IFinancialComplianceBorrowerSettings): Promise<IFinancialComplianceBorrowerDocument>;
|
|
53
|
+
updateLastReminder(financialBorrowerId: string): Promise<void>;
|
|
54
|
+
sendPlaidReminders(): Promise<string[]>;
|
|
55
|
+
getFinancialComplianceBorrower(borrowerId: string): Promise<import("mongoose").FlattenMaps<IFinancialComplianceBorrowerDocument> & {
|
|
56
|
+
_id: import("mongoose").Types.ObjectId;
|
|
57
|
+
}>;
|
|
58
|
+
}
|