TimetableTimeslotStrategy   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 58
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 6
lcom 1
cbo 4
dl 0
loc 58
ccs 27
cts 27
cp 1
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A initTimetable() 0 9 1
A buildTimetable() 0 10 2
A updateTimeslots() 0 18 2
1
<?php
2
3
namespace Timegridio\Concierge\Timetable\Strategies;
4
5
use Timegridio\Concierge\Models\Business;
6
use Timegridio\Concierge\Models\Service;
7
use Timegridio\Concierge\Models\Vacancy;
8
use Timegridio\Concierge\Timetable\Timetable;
9
10
class TimetableTimeslotStrategy extends BaseTimetableStrategy implements TimetableStrategyInterface
11
{
12
    private $interval = 30;
13
14 5
    public function __construct(Timetable $timetable)
15
    {
16 5
        $this->timetable = $timetable;
17 5
    }
18
19 5
    protected function initTimetable($starting, $days)
20
    {
21 5
        $this->timetable
22 5
             ->interval($this->interval)
23 5
             ->format('date.service.time')
24 5
             ->from($starting)
25 5
             ->future($days)
26 5
             ->init();
27 5
    }
28
29
    /**
30
     * Build timetable.
31
     *
32
     * @param \Illuminate\Database\Eloquent\Collection $vacancies
33
     * @param string                                  $starting
34
     * @param int                                     $days
35
     *
36
     * @return array
37
     */
38 5
    public function buildTimetable($vacancies, $starting = 'today', $days = 1)
39
    {
40 5
        $this->initTimetable($starting, $days);
41
42 5
        foreach ($vacancies as $vacancy) {
43 5
            $this->updateTimeslots($vacancy, $this->interval);
44
        }
45
46 5
        return $this->timetable->get();
47
    }
48
49 5
    protected function updateTimeslots(Vacancy $vacancy, $step = 30)
50
    {
51 5
        $fromTime = $vacancy->start_at->timezone('UTC');
52 5
        $toTime = $fromTime->copy();
53 5
        $limit = $vacancy->finish_at;
54
55 5
        while ($fromTime <= $limit) {
56 5
            $toTime->addMinutes($step);
57
58 5
            $capacity = $vacancy->getAvailableCapacityBetween($fromTime, $toTime);
59
60 5
            $time = $fromTime->timezone($vacancy->business->timezone)->format('H:i:s');
61
62 5
            $this->timetable->capacity($vacancy->date, $time, $vacancy->service->slug, $capacity);
63
64 5
            $fromTime->addMinutes($step);
65
        }
66 5
    }
67
}
68