Passed
Pull Request — master (#375)
by
unknown
02:15
created

LeaveRepository.yearlyLeavesSummary   A

Complexity

Conditions 1

Size

Total Lines 17
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

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