src/Infrastructure/HumanResource/Leave/Repository/LeaveRequestRepository.ts   A
last analyzed

Complexity

Total Complexity 9
Complexity/F 1.13

Size

Lines of Code 170
Function Count 8

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 9
eloc 145
mnd 1
bc 1
fnc 8
dl 0
loc 170
rs 10
bpm 0.125
cpm 1.125
noi 0
c 0
b 0
f 0

8 Functions

Rating   Name   Duplication   Size   Complexity  
A LeaveRequestRepository.save 0 3 1
A LeaveRequestRepository.remove 0 3 1
A LeaveRequestRepository.findAcceptedLeaveRequestsByMonth 0 27 1
A LeaveRequestRepository.getPendingCount 0 8 1
A LeaveRequestRepository.findAcceptedLeaveRequests 0 19 1
A LeaveRequestRepository.findExistingLeaveRequestsByUserAndPeriod 0 22 1
A LeaveRequestRepository.findOneById 0 25 1
A LeaveRequestRepository.findLeaveRequests 0 29 2
1
import { InjectRepository } from '@nestjs/typeorm';
2
import { Repository } from 'typeorm';
3
import { ILeaveRequestRepository } from 'src/Domain/HumanResource/Leave/Repository/ILeaveRequestRepository';
4
import { MAX_ITEMS_PER_PAGE } from 'src/Application/Common/Pagination';
5
import {
6
  LeaveRequest,
7
  Status
8
} from 'src/Domain/HumanResource/Leave/LeaveRequest.entity';
9
import { User } from 'src/Domain/HumanResource/User/User.entity';
10
import { IDateUtils } from 'src/Application/IDateUtils';
11
import { Inject } from '@nestjs/common';
12
import { MonthDate } from 'src/Application/Common/MonthDate';
13
14
export class LeaveRequestRepository implements ILeaveRequestRepository {
15
  constructor(
16
    @InjectRepository(LeaveRequest)
17
    private readonly repository: Repository<LeaveRequest>,
18
    @Inject('IDateUtils')
19
    private readonly dateUtils: IDateUtils
20
  ) {}
21
22
  public save(leaveRequest: LeaveRequest): Promise<LeaveRequest> {
23
    return this.repository.save(leaveRequest);
24
  }
25
26
  public remove(leaveRequest: LeaveRequest): void {
27
    this.repository.delete(leaveRequest.getId());
28
  }
29
30
  public findOneById(id: string): Promise<LeaveRequest | undefined> {
31
    return this.repository
32
      .createQueryBuilder('leaveRequest')
33
      .select([
34
        'leaveRequest.id',
35
        'leaveRequest.type',
36
        'leaveRequest.status',
37
        'leaveRequest.startDate',
38
        'leaveRequest.startsAllDay',
39
        'leaveRequest.endDate',
40
        'leaveRequest.endsAllDay',
41
        'leaveRequest.comment',
42
        'leaveRequest.moderateAt',
43
        'leaveRequest.moderationComment',
44
        'user.id',
45
        'user.firstName',
46
        'user.lastName',
47
        'moderator.id',
48
        'moderator.firstName',
49
        'moderator.lastName'
50
      ])
51
      .where('leaveRequest.id = :id', { id })
52
      .innerJoin('leaveRequest.user', 'user')
53
      .leftJoin('leaveRequest.moderator', 'moderator')
54
      .getOne();
55
  }
56
57
  public findExistingLeaveRequestsByUserAndPeriod(
58
    user: User,
59
    startDate: string,
60
    endDate: string
61
  ): Promise<LeaveRequest | undefined> {
62
    return this.repository
63
      .createQueryBuilder('leaveRequest')
64
      .select('leaveRequest.id')
65
      .where('leaveRequest.user = :id', { id: user.getId() })
66
      .andWhere(
67
        '(leaveRequest.startDate BETWEEN :startDate AND :endDate OR leaveRequest.endDate BETWEEN :startDate AND :endDate)',
68
        {
69
          startDate,
70
          endDate
71
        }
72
      )
73
      .andWhere(
74
        '(leaveRequest.status = :accepted OR leaveRequest.status = :pending)',
75
        {
76
          accepted: Status.ACCEPTED,
77
          pending: Status.PENDING
78
        }
79
      )
80
      .getOne();
81
  }
82
83
  public findLeaveRequests(
84
    page: number,
85
    status?: Status
86
  ): Promise<[LeaveRequest[], number]> {
87
    const query = this.repository
88
      .createQueryBuilder('leaveRequest')
89
      .select([
90
        'leaveRequest.id',
91
        'leaveRequest.type',
92
        'leaveRequest.status',
93
        'leaveRequest.startDate',
94
        'leaveRequest.startsAllDay',
95
        'leaveRequest.endDate',
96
        'leaveRequest.endsAllDay',
97
        'user.id',
98
        'user.firstName',
99
        'user.lastName'
100
      ])
101
      .innerJoin('leaveRequest.user', 'user')
102
      .orderBy('leaveRequest.startDate', 'DESC')
103
      .limit(MAX_ITEMS_PER_PAGE)
104
      .offset((page - 1) * MAX_ITEMS_PER_PAGE);
105
106
    if (status) {
107
      query.where('leaveRequest.status = :status', { status });
108
    }
109
110
    return query.getManyAndCount();
111
  }
112
113
  public findAcceptedLeaveRequests(): Promise<LeaveRequest[]> {
114
    const query = this.repository
115
      .createQueryBuilder('leaveRequest')
116
      .select([
117
        'leaveRequest.id',
118
        'leaveRequest.startDate',
119
        'leaveRequest.endDate',
120
        'user.firstName',
121
        'user.lastName'
122
      ])
123
      .where('status = :status')
124
      .setParameter('status', Status.ACCEPTED)
125
      .innerJoin('leaveRequest.user', 'user')
126
      .innerJoin('user.userAdministrative', 'userAdministrative')
127
      .andWhere('userAdministrative.leavingDate IS NULL')
128
      .addOrderBy('leaveRequest.startDate', 'ASC');
129
130
    return query.getMany();
131
  }
132
133
  public findAcceptedLeaveRequestsByMonth(date: Date): Promise<LeaveRequest[]> {
134
    const monthDate: MonthDate = this.dateUtils.getMonth(date);
135
136
    const query = this.repository
137
      .createQueryBuilder('leaveRequest')
138
      .select([
139
        'leaveRequest.id',
140
        'leaveRequest.type',
141
        'leaveRequest.startDate',
142
        'leaveRequest.startsAllDay',
143
        'leaveRequest.endDate',
144
        'leaveRequest.endsAllDay',
145
        'user.id'
146
      ])
147
      .where('status = :status')
148
      .setParameter('status', Status.ACCEPTED)
149
      .andWhere('leaveRequest.startDate <= :lastDayOfMonth')
150
      .setParameter('lastDayOfMonth', monthDate.getLastDay())
151
      .andWhere('leaveRequest.endDate >= :firstDayOfMonth')
152
      .setParameter('firstDayOfMonth', monthDate.getFirstDay())
153
      .innerJoin('leaveRequest.user', 'user')
154
      .innerJoin('user.userAdministrative', 'userAdministrative')
155
      .andWhere('userAdministrative.leavingDate IS NULL')
156
      .addOrderBy('leaveRequest.startDate', 'ASC');
157
158
    return query.getMany();
159
  }
160
161
  public getPendingCount(): Promise<number> {
162
    const query = this.repository
163
      .createQueryBuilder('leaveRequest')
164
      .where('status = :status')
165
      .setParameter('status', Status.PENDING);
166
167
    return query.getCount();
168
  }
169
}
170