Passed
Pull Request — master (#159)
by Mathieu
01:45
created

server/src/Domain/FairCalendar/GetFairCalendarOverview.ts   A

Complexity

Total Complexity 11
Complexity/F 5.5

Size

Lines of Code 73
Function Count 2

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 59
dl 0
loc 73
rs 10
c 0
b 0
f 0
wmc 11
mnd 9
bc 9
fnc 2
bpm 4.5
cpm 5.5
noi 0

2 Functions

Rating   Name   Duplication   Size   Complexity  
B GetFairCalendarOverview.index 0 36 6
A GetFairCalendarOverview.calculateNumberOfMealTicketsByDate 0 19 5
1
import { Inject } from '@nestjs/common';
2
import { FairCalendarView } from 'src/Application/FairCalendar/View/FairCalendarView';
3
import { Cooperative } from '../Settings/Cooperative.entity';
4
import { CooperativeNotFoundException } from '../Settings/Repository/CooperativeNotFoundException';
5
import { ICooperativeRepository } from '../Settings/Repository/ICooperativeRepository';
6
import { EventType } from './Event.entity';
7
import { ICalendarOverview } from './ICalendarOverview';
8
9
export class GetFairCalendarOverview {
10
  constructor(
11
    @Inject('ICooperativeRepository')
12
    private readonly cooperativeRepository: ICooperativeRepository
13
  ) {}
14
15
  public async index(items: FairCalendarView[]): Promise<ICalendarOverview> {
16
    const cooperative = await this.cooperativeRepository.find();
17
    if (!cooperative) {
18
      throw new CooperativeNotFoundException();
19
    }
20
21
    const itemsByDate = [];
22
    const overviewInDays: ICalendarOverview = {
23
      mission: 0,
24
      dojo: 0,
25
      formationConference: 0,
26
      leave: 0,
27
      support: 0,
28
      other: 0,
29
      mealTicket: 0
30
    };
31
32
    for (const {date, time, type: itemType, project} of items) {
33
      const dayIndex = new Date(date).getDate() - 1;
34
      const type = itemType.startsWith('leave_') ? 'leave' : itemType;
35
      const dayDuration = project ? project.dayDuration : cooperative.getDayDuration();
36
      const hours = time / dayDuration;
37
38
      if (itemsByDate[dayIndex]) {
39
        itemsByDate[dayIndex].push({ time, type });
40
      } else {
41
        itemsByDate[dayIndex] = [{ time, type }];
42
      }
43
44
      overviewInDays[type] = Math.round((overviewInDays[type] + hours) * 100) / 100;
45
    }
46
47
    return {
48
      ...overviewInDays,
49
      mealTicket: this.calculateNumberOfMealTicketsByDate(cooperative, Object.values(itemsByDate))
50
    };
51
  }
52
53
  private calculateNumberOfMealTicketsByDate(cooperative: Cooperative, itemsByDate: any[]): number {
54
    let mealTicket = 0;
55
56
    for (const sortedEvent of itemsByDate) {
57
      let totalPerDay = 0;
58
59
      for (const { time, type } of sortedEvent) {
60
        if (type !== EventType.OTHER && 'leave' !== type) {
61
          totalPerDay += time;
62
        }
63
      }
64
65
      if (totalPerDay > (cooperative.getDayDuration() / 2)) {
66
        mealTicket++;
67
      }
68
    }
69
70
    return mealTicket;
71
  }
72
}
73