Completed
Pull Request — master (#21)
by
unknown
02:55
created

ExtraSchedulesLoop   A

Complexity

Total Complexity 35

Size/Duplication

Total Lines 185
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Importance

Changes 1
Bugs 0 Features 1
Metric Value
wmc 35
c 1
b 0
f 1
lcom 0
cbo 0
dl 0
loc 185
rs 9

4 Methods

Rating   Name   Duplication   Size   Complexity  
A parseResults() 0 23 2
B getArgDefinitions() 0 25 1
F buildArray() 0 118 31
A getDayLabel() 0 12 1
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: tompradat
5
 * Date: 01/07/2016
6
 * Time: 16:18
7
 */
8
9
namespace Dealer\Loop;
10
11
12
use Dealer\Dealer;
13
use Dealer\Model\DealerShedulesQuery;
14
use Propel\Runtime\ActiveQuery\Criteria;
15
use Thelia\Core\Template\Element\ArraySearchLoopInterface;
16
use Thelia\Core\Template\Element\BaseLoop;
17
use Thelia\Core\Template\Element\LoopResult;
18
use Thelia\Core\Template\Element\LoopResultRow;
19
use Thelia\Core\Template\Loop\Argument\Argument;
20
use Thelia\Core\Template\Loop\Argument\ArgumentCollection;
21
22
class ExtraSchedulesLoop extends BaseLoop implements ArraySearchLoopInterface
23
{
24
25
    public function parseResults(LoopResult $loopResult)
26
    {
27
        foreach ($loopResult->getResultDataCollection() as $schedules) {
28
            $loopResultRow = new LoopResultRow($schedules);
29
30
            $loopResultRow
31
                ->set('DEALER_ID', $schedules['DEALER_ID'])
32
                ->set('DAY', $schedules['DAY'])
33
                ->set('DAY_LABEL', $schedules['DAY_LABEL'])
34
                ->set('FORMATTED_HOURS', $schedules['FORMATTED_HOURS'])
35
                ->set('PERIOD_BEGIN', $schedules['PERIOD_BEGIN'])
36
                ->set('PERIOD_END', $schedules['PERIOD_END'])
37
                ->set('BEGIN', $schedules['BEGIN'])
38
                ->set('END', $schedules['END'])
39
                ->set('ID', $schedules['ID'])
40
            ;
41
42
43
            $loopResult->addRow($loopResultRow);
44
        }
45
46
        return $loopResult;
47
    }
48
49
    protected function getArgDefinitions()
50
    {
51
        return new ArgumentCollection(
52
53
            Argument::createIntListTypeArgument('id'),
54
            Argument::createIntListTypeArgument('dealer_id'),
55
            Argument::createBooleanTypeArgument('hide_past', false),
56
            Argument::createBooleanTypeArgument('closed', false),
57
            Argument::createAnyTypeArgument('hour_separator', ' - '),
58
            Argument::createAnyTypeArgument('half_day_separator', ' / '),
59
            Argument::createBooleanTypeArgument('merge_day', true),
60
            Argument::createIntListTypeArgument('day'),
61
            Argument::createEnumListTypeArgument('order', [
62
                'id',
63
                'id-reverse',
64
                'day',
65
                'day-reverse',
66
                'begin',
67
                'begin-reverse',
68
                'period-begin',
69
                'period-begin-reverse'
70
            ], 'id')
71
72
        );
73
    }
74
75
    public function buildArray()
76
    {
77
        $results = array();
78
79
        $query = DealerShedulesQuery::create();
80
81
        $query->filterByPeriodNotNull();
82
        if ($this->getHidePast()) {
83
            $query->filterByPeriodEnd(new \DateTime(), Criteria::GREATER_THAN);
84
        }
85
86
        if ($id = $this->getId()) {
87
            $query->filterById($id);
88
        }
89
90
        if ($day = $this->getDay()) {
91
            $query->filterByDay($day);
92
        }
93
94
        if ($dealer_id = $this->getDealerId()) {
95
            $query->filterByDealerId($dealer_id);
96
        }
97
98
        $query->filterByClosed($this->getClosed());
99
100
        foreach ($this->getOrder() as $order) {
101
            switch ($order) {
102
                case 'id':
103
                    $query->orderById();
104
                    break;
105
                case 'id-reverse':
106
                    $query->orderById(Criteria::DESC);
107
                    break;
108
                case 'day':
109
                    $query->orderByDay();
110
                    break;
111
                case 'day-reverse':
112
                    $query->orderByDay(Criteria::DESC);
113
                    break;
114
                case 'begin':
115
                    $query->orderByBegin();
116
                    break;
117
                case 'begin-reverse':
118
                    $query->orderByBegin(Criteria::DESC);
119
                    break;
120
                case 'period-begin':
121
                    $query->orderByPeriodBegin();
122
                    break;
123
                case 'period-begin-reverse':
124
                    $query->orderByPeriodBegin(Criteria::DESC);
125
                    break;
126
                default:
127
                    break;
128
            }
129
        }
130
131
        $dealerSchedules = $query->find();
132
133
        if ($this->getMergeDay()) {
134
            $dealerCount = count($dealerSchedules);
135
136
            for ($i = 0; $i < $dealerCount; $i++) {
137
138
                if (isset($dealerSchedules[$i])) {
139
140
                    $formattedHours = null;
141
142
                    // if the next result has the same dates, same day, then concat the morning and afternoon hours
143
                    if (
144
                        ($dealerSchedules[$i+1] !== null)
145
                        && ($dealerSchedules[$i]->getDay() == $dealerSchedules[$i+1]->getDay())
146
                        && ($dealerSchedules[$i]->getDealerId() == $dealerSchedules[$i+1]->getDealerId())
147
                        && ($dealerSchedules[$i]->getPeriodBegin() == $dealerSchedules[$i+1]->getPeriodBegin())
148
                        && ($dealerSchedules[$i]->getPeriodEnd() == $dealerSchedules[$i+1]->getPeriodEnd())
149
                    ) {
150
                        $end = $dealerSchedules[$i+1]->getEnd();
151
                        if ($dealerSchedules[$i]->getBegin() && $dealerSchedules[$i+1]->getBegin() && $dealerSchedules[$i]->getEnd() && $dealerSchedules[$i+1]->getEnd()) {
152
                            $formattedHours = date_format($dealerSchedules[$i]->getBegin(), 'H\hi') . $this->getHourSeparator() . date_format($dealerSchedules[$i]->getEnd(), 'H\hi') . $this->getHalfDaySeparator() . date_format($dealerSchedules[$i+1]->getBegin(), 'H\hi') . $this->getHourSeparator() . date_format($dealerSchedules[$i+1]->getEnd(), 'H\hi');
153
                        }
154
                        unset($dealerSchedules[$i+1]);
155
                    } else {
156
                        $end = $dealerSchedules[$i]->getEnd();
157
                        if ($dealerSchedules[$i]->getBegin() && $dealerSchedules[$i]->getEnd()) {
158
                            $formattedHours = date_format($dealerSchedules[$i]->getBegin(), 'H\hi') . $this->getHourSeparator() . date_format($dealerSchedules[$i]->getEnd(), 'H\hi');
159
                        }
160
                    }
161
162
                    $results[] = array(
163
                        'ID' => $dealerSchedules[$i]->getId(),
164
                        'DEALER_ID' => $dealerSchedules[$i]->getDealerId(),
165
                        'DAY' => $dealerSchedules[$i]->getDay(),
166
                        'DAY_LABEL' => ($dealerSchedules[$i]->getDay() === null) ? null : $this->getDayLabel($dealerSchedules[$i]->getDay()),
167
                        'PERIOD_BEGIN' => $dealerSchedules[$i]->getPeriodBegin(),
168
                        'PERIOD_END' => $dealerSchedules[$i]->getPeriodEnd(),
169
                        'BEGIN' => $dealerSchedules[$i]->getBegin(),
170
                        'END' => $end,
171
                        'FORMATTED_HOURS' => $formattedHours
172
                    );
173
                }
174
            }
175
        } else {
176
            foreach ($dealerSchedules as $dealerSchedule) {
177
                $results[] = array(
178
                    'DEALER_ID' => $dealerSchedule->getDealerId(),
179
                    'ID' => $dealerSchedule->getId(),
180
                    'DAY' => $dealerSchedule->getDay(),
181
                    'DAY_LABEL' => ($dealerSchedule->getDay() === null) ? null : $this->getDayLabel($dealerSchedule->getDay()),
182
                    'BEGIN' => $dealerSchedule->getBegin(),
183
                    'END' => $dealerSchedule->getEnd(),
184
                    'PERIOD_BEGIN' => $dealerSchedule->getPeriodBegin(),
185
                    'PERIOD_END' => $dealerSchedule->getPeriodEnd(),
186
                    'FORMATTED_HOURS' => date_format($dealerSchedule->getBegin(), 'H\hi') . $this->getHourSeparator() . date_format($dealerSchedule->getEnd(), 'H\hi')
187
                );
188
            }
189
        }
190
191
        return $results;
192
    }
193
194
    protected function getDayLabel($int = 0)
195
    {
196
        return [
197
            $this->translator->trans("Monday", [], Dealer::MESSAGE_DOMAIN),
198
            $this->translator->trans("Tuesday", [], Dealer::MESSAGE_DOMAIN),
199
            $this->translator->trans("Wednesday", [], Dealer::MESSAGE_DOMAIN),
200
            $this->translator->trans("Thursday", [], Dealer::MESSAGE_DOMAIN),
201
            $this->translator->trans("Friday", [], Dealer::MESSAGE_DOMAIN),
202
            $this->translator->trans("Saturday", [], Dealer::MESSAGE_DOMAIN),
203
            $this->translator->trans("Sunday", [], Dealer::MESSAGE_DOMAIN)
204
        ][$int];
205
    }
206
}