Completed
Push — master ( 004e28...7f2927 )
by
unknown
20s queued 14s
created

LeaveRequestRepository.getPendingCount   A

Complexity

Conditions 1

Size

Total Lines 8
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 8
dl 0
loc 8
c 0
b 0
f 0
rs 10
cc 1
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.moderationComment',
43
        'user.id',
44
        'user.firstName',
45
        'user.lastName',
46
        'moderator.id',
47
        'moderator.firstName',
48
        'moderator.lastName'
49
      ])
50
      .where('leaveRequest.id = :id', { id })
51
      .innerJoin('leaveRequest.user', 'user')
52
      .leftJoin('leaveRequest.moderator', 'moderator')
53
      .getOne();
54
  }
55
56
  public findExistingLeaveRequestsByUserAndPeriod(
57
    user: User,
58
    startDate: string,
59
    endDate: string
60
  ): Promise<LeaveRequest | undefined> {
61
    return this.repository
62
      .createQueryBuilder('leaveRequest')
63
      .select('leaveRequest.id')
64
      .where('leaveRequest.user = :id', { id: user.getId() })
65
      .andWhere(
66
        '(leaveRequest.startDate BETWEEN :startDate AND :endDate OR leaveRequest.endDate BETWEEN :startDate AND :endDate)',
67
        {
68
          startDate,
69
          endDate
70
        }
71
      )
72
      .andWhere(
73
        '(leaveRequest.status = :accepted OR leaveRequest.status = :pending)',
74
        {
75
          accepted: Status.ACCEPTED,
76
          pending: Status.PENDING
77
        }
78
      )
79
      .getOne();
80
  }
81
82
  public findLeaveRequests(
83
    page: number,
84
    status?: Status
85
  ): Promise<[LeaveRequest[], number]> {
86
    const query = this.repository
87
      .createQueryBuilder('leaveRequest')
88
      .select([
89
        'leaveRequest.id',
90
        'leaveRequest.type',
91
        'leaveRequest.status',
92
        'leaveRequest.startDate',
93
        'leaveRequest.startsAllDay',
94
        'leaveRequest.endDate',
95
        'leaveRequest.endsAllDay',
96
        'user.id',
97
        'user.firstName',
98
        'user.lastName'
99
      ])
100
      .innerJoin('leaveRequest.user', 'user')
101
      .orderBy('leaveRequest.status', 'DESC')
102
      .addOrderBy('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
    } else {
109
      query.where('leaveRequest.status != :status', {
110
        status: Status.ACCEPTED
111
      });
112
    }
113
114
    return query.getManyAndCount();
115
  }
116
117
  public findAcceptedLeaveRequests(): Promise<LeaveRequest[]> {
118
    const query = this.repository
119
      .createQueryBuilder('leaveRequest')
120
      .select([
121
        'leaveRequest.id',
122
        'leaveRequest.startDate',
123
        'leaveRequest.endDate',
124
        'user.firstName',
125
        'user.lastName'
126
      ])
127
      .where('status = :status')
128
      .setParameter('status', Status.ACCEPTED)
129
      .innerJoin('leaveRequest.user', 'user')
130
      .innerJoin('user.userAdministrative', 'userAdministrative')
131
      .andWhere('userAdministrative.leavingDate IS NULL')
132
      .addOrderBy('leaveRequest.startDate', 'ASC');
133
134
    return query.getMany();
135
  }
136
137
  public findAcceptedLeaveRequestsByMonth(date: Date): Promise<LeaveRequest[]> {
138
    const monthDate: MonthDate = this.dateUtils.getMonth(date);
139
140
    const query = this.repository
141
      .createQueryBuilder('leaveRequest')
142
      .select([
143
        'leaveRequest.id',
144
        'leaveRequest.type',
145
        'leaveRequest.startDate',
146
        'leaveRequest.startsAllDay',
147
        'leaveRequest.endDate',
148
        'leaveRequest.endsAllDay',
149
        'user.id'
150
      ])
151
      .where('status = :status')
152
      .setParameter('status', Status.ACCEPTED)
153
      .andWhere('leaveRequest.startDate <= :lastDayOfMonth')
154
      .setParameter('lastDayOfMonth', monthDate.getLastDay())
155
      .andWhere('leaveRequest.endDate >= :firstDayOfMonth')
156
      .setParameter('firstDayOfMonth', monthDate.getFirstDay())
157
      .innerJoin('leaveRequest.user', 'user')
158
      .innerJoin('user.userAdministrative', 'userAdministrative')
159
      .andWhere('userAdministrative.leavingDate IS NULL')
160
      .addOrderBy('leaveRequest.startDate', 'ASC');
161
162
    return query.getMany();
163
  }
164
165
  public getPendingCount(): Promise<number> {
166
    const query = this.repository
167
      .createQueryBuilder('leaveRequest')
168
      .where('status = :status')
169
      .setParameter('status', Status.PENDING);
170
171
    return query.getCount();
172
  }
173
}
174