summaryrefslogtreecommitdiff
path: root/includes/view/ShiftCalendarRenderer.php
blob: 41cf6f9445b5c0a5604a21bf6cbfd202116abb8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php

namespace Engelsystem;

class ShiftCalendarRenderer {

  /**
   * 15m * 60s/m = 900s
   */
  const MINUTES_PER_ROW = 900;

  private $shifts;

  private $shiftsFilter;

  public function __construct($shifts, ShiftsFilter $shiftsFilter) {
    $this->shifts = $shifts;
    $this->shiftsFilter = $shiftsFilter;
  }

  public function render() {
    $rooms = $this->rooms();
    $slotSizes = $this->calcSlotSizes($rooms);
    
    return '';
  }

  /**
   * Calculates the slots for each room that appears in the shifts
   */
  private function rooms() {
    $rooms = [];
    foreach ($this->shifts as $shift) {
      if (! isset($rooms[$shift['RID']])) {
        $rooms[$shift['RID']] = $shift['room_name'];
      }
    }
    return $rooms;
  }

  private function calcSlotSizes($rooms) {
    $first_block_start_time = ShiftCalendarRenderer::MINUTES_PER_ROW * floor($this->shiftsFilter->getStartTime() / ShiftCalendarRenderer::MINUTES_PER_ROW);
    $blocks_per_slot = ceil(($this->shiftsFilter->getEndTime() - $first_block_start_time) / ShiftCalendarRenderer::MINUTES_PER_ROW);
    $parallel_blocks = [];
    
    // initialize $block array
    foreach (array_keys($rooms) as $room_id) {
      $parallel_blocks[$room_id] = array_fill(0, $blocks_per_slot, 0);
    }
    
    // calculate number of parallel shifts in each timeslot for each room
    foreach ($this->shifts as $shift) {
      $room_id = $shift["RID"];
      $shift_blocks = ($shift["end"] - $shift["start"]) / ShiftCalendarRenderer::MINUTES_PER_ROW;
      $firstblock = floor(($shift["start"] - $first_block_start_time) / ShiftCalendarRenderer::MINUTES_PER_ROW);
      for ($block = $firstblock; $block < $shift_blocks + $firstblock && $block < $blocks_per_slot; $block ++) {
        $parallel_blocks[$room_id][$block] ++;
      }
    }
    
    return array_map('max', $parallel_blocks);
  }
}

?>