Passed
Pull Request — master (#235)
by Mathieu
01:39
created

server/src/Application/HumanResource/MealTicket/Query/GetMealTicketsPerMonthQueryHandler.ts   A

Complexity

Total Complexity 7
Complexity/F 7

Size

Lines of Code 70
Function Count 1

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 58
mnd 6
bc 6
fnc 1
dl 0
loc 70
bpm 6
cpm 7
noi 0
c 0
b 0
f 0
rs 10

1 Function

Rating   Name   Duplication   Size   Complexity  
B GetMealTicketsPerMonthQueryHandler.execute 0 45 7
1
import { QueryHandler } from '@nestjs/cqrs';
2
import { Inject } from '@nestjs/common';
3
import { IMealTicketRemovalRepository } from 'src/Domain/HumanResource/MealTicket/Repository/IMealTicketRemovalRepository';
4
import { GetMealTicketsPerMonthQuery } from './GetMealTicketsPerMonthQuery';
5
import { IUserRepository } from 'src/Domain/HumanResource/User/Repository/IUserRepository';
6
import { IEventRepository } from 'src/Domain/FairCalendar/Repository/IEventRepository';
7
import { ICooperativeRepository } from 'src/Domain/Settings/Repository/ICooperativeRepository';
8
import { CooperativeNotFoundException } from 'src/Domain/Settings/Repository/CooperativeNotFoundException';
9
import { MealTicketsPerMonthView } from '../Views/MealTicketsPerMonthView';
10
11
@QueryHandler(GetMealTicketsPerMonthQuery)
12
export class GetMealTicketsPerMonthQueryHandler {
13
  constructor(
14
    @Inject('IMealTicketRemovalRepository')
15
    private readonly mealTicketRemovalRepository: IMealTicketRemovalRepository,
16
    @Inject('IUserRepository')
17
    private readonly userRepository: IUserRepository,
18
    @Inject('IEventRepository')
19
    private readonly eventRepository: IEventRepository,
20
    @Inject('ICooperativeRepository')
21
    private readonly cooperativeRepository: ICooperativeRepository
22
  ) {}
23
24
  public async execute(
25
    query: GetMealTicketsPerMonthQuery
26
  ): Promise<MealTicketsPerMonthView[]> {
27
    const cooperative = await this.cooperativeRepository.find();
28
    if (!cooperative) {
29
      throw new CooperativeNotFoundException();
30
    }
31
32
    const { date } = query;
33
    const [ users, mealTicketRemovals, events ] = await Promise.all([
34
      this.userRepository.findUsers(false),
35
      this.mealTicketRemovalRepository.findByMonth(date),
36
      this.eventRepository.findAllEventsByMonth(date)
37
    ]);
38
39
    let mealTicketsByUser = [];
40
    let mealTicketsRemovalsByUser = [];
41
    let mealTicketsPerMonthView: MealTicketsPerMonthView[] = []
42
43
    for (const { duration, user } of events) {
44
      if (duration > (cooperative.getDayDuration() / 2)) {
45
        mealTicketsByUser[user] = mealTicketsByUser[user] + 1 || 1;
46
      }
47
    }
48
  
49
    for (const { id, count } of mealTicketRemovals) {
50
      mealTicketsRemovalsByUser[id] = count;
51
    }
52
53
    for (const user of users) {
54
      const mealTicketRemoval = mealTicketsRemovalsByUser[user.getId()] || 0;
55
      const mealTicket = mealTicketsByUser[user.getId()] - mealTicketRemoval || 0;
56
57
      mealTicketsPerMonthView.push(
58
        new MealTicketsPerMonthView(
59
          user.getFirstName(),
60
          user.getLastName(),
61
          mealTicket <= 0 ? 0 : mealTicket,
62
          mealTicketRemoval,
63
        )
64
      );
65
    }
66
67
    return mealTicketsPerMonthView;
68
  }
69
}
70