gemcap-be-common 1.3.99 → 1.3.101
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/package.json
CHANGED
|
@@ -313,11 +313,11 @@ class LoanTransactionsService {
|
|
|
313
313
|
updatedTransaction = await LoanTransaction_model_1.LoanTransaction.findByIdAndUpdate(transaction._id, transaction, { new: true });
|
|
314
314
|
}
|
|
315
315
|
if (startId) {
|
|
316
|
-
|
|
316
|
+
this.recalculateBalance(startId).catch(console.error);
|
|
317
317
|
}
|
|
318
318
|
const statementDate = this.loanStatementStatusService.getStatementDateForDate(new Date(transaction.date));
|
|
319
|
-
|
|
320
|
-
|
|
319
|
+
this.loanStatementStatusService.updateStatementStatus(transaction.productId.toString(), statementDate, false).catch(console.error);
|
|
320
|
+
this.termLoanService.setTermLoanExpected(transaction.productId.toString()).catch(console.error);
|
|
321
321
|
return updatedTransaction;
|
|
322
322
|
}
|
|
323
323
|
async recalculateProduct(productId) {
|
|
@@ -485,74 +485,64 @@ class LoanTransactionsService {
|
|
|
485
485
|
console.error(`Transaction not found: ${transactionId}`);
|
|
486
486
|
return;
|
|
487
487
|
}
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
{
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
{
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
]);
|
|
527
|
-
if (prevBeforeStart.length) {
|
|
528
|
-
balance = prevBeforeStart[0].balance || 0;
|
|
529
|
-
floatedBalance = prevBeforeStart[0].floatedBalance || 0;
|
|
530
|
-
}
|
|
531
|
-
// Один проход для расчёта balance и floatedBalance
|
|
532
|
-
for (const tr of allTransactions) {
|
|
533
|
-
// Пересчёт обычного баланса
|
|
534
|
-
balance = new decimal_js_1.default(balance).add(tr.amount).toNumber();
|
|
535
|
-
// Пересчёт floatedBalance
|
|
536
|
-
const totalPostponed = await (0, loan_products_db_1.getPostponedTransactions)(tr.date, tr.productId.toString(), true);
|
|
537
|
-
switch (tr.transactionType) {
|
|
538
|
-
case LoanTransaction_model_1.ELoanTransactionTypes.COLLECTION:
|
|
539
|
-
await this.cleanRecalculated(tr._id.toString());
|
|
540
|
-
await this.createPostponedTransaction(tr);
|
|
541
|
-
floatedBalance = new decimal_js_1.default(floatedBalance).add(totalPostponed).toNumber();
|
|
542
|
-
break;
|
|
543
|
-
case LoanTransaction_model_1.ELoanTransactionTypes.DISBURSEMENT:
|
|
544
|
-
case LoanTransaction_model_1.ELoanTransactionTypes.ADJUSTMENT:
|
|
545
|
-
floatedBalance = new decimal_js_1.default(floatedBalance).add(tr.amount).add(totalPostponed).toNumber();
|
|
546
|
-
break;
|
|
547
|
-
}
|
|
548
|
-
await LoanTransaction_model_1.LoanTransaction.updateOne({ _id: tr._id }, { balance, floatedBalance }, { session });
|
|
549
|
-
}
|
|
550
|
-
await LoanProducts_model_1.LoanProduct.updateOne({ _id: startTransaction.productId }, { isBalanceActual: true, isFloatedBalanceActual: true }, { session });
|
|
551
|
-
});
|
|
488
|
+
// Получаем все транзакции, начиная с самой ранней, которую нужно пересчитать
|
|
489
|
+
const earliestTransaction = await LoanTransaction_model_1.LoanTransaction.aggregate([
|
|
490
|
+
{
|
|
491
|
+
$match: {
|
|
492
|
+
productId: startTransaction.productId,
|
|
493
|
+
date: { $lte: new Date(startTransaction.date) },
|
|
494
|
+
},
|
|
495
|
+
},
|
|
496
|
+
{ $sort: { date: 1, order: 1, createdAt: 1 } },
|
|
497
|
+
{ $limit: 1 },
|
|
498
|
+
]);
|
|
499
|
+
const fromDate = earliestTransaction.length
|
|
500
|
+
? earliestTransaction[0].date
|
|
501
|
+
: startTransaction.date;
|
|
502
|
+
const allTransactions = await LoanTransaction_model_1.LoanTransaction.aggregate([
|
|
503
|
+
{
|
|
504
|
+
$match: {
|
|
505
|
+
productId: startTransaction.productId,
|
|
506
|
+
date: { $gte: fromDate },
|
|
507
|
+
},
|
|
508
|
+
},
|
|
509
|
+
{ $sort: { date: 1, order: 1, createdAt: 1 } },
|
|
510
|
+
]);
|
|
511
|
+
let balance = 0;
|
|
512
|
+
let floatedBalance = 0;
|
|
513
|
+
const prevBeforeStart = await LoanTransaction_model_1.LoanTransaction.aggregate([
|
|
514
|
+
{
|
|
515
|
+
$match: {
|
|
516
|
+
productId: startTransaction.productId,
|
|
517
|
+
date: { $lt: fromDate },
|
|
518
|
+
},
|
|
519
|
+
},
|
|
520
|
+
{ $sort: { date: -1, order: -1, createdAt: -1 } },
|
|
521
|
+
{ $limit: 1 },
|
|
522
|
+
]);
|
|
523
|
+
if (prevBeforeStart.length) {
|
|
524
|
+
balance = prevBeforeStart[0].balance || 0;
|
|
525
|
+
floatedBalance = prevBeforeStart[0].floatedBalance || 0;
|
|
552
526
|
}
|
|
553
|
-
|
|
554
|
-
|
|
527
|
+
for (const tr of allTransactions) {
|
|
528
|
+
// regular balance recalculation
|
|
529
|
+
balance = new decimal_js_1.default(balance).add(tr.amount).toNumber();
|
|
530
|
+
// floatedBalance recalculation
|
|
531
|
+
const totalPostponed = await (0, loan_products_db_1.getPostponedTransactions)(tr.date, tr.productId.toString(), true);
|
|
532
|
+
switch (tr.transactionType) {
|
|
533
|
+
case LoanTransaction_model_1.ELoanTransactionTypes.COLLECTION:
|
|
534
|
+
await this.cleanRecalculated(tr._id.toString());
|
|
535
|
+
await this.createPostponedTransaction(tr);
|
|
536
|
+
floatedBalance = new decimal_js_1.default(floatedBalance).add(totalPostponed).toNumber();
|
|
537
|
+
break;
|
|
538
|
+
case LoanTransaction_model_1.ELoanTransactionTypes.DISBURSEMENT:
|
|
539
|
+
case LoanTransaction_model_1.ELoanTransactionTypes.ADJUSTMENT:
|
|
540
|
+
floatedBalance = new decimal_js_1.default(floatedBalance).add(tr.amount).add(totalPostponed).toNumber();
|
|
541
|
+
break;
|
|
542
|
+
}
|
|
543
|
+
await LoanTransaction_model_1.LoanTransaction.updateOne({ _id: tr._id }, { balance, floatedBalance });
|
|
555
544
|
}
|
|
545
|
+
await LoanProducts_model_1.LoanProduct.updateOne({ _id: startTransaction.productId }, { isBalanceActual: true, isFloatedBalanceActual: true });
|
|
556
546
|
}
|
|
557
547
|
async deleteLoanTransaction(transactionId, updateLoanPayment, userId = null) {
|
|
558
548
|
const currentTransaction = await LoanTransaction_model_1.LoanTransaction.findById(transactionId).lean();
|
|
@@ -587,11 +577,11 @@ class LoanTransactionsService {
|
|
|
587
577
|
}
|
|
588
578
|
}
|
|
589
579
|
if (nextTransaction.length) {
|
|
590
|
-
|
|
580
|
+
this.recalculateBalance(nextTransaction[0]._id.toString()).catch(console.error);
|
|
591
581
|
}
|
|
592
582
|
const statementDate = this.loanStatementStatusService.getStatementDateForDate(new Date(currentTransaction.date));
|
|
593
|
-
|
|
594
|
-
|
|
583
|
+
this.loanStatementStatusService.updateStatementStatus(currentTransaction.productId.toString(), statementDate, false).catch(console.error);
|
|
584
|
+
this.termLoanService.setTermLoanExpected(currentTransaction.productId.toString()).catch(console.error);
|
|
595
585
|
}
|
|
596
586
|
async createPostponedTransaction(transaction) {
|
|
597
587
|
const currentDay = (0, dayjs_1.default)(new Date(transaction.date)).format('YYYY-MM-DD');
|
|
@@ -371,11 +371,11 @@ export class LoanTransactionsService {
|
|
|
371
371
|
updatedTransaction = await LoanTransaction.findByIdAndUpdate(transaction._id, transaction, { new: true });
|
|
372
372
|
}
|
|
373
373
|
if (startId) {
|
|
374
|
-
|
|
374
|
+
this.recalculateBalance(startId).catch(console.error);
|
|
375
375
|
}
|
|
376
376
|
const statementDate = this.loanStatementStatusService.getStatementDateForDate(new Date(transaction.date));
|
|
377
|
-
|
|
378
|
-
|
|
377
|
+
this.loanStatementStatusService.updateStatementStatus(transaction.productId.toString(), statementDate, false).catch(console.error);
|
|
378
|
+
this.termLoanService.setTermLoanExpected(transaction.productId.toString()).catch(console.error);
|
|
379
379
|
return updatedTransaction;
|
|
380
380
|
}
|
|
381
381
|
|
|
@@ -551,90 +551,79 @@ export class LoanTransactionsService {
|
|
|
551
551
|
return;
|
|
552
552
|
}
|
|
553
553
|
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
{
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
{ $sort: { date: 1, order: 1, createdAt: 1 } },
|
|
566
|
-
{ $limit: 1 }
|
|
567
|
-
]);
|
|
568
|
-
|
|
569
|
-
const fromDate = earliestTransaction.length
|
|
570
|
-
? earliestTransaction[0].date
|
|
571
|
-
: startTransaction.date;
|
|
554
|
+
// Получаем все транзакции, начиная с самой ранней, которую нужно пересчитать
|
|
555
|
+
const earliestTransaction = await LoanTransaction.aggregate<ILoanTransactionDoc>([
|
|
556
|
+
{
|
|
557
|
+
$match: {
|
|
558
|
+
productId: startTransaction.productId,
|
|
559
|
+
date: { $lte: new Date(startTransaction.date) },
|
|
560
|
+
},
|
|
561
|
+
},
|
|
562
|
+
{ $sort: { date: 1, order: 1, createdAt: 1 } },
|
|
563
|
+
{ $limit: 1 },
|
|
564
|
+
]);
|
|
572
565
|
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
productId: startTransaction.productId,
|
|
577
|
-
date: { $gte: fromDate }
|
|
578
|
-
}
|
|
579
|
-
},
|
|
580
|
-
{ $sort: { date: 1, order: 1, createdAt: 1 } }
|
|
581
|
-
]);
|
|
566
|
+
const fromDate = earliestTransaction.length
|
|
567
|
+
? earliestTransaction[0].date
|
|
568
|
+
: startTransaction.date;
|
|
582
569
|
|
|
583
|
-
|
|
584
|
-
|
|
570
|
+
const allTransactions = await LoanTransaction.aggregate<ILoanTransactionDoc>([
|
|
571
|
+
{
|
|
572
|
+
$match: {
|
|
573
|
+
productId: startTransaction.productId,
|
|
574
|
+
date: { $gte: fromDate },
|
|
575
|
+
},
|
|
576
|
+
},
|
|
577
|
+
{ $sort: { date: 1, order: 1, createdAt: 1 } },
|
|
578
|
+
]);
|
|
585
579
|
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
{
|
|
589
|
-
$match: {
|
|
590
|
-
productId: startTransaction.productId,
|
|
591
|
-
date: { $lt: fromDate }
|
|
592
|
-
}
|
|
593
|
-
},
|
|
594
|
-
{ $sort: { date: -1, order: -1, createdAt: -1 } },
|
|
595
|
-
{ $limit: 1 }
|
|
596
|
-
]);
|
|
580
|
+
let balance = 0;
|
|
581
|
+
let floatedBalance = 0;
|
|
597
582
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
583
|
+
const prevBeforeStart = await LoanTransaction.aggregate<ILoanTransactionDoc>([
|
|
584
|
+
{
|
|
585
|
+
$match: {
|
|
586
|
+
productId: startTransaction.productId,
|
|
587
|
+
date: { $lt: fromDate },
|
|
588
|
+
},
|
|
589
|
+
},
|
|
590
|
+
{ $sort: { date: -1, order: -1, createdAt: -1 } },
|
|
591
|
+
{ $limit: 1 },
|
|
592
|
+
]);
|
|
602
593
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
// Пересчёт floatedBalance
|
|
609
|
-
const totalPostponed = await getPostponedTransactions(tr.date, tr.productId.toString(), true);
|
|
610
|
-
switch (tr.transactionType) {
|
|
611
|
-
case ELoanTransactionTypes.COLLECTION:
|
|
612
|
-
await this.cleanRecalculated(tr._id.toString());
|
|
613
|
-
await this.createPostponedTransaction(tr);
|
|
614
|
-
floatedBalance = new Decimal(floatedBalance).add(totalPostponed).toNumber();
|
|
615
|
-
break;
|
|
616
|
-
case ELoanTransactionTypes.DISBURSEMENT:
|
|
617
|
-
case ELoanTransactionTypes.ADJUSTMENT:
|
|
618
|
-
floatedBalance = new Decimal(floatedBalance).add(tr.amount).add(totalPostponed).toNumber();
|
|
619
|
-
break;
|
|
620
|
-
}
|
|
594
|
+
if (prevBeforeStart.length) {
|
|
595
|
+
balance = prevBeforeStart[0].balance || 0;
|
|
596
|
+
floatedBalance = prevBeforeStart[0].floatedBalance || 0;
|
|
597
|
+
}
|
|
621
598
|
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
599
|
+
for (const tr of allTransactions) {
|
|
600
|
+
// regular balance recalculation
|
|
601
|
+
balance = new Decimal(balance).add(tr.amount).toNumber();
|
|
602
|
+
|
|
603
|
+
// floatedBalance recalculation
|
|
604
|
+
const totalPostponed = await getPostponedTransactions(tr.date, tr.productId.toString(), true);
|
|
605
|
+
switch (tr.transactionType) {
|
|
606
|
+
case ELoanTransactionTypes.COLLECTION:
|
|
607
|
+
await this.cleanRecalculated(tr._id.toString());
|
|
608
|
+
await this.createPostponedTransaction(tr);
|
|
609
|
+
floatedBalance = new Decimal(floatedBalance).add(totalPostponed).toNumber();
|
|
610
|
+
break;
|
|
611
|
+
case ELoanTransactionTypes.DISBURSEMENT:
|
|
612
|
+
case ELoanTransactionTypes.ADJUSTMENT:
|
|
613
|
+
floatedBalance = new Decimal(floatedBalance).add(tr.amount).add(totalPostponed).toNumber();
|
|
614
|
+
break;
|
|
615
|
+
}
|
|
628
616
|
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
);
|
|
634
|
-
});
|
|
635
|
-
} finally {
|
|
636
|
-
await session.endSession();
|
|
617
|
+
await LoanTransaction.updateOne(
|
|
618
|
+
{ _id: tr._id },
|
|
619
|
+
{ balance, floatedBalance },
|
|
620
|
+
);
|
|
637
621
|
}
|
|
622
|
+
|
|
623
|
+
await LoanProduct.updateOne(
|
|
624
|
+
{ _id: startTransaction.productId },
|
|
625
|
+
{ isBalanceActual: true, isFloatedBalanceActual: true },
|
|
626
|
+
);
|
|
638
627
|
}
|
|
639
628
|
|
|
640
629
|
async deleteLoanTransaction(transactionId: string, updateLoanPayment: boolean, userId = null) {
|
|
@@ -670,11 +659,11 @@ export class LoanTransactionsService {
|
|
|
670
659
|
}
|
|
671
660
|
}
|
|
672
661
|
if (nextTransaction.length) {
|
|
673
|
-
|
|
662
|
+
this.recalculateBalance(nextTransaction[0]._id.toString()).catch(console.error);
|
|
674
663
|
}
|
|
675
664
|
const statementDate = this.loanStatementStatusService.getStatementDateForDate(new Date(currentTransaction.date));
|
|
676
|
-
|
|
677
|
-
|
|
665
|
+
this.loanStatementStatusService.updateStatementStatus(currentTransaction.productId.toString(), statementDate, false).catch(console.error);
|
|
666
|
+
this.termLoanService.setTermLoanExpected(currentTransaction.productId.toString()).catch(console.error);
|
|
678
667
|
}
|
|
679
668
|
|
|
680
669
|
async createPostponedTransaction(transaction: ILoanTransactionDoc) {
|