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.
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gemcap-be-common",
3
- "version": "1.4.102",
3
+ "version": "1.4.104",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -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
- constructor(getLoanChargesService: () => LoanChargesService, termLoanService: TermLoanService);
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
- constructor(getLoanChargesService, termLoanService) {
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[] | Date)[];
158
+ [x: string]: (string | number | Date | string[])[];
159
159
  }[];
160
160
  }>;
161
161
  getBorrowerIdsForFile(transactionFileId: string): Promise<{