Passed
Pull Request — master (#210)
by Nicolas
01:41
created

LeaveRepository.findLeavesForDate   A

Complexity

Conditions 1

Size

Total Lines 16
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 15
dl 0
loc 16
rs 9.65
c 0
b 0
f 0
1
import { InjectRepository } from '@nestjs/typeorm';
2
import { Repository } from 'typeorm';
3
import { ILeaveRepository } from 'src/Domain/HumanResource/Leave/Repository/ILeaveRepository';
4
import { Leave } from 'src/Domain/HumanResource/Leave/Leave.entity';
5
import { User } from 'src/Domain/HumanResource/User/User.entity';
6
7
export class LeaveRepository implements ILeaveRepository {
8
  constructor(
9
    @InjectRepository(Leave)
10
    private readonly repository: Repository<Leave>
11
  ) {}
12
13
  public save(leaves: Leave[]): void {
14
    this.repository.save(leaves);
15
  }
16
17
  public findMonthlyLeaves(date: string, userId: string): Promise<Leave[]> {
18
    const month = new Date(date).getMonth() + 1;
19
    const year = new Date(date).getFullYear();
20
21
    return this.repository
22
      .createQueryBuilder('leave')
23
      .select(['leave.time', 'leave.date', 'leaveRequest.type'])
24
      .where('user.id = :userId', { userId })
25
      .andWhere('extract(month FROM leave.date) = :month', { month })
26
      .andWhere('extract(year FROM leave.date) = :year', { year })
27
      .innerJoin('leave.leaveRequest', 'leaveRequest')
28
      .innerJoin('leaveRequest.user', 'user')
29
      .orderBy('leave.date', 'ASC')
30
      .getMany();
31
  }
32
33
  public async findLeavesForDate(date: string): Promise<Leave[]> {
34
    return this.repository
35
      .createQueryBuilder('leave')
36
      .select([
37
        'leave.time',
38
        'leave.date',
39
        'leaveRequest.type',
40
        'user.id',
41
        'user.firstName',
42
        'user.lastName',
43
      ])
44
      .andWhere('leave.date = :date', { date })
45
      .innerJoin('leave.leaveRequest', 'leaveRequest')
46
      .innerJoin('leaveRequest.user', 'user')
47
      .orderBy('leave.date', 'ASC')
48
      .getMany();
49
  }
50
51
  public async countLeavesByUserAndPeriod(
52
    user: User,
53
    startDate: string,
54
    endDate: string
55
  ): Promise<number> {
56
    const result = await this.repository
57
      .createQueryBuilder('leave')
58
      .select('count(leave.id) as id')
59
      .where('user.id = :id', { id: user.getId() })
60
      .andWhere('leave.date BETWEEN :startDate AND :endDate', {
61
        startDate,
62
        endDate
63
      })
64
      .innerJoin('leave.leaveRequest', 'leaveRequest')
65
      .innerJoin('leaveRequest.user', 'user')
66
      .getRawOne();
67
68
    return Number(result.id) || 0;
69
  }
70
71
  public async sumOfDurationLeaveByUserAndDate(
72
    user: User,
73
    date: string
74
  ): Promise<number> {
75
    const result = await this.repository
76
      .createQueryBuilder('leave')
77
      .select('SUM(leave.time) as time')
78
      .where('leave.date = :date', { date })
79
      .andWhere('user.id = :user', { user: user.getId() })
80
      .innerJoin('leave.leaveRequest', 'leaveRequest')
81
      .innerJoin('leaveRequest.user', 'user')
82
      .getRawOne();
83
84
    return Number(result.time) || 0;
85
  }
86
}
87