-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathtransfer-subscriber.ts
59 lines (50 loc) · 2.02 KB
/
transfer-subscriber.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**
* SudoSOS back-end API service.
* Copyright (C) 2024 Study association GEWIS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* @license
*/
/**
* This is the module page of the transfer-subscriber.
*
* @module internal/subscribers/transfer-subscriber
*/
import { EntitySubscriberInterface, EventSubscriber, InsertEvent } from 'typeorm';
import Transfer from '../entity/transactions/transfer';
import User from '../entity/user/user';
import BalanceService from '../service/balance-service';
@EventSubscriber()
export default class TransferSubscriber implements EntitySubscriberInterface {
listenTo(): Function | string {
return Transfer;
}
async afterInsert(event: InsertEvent<Transfer>) {
if (event.entity.toId == null) return;
const user = await event.manager.findOne(User, { where: { id: event.entity.toId }, relations: ['currentFines'] });
if (user.currentFines == null) return;
const balance = await new BalanceService().getBalance(user.id);
// If the new transfer is not included in the balance calculation, add it manually
let currentBalance = balance.amount.amount;
if (balance.lastTransferId < event.entity.id) {
currentBalance += event.entity.amountInclVat.getAmount();
}
// Remove currently unpaid fines when new balance is positive.
if (currentBalance >= 0) {
user.currentFines = null;
await event.manager.save(user);
}
}
}