Passed
Pull Request — master (#287)
by
unknown
01:50
created

LeaveRequestRepository.findAcceptedLeaveRequests   A

Complexity

Conditions 1

Size

Total Lines 18
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 17
dl 0
loc 18
rs 9.55
c 0
b 0
f 0
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.startDate',
122
        'leaveRequest.endDate',
123
        'user.firstName',
124
        'user.lastName'
125
      ])
126
      .where('status = :status')
127
      .setParameter('status', Status.ACCEPTED)
128
      .innerJoin('leaveRequest.user', 'user')
129
      .innerJoin('user.userAdministrative', 'userAdministrative')
130
      .andWhere('userAdministrative.leavingDate IS NULL')
131
      .addOrderBy('leaveRequest.startDate', 'ASC');
132
133
    return query.getMany();
134
  }
135
136
  public findAcceptedLeaveRequestsByMonth(date: Date): Promise<LeaveRequest[]> {
137
    const monthDate: MonthDate = this.dateUtils.getMonth(date);
138
139
    const query = this.repository
140
      .createQueryBuilder('leaveRequest')
141
      .select([
142
        'leaveRequest.id',
143
        'leaveRequest.type',
144
        'leaveRequest.startDate',
145
        'leaveRequest.startsAllDay',
146
        'leaveRequest.endDate',
147
        'leaveRequest.endsAllDay',
148
        'user.id'
149
      ])
150
      .where('status = :status')
151
      .setParameter('status', Status.ACCEPTED)
152
      .andWhere('leaveRequest.startDate <= :lastDayOfMonth')
153
      .setParameter('lastDayOfMonth', monthDate.getLastDay())
154
      .andWhere('leaveRequest.endDate >= :firstDayOfMonth')
155
      .setParameter('firstDayOfMonth', monthDate.getFirstDay())
156
      .innerJoin('leaveRequest.user', 'user')
157
      .innerJoin('user.userAdministrative', 'userAdministrative')
158
      .andWhere('userAdministrative.leavingDate IS NULL')
159
      .addOrderBy('leaveRequest.startDate', 'ASC');
160
161
    return query.getMany();
162
  }
163
}
164