src/Infrastructure/HumanResource/Leave/Repository/LeaveRepository.ts   A
last analyzed

Complexity

Total Complexity 5
Complexity/F 1

Size

Lines of Code 92
Function Count 5

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 5
eloc 80
mnd 0
bc 0
fnc 5
dl 0
loc 92
rs 10
bpm 0
cpm 1
noi 0
c 0
b 0
f 0

5 Functions

Rating   Name   Duplication   Size   Complexity  
A LeaveRepository.findMonthlyLeaves 0 13 1
A LeaveRepository.save 0 3 1
A LeaveRepository.countLeavesByUserAndPeriod 0 19 1
A LeaveRepository.sumOfDurationLeaveByUserAndDate 0 15 1
A LeaveRepository.getSumOfPaidLeaveDurationsBetween 0 18 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
import { Type } from 'src/Domain/HumanResource/Leave/LeaveRequest.entity';
9
10
export class LeaveRepository implements ILeaveRepository {
11
  constructor(
12
    @InjectRepository(Leave)
13
    private readonly repository: Repository<Leave>,
14
    @Inject('IDateUtils')
15
    private readonly dateUtils: IDateUtils
16
  ) {}
17
18
  public save(leaves: Leave[]): void {
19
    this.repository.save(leaves);
20
  }
21
22
  public findMonthlyLeaves(date: string, userId: string): Promise<Leave[]> {
23
    const { month, year } = this.dateUtils.getMonth(new Date(date));
24
25
    return this.repository
26
      .createQueryBuilder('leave')
27
      .select(['leave.time', 'leave.date', 'leaveRequest.type'])
28
      .where('user.id = :userId', { userId })
29
      .andWhere('extract(month FROM leave.date) = :month', { month })
30
      .andWhere('extract(year FROM leave.date) = :year', { year })
31
      .innerJoin('leave.leaveRequest', 'leaveRequest')
32
      .innerJoin('leaveRequest.user', 'user')
33
      .orderBy('leave.date', 'ASC')
34
      .getMany();
35
  }
36
37
  public async countLeavesByUserAndPeriod(
38
    user: User,
39
    startDate: string,
40
    endDate: string
41
  ): Promise<number> {
42
    const result = await this.repository
43
      .createQueryBuilder('leave')
44
      .select('count(leave.id) as id')
45
      .where('user.id = :id', { id: user.getId() })
46
      .andWhere('leave.date BETWEEN :startDate AND :endDate', {
47
        startDate,
48
        endDate
49
      })
50
      .innerJoin('leave.leaveRequest', 'leaveRequest')
51
      .innerJoin('leaveRequest.user', 'user')
52
      .getRawOne();
53
54
    return Number(result.id) || 0;
55
  }
56
57
  public async sumOfDurationLeaveByUserAndDate(
58
    user: User,
59
    date: string
60
  ): Promise<number> {
61
    const result = await this.repository
62
      .createQueryBuilder('leave')
63
      .select('SUM(leave.time) as time')
64
      .where('leave.date = :date', { date })
65
      .andWhere('user.id = :user', { user: user.getId() })
66
      .innerJoin('leave.leaveRequest', 'leaveRequest')
67
      .innerJoin('leaveRequest.user', 'user')
68
      .getRawOne();
69
70
    return Number(result.time) || 0;
71
  }
72
73
  public async getSumOfPaidLeaveDurationsBetween(
74
    startDate: Date,
75
    endDate: Date,
76
    userId: string
77
  ): Promise<number> {
78
    const result = await this.repository
79
      .createQueryBuilder('leave')
80
      .select('SUM(leave.time) as time')
81
      .innerJoin('leave.leaveRequest', 'leaveRequest')
82
      .innerJoin('leaveRequest.user', 'user')
83
      .where('leave.date >= :startDate', { startDate })
84
      .andWhere('leave.date < :endDate', { endDate })
85
      .andWhere('leaveRequest.type = :type', { type: Type.PAID })
86
      .andWhere('user.id = :userId', { userId: userId })
87
      .getRawOne();
88
89
    return Number(result.time) || 0;
90
  }
91
}
92