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,643 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import * as XLSX from 'xlsx';
|
|
4
|
+
import mongoose from 'mongoose';
|
|
5
|
+
import dayjs from 'dayjs';
|
|
6
|
+
import Decimal from 'decimal.js';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
convertDataToFile,
|
|
10
|
+
convertDataToFileWithStyleOld,
|
|
11
|
+
} from '../helpers/excel.helper';
|
|
12
|
+
import { IMulterFile } from '../interfaces/multer.interface';
|
|
13
|
+
import { ITEMS_PAGINATION } from '../db/collaterals.db';
|
|
14
|
+
import { IPaginatorOptions } from '../interfaces/collaterals.interface';
|
|
15
|
+
import { ECollaterals } from '../enums/collaterals.enum';
|
|
16
|
+
import { EValidators } from '../enums/validators.enums';
|
|
17
|
+
import { IReceivableItem } from '../models/ReceivableItem.model';
|
|
18
|
+
import { COLLATERALS } from '../helpers/column-desciptions.helper';
|
|
19
|
+
import { convertAnyToDate, excelDateToJSDate } from '../helpers/date.helper';
|
|
20
|
+
import { IUploadedDataView } from '../interfaces/upload-data.interface';
|
|
21
|
+
import { EUploadTypes } from '../enums/upload-types.enum';
|
|
22
|
+
import { BBCDateModel } from '../models/BBCDate.model';
|
|
23
|
+
import { AvailabilitySignsModel } from '../models/AvailabilitySigns.model';
|
|
24
|
+
import { ReceivableAvailabilityModel } from '../models/ReceivableAvailability.model';
|
|
25
|
+
import { BBCSheetModel } from '../models/BBCSheet.model';
|
|
26
|
+
import { InventoryManualEntryModel } from '../models/InventoryManualEntry.model';
|
|
27
|
+
import { ELogActionType, ELogType } from '../models/UserLog.model';
|
|
28
|
+
import { createMicroserviceTasks } from '../db/microservice-tasks.db';
|
|
29
|
+
import { EMicroserviceTask } from '../enums/microservice-task.enum';
|
|
30
|
+
import { UserModel } from '../models/User.model';
|
|
31
|
+
|
|
32
|
+
import UploadedFile, { IUploadedFile, IUploadedFileDoc } from '../models/UploadedFile.model';
|
|
33
|
+
import UploadedSheet, {
|
|
34
|
+
IUploadedSheet,
|
|
35
|
+
IUploadedSheetDocWithFile,
|
|
36
|
+
IUploadedSheetView,
|
|
37
|
+
} from '../models/UploadedSheet.model';
|
|
38
|
+
import UploadedData, { IUploadedData, IUploadedDataDoc } from '../models/UploadedData.model';
|
|
39
|
+
import { InventoryItem } from '../classes/inventory-item';
|
|
40
|
+
import { ReceivableItem } from '../classes/receivable-item';
|
|
41
|
+
import { PayableAccountItem } from '../classes/payable-account-item';
|
|
42
|
+
import { getSheetWithFile } from '../db/uploads.db';
|
|
43
|
+
import { getAllTimeOldestSKUDateNew } from '../db/inventories';
|
|
44
|
+
import { LoanTransactionItem } from '../classes/bank-transaction-item';
|
|
45
|
+
import EquipmentModel from '../models/Equipment.model';
|
|
46
|
+
import ReserveModel from '../models/Reserve.model';
|
|
47
|
+
import { IQuickbooksUploadItem } from '../classes/quickbook-item';
|
|
48
|
+
import { BankUploadedTransactionItem } from '../classes/bank-uploaded-transaction';
|
|
49
|
+
import { BankUploadedTransactionsService } from './bank-uploaded-transactions.service';
|
|
50
|
+
import { CollateralsService } from './collaterals.service';
|
|
51
|
+
import { LoanTransactionsService } from './loan-transactions.service';
|
|
52
|
+
import { QuickbooksService } from './quickbooks.service';
|
|
53
|
+
import { UserLogsService } from './user-logs.service';
|
|
54
|
+
import { LockService } from './lock.service';
|
|
55
|
+
import { BorrowerService } from './borrowers.service';
|
|
56
|
+
|
|
57
|
+
interface IMappedColumns {
|
|
58
|
+
[columnName: string]: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface IMapping {
|
|
62
|
+
sheetId: string;
|
|
63
|
+
startRow: number;
|
|
64
|
+
endRow: number;
|
|
65
|
+
bbcDate: Date;
|
|
66
|
+
effectiveDate?: string;
|
|
67
|
+
sheetType: ECollaterals;
|
|
68
|
+
mappedColumns: IMappedColumns;
|
|
69
|
+
extraOptions?: { [key: string]: string };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
interface IMappedData {
|
|
73
|
+
[key: string]: any;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface IExcelDataCellWithStyles {
|
|
77
|
+
v: string | number | Date | boolean;
|
|
78
|
+
t?: string;
|
|
79
|
+
s?: object;
|
|
80
|
+
z?: object;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const validators: { [key in EValidators]?: any } = {
|
|
84
|
+
[EValidators.NOT_EMPTY]: (field, value): { error: string } | void => {
|
|
85
|
+
if (!value || value.toString().trim() === '') {
|
|
86
|
+
return { error: `value ${field} must not be empty!` };
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
[EValidators.NUMBER_GT_NULL]: (field, value): { error: string } | void => {
|
|
90
|
+
if (value === 0 || value < 0) {
|
|
91
|
+
return { error: `value ${field} must be greater than 0!` };
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
[EValidators.NUMBER_GTE_NULL]: (field, value): { error: string } | void => {
|
|
95
|
+
if (value < 0) {
|
|
96
|
+
return { error: `value ${field} must be greater or equal 0!` };
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
[EValidators.IS_NUMBER]: (field, value): { error: string } | void => {
|
|
100
|
+
if (typeof value === 'object' || isNaN(Number(value))) {
|
|
101
|
+
return { error: `value ${field} must be number!` };
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
[EValidators.IS_DATE]: (field, value): { error: string } | void => {
|
|
105
|
+
if (!value) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (value.toString().trim() !== '' && Object.prototype.toString.call(convertAnyToDate(value)) !== '[object Date]') {
|
|
109
|
+
return { error: `value ${field} must be date!` };
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
export interface IUploadOption {
|
|
115
|
+
fileName: string;
|
|
116
|
+
sheetName: string;
|
|
117
|
+
userUploaded?: string;
|
|
118
|
+
effectiveDate: string;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export class UploadsService {
|
|
122
|
+
|
|
123
|
+
constructor(
|
|
124
|
+
private readonly rootDir: string,
|
|
125
|
+
private readonly bankUploadedTransactionsService: BankUploadedTransactionsService,
|
|
126
|
+
private readonly getCollateralsService: () => CollateralsService,
|
|
127
|
+
private readonly getLoanTransactionsService: () => LoanTransactionsService,
|
|
128
|
+
private readonly getQuickbooksService: () => QuickbooksService,
|
|
129
|
+
private readonly getLockService: () => LockService,
|
|
130
|
+
private readonly userLogsService: UserLogsService,
|
|
131
|
+
private readonly borrowerService: BorrowerService,
|
|
132
|
+
) {
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async createUploadFile(file: IMulterFile, borrowerId: string, userId: string, uploadType: EUploadTypes) {
|
|
136
|
+
const borrowerIdToWrite = new mongoose.Types.ObjectId(borrowerId);
|
|
137
|
+
const newFile: IUploadedFile = {
|
|
138
|
+
borrowerId: borrowerIdToWrite,
|
|
139
|
+
filename: file.filename,
|
|
140
|
+
originalName: file.originalname,
|
|
141
|
+
userId: new mongoose.Types.ObjectId(userId),
|
|
142
|
+
type: uploadType,
|
|
143
|
+
};
|
|
144
|
+
return await UploadedFile.create(newFile);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async convertFileToData(uploadedFileId: string) {
|
|
148
|
+
const uploadedFile = await UploadedFile.findById(uploadedFileId).lean();
|
|
149
|
+
if (!uploadedFile) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const absolutePath = path.join(this.rootDir, 'uploads', uploadedFile.filename);
|
|
153
|
+
|
|
154
|
+
let excelData;
|
|
155
|
+
fs.readFile(absolutePath, async (err, data) => {
|
|
156
|
+
if (err) {
|
|
157
|
+
console.error({ err });
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const xlsxOptions = { cellDates: true, dateNF: 'yyyy/mm/dd;@' };
|
|
161
|
+
const workbook = XLSX.read(data, xlsxOptions);
|
|
162
|
+
excelData = Object.keys(workbook.Sheets).reduce((acc, ws) => {
|
|
163
|
+
const worksheet = workbook.Sheets[ws];
|
|
164
|
+
const arrayList = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
|
|
165
|
+
const trimmedArray = this.trimExcelArray(arrayList);
|
|
166
|
+
return { ...acc, [ws]: trimmedArray.map((arr) => Object.assign({}, arr)) };
|
|
167
|
+
}, {});
|
|
168
|
+
await Promise.all(Object.entries(excelData).map(async ([sheetName, sheetData]: [sheetName: string, sheetData: object[]]) => {
|
|
169
|
+
const newSheet: IUploadedSheet = {
|
|
170
|
+
fileId: new mongoose.Types.ObjectId(uploadedFileId),
|
|
171
|
+
sheetName: sheetName,
|
|
172
|
+
total: sheetData.length,
|
|
173
|
+
};
|
|
174
|
+
const createdSheet = await UploadedSheet.create(newSheet);
|
|
175
|
+
|
|
176
|
+
(<object[]>sheetData).map(async (data, order) => {
|
|
177
|
+
const convertedData = Object.entries(data).reduce((acc, [key, value]) => {
|
|
178
|
+
return {
|
|
179
|
+
...acc,
|
|
180
|
+
[key]: typeof value === 'number' ? new Decimal(value).toDecimalPlaces(2).toNumber() : value,
|
|
181
|
+
};
|
|
182
|
+
}, {});
|
|
183
|
+
const newData: IUploadedData = {
|
|
184
|
+
sheetId: new mongoose.Types.ObjectId(String(createdSheet._id)),
|
|
185
|
+
order,
|
|
186
|
+
data: convertedData,
|
|
187
|
+
};
|
|
188
|
+
await UploadedData.create(newData);
|
|
189
|
+
});
|
|
190
|
+
}));
|
|
191
|
+
|
|
192
|
+
fs.unlink(absolutePath, async (err) => {
|
|
193
|
+
if (err) {
|
|
194
|
+
console.error(err);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async convertDataToFile(dataToConvert: { [sheetName: string]: any[] }[]) {
|
|
202
|
+
return convertDataToFile(dataToConvert);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async convertDataToFileWithStyleOld(dataToConvert: { [sheetName: string]: IExcelDataCellWithStyles[][] }, options?: {
|
|
206
|
+
width?: {
|
|
207
|
+
[sheetName: string]: { [columnId: string]: number }
|
|
208
|
+
},
|
|
209
|
+
sheetOptions?: {
|
|
210
|
+
[sheetName: string]: { showGridLines?: boolean };
|
|
211
|
+
};
|
|
212
|
+
}) {
|
|
213
|
+
return convertDataToFileWithStyleOld(dataToConvert, options);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async deleteFile(uploadedFileId: string) {
|
|
217
|
+
await UploadedFile.deleteOne({ _id: uploadedFileId });
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async deleteSheet(uploadedSheetId: string) {
|
|
221
|
+
const sheet = await UploadedSheet.findById(uploadedSheetId).lean();
|
|
222
|
+
const file = await UploadedFile.findById(sheet.fileId).lean();
|
|
223
|
+
const borrowerId = file.borrowerId ? file.borrowerId.toString() : null;
|
|
224
|
+
await UploadedSheet.deleteOne({ _id: uploadedSheetId });
|
|
225
|
+
await UploadedData.deleteMany({ sheetId: uploadedSheetId });
|
|
226
|
+
const sheets = await UploadedSheet.find({ fileId: file._id });
|
|
227
|
+
if (!sheets.length) {
|
|
228
|
+
await UploadedFile.deleteOne({ _id: file._id });
|
|
229
|
+
}
|
|
230
|
+
return await this.getUploadedSheets(borrowerId, file.type);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
async deleteAllSheets(uploadType: EUploadTypes) {
|
|
234
|
+
const files = await UploadedFile.find({ type: uploadType });
|
|
235
|
+
const fileIds = files.map((i) => i._id);
|
|
236
|
+
const sheets = await UploadedSheet.find({ fileId: { $in: fileIds } });
|
|
237
|
+
const sheetIds = sheets.map((i) => i._id);
|
|
238
|
+
await UploadedSheet.deleteMany({ _id: { $in: sheetIds } });
|
|
239
|
+
await UploadedData.deleteMany({ sheetId: { $in: sheetIds } });
|
|
240
|
+
await UploadedFile.deleteMany({ _id: { $in: fileIds } });
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
trimExcelArray(data: any[]): unknown[] {
|
|
244
|
+
let dataFiltered = data.filter((arr) => arr.some((elem) => elem !== null && elem !== 0 && elem.toString().trim() !== ''));
|
|
245
|
+
if (!dataFiltered.length) {
|
|
246
|
+
return [];
|
|
247
|
+
}
|
|
248
|
+
const dataRotated = dataFiltered[0].map((_, index) => dataFiltered.map(row => row[index]).reverse());
|
|
249
|
+
let dataRotatedFiltered = dataRotated.filter((arr) => arr.some((elem) => elem !== null && elem !== 0 && elem.toString().trim() !== ''));
|
|
250
|
+
return dataRotatedFiltered[0].map((_, index) => dataRotatedFiltered.map((row) => row[row.length - 1 - index]));
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async getUploadedRawFiles(borrowerId: string, uploadType: EUploadTypes) {
|
|
254
|
+
const findFilter = uploadType === EUploadTypes.BBC
|
|
255
|
+
? { borrowerId, type: uploadType }
|
|
256
|
+
: { type: uploadType };
|
|
257
|
+
const uploadedFiles = await UploadedFile.find(findFilter).lean();
|
|
258
|
+
const files = await Promise.all(uploadedFiles.map(async (file) => {
|
|
259
|
+
const sheets = await UploadedSheet.find({ fileId: file._id });
|
|
260
|
+
if (!sheets.length) {
|
|
261
|
+
return file;
|
|
262
|
+
}
|
|
263
|
+
}));
|
|
264
|
+
return files.filter((file) => !!file);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async getUploadedSheets(borrowerId: string, uploadType: EUploadTypes) {
|
|
268
|
+
const borrowerFilter = uploadType === EUploadTypes.BBC ? { borrowerId: new mongoose.Types.ObjectId(borrowerId) } : {};
|
|
269
|
+
const files = await UploadedFile.aggregate<IUploadedFileDoc>([
|
|
270
|
+
{
|
|
271
|
+
$match: {
|
|
272
|
+
...borrowerFilter,
|
|
273
|
+
'type': uploadType,
|
|
274
|
+
},
|
|
275
|
+
}, {
|
|
276
|
+
$sort: {
|
|
277
|
+
'createdAt': 1,
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
]);
|
|
281
|
+
const fileIds = files.map((file) => file._id);
|
|
282
|
+
const sheets = await UploadedSheet.aggregate<IUploadedSheetDocWithFile>([
|
|
283
|
+
{
|
|
284
|
+
$match: {
|
|
285
|
+
'fileId': {
|
|
286
|
+
$in: fileIds,
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
}, {
|
|
290
|
+
$lookup: {
|
|
291
|
+
from: 'uploadedfiles',
|
|
292
|
+
localField: 'fileId',
|
|
293
|
+
foreignField: '_id',
|
|
294
|
+
as: 'file',
|
|
295
|
+
},
|
|
296
|
+
}, {
|
|
297
|
+
$unwind:
|
|
298
|
+
{
|
|
299
|
+
path: '$file',
|
|
300
|
+
},
|
|
301
|
+
}, {
|
|
302
|
+
$sort: {
|
|
303
|
+
'createdAt': 1,
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
]);
|
|
307
|
+
|
|
308
|
+
return sheets.map((sheet) => {
|
|
309
|
+
return <IUploadedSheetView>{
|
|
310
|
+
_id: sheet._id,
|
|
311
|
+
sheetName: sheet.sheetName,
|
|
312
|
+
fileId: sheet.file._id,
|
|
313
|
+
fileName: sheet.file.originalName,
|
|
314
|
+
total: sheet.total,
|
|
315
|
+
};
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
async getUploadedData(sheetId: string, paginatorOptions?: IPaginatorOptions): Promise<IUploadedDataView> {
|
|
320
|
+
const uploadedData = await UploadedData.aggregate<IUploadedDataDoc>([
|
|
321
|
+
{
|
|
322
|
+
$match: {
|
|
323
|
+
'sheetId': new mongoose.Types.ObjectId(sheetId),
|
|
324
|
+
},
|
|
325
|
+
}, {
|
|
326
|
+
$sort: {
|
|
327
|
+
'order': 1,
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
...ITEMS_PAGINATION(paginatorOptions),
|
|
331
|
+
]);
|
|
332
|
+
const totalItems = (await UploadedSheet.findById(sheetId)).total;
|
|
333
|
+
return {
|
|
334
|
+
paginatorOptions,
|
|
335
|
+
totalItems,
|
|
336
|
+
items: uploadedData.map((row) => row.data),
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
private transformNumberIntoDate(mappedRow: IReceivableItem, collateralType: ECollaterals): IReceivableItem {
|
|
341
|
+
const dateFields = COLLATERALS[collateralType].filter((field) => field.isDate).map((field) => field.db_title);
|
|
342
|
+
Object.entries(mappedRow).forEach(([key, value]) => {
|
|
343
|
+
if (dateFields.includes(key) && typeof value === 'number') {
|
|
344
|
+
mappedRow[key] = excelDateToJSDate(value);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
return mappedRow;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
private validateRow(mappedRow: unknown, collateralType: ECollaterals): any[] {
|
|
351
|
+
try {
|
|
352
|
+
const rowValidationErrors = [];
|
|
353
|
+
Object.entries(mappedRow).forEach(([field, value]) => {
|
|
354
|
+
const foundDesc = COLLATERALS[collateralType].find((columnDesc) => field === columnDesc.db_title);
|
|
355
|
+
const fieldValidationErrors = [];
|
|
356
|
+
if (!foundDesc) {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
if (foundDesc.validators) {
|
|
360
|
+
foundDesc.validators.forEach((validator) => {
|
|
361
|
+
const validationError = validators[validator](field, value);
|
|
362
|
+
if (!!validationError) {
|
|
363
|
+
fieldValidationErrors.push(validationError);
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
if (fieldValidationErrors.length) {
|
|
368
|
+
rowValidationErrors.push({ [field]: fieldValidationErrors });
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
return rowValidationErrors;
|
|
372
|
+
} catch (e) {
|
|
373
|
+
console.error(e);
|
|
374
|
+
return [{ row: e }];
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
async mapData(mapData: IMapping, paginators: { [table: string]: IPaginatorOptions }) {
|
|
379
|
+
const mappedData = await this.prepareData(mapData);
|
|
380
|
+
const hasDateMismatch = mappedData.approved.items.some((item) => {
|
|
381
|
+
if (dayjs(item.date).format('YYYY-MM-DD') !== mapData.effectiveDate) {
|
|
382
|
+
}
|
|
383
|
+
return dayjs(item.date).format('YYYY-MM-DD') !== mapData.effectiveDate;
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
const paginateItems = (items: any[], paginator: IPaginatorOptions) => {
|
|
387
|
+
const startItem = paginator.pageIndex * paginator.pageSize;
|
|
388
|
+
return items.slice(startItem, startItem + paginator.pageSize);
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
return Object.keys(mappedData).reduce((acc, key) => {
|
|
392
|
+
return {
|
|
393
|
+
...acc,
|
|
394
|
+
hasDateMismatch,
|
|
395
|
+
[key]: {
|
|
396
|
+
totalItems: mappedData[key].totalItems,
|
|
397
|
+
items: paginateItems(mappedData[key].items, paginators[key]),
|
|
398
|
+
paginatorOptions: paginators[key],
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
}, {});
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
async convertData(mapData: IMapping, userId: string) {
|
|
405
|
+
const { approved } = await this.prepareData(mapData);
|
|
406
|
+
const fileData = await getSheetWithFile(mapData.sheetId);
|
|
407
|
+
|
|
408
|
+
const borrowerId = fileData[0].file.borrowerId?.toString() ?? null;
|
|
409
|
+
const bbcDate = dayjs.utc(mapData.bbcDate).startOf('day').toDate();
|
|
410
|
+
|
|
411
|
+
if (borrowerId) {
|
|
412
|
+
const lockService = this.getLockService();
|
|
413
|
+
const isDateLocked = await lockService.isDateLocked(bbcDate, borrowerId);
|
|
414
|
+
if (isDateLocked) {
|
|
415
|
+
return { success: false, message: 'This period is signed and locked', data: null };
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
const newCollateralData = {
|
|
420
|
+
borrowerId,
|
|
421
|
+
bbcDate,
|
|
422
|
+
fileName: fileData[0].file.originalName,
|
|
423
|
+
sheetName: fileData[0].sheetName,
|
|
424
|
+
items: approved.items,
|
|
425
|
+
};
|
|
426
|
+
const uploadOption: IUploadOption = {
|
|
427
|
+
fileName: fileData[0].file.originalName,
|
|
428
|
+
sheetName: fileData[0].sheetName,
|
|
429
|
+
effectiveDate: mapData.effectiveDate,
|
|
430
|
+
};
|
|
431
|
+
try {
|
|
432
|
+
let taskId: string;
|
|
433
|
+
switch (mapData.sheetType) {
|
|
434
|
+
case ECollaterals.LOAN_TRANSACTIONS: {
|
|
435
|
+
const loanTransactionsService = this.getLoanTransactionsService();
|
|
436
|
+
await loanTransactionsService.uploadLoanTransactions(newCollateralData.items, uploadOption, userId);
|
|
437
|
+
await this.userLogsService.createUserLog({
|
|
438
|
+
userId,
|
|
439
|
+
logType: ELogType.TRANSACTIONS_UPLOAD,
|
|
440
|
+
action: ELogActionType.UPLOAD,
|
|
441
|
+
details: { mapData, uploadOption },
|
|
442
|
+
});
|
|
443
|
+
break;
|
|
444
|
+
}
|
|
445
|
+
case ECollaterals.QUICKBOOKS: {
|
|
446
|
+
const quickbooksService = this.getQuickbooksService();
|
|
447
|
+
await quickbooksService.uploadAccounts(newCollateralData.items, true);
|
|
448
|
+
break;
|
|
449
|
+
}
|
|
450
|
+
case ECollaterals.UPLOADED_BANK_TRANSACTIONS: {
|
|
451
|
+
taskId = await this.bankUploadedTransactionsService.uploadTransactions(newCollateralData.items);
|
|
452
|
+
break;
|
|
453
|
+
}
|
|
454
|
+
default: {
|
|
455
|
+
const collateralsService = this.getCollateralsService();
|
|
456
|
+
const bbcDateId = await collateralsService.saveCollateralItems(newCollateralData, ECollaterals[mapData.sheetType]);
|
|
457
|
+
const user = await UserModel.findById(userId).lean();
|
|
458
|
+
if (user) {
|
|
459
|
+
const params = {
|
|
460
|
+
borrowerId: new mongoose.Types.ObjectId(borrowerId),
|
|
461
|
+
bbcDateId,
|
|
462
|
+
userId: new mongoose.Types.ObjectId(userId),
|
|
463
|
+
};
|
|
464
|
+
await createMicroserviceTasks(EMicroserviceTask.POST_UPLOAD, params);
|
|
465
|
+
}
|
|
466
|
+
await this.userLogsService.createUserLog({
|
|
467
|
+
userId,
|
|
468
|
+
logType: ELogType.COLLATERAL_UPLOAD,
|
|
469
|
+
action: ELogActionType.UPLOAD,
|
|
470
|
+
details: { mapData, uploadOption, borrowerId, bbcDate },
|
|
471
|
+
});
|
|
472
|
+
break;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
await this.removeConvertedData(mapData.sheetId);
|
|
476
|
+
return { success: true, message: 'Successfully uploaded', data: { taskId } };
|
|
477
|
+
} catch (e) {
|
|
478
|
+
console.error({ e });
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
async prepareData(mapData: IMapping) {
|
|
483
|
+
const { startRow, endRow, bbcDate, sheetType, mappedColumns, sheetId } = mapData;
|
|
484
|
+
const excelData = await this.getUploadedData(sheetId);
|
|
485
|
+
|
|
486
|
+
const SLICED_DATA = excelData.items.slice(startRow - 1, endRow);
|
|
487
|
+
|
|
488
|
+
const MAPPED_DATA = <IMappedData[]>(SLICED_DATA.reduce((acc: IMappedData[], row) => {
|
|
489
|
+
const RES = Object.entries(mappedColumns).reduce((result, [key, value]) => {
|
|
490
|
+
if (value !== null) {
|
|
491
|
+
return { ...result, [key]: row[value] ?? null };
|
|
492
|
+
}
|
|
493
|
+
return result;
|
|
494
|
+
}, {});
|
|
495
|
+
return [...acc, RES];
|
|
496
|
+
}, []));
|
|
497
|
+
|
|
498
|
+
let skuDates = [];
|
|
499
|
+
|
|
500
|
+
if (mapData.sheetType === ECollaterals.INVENTORY) {
|
|
501
|
+
const uploadedSheet = await UploadedSheet.findById(mapData.sheetId).lean();
|
|
502
|
+
const uploadedFile = await UploadedFile.findById(uploadedSheet.fileId).lean();
|
|
503
|
+
skuDates = await getAllTimeOldestSKUDateNew(uploadedFile.borrowerId.toString(), mapData.bbcDate);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
const approvedItems = [];
|
|
507
|
+
const removedItems = [];
|
|
508
|
+
try {
|
|
509
|
+
await Promise.all(MAPPED_DATA.map(async (row, index) => {
|
|
510
|
+
const extraErrors = [];
|
|
511
|
+
const mappedCollateralTypes = {
|
|
512
|
+
[ECollaterals.INVENTORY]: () => new InventoryItem(row, bbcDate, skuDates),
|
|
513
|
+
[ECollaterals.RECEIVABLE]: () => new ReceivableItem(row, bbcDate),
|
|
514
|
+
[ECollaterals.ACCOUNT_PAYABLE]: () => new PayableAccountItem(row, bbcDate),
|
|
515
|
+
[ECollaterals.LOAN_TRANSACTIONS]: async () => {
|
|
516
|
+
const newItem = new LoanTransactionItem(row, this.borrowerService);
|
|
517
|
+
const classErrors = await newItem.initialize();
|
|
518
|
+
if (classErrors.length) {
|
|
519
|
+
classErrors.forEach((error) => extraErrors.push(error));
|
|
520
|
+
}
|
|
521
|
+
const cleanItem = { ...newItem, transactionType: '' };
|
|
522
|
+
cleanItem.transactionType = newItem.isStatement ? 'STATEMENT' : newItem.transactionType;
|
|
523
|
+
delete cleanItem.isStatement;
|
|
524
|
+
return cleanItem;
|
|
525
|
+
},
|
|
526
|
+
[ECollaterals.UPLOADED_BANK_TRANSACTIONS]: async () => new BankUploadedTransactionItem({
|
|
527
|
+
...row,
|
|
528
|
+
order: index,
|
|
529
|
+
}, mapData.extraOptions),
|
|
530
|
+
[ECollaterals.QUICKBOOKS]: async () => {
|
|
531
|
+
const newItem = new IQuickbooksUploadItem(row, mapData.extraOptions);
|
|
532
|
+
const classErrors = await newItem.initialize();
|
|
533
|
+
if (classErrors.length) {
|
|
534
|
+
classErrors.forEach((error) => extraErrors.push(error));
|
|
535
|
+
}
|
|
536
|
+
return newItem;
|
|
537
|
+
},
|
|
538
|
+
};
|
|
539
|
+
const item = await mappedCollateralTypes[ECollaterals[sheetType]]();
|
|
540
|
+
const mappedRow = this.transformNumberIntoDate(item, ECollaterals[sheetType]);
|
|
541
|
+
const validationErrors = this.validateRow(mappedRow, ECollaterals[sheetType]);
|
|
542
|
+
const allErrors = [...extraErrors, ...validationErrors];
|
|
543
|
+
if (allErrors.length) {
|
|
544
|
+
const errors = allErrors.map((errorValues) => {
|
|
545
|
+
return Object.values(errorValues).reduce((acc: any[], obj) => {
|
|
546
|
+
const errorsV = (obj as any).map((v) => v.error);
|
|
547
|
+
return [...acc, errorsV];
|
|
548
|
+
}, []);
|
|
549
|
+
});
|
|
550
|
+
removedItems[index] = {
|
|
551
|
+
...row,
|
|
552
|
+
checked: true,
|
|
553
|
+
validationErrors: errors.join(', '),
|
|
554
|
+
};
|
|
555
|
+
} else {
|
|
556
|
+
approvedItems[index] = mappedRow;
|
|
557
|
+
}
|
|
558
|
+
}));
|
|
559
|
+
const approvedItemsOnly = approvedItems.filter(Boolean);
|
|
560
|
+
const removedItemsOnly = removedItems.filter(Boolean);
|
|
561
|
+
return {
|
|
562
|
+
approved: {
|
|
563
|
+
items: approvedItemsOnly,
|
|
564
|
+
totalItems: approvedItemsOnly.length,
|
|
565
|
+
},
|
|
566
|
+
removed: {
|
|
567
|
+
items: removedItemsOnly,
|
|
568
|
+
totalItems: removedItemsOnly.length,
|
|
569
|
+
},
|
|
570
|
+
};
|
|
571
|
+
} catch (e) {
|
|
572
|
+
console.error(e);
|
|
573
|
+
throw new Error('error while loading');
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
async removeConvertedData(sheetId: string) {
|
|
578
|
+
try {
|
|
579
|
+
const uploadedFile = await UploadedSheet.findById(sheetId);
|
|
580
|
+
const fileId = uploadedFile.fileId;
|
|
581
|
+
await UploadedSheet.deleteOne({ _id: sheetId });
|
|
582
|
+
await UploadedData.deleteMany({ sheetId: sheetId });
|
|
583
|
+
const siblingsSheets = await UploadedSheet.find({ fileId });
|
|
584
|
+
if (!siblingsSheets.length) {
|
|
585
|
+
await UploadedFile.deleteOne({ _id: fileId });
|
|
586
|
+
}
|
|
587
|
+
} catch (e) {
|
|
588
|
+
console.error({ e });
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
async removeEntriesWithoutFiles() {
|
|
593
|
+
try {
|
|
594
|
+
const uploadedFiles = await UploadedFile.find({});
|
|
595
|
+
await Promise.all(uploadedFiles.map(async (file) => {
|
|
596
|
+
const sheets = await UploadedSheet.find({ fileId: file._id });
|
|
597
|
+
if (!sheets.length) {
|
|
598
|
+
await UploadedFile.findByIdAndDelete(file._id);
|
|
599
|
+
}
|
|
600
|
+
}));
|
|
601
|
+
} catch (e) {
|
|
602
|
+
console.error({ e });
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
async cleanUploads() {
|
|
607
|
+
try {
|
|
608
|
+
fs.readdir(path.join(this.rootDir, 'uploads'), async (err, files) => {
|
|
609
|
+
await Promise.all(files.map((file) => {
|
|
610
|
+
fs.unlink(path.join(this.rootDir, 'uploads', file), (err) => {
|
|
611
|
+
if (err) {
|
|
612
|
+
console.error({ err });
|
|
613
|
+
}
|
|
614
|
+
});
|
|
615
|
+
}));
|
|
616
|
+
});
|
|
617
|
+
await UploadedFile.deleteMany();
|
|
618
|
+
await UploadedSheet.deleteMany();
|
|
619
|
+
await UploadedData.deleteMany();
|
|
620
|
+
} catch (e) {
|
|
621
|
+
console.error({ e });
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
async removeEmptyBBC(remove = false) {
|
|
626
|
+
const bbcDates = await BBCDateModel.find().lean();
|
|
627
|
+
for (const bbcDate of bbcDates) {
|
|
628
|
+
const sheets = await BBCSheetModel.find({ bbcDateId: bbcDate._id });
|
|
629
|
+
if (sheets.length === 0) {
|
|
630
|
+
console.log(bbcDate._id.toString(), 'can be deleted');
|
|
631
|
+
if (remove) {
|
|
632
|
+
await BBCDateModel.findByIdAndDelete(bbcDate._id);
|
|
633
|
+
await AvailabilitySignsModel.deleteMany({ bbcDateId: bbcDate._id });
|
|
634
|
+
await EquipmentModel.deleteMany({ bbcDateId: bbcDate._id });
|
|
635
|
+
await InventoryManualEntryModel.deleteMany({ bbcDateId: bbcDate._id });
|
|
636
|
+
await ReceivableAvailabilityModel.deleteMany({ bbcDateId: bbcDate._id });
|
|
637
|
+
await ReserveModel.deleteMany({ bbcDateId: bbcDate._id });
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ICreateLogParams } from '../db/user-logs.db';
|
|
2
|
+
import { IUserLog, IUserLogWithLookup } from '../models/UserLog.model';
|
|
3
|
+
import { BanksService } from './banks.service';
|
|
4
|
+
import { BorrowerService } from './borrowers.service';
|
|
5
|
+
import { LoanChargesService } from './loan-charges.service';
|
|
6
|
+
export interface IUserLogFilter {
|
|
7
|
+
userId: string;
|
|
8
|
+
borrowerId: string;
|
|
9
|
+
periodStart: Date;
|
|
10
|
+
periodEnd: Date;
|
|
11
|
+
}
|
|
12
|
+
export declare class UserLogsService {
|
|
13
|
+
private readonly banksService;
|
|
14
|
+
private readonly borrowerService;
|
|
15
|
+
private readonly loanChargesService;
|
|
16
|
+
constructor(banksService: BanksService, borrowerService: BorrowerService, loanChargesService: LoanChargesService);
|
|
17
|
+
createUserLog(params: ICreateLogParams): Promise<void>;
|
|
18
|
+
filterByBorrower(logs: IUserLogWithLookup[], borrowerId: string): Promise<IUserLogWithLookup[]>;
|
|
19
|
+
replaceBorrowers(logs: IUserLogWithLookup[]): Promise<void[]>;
|
|
20
|
+
performDynamicLookup(record: IUserLog): Promise<IUserLogWithLookup>;
|
|
21
|
+
getLogs(filter: IUserLogFilter): Promise<IUserLogWithLookup[]>;
|
|
22
|
+
getDocumentLogs(documentId: string): Promise<IUserLogWithLookup[]>;
|
|
23
|
+
}
|