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,334 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
import dayjs from 'dayjs';
|
|
3
|
+
import Decimal from 'decimal.js';
|
|
4
|
+
|
|
5
|
+
import { ILoanTransactionDoc, LoanTransaction } from '../models/LoanTransaction.model';
|
|
6
|
+
import { defaultDateFormat, formatDate } from '../helpers/date.helper';
|
|
7
|
+
import { formatNumbers } from '../helpers/numbers.helper';
|
|
8
|
+
import { BorrowerCompliance } from '../models/BorrowerCompliance.model';
|
|
9
|
+
import { EComplianceItemStatus } from '../models/ComplianceItem.model';
|
|
10
|
+
import { getBBCSheetsByTypeGroupedByBBC } from '../db/bbcSheets.db';
|
|
11
|
+
import { ECollaterals } from '../enums/collaterals.enum';
|
|
12
|
+
import { ELoanTypes } from '../enums/loan-types.enum';
|
|
13
|
+
import { getReceivableItemsCustomerAndValue } from '../db/receivables.db';
|
|
14
|
+
import {
|
|
15
|
+
getBBCDatesByBorrower,
|
|
16
|
+
getBBCDatesForPeriod,
|
|
17
|
+
getLatestSignedBBCDateDoc,
|
|
18
|
+
} from '../db/bbcDates.db';
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
BorrowerSummary,
|
|
22
|
+
EChartNames,
|
|
23
|
+
ETableNames,
|
|
24
|
+
IBorrowerSummary,
|
|
25
|
+
IBorrowerSummaryDoc,
|
|
26
|
+
} from '../models/BorrowerSummary.model';
|
|
27
|
+
import { getInventoryItemsSKUAndValue } from '../db/inventories';
|
|
28
|
+
import { AvailabilityService } from './availability.service';
|
|
29
|
+
import { BorrowerService } from './borrowers.service';
|
|
30
|
+
import { InventoryService } from './inventory.service';
|
|
31
|
+
import { LoanChargesService } from './loan-charges.service';
|
|
32
|
+
import { LoanTransactionsService } from './loan-transactions.service';
|
|
33
|
+
import { ReportsService } from './reports.service';
|
|
34
|
+
|
|
35
|
+
export class BorrowerSummaryService {
|
|
36
|
+
|
|
37
|
+
constructor(
|
|
38
|
+
private readonly availabilityService: AvailabilityService,
|
|
39
|
+
private readonly borrowerService: BorrowerService,
|
|
40
|
+
private readonly inventoryService: InventoryService,
|
|
41
|
+
private readonly loanChargesService: LoanChargesService,
|
|
42
|
+
private readonly loanTransactionsService: LoanTransactionsService,
|
|
43
|
+
private readonly reportsService: ReportsService,
|
|
44
|
+
) {
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async getBorrowerSummary(borrowerId: string): Promise<IBorrowerSummaryDoc> {
|
|
48
|
+
return BorrowerSummary.findOne({ borrowerId });
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private async getHighLevelTable(borrowerId: string, useSignedBBC: boolean) {
|
|
52
|
+
const extraInfo = await this.borrowerService.getExtraInfo(borrowerId);
|
|
53
|
+
const lastBBCDate = useSignedBBC ? extraInfo.lastSignedBBCDate : extraInfo.lastBBCDate;
|
|
54
|
+
const loanBalances = {
|
|
55
|
+
[ELoanTypes.REVOLVER]: 0,
|
|
56
|
+
[ELoanTypes.TERM]: 0,
|
|
57
|
+
};
|
|
58
|
+
const products = await this.loanChargesService.getLoanProducts(borrowerId);
|
|
59
|
+
await Promise.all(products.map(async (p) => {
|
|
60
|
+
const lastTransaction = await this.loanTransactionsService.getLastTransactionForDate(p._id.toString(), dayjs(lastBBCDate).utcOffset(0).endOf('day').toDate());
|
|
61
|
+
if (lastTransaction) {
|
|
62
|
+
loanBalances[ELoanTypes[p.type]] = new Decimal(loanBalances[ELoanTypes[p.type]]).add(lastTransaction.balance).toNumber();
|
|
63
|
+
}
|
|
64
|
+
}));
|
|
65
|
+
|
|
66
|
+
if (!useSignedBBC) {
|
|
67
|
+
return {
|
|
68
|
+
title: 'Loan summary - Current',
|
|
69
|
+
data: [
|
|
70
|
+
['Loan Balance - REVOLVER', formatNumbers(loanBalances[ELoanTypes.REVOLVER])],
|
|
71
|
+
['Loan Balance - TERM', formatNumbers(loanBalances[ELoanTypes.TERM])],
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const allProductsData = await this.reportsService.generateBankPortfolioSummary([borrowerId], lastBBCDate, {
|
|
77
|
+
useSignedBBC,
|
|
78
|
+
useStoredBalance: false,
|
|
79
|
+
});
|
|
80
|
+
const collateralRevolver = allProductsData.reduce((acc, product) => {
|
|
81
|
+
return new Decimal(acc).add(product.totalCollateral).toNumber();
|
|
82
|
+
}, 0);
|
|
83
|
+
|
|
84
|
+
const collateralTerm = allProductsData.reduce((acc, product) => {
|
|
85
|
+
return new Decimal(acc).add(product.equipmentCollateral).toNumber();
|
|
86
|
+
}, 0);
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
title: `Summary of Last Approved BBC - ${dayjs(lastBBCDate).format(defaultDateFormat)}`,
|
|
90
|
+
data: [
|
|
91
|
+
['Loan Balance - REVOLVER', formatNumbers(loanBalances[ELoanTypes.REVOLVER])],
|
|
92
|
+
['Loan Balance - TERM', formatNumbers(loanBalances[ELoanTypes.TERM])],
|
|
93
|
+
['Collateral - REVOLVER', formatNumbers(collateralRevolver)],
|
|
94
|
+
['Collateral - TERM', formatNumbers(collateralTerm)],
|
|
95
|
+
['Available to borrow', formatNumbers(new Decimal(collateralRevolver).sub(loanBalances[ELoanTypes.REVOLVER]).toNumber())],
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private async getComplianceItemsTable(borrowerId: string) {
|
|
101
|
+
const complianceBorrower = await BorrowerCompliance
|
|
102
|
+
.findOne({ borrower: borrowerId })
|
|
103
|
+
.populate('items.item')
|
|
104
|
+
.lean();
|
|
105
|
+
if (!complianceBorrower) {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
const outstandingItems = [];
|
|
109
|
+
const newItems = [];
|
|
110
|
+
complianceBorrower.items.map((item) => {
|
|
111
|
+
item.instances.forEach((i) => {
|
|
112
|
+
if (i.status === EComplianceItemStatus.NEW) {
|
|
113
|
+
newItems.push([
|
|
114
|
+
`${item.item.name} (${dayjs(i.nextDate).format('MMM.D, YYYY')})`,
|
|
115
|
+
dayjs(i.nextDate).format(defaultDateFormat),
|
|
116
|
+
]);
|
|
117
|
+
} else if (i.status === EComplianceItemStatus.REJECTED) {
|
|
118
|
+
outstandingItems.push([
|
|
119
|
+
`${item.item.name} (${dayjs(i.nextDate).format('MMM.D, YYYY')})`,
|
|
120
|
+
dayjs().diff(i.nextDate, 'day'),
|
|
121
|
+
]);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
return [...outstandingItems, ...newItems];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
async getTop5SKUsData(borrowerId: string) {
|
|
129
|
+
const lastBBC = await getLatestSignedBBCDateDoc(borrowerId);
|
|
130
|
+
if (lastBBC) {
|
|
131
|
+
const bbcGroups = await getBBCSheetsByTypeGroupedByBBC([lastBBC._id.toString()], ECollaterals.INVENTORY);
|
|
132
|
+
const sheetIds = [];
|
|
133
|
+
bbcGroups.forEach((bbcGroup) => {
|
|
134
|
+
bbcGroup.sheets.forEach((sheet) => {
|
|
135
|
+
sheetIds.push(sheet._id.toString());
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
return await getInventoryItemsSKUAndValue(sheetIds);
|
|
139
|
+
}
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private async getTop5SKUs(borrowerId: string) {
|
|
144
|
+
const lastBBC = await getLatestSignedBBCDateDoc(borrowerId);
|
|
145
|
+
if (!lastBBC) {
|
|
146
|
+
return [['no signed BBC', '']];
|
|
147
|
+
}
|
|
148
|
+
const SKUs = await this.getTop5SKUsData(borrowerId);
|
|
149
|
+
if (SKUs.length === 0) {
|
|
150
|
+
return [['MANUALLY ENTERED', '']];
|
|
151
|
+
}
|
|
152
|
+
return SKUs.slice(0, 5).map((SKU) => [SKU._id, formatNumbers(SKU.totalAmount)]);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private async getInventoryTurn(borrowerId: string) {
|
|
156
|
+
const startPeriod = dayjs().utcOffset(0).startOf('day').subtract(150, 'day').toDate().toISOString();
|
|
157
|
+
const endPeriod = dayjs().utcOffset(0).endOf('day').toDate().toISOString();
|
|
158
|
+
const allSkuValues = await this.inventoryService.getInventoryTurn(borrowerId, startPeriod, endPeriod);
|
|
159
|
+
const values = allSkuValues.tableByUnit.length > 0
|
|
160
|
+
? allSkuValues.tableByUnit.sort((a, b) => a.current < b.current ? 1 : -1).slice(0, 5)
|
|
161
|
+
: [];
|
|
162
|
+
return values.map((value) => [value.sku, formatNumbers(value.current)]);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async getTop5CustomersConcentrationData(borrowerId: string) {
|
|
166
|
+
const bbc = await getBBCDatesByBorrower(borrowerId, -1);
|
|
167
|
+
if (bbc.length > 0) {
|
|
168
|
+
const lastBBC = bbc[0];
|
|
169
|
+
const bbcGroups = await getBBCSheetsByTypeGroupedByBBC([lastBBC._id.toString()], ECollaterals.RECEIVABLE);
|
|
170
|
+
const sheetIds = [];
|
|
171
|
+
bbcGroups.forEach((bbcGroup) => {
|
|
172
|
+
bbcGroup.sheets.forEach((sheet) => {
|
|
173
|
+
sheetIds.push(sheet._id.toString());
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
return await getReceivableItemsCustomerAndValue(sheetIds);
|
|
177
|
+
}
|
|
178
|
+
return [];
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
private async getTop5CustomersConcentration(borrowerId: string) {
|
|
182
|
+
const bbc = await getBBCDatesByBorrower(borrowerId, -1);
|
|
183
|
+
if (!bbc) {
|
|
184
|
+
return [['no BBC', '']];
|
|
185
|
+
}
|
|
186
|
+
const customers = await this.getTop5CustomersConcentrationData(borrowerId);
|
|
187
|
+
if (customers.length === 0) {
|
|
188
|
+
return [['MANUALLY ENTERED', '']];
|
|
189
|
+
}
|
|
190
|
+
const totalAmount = customers.reduce((acc, customer) => new Decimal(acc).add(customer.totalAmount).toNumber(), 0);
|
|
191
|
+
return customers
|
|
192
|
+
.slice(0, 5)
|
|
193
|
+
.map((customer) => {
|
|
194
|
+
return [customer._id, `${formatNumbers(new Decimal(customer.totalAmount).div(totalAmount).mul(100).toDP(2).toNumber())}%`];
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
private async getAgedCustomers(borrowerId: string) {
|
|
199
|
+
const lastSignedBBC = await getLatestSignedBBCDateDoc(borrowerId);
|
|
200
|
+
if (lastSignedBBC) {
|
|
201
|
+
const { customerItems } = await this.availabilityService.getAvailabilityItemsWithFilter(lastSignedBBC._id.toString(), 'crossAgeDeduction');
|
|
202
|
+
return customerItems
|
|
203
|
+
.sort((a, b) => a.customerAmount < b.customerAmount ? 1 : -1)
|
|
204
|
+
.map((c) => [c.customerTitle, formatNumbers(c.customerAmount)]);
|
|
205
|
+
}
|
|
206
|
+
return [['no BBC', '']];
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
private async getLast5TransactionsTable(borrowerId: string) {
|
|
210
|
+
const products = await this.loanChargesService.getLoanProducts(borrowerId);
|
|
211
|
+
const startDate = dayjs().utcOffset(0).subtract(5, 'day').startOf('day').toDate();
|
|
212
|
+
const transactions = await LoanTransaction.aggregate<ILoanTransactionDoc>([
|
|
213
|
+
{
|
|
214
|
+
'$match': {
|
|
215
|
+
'productId': { '$in': products.map((p) => p._id) },
|
|
216
|
+
'date': { $gte: startDate },
|
|
217
|
+
},
|
|
218
|
+
}, {
|
|
219
|
+
'$sort': {
|
|
220
|
+
'date': -1,
|
|
221
|
+
},
|
|
222
|
+
}, {
|
|
223
|
+
'$limit': 5,
|
|
224
|
+
},
|
|
225
|
+
]);
|
|
226
|
+
return transactions.map((t) => {
|
|
227
|
+
return [
|
|
228
|
+
dayjs(t.date).format(defaultDateFormat),
|
|
229
|
+
t.reference,
|
|
230
|
+
formatNumbers(t.amount),
|
|
231
|
+
];
|
|
232
|
+
}, []);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
private async getChartData(borrowerId: string) {
|
|
236
|
+
const products = await this.loanChargesService.getLoanProducts(borrowerId);
|
|
237
|
+
const revolverProduct = products.find((product) => product.type === ELoanTypes.REVOLVER);
|
|
238
|
+
const chartData = [];
|
|
239
|
+
if (revolverProduct) {
|
|
240
|
+
const lastSignedBBC = await getLatestSignedBBCDateDoc(borrowerId);
|
|
241
|
+
if (lastSignedBBC) {
|
|
242
|
+
const periodEnd = lastSignedBBC.bbcDate;
|
|
243
|
+
const periodStart = dayjs(lastSignedBBC.bbcDate).utcOffset(0).subtract(6, 'month').toDate();
|
|
244
|
+
const BBCs = await getBBCDatesForPeriod(borrowerId, periodStart, periodEnd);
|
|
245
|
+
await Promise.all(BBCs.map(async (bbc) => {
|
|
246
|
+
if (bbc) {
|
|
247
|
+
const lastTransaction = await this.loanTransactionsService.getLastTransactionForDate(revolverProduct._id.toString(), dayjs(bbc.bbcDate).utcOffset(0).endOf('day').toDate());
|
|
248
|
+
const allProductsData = await this.reportsService.generateBankPortfolioSummary([borrowerId], bbc.bbcDate, {
|
|
249
|
+
useSignedBBC: false,
|
|
250
|
+
useStoredBalance: false,
|
|
251
|
+
});
|
|
252
|
+
const revolverData = allProductsData.find((p) => p.productType === ELoanTypes.REVOLVER);
|
|
253
|
+
chartData.push({
|
|
254
|
+
bbc: formatDate(bbc.bbcDate),
|
|
255
|
+
revolverCollateralTotal: revolverData ? revolverData.totalCollateral : 0,
|
|
256
|
+
revolverLoanBalance: lastTransaction ? lastTransaction.balance : 0,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return {
|
|
264
|
+
data: chartData.sort((a, b) => new Date(a.bbc).valueOf() - new Date(b.bbc).valueOf()),
|
|
265
|
+
series: [
|
|
266
|
+
{
|
|
267
|
+
type: 'bar',
|
|
268
|
+
xKey: 'bbc',
|
|
269
|
+
yKey: 'revolverCollateralTotal',
|
|
270
|
+
yName: 'Revolver Collateral Total',
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
type: 'bar',
|
|
274
|
+
xKey: 'bbc',
|
|
275
|
+
yKey: 'revolverLoanBalance',
|
|
276
|
+
yName: 'Revolver Loan Balance',
|
|
277
|
+
},
|
|
278
|
+
],
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async updateBorrowerSummary(borrowerId: string): Promise<void> {
|
|
283
|
+
const newSummary: IBorrowerSummary = {
|
|
284
|
+
borrowerId: new mongoose.Types.ObjectId(borrowerId),
|
|
285
|
+
lastCalculatedAt: new Date(),
|
|
286
|
+
tableData: {
|
|
287
|
+
[ETableNames.HIGH_LEVEL]: await this.getHighLevelTable(borrowerId, false),
|
|
288
|
+
[ETableNames.HIGH_LEVEL_APPROVED]: await this.getHighLevelTable(borrowerId, true),
|
|
289
|
+
[ETableNames.COMPLIANCE_ITEMS]: {
|
|
290
|
+
title: 'Compliance Items',
|
|
291
|
+
data: await this.getComplianceItemsTable(borrowerId),
|
|
292
|
+
},
|
|
293
|
+
[ETableNames.TOP_5_SKUS]: {
|
|
294
|
+
title: 'Top 5 SKUs',
|
|
295
|
+
data: await this.getTop5SKUs(borrowerId),
|
|
296
|
+
},
|
|
297
|
+
[ETableNames.LAST_5_DAYS_TRANSACTIONS]: {
|
|
298
|
+
title: 'Last 5 days transactions',
|
|
299
|
+
data: await this.getLast5TransactionsTable(borrowerId),
|
|
300
|
+
},
|
|
301
|
+
[ETableNames.INVENTORY_TURN]: {
|
|
302
|
+
title: 'Inventory turn (last 90 days)',
|
|
303
|
+
data: await this.getInventoryTurn(borrowerId),
|
|
304
|
+
},
|
|
305
|
+
[ETableNames.TOP_5_CUSTOMERS_CONCENTRATION]: {
|
|
306
|
+
title: 'Top 5 Customers Concentration',
|
|
307
|
+
data: await this.getTop5CustomersConcentration(borrowerId),
|
|
308
|
+
},
|
|
309
|
+
[ETableNames.AGED_OUT_CUSTOMERS]: {
|
|
310
|
+
title: 'Aged out customers',
|
|
311
|
+
data: await this.getAgedCustomers(borrowerId),
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
chartData: {
|
|
315
|
+
[EChartNames.LAST_6_MONTH]: await this.getChartData(borrowerId),
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
await BorrowerSummary.findOneAndUpdate({ borrowerId }, newSummary, { upsert: true });
|
|
319
|
+
console.log(`calculation finished - ${borrowerId}`);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
async recalculateAllActive() {
|
|
323
|
+
const borrowers = await this.borrowerService.getActiveBorrowers();
|
|
324
|
+
let i = 1;
|
|
325
|
+
for (const borrower of borrowers) {
|
|
326
|
+
try {
|
|
327
|
+
await this.updateBorrowerSummary(borrower._id.toString());
|
|
328
|
+
} catch (e) {
|
|
329
|
+
console.error(e);
|
|
330
|
+
}
|
|
331
|
+
i = i + 1;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
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 { IBorrowerSettingsDocPopulated } from '../models/BorrowerSettings.model';
|
|
27
|
+
import { IBorrowerDocument } from '../models/Borrower.model';
|
|
28
|
+
import { IBorrowerDataDocWithName } from '../models/BorrowerData.model';
|
|
29
|
+
import { IUser } from '../models/User.model';
|
|
30
|
+
import { CollateralsService } from './collaterals.service';
|
|
31
|
+
import { LoanStatementStatusService } from './loan-statement-status.service';
|
|
32
|
+
import { LoanTransactionsService } from './loan-transactions.service';
|
|
33
|
+
import { SignsService } from './signs.service';
|
|
34
|
+
export declare const borrowerDataModels: {
|
|
35
|
+
[modelName: string]: mongoose.Model<any>;
|
|
36
|
+
};
|
|
37
|
+
export declare class BorrowerService {
|
|
38
|
+
private readonly collateralsService;
|
|
39
|
+
private readonly loanStatementStatusService;
|
|
40
|
+
private readonly loanTransactionsService;
|
|
41
|
+
private readonly signsService;
|
|
42
|
+
constructor(collateralsService: CollateralsService, loanStatementStatusService: LoanStatementStatusService, loanTransactionsService: LoanTransactionsService, signsService: SignsService);
|
|
43
|
+
isBorrowerAllowed(userAccess: any, requestedBorrowerId: string): boolean;
|
|
44
|
+
checkBorrower(userAccess: any, requestedBorrowerId: string): boolean;
|
|
45
|
+
getBorrowerById(borrowerId: string): Promise<mongoose.FlattenMaps<IBorrowerDocument> & {
|
|
46
|
+
_id: mongoose.Types.ObjectId;
|
|
47
|
+
}>;
|
|
48
|
+
isNameCodeAllowed(borrower: IBorrowerDocument): Promise<{
|
|
49
|
+
message: string;
|
|
50
|
+
}>;
|
|
51
|
+
private getDefaultSettings;
|
|
52
|
+
private addOptionNames;
|
|
53
|
+
getBorrowerOption(borrowerId: string, optionName: string): Promise<IBorrowerDataDocWithName>;
|
|
54
|
+
getBorrowerSettings(borrowerId: string): Promise<IBorrowerSettingsDocPopulated>;
|
|
55
|
+
getBorrowerByCode(code: string): Promise<IBorrowerDocument>;
|
|
56
|
+
getExtraInfo(borrowerId: string): Promise<{
|
|
57
|
+
extraInfo: {
|
|
58
|
+
REVOLVER: {
|
|
59
|
+
balance: number;
|
|
60
|
+
lastActivityDate: any;
|
|
61
|
+
};
|
|
62
|
+
TERM: {
|
|
63
|
+
balance: number;
|
|
64
|
+
lastActivityDate: any;
|
|
65
|
+
};
|
|
66
|
+
accruedStatement: {
|
|
67
|
+
balance: number;
|
|
68
|
+
lastActivityDate: any;
|
|
69
|
+
};
|
|
70
|
+
effectiveLoanBalance: {
|
|
71
|
+
balance: number;
|
|
72
|
+
lastActivityDate: any;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
lastBBCDate: Date;
|
|
76
|
+
lastBBCId: any;
|
|
77
|
+
lastSignedBBCDate: Date;
|
|
78
|
+
lastSignedBBCId: any;
|
|
79
|
+
}>;
|
|
80
|
+
updateBorrowerData(borrowerSettings: IBorrowerSettingsDocPopulated): Promise<{
|
|
81
|
+
[x: string]: mongoose.Types.ObjectId[];
|
|
82
|
+
}>;
|
|
83
|
+
updateBorrowerSettings(borrowerId: string, borrowerSettings: IBorrowerSettingsDocPopulated): Promise<void>;
|
|
84
|
+
getBorrowerCodesMap(): Promise<Map<string, string>>;
|
|
85
|
+
getAllBorrowers(): Promise<(mongoose.FlattenMaps<IBorrowerDocument> & {
|
|
86
|
+
_id: mongoose.Types.ObjectId;
|
|
87
|
+
})[]>;
|
|
88
|
+
getActiveBorrowers(): Promise<(mongoose.FlattenMaps<IBorrowerDocument> & {
|
|
89
|
+
_id: mongoose.Types.ObjectId;
|
|
90
|
+
})[]>;
|
|
91
|
+
getAllowedBorrowers(user: IUser): Promise<(mongoose.FlattenMaps<IBorrowerDocument> & {
|
|
92
|
+
_id: mongoose.Types.ObjectId;
|
|
93
|
+
})[]>;
|
|
94
|
+
getBorrowerStatementDetails(borrowers: IBorrowerDocument[]): Promise<{
|
|
95
|
+
[x: number]: {
|
|
96
|
+
LAST_MONTH?: boolean;
|
|
97
|
+
CURRENT_MONTH?: boolean;
|
|
98
|
+
ENTIRE_LOAN?: boolean;
|
|
99
|
+
SELECTED_PERIOD?: boolean;
|
|
100
|
+
TERM_LOAN?: boolean;
|
|
101
|
+
};
|
|
102
|
+
}>;
|
|
103
|
+
}
|