Passed
Pull Request — master (#287)
by
unknown
01:59 queued 21s
created

LeaveRepository.findLeaves   A

Complexity

Conditions 1

Size

Total Lines 2
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 2
rs 10
c 0
b 0
f 0
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
  findLeaves(): Promise<Leave[]> {
17
    throw new Error('Method not implemented.');
18
  }
19
20
  public save(leaves: Leave[]): void {
21
    this.repository.save(leaves);
22
  }
23
24
  public findMonthlyLeaves(date: string, userId: string): Promise<Leave[]> {
25
    const { month, year } = this.dateUtils.getMonth(new Date(date));
26
27
    return this.repository
28
      .createQueryBuilder('leave')
29
      .select(['leave.time', 'leave.date', 'leaveRequest.type'])
30
      .where('user.id = :userId', { userId })
31
      .andWhere('extract(month FROM leave.date) = :month', { month })
32
      .andWhere('extract(year FROM leave.date) = :year', { year })
33
      .innerJoin('leave.leaveRequest', 'leaveRequest')
34
      .innerJoin('leaveRequest.user', 'user')
35
      .orderBy('leave.date', 'ASC')
36
      .getMany();
37
  }
38
39
  public async countLeavesByUserAndPeriod(
40
    user: User,
41
    startDate: string,
42
    endDate: string
43
  ): Promise<number> {
44
    const result = await this.repository
45
      .createQueryBuilder('leave')
46
      .select('count(leave.id) as id')
47
      .where('user.id = :id', { id: user.getId() })
48
      .andWhere('leave.date BETWEEN :startDate AND :endDate', {
49
        startDate,
50
        endDate
51
      })
52
      .innerJoin('leave.leaveRequest', 'leaveRequest')
53
      .innerJoin('leaveRequest.user', 'user')
54
      .getRawOne();
55
56
    return Number(result.id) || 0;
57
  }
58
59
  public async sumOfDurationLeaveByUserAndDate(
60
    user: User,
61
    date: string
62
  ): Promise<number> {
63
    const result = await this.repository
64
      .createQueryBuilder('leave')
65
      .select('SUM(leave.time) as time')
66
      .where('leave.date = :date', { date })
67
      .andWhere('user.id = :user', { user: user.getId() })
68
      .innerJoin('leave.leaveRequest', 'leaveRequest')
69
      .innerJoin('leaveRequest.user', 'user')
70
      .getRawOne();
71
72
    return Number(result.time) || 0;
73
  }
74
}
75