Passed
Pull Request — master (#258)
by Mathieu
01:47
created

GetUsersSavingsRecordsBalanceQueryHandler   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 53
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 5
eloc 46
dl 0
loc 53
c 0
b 0
f 0
rs 10

1 Function

Rating   Name   Duplication   Size   Complexity  
B execute 0 46 5
1
import { QueryHandler } from '@nestjs/cqrs';
2
import { Inject } from '@nestjs/common';
3
import { GetUsersSavingsRecordsBalanceQuery } from './GetUsersSavingsRecordsBalanceQuery';
4
import { IUserSavingsRecordRepository } from 'src/Domain/HumanResource/Savings/Repository/IUserSavingsRecordRepository';
5
import { UserSavingsRecordsBalanceView } from '../View/UserSavingsRecordsBalanceView';
6
import { SavingsRecordType } from 'src/Domain/HumanResource/Savings/UserSavingsRecord.entity';
7
8
type UserBalance = {
9
  firstName: string;
10
  lastName: string;
11
  balance: number;
12
}
13
14
@QueryHandler(GetUsersSavingsRecordsBalanceQuery)
15
export class GetUsersSavingsRecordsBalanceQueryHandler {
16
  constructor(
17
    @Inject('IUserSavingsRecordRepository')
18
    private readonly userSavingsRecordRepository: IUserSavingsRecordRepository
19
  ) {}
20
21
  public async execute(
22
    query: GetUsersSavingsRecordsBalanceQuery
23
  ): Promise<UserSavingsRecordsBalanceView[]> {
24
    const userSavingsRecords = await this.userSavingsRecordRepository.findUsersSavingsRecords();
25
    const userSavingsRecordsBalances: UserSavingsRecordsBalanceView[] = [];
26
27
    let usersBalances = {};
28
29
    for (const savingsRecord of userSavingsRecords) {
30
      const interestRate = savingsRecord.getInterestRate();
31
      const user = savingsRecord.getUser();
32
      const previousBalance = usersBalances[user.getId()]?.balance || 0;
33
34
      let balance = 0;
35
36
      if (savingsRecord.getType() === SavingsRecordType.INPUT && interestRate) {
37
        balance = previousBalance + savingsRecord.getAmount() * (1 + interestRate.getRate() / 1000);
38
      } else {
39
        balance = previousBalance - savingsRecord.getAmount();
40
      }
41
42
      usersBalances = {
43
        ...usersBalances,
44
        [user.getId()]: {
45
          firstName: user.getFirstName(),
46
          lastName: user.getLastName(),
47
          balance,
48
        }
49
      };
50
    }
51
52
    for (const [userId, value] of Object.entries(usersBalances)) {
53
      const {firstName, lastName, balance} = value as UserBalance;
54
55
      userSavingsRecordsBalances.push(
56
        new UserSavingsRecordsBalanceView(
57
          userId,
58
          firstName,
59
          lastName,
60
          balance / 100,
61
        )
62
      );
63
    };
64
65
    return userSavingsRecordsBalances;
66
  }
67
}
68