Passed
Pull Request — master (#248)
by
unknown
01:59
created

LeaveRepository.findAllMonthlyLeaves   A

Complexity

Conditions 1

Size

Total Lines 21
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 20
dl 0
loc 21
c 0
b 0
f 0
rs 9.4
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 findAllMonthlyLeaves(date: Date): Promise<Leave[]> {
73
    const { month, year } = this.dateUtils.getMonth(date);
74
75
    const leaves = await this.repository
76
      .createQueryBuilder('leave')
77
      .select(['MIN(leave.date) as start', 'MAX(leave.date) as end', 'SUM(leave.time) as time', 'leaveRequest.type', 'user.id'])
78
      .where('extract(month FROM leave.date) = :month', { month })
79
      .andWhere('extract(year FROM leave.date) = :year', { year })
80
      .innerJoin('leave.leaveRequest', 'leaveRequest')
81
      .innerJoin('leaveRequest.user', 'user')
82
      .andWhere('user.role <> :role', { role: UserRole.ACCOUNTANT })
83
      .innerJoin('user.userAdministrative', 'userAdministrative')
84
      .andWhere('userAdministrative.leavingDate IS NULL')
85
      .groupBy('leaveRequest.id, leaveRequest.type, user.id')
86
      .getRawMany();
87
88
    return leaves.reduce((previous: any, current: any) => {
89
      previous[current.user_id] = current;
90
      return previous;
91
    }, {});
92
  }
93
}
94