1
|
|
|
import { InjectRepository } from '@nestjs/typeorm'; |
2
|
|
|
import { Injectable } from '@nestjs/common'; |
3
|
|
|
import { Repository } from 'typeorm'; |
4
|
|
|
import { IUserRepository } from 'src/Domain/HumanResource/User/Repository/IUserRepository'; |
5
|
|
|
import { User, UserRole } from 'src/Domain/HumanResource/User/User.entity'; |
6
|
|
|
|
7
|
|
|
@Injectable() |
8
|
|
|
export class UserRepository implements IUserRepository { |
9
|
|
|
constructor( |
10
|
|
|
@InjectRepository(User) |
11
|
|
|
private readonly repository: Repository<User> |
12
|
|
|
) {} |
13
|
|
|
|
14
|
|
|
public findOneByApiToken(apiToken: string): Promise<User | undefined> { |
15
|
|
|
return this.repository |
16
|
|
|
.createQueryBuilder('user') |
17
|
|
|
.select([ |
18
|
|
|
'user.id', |
19
|
|
|
'user.firstName', |
20
|
|
|
'user.lastName', |
21
|
|
|
'user.email', |
22
|
|
|
'user.role' |
23
|
|
|
]) |
24
|
|
|
.where('user.apiToken = :apiToken', { apiToken }) |
25
|
|
|
.getOne(); |
26
|
|
|
} |
27
|
|
|
|
28
|
|
|
public findOneByEmail(email: string): Promise<User | undefined> { |
29
|
|
|
return this.repository |
30
|
|
|
.createQueryBuilder('user') |
31
|
|
|
.select([ |
32
|
|
|
'user.id', |
33
|
|
|
'user.firstName', |
34
|
|
|
'user.lastName', |
35
|
|
|
'user.email', |
36
|
|
|
'user.apiToken', |
37
|
|
|
'user.password', |
38
|
|
|
'user.role' |
39
|
|
|
]) |
40
|
|
|
.where('user.email = :email', { email }) |
41
|
|
|
.getOne(); |
42
|
|
|
} |
43
|
|
|
|
44
|
|
|
public findOneById(id: string): Promise<User | undefined> { |
45
|
|
|
return this.repository |
46
|
|
|
.createQueryBuilder('user') |
47
|
|
|
.select([ |
48
|
|
|
'user.id', |
49
|
|
|
'user.firstName', |
50
|
|
|
'user.lastName', |
51
|
|
|
'user.email', |
52
|
|
|
'user.role' |
53
|
|
|
]) |
54
|
|
|
.where('user.id = :id', { id }) |
55
|
|
|
.getOne(); |
56
|
|
|
} |
57
|
|
|
|
58
|
|
|
public findUsers( |
59
|
|
|
withAccountant: boolean, |
60
|
|
|
noLeavingDate: boolean = false |
61
|
|
|
): Promise<User[]> { |
62
|
|
|
const query = this.repository |
63
|
|
|
.createQueryBuilder('user') |
64
|
|
|
.select([ |
65
|
|
|
'user.id', |
66
|
|
|
'user.firstName', |
67
|
|
|
'user.lastName', |
68
|
|
|
'user.email', |
69
|
|
|
'user.role' |
70
|
|
|
]) |
71
|
|
|
.orderBy('user.lastName', 'ASC') |
72
|
|
|
.addOrderBy('user.firstName', 'ASC'); |
73
|
|
|
|
74
|
|
|
if (false === withAccountant) { |
75
|
|
|
query.andWhere('user.role <> :role', { role: UserRole.ACCOUNTANT }); |
76
|
|
|
} |
77
|
|
|
if (noLeavingDate) { |
78
|
|
|
query.innerJoin('user.userAdministrative', 'userAdministrative'); |
79
|
|
|
query.andWhere('userAdministrative.leavingDate IS NULL'); |
80
|
|
|
} |
81
|
|
|
|
82
|
|
|
return query.getMany(); |
83
|
|
|
} |
84
|
|
|
|
85
|
|
|
public findUsersWithPayslipInfo(): Promise<User[]> { |
86
|
|
|
const query = this.repository |
87
|
|
|
.createQueryBuilder('user') |
88
|
|
|
.select([ |
89
|
|
|
'user.id', |
90
|
|
|
'user.firstName', |
91
|
|
|
'user.lastName', |
92
|
|
|
'userAdministrative.joiningDate', |
93
|
|
|
'userAdministrative.leavingDate', |
94
|
|
|
'userAdministrative.annualEarnings', |
95
|
|
|
'userAdministrative.transportFee', |
96
|
|
|
'userAdministrative.healthInsurance', |
97
|
|
|
'userAdministrative.executivePosition', |
98
|
|
|
'userAdministrative.contract', |
99
|
|
|
'userAdministrative.workingTime', |
100
|
|
|
'userAdministrative.sustainableMobilityFee' |
101
|
|
|
]); |
102
|
|
|
query.innerJoin('user.userAdministrative', 'userAdministrative'); |
103
|
|
|
query.andWhere('user.role <> :role', { role: UserRole.ACCOUNTANT }); |
104
|
|
|
query.andWhere('userAdministrative.leavingDate IS NULL'); |
105
|
|
|
query.orderBy('user.lastName', 'ASC'); |
106
|
|
|
query.addOrderBy('user.firstName', 'ASC'); |
107
|
|
|
|
108
|
|
|
return query.getMany(); |
109
|
|
|
} |
110
|
|
|
|
111
|
|
|
public save(user: User): Promise<User> { |
112
|
|
|
return this.repository.save(user); |
113
|
|
|
} |
114
|
|
|
} |
115
|
|
|
|