gemcap-be-common 1.4.102 → 1.4.104
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/microservice/event-map.d.ts +1 -0
- package/microservice/event-map.js +1 -0
- package/microservice/event-map.ts +1 -0
- package/package.json +1 -1
- package/services/bank-uploaded-transactions.service.d.ts +1 -1
- package/services/bank-uploaded-transactions.service.js +24 -4
- package/services/bank-uploaded-transactions.service.ts +24 -5
- package/services/loan-statement-status.service.d.ts +4 -1
- package/services/loan-statement-status.service.js +12 -2
- package/services/loan-statement-status.service.ts +12 -1
- package/services/loan-transactions.service.d.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -39,6 +39,7 @@ export declare const EventMap: {
|
|
|
39
39
|
readonly recalc: {
|
|
40
40
|
readonly UNLOCK_PRODUCT_BALANCE: "recalc#UNLOCK_PRODUCT_BALANCE";
|
|
41
41
|
readonly PRODUCT_BALANCE: "recalc#PRODUCT_BALANCE";
|
|
42
|
+
readonly STATEMENT_STATUS: "recalc#STATEMENT_STATUS";
|
|
42
43
|
};
|
|
43
44
|
readonly auditors: {
|
|
44
45
|
readonly NOTIFY_ONE_PROSPECT: "auditors#NOTIFY_ONE_PROSPECT";
|
|
@@ -42,6 +42,7 @@ exports.EventMap = {
|
|
|
42
42
|
recalc: {
|
|
43
43
|
UNLOCK_PRODUCT_BALANCE: 'recalc#UNLOCK_PRODUCT_BALANCE',
|
|
44
44
|
PRODUCT_BALANCE: 'recalc#PRODUCT_BALANCE',
|
|
45
|
+
STATEMENT_STATUS: 'recalc#STATEMENT_STATUS',
|
|
45
46
|
},
|
|
46
47
|
auditors: {
|
|
47
48
|
NOTIFY_ONE_PROSPECT: 'auditors#NOTIFY_ONE_PROSPECT',
|
|
@@ -39,6 +39,7 @@ export const EventMap = {
|
|
|
39
39
|
recalc: {
|
|
40
40
|
UNLOCK_PRODUCT_BALANCE: 'recalc#UNLOCK_PRODUCT_BALANCE',
|
|
41
41
|
PRODUCT_BALANCE: 'recalc#PRODUCT_BALANCE',
|
|
42
|
+
STATEMENT_STATUS: 'recalc#STATEMENT_STATUS',
|
|
42
43
|
},
|
|
43
44
|
auditors: {
|
|
44
45
|
NOTIFY_ONE_PROSPECT: 'auditors#NOTIFY_ONE_PROSPECT',
|
package/package.json
CHANGED
|
@@ -21,7 +21,7 @@ export declare class BankUploadedTransactionsService {
|
|
|
21
21
|
resetAllocatedBankTransactions(date: Date): Promise<void>;
|
|
22
22
|
createAllocatedBankTransactions(date: Date): Promise<void>;
|
|
23
23
|
convertBankTransactions(startDate: Date, userId: string): Promise<void>;
|
|
24
|
-
recalculateProducts(productIds: string[]): void
|
|
24
|
+
recalculateProducts(productIds: string[], productMap: Record<string, string>): Promise<void>;
|
|
25
25
|
preSplitBankTransactions(transactionId: string, splitTransaction: ISplitTransaction[]): Promise<void>;
|
|
26
26
|
deleteBankTransaction(transactionIds: string[]): Promise<void>;
|
|
27
27
|
revertAllBankTransactions(startDate: Date, endDate: Date, userId: string): Promise<void>;
|
|
@@ -291,6 +291,7 @@ class BankUploadedTransactionsService {
|
|
|
291
291
|
[transaction._id.toString()]: [],
|
|
292
292
|
};
|
|
293
293
|
}, {});
|
|
294
|
+
const productMap = {};
|
|
294
295
|
const productIds = new Set();
|
|
295
296
|
await Promise.all(allocatedTransactions.map(async (transactionToConvert) => {
|
|
296
297
|
const transaction = transactions.find((tr) => tr._id.toString() === transactionToConvert.uploadedBankTransactionId.toString());
|
|
@@ -323,6 +324,15 @@ class BankUploadedTransactionsService {
|
|
|
323
324
|
const createdLoanTransaction = await loanTransactionsService.createLoanTransaction(normalizedTransaction);
|
|
324
325
|
loanTransactionsMap[String(transaction._id)] = [...loanTransactionsMap[String(transaction._id)], new mongoose_1.default.Types.ObjectId(String(createdLoanTransaction._id))];
|
|
325
326
|
productIds.add(String(foundCashAllocationProduct.productId));
|
|
327
|
+
if (!productMap[createdLoanTransaction.productId.toString()]) {
|
|
328
|
+
productMap[createdLoanTransaction.productId.toString()] = createdLoanTransaction.date.toISOString();
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
const foundDate = new Date(productMap[createdLoanTransaction.productId.toString()]);
|
|
332
|
+
if (foundDate > createdLoanTransaction.date) {
|
|
333
|
+
productMap[createdLoanTransaction.productId.toString()] = createdLoanTransaction.date.toISOString();
|
|
334
|
+
}
|
|
335
|
+
}
|
|
326
336
|
}));
|
|
327
337
|
await Promise.all(transactions.map(async (transaction) => {
|
|
328
338
|
await transaction.updateOne({
|
|
@@ -330,17 +340,17 @@ class BankUploadedTransactionsService {
|
|
|
330
340
|
loanTransactionIds: loanTransactionsMap[String(transaction._id)],
|
|
331
341
|
});
|
|
332
342
|
}));
|
|
333
|
-
this.recalculateProducts(Array.from(productIds));
|
|
343
|
+
await this.recalculateProducts(Array.from(productIds), productMap);
|
|
334
344
|
}
|
|
335
|
-
recalculateProducts(productIds) {
|
|
345
|
+
async recalculateProducts(productIds, productMap) {
|
|
336
346
|
// TODO rework in something better
|
|
337
347
|
setTimeout(async () => {
|
|
338
348
|
await Promise.all(productIds.map(async (productId) => {
|
|
339
|
-
console.log({ productId });
|
|
340
349
|
const loanTransactionsService = this.getLoanTransactionsService();
|
|
341
350
|
await loanTransactionsService.recalculateProduct(productId);
|
|
342
351
|
}));
|
|
343
352
|
}, 2000);
|
|
353
|
+
await this.loanStatementStatusService.recalculateStatementQueued(productMap);
|
|
344
354
|
}
|
|
345
355
|
async preSplitBankTransactions(transactionId, splitTransaction) {
|
|
346
356
|
const mappedSplitTransactions = splitTransaction.map((transaction) => {
|
|
@@ -360,10 +370,20 @@ class BankUploadedTransactionsService {
|
|
|
360
370
|
async revertBankTransactions(transactionIds, userId) {
|
|
361
371
|
const foundTransaction = await UploadedBankTransaction_model_1.UploadedBankTransaction.find({ _id: { $in: transactionIds }, isConverted: true });
|
|
362
372
|
const productIds = new Set();
|
|
373
|
+
const productMap = {};
|
|
363
374
|
await Promise.all(foundTransaction.map(async (transaction) => {
|
|
364
375
|
try {
|
|
365
376
|
await Promise.all(transaction.loanTransactionIds.map(async (loanTransactionId) => {
|
|
366
377
|
const loanTransaction = await LoanTransaction_model_1.LoanTransaction.findById(loanTransactionId);
|
|
378
|
+
if (!productMap[loanTransaction.productId.toString()]) {
|
|
379
|
+
productMap[loanTransaction.productId.toString()] = loanTransaction.date.toISOString();
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
const foundDate = new Date(productMap[loanTransaction.productId.toString()]);
|
|
383
|
+
if (foundDate > loanTransaction.date) {
|
|
384
|
+
productMap[loanTransaction.productId.toString()] = loanTransaction.date.toISOString();
|
|
385
|
+
}
|
|
386
|
+
}
|
|
367
387
|
const loanTransactionsService = this.getLoanTransactionsService();
|
|
368
388
|
const isLocked = await loanTransactionsService.checkLockStatus(loanTransaction);
|
|
369
389
|
if (isLocked) {
|
|
@@ -379,12 +399,12 @@ class BankUploadedTransactionsService {
|
|
|
379
399
|
transaction.loanTransactionIds = [];
|
|
380
400
|
transaction.isConverted = false;
|
|
381
401
|
await transaction.save();
|
|
382
|
-
this.recalculateProducts(Array.from(productIds));
|
|
383
402
|
}
|
|
384
403
|
catch (error) {
|
|
385
404
|
console.log(error);
|
|
386
405
|
}
|
|
387
406
|
}));
|
|
407
|
+
await this.recalculateProducts(Array.from(productIds), productMap);
|
|
388
408
|
}
|
|
389
409
|
async getUniqueDates() {
|
|
390
410
|
const uniqueDates = await UploadedBankTransaction_model_1.UploadedBankTransaction.aggregate([
|
|
@@ -328,6 +328,7 @@ export class BankUploadedTransactionsService {
|
|
|
328
328
|
[transaction._id.toString()]: [] as mongoose.Types.ObjectId[],
|
|
329
329
|
};
|
|
330
330
|
}, <{ [transactionId: string]: mongoose.Types.ObjectId[] }>{});
|
|
331
|
+
const productMap: Record<string, string> = {};
|
|
331
332
|
const productIds = new Set<string>();
|
|
332
333
|
await Promise.all(allocatedTransactions.map(async (transactionToConvert) => {
|
|
333
334
|
const transaction = transactions.find((tr) => tr._id.toString() === transactionToConvert.uploadedBankTransactionId.toString());
|
|
@@ -361,6 +362,14 @@ export class BankUploadedTransactionsService {
|
|
|
361
362
|
const createdLoanTransaction = await loanTransactionsService.createLoanTransaction(normalizedTransaction as Partial<ILoanTransactionWithId>);
|
|
362
363
|
loanTransactionsMap[String(transaction._id)] = [...loanTransactionsMap[String(transaction._id)], new mongoose.Types.ObjectId(String(createdLoanTransaction._id))];
|
|
363
364
|
productIds.add(String(foundCashAllocationProduct.productId));
|
|
365
|
+
if (!productMap[createdLoanTransaction.productId.toString()]) {
|
|
366
|
+
productMap[createdLoanTransaction.productId.toString()] = createdLoanTransaction.date.toISOString();
|
|
367
|
+
} else {
|
|
368
|
+
const foundDate = new Date(productMap[createdLoanTransaction.productId.toString()]);
|
|
369
|
+
if (foundDate > createdLoanTransaction.date) {
|
|
370
|
+
productMap[createdLoanTransaction.productId.toString()] = createdLoanTransaction.date.toISOString();
|
|
371
|
+
}
|
|
372
|
+
}
|
|
364
373
|
}));
|
|
365
374
|
|
|
366
375
|
await Promise.all(transactions.map(async (transaction) => {
|
|
@@ -369,18 +378,18 @@ export class BankUploadedTransactionsService {
|
|
|
369
378
|
loanTransactionIds: loanTransactionsMap[String(transaction._id)],
|
|
370
379
|
});
|
|
371
380
|
}));
|
|
372
|
-
this.recalculateProducts(Array.from(productIds));
|
|
381
|
+
await this.recalculateProducts(Array.from(productIds), productMap);
|
|
373
382
|
}
|
|
374
383
|
|
|
375
|
-
recalculateProducts(productIds: string[]) {
|
|
384
|
+
async recalculateProducts(productIds: string[], productMap: Record<string, string>) {
|
|
376
385
|
// TODO rework in something better
|
|
377
386
|
setTimeout(async () => {
|
|
378
387
|
await Promise.all(productIds.map(async (productId) => {
|
|
379
|
-
console.log({ productId });
|
|
380
388
|
const loanTransactionsService = this.getLoanTransactionsService();
|
|
381
389
|
await loanTransactionsService.recalculateProduct(productId);
|
|
382
390
|
}));
|
|
383
391
|
}, 2_000);
|
|
392
|
+
await this.loanStatementStatusService.recalculateStatementQueued(productMap);
|
|
384
393
|
}
|
|
385
394
|
|
|
386
395
|
async preSplitBankTransactions(transactionId: string, splitTransaction: ISplitTransaction[]) {
|
|
@@ -404,10 +413,21 @@ export class BankUploadedTransactionsService {
|
|
|
404
413
|
async revertBankTransactions(transactionIds: string[], userId: string) {
|
|
405
414
|
const foundTransaction = await UploadedBankTransaction.find({ _id: { $in: transactionIds }, isConverted: true });
|
|
406
415
|
const productIds = new Set<string>();
|
|
416
|
+
const productMap: Record<string, string> = {};
|
|
407
417
|
await Promise.all(foundTransaction.map(async (transaction) => {
|
|
408
418
|
try {
|
|
409
419
|
await Promise.all(transaction.loanTransactionIds.map(async (loanTransactionId) => {
|
|
410
420
|
const loanTransaction = await LoanTransaction.findById(loanTransactionId);
|
|
421
|
+
|
|
422
|
+
if (!productMap[loanTransaction.productId.toString()]) {
|
|
423
|
+
productMap[loanTransaction.productId.toString()] = loanTransaction.date.toISOString();
|
|
424
|
+
} else {
|
|
425
|
+
const foundDate = new Date(productMap[loanTransaction.productId.toString()]);
|
|
426
|
+
if (foundDate > loanTransaction.date) {
|
|
427
|
+
productMap[loanTransaction.productId.toString()] = loanTransaction.date.toISOString();
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
411
431
|
const loanTransactionsService = this.getLoanTransactionsService();
|
|
412
432
|
const isLocked = await loanTransactionsService.checkLockStatus(loanTransaction);
|
|
413
433
|
if (isLocked) {
|
|
@@ -423,12 +443,11 @@ export class BankUploadedTransactionsService {
|
|
|
423
443
|
transaction.loanTransactionIds = [];
|
|
424
444
|
transaction.isConverted = false;
|
|
425
445
|
await transaction.save();
|
|
426
|
-
|
|
427
|
-
this.recalculateProducts(Array.from(productIds));
|
|
428
446
|
} catch (error) {
|
|
429
447
|
console.log(error);
|
|
430
448
|
}
|
|
431
449
|
}));
|
|
450
|
+
await this.recalculateProducts(Array.from(productIds), productMap);
|
|
432
451
|
}
|
|
433
452
|
|
|
434
453
|
async getUniqueDates() {
|
|
@@ -27,11 +27,13 @@ import { ISelectedMonth } from '../helpers/date.helper';
|
|
|
27
27
|
import { IStatementPeriod } from './loan-statement.service';
|
|
28
28
|
import { LoanChargesService } from './loan-charges.service';
|
|
29
29
|
import { TermLoanService } from './term-loan.service';
|
|
30
|
+
import { MainQueueService } from './main-queue.service';
|
|
30
31
|
export type SelectablePeriod = 'LAST_MONTH' | 'CURRENT_MONTH' | 'ENTIRE_LOAN' | 'SELECTED_PERIOD';
|
|
31
32
|
export declare class LoanStatementStatusService {
|
|
32
33
|
private readonly getLoanChargesService;
|
|
33
34
|
private readonly termLoanService;
|
|
34
|
-
|
|
35
|
+
private readonly mainQueueService;
|
|
36
|
+
constructor(getLoanChargesService: () => LoanChargesService, termLoanService: TermLoanService, mainQueueService: MainQueueService);
|
|
35
37
|
initStatementStatuses(): Promise<void>;
|
|
36
38
|
getStatementDateFromStringPeriod(period: SelectablePeriod): ISelectedMonth;
|
|
37
39
|
getStatementDateForDate(date: Date): ISelectedMonth;
|
|
@@ -205,4 +207,5 @@ export declare class LoanStatementStatusService {
|
|
|
205
207
|
[K in SelectablePeriod | 'TERM_LOAN']?: boolean;
|
|
206
208
|
}>;
|
|
207
209
|
getBorrowerMonthStatus(borrowerId: string, statementDate: ISelectedMonth): Promise<boolean>;
|
|
210
|
+
recalculateStatementQueued(productMap: Record<string, string>): Promise<void>;
|
|
208
211
|
}
|
|
@@ -7,12 +7,16 @@ exports.LoanStatementStatusService = void 0;
|
|
|
7
7
|
const mongoose_1 = __importDefault(require("mongoose"));
|
|
8
8
|
const dayjs_1 = __importDefault(require("dayjs"));
|
|
9
9
|
const LoanStatementStatus_model_1 = require("../models/LoanStatementStatus.model");
|
|
10
|
+
const event_map_1 = require("../microservice/event-map");
|
|
11
|
+
const queue_map_1 = require("../microservice/queue-map");
|
|
10
12
|
class LoanStatementStatusService {
|
|
11
13
|
getLoanChargesService;
|
|
12
14
|
termLoanService;
|
|
13
|
-
|
|
15
|
+
mainQueueService;
|
|
16
|
+
constructor(getLoanChargesService, termLoanService, mainQueueService) {
|
|
14
17
|
this.getLoanChargesService = getLoanChargesService;
|
|
15
18
|
this.termLoanService = termLoanService;
|
|
19
|
+
this.mainQueueService = mainQueueService;
|
|
16
20
|
}
|
|
17
21
|
async initStatementStatuses() {
|
|
18
22
|
const allStatuses = await LoanStatementStatus_model_1.LoanStatementStatusModel.find().lean();
|
|
@@ -77,7 +81,7 @@ class LoanStatementStatusService {
|
|
|
77
81
|
}
|
|
78
82
|
}
|
|
79
83
|
async updateStatementStatus(productId, statementDate, actual) {
|
|
80
|
-
console.log('updateStatementStatus');
|
|
84
|
+
console.log('updateStatementStatus', { statementDate, actual });
|
|
81
85
|
const statementStatus = await this.getCreateStatementStatus(productId, statementDate);
|
|
82
86
|
if (statementStatus && !statementStatus.locked) {
|
|
83
87
|
statementStatus.actual = actual;
|
|
@@ -160,5 +164,11 @@ class LoanStatementStatusService {
|
|
|
160
164
|
}));
|
|
161
165
|
return lastResults.reduce((acc, res) => res.actual && acc, true);
|
|
162
166
|
}
|
|
167
|
+
async recalculateStatementQueued(productMap) {
|
|
168
|
+
this.mainQueueService.sendTaskToQueue({
|
|
169
|
+
data: { transactionIds: productMap },
|
|
170
|
+
pattern: event_map_1.EventMap.recalc.STATEMENT_STATUS,
|
|
171
|
+
}, queue_map_1.QueueMap.main).catch(console.error);
|
|
172
|
+
}
|
|
163
173
|
}
|
|
164
174
|
exports.LoanStatementStatusService = LoanStatementStatusService;
|
|
@@ -10,6 +10,9 @@ import {
|
|
|
10
10
|
import { IStatementPeriod } from './loan-statement.service';
|
|
11
11
|
import { LoanChargesService } from './loan-charges.service';
|
|
12
12
|
import { TermLoanService } from './term-loan.service';
|
|
13
|
+
import { EventMap } from '../microservice/event-map';
|
|
14
|
+
import { QueueMap } from '../microservice/queue-map';
|
|
15
|
+
import { MainQueueService } from './main-queue.service';
|
|
13
16
|
|
|
14
17
|
export type SelectablePeriod = 'LAST_MONTH' | 'CURRENT_MONTH' | 'ENTIRE_LOAN' | 'SELECTED_PERIOD';
|
|
15
18
|
|
|
@@ -17,6 +20,7 @@ export class LoanStatementStatusService {
|
|
|
17
20
|
constructor(
|
|
18
21
|
private readonly getLoanChargesService: () => LoanChargesService,
|
|
19
22
|
private readonly termLoanService: TermLoanService,
|
|
23
|
+
private readonly mainQueueService: MainQueueService,
|
|
20
24
|
) {
|
|
21
25
|
}
|
|
22
26
|
|
|
@@ -92,7 +96,7 @@ export class LoanStatementStatusService {
|
|
|
92
96
|
}
|
|
93
97
|
|
|
94
98
|
async updateStatementStatus(productId: string, statementDate: ISelectedMonth, actual: boolean) {
|
|
95
|
-
console.log('updateStatementStatus');
|
|
99
|
+
console.log('updateStatementStatus', { statementDate, actual });
|
|
96
100
|
const statementStatus = await this.getCreateStatementStatus(productId, statementDate);
|
|
97
101
|
if (statementStatus && !statementStatus.locked) {
|
|
98
102
|
statementStatus.actual = actual;
|
|
@@ -178,4 +182,11 @@ export class LoanStatementStatusService {
|
|
|
178
182
|
}));
|
|
179
183
|
return lastResults.reduce((acc, res) => res.actual && acc, true);
|
|
180
184
|
}
|
|
185
|
+
|
|
186
|
+
async recalculateStatementQueued(productMap: Record<string, string>) {
|
|
187
|
+
this.mainQueueService.sendTaskToQueue({
|
|
188
|
+
data: { transactionIds: productMap },
|
|
189
|
+
pattern: EventMap.recalc.STATEMENT_STATUS,
|
|
190
|
+
}, QueueMap.main).catch(console.error);
|
|
191
|
+
}
|
|
181
192
|
}
|
|
@@ -155,7 +155,7 @@ export declare class LoanTransactionsService {
|
|
|
155
155
|
getTransactionReport(transactionIds: string[], borrowerId: string, effectiveDate: Date): Promise<{
|
|
156
156
|
transactionIdsToMark: any[];
|
|
157
157
|
transactions: {
|
|
158
|
-
[x: string]: (string | number | string[]
|
|
158
|
+
[x: string]: (string | number | Date | string[])[];
|
|
159
159
|
}[];
|
|
160
160
|
}>;
|
|
161
161
|
getBorrowerIdsForFile(transactionFileId: string): Promise<{
|