Completed
Pull Request — master (#297)
by Luc
05:03
created

CalendarConverter::timestampCalendar()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 23
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 9.0856
c 0
b 0
f 0
cc 3
eloc 16
nc 4
nop 3
1
<?php
2
3
namespace CultuurNet\UDB3\Calendar;
4
5
use CultureFeed_Cdb_Data_Calendar_OpeningTime;
6
use CultureFeed_Cdb_Data_Calendar_Period;
7
use CultureFeed_Cdb_Data_Calendar_PeriodList;
8
use CultureFeed_Cdb_Data_Calendar_Permanent;
9
use CultureFeed_Cdb_Data_Calendar_SchemeDay;
10
use CultureFeed_Cdb_Data_Calendar_Timestamp;
11
use CultureFeed_Cdb_Data_Calendar_TimestampList;
12
use CultureFeed_Cdb_Data_Calendar_Weekscheme;
13
use CultuurNet\UDB3\Calendar;
14
use CultuurNet\UDB3\CalendarInterface;
15
use CultuurNet\UDB3\CalendarType;
16
use DateTimeInterface;
17
18
class CalendarConverter implements CalendarConverterInterface
19
{
20
    /**
21
     * @param Calendar $calendar
22
     * @return \CultureFeed_Cdb_Data_Calendar $cdbCalendar
23
     */
24
    public function toCdbCalendar(Calendar $calendar)
25
    {
26
        $weekScheme = $this->getWeekScheme($calendar);
27
        $calendarType = (string) $calendar->getType();
28
29
        switch ($calendarType) {
30
            case CalendarType::MULTIPLE:
31
                $cdbCalendar = new CultureFeed_Cdb_Data_Calendar_TimestampList();
32
                foreach ($calendar->getTimestamps() as $timestamp) {
33
                    $this->timestampCalendar(
34
                        $timestamp->getStartDate(),
35
                        $timestamp->getEndDate(),
36
                        $cdbCalendar
37
                    );
38
                }
39
                break;
40
            case CalendarType::SINGLE:
41
                $cdbCalendar = $this->timestampCalendar(
42
                    $calendar->getStartDate(),
43
                    $calendar->getEndDate(),
44
                    new CultureFeed_Cdb_Data_Calendar_TimestampList()
45
                );
46
                break;
47
            case CalendarType::PERIODIC:
48
                $cdbCalendar = new CultureFeed_Cdb_Data_Calendar_PeriodList();
49
                $startDate = $calendar->getStartDate()->format('Y-m-d');
50
                $endDate = $calendar->getEndDate()->format('Y-m-d');
51
52
                $period = new CultureFeed_Cdb_Data_Calendar_Period($startDate, $endDate);
53
                if (!empty($weekScheme) && !empty($weekScheme->getDays())) {
54
                    $period->setWeekScheme($weekScheme);
55
                }
56
                $cdbCalendar->add($period);
57
                break;
58
            case CalendarType::PERMANENT:
59
                $cdbCalendar = new CultureFeed_Cdb_Data_Calendar_Permanent();
60
                if (!empty($weekScheme)) {
61
                    $cdbCalendar->setWeekScheme($weekScheme);
62
                }
63
                break;
64
            default:
65
                $cdbCalendar = new CultureFeed_Cdb_Data_Calendar_Permanent();
66
        }
67
68
        return $cdbCalendar;
69
    }
70
71
    /**
72
     * @param \CultuurNet\UDB3\CalendarInterface $itemCalendar
73
     * @return CultureFeed_Cdb_Data_Calendar_Weekscheme|null
74
     * @throws \Exception
75
     */
76
    private function getWeekScheme(CalendarInterface $itemCalendar)
77
    {
78
        // Store opening hours.
79
        $openingHours = $itemCalendar->getOpeningHours();
80
        $weekScheme = null;
81
82
        if (!empty($openingHours)) {
83
            $weekScheme = new CultureFeed_Cdb_Data_Calendar_Weekscheme();
84
85
            // Multiple opening times can happen on same day. Store them in array.
86
            $openingTimesPerDay = array(
87
                'monday' => array(),
88
                'tuesday' => array(),
89
                'wednesday' => array(),
90
                'thursday' => array(),
91
                'friday' => array(),
92
                'saturday' => array(),
93
                'sunday' => array(),
94
            );
95
96
            foreach ($openingHours as $openingHour) {
97
                // In CDB2 every day needs to be a seperate entry.
98
                if (is_array($openingHour)) {
99
                    $openingHour = (object) $openingHour;
100
                }
101
                foreach ($openingHour->getDayOfWeekCollection()->getDaysOfWeek() as $day) {
102
                    $openingTimesPerDay[$day->toNative()][] = new CultureFeed_Cdb_Data_Calendar_OpeningTime(
103
                        $openingHour->getOpens()->toNativeString() . ':00',
104
                        $openingHour->getCloses()->toNativeString() . ':00'
105
                    );
106
                }
107
            }
108
109
            // Create the opening times correctly
110
            foreach ($openingTimesPerDay as $day => $openingTimes) {
111
                // Empty == closed.
112
                if (empty($openingTimes)) {
113
                    $openingInfo = new CultureFeed_Cdb_Data_Calendar_SchemeDay(
114
                        $day,
115
                        CultureFeed_Cdb_Data_Calendar_SchemeDay::SCHEMEDAY_OPEN_TYPE_CLOSED
116
                    );
117
                } else {
118
                    // Add all opening times.
119
                    $openingInfo = new CultureFeed_Cdb_Data_Calendar_SchemeDay(
120
                        $day,
121
                        CultureFeed_Cdb_Data_Calendar_SchemeDay::SCHEMEDAY_OPEN_TYPE_OPEN
122
                    );
123
                    foreach ($openingTimes as $openingTime) {
124
                        $openingInfo->addOpeningTime($openingTime);
125
                    }
126
                }
127
                $weekScheme->setDay($day, $openingInfo);
128
            }
129
        }
130
131
        return $weekScheme;
132
    }
133
134
    /**
135
     * @param DateTimeInterface $startDate
136
     * @param DateTimeInterface $endDate
137
     * @param CultureFeed_Cdb_Data_Calendar_TimestampList $calendar
138
     *
139
     * @return CultureFeed_Cdb_Data_Calendar_TimestampList
140
     */
141
    private function timestampCalendar(
142
        DateTimeInterface $startDate,
143
        DateTimeInterface $endDate,
144
        CultureFeed_Cdb_Data_Calendar_TimestampList $calendar
145
    ) {
146
        $startHour = $startDate->format('H:i:s');
147
        if ($startHour == '00:00:00') {
148
            $startHour = null;
149
        }
150
        $endHour = $endDate->format('H:i:s');
151
        if ($endHour == '00:00:00') {
152
            $endHour = null;
153
        }
154
        $calendar->add(
155
            new CultureFeed_Cdb_Data_Calendar_Timestamp(
156
                $startDate->format('Y-m-d'),
157
                $startHour,
158
                $endHour
159
            )
160
        );
161
162
        return $calendar;
163
    }
164
}
165